Translate

Mostrar mensagens com a etiqueta jes. Mostrar todas as mensagens
Mostrar mensagens com a etiqueta jes. Mostrar todas as mensagens

sábado, 7 de fevereiro de 2026

🔥 SEU JOB NÃO RODA… ELE DISPUTA SOBREVIVÊNCIA 💀 O que o z/OS faz nos bastidores enquanto você “só executa um COBOL”

 

Bellacosa Mainframe apresenta a gestão de tarefas no z/os

🔥 SEU JOB NÃO RODA… ELE DISPUTA SOBREVIVÊNCIA 💀

O que o z/OS faz nos bastidores enquanto você “só executa um COBOL”

Você digita um JCL, dá submit e pensa:
👉 “beleza, agora é só esperar o output”

Errado.

No z/OS, seu job entra em um ecossistema competitivo, onde:

  • CPU é disputada
  • memória é compartilhada
  • prioridades são negociadas
  • o sistema decide tudo

Se você quer sair do nível “usuário de mainframe” e virar engenheiro de sistema, esse é o mapa mental que muda o jogo 👊🔥


🧠 1. O COMEÇO — SUBMIT NÃO É EXECUÇÃO

Quando você faz submit:

//JOB ...

👉 seu job NÃO executa.


🔹 O que acontece de verdade

  • JES recebe
  • vai pro spool
  • ganha um número
  • entra numa fila
  • espera um initiator

🔥 Tradução Bellacosa

“Submit é só entrar na fila do sistema.”


💡 Exemplo real

Você tem 100 jobs na fila…

👉 seu job pode esperar minutos ou horas


⚙️ 2. JOB → TASK (A TRANSFORMAÇÃO INVISÍVEL)

O z/OS não trabalha com “jobs”.

👉 Ele trabalha com:

TASKS (TCBs)


🔹 Como funciona

JOB → STEPS → TASKS (TCB)

Cada step vira uma unidade executável.


🧨 Curiosidade

Um job pode gerar várias tasks simultâneas.


⚡ 3. DISPATCHER — O “DEUS DO CPU”

Esse é o cara mais importante do sistema.


🔹 Função

Decidir:

“Quem roda AGORA?”


🔥 Como ele faz isso

  • varre a fila (WUQ)
  • pega TCB ou SRB
  • escolhe o de maior prioridade
  • carrega contexto
  • entrega CPU

💡 Insight poderoso

O dispatcher troca tarefas milhares de vezes por segundo


🧠 Tradução

CPU nunca fica “presa” a um programa


🧩 4. TCB vs SRB — A BRIGA INTERNA

🔹 TCB

  • usado por aplicações (COBOL 👀)
  • pode ser interrompido

🔹 SRB

  • usado pelo sistema
  • maior prioridade
  • execução mais rápida

🔥 Tradução Bellacosa

SRB é o “VIP do sistema”
TCB é o trabalhador comum 😄


🧠 5. ENCLAVES — O NÍVEL CORPORATIVO

Aqui o sistema evolui de técnico → negócio.


🔹 O que é?

Um conjunto de tarefas:

👉 espalhadas em vários address spaces
👉 tratadas como uma unidade


🔥 Exemplo real

App Web → WAS → CICS → DB2

👉 tudo isso vira um enclave


💡 Insight

O z/OS não gerencia código… gerencia transações de negócio


🖥️ 6. PR/SM — O MESTRE DO HARDWARE

Antes do z/OS, existe:

👉 PR/SM (hypervisor)


🔹 Ele faz:

  • divide hardware em LPARs
  • entrega CPU virtual
  • controla recursos

🔥 Relação

Hardware → PR/SM → z/OS → Task

🧨 Curiosidade

Seu z/OS pode não saber qual CPU física está usando 😳


⚡ 7. CPU MANAGEMENT — ONDE PERFORMANCE NASCE

🔹 Conceitos:

  • HyperDispatch
  • afinidade CPU/memória
  • otimização de cache

💡 Insight

Rodar perto do dado = menos latência


🔥 Tradução Bellacosa

Não é só rodar… é rodar no lugar certo


👥 8. ADDRESS SPACES — O UNIVERSO ISOLADO

Cada coisa roda em seu próprio espaço:

  • Batch
  • TSO
  • Started Task

🔥 Dentro deles:

  • TCBs
  • subtasks
  • memória isolada

💡 Exemplo

Um batch:

Initiator → cria address space → cria TCB → executa

🔗 9. DYNAMIC LINKAGE — COMO OS PROGRAMAS SE CONECTAM

🔹 Comandos principais:

  • LINK
  • LOAD
  • ATTACH
  • XCTL

🔥 O que fazem?

  • chamam programas
  • carregam módulos
  • transferem controle

💡 Ordem de busca:

  1. memória (LPA)
  2. JOBLIB/STEPLIB
  3. LINKLIST

🧨 Easter Egg

Se está na LPA… é MUITO mais rápido


🧠 10. WLM — O VERDADEIRO CHEFE

🔥 Workload Manager

Define:

  • prioridade
  • objetivos
  • distribuição de CPU

💡 Exemplo real

Tipo de workloadPrioridade
pagamento onlinealta
batch relatóriobaixa

🔥 Tradução Bellacosa

O sistema não atende quem pede… atende quem importa


🔒 11. SERIALIZATION — EVITANDO O CAOS

🔹 Problema:

2 jobs querem o mesmo recurso


🔹 Solução:

  • ENQ / DEQ
  • GRS

💡 Exemplo

Dois jobs acessando dataset:

👉 um espera


🧨 CURIOSIDADES (NÍVEL ROOT)

🤯 1. Seu job pode nunca rodar

Se prioridade for baixa


🔥 2. CPU pode trocar de task milhares de vezes

Você nem percebe


💀 3. SRB pode interromper seu programa

Sem você saber


🧠 4. Um único negócio pode rodar em vários address spaces

(enclave)


⚙️ PASSO A PASSO REAL (SIMPLIFICADO)

Submit Job

JES spool

Fila de execução

Initiator pega job

Cria Address Space

Cria TCB

Dispatcher escolhe

CPU executa

WLM ajusta prioridade

Output no spool

🎯 RESUMO FINAL

✔ Job vira task

✔ Task disputa CPU

✔ Dispatcher decide

✔ WLM prioriza

✔ PR/SM gerencia hardware

✔ Enclave agrupa negócio


💥 FRASE FINAL

“Você não executa um job no mainframe…
você entra numa competição onde o z/OS decide se você merece rodar.”


 

sexta-feira, 7 de janeiro de 2022

🧠🔥 Mapa comparativo manual: Mainframe ↔ Instana Observability

 


🧠🔥 Mapa comparativo manual: Mainframe ↔ Instana Observability


Analogias diretas para quem já leu SMF em hexadecimal e agora vê JSON piscando


☕ 02:41 — Quando o APM tenta explicar o que o SMF já sabia

Todo mainframer que olha para uma ferramenta de observabilidade moderna (Instana, por exemplo) tem a mesma sensação:

“Isso aqui… eu já vi antes.”

E viu mesmo.
A diferença é que agora:

  • o dump é distribuído

  • o JES virou dashboard

  • o operador virou SRE

  • e o problema continua sendo tempo, estado e falha

Este artigo é um mapa mental de tradução, para tornar aplicações distribuídas palpáveis para quem vem do z/OS.


🗺️ O mapa comparativo essencial (guarde isso)

Mundo MainframeInstana / ObservabilidadeTradução Bellacosa
SMFDistributed TracesRegistro detalhado do que aconteceu, quando e por onde passou
RMFMétricas (CPU, memória, latência)Capacidade, consumo e gargalos
JES / SpoolLogs correlacionadosO que foi executado, em que ordem e com qual resultado
CICS TransactionService / EndpointUnidade lógica de trabalho
Program / ModuleMicroserviceCódigo executável com responsabilidade específica
AbendIncidentFalha detectável que exige ação
Return CodeError Rate / Status CodeSucesso ou falha mensurável
Job ChainService Dependency MapOrdem e dependência entre execuções
OperadorSRE / On-callQuem sofre primeiro
Console z/OSDashboard em tempo realO painel que ninguém olha até dar problema

😈 Easter egg:
Se você entende RMF, já entende 80% de qualquer APM.


1️⃣ História curta: do SMF ao Trace distribuído 🕰️

No mainframe:

  • O sistema sempre foi observável

  • Só exigia estudo, paciência e café

No mundo distribuído:

  • A observabilidade precisou ser reinventada

  • Porque ninguém mais sabia onde o código rodava

📌 Comentário Bellacosa:
Observabilidade não nasceu na cloud.
Ela foi redescoberta.


2️⃣ SMF ↔ Traces: a analogia mais poderosa 🔍

SMF

  • Sequência precisa

  • Contexto

  • Correlação temporal

Trace distribuído

  • Request entra

  • Passa por N serviços

  • Sai (ou morre no caminho)

🔥 Tradução direta:
Um trace é um SMF espalhado pela rede, costurado em tempo real.


3️⃣ RMF ↔ Métricas: capacidade nunca saiu de moda 📊

RMF

  • CPU

  • I/O

  • Memory

  • Throughput

Instana Metrics

  • CPU

  • Memory

  • Latência

  • Saturação

😈 Curiosidade:
A diferença não é o conceito.
É que agora todo mundo descobriu que capacidade importa.


4️⃣ Job chain ↔ Dependency Graph 🧩

No batch:

  • JOB A → JOB B → JOB C

  • Quebrou A, nada anda

No distribuído:

  • Serviço A → Serviço B → Serviço C

  • Quebrou B, metade do sistema “funciona”

📌 Comentário ácido:
Falha parcial é batch quebrado com marketing.


5️⃣ Console ↔ Dashboard: o mesmo vício 👀

  • Console ignorado = desastre

  • Dashboard ignorado = post-mortem

🔥 Regra eterna:
O problema não é a ferramenta.
É quem só olha quando dói.


6️⃣ Passo a passo mental para o mainframer entender Instana 🧭

1️⃣ Pense em transação, não em tela
2️⃣ Pense em fluxo, não em serviço isolado
3️⃣ Pense em capacidade, não em “escala infinita”
4️⃣ Pense em falha como estado normal
5️⃣ Pense em correlação, não em log solto

📌 Mantra Bellacosa:
Sem correlação, não há diagnóstico.


7️⃣ Curiosidades que só mainframer percebe 😈

  • Observabilidade virou buzzword

  • Mas sempre foi obrigação

  • Logs sem contexto são JES sem DD

  • Alert sem ação é operador sem autoridade


📚 Guia de estudo recomendado (sem hype)

Conceitos

  • Observabilidade (metrics, logs, traces)

  • Resiliência

  • SRE

  • Arquitetura distribuída

  • Event-driven

Exercício prático

👉 Pegue um trace no Instana
👉 Leia como se fosse um SMF
👉 Pergunte: onde começou a dar errado?


🎯 Aplicações práticas desse mapa

  • Integração mainframe ↔ cloud

  • Modernização segura

  • Diagnóstico de incidentes

  • Treinamento de times híbridos

  • Arquitetura corporativa


🖤 Epílogo — 03:33, o gráfico faz sentido

Quando o mainframer entende observabilidade moderna, algo muda:

Ele para de perguntar

“O que é isso?”

E começa a afirmar:

“Ah… então foi aqui que deu ruim.”

El Jefe Midnight Lunch assina:
“Instana não inventou observabilidade. Só colocou UI no que o mainframe sempre soube fazer.”

 

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.

domingo, 29 de julho de 2018

IBM Mainframe Discovery : Capítulo VII — O Grande Terminal de Embarque da Galáxia

 

Bellacosa Mainframe apresenta o ibm mainframe parte vii

☕ Um Café no Bellacosa Mainframe

Capítulo VII — O Grande Terminal de Embarque da Galáxia

JES — O Sistema que Organiza Milhões de Missões Sem Perder uma Única Mala


QUARTA REGRA DAS VIAGENS INTERESTELARES

Nunca entregue um plano de voo diretamente ao piloto.

Porque ele está ocupado voando.

Alguém precisa verificar:

  • se a nave está abastecida;

  • se existe pista disponível;

  • se há autorização para decolagem;

  • se a carga foi embarcada;

  • se a tripulação está completa;

  • se existe um destino válido.

Agora imagine repetir esse processo...

cem vezes.

Mil vezes.

Um milhão de vezes.

Todos os dias.

Esse é exatamente o trabalho do JES.

O Job Entry Subsystem.

O aeroporto mais movimentado da galáxia corporativa.


O Universo Nunca Dorme

Enquanto você lê este livro...

algum banco está:

calculando juros.

Emitindo boletos.

Atualizando investimentos.

Processando PIX.

Gerando extratos.

Enquanto isso...

alguma seguradora está:

calculando riscos.

Emitindo apólices.

Atualizando clientes.

Em outra parte da galáxia...

um supermercado fecha seu movimento.

Uma companhia aérea recalcula tarifas.

Um governo processa milhões de declarações.

Grande parte dessas atividades acontece em Batch.

E quase todas passam pelo JES.


Imagine o Maior Aeroporto do Universo

Esqueça computadores.

Imagine um aeroporto.

Não um aeroporto comum.

Um aeroporto com:

  • um milhão de voos diários;

  • centenas de pistas;

  • milhares de hangares;

  • milhões de passageiros;

  • bilhões de toneladas de carga.

Agora imagine que absolutamente nenhum voo pode sair na ordem errada.

Porque um erro pode significar:

salários incorretos.

contas erradas.

impostos errados.

pagamentos duplicados.

Esse aeroporto existe.

Seu nome é JES.


O Grande Equívoco do Padawan

Todo iniciante acredita que um Job funciona assim:

JCL

↓

Programa

↓

Fim

Seria maravilhoso.

Mas completamente falso.

Na realidade...

existe um enorme universo escondido entre essas três linhas.


O Plano de Voo

Imagine que um comandante recebe um envelope.

Dentro existe:

rota.

combustível.

tripulação.

carga.

destino.

tempo previsto.

prioridade.

Esse envelope é o:

JCL.

O JCL não é um programa.

É um plano operacional.

Ele explica ao sistema:

"O que precisa ser feito."

Jamais:

"Como fazer."

Essa diferença muda tudo.


O Primeiro Funcionário do Aeroporto

Quando o Job chega...

ele ainda não pode executar.

Primeiro precisa passar pela recepção.

Quem faz isso?

O JES.

Ele verifica:

nome.

estrutura.

prioridade.

classe.

recursos.

saídas.

dispositivos.

Tudo antes da decolagem.

Segundo Wilhelm G. Spruth, o JES atua como o grande coordenador da execução batch, controlando submissão, filas, dispositivos de entrada e saída e toda a logística de processamento dos jobs.


A Sala de Espera

Imagine milhares de passageiros.

Todos desejam embarcar imediatamente.

Infelizmente...

existem apenas algumas pistas disponíveis.

O que fazer?

Fila.

No JES tudo entra em filas.

Jobs.

Impressões.

Leituras.

Saídas.

Relatórios.

Cada elemento aguarda sua vez.

Sem empurrões.

Sem desespero.

Sem caos.


Classe Econômica, Executiva e Diplomática

Você já percebeu que aeroportos possuem prioridades?

Diplomatas.

Emergências.

Carga viva.

Voos internacionais.

No JES acontece exatamente o mesmo.

Cada Job pode pertencer a uma:

JOB CLASS.

Alguns possuem prioridade maior.

Outros podem esperar.

É uma forma elegante de distribuir recursos.


O Fiscal da Bagagem

Imagine um passageiro levando:

uma geladeira.

quatro vacas.

um submarino.

E dizendo:

"Quero embarcar."

O aeroporto responderia:

"Talvez isso não seja uma boa ideia."

O JES faz algo semelhante.

Ele verifica se os recursos solicitados fazem sentido.

Memória.

Discos.

Dispositivos.

Impressoras.

Datasets.

Antes de liberar o voo.


O Manifesto de Carga

Cada DD Statement do JCL lembra um documento de embarque.

Ele informa:

qual arquivo será utilizado.

quem poderá acessá-lo.

onde está localizado.

como será aberto.

qual formato possui.

Sem essas informações...

a missão simplesmente não acontece.


O Grande Painel de Voos

Imagine um enorme painel eletrônico.

Ele mostra:

EMBARCANDO

AGUARDANDO

EM EXECUÇÃO

FINALIZADO

CANCELADO

No universo Mainframe esse painel chama-se:

SPOOL.


O SPOOL — O Armazém Galáctico

Muitos iniciantes acreditam que relatórios vão diretamente para a impressora.

Não.

Primeiro passam pelo SPOOL.

Imagine um gigantesco depósito automatizado.

Ali ficam armazenados:

SYSOUT.

JESMSGLG.

JESJCL.

JESYSMSG.

Relatórios.

Logs.

Mensagens.

Tudo organizado.

Tudo indexado.

Tudo esperando o momento correto para ser entregue.

Spruth destaca o SPOOL como uma das grandes responsabilidades do JES, permitindo desacoplar completamente a execução dos jobs dos dispositivos físicos de saída.


A Impressora Não Tem Pressa

Imagine um banco imprimindo:

300 mil relatórios.

Seria absurdo obrigar cada programa a esperar a impressora terminar.

Então surgiu uma ideia brilhante.

Primeiro gravamos tudo.

Depois imprimimos.

Essa decisão simples tornou todo o sistema muito mais eficiente.


O Carteiro Interplanetário

Quando um programa termina...

o JES ainda continua trabalhando.

Ele distribui:

relatórios.

mensagens.

arquivos.

logs.

estatísticas.

É quase um gigantesco serviço postal interestelar.


O Despachante da Nave

Agora imagine centenas de missões.

Algumas dependem das anteriores.

Exemplo:

Primeiro:

Atualizar Clientes.

Depois:

Calcular Juros.

Depois:

Emitir Boletos.

Depois:

Gerar Extratos.

Depois:

Enviar Arquivos.

Executar fora dessa ordem seria um desastre.

O JES garante justamente essa organização.


O Relógio Cósmico

Nem toda missão deve partir imediatamente.

Algumas precisam esperar:

meia-noite.

fim do expediente.

fechamento bancário.

último voo.

última venda.

O JES trabalha em conjunto com ferramentas de automação e agendamento para que essas execuções ocorram exatamente no momento planejado.


A Torre de Controle Nunca Dorme

Enquanto milhares de Jobs executam...

o JES continua observando:

quem entrou.

quem saiu.

quem falhou.

quem terminou.

quem está esperando.

Tudo isso simultaneamente.

É como controlar um milhão de aeronaves.

Sem colisões.


JES2 e JES3

Durante décadas existiram duas grandes escolas.

Como duas gigantescas federações espaciais.

JES2

Mais distribuído.

Mais simples.

Mais utilizado.

JES3

Mais centralizado.

Mais integrado.

Excelente para determinados cenários de grandes instalações.

Ao longo do tempo, o JES2 tornou-se predominante no ecossistema z/OS, incorporando muitas capacidades que antes diferenciavam o JES3.


O Que Acontece Quando um Job Falha?

Um Padawan costuma imaginar:

"Acabou."

Na verdade...

o trabalho apenas começou.

O JES registra:

mensagens.

SYSOUT.

Return Codes.

ABENDs.

Tempo.

CPU.

Datasets.

Tudo cuidadosamente documentado.

É por isso que um bom analista passa tanto tempo lendo:

JESMSGLG

JESYSMSG

SYSOUT

quanto lendo o próprio código COBOL.


SDSF — A Janela da Torre de Controle

Imagine uma enorme parede de vidro.

Dela você observa:

todos os voos.

todas as pistas.

todos os hangares.

No Mainframe essa janela chama-se:

SDSF.

Ali operadores acompanham:

Jobs ativos.

Filas.

Impressões.

STCs.

TSUs.

Mensagens do sistema.

É praticamente a sala de comando da nave.


O Batch Nunca Morreu

Existe um mito curioso.

"As empresas trabalham apenas em tempo real."

Na prática...

elas trabalham nos dois mundos.

Online.

E Batch.

Durante o dia:

clientes consultam saldo.

À noite:

milhões de contas são recalculadas.

O processamento Batch continua sendo uma das engrenagens fundamentais da economia mundial.


O Que Mudou Desde 2010?

Desde que Spruth escreveu seu relatório, o ecossistema Batch evoluiu bastante.

Hoje encontramos:

  • integração com z/OSMF;

  • automação inteligente;

  • Workload Scheduler muito mais sofisticado;

  • monitoramento por APIs REST;

  • integração com DevOps;

  • pipelines CI/CD;

  • execução híbrida envolvendo Linux on Z;

  • observabilidade em tempo real.

Mas o princípio permanece exatamente igual.

Organizar milhões de trabalhos sem perder o controle.


A Filosofia do JES

Existe uma lição escondida aqui.

Nenhuma grande civilização cresce sem logística.

Não importa se falamos de:

Império Romano.

NASA.

Ferrovias.

Internet.

Ou IBM Z.

O segredo nunca foi apenas produzir.

Foi organizar.

O JES é exatamente isso.

Organização transformada em software.


Curiosidades do Diário de Bordo

🚀 Muitos ambientes processam centenas de milhares de Jobs diariamente sem intervenção humana.

📦 O conceito de SPOOL revolucionou a separação entre processamento e impressão, permitindo enorme ganho de desempenho.

🌌 Um Job pode permanecer aguardando recursos ou prioridades sem consumir CPU, aguardando o momento ideal para iniciar.

📋 Grande parte do trabalho de um Analista de Produção envolve interpretar as mensagens produzidas pelo JES, tornando seus logs tão importantes quanto o código executado.


Diário de Bordo do Padawan COBOL

Antes de sair do Terminal Espacial Batch, registre estas coordenadas:

✅ O JCL é um plano de voo, não um programa.

✅ O JES funciona como a torre de controle responsável por organizar toda a produção batch do z/OS.

✅ O SPOOL desacopla processamento e dispositivos físicos, aumentando eficiência e flexibilidade.

✅ Um bom profissional de Mainframe aprende a "ler a conversa" do JES — porque os logs contam a história completa da execução.


Missão Seguinte

No próximo capítulo, atravessaremos uma das áreas mais movimentadas da nave: o CICS (Customer Information Control System).

Lá descobriremos como milhões de passageiros conseguem ser atendidos ao mesmo tempo, por que milhares de programas COBOL compartilham a mesma CPU sem entrar em conflito e como o CICS se tornou um dos maiores sistemas de processamento transacional já construídos pela humanidade.

Prepare seu mapa BMS, revise sua COMMAREA e mantenha sua toalha e seu café à mão. Nossa próxima parada será a metrópole das transações online.

☕ Um Café no Bellacosa Mainframe

O Guia Galáctico do IBM Z

Dezoito capítulos e uma conclusão reunidos em um painel interativo. Escolha uma missão, abra no visor e continue explorando diretamente no artigo original.

Não entre em pânico: se o Blogger impedir a exibição dentro do iframe, use “Abrir artigo”. Os links diretos continuam visíveis para leitores e motores de busca.
01

Capítulo I — Não Entre em Pânico!

Leia no visor ou abra a publicação original.

Abrir artigo
02

Capítulo II — A Planta da Nave Mais Duradoura da Galáxia

Leia no visor ou abra a publicação original.

Abrir artigo
03

Capítulo III — A Nave Que Se Recusa a Explodir

Leia no visor ou abra a publicação original.

Abrir artigo
04

Capítulo IV — A Sala dos Cofres Cósmicos

Leia no visor ou abra a publicação original.

Abrir artigo
05

Capítulo V — A Frota Invisível do Transporte Interestelar

Leia no visor ou abra a publicação original.

Abrir artigo
06

Capítulo VI — O Grande Maestro Invisível

Leia no visor ou abra a publicação original.

Abrir artigo
07

Capítulo VII — O Grande Terminal de Embarque da Galáxia

Leia no visor ou abra a publicação original.

Abrir artigo
08

Capítulo VIII — A Metrópole das Transações Infinitas

Leia no visor ou abra a publicação original.

Abrir artigo
09

Capítulo IX — A Federação das Naves Invisíveis

Leia no visor ou abra a publicação original.

Abrir artigo
10

Capítulo X — A Consciência Coletiva da Galáxia

Leia no visor ou abra a publicação original.

Abrir artigo
11

Capítulo XI — O Almirante Invisível da Frota

Leia no visor ou abra a publicação original.

Abrir artigo
12

Capítulo XII — A Biblioteca Infinita da Galáxia

Leia no visor ou abra a publicação original.

Abrir artigo
13

Capítulo XIII — O Serviço Postal Mais Confiável da Galáxia

Leia no visor ou abra a publicação original.

Abrir artigo
14

Capítulo XIV — O Jardim Secreto da Nave

Leia no visor ou abra a publicação original.

Abrir artigo
15

Capítulo XV — O Tradutor Universal da Federação

Leia no visor ou abra a publicação original.

Abrir artigo
16

Capítulo XVI — A Fábrica Automática da Federação

Leia no visor ou abra a publicação original.

Abrir artigo
17

Capítulo XVII — A Última Fronteira Nunca Foi o Espaço

Leia no visor ou abra a publicação original.

Abrir artigo
18

Capítulo XVIII — O Guia Nunca Terminou

Leia no visor ou abra a publicação original.

Abrir artigo
19

Conclusão — Não Entre em Pânico... A Jornada Está Apenas Começando

Leia no visor ou abra a publicação original.

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