domingo, 29 de janeiro de 2017

Balance Line Código

Olá!

Para não produzir um post extenso, o assunto sobre arquivos está abordado em posts particionados conforme:
  1. Declarações básicas
  2. Código básico
    1. Código leitura arquivo
    2. Código escrita arquivo
    3. Código leitura/escrita no mesmo arquivo
  3. Código intermediário:
    1. Balance-Line conceito
    2. Balance-Line código
O exemplo de código COBOL para representar o banlace-line de arquivos, consiste em ler dois arquivos e realizar a geração de um terceiro arquivo.

Sendo que no arquivo-A estão os registros de movimentação das pessoas no dia, assim, este arquivo pode possuir o registro de novas ou de pessoas que já possuam cadastro. E no segundo arquivo-B estão os registros (pessoas) que já estão gravados na base de dadosO terceiro arquivo-C é gerado no final do dia para apontar a quantidade de novas pessoas que foram cadastradas no banco de dados.

Então para realizar a leitura dos arquivos A e B será utilizado basicamente o conteúdo parte 2.1, e para a geração do arquivo C o conteúdo da parte 2.2. Também adicionando um laço de repetição para ler cada registro dos arquivos A e B e realizar a verificação se o registro do arquivo B é uma nova pessoa, se for uma nova pessoa gravar os dados desse registro no arquivo C.

Obs: será apresentado as principais partes do código do programa COBOL, no final do post há o link para visualizar o código do programa completo.

  • A declaração dos arquivos
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).

  • O processamento inicial do programa
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.

  • A abertura dos arquivos
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
Agora é iniciado o processo de leitura e gravação dos dados no arquivo C. Sendo:
1 - Ler o arquivo A e B, se não haver registro em um destes arquivos é indicado fim de arquivo
2 - Se não for fim de arquivo, ou seja, há registros nos arquivos A e B, é realizado a abertura do arquivo C em modo de gravação
3 - É realizado o laço de repetição para a leitura dos registros e realizar a verificação dos dados, onde:
    3.1 - Se a chave da pessoa do arquivo A e B forem iguais, os registros serão ignorados, pois a pessoa já está cadastrado no banco de dados
    3.2 - Quando a chave da pessoa do arquivo A for menor que do arquivo B, significa que o registro é de uma nova pessoa e deve ser gravado no arquivo C
    3.3 - Quando a chave da pessoa do arquivo A for maior que do arquivo B, deve ser realizada a leitura do próximo registro do arquivo B
4 - Ao terminar o laço de repetição, o balane line está encerrado, assim será feito o fechamento dos arquivos

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:

felipe barbosa ferreira - arquivos balance line

Após a execução do código apresentado com os arquivos A e B conforme acima, é gerada a seguinte resposta:
felipe barbosa ferreira - resposta balance line

Para Ctrl + C do código acesse aqui.
Consultar a relação de Termos e Abreviaturas acesse aqui.
FELIPE BARBOSA FERREIRA

Até o próximo post!