Alura > Cursos de Programação > Cursos de Cobol > Conteúdos de Cobol > Primeiras aulas do curso Praticando Cobol: trabalhando com arquivos

Praticando Cobol: trabalhando com arquivos

Trabalhando com arquivos - Apresentação

Introduzindo o tema de arquivos indexados

Olá! Sabemos trabalhar com arquivos indexados?

E como ler o arquivo indexado em forma de lista, como se fosse um filtro? Por exemplo, ler desde o terceiro até o quinto. Acompanhe o vídeo em que ensinaremos, usando o Start Next, como resolver esse problema.

Apresentando o instrutor

Meu nome é Ivan Petrucci. Sou uma pessoa com pele branca, cabelo e olhos escuros, uso óculos de armação preta e tenho uma barba curta.

Nos vemos no vídeo.

Trabalhando com arquivos - Trabalhando com arquivos

Explorando o recurso Start e Next

Agora, vamos explorar um recurso muito interessante relacionado aos arquivos indexados: o Start e o Next. Até o momento, conhecemos duas formas de acessar arquivos. A primeira é o modo sequencial, que é mais lento. A segunda é o indexado, que, embora mais custoso devido ao tamanho do arquivo, é mais rápido. Agora, vamos apresentar o Start e o Next, que nos introduzem a uma terceira forma, chamada de Browse ou navegação.

No modo sequencial, se entrarmos com o ID igual a 4, precisamos ler o 1, o 2 e o 3 até chegar ao 4, o que torna o processo lento. No modo indexado, o código 4 é associado a uma chave, permitindo acesso direto e mais rápido. Com o Start e o Next, a dinâmica muda. O indexado é útil para localizar um registro de cada vez. Já o Browse, ou Start e Next, é usado quando queremos iniciar o processo em um ponto específico, como no número 4. Informamos que queremos começar no número 4, e, a cada Next, lemos o próximo registro. Assim, paramos no 4, depois Next 5, Next 6, até o final do arquivo.

Utilizando Start e Next para relatórios

Esse método é muito útil para gerar relatórios ou aplicar filtros, como ler de um ponto até outro. No modo indexado, precisaríamos ler chave por chave, sem saber qual seria a próxima. Com o Start, começamos em um ponto e lemos o próximo, sem necessidade de organização sequencial. Por exemplo, se o próximo registro após o 4 for o 8, e depois o 12, não há problema. Lemos até o final ou até uma condição de término. Podemos começar em um ponto e terminar no meio, por exemplo. O benefício é que lemos até onde desejarmos.

Vamos ver no código como isso funciona. Deixei um arquivo chamado ARQCRM na pasta "dados", contendo nomes de pessoas registradas. A estrutura desse arquivo inclui uma chave, nome, e-mail, telefone e status. É um arquivo de dados de contatos. Para usar o recurso Start e Next, é conveniente o modo Dynamic, em vez de Random ou Sequential. O arquivo é indexado, e o modo é dinâmico, com status de arquivo e uma chave de quatro posições.

Definindo a estrutura do programa em COBOL

Para começar, vamos definir a estrutura básica do nosso programa em COBOL:

IDENTIFICATION DIVISION.
PROGRAM-ID. RELAT.

ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
    SELECT ARQCRM ASSIGN TO "..\DADOS\ARQCRM.DAT"
        ORGANIZATION IS INDEXED
        ACCESS MODE IS DYNAMIC
        FILE STATUS IS ARQCRM-FS
        RECORD KEY IS ARQCRM-CHAVE.

DATA DIVISION.
FILE SECTION.
FD  ARQCRM.
01  ARQCRM-REGISTRO.
    05 ARQCRM-CHAVE.
       10 ARQCRM-ID      PIC X(04).
    05 ARQCRM-NOME       PIC X(25).
    05 ARQCRM-EMAIL      PIC X(30).
    05 ARQCRM-TELEFONE   PIC X(14).
    05 ARQCRM-STATUS     PIC 9(01).

Agora, vamos prosseguir. Temos algumas variáveis, como o status, que serão usadas no código. Como se trata de um listado, criamos um cabeçalho contendo ID, nome, e-mail e telefone. Ao começar a imprimir, a primeira linha exibirá essas informações. Há um recurso para limpar a tela, garantindo que começamos com a tela limpa, e seguimos com nossa rotina tradicional das três divisões.

WORKING-STORAGE SECTION.
COPY "CRM-WRK2".

01 ARQCRM-FS            PIC 9(02) VALUE ZEROS.
01 WRK-SEGURATELA       PIC X(01) VALUE SPACES.
01 WRK-LINHA            PIC 9(01) VALUE 1.
01 WRK-CHAVE            PIC X(04) VALUE SPACES.

01 WRK-CABEC.
   05 FILLER             PIC X(04) VALUE "ID".
   05 FILLER             PIC X(01).
   05 FILLER             PIC X(25) VALUE "NOME".
   05 FILLER             PIC X(01).
   05 FILLER             PIC X(30) VALUE "EMAIL".
   05 FILLER             PIC X(01).
   05 FILLER             PIC X(14) VALUE "TELEFONE".

Implementando a lógica de abertura e leitura de arquivos

Abrimos o arquivo e verificamos se foi aberto corretamente. Em seguida, limpamos a tela e perguntamos qual chave queremos ler. Temos registros 1, 2, 3, 4, 5, 6, e indicamos a partir de qual registro queremos ler. Aqui começa a execução do código. Movemos 1 para a variável linha, pois imprimiremos linha por linha. Essa variável controla a linha que queremos imprimir. Lemos um registro, imprimimos, incrementamos a variável e imprimimos novamente.

PROCEDURE DIVISION.
    PERFORM INICIAR.
    PERFORM PROCESSAR.
    PERFORM FINALIZAR.

    GOBACK.

INICIAR SECTION.
    OPEN INPUT ARQCRM.
    IF ARQCRM-FS NOT EQUAL ZEROS
       DISPLAY "ERRO ABERTURA "   LINE 01 COLUMN 01
       ACCEPT WRK-SEGURATELA      LINE 02 COLUMN 01
       GOBACK
    END-IF.

    DISPLAY TELA.
    DISPLAY "QUAL CHAVE " WRK-CHAVE LINE 01 COLUMN 01.
    ACCEPT WRK-CHAVE LINE 01 COLUMN 12.

Executando a leitura e manipulação dos registros

Movemos a chave para a variável correspondente e iniciamos o arquivo ARQCRM baseado na chave. Podemos usar igual, menor ou maior. Se a chave não existir, o processo não continua. Em caso de chave inválida, informamos ao usuário que o registro não foi encontrado. Se a chave for válida, mostramos o cabeçalho na linha 1, coluna 1. Após mostrar o cabeçalho, imprimimos os dados subsequentes, sempre baseados na chave inicial.

PROCESSAR SECTION.
    MOVE 1 TO WRK-LINHA
    MOVE WRK-CHAVE TO ARQCRM-CHAVE
    START ARQCRM KEY IS EQUAL ARQCRM-CHAVE
        INVALID KEY
            DISPLAY "REGISTRO NAO ENCONTRADO" LINE 03 COLUMN 01
        NOT INVALID KEY
            DISPLAY WRK-CABEC LINE WRK-LINHA COLUMN 01.
            PERFORM UNTIL ARQCRM-FS EQUAL 10
                READ ARQCRM NEXT
                    AT END
                       DISPLAY "FIM DO ARQUIVO" LINE 20 COLUMN 01
                       MOVE 10 TO ARQCRM-FS
                    NOT AT END
                       ADD 1 TO WRK-LINHA
                       MOVE    ARQCRM-ID        TO WRK-ARQCRM-ID
                       MOVE    ARQCRM-NOME      TO WRK-ARQCRM-NOME
                       MOVE    ARQCRM-EMAIL     TO WRK-ARQCRM-EMAIL
                       MOVE    ARQCRM-TELEFONE  TO WRK-ARQCRM-TELEFONE
                       DISPLAY WRK-ARQCRM-REGISTRO
                               LINE WRK-LINHA COLUMN 01
                END-READ
            END-PERFORM.

Lidando com o final do arquivo e condições de término

Executamos um loop no arquivo enquanto não chegamos ao final, indicado pelo status 10. O segredo está no Next: lemos o arquivo após nos posicionarmos com o Start. Se a chave for válida, lemos o registro. O Start apenas posiciona, não lê. Lemos até o final e, ao chegar lá, exibimos "fim de arquivo".

Há um detalhe lógico: se o Start resultar em chave inválida, mostramos "registro não encontrado" e usamos o comando go to para evitar um loop desnecessário. Criamos uma seção chamada "processar fim" para lidar com essa situação e incluímos o comando exit.

    GO TO PROCESSAR-FIM

PROCESSAR-FIM. EXIT.

Funciona da seguinte maneira: abrimos o arquivo baseado na chave. Se a chave não for encontrada, exibimos "não encontrado" e seguimos adiante, ignorando o restante. Caso a chave seja encontrada, exibimos o cabeçalho e continuamos lendo o arquivo até chegar ao registro 10. Se, por acaso, chegarmos ao final do arquivo, indicamos que atingimos o fim do arquivo e movemos o registro 10 para cá, embora isso não seja necessário, pois já será movido. No entanto, fazemos isso para garantir. Quando chegarmos ao perform, se estivermos no fim do arquivo, ao retornar, o processo será finalizado.

Ajustando a entrada de dados e testando o programa

Se continuarmos lendo e ainda não for o fim, adicionamos mais um à linha. Precisamos pular uma linha para usar a próxima. Movemos os dados para cá, mas isso pode ser feito diretamente, sem a necessidade de mover. Podemos exibir o próprio ARQCRM, que é uma variável que temos aqui. Comparando com a de cima, percebemos que o book de apoio não é necessário. O ARQCRM foi deixado como um book caso quiséssemos mover os dados, mas não é necessário. Podemos mover o que foi lido diretamente. Quando realizamos a leitura, os dados são armazenados aqui, e é isso que estamos exibindo.

Recapitulando: solicitamos a chave. Se a chave for igual, iniciamos o start a partir dessa chave. Se a chave não existir, processamos o fim e terminamos. Se a chave existir, exibimos o cabeçalho e permanecemos no loop, lendo o próximo registro e exibindo o que foi lido até chegar ao final. Vamos testar isso.

Este é o RELAT. Vamos compilar e executar o RELAT.EXE para RELAT.COV. Após a compilação, limpamos a tela e executamos o RELAT. Solicitamos a chave, por exemplo, chave 2. Se o registro não for encontrado, voltamos, pois está saindo. Vamos verificar algo importante: a forma como estamos inserindo a chave, como espaços. Se estiver registrado como 0002, precisamos digitar 002. Isso está incorreto, então ajustamos para 9 com 4 posições. Salvamos e compilamos novamente. Agora, ao digitar, os zeros podem ser incômodos, então ajustamos para que, ao digitar, os zeros sejam substituídos por espaços em branco. Assim, ao digitar 2, o start começa a partir do 2. Testamos o start com 2, 3, 5, 6, 7, e agora começamos a partir do 3, 0003. O start funcionou corretamente, iniciando na chave desejada.

Implementando intervalo de leitura e finalizando o programa

Podemos usar um recurso no ACCEPT para que, em vez de zeros, sejam exibidos espaços em branco. Isso facilita a visualização. Ao digitar a chave 5, não é necessário inserir 0005, apenas o número 5 é suficiente. O start começa a partir do 5.

Para finalizar, imaginemos a seguinte situação: queremos imprimir uma lista a partir do terceiro registro, mas há muitos dados, e desejamos definir um intervalo, por exemplo, do 3 ao 5. Podemos incluir outra variável, chamada chave 2, para definir a chave inicial e a chave final. Repetimos a busca, mas agora com a chave final. Recebemos a chave 2 e não precisamos exibir a variável, apenas recebê-la. Assim, ao executar o programa, ele fará duas perguntas: chave 1 e chave 2.

No código, implementamos o seguinte: no loop de leitura, verificamos se a chave lida é maior que a chave final e maior que 0. Se a chave 2 não for preenchida, o programa continuará até o final. Isso garante que, se não digitarmos nada, o programa continuará até o fim. Se digitarmos algo, ele verificará constantemente se a chave lida é maior que a chave final. Quando for, o programa termina e exibe o final do relatório. Usamos EXIT para sair do perform, evitando o uso de GOTO.

01 WRK-CHAVE2            PIC 9(04) BLANK WHEN ZEROS.

DISPLAY "QUAL CHAVE FINAL" LINE 02 COLUMN 01.
ACCEPT WRK-CHAVE2 LINE 02 COLUMN 12.

IF ARQCRM-CHAVE > WRK-CHAVE2 AND
   WRK-CHAVE2 > 0
   DISPLAY "FIM DO RELATORIO"
        LINE 20 COLUMN 01
   EXIT PERFORM
END-IF

Vamos testar na prática. Limpamos a tela e executamos o RELAT. A primeira chave é a inicial, por exemplo, 2, e a segunda chave deixamos em branco, pressionando "Enter". O programa irá do 2 ao 7. Ao executar novamente, inserimos a primeira chave como 2 e a segunda como 5. O programa irá até o 5. Isso é apenas uma questão de posicionamento de mensagens na tela.

Dessa forma, temos a chave inicial e a chave final. Posicionamos no início e continuamos lendo. Quando a chave atual for maior que a final, o programa para. Se não digitarmos nada, a chave 2 será 0, e o programa não entrará na condição. Se digitarmos algo, é porque queremos definir um final para o relatório. Assim, temos um recurso muito útil para nos posicionarmos e irmos até onde desejarmos, seja até o final ou até um ponto determinado. Até a próxima!

Sobre o curso Praticando Cobol: trabalhando com arquivos

O curso Praticando Cobol: trabalhando com arquivos possui 19 minutos de vídeos, em um total de 16 atividades. Gostou? Conheça nossos outros cursos de Cobol em Programação, ou leia nossos artigos de Programação.

Matricule-se e comece a estudar com a gente hoje! Conheça outros tópicos abordados durante o curso:

Aprenda Cobol acessando integralmente esse e outros cursos, comece hoje!

Conheça os Planos para Empresas