Acessar Database via:
Comandos nativos Cobol.
Comandos SQL.
Links
  • Microfocus Cobol.
  • Fujitsu Cobol
  • MariaDB
  • Oracle Mysql.
  • Serviços
    Franco Stringari Pudler
  • Serviços de consultoria, e desenvolvimento de software.
  • Conversão e modernização de sistemas, migração para banco de dados.
  • Aplicativos
    IMEDIATA Inform.Empres.Ltda
  • E.R.P., NFe, NF3e.
  • Folha de pagamento.
  • Sped, Ecf, Ecd, eSocial.
  • Ativo imobilizado.
  • Cooperativas, distribuiçõo energia.
  • Aneel Resolução Normativa 815.
  • Georeferenciamento redes elétricas.
  • Cobol & Mysql - Accessing Sql tables.

    Criando tabela a partir da FD

    1. Instalar servidor do Mysql.
    2. Instalar uma IDE que torne fácil o manuseio e manutenção das tabelas no Mysql, neste caso recomendamos o uso do HeidiSQL  que além de uma excelente ferramenta é free, voce encontra em http://www.heidisql.com para download.
    3. Cumpridas as etapas anteriores, suponhamos que o servidor esteja instalado na mesma máquina em que o usuario esta operando. Neste caso o endereço do servidor será 127.0.0.1.
    4. Para que se estabeleça uma relação entre a tabela no MySQL e a FD de nosso aplicativo foi criada a seguinte tabela de equivalencia:
      1. Tabela de equivalências.
        FD Cobol (PIC) Tabela Mysql Comment
        PIC X(01)...(N) CHAR 1 ... N Descrição do campo
        PIC X(01)...(N) VARCHAR 1 ... N Descrição do campo
        PIC X(01)...(N) BLOB Descrição do campo
        PIC 9(01)...(17) COMP-3 DECIMAL 1 ... 17 Descrição do campo
        PIC 9(01)V9...(17) COMP-3 DECIMAL 2,1 ... 17,N Descrição do campo
        PIC 9(01)...(02) COMP-X INT, BIGINT 1 UNSIGNED Descrição do campo
        PIC 9(03)...(04) COMP-X INT, BIGINT 4 UNSIGNED Descrição do campo
        PIC 9(05)...(06) COMP-X BIGINT 6 UNSIGNED Descrição do campo
        PIC 9(07)...(08) COMP-X BIGINT 8 UNSIGNED Descrição do campo
        PIC 9(09)...(10) COMP-X BIGINT 10 UNSIGNED Descrição do campo
        PIC 9(11)...(12) COMP-X BIGINT 12 UNSIGNED Descrição do campo
        PIC 9(13)...(14) COMP-X BIGINT 14 UNSIGNED Descrição do campo
        PIC 9(15)...(16) COMP-X BIGINT 16 UNSIGNED Descrição do campo
        PIC 9(17)...(18) COMP-X BIGINT 18 UNSIGNED Descrição do campo
        PIC S9(01)...(04) COMP-5 INT, BIGINT 2 SIGNED Descrição do campo
        PIC S9(05)...(09) COMP-5 BIGINT 4 SIGNED Descrição do campo
        PIC S9(10)...(18) COMP-5 BIGINT 8 SIGNED Descrição do campo
        PIC 9(09) COMP-3 *> AAAAMMDD DATE Descrição do campo
        PIC 9(01)...(N) DECIMAL(1,0) ... (N,0) PND Descrição do campo
        PIC 9(01)V9...9(17)V9 DECIMAL(2,1) ... (18,1) PND Descrição do campo
        PIC 9(08) *> YYYYMMDD DATE PND Descrição do campo
        PIC 9(07) *> HHHMMSS TIME PND Descrição do campo
        PIC 9(14) *> YYYYMMDDHHMMSS DATETIME PND Descrição do campo

      2. Campos numéricos em PICTURE DISPLAY.
        A partir do release 36 é possível usar campos numéricos sem que sejam compactados (COMP, COMP-3, COMP-5 ou COMP-X).
        Campos numéricos PICTURE DISPLAY terão sua equivalência com DECIMAL. O Código "PND" na coluna Comentário, estabelece esta relação.
        O "PND" deve ocupar as 3 primeira posições, desta forma serão tratados no COBOL como campos DISPLAY.
        Ex.: `MY_DISD08` DECIMAL(18,10) NOT NULL COMMENT 'PND Descrição.....',
        Define uma coluna chamada "MY_DISD08", tipo DECIMAL com 18 digitos, sendo que 10 são casas decimais, o equivalente no cobol é PIC S9(08)V9(10).
        `MY_DISD18` DECIMAL(18,0) NOT NULL COMMENT 'PND Descrição.....',
        Define uma coluna chamada "MY_DISD18" com 18 digitos, o equivalente em cobol PIC S9(18).
        Campos DATE retornam conforme configurados no banco de dados, Ano, mes e dia ou dia, mes e ano e assim por diante.
      3. Programa demo.
        Baixe programa fonte mais script para criar as tabelas usadas pelos programas.
        Através destes demos, fica fácil entender a relação entre as definições em COBOL e Mysql.

        Para executar, solicite a DLL de acordo com seu sistema operacional e COBOL, lembrando que a rotina só esta disponível para COBOL 4.03XX 32 Bits, e Net Express, ambos da Micro Focus.


    5. Campos com Occurs, e redefines deverão ser tratados da seguinte forma:
      1. Occurs, criar N vezes o campo, tantas quantas vezes for o occurs.
        EX.:
        Na FD.
                   02 CAMPO-A OCCURS 10.
                    03 DADO1 PIC X(2).
                    03 DADO2 PIC X(3).            
        Devera ser defindo na tebela cf abaixo.
         `DADO1-01` char(2) NOT NULL,
         `DADO2-01` char(3) NOT NULL,
         `DADO1-02` char(2) NOT NULL,
         `DADO2-02` char(3) NOT NULL,
         `DADO1-03` char(2) NOT NULL,
         `DADO2-03` char(3) NOT NULL,
         ...
         `DADO1-10` char(2) NOT NULL,
         `DADO2-10` char(3) NOT NULL,
                        
      2. REDEFINES não é aceito. Neste caso o REDEFINES deverá ser eliminado, e tratado a nível de programa.
        Eventualmente o usuario podera ter a seguinte situação conforme descrito natabela abaixo:

        No COBOL No Mysql
        02 CAMPO-A.
         03 DADO1 PIC X(2).
         03 DADO2 PIC X(3).
        02 FILLER REDEFINES CAMPO-A. 03 SDADO11 PIC X(1). 03 SDADO12 PIC X(1). 03 SDADO21 PIC X(1). 03 SDADO22 PIC X(2).
         `DADO1` char(5) NOT NULL,
                                    
        02 CAMPO-A.
         03 DADO1 PIC X(2).
         03 DADO2 PIC S9(5) COMP-3.
         `DADO1` char(5) NOT NULL,

    BIB2SQL.EXE

    Para facilitar a correta definiçao das colunas nas tabelas foi criado o programa BIB2SQL.EXE.
    A partir de um arquivo texto contendo as definições da FD, dentro do possível esta rotina ira criar um novo arquivo texto, contendo todos comando necessários para criar uma tabela equivalente a FD fornecida, com sufixo "SQL".
    Os campos definidos com occurs e redefines deverão receber tratamento adicional.
    Basta executar BIB2SQL sem nenhum parametro que o mesmo retornara a SYNTAX necessária para sua execução.

    Syntax :

    BIB2SQL nomearqBib@nomeTabela@nomeDB

    Note que foi usado "@" como separador de parametros, onde nomearqBib é o nome do arquivo que contém a FD, nomeTabela nome da tabela que será criada e nomeDB nome do banco de dados onde será inserida a tabela.
    Ex.:

    EXT2SQL ARQMYS.FD@arqmys@francodb

    Arquivo TXT com definição da FD, ARQMYS.FD Ira gerarArquivo SQL para criação da tabela, ARQMYS.SQL
           01  MY-REG.
               02 MY-SIT   PIC  X(01).
               02 MY-LAN   PIC S9(09)    COMP-3.
               02 MY-CTA   PIC S9(15)    COMP-3.
               02 MY-CDH   PIC S9(05)    COMP-3.
               02 MY-HST   PIC  X(30).
               02 MY-DTA   PIC S9(09)    COMP-3.
               02 MY-VAL   PIC S9(13)V99 COMP-3.
                    
    CREATE TABLE `francodb`.`arqmys` (
      `MY-SIT` CHAR(00001) NOT NULL DEFAULT ' ',
      `MY-LAN` DECIMAL(00009) NOT NULL DEFAULT '0',
      `MY-CTA` DECIMAL(00015) NOT NULL DEFAULT '0',
      `MY-CDH` DECIMAL(00005) NOT NULL DEFAULT '0',
      `MY-HST` CHAR(00030) NOT NULL DEFAULT ' ',
      `MY-DTA` DECIMAL(00009) NOT NULL DEFAULT '0',
      `MY-VAL` DECIMAL(00015,00002) NOT NULL DEFAULT '0'
       )
      ENGINE=InnoDB;

    Feito isso basta executar os comando no arquivo ARQMAYS.SQL, o que pode ser feito pelo HEIDISQL, tanto copiando e colando o conteúdo de ARQMYSQL.SQL e colando na aba de QUERY e executar, como executar diretamente o arquivo gerado.


    Até este momento foi criado a tabela com suas respectivas colunas, tomando como base a FD, e de acordo com as equivalencias pré estabelecidas acima.
    Falta ainda definir as chaves do arquivo, para que se possa criar uma tabela compatível com arquivo no COBOL , para se obter os mesmos resultados, tanto acessando via arquivo MF como Mysql.

    Ex.: Como definir chaves no Mysql atendendo pré-requisitos do EXTMYSQL

    SELECT ARQMYS ASSIGN TO DYNAMIC W-LABMSQ
           ORGANIZATION IS INDEXED
           ACCESS MODE  IS DYNAMIC
           FILE STATUS  IS W-STATUS
           RECORD KEY   IS MY-LAN
           ALTERNATE RECORD KEY IS MY-CTA
                      WITH DUPLICATES.
                    
    SELECT SCCMOV ASSIGN TO DYNAMIC W-ARQUIVOS
           ORGANIZATION IS INDEXED
           ACCESS MODE  IS DYNAMIC
           FILE STATUS  IS W-STATUS
           RECORD KEY IS LA-LNC = LA-LAN LA-LIN
           ALTERNATE RECORD KEY IS LA-DTA
                            WITH DUPLICATES
           ALTERNATE RECORD KEY IS LA-CDA = LA-CAD LA-DTA
                            WITH DUPLICATES
           ALTERNATE RECORD KEY IS LA-CDO = LA-COD LA-DTA
                            WITH DUPLICATES
           ALTERNATE RECORD KEY IS LA-DOA = LA-CAD LA-TIP
                            LA-SER LANUM LA-LIN
                            WITH DUPLICATES
    
                    

    É possível também definir chaves compostas, bastando incluir todos os campos na mesma sequencia nas chaves da tabela.
    A definição de cada chave na sequencia certa, ou seja na mesma ordem em que foram definidas no SELECT, é de fundamental importância para que se obtenha resultados iguais tanto no programa rodando com o arquivo MF, como usando MYSQL.
    OB.: O EXTMYSQL não trata a chave pelo nome definido na tabela, e sim pela sequencia em que foi definido, desta forma a chave principal deve ser a primeira chave, a primeira chave secondária é a segunda chave e assim por diante, independente do nome dado a chave.

    Cuidados:

    Sempre antes de qualquer procedimento, é indispensável ter cópia de segurança, tanto de definições, como de dados, e programas, ou o que mais possa causar prejuízo, caso seja danificado.

    Erros:

    1. Não consigo o mesmo resultado ao tentar ler um registro usando arquivo MF e usando tabela MYSQL.
      Neste caso é provável que voce tenha um erro na definição das chaves, procure executar o comando refresh no HEIDISQL e confira se todas as chaves estão corretamente definidas, e principalmente na mesma sequencia.
      Sempre que alterar alguma informação nas chaves definidas na tabela, confira se as chaves continuam na sequencia original. Em alguns casos a chave alterada é jogada para o final , interferindo na forma com que nosso programa ira fazer seus acessos, e isto só é identificado após a execução do comando REFRESH.

    2. File STATUS "39".
      • Este erro ocorre quando ha uma divergencia entre a definição da FD e da tabela no Mysql, ou seja, uma das regras de compatibilidade não esta sendo observada. Para facilitar a identificação do erro e com isso corrigir o problema, foi criado um recurso que é disparado automaticamente sempre que ocorre est erro ou FStatus. No arquivo LOGIMED.LOG é gerado uma listagem de como esta definido a tua FD com relação ao que é esperado a partir da definição do MYSQL, conforme exemplo abaixo:

        02/12/2013 11 42 Erro na definição da tabela, FD (00126), Tabela com (00125).
        02/12/2013 11 42 | T |  Tam. | Nom                                                          |
        02/12/2013 11 42 | 3 | 00004 | id
        02/12/2013 11 42 | 0 | 00002 | uf
        02/12/2013 11 42 | 3 | 00003 | cidade_id
        02/12/2013 11 42 | 0 | 00064 | nomeclog
        02/12/2013 11 42 | 0 | 00025 | bairro_id
        02/12/2013 11 42 | 0 | 00015 | logradouro
        02/12/2013 11 42 | 0 | 00009 | cep
        02/12/2013 11 42 | 3 | 00003 | uf_cod
        02/12/2013 11 42 -------------------------------------------------------------------------------
        02/12/2013 11 42 0 - Display (X, 9, A, Z) Não compactado
        02/12/2013 11 42 1 - Compactado (COMP, COMP-X, COMP-0)
        02/12/2013 11 42 2 - Decimal (COMP-3)
        02/12/2013 11 42 3 - Decimal (COMP-3) com sinal
        02/12/2013 11 42 4 - Compactado (COMP-5) com sinal
        02/12/2013 11 42 5 - Campo data 9999-99-99.
        02/12/2013 11 42 9 - String com conteúdo HexaDecimal
        02/12/2013 11 42 1 e 2 Unsigned.
                        

        No exemplo apresentado, temos 3 colunas, T, Tam., e nom sendo T=tipo, Tam.=tamanho e Nom=nome do campo. Tipo identifica o tipo de campo conforme logo ao final do exemplo, onde são apresentados tipos de 1 a 9. Tamanho identifica o tamanho ocupado em memória. Nome o nome usado na definição da tabela. A FD que deu origem a este erro é a seguinte:

               FD  CADCEP.
               01  UF-REG.
                   02 UF-ID          PIC S9(07) COMP-3.   *> Código do registro
                   02 UF-UF          PIC  X(02).          *> Código da UF
                   02 UF-CCD         PIC S9(05) COMP-3.   *> Código da cidade
                   02 UF-LOG         PIC  X(64).          *> Logradouro
                   02 UF-BAI         PIC  X(25).          *> Bairro
                   02 UF-TLG         PIC  X(15).          *> Tipo de logradouro
                   02 UF-CEP         PIC  X(09).          *> C.E.P.
                   02 UF-COD         PIC S9(07) COMP-3.   *> Código da UF.
                        

        Fazendo uma rapida comparação constatamos que o campo "uf_cod" espera um correspondente na FD que ocupe 3 posições de memória, e "UF-COD" esta ocupando 4 posições, logo deve ser corrigido para "PIC S9(05) COMP-3."

    Franco Stringari Pudler, email franco@imediata.com.br