COBOL & Mysql

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