Mostrar mensagens com a etiqueta IBM Mainframe. Mostrar todas as mensagens
Mostrar mensagens com a etiqueta IBM Mainframe. Mostrar todas as mensagens

segunda-feira, 2 de março de 2026

☕ “CALL ‘SABEDORIA’ USING PADAWAN” — O Guia Definitivo de Subprogramação COBOL Que Separa Aprendizes de Mestres do Mainframe

 

Bellacosa Mainframe exemplifica call no Cobol

☕ “CALL ‘SABEDORIA’ USING PADAWAN” — O Guia Definitivo de Subprogramação COBOL Que Separa Aprendizes de Mestres do Mainframe

Se você acha que subprogramação em COBOL é só “CALL e pronto”… prepare-se.
Você está prestes a atravessar a porta que leva do programador de exercícios para o engenheiro de sistemas que mantém bancos funcionando 💎

Neste artigo, vou falar com você — jovem Padawan do mainframe — no melhor estilo Bellacosa: direto, prático, cheio de contexto real, curiosidades históricas e aquelas “armadilhas invisíveis” que só aparecem em produção às 3h da manhã.

Pegue seu café ☕. Vamos lá.


🧠 Por que subprogramação é o coração do COBOL?

Grandes sistemas COBOL NÃO são programas gigantes.

Eles são:

👉 Redes de módulos especializados
👉 Bibliotecas corporativas compartilhadas
👉 Camadas de negócio reutilizáveis
👉 Serviços internos antes da palavra “microservice” existir

Um sistema bancário típico executa milhares de subprogramas por segundo.


🧩 O que é um Subprograma, afinal?

Um subprograma é um programa COBOL independente que:

✔ Pode ser chamado por outro
✔ Executa uma tarefa específica
✔ Recebe dados
✔ Retorna resultados
✔ Continua existindo sozinho

Em termos modernos:

É como uma função gigante com superpoderes de desempenho.


📞 O ritual sagrado: CALL

Programa principal (Caller)

CALL "CALCJURO" USING WS-VALOR WS-RESULT

Subprograma (Callee)

LINKAGE SECTION.
01 VALOR PIC 9(7)V99.
01 RESULT PIC 9(7)V99.

PROCEDURE DIVISION USING VALOR RESULT.
COMPUTE RESULT = VALOR * 1.05
GOBACK.

💥 Pronto. Comunicação entre programas.


🔗 Easter Egg #1 — COBOL já fazia “APIs internas” nos anos 70

Antes de REST, SOAP, gRPC…

Mainframes já tinham bibliotecas de serviços corporativos reutilizáveis.


📦 O segredo oculto: LINKAGE SECTION

Padawan, grave isto na pedra:

Sem LINKAGE SECTION, não há parâmetros.

Ela define a interface do subprograma — o “contrato”.


🔄 Como os dados são passados?

🔹 BY REFERENCE (padrão)

👉 Mesma área de memória
👉 Alterações retornam

CALL "PGM" USING WS-DATA

💎 Rápido, eficiente, poderoso… e perigoso.


🔹 BY CONTENT

👉 Cópia do valor
👉 Caller não vê mudanças

CALL "PGM" USING BY CONTENT WS-DATA

🔹 BY VALUE

👉 Valor literal — comum com C/Java


⚠️ Easter Egg #2 — A causa invisível de bugs fantasma

90% dos “dados misteriosamente alterados” em sistemas antigos são BY REFERENCE mal usado.


🧭 Quem é o Main Program?

Plot twist:

👉 O código não define.
👉 O ambiente define.

No batch:

➡ O programa do EXEC no JCL é o principal.

Em CICS:

➡ O ambiente decide.

O mesmo módulo pode ser:

✔ Main hoje
✔ Subprograma amanhã
✔ Serviço compartilhado depois


🧩 Embedded vs External — A Guerra dos Módulos

🧱 Embedded (Contained)

✔ Dentro do mesmo source
✔ Compilado junto
✔ Uso local

MAIN
└─ SUB-A (no mesmo arquivo)

🌐 External

✔ Fonte separado
✔ Compilado independente
✔ Reutilizável

👉 Padrão dominante nas empresas.


🏦 Curiosidade real

Alguns subprogramas bancários:

💰 Executam bilhões de vezes
📅 Estão em produção há décadas
🧠 São mais antigos que muitos programadores


🛑 Como terminar um programa corretamente?

Padawan, memorize isso:

ComandoSubprogramaMain Program
GOBACKRetornaEncerra
EXIT PROGRAMRetorna❌ Não usar
STOP RUN💀 Mata tudoEncerra

⚠️ Easter Egg #3 — O botão nuclear

Um STOP RUN dentro de um subprograma compartilhado pode derrubar:

💥 Transações online
💥 Jobs batch inteiros
💥 Sistemas críticos

Sim, já aconteceu.


📡 Comunicação entre Programas — Três níveis de poder

🟦 Local

Só dentro do programa.

👉 Padrão.


🌍 Global

Programa + subprogramas embutidos.


🌐 External

Todos os programas da run unit.

👉 Use com extremo cuidado.


⚠️ Regra de Ouro Corporativa

Prefira parâmetros explícitos a variáveis globais.

Isso é engenharia profissional.


📥 RETURNING — O modo “função moderna”

Alguns compiladores permitem retorno explícito:

CALL "SUB"
USING IN-DATA
RETURNING OUT-DATA

Subprograma:

PROCEDURE DIVISION USING IN-DATA
RETURNING OUT-DATA.

💎 Menos comum, mas elegante.


🏦 Padrão real de mercado

Quase sempre:

CALL "SERVICO"
USING REQUEST-BLOCK
RESPONSE-BLOCK

Porque sistemas grandes preferem estruturas completas.


🧪 Passo a passo para criar um subprograma robusto

1️⃣ Defina interface clara (LINKAGE)

2️⃣ Use estruturas, não campos soltos

3️⃣ Documente a ordem dos parâmetros

4️⃣ Use GOBACK

5️⃣ Evite GLOBAL/EXTERNAL sem necessidade

6️⃣ Teste isoladamente


💎 Easter Egg Final — O verdadeiro poder do COBOL

Subprogramação é a razão pela qual:

🏦 Bancos não param
✈️ Sistemas de reserva funcionam
📊 Processamento massivo é possível
🕰️ Código sobrevive por décadas


☕ Mensagem do Mestre para o Padawan

Se você dominar subprogramação COBOL, você deixa de ser apenas um programador.

Você se torna:

🏛️ Um arquiteto de sistemas críticos

Porque o mainframe não é sobre código pequeno.

É sobre:

👉 Confiabilidade
👉 Desempenho
👉 Longevidade
👉 Engenharia disciplinada

sexta-feira, 27 de fevereiro de 2026

☕ Se Você Ainda Usa Subscript… o Batch Já Está Rindo de Você

 

Bellacosa Mainframe apresenta guia de tabelas no COBOL

☕ “Se Você Ainda Usa Subscript… o Batch Já Está Rindo de Você”

O Guia Jedi de Tabelas COBOL que Todo Padawan Precisa Antes que o CPU Account Chegue 💸

“No Mainframe, memória é preciosa… mas CPU é dinheiro vivo.”

Padawan, aproxime-se do terminal. Hoje vamos falar de um dos poderes mais silenciosos — e mais subestimados — do universo COBOL:

🛰️ TABELAS. ÍNDICES. BUSCAS. MEMÓRIA PURA.

Se você domina isso… domina o coração do batch.
Se não domina… o batch domina você.


🧠 Parte 1 — A Verdade Oculta: OCCURS Não É Só Um Array

Muitos iniciantes pensam:

“Ah, OCCURS é só um array.”

Não, jovem padawan.
É um buffer estruturado diretamente na memória do programa.

01 EMP-TABLE.
05 EMP-ENTRY OCCURS 100 TIMES.
10 EMP-ID PIC 9(6).
10 EMP-NAME PIC X(30).

Isso cria 100 registros contíguos.
Sem ponteiros. Sem heap. Sem frescura.

💡 Curiosidade:
COBOL foi projetado quando memória era absurdamente cara — por isso layouts são fixos e previsíveis.


⚔️ Parte 2 — Subscript vs Index: A Batalha dos Dois Caminhos

🔢 Subscript (o caminho do aprendiz)

MOVE EMP-NAME (WS-I) TO PRINT-NAME

✔ Simples
✔ Numérico
❌ Mais lento
❌ Recalcula endereço toda vez


⚡ Index (o caminho do Jedi)

05 EMP-ENTRY OCCURS 100 TIMES
INDEXED BY EMP-IDX.

Uso:

SET EMP-IDX TO 1
MOVE EMP-NAME (EMP-IDX) TO PRINT-NAME

✔ Ponteiro interno
✔ Muito mais eficiente
✔ Necessário para SEARCH
✔ Não é numérico

🧙‍♂️ Easter Egg técnico:
Internamente, o índice é um deslocamento binário — não um número “1, 2, 3”.


🪄 Parte 3 — O Erro que Entrega o Padawan

Se você já escreveu isso:

ADD 1 TO EMP-IDX

🚨 O compilador não apenas desaprova…
ele julga sua linhagem inteira.

Índice só aceita:

SET EMP-IDX UP BY 1
SET EMP-IDX DOWN BY 1
SET EMP-IDX TO 1

💡 Índice NÃO é variável numérica.


🔍 Parte 4 — SEARCH: A Varredura do Deserto

Busca sequencial:

SEARCH EMP-ENTRY
AT END DISPLAY "NOT FOUND"
WHEN EMP-ID (EMP-IDX) = TARGET-ID
DISPLAY "FOUND"
END-SEARCH

Características:

✔ Examina um a um
✔ Não precisa ordenar
✔ Começa na posição atual do índice

💎 Dica avançada:

SET EMP-IDX TO 5

Vai procurar do elemento 5 até o fim.

👉 Muito usado para retomar processamento após checkpoint.


🚀 Parte 5 — SEARCH ALL: O Salto no Hiperespaço

Busca binária:

SEARCH ALL EMP-ENTRY
WHEN EMP-ID (EMP-IDX) = TARGET-ID
DISPLAY "FOUND"
END-SEARCH

Mas cuidado…

⚠️ Regra de Ferro:

👉 A tabela DEVE estar ordenada pela chave da busca

Sem isso:

💀 Pode não encontrar valores existentes
💀 Não gera erro
💀 Bugs fantasma nas madrugadas de fechamento


📊 Comparação brutal

MétodoComparações (1 milhão itens)
Serialaté 1.000.000
Binária~20

💸 Sim, isso vira dinheiro na fatura de CPU.


🔄 Parte 6 — SORT em Memória: O Poder Esquecido

Poucos padawans sabem:

COBOL pode ordenar uma tabela OCCURS inteira.

SORT EMP-ENTRY ASCENDING KEY EMP-ID

Se não especificar chave…

👉 Usa a KEY definida na tabela.

ASCENDING KEY EMP-ID

🧬 Parte 7 — REDEFINES: O Lado Negro da Memória

Aqui começa a magia obscura.

01 RAW-DATA PIC X(24).

01 EMP-TABLE REDEFINES RAW-DATA.
05 EMP OCCURS 4 TIMES.
10 EMP-ID PIC 9(2).
10 EMP-NAME PIC X(4).

Nenhum byte é movido.

👉 Apenas reinterpretado.


🎯 Exemplo clássico

"10JOAO15MARIA20CARL"

Pode virar:

IDNome
10JOAO
15MARIA
20CARL

💡 Isso é parsing sem custo de CPU.


🧹 Parte 8 — INITIALIZE: O Reset Jedi

INITIALIZE EMP-TABLE

Resultado:

✔ Alfanuméricos → espaços
✔ Numéricos → zeros


✈️ Variante poderosa

INITIALIZE EMP-TABLE
REPLACING ALPHANUMERIC DATA BY "ABC"

Todos os campos recebem "ABC".


📚 Parte 9 — VALUE: Carregando a Tabela na Compilação

01 CITY-TABLE VALUE "LHRPEKMELJFK".
02 CITY PIC X(3) OCCURS 4 TIMES.

Distribuição:

1 → LHR
2 → PEK
3 → MEL
4 → JFK

💡 Zero custo em runtime.


🏦 Parte 10 — O Que Bancos REALMENTE Fazem

Tabelas OCCURS são usadas para:

✔ Parâmetros carregados em memória
✔ Tabelas de códigos
✔ Conversões
✔ Regras de negócio
✔ Buffers massivos
✔ Lookups ultra rápidos

Em muitos sistemas críticos, elas substituem chamadas a banco.


🧠 Curiosidade Histórica

COBOL foi criado quando:

🧊 CPU era lenta
💾 Memória era caríssima
📼 Disco era ainda mais lento

Por isso:

👉 Processar em memória sempre foi o caminho do mestre.


🏆 Conclusão — O Segredo que Separa Padawans de Mestres

Se você entendeu este artigo…

Você aprendeu a:

✔ Controlar memória manualmente
✔ Otimizar CPU
✔ Implementar buscas eficientes
✔ Manipular dados sem cópia
✔ Pensar como um engenheiro mainframe


☕ Regra Suprema do Batch

“Quem domina tabelas… domina o tempo de execução.”