Translate

quarta-feira, 21 de novembro de 2018

CICS TOR sem Mistérios para Programadores COBOL

 

Bellacosa Mainframe apresenta cics tor 

☕ Um Café no Bellacosa Mainframe

CICS TOR sem Mistérios para Programadores COBOL

Quando um Programador Descobre que Nem Todo Programa COBOL Conversa Diretamente com o Usuário... Existe uma Recepção Inteligente que Organiza Todo o Data Center Antes Mesmo do Primeiro EXEC CICS

"Não entre em pânico." — O Guia do Mochileiro das Galáxias

Se Douglas Adams tivesse trabalhado na IBM durante os anos 80, provavelmente escreveria um capítulo chamado "A Vida, o Universo e as Regiões CICS". Afinal, poucas arquiteturas conseguem parecer tão misteriosas à primeira vista e, ao mesmo tempo, tão elegantemente organizadas quanto um CICSplex.

Para quem está iniciando em COBOL Mainframe, é muito comum imaginar que o usuário digita uma transação, o programa COBOL é executado, consulta o DB2 e devolve a resposta.

Na prática...

...isso raramente acontece dessa forma.

Existe uma verdadeira cidade funcionando por trás das cortinas.

E um dos personagens mais importantes dessa cidade chama-se TOR (Terminal-Owning Region).

Hoje vamos abrir a porta do Data Center, colocar uma toalha no ombro (você entendeu a referência...) e descobrir como funciona esse universo.


Antes de tudo: o que é uma Região CICS?

Imagine que o CICS seja um enorme shopping center.

Dentro dele existem dezenas de lojas.

Cada loja possui funcionários, estoque, computadores e clientes.

No Mainframe acontece algo parecido.

Cada CICS Region é um ambiente independente executando dentro do z/OS.

Ela possui memória própria.

Recursos próprios.

Filas.

Programas.

Transações.

Arquivos.

Conexões.

E tudo isso funciona de maneira totalmente isolada das demais regiões.

Uma região pode executar centenas de milhares de transações diariamente.

Grandes bancos chegam facilmente à casa dos milhões.


O primeiro erro de todo iniciante

Quase todo programador COBOL pensa assim:

Usuário

↓

Programa COBOL

↓

DB2

↓

Resposta

É simples.

Faz sentido.

Mas...

...não é assim que um ambiente corporativo funciona.

Na realidade existe uma arquitetura muito mais sofisticada.

Usuário

↓

TOR

↓

AOR

↓

FOR

↓

DB2

↓

FOR

↓

AOR

↓

TOR

↓

Usuário

De repente apareceu um monte de siglas.

Vamos decifrá-las.


Por que dividir tudo?

Imagine um restaurante.

Você chega.

A primeira pessoa que encontra é a recepcionista.

Ela pergunta:

— Quantas pessoas?

— Mesa para fumantes?

— Possui reserva?

Ela não cozinha.

Não prepara sobremesa.

Não faz pizza.

Ela apenas organiza o fluxo.

Agora imagine se o chef precisasse abandonar o fogão toda vez que alguém chegasse à porta.

O restaurante entraria em colapso.

O mesmo acontece no CICS.


Bem-vindo ao TOR

TOR significa

Terminal-Owning Region

O nome parece complicado.

Na prática significa:

a região dona dos terminais.

Ela controla toda a comunicação com o mundo externo.

É ela quem recebe:

  • terminais 3270

  • sessões TCP/IP

  • conexões IPIC

  • usuários

  • requisições

  • logons

  • transações

Ela é literalmente a recepção do Data Center.


A analogia do aeroporto

Imagine um aeroporto.

Você entra.

Vai ao check-in.

Despacha bagagem.

Recebe seu cartão de embarque.

Somente depois segue para o portão correto.

O check-in nunca pilota o avião.

Da mesma forma...

O TOR nunca executa a lógica do programa COBOL.

Ele apenas encaminha.


O verdadeiro trabalho do TOR

Quando um usuário digita:

BANK

Ou

CUST

Ou

MENU

O TOR faz várias coisas quase instantaneamente.

Ele verifica:

  • quem é o usuário

  • de qual terminal veio

  • qual transação foi digitada

  • qual AOR está disponível

  • qual AOR possui menos carga

  • qual política de roteamento deve ser utilizada

Somente depois encaminha a requisição.

Tudo isso acontece em poucos milissegundos.


O grande maestro invisível

Imagine uma orquestra.

O maestro não toca violino.

Não toca trompete.

Não toca piano.

Mesmo assim...

Sem ele...

...a música vira caos.

O TOR é exatamente isso.

Ele coordena.

Distribui.

Organiza.

Sincroniza.


Então quem executa o COBOL?

Entra em cena outro personagem.

O famoso:

AOR

Application-Owning Region.

Agora sim.

Aqui vivem:

  • programas COBOL

  • programas PL/I

  • programas C

  • Java

  • BMS

  • MAPSETs

  • lógica de negócio

O AOR é onde realmente acontece o processamento.

Quando você escreve:

EXEC SQL

ou

EXEC CICS LINK

provavelmente será um AOR quem executará esse código.


O FOR entra na história

Existe ainda outra região.

FOR.

File-Owning Region.

Ela concentra:

VSAM

BDAM

arquivos compartilhados

alguns recursos de acesso

Embora muitas arquiteturas modernas permitam que o AOR acesse diretamente o DB2, em ambientes clássicos era comum utilizar FOR para centralizar determinados recursos físicos.

É uma forma elegante de separar responsabilidades.


O caminho completo de uma transação

Vamos acompanhar uma consulta de saldo.

Imagine João acessando o Internet Banking.

Ele solicita:

SALDO

O que acontece?

Primeiro:

João

↓

TOR

O TOR identifica a transação.

Depois:

↓

AOR-03

O programa COBOL inicia.

EXEC SQL

SELECT SALDO

FROM CONTAS

O DB2 responde.

O COBOL monta a tela.

A resposta retorna.

DB2

↓

AOR

↓

TOR

↓

João

João acredita que falou diretamente com o banco.

Na verdade...

Conversou apenas com o TOR.


O TOR conhece todos os usuários

Ele administra:

  • sessões

  • conexões

  • terminais

  • usuários ativos

  • estado das conexões

Pense nele como um gigantesco porteiro.

Ele sabe exatamente quem entrou no prédio.


O TOR conhece os programas?

Não.

Quem conhece programas é o AOR.

O TOR conhece caminhos.

Não conhece regras de negócio.


A mágica do balanceamento

Agora imagine:

100 mil pessoas consultando saldo.

Sem TOR:

Usuários

↓

AOR

Resultado?

Sobrecarga.

Com TOR:

Usuários

↓

TOR

↓

AOR1

AOR2

AOR3

AOR4

AOR5

Agora a carga fica distribuída.

Esse conceito hoje é chamado de:

Load Balancing.

Mas o CICS fazia isso quando a internet ainda engatinhava.


O CICS inventou a Cloud antes da Cloud?

Curiosamente...

Em vários aspectos...

Sim.

Observe.

Cloud moderna:

Gateway

Load Balancer

Microservices

Database

CICS:

TOR

AOR

FOR

DB2

A semelhança impressiona.

Muitas ideias que hoje parecem revolucionárias já existiam nos grandes mainframes há décadas.


O papel do CICSPlex

Até agora vimos várias regiões.

Mas quem coordena tudo?

Entra em cena o:

CICSPlex SM.

Ele funciona como um cérebro.

Conhece todas as regiões.

Monitora carga.

Falhas.

Disponibilidade.

Prioridades.

Com essas informações o TOR consegue decidir:

"AOR-2 está sobrecarregado."

"Envie para AOR-4."

Tudo automaticamente.


Quando um AOR morre

Imagine que o AOR-3 sofreu um ABEND.

O que acontece?

Sem TOR:

Todos os usuários falham.

Com TOR:

As novas transações passam automaticamente para outro AOR disponível.

Na maioria das vezes o usuário nem percebe.

Esse é um dos grandes segredos da disponibilidade do IBM Z.


O problema chamado Affinity

Nem toda transação pode mudar livremente de AOR.

Imagine um programa antigo.

Ele grava informações temporárias na memória.

Na próxima tela...

Ele espera encontrar aquelas informações.

Se o usuário cair em outro AOR...

Elas desapareceram.

Isso chama-se:

Transaction Affinity.

É um dos grandes desafios na modernização de aplicações CICS.


O que os arquitetos modernos fazem?

Evitam afinidade.

Preferem guardar contexto em:

  • TSQ compartilhada

  • Temporary Storage compartilhada

  • Channels e Containers

  • DB2

  • MQ

  • recursos compartilhados

Assim qualquer AOR pode continuar o processamento.


Curiosidade histórica

Nos anos 70 e 80 era comum existir apenas uma região CICS.

Tudo ficava nela.

Com o crescimento dos bancos isso tornou-se inviável.

Foi então que a IBM começou a incentivar arquiteturas distribuídas dentro do próprio Mainframe.

Nascia a divisão entre:

TOR

AOR

FOR

Mais tarde veio o CICSPlex.

Hoje essa arquitetura é praticamente padrão em ambientes corporativos.


Onde entram os terminais 3270?

Eles normalmente se conectam ao TOR.

Nunca diretamente ao AOR.

Isso simplifica administração.

Caso um AOR precise ser reiniciado...

Os terminais continuam conectados ao TOR.


O que acontece durante uma manutenção?

Imagine que o AOR-2 será atualizado.

O administrador simplesmente retira aquele AOR do roteamento.

O TOR passa a enviar novas transações para:

AOR-1

AOR-3

AOR-4

Quando o AOR-2 retorna...

Ele volta automaticamente ao balanceamento.

Nenhum usuário percebe.

Isso é engenharia de disponibilidade.


O TOR é um Firewall?

Não.

Mas ele funciona como um ponto central de entrada.

Por isso muitas políticas de segurança começam justamente nele.

É muito mais fácil controlar milhares de conexões em poucos TORs do que em dezenas de AORs espalhados.


Como isso aparece para o programador COBOL?

Na maioria das vezes...

Não aparece.

Você escreve:

EXEC CICS RECEIVE MAP('TELA1')
END-EXEC.

EXEC SQL
SELECT NOME
INTO :WS-NOME
FROM CLIENTE
END-EXEC.

EXEC CICS SEND MAP('TELA2')
END-EXEC.

Você nem imagina que por trás disso existe uma infraestrutura inteira tomando decisões sobre roteamento, disponibilidade e balanceamento.

Esse é justamente o objetivo da arquitetura: esconder a complexidade da infraestrutura para que o desenvolvedor possa focar na regra de negócio.


Dicas para quem quer trabalhar com CICS

Se você está começando agora, aprenda nesta ordem:

  1. Conceitos básicos do CICS.

  2. Estrutura de uma Region.

  3. PCT, PPT, FCT e TCT.

  4. BMS e Mapsets.

  5. COMMAREA.

  6. Channels e Containers.

  7. Temporary Storage (TSQ) e Transient Data (TDQ).

  8. Syncpoint e recuperação.

  9. TOR, AOR, FOR e CICSPlex SM.

  10. CICS Explorer e ferramentas modernas de administração.

Com essa base, você entenderá não apenas como escrever programas, mas como eles realmente funcionam dentro de um ambiente corporativo.


Easter Egg Bellacosa Mainframe ☕

Imagine que o Data Center seja a Estrela da Morte.

O usuário pilota uma pequena nave e solicita permissão para atracar.

O TOR é o controlador de tráfego do hangar. Ele verifica a identidade da nave, consulta quais docas estão livres e direciona o piloto para o setor correto.

Os AORs são os departamentos especializados: engenharia, armamentos, navegação, inteligência e manutenção dos TIE Fighters.

O FOR é o gigantesco arquivo imperial, onde ficam armazenados todos os planos secretos, documentos e registros.

O DB2 é o Holocron de dados do Império, contendo milhões de informações críticas.

Enquanto isso, o CICSPlex SM é o Grande Almirante Thrawn observando toda a frota em um enorme mapa holográfico, redistribuindo recursos e garantindo que nenhuma região fique sobrecarregada.

O piloto acredita que falou apenas com uma porta automática. Na realidade, dezenas de sistemas trabalharam em perfeita sincronia antes que o hangar sequer abrisse.


Conclusão: a genialidade invisível do CICS

O Terminal-Owning Region (TOR) é uma das peças mais elegantes da arquitetura CICS. Embora raramente execute uma única linha de código COBOL, ele é responsável por tornar possível o funcionamento de ambientes que atendem milhões de usuários diariamente.

Ao separar a recepção das conexões (TOR) do processamento da lógica (AOR) e, quando necessário, da administração dos recursos de dados (FOR), o CICS alcança um nível de escalabilidade, disponibilidade e organização que continua impressionando mesmo quando comparado às arquiteturas modernas de microsserviços.

Para o programador COBOL iniciante, entender essa divisão muda completamente a forma de enxergar o Mainframe. Você deixa de ver apenas um programa executando comandos EXEC CICS e passa a compreender que existe uma verdadeira metrópole digital funcionando nos bastidores, onde cada região tem uma missão específica e todas cooperam para entregar respostas em frações de segundo.

No fim das contas, o TOR é como a recepção de um hotel cinco estrelas: ninguém vai ao hotel para conversar com a recepcionista, mas sem ela a experiência inteira deixaria de funcionar. E essa é uma das maiores lições da arquitetura IBM Z: os sistemas mais robustos não dependem de um componente fazer tudo, mas de muitos componentes fazendo exatamente aquilo em que são especialistas.


terça-feira, 20 de novembro de 2018

CICS MQ Bridge : Quando um Programador Descobre que um MQPUT Pode Executar um Programa COBOL sem Abrir um Único Terminal 3270...

 

Bellacosa Mainframe apresenta cics mq bridge

☕ Um Café no Bellacosa Mainframe

CICS MQ Bridge sem Mistérios para Programadores COBOL

Quando um Programador Descobre que um MQPUT Pode Executar um Programa COBOL sem Abrir um Único Terminal 3270... e Percebe que Existe um Tradutor Universal Trabalhando nos Bastidores do Mainframe

"No universo, existem três tipos de pessoas: as que acham que o MQ conversa diretamente com o COBOL, as que sabem que existe um CICS no meio do caminho... e aquelas que descobriram o MQ Bridge e nunca mais olharam uma fila da mesma forma."


Introdução — O Dia em que o COBOL Conheceu a Nuvem

Imagine que você é um programador COBOL iniciante.

Você acabou de aprender:

  • JCL

  • VSAM

  • CICS

  • COMMAREA

  • EXEC CICS LINK

  • RETURN

  • SEND MAP

  • RECEIVE MAP

Tudo faz sentido.

O usuário abre um terminal 3270.

Digita dados.

O CICS recebe.

Seu programa COBOL executa.

Retorna outra tela.

Fim.

Então alguém aparece na reunião e diz:

"Precisamos que esse programa seja chamado por um microsserviço rodando Kubernetes."

Você responde:

"Mas... onde fica o terminal?"

Silêncio.

Ninguém responde.

Porque...

não existe terminal.

É aqui que começa uma das arquiteturas mais inteligentes já criadas dentro do ecossistema IBM Z:

CICS MQ Bridge.

Hoje vamos fazer uma viagem ao estilo Guia do Mochileiro das Galáxias, descobrindo como um simples MQPUT consegue acordar um programa COBOL escrito há trinta anos sem modificar praticamente uma linha de código.

Pegue seu café.

Ajuste seu terminal 3270.

E não esqueça sua toalha.


Capítulo 1 — Antes do MQ Bridge Existia Apenas o Terminal

Durante décadas o fluxo era extremamente simples.

Usuário

↓

Terminal 3270

↓

CICS

↓

Programa COBOL

↓

Banco de Dados

O terminal era praticamente parte do programa.

Quando alguém digitava ENTER...

o CICS criava uma Task.

Montava o ambiente.

Criava o EIB.

Criava a COMMAREA.

Chamava a Transaction.

O COBOL trabalhava.

Era um mundo perfeito.

Até aparecerem...

  • Java

  • Linux

  • Windows

  • Web Services

  • REST

  • Smartphones

  • APIs

  • Kubernetes

  • OpenShift

  • Microsserviços

Todos eles queriam conversar com o COBOL.

Nenhum deles sabia falar 3270.


O Grande Problema

Imagine tentar conversar com um japonês usando apenas latim medieval.

Não importa o quanto ambos sejam inteligentes.

Sem tradutor...

não existe comunicação.

O mesmo acontecia aqui.

Java
        X
COBOL CICS

Java entende objetos.

REST entende JSON.

MQ entende mensagens.

O COBOL espera uma COMMAREA.

Quem faz essa tradução?

O MQ Bridge.


O MQ Não Executa Programas

Esse é um dos maiores equívocos dos iniciantes.

Muita gente imagina:

MQ

↓

Programa COBOL

Isso nunca acontece.

O MQ apenas transporta mensagens.

Ele não conhece:

  • EXEC CICS

  • COMMAREA

  • EIB

  • TCTUA

  • TIOA

  • MAPSET

  • BMS

Ele é apenas um excelente carteiro.

O inteligente da história é o CICS.


Pense no MQ Como os Correios

Você escreve uma carta.

Os Correios não sabem o conteúdo.

Eles apenas entregam.

Da mesma forma:

Aplicação

↓

MQPUT

↓

Fila

↓

MQGET

O MQ não interpreta.

Não executa.

Não calcula.

Não valida.

Ele apenas entrega.

Essa simplicidade é justamente sua maior força.


O Surgimento do Bridge

Alguém na IBM fez uma pergunta brilhante.

"E se criarmos um intérprete?"

Um componente capaz de dizer:

"Recebi uma mensagem MQ.
Vou fingir que ela veio de um terminal."

Nascia o Bridge Facility.


A Arquitetura Completa

Vamos ampliar o diagrama.

Cliente

↓

MQPUT

↓

Request Queue

↓

Trigger

↓

CKTI

↓

ATTACH

↓

CKBR

↓

Bridge Facility

↓

EXEC CICS

↓

Programa COBOL

↓

COMMAREA

↓

MQPUT

↓

Reply Queue

↓

Cliente

Parece longo.

Mas acontece em poucos milissegundos.


Capítulo 2 — O Primeiro Passo: MQPUT

Tudo começa com um simples comando.

MQPUT

Esse comando grava uma mensagem.

Mas a mensagem não contém apenas dados.

Ela possui uma identidade.

É como um envelope.

Dentro dele existem várias informações.


O Envelope Inteligente

Imagine enviar uma encomenda.

No envelope existe:

Destinatário

Remetente

Prioridade

Resposta

Conteúdo

No MQ ocorre exatamente o mesmo.

Quem guarda essas informações?

MQMD.


MQMD — O RG da Mensagem

MQMD significa:

Message Descriptor

Ele possui dezenas de campos.

Entre eles:

Message ID

Correlation ID

Persistence

Priority

Expiry

ReplyToQ

ReplyToQMgr

O campo mais importante para o Bridge costuma ser:

ReplyToQ

É ele que informa:

"Quando terminar o processamento,
responda nesta fila."

Nenhuma aplicação precisa conhecer outra.

Tudo acontece por mensagens.


Easter Egg nº 1 ☕

ReplyToQ funciona exatamente como a etiqueta de uma mala no aeroporto.

Você não precisa conhecer quem vai buscá-la.

Basta colocar a etiqueta correta.

Ela chegará ao destino.


MQCIH — O DNA da Chamada CICS

Agora entra o verdadeiro protagonista.

O MQCIH.

Seu nome completo:

MQ CICS Information Header

Esse cabeçalho diz ao Bridge:

  • qual transação executar;

  • se haverá sincronização (syncpoint);

  • qual formato de dados será usado;

  • como tratar erros;

  • como montar o ambiente CICS;

  • quais parâmetros deverão ser passados.

Sem o MQCIH...

o Bridge seria como um carteiro tentando entregar uma carta sem endereço.


O Payload

Depois do MQCIH vem a carga útil.

Ela pode conter:

COMMAREA

3270 Data Stream

Containers

Business Data

É exatamente isso que o programa COBOL irá processar.


Capítulo 3 — O Trigger

Agora imagine um carteiro esperando cartas.

Existem duas formas.

Modelo Antigo

Tem carta?

Não.

Tem carta?

Não.

Tem carta?

Não.

Isso se chama Polling.

CPU desperdiçada.


Modelo Inteligente

Chegou carta.

Toc!

Levante.

Existe trabalho.

Isso é Trigger.

Muito mais elegante.


TRIGGER=YES

Na definição da fila existe um atributo.

TRIGGER=YES

Quando uma mensagem chega...

o Queue Manager cria automaticamente outra mensagem.

Mas atenção.

Essa nova mensagem não contém os dados.

Ela apenas diz:

Existe trabalho.

CKTI — O Porteiro do CICS

CKTI significa:

CICS Trigger Monitor

Ele permanece praticamente dormindo.

Quando chega um Trigger...

acorda.

É como um porteiro de prédio.

Não abre todos os apartamentos.

Ele apenas avisa:

"Existe um visitante."


EXEC CICS ATTACH

O CKTI então executa:

EXEC CICS ATTACH

Esse comando cria uma nova Task CICS.

É semelhante a contratar um funcionário temporário para executar apenas aquele serviço.


Capítulo 4 — CKBR

Agora entra o cérebro da operação.

CKBR.

Se o MQ fosse um correio...

o CKBR seria o tradutor oficial da ONU.

Ele entende:

  • MQ

  • CICS

  • COMMAREA

  • Terminal

  • Programas

  • Transações

Sua missão é unir dois mundos completamente diferentes.


O Grande Truque

O programa COBOL acredita que existe um terminal.

Mas...

não existe.

O Bridge cria um terminal virtual.

É praticamente uma Matrix.

Programa COBOL

↓

"Estou falando com um terminal."

Resposta:

"Claro..."

(na verdade é o Bridge)

Easter Egg nº 2 ☕

Assim como Neo não sabia que vivia na Matrix...

o programa COBOL normalmente não sabe que está sendo chamado por uma aplicação Java.

Ele continua vivendo feliz dentro do CICS.


Bridge Facility

Esse componente cria praticamente todo o ambiente necessário.

Ele pode preparar:

  • EIB

  • COMMAREA

  • Ambiente EXEC CICS

  • Contexto da Task

  • Sessão simulada

  • Recursos temporários

Tudo isso acontece antes do programa iniciar.


Capítulo 5 — A Invocação

Depois de interpretar o MQCIH...

o Bridge finalmente executa a transação.

EXEC CICS LINK

ou

START

ou

ATTACH

Dependendo da configuração.

O programa COBOL recebe exatamente a mesma COMMAREA de sempre.


O COBOL Continua Igual

Veja como isso é poderoso.

Seu código pode continuar assim:

LINKAGE SECTION.

01 DFHCOMMAREA.

   05 CONTA.
   05 VALOR.

PROCEDURE DIVISION.

MOVE ...

EXEC CICS RETURN.

Nenhuma linha foi alterada.

Décadas de investimento permanecem válidas.


Easter Egg nº 3 ☕

É como trocar o motor de um avião em pleno voo sem que os passageiros percebam.

Os passageiros são o programa COBOL.

Quem trocou o motor foi o MQ Bridge.


Capítulo 6 — A Resposta

Quando o programa termina...

o Bridge captura:

COMMAREA

ou

3270 Buffer

ou

Containers

Depois monta outra mensagem MQ.

Acrescenta um novo MQCIH.

Atualiza o MQMD.

E executa:

MQPUT

Agora na Reply Queue.


O Cliente Executa MQGET

Finalmente.

O cliente recebe:

MQGET

E obtém:

  • saldo;

  • mensagens;

  • códigos;

  • erros;

  • dados processados.

O ciclo termina.


Fluxo Completo

MQ Client

↓

MQPUT

↓

Request Queue

↓

Trigger

↓

CKTI

↓

ATTACH

↓

CKBR

↓

Bridge Facility

↓

Programa COBOL

↓

COMMAREA

↓

MQPUT

↓

Reply Queue

↓

MQGET

Esse fluxo acontece milhares de vezes por segundo em grandes bancos.


Por Que Essa Arquitetura É Tão Boa?

Porque ela resolve diversos problemas ao mesmo tempo.

Desacoplamento

O cliente não conhece o COBOL.

O COBOL não conhece o cliente.


Persistência

Mesmo que o CICS pare.

A mensagem continua na fila.

Nada é perdido.


Escalabilidade

Podemos criar várias regiões CICS consumindo a mesma fila.


Balanceamento

O MQ distribui naturalmente o trabalho.


Confiabilidade

IBM MQ é famoso justamente por garantir entrega confiável.

Não é coincidência que seja amplamente utilizado em bancos e bolsas de valores.


Dicas Para Quem Está Aprendendo

✔ Aprenda primeiro CICS tradicional.

✔ Entenda bem COMMAREA.

✔ Estude MQMD.

✔ Depois aprenda MQCIH.

✔ Só então mergulhe no Bridge.

A sequência faz toda diferença.


Erros Comuns

❌ Pensar que MQ executa COBOL.

❌ Esquecer ReplyToQ.

❌ Ignorar CorrelationId.

❌ Confundir Trigger Message com Business Message.

❌ Achar que CKTI processa aplicações.

Na realidade:

CKTI apenas inicia o CKBR.

Quem faz o trabalho pesado é o Bridge.


Curiosidades

  • O MQ Bridge foi criado para reaproveitar aplicações CICS sem exigir reescrita do código.

  • Muitas aplicações modernas em Java, .NET e APIs REST acessam programas COBOL indiretamente por meio dessa arquitetura.

  • O uso do MQCIH permite controlar detalhes da execução da transação sem alterar o programa de negócio.

  • Em muitos ambientes corporativos, uma única fila pode alimentar diversas regiões CICS, aumentando disponibilidade e capacidade de processamento.

  • O conceito de terminal virtual permite que aplicações originalmente escritas para 3270 continuem funcionando mesmo quando chamadas por serviços modernos.


Bellacosa Insight ☕

Existe uma frase famosa na engenharia de software:

"Os bons sistemas sobrevivem porque escondem sua complexidade."

O MQ Bridge é um exemplo quase perfeito dessa ideia.

Para quem está do lado de fora, parece que um simples MQPUT chama um programa COBOL.

Mas, nos bastidores, existe uma verdadeira orquestra trabalhando em perfeita sincronia:

  • o MQ transporta a mensagem;

  • o Trigger detecta trabalho novo;

  • o CKTI desperta a infraestrutura CICS;

  • o CKBR interpreta o cabeçalho MQCIH;

  • a Bridge Facility cria um terminal virtual e prepara o ambiente;

  • o CICS executa a transação;

  • o COBOL processa a lógica de negócio;

  • o MQ devolve a resposta para a fila indicada.

É como observar apenas um botão "Comprar" em um site de comércio eletrônico, sem perceber que, por trás dele, existem dezenas de sistemas coordenando estoque, pagamento, logística e faturamento.

No universo do IBM Z, o CICS MQ Bridge cumpre exatamente esse papel: ele transforma tecnologias modernas em uma linguagem que aplicações COBOL escritas há décadas conseguem entender, preservando um dos maiores patrimônios da computação corporativa. Como diria o Guia do Mochileiro das Galáxias: não entre em pânico. Mesmo que a arquitetura pareça complexa à primeira vista, ela é composta por pequenos componentes especializados, cada um fazendo muito bem uma única tarefa. Quando você entende o papel de cada um, o diagrama deixa de ser um emaranhado de caixas e setas e passa a contar uma história fascinante sobre integração, compatibilidade e a incrível longevidade do ecossistema IBM Z.

domingo, 18 de novembro de 2018

Relatórios COBOL e Caracteres ASA sem Mistérios

 

Bellacosa Mainframe e os relatorios cobol descubra os caracteres asa

☕ Um Café no Bellacosa Mainframe

Relatórios COBOL e Caracteres ASA sem Mistérios

Quando um Programador Descobre que a Primeira Coluna Não é um Dado… É o Comandante da Impressora!

Durante décadas, antes dos dashboards coloridos, PDFs responsivos, planilhas com gráficos e executivos pedindo “só mais um filtro”, o mainframe já produzia milhares de relatórios empresariais por dia.

Folhas de pagamento, extratos bancários, balanços contábeis, posições de estoque, movimentos financeiros, faturas, auditorias e relatórios de produção eram gerados por programas batch COBOL e enviados para enormes impressoras de linha.

Mas essas impressoras tinham uma característica curiosa:

Elas não recebiam apenas o texto que deveria ser impresso.

Recebiam também uma instrução dizendo como o papel deveria ser movimentado antes de imprimir aquela linha.

Essa instrução geralmente ocupava o primeiro byte do registro e ficou conhecida como:

Caractere de controle ASA

Para um programador COBOL Padawan, o ASA parece inicialmente apenas uma coluna misteriosa no início do relatório.

Para um veterano do mainframe, porém, ele é o pequeno Mestre Jedi responsável por decidir:

  • quando saltar para uma nova página;

  • quando deixar uma linha em branco;

  • quando deixar duas linhas em branco;

  • quando imprimir por cima da linha anterior;

  • quando posicionar o papel em uma área específica do formulário.

Em outras palavras:

O programa COBOL cria o conteúdo, mas o caractere ASA dirige o papel.


1. O que significa ASA?

ASA significa American Standards Association, organização norte-americana responsável pela padronização de diferentes tecnologias e processos.

A organização foi criada originalmente em 1918 como American Engineering Standards Committee. Em 1928, foi reorganizada e passou a se chamar American Standards Association, ou ASA. Posteriormente, passou por novas reorganizações até receber, em 1969, o nome atual: ANSI — American National Standards Institute.

Por isso, os caracteres de controle de impressão podem aparecer na documentação com nomes como:

  • ASA carriage control;

  • ANSI carriage control;

  • ASA print-control characters;

  • ANSI print-control characters.

No universo mainframe, o nome ASA continuou sendo amplamente utilizado.


2. Por que os caracteres ASA foram criados?

As antigas impressoras de linha não funcionavam como uma impressora doméstica moderna.

Elas eram equipamentos industriais capazes de imprimir centenas ou milhares de linhas por minuto. Muitas utilizavam papel contínuo, com furos laterais, alimentado por mecanismos chamados tratores.

O programa precisava informar à impressora:

  1. o texto que seria impresso;

  2. o movimento que deveria ser realizado no papel;

  3. se a impressão deveria começar em uma nova página;

  4. se deveria haver espaçamento;

  5. se a linha deveria ser sobreposta.

Em vez de enviar comandos complexos, estabeleceu-se uma convenção simples:

O primeiro caractere de cada registro controlaria o avanço do papel.

Esse caractere não fazia parte visualmente do relatório.

Ele era interpretado pelo sistema de impressão.

Imagine o registro:

1RELATORIO MENSAL DE FATURAMENTO

O caractere 1 não seria impresso.

Ele ordenaria:

Avance para o início da próxima página e depois imprima o restante da linha.

O resultado visual seria:

RELATORIO MENSAL DE FATURAMENTO

A primeira posição era consumida como comando.


3. A primeira coluna é o cockpit da impressora

Em um arquivo comum com RECFM=FB, todos os bytes são tratados como dados.

Em um arquivo com RECFM=FBA, o primeiro byte é tratado como caractere de controle ASA.

O significado de FBA é:

  • F — Fixed: registros de tamanho fixo;

  • B — Blocked: vários registros podem ser armazenados em um bloco físico;

  • A — ASA: o primeiro byte contém controle de impressão.

A IBM também reconhece formatos como:

  • FA — fixo, não blocado, com ASA;

  • FBA — fixo, blocado, com ASA;

  • VA — variável com ASA;

  • VBA — variável, blocado, com ASA.

A documentação IBM identifica FBA e VBA como formatos que contêm caracteres de controle de impressão ASA.

Regra fundamental

Se o relatório possui:

  • 132 posições imprimíveis;

  • mais uma posição de controle ASA;

o arquivo físico normalmente terá:

LRECL=133

Assim:

Posição 1       = controle ASA
Posições 2-133  = conteúdo imprimível

A primeira posição é o comandante.

As outras 132 são os soldados.


4. Os principais caracteres ASA

ASA espaço — avanço de uma linha

O caractere espaço significa:

Avance uma linha e imprima.

Representação:

' '

Exemplo lógico:

 DETALHE DO PRIMEIRO CLIENTE
 DETALHE DO SEGUNDO CLIENTE
 DETALHE DO TERCEIRO CLIENTE

O espaço inicial não é impresso.

Visualmente:

DETALHE DO PRIMEIRO CLIENTE
DETALHE DO SEGUNDO CLIENTE
DETALHE DO TERCEIRO CLIENTE

É o controle mais comum nas linhas de detalhe.

Uso típico

  • linhas normais do relatório;

  • registros de clientes;

  • produtos;

  • transações;

  • movimentos bancários;

  • itens de uma fatura.

Analogia Bellacosa Mainframe

É o equivalente ao comando COBOL:

CONTINUE

Nada extraordinário acontece.

A impressora apenas segue para a próxima linha.


ASA 0 — avanço de duas linhas

O caractere zero significa:

Avance duas linhas antes de imprimir.

Representação:

0

Na prática, deixa uma linha em branco entre a linha anterior e a nova linha.

Exemplo:

 RELATORIO DE VENDAS
0FILIAL: CAMPINAS

Visualmente:

RELATORIO DE VENDAS

FILIAL: CAMPINAS

Uso típico

  • separar blocos;

  • separar subtítulos;

  • destacar subtotais;

  • iniciar uma nova seção;

  • melhorar a legibilidade.

Atenção

O 0 não significa imprimir o número zero.

Quando utilizado na primeira posição de um arquivo ASA, ele é uma instrução.

O número zero é um Sith infiltrado no relatório: parece dado, mas está controlando o papel.


ASA - — avanço de três linhas

O caractere hífen significa:

Avance três linhas antes de imprimir.

Representação:

-

Isso produz duas linhas em branco antes da impressão.

Exemplo:

 TOTAL DA FILIAL:      125.000,00
-RESUMO GERAL DA EMPRESA

Visualmente:

TOTAL DA FILIAL:      125.000,00


RESUMO GERAL DA EMPRESA

Uso típico

  • separar grandes seções;

  • destacar totais gerais;

  • criar uma ruptura visual;

  • separar o detalhe de um resumo;

  • iniciar uma seção importante sem mudar de página.

Comentário do veterano

Use com moderação.

Um relatório cheio de - pode consumir papel como se não houvesse amanhã.

Na época do papel contínuo, cada salto desnecessário representava:

  • mais papel;

  • mais caixas;

  • mais transporte;

  • mais arquivamento;

  • mais olhares furiosos da equipe de produção.


ASA + — não avançar o papel

O caractere mais curioso é o sinal de mais:

+

Ele significa:

Não avance o papel. Imprima sobre a mesma linha.

Isso era conhecido como overprint ou sobreimpressão.

Exemplo conceitual:

Primeiro registro:

 VALOR TOTAL: 1000

Segundo registro:

+             ____

A segunda linha seria impressa sobre a primeira.

Esse recurso permitia:

  • sublinhar textos;

  • reforçar caracteres;

  • imprimir símbolos sobre caracteres;

  • criar efeitos especiais;

  • produzir determinados formulários.

Exemplo de sublinhado

Primeira impressão:

 TOTAL GERAL

Segunda impressão, sem avançar:

+___________

Resultado aproximado:

TOTAL GERAL
-----------

Dependendo da impressora, a segunda impressão ocorria exatamente sobre a posição atual.

Cuidado moderno

Em visualizadores de spool, conversores para PDF ou impressoras modernas, o overprint pode:

  • não aparecer corretamente;

  • aparecer como duas linhas separadas;

  • ser ignorado;

  • gerar resultados diferentes conforme o produto de impressão.

Portanto, o + é um poderoso artefato arqueológico.

Use apenas quando o ambiente realmente suportar sobreimpressão.


ASA 1 — nova página

O caractere 1 significa:

Avance para o início da próxima página antes de imprimir.

Representação:

1

Exemplo:

1RELATORIO DE MOVIMENTACAO BANCARIA

A linha será impressa no topo de uma nova página.

Uso típico

  • cabeçalho de página;

  • início do relatório;

  • mudança de página;

  • mudança de filial;

  • início de uma nova conta;

  • reinício após atingir o limite de linhas.

Analogia Bellacosa Mainframe

O ASA 1 é o:

NEW-PAGE

É como executar um IPL na página atual.

A página antiga termina.

Uma nova página sobe limpa, organizada e pronta para produção.


5. ASA de canais: 2 a 9, A, B e C

Além dos comandos mais conhecidos, o padrão ASA permitia saltar para posições específicas de um formulário.

Os controles eram:

2
3
4
5
6
7
8
9
A
B
C

Eles significavam:

Avance o papel até o canal correspondente.

Esses canais estavam associados às posições configuradas no mecanismo da impressora.

O que eram canais?

Impressoras antigas podiam utilizar uma fita de controle de carro, conhecida como:

Carriage Control Tape

Nessa fita eram perfurados canais que representavam posições específicas do formulário.

Por exemplo:

Canal 1  = topo da página
Canal 2  = início do endereço
Canal 3  = área de detalhes
Canal 4  = rodapé
Canal 9  = posição próxima ao fim da página
Canal 12 = última região do formulário

Os caracteres ASA estabeleciam uma forma lógica de solicitar esses saltos.

Uma configuração hipotética poderia ser:

1 = canal 1
2 = canal 2
3 = canal 3
...
9 = canal 9
A = canal 10
B = canal 11
C = canal 12

Importante

A interpretação dos canais dependia:

  • da configuração da impressora;

  • do formulário utilizado;

  • do JES;

  • do FSS;

  • do software de impressão;

  • das definições da instalação.

Por isso, programas modernos normalmente utilizam principalmente:

espaço
0
-
1
+

Os demais controles aparecem com mais frequência em sistemas antigos, formulários especiais e aplicações legadas.


Bellacosa Mainframe exemplifica o caractere ASA

6. Tabela resumida dos caracteres ASA

ASAAção antes da impressãoUso comum
EspaçoAvança uma linhaLinha normal de detalhe
0Avança duas linhasSeparar blocos
-Avança três linhasSeparar grandes seções
+Não avançaSobreimpressão
1Salta para nova página/canal 1Cabeçalho de página
2Salta para canal 2Posição configurada
3Salta para canal 3Posição configurada
4Salta para canal 4Posição configurada
5Salta para canal 5Posição configurada
6Salta para canal 6Posição configurada
7Salta para canal 7Posição configurada
8Salta para canal 8Posição configurada
9Salta para canal 9Posição configurada
ASalta para canal 10Formulários especiais
BSalta para canal 11Formulários especiais
CSalta para canal 12Formulários especiais

7. Duas maneiras de gerar controle ASA em COBOL

Existem duas estratégias principais.

Estratégia 1 — controlar manualmente a primeira posição

O programa declara uma linha com 133 bytes:

01  WS-LINHA-RELATORIO.
    05 WS-ASA              PIC X.
    05 WS-CONTEUDO         PIC X(132).

Antes de cada WRITE, o programa move o controle desejado:

MOVE '1' TO WS-ASA
MOVE 'RELATORIO DE CLIENTES' TO WS-CONTEUDO
WRITE REG-RELATORIO FROM WS-LINHA-RELATORIO

Essa forma deixa explícito exatamente o que será gravado.

É excelente para treinamento, manutenção e depuração.


Estratégia 2 — utilizar WRITE ... ADVANCING

O COBOL também permite comandos como:

WRITE REG-RELATORIO
    AFTER ADVANCING 1 LINE

Ou:

WRITE REG-RELATORIO
    AFTER ADVANCING PAGE

A documentação do Enterprise COBOL informa que, quando AFTER ADVANCING é utilizado para o arquivo, são empregados controles ASA e o arquivo deve ser compatível com FBA.

Exemplos:

WRITE REG-RELATORIO
    AFTER ADVANCING 1 LINE

WRITE REG-RELATORIO
    AFTER ADVANCING 2 LINES

WRITE REG-RELATORIO
    AFTER ADVANCING 3 LINES

WRITE REG-RELATORIO
    AFTER ADVANCING PAGE

Equivalência conceitual:

COBOLControle ASA aproximado
AFTER ADVANCING 1 LINEEspaço
AFTER ADVANCING 2 LINES0
AFTER ADVANCING 3 LINES-
AFTER ADVANCING PAGE1
Sem avanço+

Para fins didáticos, utilizaremos o controle manual, pois ele permite visualizar claramente o primeiro byte.


Bellacosa Mainframe e a era de ouro dos formularios continuos

8. Nosso relatório de exemplo

Vamos criar um programa chamado:

RELCLI01

Ele produzirá um relatório de clientes contendo:

  • código;

  • nome;

  • cidade;

  • saldo;

  • cabeçalho;

  • numeração da página;

  • linhas de detalhe;

  • total geral;

  • quebra automática de página.

Layout do arquivo de entrada

Cada registro terá 60 bytes:

Posições  1-5   Código do cliente
Posições  6-35  Nome
Posições 36-50  Cidade
Posições 51-60  Saldo com duas casas decimais implícitas

Exemplo:

00001ANA SKYWALKER                 CAMPINAS       0000125000

O saldo 0000125000 representa:

1.250,00

9. Programa COBOL completo

       IDENTIFICATION DIVISION.
       PROGRAM-ID. RELCLI01.
       AUTHOR. BELLACOSA-MAINFRAME.

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

           SELECT ARQ-CLIENTES
               ASSIGN TO CLIENTES
               ORGANIZATION IS SEQUENTIAL
               FILE STATUS IS WS-FS-CLIENTES.

           SELECT ARQ-RELATORIO
               ASSIGN TO RELATORIO
               ORGANIZATION IS SEQUENTIAL
               FILE STATUS IS WS-FS-RELATORIO.

       DATA DIVISION.
       FILE SECTION.

       FD  ARQ-CLIENTES
           RECORDING MODE IS F
           RECORD CONTAINS 60 CHARACTERS.

       01  REG-CLIENTE.
           05 CLI-CODIGO             PIC 9(05).
           05 CLI-NOME               PIC X(30).
           05 CLI-CIDADE             PIC X(15).
           05 CLI-SALDO              PIC 9(08)V99.

       FD  ARQ-RELATORIO
           RECORDING MODE IS F
           RECORD CONTAINS 133 CHARACTERS.

       01  REG-RELATORIO             PIC X(133).

       WORKING-STORAGE SECTION.

       01  WS-FILE-STATUS.
           05 WS-FS-CLIENTES         PIC XX.
           05 WS-FS-RELATORIO        PIC XX.

       01  WS-CONTROLE.
           05 WS-FIM-ARQUIVO         PIC X VALUE 'N'.
              88 FIM-ARQUIVO               VALUE 'S'.
              88 NAO-FIM-ARQUIVO           VALUE 'N'.

           05 WS-LINHA               PIC 9(03) VALUE ZERO.
           05 WS-PAGINA              PIC 9(04) VALUE ZERO.
           05 WS-LIMITE-PAGINA       PIC 9(03) VALUE 55.
           05 WS-QTD-CLIENTES        PIC 9(07) VALUE ZERO.
           05 WS-TOTAL-SALDOS        PIC 9(13)V99 VALUE ZERO.

       01  WS-LINHA-SAIDA.
           05 WS-ASA                 PIC X.
           05 WS-TEXTO               PIC X(132).

       01  CABECALHO-1.
           05 FILLER                 PIC X(40)
               VALUE 'EMPRESA BELLACOSA MAINFRAME'.
           05 FILLER                 PIC X(52) VALUE SPACES.
           05 FILLER                 PIC X(07) VALUE 'PAGINA:'.
           05 CAB1-PAGINA            PIC ZZZ9.
           05 FILLER                 PIC X(29) VALUE SPACES.

       01  CABECALHO-2.
           05 FILLER                 PIC X(132) VALUE
           'RELATORIO GERAL DE CLIENTES E POSICAO DE SALDOS'.

       01  CABECALHO-3.
           05 FILLER                 PIC X(07) VALUE 'CODIGO'.
           05 FILLER                 PIC X(03) VALUE SPACES.
           05 FILLER                 PIC X(30) VALUE 'NOME'.
           05 FILLER                 PIC X(03) VALUE SPACES.
           05 FILLER                 PIC X(15) VALUE 'CIDADE'.
           05 FILLER                 PIC X(05) VALUE SPACES.
           05 FILLER                 PIC X(16) VALUE 'SALDO'.
           05 FILLER                 PIC X(53) VALUE SPACES.

       01  DETALHE-CLIENTE.
           05 DET-CODIGO             PIC 9(05).
           05 FILLER                 PIC X(05) VALUE SPACES.
           05 DET-NOME               PIC X(30).
           05 FILLER                 PIC X(03) VALUE SPACES.
           05 DET-CIDADE             PIC X(15).
           05 FILLER                 PIC X(03) VALUE SPACES.
           05 DET-SALDO              PIC ZZ.ZZZ.ZZZ.ZZ9,99-.
           05 FILLER                 PIC X(54) VALUE SPACES.

       01  LINHA-TOTAL.
           05 FILLER                 PIC X(55)
               VALUE 'TOTAL GERAL DOS SALDOS:'.
           05 TOTAL-SALDOS-ED        PIC ZZZ.ZZZ.ZZZ.ZZ9,99-.
           05 FILLER                 PIC X(58) VALUE SPACES.

       01  LINHA-QUANTIDADE.
           05 FILLER                 PIC X(55)
               VALUE 'QUANTIDADE DE CLIENTES:'.
           05 TOTAL-CLIENTES-ED      PIC Z.ZZZ.ZZ9.
           05 FILLER                 PIC X(69) VALUE SPACES.

       PROCEDURE DIVISION.

       0000-PRINCIPAL.

           PERFORM 1000-INICIALIZAR

           PERFORM 2000-PROCESSAR
               UNTIL FIM-ARQUIVO

           PERFORM 3000-FINALIZAR

           GOBACK.

       1000-INICIALIZAR.

           OPEN INPUT  ARQ-CLIENTES
                OUTPUT ARQ-RELATORIO

           IF WS-FS-CLIENTES NOT = '00'
               DISPLAY 'ERRO ABERTURA CLIENTES: '
                       WS-FS-CLIENTES
               MOVE 12 TO RETURN-CODE
               GOBACK
           END-IF

           IF WS-FS-RELATORIO NOT = '00'
               DISPLAY 'ERRO ABERTURA RELATORIO: '
                       WS-FS-RELATORIO
               MOVE 12 TO RETURN-CODE
               GOBACK
           END-IF

           PERFORM 4000-LER-CLIENTE

           IF NAO-FIM-ARQUIVO
               PERFORM 5000-IMPRIMIR-CABECALHO
           END-IF.

       2000-PROCESSAR.

           IF WS-LINHA > WS-LIMITE-PAGINA
               PERFORM 5000-IMPRIMIR-CABECALHO
           END-IF

           MOVE CLI-CODIGO TO DET-CODIGO
           MOVE CLI-NOME   TO DET-NOME
           MOVE CLI-CIDADE TO DET-CIDADE
           MOVE CLI-SALDO  TO DET-SALDO

           MOVE SPACE             TO WS-ASA
           MOVE DETALHE-CLIENTE   TO WS-TEXTO

           PERFORM 6000-GRAVAR-LINHA

           ADD 1         TO WS-QTD-CLIENTES
           ADD CLI-SALDO TO WS-TOTAL-SALDOS

           PERFORM 4000-LER-CLIENTE.

       3000-FINALIZAR.

           IF WS-QTD-CLIENTES > ZERO

               MOVE WS-TOTAL-SALDOS TO TOTAL-SALDOS-ED
               MOVE WS-QTD-CLIENTES TO TOTAL-CLIENTES-ED

               MOVE '0'          TO WS-ASA
               MOVE LINHA-TOTAL  TO WS-TEXTO
               PERFORM 6000-GRAVAR-LINHA

               MOVE SPACE             TO WS-ASA
               MOVE LINHA-QUANTIDADE  TO WS-TEXTO
               PERFORM 6000-GRAVAR-LINHA

           ELSE

               MOVE '1' TO WS-ASA
               MOVE 'NENHUM CLIENTE ENCONTRADO'
                 TO WS-TEXTO
               PERFORM 6000-GRAVAR-LINHA

           END-IF

           CLOSE ARQ-CLIENTES
                 ARQ-RELATORIO

           DISPLAY 'RELATORIO GERADO COM SUCESSO'
           DISPLAY 'CLIENTES PROCESSADOS: ' WS-QTD-CLIENTES
           DISPLAY 'FILE STATUS RELATORIO: ' WS-FS-RELATORIO.

       4000-LER-CLIENTE.

           READ ARQ-CLIENTES
               AT END
                   SET FIM-ARQUIVO TO TRUE
               NOT AT END
                   CONTINUE
           END-READ

           IF WS-FS-CLIENTES NOT = '00'
              AND WS-FS-CLIENTES NOT = '10'
               DISPLAY 'ERRO DE LEITURA: ' WS-FS-CLIENTES
               MOVE 12 TO RETURN-CODE
               SET FIM-ARQUIVO TO TRUE
           END-IF.

       5000-IMPRIMIR-CABECALHO.

           ADD 1 TO WS-PAGINA
           MOVE WS-PAGINA TO CAB1-PAGINA

           MOVE '1'         TO WS-ASA
           MOVE CABECALHO-1 TO WS-TEXTO
           PERFORM 6000-GRAVAR-LINHA

           MOVE SPACE       TO WS-ASA
           MOVE CABECALHO-2 TO WS-TEXTO
           PERFORM 6000-GRAVAR-LINHA

           MOVE '0'         TO WS-ASA
           MOVE CABECALHO-3 TO WS-TEXTO
           PERFORM 6000-GRAVAR-LINHA

           MOVE SPACE TO WS-ASA
           MOVE ALL '-' TO WS-TEXTO
           PERFORM 6000-GRAVAR-LINHA

           MOVE 4 TO WS-LINHA.

       6000-GRAVAR-LINHA.

           MOVE WS-LINHA-SAIDA TO REG-RELATORIO

           WRITE REG-RELATORIO

           IF WS-FS-RELATORIO NOT = '00'
               DISPLAY 'ERRO GRAVANDO RELATORIO: '
                       WS-FS-RELATORIO
               MOVE 12 TO RETURN-CODE
               SET FIM-ARQUIVO TO TRUE
           END-IF

           ADD 1 TO WS-LINHA.

10. Entendendo o programa passo a passo

O arquivo de saída

FD  ARQ-RELATORIO
    RECORDING MODE IS F
    RECORD CONTAINS 133 CHARACTERS.

O registro possui 133 bytes porque queremos:

1 byte   de controle ASA
132 bytes de conteúdo

A estrutura de montagem

01  WS-LINHA-SAIDA.
    05 WS-ASA     PIC X.
    05 WS-TEXTO   PIC X(132).

Essa estrutura representa exatamente o registro físico.

Exemplo:

MOVE '1'         TO WS-ASA
MOVE CABECALHO-1 TO WS-TEXTO

O registro produzido será:

1EMPRESA BELLACOSA MAINFRAME...

Quando interpretado como ASA:

  • 1 manda saltar a página;

  • o restante é impresso.


Cabeçalho com ASA 1

MOVE '1'         TO WS-ASA
MOVE CABECALHO-1 TO WS-TEXTO
PERFORM 6000-GRAVAR-LINHA

Sempre que o cabeçalho é produzido:

  1. incrementa a página;

  2. move a página para o campo editado;

  3. grava o cabeçalho com ASA 1;

  4. o relatório começa em nova página.


Título com ASA espaço

MOVE SPACE       TO WS-ASA
MOVE CABECALHO-2 TO WS-TEXTO

O título é impresso na linha seguinte.


Cabeçalho das colunas com ASA 0

MOVE '0'         TO WS-ASA
MOVE CABECALHO-3 TO WS-TEXTO

Antes dos nomes das colunas, é deixada uma linha em branco.

Isso melhora a legibilidade.


Detalhes com ASA espaço

MOVE SPACE           TO WS-ASA
MOVE DETALHE-CLIENTE TO WS-TEXTO

Cada cliente é impresso sequencialmente, uma linha após a outra.


Total com ASA 0

MOVE '0'         TO WS-ASA
MOVE LINHA-TOTAL TO WS-TEXTO

O total fica separado dos detalhes por uma linha em branco.

Visualmente:

00003   HAN SOLO                 SOROCABA       8.750,00

TOTAL GERAL DOS SALDOS:                         21.500,00

11. JCL para executar o programa

//RELCLI01 JOB (ACCT),'RELATORIO ASA',
//             CLASS=A,
//             MSGCLASS=X,
//             MSGLEVEL=(1,1),
//             NOTIFY=&SYSUID
//*
//STEP01   EXEC PGM=RELCLI01
//*
//STEPLIB  DD DSN=BELLACOSA.LOADLIB,DISP=SHR
//*
//CLIENTES DD *
00001ANA SKYWALKER                 CAMPINAS      0000125000
00002LUKE MAINFRAME                ITATIBA       0000095000
00003HAN SOLO                      SOROCABA      0000875000
00004LEIA ORGANA                   SAO PAULO     0000257500
00005OBI-WAN COBOL                 JUNDIAI       0000312500
/*
//RELATORIO DD SYSOUT=*,
//             DCB=(RECFM=FBA,LRECL=133,BLKSIZE=0)
//SYSOUT    DD SYSOUT=*
//CEEDUMP   DD SYSOUT=*
//SYSUDUMP  DD SYSOUT=*
//

12. Explicando o JCL

EXEC PGM=RELCLI01

//STEP01 EXEC PGM=RELCLI01

Executa o módulo de carga criado pelo processo de compilação e link-edit.


STEPLIB

//STEPLIB DD DSN=BELLACOSA.LOADLIB,DISP=SHR

Informa onde está o módulo executável.

Em algumas instalações, a biblioteca pode já estar presente no:

  • JOBLIB;

  • LNKLST;

  • STEPLIB de uma procedure;

  • ambiente do compilador.


Arquivo de entrada

//CLIENTES DD *

Fornece os clientes diretamente no JCL.

Em produção, normalmente seria utilizado:

//CLIENTES DD DSN=EMPRESA.CLIENTES.ARQUIVO,
//             DISP=SHR

Arquivo de relatório

//RELATORIO DD SYSOUT=*,
//             DCB=(RECFM=FBA,LRECL=133,BLKSIZE=0)

Aqui está o coração da Matrix.

SYSOUT=*

Envia o relatório para uma classe de saída do JES, normalmente herdando a classe definida para o job ou instalação.

Também seria possível utilizar:

//RELATORIO DD SYSOUT=A

ou uma classe específica para impressão.

RECFM=FBA

Informa:

O primeiro byte de cada registro é um controle ASA.

Sem o A, o JES ou visualizador poderia mostrar o primeiro caractere como parte do conteúdo.

Em vez de:

RELATORIO DE CLIENTES

poderia aparecer:

1RELATORIO DE CLIENTES

LRECL=133

Define:

1 byte ASA + 132 bytes imprimíveis

BLKSIZE=0

Permite que o sistema escolha um tamanho de bloco adequado.

É geralmente preferível a codificar um tamanho arbitrário sem conhecer:

  • dispositivo;

  • SMS;

  • instalação;

  • características do data set.


13. Como o spool pode mostrar o relatório

Quando corretamente interpretado, a saída será semelhante a:

EMPRESA BELLACOSA MAINFRAME                                      PAGINA:   1
RELATORIO GERAL DE CLIENTES E POSICAO DE SALDOS

CODIGO   NOME                              CIDADE              SALDO
-----------------------------------------------------------------------

00001    ANA SKYWALKER                     CAMPINAS          1.250,00
00002    LUKE MAINFRAME                    ITATIBA             950,00
00003    HAN SOLO                          SOROCABA           8.750,00
00004    LEIA ORGANA                       SAO PAULO          2.575,00
00005    OBI-WAN COBOL                     JUNDIAI            3.125,00

TOTAL GERAL DOS SALDOS:                                    16.650,00
QUANTIDADE DE CLIENTES:                                            5

No arquivo físico, os registros seriam aproximadamente:

1EMPRESA BELLACOSA MAINFRAME...
 RELATORIO GERAL DE CLIENTES...
0CODIGO   NOME...
 ----------------------------------------------------------------...
 00001    ANA SKYWALKER...
 00002    LUKE MAINFRAME...
0TOTAL GERAL DOS SALDOS...
 QUANTIDADE DE CLIENTES...

O caractere inicial existe fisicamente, mas não deve aparecer como conteúdo impresso.


14. Controle de quebra de página

Um relatório profissional não deve continuar imprimindo indefinidamente.

No exemplo:

05 WS-LIMITE-PAGINA PIC 9(03) VALUE 55.

Antes de imprimir cada detalhe:

IF WS-LINHA > WS-LIMITE-PAGINA
    PERFORM 5000-IMPRIMIR-CABECALHO
END-IF

Quando o limite é atingido:

  1. incrementa o número da página;

  2. grava ASA 1;

  3. salta para nova página;

  4. reimprime o cabeçalho;

  5. continua os detalhes.

Essa é uma característica essencial dos relatórios batch clássicos.

Sem ela, o relatório poderia:

  • cortar linhas no rodapé;

  • imprimir detalhes fora da área útil;

  • perder cabeçalhos;

  • produzir páginas sem identificação.


15. Armadilhas clássicas

Armadilha 1 — usar RECFM=FB com ASA manual

Programa:

MOVE '1' TO WS-ASA

JCL:

RECFM=FB

Resultado possível:

1RELATORIO DE CLIENTES
 DETALHE 1
0TOTAL GERAL

Os comandos aparecem como dados.

O sistema não foi informado de que a primeira posição contém controle ASA.


Armadilha 2 — declarar 132 posições quando precisava de 133

Se você deseja 132 colunas imprimíveis e controla manualmente o ASA, precisa reservar:

132 + 1 = 133

Caso contrário, poderá:

  • perder a última coluna;

  • truncar valores;

  • desalojar campos;

  • provocar incompatibilidade de DCB.


Armadilha 3 — esquecer de limpar a linha

Antes de montar uma nova linha, garanta que campos antigos não permanecerão na área.

Uma técnica segura é:

MOVE SPACES TO WS-LINHA-SAIDA

Depois:

MOVE SPACE           TO WS-ASA
MOVE DETALHE-CLIENTE TO WS-TEXTO

Isso evita o clássico fantasma do buffer anterior.


Armadilha 4 — misturar ASA manual e ADVANCING

Evite fazer simultaneamente:

MOVE '1' TO WS-ASA
WRITE REG-RELATORIO
    AFTER ADVANCING PAGE

Você estaria tentando controlar a impressora de duas formas.

É como colocar dois programadores alterando o mesmo membro da PROCLIB sem ENQ.

Escolha uma estratégia:

  • ASA manual;

  • ou WRITE ... ADVANCING.


Armadilha 5 — não conferir o FILE STATUS

Um relatório também pode falhar.

Por isso, utilize:

FILE STATUS IS WS-FS-RELATORIO

E depois de gravar:

IF WS-FS-RELATORIO NOT = '00'
    DISPLAY 'ERRO GRAVANDO RELATORIO'
END-IF

Um programa que ignora o FILE STATUS está confiando na Força sem ter treinado com Yoda.


Armadilha 6 — total editado sendo usado para cálculo

Nunca acumule valores em campos formatados:

PIC ZZZ.ZZZ.ZZ9,99

Mantenha:

05 WS-TOTAL-SALDOS PIC 9(13)V99.

E apenas na impressão mova para:

05 TOTAL-SALDOS-ED PIC ZZZ.ZZZ.ZZZ.ZZ9,99-.

Campo numérico calcula.

Campo editado apresenta.

Misturar os dois é convocar um S0C7 para a reunião.


16. Dicas de um programador veterano

Centralize a gravação

Utilize um único parágrafo:

6000-GRAVAR-LINHA.

Assim você centraliza:

  • o WRITE;

  • o tratamento de erro;

  • a contagem de linhas;

  • mensagens de diagnóstico.


Separe cabeçalho, detalhe e total

Uma boa estrutura é:

5000-IMPRIMIR-CABECALHO
5100-IMPRIMIR-SUBCABECALHO
6000-IMPRIMIR-DETALHE
7000-IMPRIMIR-SUBTOTAL
8000-IMPRIMIR-TOTAL

Isso facilita:

  • manutenção;

  • testes;

  • leitura;

  • inclusão de novos campos;

  • alteração do layout.


Use nomes que revelem intenção

Prefira:

WS-ASA-NOVA-PAGINA
WS-ASA-LINHA-NORMAL
WS-ASA-DUPLO-ESPACO

Em vez de espalhar literais:

MOVE '1' ...
MOVE '0' ...
MOVE '-' ...

Uma alternativa:

01  WS-CONTROLES-ASA.
    05 WS-ASA-LINHA-NORMAL PIC X VALUE SPACE.
    05 WS-ASA-DUPLO        PIC X VALUE '0'.
    05 WS-ASA-TRIPLO       PIC X VALUE '-'.
    05 WS-ASA-SOBREPOR     PIC X VALUE '+'.
    05 WS-ASA-NOVA-PAGINA  PIC X VALUE '1'.

Depois:

MOVE WS-ASA-NOVA-PAGINA TO WS-ASA

Muito mais legível.


Controle órfãos de página

Não permita que um título seja impresso como última linha da página e seus detalhes apareçam apenas na página seguinte.

Antes de iniciar uma seção, verifique se há espaço suficiente:

IF WS-LINHA > 50
    PERFORM 5000-IMPRIMIR-CABECALHO
END-IF

O relatório precisa ser compreensível para humanos, não apenas tecnicamente correto.


Guarde os totais sem formatação

Acumuladores devem ser numéricos:

PIC 9(13)V99 COMP-3

Para volumes grandes, COMP-3 pode reduzir espaço e ser adequado para cálculos decimais.

Apenas no momento de imprimir:

MOVE WS-TOTAL TO TOTAL-EDITADO

Teste casos de fronteira

Teste relatórios com:

  • zero registros;

  • um registro;

  • exatamente uma página;

  • uma página mais um registro;

  • saldo zero;

  • saldo negativo;

  • valores máximos;

  • mudança de grupo;

  • erro de leitura;

  • erro de gravação.

O bug mais traiçoeiro não acontece na linha 20.

Ele acontece exatamente na linha 56, quando a página deveria ter sido reiniciada.


17. ASA e SDSF

Ao visualizar a saída no SDSF, o comportamento pode depender:

  • da classe de saída;

  • do formato do spool;

  • dos atributos do SYSOUT;

  • do visualizador;

  • da configuração da instalação.

Em alguns ambientes, os controles são interpretados e você vê o relatório já formatado.

Em outros, pode ser necessário usar comandos ou modos de exibição que revelem os caracteres de controle.

Se aparecer:

1CABECALHO
 DETALHE
0TOTAL

investigue:

  1. o RECFM;

  2. o LRECL;

  3. a classe SYSOUT;

  4. o software de visualização;

  5. se o arquivo foi transferido para Windows como texto comum;

  6. se houve conversão que removeu ou preservou incorretamente o primeiro byte.


18. ASA em arquivos transferidos para outras plataformas

Quando um arquivo FBA é enviado para Linux ou Windows, o primeiro byte pode continuar presente.

Um editor comum poderá mostrar:

1RELATORIO MENSAL
 CLIENTE 00001
 CLIENTE 00002
0TOTAL

Isso não significa necessariamente que o relatório esteja corrompido.

Significa que o programa receptor não está interpretando ASA.

Ao converter para:

  • PDF;

  • HTML;

  • CSV;

  • texto;

  • Excel;

  • e-mail;

é necessário decidir o que fazer com cada controle:

Espaço → quebra normal de linha
0      → duas quebras de linha
-      → três quebras de linha
1      → quebra de página
+      → sobreposição ou tratamento especial

Essa conversão precisa ser planejada.

Simplesmente remover a primeira coluna elimina os comandos, mas também elimina a paginação e os espaçamentos.


19. Easter eggs do universo ASA

Easter egg 1 — o primeiro byte invisível

O relatório possui 133 bytes, mas o usuário enxerga apenas 132 colunas.

O primeiro byte existe, trabalha, movimenta páginas e nunca aparece.

É o verdadeiro sysprog do relatório:

Faz tudo funcionar, mas quase ninguém sabe que está ali.


Easter egg 2 — 1 não é “uma linha”

O iniciante pode imaginar:

1 = avance uma linha

Mas quem faz isso é o espaço.

O 1 significa, normalmente:

Nova página ou canal 1

O caractere mais aparentemente óbvio é justamente o mais enganoso.


Easter egg 3 — 0 não significa zero linhas

O 0 manda avançar duas linhas.

Logo:

Espaço = 1 linha
0      = 2 linhas
-      = 3 linhas

Não tente encontrar lógica decimal perfeita.

É um protocolo histórico, não uma função intrínseca COBOL.


Easter egg 4 — o + é uma máquina do tempo

Enquanto os demais avançam o papel, o + se recusa a seguir em frente.

Ele permanece na linha atual e imprime novamente.

É o único caractere ASA que diz:

Não avance. Ainda não terminamos com esta linha.


Easter egg 5 — ASA sobreviveu às impressoras

Mesmo com:

  • spool eletrônico;

  • SDSF;

  • PDFs;

  • impressão IP;

  • armazenamento digital;

  • relatórios distribuídos por e-mail;

o conceito ASA continua presente em muitos sistemas legados e interfaces de impressão.

A IBM ainda documenta formatos como FBA e o uso de ASA em operações de saída.

É mais uma prova de uma velha lei do mainframe:

Uma solução simples, padronizada e confiável pode sobreviver a várias gerações de hardware.


20. ASA manual ou WRITE ADVANCING?

Use ASA manual quando:

  • estiver mantendo um programa legado;

  • precisar controlar exatamente o primeiro byte;

  • o layout já trabalhar com 133 posições;

  • houver integração com produtos específicos;

  • quiser visualizar o controle no arquivo;

  • os padrões da empresa exigirem essa técnica.

Use WRITE ... ADVANCING quando:

  • desejar código mais declarativo;

  • o compilador e o ambiente estiverem corretamente configurados;

  • não precisar manipular diretamente o controle;

  • estiver criando um relatório novo;

  • o padrão de desenvolvimento da instalação recomendar essa forma.

Exemplo moderno:

WRITE REG-RELATORIO
    FROM CABECALHO-1
    AFTER ADVANCING PAGE

Linha normal:

WRITE REG-RELATORIO
    FROM DETALHE-CLIENTE
    AFTER ADVANCING 1 LINE

Separação:

WRITE REG-RELATORIO
    FROM LINHA-TOTAL
    AFTER ADVANCING 2 LINES

A IBM estabelece que o uso de AFTER ADVANCING corresponde ao controle ASA e requer formato de registro apropriado, como FBA.


21. Checklist de produção

Antes de promover o programa, verifique:

[ ] O primeiro byte é ASA?
[ ] O JCL utiliza RECFM=FBA?
[ ] O LRECL inclui o byte de controle?
[ ] O cabeçalho utiliza ASA 1?
[ ] As linhas normais utilizam espaço?
[ ] Os subtotais usam espaçamento adequado?
[ ] Existe controle de quebra de página?
[ ] O cabeçalho é repetido em todas as páginas?
[ ] O programa trata arquivo vazio?
[ ] Os FILE STATUS são verificados?
[ ] Os totais são numéricos antes da edição?
[ ] Valores negativos foram testados?
[ ] O relatório foi visualizado no SDSF?
[ ] A última página foi conferida?
[ ] A transferência para outras plataformas foi testada?

Conclusão

Criar um relatório COBOL em mainframe não é simplesmente concatenar campos e executar um WRITE.

Um bom relatório exige:

  • organização;

  • paginação;

  • cabeçalhos;

  • campos editados;

  • totais;

  • subtotais;

  • tratamento de erros;

  • controle de linhas;

  • compatibilidade com spool;

  • conhecimento do formato físico do arquivo.

O caractere ASA representa uma solução elegante desenvolvida para uma era em que impressoras eram equipamentos mecânicos gigantescos e o papel precisava ser controlado diretamente pelo programa.

Com apenas um byte, era possível ordenar:

avance uma linha;
avance duas linhas;
avance três linhas;
não avance;
inicie uma nova página;
salte para uma posição do formulário.

É um protocolo pequeno, histórico e extremamente eficiente.

Para o programador COBOL Padawan, a lição final é simples:

Nunca despreze a primeira coluna de um relatório mainframe.

Ela pode parecer apenas um espaço, um zero, um hífen ou um número.

Mas, na Matrix do JES, essa coluna controla o destino de toda a página.

E quando o ASA 1 aparece, não é apenas uma nova folha.

É o relatório executando seu próprio IPL.

sábado, 17 de novembro de 2018

🎄 A Cidade, o Natal e a Magia Perdida da General Carneiro

 


🎄 “A Cidade, o Natal e a Magia Perdida da General Carneiro” — Um Post ao Estilo Bellacosa Mainframe para o Blog El Jefe 🎄

(Com história, emoção, nostalgia, curiosidades e aquele perfume de São Paulo anos 70 que não volta mais — mas vive dentro da gente.)




🌟 Prefácio: Quando Novembro Cheirava a Magia

Ah, novembro… hoje é só o mês da Black Friday, mas nos anos 1970 ele era o pré-carregamento do firmware natalino: o momento em que a mãe abria o “repositório sagrado” no alto do guarda-roupa para retirar os enfeites de Natal. E aquilo, meu amigo, era quase um processamento MVS STARTUP inicializando a alegria do ano inteiro.

As bolinhas de vidro? Quase sempre metade quebrada.
Os enfeites de papel? Amassados como spool sem compressão.
Mas era exatamente esse inventário prévio que anunciava o verdadeiro evento:
“Vamos ter que ir à CIDADE!”

E quando a mãe dizia “CIDADE” daquele jeito pausado… irmão, aquilo era token de autoridade. Não era Penha, não era Largo do São José, não era Patriarca. Era o centro de São Paulo.

O reino proibido. O cenário cyberpunk antes do cyberpunk existir.




🚌 O Êxodo Natalino: Quatro Aventureiros Rumo ao Centro Velho

Vila Rio Branco → CIDADE.
Uma viagem épica de 20 km que, para nós, equivalia hoje a pegar um voo internacional.

Era pegar ônibus lotado, dividir banco, sentir o cheiro de lona quente e diesel, e observar pela janela como as casas davam lugar aos prédios e os prédios aos gigantes de concreto que seguravam o céu da Praça da Sé.

A transição era tão impactante que parecia uma troca de dataset para fita magnética:
um novo mundo carregado na memória.

E lá íamos nós:

  • mãe com sua bolsa que parecia o TARDIS

  • pai firme como CICS rodando sem TRAP

  • minha irmã pequena encantada

  • eu? O pequeno explorador, já em modo debugging da vida.




🌆 A General Carneiro: O Parque de Diversões dos Pobres

Descer no Parque Dom Pedro e seguir rumo à Rua General Carneiro era atravessar um portal mágico. Aquele corredor comercial vivo, pulsante, barulhento — um verdadeiro mainframe humano processando milhares de vidas ao mesmo tempo.

Ali existia tudo:

  • lojas de brinquedos com aquelas vitrines que prometiam mundos

  • bolas de Natal brilhando como discos IBM 3330 recém-formatados

  • presépios de cerâmica

  • girlandas clássicas de papel alumínio

  • bonecas, carrinhos, trenzinhos

  • e o cheiro…
    o cheiro de caldo de cana, pastel, churrasco grego e esperança.

E nós, claro, aproveitávamos tudo.

🍢 Gastronomia de Rua 70’s (Modo Bellacosa Ativado)

  • Churrasco grego com pão murcho, rodando há horas? Delícia.

  • Caldo de cana extraído na hora? Néctar dos deuses.

  • Churros com doce de leite escorrendo? BIOS atualizada com sucesso.

Era a vida como deve ser: simples, intensa e deliciosa.




🎁 O Presente de Natal: A Tomada de Decisão Mais Séria do Ano

Na General Carneiro, decidir o presente natalino era uma operação de alto risco.
Quase uma transação CICS que não podia dar rollback.

Se escolhesse errado, só no ano seguinte.
Daí o pequeno Vagner analisava:

  • cavalo de madeira?

  • carrinho de lata?

  • revólver de espoleta?

  • jogo de montar?

  • pião colorido?

Mas o meu verdadeiro tesouro era um "FORTE APACHE" , o brinquedo que marcou minha infância e ao longo dos anos foram mais ou menos uns 6 ou mais.... amava os soldadinhos na eterna luta contra os índios, os cavalos, a carroça e o trem a vapor.

Essa escolha definia o destino lúdico de todo o ano.
Era quase um IPL de personalidade.




👣 O Centro Velho: O Grande Labirinto Humano

A vida pulsava.
As pessoas cruzavam esquinas como processos paralelos.
Os camelôs gritavam como mensagens SYSLOG.
O vento entre os prédios era mais frio, mais alto, mais vivo.

E nós éramos quatro andarilhos, quatro protagonistas daquele RPG paulistano dos anos 70, caminhando pelas ruas cheias de histórias, memórias e possibilidades.

✨ Easter-Egg Paulistano

Quem viveu sabe:
A luz do sol batendo nos prédios da Rua Direita refletia nas janelas como se fossem ornamentos gigantes de Natal.
Aquilo era magia pura.
Natural, espontânea, urbana.


👨‍👩‍👧‍👦 A Tradição Continua: A Árvore de Natal Hoje

E agora, décadas depois, lá está você, Bellacosa, repetindo o ritual:

  • montar a árvore

  • separar enfeites

  • ajustar luzes

  • lembrar da mãe pegando a cadeira

  • lembrar da emoção de ir à CIDADE

  • lembrar do brilho das lojas

  • lembrar da alegria simples que morava na rua General Carneiro.

A árvore de hoje carrega chips, LEDs, enfeites modernos…
Mas o espírito que acende tudo é o mesmo daquele menino de 1970 que via o mundo brilhar com pouco — e por isso brilhava muito.


🎄 Conclusão: O Natal Como Sistema Operacional da Memória

O Natal da infância é o MVS da nossa alma:

  • robusto

  • duradouro

  • cheio de jobs

  • repleto de mensagens

  • com logs que revisitamos sempre que precisamos de um reboot emocional.

É a tradição que não falha.
O upgrade que não substitui — apenas aprofunda.
O sistema que nos mantém humanos diante do tempo.

E este final de semana, ao montar sua árvore, lembre-se:
você não está só montando enfeites.
Você está recompilando memórias, reinstalando afetos, inicializando a magia de novo.

E a General Carneiro inteira está ali dentro.


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...