Escolar Documentos
Profissional Documentos
Cultura Documentos
Olá!
Para não produzir um post extenso, o assunto sobre arquivos está abordado em posts
particionados conforme:
Declarações básicas
Código básico
Código leitura arquivo
Código escrita arquivo
Código leitura/escrita no mesmo arquivo
Código intermediário:
Balance-Line conceito
Balance-Line código
Note que os três arquivos possuem o mesmo layout, isso é somente para facilitar a
leitura do código de exemplo. Pois, por exemplo o arquivo A poderia ter mais
informações que o arquivo B, e o arquivo C somente o nome dos novos registros,
deste modo gerando layout diferente para os arquivos.
*
*----------------------------------------------------------------*
INPUT-OUTPUT SECTION.
*----------------------------------------------------------------*
*
FILE-CONTROL.
* -- Arquivo de saida/resposta
SELECT arquivoC ASSIGN TO 'C:\workspace\arquivo-C.txt'
FILE STATUS IS IN-FILE-EST-arquivoC.
*
* -- Arquivo de leitura
SELECT arquivoA ASSIGN TO 'C:\workspace\arquivo-A.txt'
FILE STATUS IS IN-FILE-EST-arquivoA.
*
* -- Arquivo de leitura
SELECT arquivoB ASSIGN TO 'C:\workspace\arquivo-B.txt'
FILE STATUS IS IN-FILE-EST-arquivoB.
*
******************************************************************
DATA DIVISION.
******************************************************************
*
*----------------------------------------------------------------*
FILE SECTION.
*----------------------------------------------------------------*
*
* -- Arquivo de resposta
FD arquivoC
LABEL RECORD STANDARD
BLOCK 0
RECORD 14
RECORDING F.
*
* Layout do arquivo arquivoC
01 REGISTRO-ARQ-C.
03 CD-PESSOA-C PIC 9(004).
03 NOME-C PIC X(010).
*
* -- Arquivo de leitura
FD arquivoA
LABEL RECORD STANDARD
BLOCK 0
RECORD 14
RECORDING F.
*
* Layout do arquivo arquivoA
01 REGISTRO-ARQ-A.
03 CD-PESSOA-A PIC 9(004).
03 NOME-A PIC X(010).
*
* -- Arquivo de leitura
FD arquivoB
LABEL RECORD STANDARD
BLOCK 0
RECORD 14
RECORDING F.
*
* Layout do arquivo arquivoB
01 REGISTRO-ARQ-B.
03 CD-PESSOA-B PIC 9(004).
03 NOME-B PIC X(010).
Primeiro temos que abrir os arquivos A e B em modo de leitura, se está ação for
sucedida, o processo de leitura se iniciará.
*
*-----------------------------------------------------------------
000000-ROTINA-PRINCIPAL SECTION.
*-----------------------------------------------------------------
*
* -- Abre os arquivos
PERFORM 100000-ABRE-ARQ.
*
* -- Realiza a leitura dos arquivos e grava
* os dados no arquivo de resposta
PERFORM 200000-LER-ARQ-GRV-RPST.
*
* -- Procedimento final para apresentar o resumo do processamento
PERFORM 300000-RSM-PRCT-PGM.
*
000000-FIM.
GOBACK.
Veja que o arquivo C não é aberto no processamento inicial, pois se não haver
registro no arquivo A ou B não será produzido o arquivo C.
*
*----------------------------------------------------------------*
100000-ABRE-ARQ SECTION.
*----------------------------------------------------------------*
*
* -- Abre os arquivos de entrada/leitura
OPEN INPUT arquivoA
arquivoB.
*
* -- Verifica a execucao da aberura do arquivo A
IF IN-FILE-EST-arquivoA NOT EQUAL '00'
PERFORM 999001-ERRO-01
END-IF.
*
* -- Movimentacao para indicar que o arquivo esta aberto
MOVE 'S' TO IN-ABERTO-ARQ-A.
*
* -- Verifica a execucao da aberura do arquivo B
IF IN-FILE-EST-arquivoB NOT EQUAL '00'
PERFORM 999002-ERRO-02
END-IF.
*
* -- Movimentacao para indicar que o arquivo esta aberto
MOVE 'S' TO IN-ABERTO-ARQ-B.
*
100000-FIM.
EXIT.
*
*----------------------------------------------------------------*
110000-ABRE-ARQ-RPST SECTION.
*----------------------------------------------------------------*
*
* -- Abre o arquivo de saida para gravacao
OPEN OUTPUT arquivoC.
*
* -- Verifica a execucao da aberura do arquivo C
IF IN-FILE-EST-arquivoC NOT EQUAL '00'
PERFORM 999005-ERRO-05
END-IF.
*
* -- Movimentacao para indicar que o arquivo esta aberto
MOVE 'S' TO IN-ABERTO-ARQ-C.
*
110000-FIM.
EXIT.
*
O Balance-line
Veja o código:
*
*----------------------------------------------------------------*
200000-LER-ARQ-GRV-RPST SECTION.
*----------------------------------------------------------------*
*
* -- Leitura do primeiro registro do arq
PERFORM 970000-LER-ARQ-arquivoA.
*
* -- Leitura do primeiro registro do arq
PERFORM 971000-LER-ARQ-arquivoB.
*
* -- Abre o arquivo de resposta em modo de gravacao
IF NOT FIM-ARQ
PERFORM 110000-ABRE-ARQ-RPST
END-IF.
*
* -- Se tiver registros, continua o processamemto (entra no IF)
IF NOT FIM-ARQ
*
* -- Loop para balance-line entre os dois arq de leitura
PERFORM UNTIL FIM-ARQ
*
EVALUATE TRUE
*
* -- Situacao que ignora os dos dados dos arquivos
WHEN CD-PESSOA-A = CD-PESSOA-B
PERFORM 970000-LER-ARQ-arquivoA
PERFORM 971000-LER-ARQ-arquivoB
*
* -- Situacao para realizar a gravacao dos dados no
* -- arquivo de resposta
WHEN CD-PESSOA-A < CD-PESSOA-B
PERFORM 400000-GRAVA-DADO-ARQ
PERFORM 970000-LER-ARQ-arquivoA
*
WHEN IN-LER-FIM-ARQ-A EQUAL 'N'
AND IN-LER-FIM-ARQ-B EQUAL 'S'
PERFORM 400000-GRAVA-DADO-ARQ
PERFORM 970000-LER-ARQ-arquivoA
*
* -- Situacao para ler proximo reg arquivob
WHEN CD-PESSOA-A > CD-PESSOA-B
PERFORM 971000-LER-ARQ-arquivoB
*
* -- Situacao nao prevista, erro
WHEN OTHER
PERFORM 999007-ERRO-07
END-EVALUATE
*
END-PERFORM
END-IF.
*
* -- Fecha os arquivos
PERFORM 900000-FECHA-ARQ.
*
200000-FIM.
EXIT.
Para, melhor definir a estrutura dos arquivos, veja cada arquivo abaixo: