sábado, 12 de novembro de 2016

Trabalhando com arquivos - Parte 2.1 - Código leitura arquivo

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
Neste post é abordado os comandos e uma lógica de processamento simples para realizar a leitura dos dados de um arquivo. Lembrando, que na parte 1 desse assunto foi apresentado as declarações básicas que devem ser feitas para executar uma rotina COBOL com arquivos.

O fluxo de processamento consiste em três passos: abrir o arquivo em modo de leitura, ler o registro do arquivo e encerrar o uso do arquivo (fechar o arquivo). De modo que o passo de ler o registro do arquivo deve estar em um laço de repetição.


    1 - Abrir o arquivo em modo de leitura

Quando a abertura de um arquivo é feita modo de leitura, significa que as informações que estão contidas no arquivo serão passadas para o COBOL, ou seja, os dados do arquivo serão lidos e manipulados pelo programa COBOL.

A sintaxe do comando para abrir o arquivo em modo de leitura, é :
OPEN INPUT nome-logico-arquivo.

Exemplo: OPEN INPUT ARQUIVO-ENTRADA.


    2 - Ler os dados do arquivo

Após ter feito a abertura do arquivo com OPEN INPUT, o arquivo está pronto para ser lido. E com o comando READ é que é feita a leitura dos dados do arquivo. Sintaxe:
READ nome-logico-arquivo.

Exemplo: READ ARQUIVO-ENTRADA.



    3 - Encerrar o uso do arquivo


Com o fim da leitura ou processamento dos dados do arquivo, é uma boa prática executar o comando CLOSE para fechar o arquivo (encerrar a sessão). Caso, algum arquivo aberto não seja fechado com este comando, então após a execução completa do programa todos arquivos ainda abertos serão fechados. Sintaxe:
CLOSE nome-logico-arquivo.

Exemplo: CLOSE ARQUIVO-ENTRADA.



  • Exemplo prático de programa
Então com os comando Open Input, Read e Close, podemos criar um fluxo simples e eficaz para a leitura de um arquivo sequencial.

Considerando que o arquivo a ser lido contem as informações de pessoas e cada registro possui os dados dispostos da seguinte forma: o nome com no máximo 20 caracteres; sobrenome com no máximo 40 caracteres; data de nascimento no formato dd/mm/aaaa. Abaixo está apresentado os dados de exemplo do arquivo-entrada.txt, que contem 5 registros:

Felipe   Barbosa Ferreira         19/02/1992
Ana      Vieira                   02/04/1988
Joao     Santos                   03/05/1995
Aline    Silva                    14/08/1985
Maira    Dantas                   27/12/1976

Assim o layout deste arquivo é:


      * -- Descricao do arquivo de entrada
       FD ARQUIVO-ENTRADA.
      *
      * Layout do arquivo: ARQUIVO-ENTRADA
       01 ARQUIVO-ENTRADA-REG.
           03 ARQ-ENTD-NM-PSS           PIC  X(020).
           03 ARQ-ENTD-NM-PSS-SNM       PIC  X(040).
           03 ARQ-ENTD-DT-PSS-NSC       PIC  X(010).

E o laço de repetição para ler os registros do arquivo:

      * -- Loop para ler os registros do arquivo
           PERFORM UNTIL FIM-ARQ
               PERFORM 100000-LER-ARQUIVO-ENTRADA
      *
      * --     Mostra o conteudo lido
               DISPLAY 'Registro.......: ' QT-REG-LER-ARQ-ENTD
               DISPLAY 'Nome...........: ' ARQ-ENTD-NM-PSS
               DISPLAY 'Sobrenome......: ' ARQ-ENTD-NM-PSS-SNM
               DISPLAY 'Data nascimento: ' ARQ-ENTD-DT-PSS-NSC
               DISPLAY '.'
           END-PERFORM.

Neste caso quando, o programa tentar ler o sexto registro será retornado file status igual a 10, indicando fim de arquivo, pois o sexto registro não existe. Deste modo FIM-ARQ se torna verdadeiro e o laço de repetição de leitura termina. E por fim o arquivo é encerrado.

Ver o código completo do programa de exemplo

O resultado da execução da rotina, é:

Registro.......: 000000001
Nome...........: Felipe
Sobrenome......: Barbosa Ferreira
Data nascimento: 19/02/1992
.
Registro.......: 000000002
Nome...........: Ana
Sobrenome......: Vieira
Data nascimento: 02/04/1988
.
Registro.......: 000000003
Nome...........: Joao
Sobrenome......: Santos
Data nascimento: 03/05/1995
.
Registro.......: 000000004
Nome...........: Aline
Sobrenome......: Silva
Data nascimento: 14/08/1985
.
Registro.......: 000000005
Nome...........: Maira
Sobrenome......: Dantas
Data nascimento: 27/12/1976

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!

sábado, 5 de novembro de 2016

Trabalhando com arquivos - Parte 1 - Declarações básicas

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
As declarações básicas que devem ser realizadas para trabalhar com arquivos no COBOL, são feitas em três sections: INPUT-OUTPUT; FILE e LOCAL-STORAGE. Conforme abaixo:

  • INPUT-OUTPUT
Definição do nome do arquivo lógico para o endereço do arquivo físico, O nome lógico do arquivo é o que será usado no código do programa. 

A sintaxe do código:
      *
       FILE-CONTROL.
      *
      * -- Arquivo de leitura
              SELECT nome-arquivo-logico
               ASSIGN endereco-do-arquivo-fisico
                   FILE STATUS IS variavel-do-status-do-arquivo.

Uma boa prática é definir nome lógico do arquivo conforme seu nome físico, exemplo:
      *
       FILE-CONTROL.
      *
      * -- Arquivo de leitura
              SELECT ARQUIVO-ENTRADA
               ASSIGN 'C:\workspace\arquivo-entrada.txt'
                   FILE STATUS IS IN-FILE-EST-ARQ-ENTD.
  • FILE
Descrição do tipo de arquivo e registro. As declarações do tipo de arquivo são opcionais e são feitas na FD (file description) para maiores detalhes destas declarações veja aqui.

A descrição do registro do arquivo ou também como conhecida de layout do arquivo, é definido logo após a FD do arquivo, contendo exatamente as informações que estão no arquivo. Ou seja, se no arquivo haver por exemplo um nome com o tamanho de 20 bytes e o sobrenome com também 20 bytes de tamanho, o registro do arquivo possui o tamanho de 40 bytes. Assim a representação no COBOL é uma variável nome e sobrenome com o formato de PIC X(020) cada uma.

Abaixo veja o exemplo de layout para o arquivo-entrada.txt
      *
      * -- Descricao do arquivo de entrada
       FD ARQUIVO-ENTRADA.
      *
      * Layout do arquivo: ARQUIVO-ENTRADA
       01 ARQUIVO-ENTRADA-REG.
           03 ARQ-ENTD-NM-PSS           PIC  X(020).
           03 ARQ-ENTD-NM-PSS-SNM       PIC  X(040).
           03 ARQ-ENTD-DT-PSS-NSC       PIC  X(010).

Note que o nome na FD é o nome do arquivo lógico, deste modo está FD está referenciando o arquivo-entrada.txt. E também podemos visualizar que cada registro deste arquivo possui o nome da pessoa com 20 bytes, o sobrenome com 40 bytes, e a data de nascimento com 10 bytes.

  • LOCAL-STORAGE
Nesta section é realizada a declaração da variável para armazenar o status das operações (leitura, escrita, etc.) realizadas no arquivo é feita conforme:
      *
      * -- Declaracao de file-status do arquivo: ARQUIVO-ENTRADA
       01 IN-FILE-EST-ARQ-ENTD          PIC  X(002) VALUE SPACES.

A variável possui o formato de PIC X(002), pois os códigos retornados destas operações não são superior a este formato. Veja a tabela de códigos aqui.

Com as declarações feitas acima já é possível realizar operações no arquivo-entrada.txt. Estas operações serão demonstradas nos próximos posts.

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!

sábado, 8 de outubro de 2016

XML Generate

Olá!

Neste post será apresentado uma das formas de gerar uma string no formato de XML. O comando utilizado é o XML GENERATE, que possui a sintaxe para uso muito simples, veja abaixo:


XML GENERATE variável-A
        FROM variável-B
    COUNT IN variável-C
ON EXCEPTION expressão
END-XML.

Onde:
  • variável-A: é a variável que armazena a resposta/string gerada pela execução do comando.
  • variável-B: variável que contém as informações para gerar a string no formato de XML.
  • variável-C: após a execução do comando irá conter o número total de caracteres da resposta/string gerada, ou seja, possui o tamanho da string gerada em XML.
  • expressão: em caso de erro na geração da string para XML será acionado uma exceção, a expressão é o comando que será executado em caso de erro.
Segue abaixo um exemplo de código COBOL para gerar uma string no formato de XML com os dados de uma pessoa.

Declaração das variáveis:
xml generate - felipe barbosa ferreira

Código:
xml generate - felipe barbosa ferreira

Neste código de exemplo temos a seguinte relação:

variável-AGDA-TX-FMT-XML
variável-BIdentificacaoPessoa
variável-CGDA-TOTAL-CHAR-XML
expressãoPERFORM 999001-ERRO-01

Assim, ao executar o código de exemplo o resultado é:
GDA-TOTAL-CHAR-XML = 136
GDA-TX-FMT-XML = <IdentificacaoPessoa><Codigo>1</Codigo><Nome>Felipe</Nome><Sobrenome>Barbosa Ferreira</Sobrenome><Idade>23</Idade></IdentificacaoPessoa>


Para melhor visualização do resultado da execução do código de exemplo, segue abaixo a string gerada no formato de XML endentada:

<IdentificacaoPessoa>
    <Codigo>1</Codigo>
    <Nome>Felipe</Nome>
    <Sobrenome>Barbosa Ferreira</Sobrenome>
    <Idade>23</Idade>
</IdentificacaoPessoa>

Note que facilmente é gerado uma string no formato de XML. Sendo, uma grande vantagem de utilizar o XML GENERATE é que espaços em brancos a direita e zeros a esquerda são descartados automaticamente do resultado final.

Também, que neste exemplo em caso de erro será acionado o parágrafo de erro 01, por meio do comando PERFORM 999001-ERRO-01.

O  XML GENERATE possui outros comandos opcionais que facilitam a criação de strings xmls mais elaboradas, veja na página da IBM (clique aqui).

Em um post anterior foi demonstrado como extrair o conteúdo de uma string que estejam no formato de XML, veja em Unstring XML COBOL.

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!