Acessar Database via: |
---|
Comandos nativos Cobol. Comandos SQL. |
Links |
|
Serviços |
Franco Stringari Pudler
|
Aplicativos |
IMEDIATA Inform.Empres.Ltda
|
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 |
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.
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,
No COBOL | No Mysql |
02 CAMPO-A. 03 DADO1 PIC X(2). 03 DADO2 PIC X(3). |
`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, |
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.
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.:
Arquivo TXT com definição da FD, ARQMYS.FD | Ira gerar | Arquivo 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.
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.
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.
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."