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.
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.
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.
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.
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".
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.
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.
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.
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.
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!
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:
O Plano Plus evoluiu: agora com Luri para impulsionar sua carreira com os melhores cursos e acesso à maior comunidade tech.
2 anos de Alura
Matricule-se no plano PLUS 24 e garanta:
Jornada de estudos progressiva que te guia desde os fundamentos até a atuação prática. Você acompanha sua evolução, entende os próximos passos e se aprofunda nos conteúdos com quem é referência no mercado.
Programação, Data Science, Front-end, DevOps, Mobile, Inovação & Gestão, UX & Design, Inteligência Artificial
Formações com mais de 1500 cursos atualizados e novos lançamentos semanais, em Programação, Inteligência Artificial, Front-end, UX & Design, Data Science, Mobile, DevOps e Inovação & Gestão.
A cada curso ou formação concluído, um novo certificado para turbinar seu currículo e LinkedIn.
Acesso à inteligência artificial da Alura.
No Discord, você participa de eventos exclusivos, pode tirar dúvidas em estudos colaborativos e ainda conta com mentorias em grupo com especialistas de diversas áreas.
Faça parte da maior comunidade Dev do país e crie conexões com mais de 120 mil pessoas no Discord.
Acesso ilimitado ao catálogo de Imersões da Alura para praticar conhecimentos em diferentes áreas.
Explore um universo de possibilidades na palma da sua mão. Baixe as aulas para assistir offline, onde e quando quiser.
Luri Vision chegou no Plano Pro: a IA da Alura que enxerga suas dúvidas, acelera seu aprendizado e conta também com o Alura Língua que prepara você para competir no mercado internacional.
2 anos de Alura
Todos os benefícios do PLUS 24 e mais vantagens exclusivas:
Chat, busca, exercícios abertos, revisão de aula, geração de legenda para certificado.
Envie imagens para a Luri e ela te ajuda a solucionar problemas, identificar erros, esclarecer gráficos, analisar design e muito mais.
Aprenda um novo idioma e expanda seus horizontes profissionais. Cursos de Inglês, Espanhol e Inglês para Devs, 100% focado em tecnologia.
Escolha os ebooks da Casa do Código, a editora da Alura, que apoiarão a sua jornada de aprendizado para sempre.
Para quem quer atingir seus objetivos mais rápido: Luri Vision ilimitado, vagas de emprego exclusivas e mentorias para acelerar cada etapa da jornada.
2 anos de Alura
Todos os benefícios do PRO 24 e mais vantagens exclusivas:
Catálogo de tecnologia para quem é da área de Marketing
Envie imagens para a Luri e ela te ajuda a solucionar problemas, identificar erros, esclarecer gráficos, analisar design e muito mais de forma ilimitada.
Escolha os ebooks da Casa do Código, a editora da Alura, que apoiarão a sua jornada de aprendizado para sempre.
Conecte-se ao mercado com mentoria individual personalizada, vagas exclusivas e networking estratégico que impulsionam sua carreira tech para o próximo nível.