☕ Um Café no Bellacosa Mainframe
Gostou do conteúdo? Ajude a manter o café quente, o COBOL compilando e o mainframe acordado. 😄
☕ Pague um café ao Bellacosa

Translate

Mostrar mensagens com a etiqueta FILE CONTROL. Mostrar todas as mensagens
Mostrar mensagens com a etiqueta FILE CONTROL. Mostrar todas as mensagens

segunda-feira, 15 de junho de 2020

CICS READNEXT & READPREV — A Jornada pela Estrada dos Registros do Reino VSAM

 

Bellacosa Mainframe e o acesso ao vsam via cics

☕ Um Café no Bellacosa Mainframe

CICS READNEXT & READPREV — A Jornada pela Estrada dos Registros do Reino VSAM

Quando um Programador COBOL Padawan Descobre que a Maior Sabedoria Não Está em Encontrar um Registro, Mas em Caminhar Pelo Caminho que Ele Revela

"Há quem pense que um grande programador é aquele que conhece todas as instruções do COBOL. Os velhos magos do mainframe sorriem diante dessa ideia. Eles sabem que o verdadeiro conhecimento nasce quando compreendemos como os dados percorrem silenciosamente os caminhos invisíveis do sistema."


Prólogo — A Biblioteca Perdida de Gondor

Imagine que você foi convocado por Gandalf para visitar a maior biblioteca já construída na Terra-média.

Não existe Google.

Não existe banco de dados SQL.

Não existe um campo de pesquisa.

Existem apenas milhões de pergaminhos cuidadosamente organizados em prateleiras infinitas.

Cada pergaminho possui um código.

Você procura o registro do cidadão número 000245987.

Um aprendiz sairia correndo entre as estantes procurando manualmente.

Um Mestre Arquivista simplesmente abriria o livro correto exatamente na página desejada.

O VSAM KSDS funciona exatamente assim.

E o CICS oferece um conjunto de comandos que transforma essa biblioteca em algo extremamente simples de navegar.

Esses comandos são:

  • STARTBR

  • READNEXT

  • READPREV

  • ENDBR

À primeira vista parecem comandos pequenos.

Na realidade, escondem décadas de engenharia da IBM.

Hoje vamos abrir essa caixa de segredos.


A filosofia do Browse

Antes de aprender READNEXT, precisamos abandonar um hábito mental muito comum.

Quando iniciamos no COBOL pensamos assim:

Quero um registro.

Então usamos:

READ

Mas sistemas corporativos raramente trabalham dessa forma.

Na maior parte do tempo o usuário deseja algo como:

"Mostre os próximos clientes."

"Liste os próximos pedidos."

"Passe para a próxima página."

"Volte um cliente."

"Continue de onde parei."

Isso muda completamente o problema.

Agora não estamos mais procurando um registro.

Estamos percorrendo um caminho.

É justamente aí que nasce o conceito de Browse.


O que significa Browse?

Browse significa literalmente:

Navegar.

Não pesquisar.

Não localizar.

Não buscar.

Navegar.

É como abrir um livro.

Você não procura cada página individualmente.

Você simplesmente vira a próxima folha.

Depois outra.

Depois outra.

Depois volta uma página.

Essa é exatamente a filosofia do Browse do CICS.


O protagonista invisível: STARTBR

Todo filme possui um herói.

Todo RPG possui um ponto inicial.

Todo programa CICS possui um STARTBR.

Sem ele nada acontece.

Seu trabalho não é ler registros.

Seu trabalho é muito mais importante.

Ele diz ao CICS:

"Prepare a viagem."

Exemplo:

EXEC CICS STARTBR
     FILE('CLIENTES')
     RIDFLD(WS-CHAVE)
END-EXEC.

Observe uma curiosidade interessante.

Nenhum registro foi retornado.

Nenhum dado foi copiado.

Nenhuma informação apareceu.

Então por que executar STARTBR?

Porque ele cria algo invisível.


A Sessão de Browse

Quando STARTBR é executado, o CICS cria internamente uma estrutura.

Essa estrutura guarda:

  • posição atual

  • chave corrente

  • ponteiro para o arquivo

  • direção da leitura

  • contexto da navegação

  • estado da operação

Pense nela como um marcador de páginas.

Imagine ler "O Senhor dos Anéis".

Você fecha o livro.

No dia seguinte abre exatamente onde parou.

O marcador fez isso.

STARTBR cria exatamente esse marcador.

Sem ele o CICS não sabe de onde continuar.


Uma comparação moderna

Hoje usamos streaming.

Netflix lembra onde paramos.

Spotify lembra a música.

Kindle lembra a página.

Google Docs lembra o cursor.

STARTBR fazia isso décadas antes da internet existir.


READNEXT — O Guardião da Estrada

Agora começa a aventura.

EXEC CICS READNEXT
     FILE('CLIENTES')
     INTO(WS-REG)
     RIDFLD(WS-ID)
END-EXEC.

Parece simples.

Mas internamente acontece uma verdadeira orquestra.

O CICS pergunta ao VSAM:

Qual registro vem depois deste?

O VSAM responde imediatamente.

Depois atualiza o marcador.

Depois entrega os dados.

Tudo isso em poucos microssegundos.


Como o VSAM sabe qual é o próximo?

Aqui encontramos uma das maiores genialidades do VSAM.

Muitos imaginam que ele percorra todo o arquivo.

Não.

Ele utiliza sua árvore de índices.

Visualmente:

                 Índice Raiz

               /             \

        Índice A          Índice B

        /     \            /     \

     Dados   Dados      Dados   Dados

Quando STARTBR encontra o registro inicial...

READNEXT simplesmente anda para frente.

Quando termina uma folha...

o índice aponta automaticamente para a próxima.

O programa COBOL nunca percebe isso.


A magia do KSDS

KSDS significa:

Key Sequenced Data Set

Ou seja...

os registros são armazenados obedecendo uma ordem lógica.

Veja:

000100 João

000150 Carlos

000220 Maria

000330 Pedro

000410 Ana

Não importa a ordem física.

Importa a ordem da chave.

READNEXT respeita exatamente essa sequência.


READPREV — O Retorno do Rei

Agora imagine uma tela de consulta.

O operador pressiona:

PF8

Próximo cliente.

Depois outro.

Depois outro.

Mas então lembra que esqueceu uma informação.

Pressiona:

PF7

O programa executa:

READPREV

E retorna ao registro anterior.

Parece simples.

Mas isso evita milhares de buscas.


Curiosidade pouco conhecida

Muitos iniciantes acreditam que READPREV faz o disco girar ao contrário.

Não.

O VSAM utiliza novamente sua árvore B.

Ele encontra rapidamente o registro anterior utilizando o índice.

Essa estrutura é extremamente eficiente.

Mesmo arquivos com dezenas de milhões de registros continuam rápidos.


O Browse lembra um Cursor SQL?

Muito.

Veja.

SQL

DECLARE CURSOR

OPEN

FETCH NEXT

FETCH PRIOR

CLOSE

Agora compare.

CICS

STARTBR

READNEXT

READPREV

ENDBR

São filosofias quase idênticas.

Não por acaso.

Muitos conceitos modernos nasceram justamente dos ambientes mainframe.


O ciclo completo

Uma navegação típica acontece assim.

STARTBR

↓

READNEXT

↓

READNEXT

↓

READNEXT

↓

READPREV

↓

READNEXT

↓

READNEXT

↓

ENDBR

Simples.

Elegante.

Confiável.


E o ENDBR?

Todo começo precisa de um fim.

Quando terminamos:

EXEC CICS ENDBR
     FILE('CLIENTES')
END-EXEC.

O CICS remove:

  • ponteiros

  • buffers

  • contexto

  • sessão

  • recursos internos

Imagine esquecer ENDBR.

Seria como abandonar centenas de livros abertos pela biblioteca.

Alguém precisará organizá-los depois.

Por isso ENDBR é obrigatório.


O segredo dos códigos RESP

Programadores iniciantes costumam cometer um erro clássico.

Ignoram RESP.

Jamais faça isso.

Exemplo:

RESP = NORMAL

Tudo certo.


RESP = ENDFILE

Fim da navegação.

Não é erro.


RESP = NOTFND

Registro não localizado.


RESP = INVREQ

Pedido inválido.

Geralmente STARTBR inexistente.


RESP = FILENOTFOUND

Arquivo indisponível.


RESP = LOCKED

Registro bloqueado.


O perigo dos loops infinitos

Imagine:

PERFORM UNTIL FIM

READNEXT

END-PERFORM

Sem verificar ENDFILE.

O resultado?

Loop eterno.

O programa continua tentando ler além do último registro.

Esse é um dos erros mais comuns encontrados em entrevistas técnicas.


GTEQ — Uma joia escondida

Suponha este arquivo.

100

200

300

400

500

Você procura:

250

Sem GTEQ.

Resultado:

NOTFND

Com GTEQ.

Resultado:

300

Ou seja:

Comece pelo primeiro registro maior ou igual.

É fantástico para consultas por faixa.


Pesquisas parciais

Imagine procurar CEPs.

13000

13010

13020

13035

13080

13100

O operador deseja apenas:

130

O STARTBR posiciona no primeiro.

READNEXT continua lendo.

Quando chega:

131

A pesquisa termina.

Sem varrer milhões de registros.


Paginação muito antes da Web

Hoje chamamos isso de paginação.

Mas o CICS fazia isso nos anos 70.

Tela.

Cliente 1

Cliente 2

Cliente 3

Cliente 4

Cliente 5

PF8.

Mais cinco.

PF8.

Mais cinco.

PF7.

Cinco anteriores.

Décadas antes do JavaScript.

Décadas antes do HTML.

Décadas antes do React.


Performance impressionante

Imagine um banco.

Arquivo:

40 milhões de clientes.

Você quer mostrar apenas vinte.

READNEXT lê somente vinte.

Não quarenta milhões.

É essa eficiência que tornou o mainframe lendário.


O que acontece por trás dos bastidores?

Enquanto você escreve apenas:

READNEXT

O CICS executa dezenas de tarefas:

✔ valida a Browse Session

✔ verifica autorização RACF

✔ verifica integridade

✔ localiza buffers

✔ identifica a posição corrente

✔ percorre a árvore do VSAM

✔ copia dados

✔ atualiza RIDFLD

✔ movimenta INTO

✔ atualiza ponteiros

✔ retorna RESP

Tudo isso acontece invisivelmente.


Boas práticas de um Programador Jedi

Nunca faça:

STARTBR

READNEXT

ABEND

...

Sem ENDBR.

Use sempre tratamento de exceção.

Outra boa prática:

Nunca deixe Browse aberto durante muito tempo.

Quanto menor a duração da sessão, melhor para o ambiente.


Armadilhas clássicas

Esquecer STARTBR

READNEXT falha.


Esquecer ENDBR

Recursos permanecem ocupados.


Ignorar RESP

Loops infinitos.


Fazer READ comum durante o Browse

Perde desempenho.


Atualizar registros sem entender bloqueios

Pode causar conflitos de concorrência.


Curiosidades Históricas

Durante as décadas de 1980 e 1990 praticamente todo caixa bancário utilizava PF7 e PF8.

PF8

READNEXT

PF7

READPREV

Milhares de operadores trabalhavam assim diariamente.

Sem mouse.

Sem interface gráfica.

Mesmo assim conseguiam navegar milhões de registros mais rapidamente do que muitos sistemas modernos.


Dicas para entrevistas técnicas

Se o entrevistador perguntar:

Qual a sequência correta?

Responda imediatamente.

STARTBR

↓

READNEXT ou READPREV

↓

ENDBR

Outra pergunta clássica:

READNEXT funciona sem STARTBR?

Resposta:

Não.

Porque não existe posição inicial.


Easter Egg — A Sociedade do Browse 🧙‍♂️💍

No universo de O Senhor dos Anéis, imagine que o VSAM KSDS seja a gigantesca biblioteca de Minas Tirith, onde cada tomo contém a história de um habitante da Terra-média, organizado rigorosamente pelos escribas de Gondor.

STARTBR é Gandalf abrindo o antigo mapa dos reinos e indicando onde a Sociedade iniciará sua jornada. Sem esse mapa, ninguém sabe por onde seguir.

READNEXT é Aragorn conduzindo a comitiva pela estrada principal, avançando de vila em vila, encontrando cada novo aliado na ordem correta, sem jamais se perder.

READPREV é Legolas olhando para trás do grupo, retornando alguns passos para verificar se ninguém ficou para trás ou se alguma pista importante foi esquecida no caminho.

ENDBR é o momento em que a missão termina, o mapa é cuidadosamente enrolado e devolvido aos arquivos de Minas Tirith. Nada permanece aberto, nenhum recurso é desperdiçado e a biblioteca está pronta para a próxima expedição.

Existe ainda um personagem invisível: a árvore B (B-tree) do VSAM. Ela pode ser comparada às Águias da Terra-média. Quase ninguém as vê trabalhando, mas são elas que conhecem todos os caminhos e permitem que a jornada aconteça com rapidez extraordinária. Sem elas, percorrer milhões de registros seria como atravessar Mordor a pé sem qualquer orientação.

O verdadeiro herói desta história não é READNEXT nem READPREV.

É a inteligência do VSAM, construída ao longo de décadas de engenharia, permitindo que aplicações COBOL executem consultas em volumes gigantescos de dados com uma eficiência que continua impressionando até os dias atuais.


Conclusão — A Sabedoria dos Antigos Arquivistas

Quando um programador iniciante aprende READNEXT e READPREV, pode imaginar que está apenas decorando mais alguns comandos da linguagem CICS. Porém, essa impressão desaparece à medida que compreende o que realmente acontece nos bastidores.

Esses comandos representam uma filosofia de desenvolvimento que nasceu muito antes da computação moderna: não acessar dados de forma aleatória quando existe um caminho inteligente para percorrê-los. O Browse do CICS reduz processamento, aproveita a organização do VSAM KSDS, reutiliza a posição corrente e transforma milhões de registros em uma trilha organizada que pode ser percorrida para frente e para trás com naturalidade.

Não é por acaso que bancos, seguradoras, companhias aéreas e governos utilizam esse mecanismo há décadas. Em sistemas onde cada microssegundo conta e cada transação precisa ser confiável, navegar corretamente pelos dados é tão importante quanto encontrá-los.

No universo Bellacosa Mainframe, costumo dizer que um Programador COBOL Padawan aprende primeiro a fazer um READ. Um profissional experiente aprende quando usar STARTBR. Mas um verdadeiro Mestre do Mainframe entende que o maior poder nunca esteve em localizar um único registro, e sim em conduzir toda a jornada pelos dados com elegância, eficiência e respeito à arquitetura construída pelos antigos engenheiros da IBM.

E, assim como Frodo descobriu que o valor da jornada era muito maior do que o destino final, o programador também percebe que dominar STARTBR, READNEXT, READPREV e ENDBR é mais do que conhecer comandos: é aprender uma das artes mais refinadas da programação transacional em CICS, uma tradição que continua viva após mais de meio século de evolução do IBM Z.

segunda-feira, 12 de fevereiro de 2007

Comandos COBOL para Manipulação de Arquivos: ACCESS MODE, FILE-CONTROL, FILE STATUS, OPEN, READ, START, WRITE, REWRITE, DELETE e CLOSE

Bellacosa Mainframe e comandos de mainupalação de datasets em Mainframe



Comandos COBOL para Manipulação de Arquivos: ACCESS MODE, FILE-CONTROL, FILE STATUS, OPEN, READ, START, WRITE, REWRITE, DELETE e CLOSE

Quando um programa COBOL trabalha com arquivos QSAM ou VSAM, existe um conjunto de comandos fundamentais que controlam toda a entrada, saída e atualização dos dados.

Esses comandos aparecem diariamente em sistemas:

  • bancários;

  • seguradoras;

  • cartões;

  • governo;

  • ERP;

  • processamento batch.


Visão Geral

FILE-CONTROL
     ↓
OPEN
     ↓
READ / START
     ↓
WRITE / REWRITE / DELETE
     ↓
CLOSE

FILE-CONTROL

Fica na:

ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.

Responsável por:

  • associar arquivos;

  • definir organização;

  • definir acesso;

  • definir FILE STATUS.


Exemplo

SELECT ARQCLIENTE
       ASSIGN TO CLIENTE
       ORGANIZATION IS INDEXED
       ACCESS MODE IS DYNAMIC
       RECORD KEY IS CLI-ID
       FILE STATUS IS WS-FS.

ACCESS MODE

Define como o programa acessará o arquivo.


SEQUENTIAL

Leitura em sequência.

ACCESS MODE IS SEQUENTIAL

Fluxo:

REG1
 ↓
REG2
 ↓
REG3

Muito usado em:

  • QSAM

  • Batch


RANDOM

Acesso direto pela chave.

ACCESS MODE IS RANDOM

Exemplo:

PROCURA CLIENTE 1000

Vai diretamente ao registro.


DYNAMIC

Mistura Sequential e Random.

ACCESS MODE IS DYNAMIC

Muito comum em VSAM.


FILE STATUS

Retorno das operações do arquivo.


Declaração

01 WS-FS PIC XX.

Associação

FILE STATUS IS WS-FS

Status comuns

CódigoSignificado
00Sucesso
10EOF
22Chave duplicada
23Registro não encontrado
35Arquivo inexistente
39Definição incompatível
92Erro lógico
93Arquivo não aberto

OPEN

Abre o arquivo.


INPUT

Somente leitura.

OPEN INPUT ARQCLI

OUTPUT

Cria novo arquivo.

OPEN OUTPUT ARQSAIDA

I-O

Leitura e atualização.

OPEN I-O ARQVSAM

EXTEND

Acrescenta registros.

OPEN EXTEND ARQREL

READ

Lê um registro.


QSAM

READ ARQCLI

Com EOF

READ ARQCLI
   AT END
      MOVE 'S' TO EOF
END-READ

READ para VSAM

READ ARQVSAM

Lê o registro corrente.


READ NEXT

Muito usado em VSAM KSDS.


Exemplo

READ ARQVSAM NEXT RECORD

Fluxo

Registro 100
 ↓
READ NEXT
 ↓
Registro 101

START

Posiciona o ponteiro em uma chave.

Funciona apenas em arquivos indexados.


Exemplo

START ARQVSAM
   KEY IS >= WS-CHAVE
END-START

Fluxo

Chave procurada = 1000
       ↓
Posiciona no primeiro >= 1000

Muito usado para pesquisas.


WRITE

Grava novo registro.


Exemplo

WRITE REG-CLIENTE

Em arquivo sequencial

Registro gravado no final

Em VSAM

Registro incluído pela chave

Possível erro

FS = 22

Chave duplicada.


REWRITE

Atualiza registro existente.


Exemplo

REWRITE REG-CLIENTE

Fluxo

READ
 ↓
ALTERA DADOS
 ↓
REWRITE

Exemplo completo

READ ARQVSAM

MOVE 5000 TO CLI-SALDO

REWRITE REG-CLIENTE

DELETE

Remove registro.

Disponível em arquivos indexados.


Exemplo

DELETE ARQVSAM

Fluxo

READ
 ↓
DELETE
 ↓
Registro removido

Muito usado em:

  • VSAM KSDS

  • RRDS


Não funciona em QSAM

Arquivos sequenciais não suportam DELETE.


CLOSE

Fecha arquivo.


Exemplo

CLOSE ARQCLI

Sempre execute CLOSE

Evita:

  • perda de dados;

  • buffers pendentes;

  • inconsistências.


Exemplo Completo VSAM

OPEN I-O ARQCLI

MOVE 1000 TO WS-ID

START ARQCLI
   KEY >= WS-ID

READ ARQCLI NEXT RECORD

IF WS-FS = '00'

   MOVE 'NOVO NOME'
      TO CLI-NOME

   REWRITE REG-CLIENTE

END-IF

CLOSE ARQCLI

Ciclo de Vida de um Arquivo COBOL

FILE-CONTROL
      ↓
OPEN
      ↓
START
      ↓
READ
      ↓
WRITE
      ↓
REWRITE
      ↓
DELETE
      ↓
CLOSE

Resumo Rápido

ComandoFunção
FILE-CONTROLDefine arquivo
ACCESS MODETipo de acesso
FILE STATUSRetorno da operação
OPENAbre arquivo
READLê registro
READ NEXTPróximo registro
STARTPosiciona por chave
WRITEInclui registro
REWRITEAtualiza registro
DELETERemove registro
CLOSEFecha arquivo

Dica de Programador Mainframe

Para arquivos QSAM, normalmente você verá:

OPEN INPUT
READ
WRITE
CLOSE

Para arquivos VSAM KSDS, os comandos mais comuns são:

OPEN I-O
START
READ NEXT
WRITE
REWRITE
DELETE
CLOSE

Esses são os comandos fundamentais que formam a base de praticamente todos os programas COBOL que manipulam arquivos no ambiente IBM Z.


Vagner Renato Bellacosa, IBM Champion e especialista em IBM Mainframe
IBM Z17 SYSTEM ONLINE
Sobre o autor

Vagner Renato Bellacosa

IBM Champion 2026 • Especialista em IBM Mainframe

Vagner Renato Bellacosa trabalha com IBM Mainframe desde 1988 , é IBM Champion e especialista em COBOL, CICS, Db2, z/OS e IBM Z. Compartilha experiências profissionais, conhecimento técnico, história da computação e práticas do universo mainframe para aproximar novas gerações das tecnologias que sustentam empresas, bancos e governos ao redor do mundo.

IBM Champion IBM Z COBOL CICS Db2 z/OS Mainframe desde 1988
GitHub LinkedIn
Inicializando conteúdo...