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

Translate

sexta-feira, 11 de novembro de 2022

🚍 AS EXCURSÕES DO SENHOR WILSON — UMA CRÔNICA AO ESTILO BELLACOSA MAINFRAME



🚍 AS EXCURSÕES DO SENHOR WILSON — UMA CRÔNICA AO ESTILO BELLACOSA MAINFRAME

PARA O EL JEFE MIDNIGHT LUNCH



Há vidas que parecem roteiros paralelos, diagonais, improváveis — fluxos que jamais seguiriam pelo JOB CARD do “sistema oficial”.
A vida do seu Wilson, meu pai, era exatamente isso:
um JCL escrito à mão, cheio de INCLUDE inusitado, PROC improvisado e STEP que ninguém acreditava que rodaria… mas rodava.
De algum jeito, rodava.



E entre todos esses capítulos, nenhum é tão cinematográfico — ou tão Vagner-raiz — quanto as Excursões do Senhor Wilson, esse épico ambulante que misturava caos, aventura, fé, picaretagem leve, alegria popular e o senso poético de viver fora da curva.


1. WILSON, O HOMEM-MULTITAREFA DO BRASIL PROFUNDO

Meu pai era daqueles brasileiros que parecem ter clonado a própria carteira de trabalho:

  • Vendia bordados de Ibitinga em São Paulo,

  • Levava roupas do Brás como se fossem seda importada e vendia pelo interior,

  • Raspava lucro com rifas de relógios “duvidosos” da Galeria Pagé,

  • Contrabandeava isqueiros, mini-games e qualquer coisa vinda da China, que pudesse ser revendida com lucro.

  • Tentou a sorte com uma mini-fundição de terminais de bateria automotiva,

  • Ia até Mogi das Cruzes, pegava pintainhos de um dia descartados e numa perua kombi ou variant caindo de podre, trocava por sucatas de metal.

  • Produzia velas caseiras derretendo parafina como um alquimista suburbano a parte bizarra era quando comprava parafina usada de cemitério,

  • Era fotógrafo profissional com olhar afiado, fazendo reportagens de casamento, festas, formaturas, batizados, crismas e primeira comum, fotos de velório, binoclinhos nas férias de verão e mais uso que agora fugiu da mente.

  • E quando tudo falhava… ligava o modo motorista de ônibus, trabalhando em fretamento e excursões..

Era o típico brasileiro da gambiarra empreendedora:
não se dobrava ao sistema — também não se encaixava nele.

E assim, com essa combinação de coragem, improviso e permanente estado de “vai dar certo”, nasceram as lendárias…



2. EXCURSÕES POPULARES WILSON TUR — A EMPRESA QUE NUNCA EXISTIU, MAS TODO MUNDO FOI

Enquanto muita gente vendia sonho, meu pai alugava um ônibus…
e entregava o sonho de verdade:

🌴 PARA A PRAIA GRANDE

Clássico absoluto.
Farofa, protetor solar vencido e felicidade genuína.
Golden age da excursão raiz.

🏰 PARA ITU

A cidade dos exageros — local perfeito para o homem das ideias grandes.

🧺 PICNICS EM PARQUES FORMOSOS

Comida na marmita de alumínio, toalha xadrez, bola de capotão e aquele tio que sempre dizia:
“Esse é o verdadeiro lazer da família brasileira!” Numa epoca que apenas a cerveja Skol era vendida em latas de aluminio, sucesso absoluto de vendas, direto do bageiro do busão, geladas durante a viagem.

🙏 ROTEIROS DE FÉ

Aparecida do Norte, Bom Jesus de Pirapora…
E aquela galera que chorava ao ver a Basílica enquanto o motorista fazia contas no canto do volante.

🌊 PRAIAS FLUVIAIS E REPRESAS

Clássico paulista: água escura, churrasqueiras improvisadas e perigo que ninguém percebia.

🏘️ OUTRAS CIDADES QUE A MEMÓRIA NÃO INDEXOU

Mas que certamente existiram.
Cada uma com seu encanto, sua trilha sonora de rádio AM e suas histórias esquecidas.


3. A MAGIA DA INFÂNCIA — ENQUANTO O MUNDO ERA MAIOR

Para o pequeno Vaguinho, tudo era maravilhoso:

  • rodar por estradas infinitas,

  • sentir o vento batendo pela janela,

  • ver cidades novas,

  • dormir no banco do ônibus,

  • acordar com o cheiro de pastel,

  • correr descalço no gramado dos parques.

  • mesmo sendo pobre, não existia limites, por mais longe que fosse, a excursão do seu Wilson chegava.

Era aventura pura.
Era liberdade.
Era uma infância que hoje parece impossível — e por isso é tão preciosa.

Enquanto os adultos se preocupavam com os boletos, eu e minha irmã Vivi viviamos.

E viver era bom.


4. O OLHAR DOS ADULTOS — A TRISTEZA SILENCIOSA DO CLÃ

Porque para a família…
havia sempre aquela frustração velada:

“Wilson poderia ter sido mais.”
“Wilson poderia ter ido mais longe.”
“Wilson perdeu o norte.”

E isso dói.
Dói em quem observa, mas principalmente no próprio homem, que talvez soubesse — mas já não tinha asas, nem forças, nem mapas. Nunca soube o que fez meu pai se perder, estudou até a sexta série e abandonou, foi da polícia do Exército numa época de ditadura e grande destaque aos milicos, saiu do quartel direto para a Volkswagen como segurança... mas enfim... não teve cabeça, anos mais tarde se perdeu para o alcool.

Meu pai não era mau.
Nem negligente.
Nem irresponsável por prazer.

Ele era o típico sujeito esmagado pelas engrenagens invisíveis do Brasil:

  • pouca oportunidade,

  • pouca orientação,

  • muita dureza,

  • e um coração inquieto demais para ficar parado.

Ele vivia tentando.
Pulando de sonho em sonho.
Errando mais que acertando.
E sobrevivendo.

Criou cordornas, produziu e vendeu queijos, fez cineminha nos primórdios do vídeo VHS, mas sempre na pindura, sem dinheiro para evoluir e dar um passo a frente.


5. ENTRE A BELEZA E A MELANCOLIA — A SAGA DO HOMEM QUE NUNCA PAROU

A verdade é que o Senhor Wilson viveu como muitos brasileiros vivem:

no fio da navalha, na incerteza, improvisando a vida como quem improvisa uma música em cifra.

Aquela tristeza que os adultos sentiam…
era uma mistura de amor e impotência.

Aquele brilho nos meus olhos de criança…
era a prova de que, apesar de tudo, ele deu a mim algo raro:

aventura. movimento. histórias.
memórias que atravessam o tempo.

Mesmo sem norte, ele deu paisagens.

Mesmo sem estabilidade, ele deu sol nos finais de semana.

Mesmo sem planos, ele deu mundos novos.

E isso…
é muito mais do que muitos pais conseguem dar.




6. EPÍLOGO — A HERANÇA QUE FICOU

O homem Wilson, com todas as suas falhas, seus rolos, suas loucuras e seus improvisos…
é parte profunda da sua construção.

Meu espírito andarilho?
Veio dele.

Meu impulso criativo, minha inquietação, meu gosto por histórias, meu amor por estrada?
Também.

Meu coração que insiste em sonhar — mesmo depois de levar pancada?
Direto da fábrica do velho Wilson.

A vida dele pode não ter tido norte.
Mas deixou rumos.
E deixou esse escriba que vós escreve.

E isso, meu amigo…
é mais bonito do que qualquer excursão.

As vezes me assusto, quanto sou parecido com meu pai. Quantas maluquices fiz dando seguimento a esta genuina aventura da Famiglia Bellacosa

domingo, 6 de novembro de 2022

Rambo e as Quatro Divisões — O Caminho das Pedras para Escrever seu Primeiro Programa COBOL sem Voltar do Vietnã para uma América Desconhecida

 

Bellacosa Mainframe e o Rambo codificando programas cobol mainframe

☕ Um Café no Bellacosa Mainframe

Rambo e as Quatro Divisões — O Caminho das Pedras para Escrever seu Primeiro Programa COBOL sem Voltar do Vietnã para uma América Desconhecida

Ou: você já sabe entrar no TSO, abrir o ISPF, submeter JCL e reconhecer um S0C7; falta descobrir que um programa COBOL não nasce inteiro — ele é montado, uma decisão pequena por vez.

Há um momento estranho na vida de quem começa COBOL no z/OS.

O aluno já entra no TSO. Abre o ISPF. Encontra um membro numa PDS. Submete um JOB. Vai ao SDSF, vê CC 0000, vê ABEND, talvez até saiba que o compilador fica em algum lugar atrás daquele JCL aparentemente escrito em sânscrito administrativo.

Então o instrutor diz: “agora escreva um programa”. E a tela fica vazia como uma estrada à noite.

Não é falta de inteligência nem de vontade. É que até aqui ensinaram os cômodos da fábrica; ninguém mostrou como uma peça nasce. O iniciante recebe palavras enormes — IDENTIFICATION DIVISION, arquivo, PERFORM, WORKING-STORAGE, compilação — antes de aprender a primeira disciplina de sobrevivência: um programa é uma sequência explícita de perguntas e ações.

John Rambo entenderia a sensação. O sujeito voltou de uma guerra, trouxe competência real, mas aterrissou num lugar cujas regras não reconhece. O aluno COBOL também: conhece comandos isolados, mas ainda não tem o mapa para transformar um problema em fonte executável.

Vamos construir esse mapa. Sem magia, sem “copie este monstro de 800 linhas e reze”. No fim haverá um programa compilado, executado e observável no SDSF.

Missão do laboratório: ler dois números inteiros fornecidos pelo SYSIN, somá-los e informar o resultado. Se a entrada não for numérica, terminar de forma controlada.

É um problema pequeno de propósito. Se você não consegue explicar cada linha de um programa de 70 linhas, um programa de 7 mil linhas só é uma floresta maior.



1. Antes de abrir o editor: Rambo não atira no escuro

O erro clássico é começar pela primeira linha de COBOL e tentar “pensar dentro da sintaxe”. Isso é como começar a construir uma ponte escolhendo o parafuso.

Primeiro escreva, em português comum, o contrato do programa:

PerguntaResposta desta missão
Qual é a entrada?Dois números inteiros, um por linha, recebidos no SYSIN.
Qual é a saída?Uma mensagem com a soma, enviada ao SYSOUT.
O que pode dar errado?A linha não contém número ou falta uma das linhas.
Qual regra será aplicada?Só soma quando as duas entradas são numéricas.
Como saberei que funcionou?No JESMSGLG/SYSOUT, aparece a soma; o job fecha com CC 0000.

Agora reduza a lógica a pseudocódigo:

receber primeiro valor
receber segundo valor
se ambos são números
    somar
    mostrar resultado
senão
    mostrar mensagem de erro
    encerrar com código 8
fim-se
encerrar normalmente

Esse papel é o primeiro “programa”. COBOL será apenas a tradução disciplinada dele.

O truque que salva o iniciante

Antes de escrever uma instrução, complete a frase: “eu preciso guardar…”.

Para esta missão, precisamos guardar:

  • o texto bruto que chegou do SYSIN;

  • os dois valores convertidos para número;

  • o resultado;

  • uma forma de saber se a entrada é válida.

Pronto: você acabou de descobrir quase toda a DATA DIVISION.



2. As quatro divisões: quatro placas na trilha

COBOL não é uma língua que começa a contar uma história logo na primeira linha. Ele organiza o programa em quatro áreas. Pense nelas como as placas que Rambo fincaria na mata para não andar em círculos.

DivisãoPergunta que respondeNesta missão
IDENTIFICATION DIVISIONQuem é este programa?Nome do programa.
ENVIRONMENT DIVISIONCom que ambiente/dispositivos ele conversa?SYSIN e SYSOUT.
DATA DIVISIONQuais dados existem e como são descritos?Entradas, números e resultado.
PROCEDURE DIVISIONO que acontece, em qual ordem?Ler, validar, somar, exibir e terminar.

Uma dica de leitura para o resto da carreira:

Dados não fazem nada; procedimentos não guardam nada.

Quando você se perde, pergunte: “estou descrevendo uma coisa ou mandando executar uma ação?” Coisa vai para DATA; ação vai para PROCEDURE.




3. Primeiro marco: dar identidade ao recruta

Todo programa começa assim:

       IDENTIFICATION DIVISION.
       PROGRAM-ID. SOMA001.

PROGRAM-ID é o nome pelo qual o programa será conhecido pelo compilador e, em geral, pelo ambiente de execução. Use um nome que respeite a convenção local. Aqui, SOMA001 é curto, didático e cabe nas convenções tradicionais.

Não coloque regra de negócio aqui. Não declare variáveis aqui. Não tente impressionar o compilador. Esta divisão responde apenas: “quem se apresentou para a missão?”



4. Segundo marco: ligar a estrada de entrada e saída

Num programa batch simples, o JCL entrega recursos ao programa por DDNAME. SYSIN costuma ser a entrada padrão e SYSOUT a saída de mensagens. O COBOL precisa declarar que usará esses nomes.

       ENVIRONMENT DIVISION.
       INPUT-OUTPUT SECTION.
       FILE-CONTROL.
           SELECT ENTRADA ASSIGN TO SYSIN
               ORGANIZATION IS LINE SEQUENTIAL.
           SELECT SAIDA ASSIGN TO SYSOUT
               ORGANIZATION IS LINE SEQUENTIAL.

Traduzindo sem fumaça:

  • SELECT ENTRADA: dentro do COBOL, chamaremos esse fluxo de ENTRADA;

  • ASSIGN TO SYSIN: no JCL, ele será conectado ao DD chamado SYSIN;

  • LINE SEQUENTIAL: vamos tratar uma linha por vez, ideal para o exercício;

  • o mesmo raciocínio vale para SAIDA/SYSOUT.

Agora descrevemos os registros desses fluxos na DATA DIVISION.



5. Terceiro marco: a mochila de dados (DATA DIVISION)

A DATA DIVISION tem seções. Para este laboratório, usaremos duas:

  • FILE SECTION: como é cada linha lida ou gravada nos arquivos lógicos;

  • WORKING-STORAGE SECTION: a mochila do programa, onde ficam os dados de trabalho enquanto ele está em execução.

       DATA DIVISION.
       FILE SECTION.
       FD  ENTRADA.
       01  REG-ENTRADA                 PIC X(20).

       FD  SAIDA.
       01  REG-SAIDA                   PIC X(80).

       WORKING-STORAGE SECTION.
       01  WS-PRIMEIRO-TEXTO           PIC X(20).
       01  WS-SEGUNDO-TEXTO            PIC X(20).
       01  WS-PRIMEIRO-NUMERO          PIC 9(9).
       01  WS-SEGUNDO-NUMERO           PIC 9(9).
       01  WS-RESULTADO                PIC 9(10).
       01  WS-RESULTADO-EDITADO        PIC Z(9)9.

Como ler uma declaração COBOL

Pegue esta linha:

       01  WS-PRIMEIRO-NUMERO          PIC 9(9).
  • 01 é o nível: um item independente;

  • WS-PRIMEIRO-NUMERO é o nome escolhido por nós; WS- é uma convenção comum para Working-Storage;

  • PIC 9(9) reserva nove posições numéricas, sem sinal e sem casas decimais.

O texto de entrada é PIC X(20) porque, quando a linha chega, ela é apenas texto. Antes de fazer conta, nós perguntaremos se ela é numérica e só então a moveremos para um campo numérico.

Esse detalhe evita o famoso S0C7: tentar tratar lixo como número. O S0C7 não é um fantasma; é normalmente a máquina dizendo, com pouca delicadeza, “você prometeu que havia dígitos aqui”.

WS-RESULTADO-EDITADO usa Z(9)9: os Z suprimem zeros à esquerda na apresentação. Assim, em vez de mostrar 0000000042, mostramos 42.



6. Quarto marco: transformar o roteiro em PROCEDURE DIVISION

Agora o programa ganha vida. Em COBOL, é saudável criar pequenos parágrafos com nomes que expliquem a intenção. Não escreva um único bloco de 400 linhas chamado MAIN. Isso é o equivalente corporativo de entrar na mata sem bússola.

       PROCEDURE DIVISION.
       0000-PRINCIPAL.
           PERFORM 1000-RECEBER-DADOS
           PERFORM 2000-VALIDAR-E-PROCESSAR
           PERFORM 9000-ENCERRAR
           .

Leia em voz alta: “execute receber dados; execute validar e processar; execute encerrar”. Se a leitura parece português burocrático, está no caminho certo.

O ponto final após o último comando encerra o parágrafo. Em código real, a convenção da equipe pode ser diferente, mas o princípio é o mesmo: seja consistente.

Receber dados

       1000-RECEBER-DADOS.
           READ ENTRADA
               AT END
                   MOVE SPACES TO WS-PRIMEIRO-TEXTO
               NOT AT END
                   MOVE REG-ENTRADA TO WS-PRIMEIRO-TEXTO
           END-READ

           READ ENTRADA
               AT END
                   MOVE SPACES TO WS-SEGUNDO-TEXTO
               NOT AT END
                   MOVE REG-ENTRADA TO WS-SEGUNDO-TEXTO
           END-READ
           .

Aqui há uma disciplina importante: READ lê para REG-ENTRADA, o registro definido na FILE SECTION. Em seguida copiamos para o campo de trabalho correspondente. A segunda leitura sobrescreverá REG-ENTRADA, e isso é normal.

Se não existir linha, colocamos espaços no campo. Mais adiante, a validação o rejeitará. Isso é muito melhor do que fingir que a linha existe.

Validar, converter, somar ou terminar com erro controlado

       2000-VALIDAR-E-PROCESSAR.
           IF FUNCTION TEST-NUMVAL(WS-PRIMEIRO-TEXTO) = 0
              AND FUNCTION TEST-NUMVAL(WS-SEGUNDO-TEXTO) = 0
               COMPUTE WS-PRIMEIRO-NUMERO =
                   FUNCTION NUMVAL(WS-PRIMEIRO-TEXTO)
               COMPUTE WS-SEGUNDO-NUMERO =
                   FUNCTION NUMVAL(WS-SEGUNDO-TEXTO)
               ADD WS-PRIMEIRO-NUMERO
                   WS-SEGUNDO-NUMERO
                   GIVING WS-RESULTADO
               MOVE WS-RESULTADO TO WS-RESULTADO-EDITADO
               MOVE SPACES TO REG-SAIDA
               STRING 'SOMA = ' DELIMITED BY SIZE
                      WS-RESULTADO-EDITADO DELIMITED BY SIZE
                 INTO REG-SAIDA
               END-STRING
               WRITE REG-SAIDA
           ELSE
               MOVE 'ERRO: INFORME DOIS NUMEROS INTEIROS.'
                 TO REG-SAIDA
               WRITE REG-SAIDA
               MOVE 8 TO RETURN-CODE
           END-IF
           .

Há cinco ferramentas essenciais aqui:

  • IF ... END-IF: escolhe um caminho. Sempre prefira o terminador explícito END-IF; ele evita que um ELSE perdido faça estrago mais à frente.

  • FUNCTION TEST-NUMVAL: verifica se o texto pode representar um número. Resultado 0 significa que é válido; ela aceita os espaços que normalmente acompanham uma linha curta recebida pelo SYSIN.

  • FUNCTION NUMVAL: converte o texto validado para valor numérico. A regra de ouro permanece: nunca converta antes de validar.

  • ADD ... GIVING: faz a soma e coloca o resultado no destino.

  • WRITE: envia o registro preparado para o fluxo de saída.

E entra um veterano importante: RETURN-CODE. Ele é uma área especial usada para devolver o resultado da execução ao z/OS/JES. 0 costuma significar sucesso; 8, erro de negócio ou entrada inválida neste exercício. Os significados formais dependem da política do seu ambiente, mas a ideia é universal: não esconda falhas.

Encerrar não é um detalhe

       9000-ENCERRAR.
           CLOSE ENTRADA
                 SAIDA
           GOBACK
           .

CLOSE finaliza os arquivos. GOBACK devolve o controle a quem chamou o programa — no nosso caso, o ambiente batch. Um programa que “parece ter terminado” mas não fecha recursos corretamente vira uma pequena dor de cabeça que cresce em produção.





7. O programa completo: uma peça que você consegue explicar

Crie um membro, por exemplo SOMA001, na PDS usada para fontes COBOL e coloque o código abaixo. Em ambientes de cartão fixo, respeite a coluna 8 para início do código; no editor ISPF, a numeração à esquerda normalmente já o mantém no lugar. Se sua instalação usa formato livre, siga o padrão definido por ela.

       IDENTIFICATION DIVISION.
       PROGRAM-ID. SOMA001.

       ENVIRONMENT DIVISION.
       INPUT-OUTPUT SECTION.
       FILE-CONTROL.
           SELECT ENTRADA ASSIGN TO SYSIN
               ORGANIZATION IS LINE SEQUENTIAL.
           SELECT SAIDA ASSIGN TO SYSOUT
               ORGANIZATION IS LINE SEQUENTIAL.

       DATA DIVISION.
       FILE SECTION.
       FD  ENTRADA.
       01  REG-ENTRADA                 PIC X(20).

       FD  SAIDA.
       01  REG-SAIDA                   PIC X(80).

       WORKING-STORAGE SECTION.
       01  WS-PRIMEIRO-TEXTO           PIC X(20).
       01  WS-SEGUNDO-TEXTO            PIC X(20).
       01  WS-PRIMEIRO-NUMERO          PIC 9(9).
       01  WS-SEGUNDO-NUMERO           PIC 9(9).
       01  WS-RESULTADO                PIC 9(10).
       01  WS-RESULTADO-EDITADO        PIC Z(9)9.

       PROCEDURE DIVISION.
       0000-PRINCIPAL.
           OPEN INPUT ENTRADA
                OUTPUT SAIDA
           PERFORM 1000-RECEBER-DADOS
           PERFORM 2000-VALIDAR-E-PROCESSAR
           PERFORM 9000-ENCERRAR
           .

       1000-RECEBER-DADOS.
           READ ENTRADA
               AT END
                   MOVE SPACES TO WS-PRIMEIRO-TEXTO
               NOT AT END
                   MOVE REG-ENTRADA TO WS-PRIMEIRO-TEXTO
           END-READ

           READ ENTRADA
               AT END
                   MOVE SPACES TO WS-SEGUNDO-TEXTO
               NOT AT END
                   MOVE REG-ENTRADA TO WS-SEGUNDO-TEXTO
           END-READ
           .

       2000-VALIDAR-E-PROCESSAR.
           IF FUNCTION TEST-NUMVAL(WS-PRIMEIRO-TEXTO) = 0
              AND FUNCTION TEST-NUMVAL(WS-SEGUNDO-TEXTO) = 0
               COMPUTE WS-PRIMEIRO-NUMERO =
                   FUNCTION NUMVAL(WS-PRIMEIRO-TEXTO)
               COMPUTE WS-SEGUNDO-NUMERO =
                   FUNCTION NUMVAL(WS-SEGUNDO-TEXTO)
               ADD WS-PRIMEIRO-NUMERO
                   WS-SEGUNDO-NUMERO
                   GIVING WS-RESULTADO
               MOVE WS-RESULTADO TO WS-RESULTADO-EDITADO
               MOVE SPACES TO REG-SAIDA
               STRING 'SOMA = ' DELIMITED BY SIZE
                      WS-RESULTADO-EDITADO DELIMITED BY SIZE
                 INTO REG-SAIDA
               END-STRING
               WRITE REG-SAIDA
           ELSE
               MOVE 'ERRO: INFORME DOIS NUMEROS INTEIROS.'
                 TO REG-SAIDA
               WRITE REG-SAIDA
               MOVE 8 TO RETURN-CODE
           END-IF
           .

       9000-ENCERRAR.
           CLOSE ENTRADA
                 SAIDA
           GOBACK
           .

Pare antes de compilar e faça a prova Rambo: aponte para cada bloco e responda o que ele guarda ou faz. Se não consegue responder, não é hora de decorar mais comandos; é hora de reduzir o trecho até compreendê-lo.



8. O JCL: o caminhão que leva o recruta até o campo de teste

Cada empresa possui procedure, bibliotecas e padrões próprios. Por isso, não copie cegamente os nomes de bibliotecas abaixo. Use o PROC de compilação que sua turma ou instalação já fornece. O objetivo é entender a estrutura.

Um JCL didático pode ter este desenho:

//SOMAJOB  JOB (ACCT),'ALUNO',CLASS=A,MSGCLASS=H,NOTIFY=&SYSUID
//COMPILE  EXEC IGYWCL,PGM=SOMA001
//COBOL.SYSIN DD DSN=SEU.USUARIO.COBOL(SOMA001),DISP=SHR
//GO.SYSIN     DD *
12
30
/*
//GO.SYSOUT    DD SYSOUT=*

O que interessa aqui:

ParteTradução humana
EXEC IGYWCLChama uma procedure de compilar, linkeditar e executar COBOL. O nome pode variar na sua instalação.
PGM=SOMA001Indica o nome do módulo/programa.
COBOL.SYSINEntrega o membro-fonte ao passo de compilação. Alguns PROCs usam outro DDNAME; confira o padrão local.
GO.SYSIN DD *Entrega dados de teste diretamente no JCL ao passo de execução.
GO.SYSOUTPede que as mensagens produzidas pelo programa sejam direcionadas para a saída do job.

Em muitos laboratórios, a procedure já faz compile + link + go, mas com nomes diferentes, como COBCLG, IGYWCLG ou um PROC local. O procedimento certo é o que existe no seu ambiente, não o que alguém colou num fórum em 2009.

Se a sua procedure só compila e linkedita, faça dois JOBs: primeiro construa o load module; depois execute-o com um passo EXEC PGM=SOMA001, acrescentando ao STEPLIB a load library indicada pelo instrutor.



9. Do SUB ao SDSF: onde procurar primeiro

Depois de salvar fonte e JCL, submeta o job. A rotina de investigação do iniciante deve ser sempre a mesma:

  1. No ISPF, confirme que salvou o membro certo.

  2. Digite SUB no comando primário do editor JCL ou use a opção de submit disponível.

  3. No SDSF, abra ST e localize seu job.

  4. Veja o resultado geral: CC 0000 é a luz verde; qualquer ABEND ou CC inesperado pede leitura.

  5. Abra primeiro JESMSGLG: ele conta a história cronológica do job.

  6. Abra a listagem do compilador (SYSPRINT, SYSOUT ou nome equivalente) se a compilação falhou.

  7. Abra o SYSOUT do passo de execução para procurar SOMA = 42.

Para o teste com 12 e 30, a saída esperada é:

SOMA = 42

E o job deve fechar com CC 0000.

Faça também o teste de falha:

12
RAMBO

Agora a saída deve trazer a mensagem de erro, e o passo de execução deve terminar com CC 0008. Isto é sucesso do teste: o programa identificou uma entrada inválida sem cair num abend.



10. Quando der errado: o que a trilha está tentando dizer

SintomaSuspeita inicialPrimeira ação
Erros na compilaçãoPonto faltando, palavra reservada, colunas/formato ou estrutura incompletaLeia a primeira mensagem de erro do compilador; as seguintes podem ser consequência dela.
S0C7Campo não numérico usado em operação numéricaVerifique onde houve MOVE, ADD, COMPUTE ou comparação; valide a entrada antes.
S806Programa não foi encontrado para executarConfira link-edit, nome do PGM, STEPLIB/JOBLIB e load library.
S013 ou erro de arquivoDCB/atributos ou modo de abertura incompatíveisConfira o DD no JCL, OPEN INPUT/OUTPUT e o formato esperado.
CC 0000, mas nada apareceVocê escreveu em uma saída diferente da que está olhando, ou não executou o caminho do WRITEConfira o GO.SYSOUT e adicione uma mensagem simples de rastreio temporária.

O comando tático é: leia a primeira causa, não a última explosão. Um ponto ausente pode criar vinte mensagens do compilador; consertar a vigésima é combater fumaça.





11. Os sete hábitos de quem deixa de apenas “saber comandos”

  1. Comece pelo contrato, não pelo teclado. Entrada, saída, regra e erro antes da sintaxe.

  2. Faça uma versão minúscula funcionar. Primeiro leia e dê DISPLAY; depois some; depois valide; só então enfeite.

  3. Dê nomes que contem a história. WS-VALOR-ORIGEM é melhor que WS-A; 2000-CALCULAR-TOTAL é melhor que ROT2.

  4. Separe dados de ações. Campo na DATA DIVISION; decisão e processamento na PROCEDURE DIVISION.

  5. Valide bordas. Entrada vazia, letra em campo numérico, zero, valor máximo: os incidentes moram nas fronteiras.

  6. Compile cedo e frequentemente. Não escreva 300 linhas antes do primeiro compile. Entregue pequenas etapas ao compilador.

  7. Use o SDSF como painel, não como tribunal. Ele não está ali para humilhar ninguém; mostra o que de fato foi submetido e executado.



12. A próxima missão: aumentar só uma pedra por vez

Depois que SOMA001 funcionar, não pule direto para CICS, Db2 e um cadastro de clientes com 40 telas. Evolua em degraus:

  1. Troque a soma por subtração e multiplicação.

  2. Leia vários pares até fim de arquivo; aí você descobrirá PERFORM UNTIL e uma chave de fim de arquivo.

  3. Grave um relatório de saída com cabeçalho e totalizador.

  4. Leia um arquivo sequencial real no JCL, em vez de DD *.

  5. Crie uma rotina para validar dados e outra para calcular.

  6. Só então avance para VSAM, Db2, CICS ou chamadas de programas.

Cada degrau reaproveita a mesma gramática mental: receber → validar → processar → produzir saída → encerrar. Muda o recurso, não muda o raciocínio.



13. Checklist antes de chamar o instrutor

Antes de dizer “não funciona”, faça esta inspeção honesta:

  • Qual é a entrada exata que forneci?

  • Qual saída eu esperava?

  • Em que membro está o fonte? E em que membro está o JCL?

  • O PROGRAM-ID é o mesmo nome usado no build/exec?

  • O job chegou a executar ou morreu na compilação/linkedição?

  • Qual é a primeira mensagem relevante no SDSF?

  • Se há cálculo, os campos envolvidos são realmente numéricos?

  • Eu consigo explicar, em português, o caminho entre a leitura e a saída?

Se levar essas respostas, você não chega ao instrutor com “deu erro”. Chega com material de diagnóstico — e aprende dez vezes mais depressa.



Epílogo — Rambo não decorou a selva; ele aprendeu a ler rastros

Escrever COBOL não é conhecer todas as cláusulas da linguagem. É pegar um problema confuso e dividi-lo até que cada parte tenha uma resposta simples:

  • quem é o programa;

  • de onde vêm e para onde vão os dados;

  • o que precisa ficar guardado;

  • quais passos acontecem e em que ordem;

  • como o programa termina quando tudo vai bem — e quando não vai.

O aluno que voltou do “Vietnã” de TSO, ISPF, JOB e JCL não está atrasado. Ele já conhece o terreno e as ferramentas. Falta transformar ferramentas em método.

Abra um membro vazio. Escolha um problema de uma frase. Escreva o contrato. Monte as quatro divisões. Compile antes de o medo crescer. E, quando o SDSF mostrar o primeiro CC 0000 de um programa escrito por você, guarde o recibo: não foi sorte. Foi a primeira vez que você atravessou a trilha inteira.

E a partir daí, padawan, a floresta continua grande — mas já não é desconhecida.



Para ir mais longe

Conheça diversos laboratorios praticos para dominar o COBOL e ir mais longe na carreira de DEV Mainframe

https://eljefemidnightlunch.blogspot.com/2026/07/laboratorio-pratico-primeiros-passos-no.html

https://eljefemidnightlunch.blogspot.com/2024/01/laboratorio-pratico-testes-de.html

https://eljefemidnightlunch.blogspot.com/2025/06/laboratorio-pratico-de-cobol-mainframe.html

https://eljefemidnightlunch.blogspot.com/2025/10/lab-1-laboratorio-pratico-db2-para.html

https://eljefemidnightlunch.blogspot.com/2025/10/laboratorio-pratico-03-comandos-display.html

https://eljefemidnightlunch.blogspot.com/2026/07/comp-4-e-comp-5-sem-misterios-parte-ii.html

sábado, 5 de novembro de 2022

O Meu Processo de Alusitanamento — Tomás Taveira, o CD 17 e a primeira aula de folclore digital português

 

Bellacosa Mainframe e as historias que nossas babas nao contavam Tavera Todinho la dentro

☕ Um Café no Bellacosa Mainframe

O Meu Processo de Alusitanamento — Tomás Taveira, o CD 17 e a primeira aula de folclore digital português

Ou: como cheguei a Portugal em 2002 para trabalhar num banco e descobri que, antes do eMule, os portugueses já tinham inventado a distribuição peer-to-peer em VHS

Groucho Marx pega o charuto, examina uma cassete VHS e sentencia:
“Não sei o que está aqui dentro. Mas, se metade de Lisboa já viu, provavelmente é confidencial.”



🇵🇹 2002 — Vagner precisa ser lusitanizado

Quando cheguei a Portugal, em 2002, trazia comigo um problema gravíssimo.

Eu falava português.

Parecia uma vantagem.

Não era.

Eu falava português brasileiro.

Portugal rapidamente tratou de explicar que isso era apenas uma versão beta do idioma.

Começou então aquilo que hoje chamo carinhosamente de meu processo de alusitanamento.

Era necessário aprender que uma bicha nem sempre era aquilo que um brasileiro imaginava.

Que uma rapariga podia ser apresentada à família sem provocar um escândalo.

Que um puto não era necessariamente uma ofensa.

Que pequeno-almoço não era um café servido numa xícara menor.

E que "pois" poderia significar aproximadamente 37 coisas dependendo da inclinação da cabeça do interlocutor.

Mas havia outra camada.

A mais importante.

A cultura subterrânea.

Porque ninguém realmente conhece um país lendo apenas Camões, Fernando Pessoa, Eça de Queirós e os manuais oficiais.

Para conhecer um país é necessário descobrir as piadas que todo mundo entende sem precisar explicar.

E foi assim que, trabalhando no universo bancário português, acabei recebendo de um colega do BPN uma espécie de documento antropológico.

Um CD.

Não me lembro de haver cerimônia oficial.

Não houve assinatura.

Não houve protocolo.

Não houve RACF.

O cidadão simplesmente entregou o artefato.

E naquele objeto havia uma inscrição suficientemente misteriosa para despertar imediatamente meu instinto de arqueólogo digital:

CD 17

Dezessete.

Isso significava uma coisa extraordinária.

Existiram pelo menos dezesseis antes dele.



🏛️ Para compreender o CD 17 precisamos voltar a Lisboa dos anos 80

Antes do personagem folclórico existe o personagem histórico.

E esta distinção é fundamental.

Tomás Taveira não surgiu como personagem de piada.

Era — e continuou sendo — um arquiteto português de enorme projeção, professor universitário e um dos principais nomes associados ao pós-modernismo arquitetônico português. Sua obra utilizava cores fortes, geometrias exuberantes e uma linguagem arquitetônica imediatamente reconhecível. As Amoreiras transformaram-se provavelmente no exemplo mais popular dessa arquitetura pós-moderna em Lisboa.

Vieram Olaias.

Amoreiras.

Edifícios públicos.

Projetos internacionais.

Posteriormente até estádios construídos para o Euro 2004.

Décadas depois do episódio que estamos prestes a abordar, a RTP ainda poderia dedicar um programa à sua arquitetura, mostrando projetos, desenhos e maquetes.

Essa é a primeira biografia.

Chamemos:

TOMAS.TAVEIRA.PROD

Arquiteto.

Professor.

Pós-modernista.

MIT.

Urbanismo.

Amoreiras.

Olaias.

Estádios.

Currículo perfeitamente carregável pelo sistema institucional.

Só que, em algum momento dos anos 80, começou a ser construída uma segunda biografia.

Uma que jamais apareceria num currículo acadêmico.


📼 1987 — alguém apertou REC

Aqui precisamos abandonar Groucho Marx durante alguns minutos.

Porque por trás daquilo que posteriormente virou piada nacional existia uma questão séria.

Vídeos íntimos foram gravados no escritório de Taveira. As fontes posteriores descrevem problemas graves envolvendo o conhecimento ou consentimento das mulheres filmadas. As gravações teriam sido realizadas por volta de 1987 e começaram a circular publicamente em 1989.

Não precisamos entrar nos detalhes.

Aliás, para compreender o fenômeno cultural, os detalhes são praticamente irrelevantes.

O que importa para nossa arqueologia é outra coisa:

a cassete escapou.

E, quando uma informação escapa, surge uma das leis fundamentais da informática:

Informação interessante possui uma tendência impressionante de desenvolver pernas.

Em 1989 não existia WhatsApp.

Não existia Telegram.

Não existia YouTube.

Não existia BitTorrent.

Não existia eMule.

Não existia Napster.

Não existia sequer a Web como conheceríamos poucos anos depois.

Mas existia uma tecnologia revolucionária.

VHS + DOIS VIDEOCASSETES

Pronto.

Nasceu o peer-to-peer lusitano.


📼📼 A internet portuguesa antes da internet

Imagine o processo.

Alguém possuía uma cassete.

Outro alguém queria uma cópia.

Dois aparelhos eram conectados.

PLAY.

REC.

Esperava-se.

Nascia uma segunda cassete.

A segunda encontrava uma terceira pessoa.

A terceira conhecia um primo.

O primo conhecia um colega.

O colega trabalhava num escritório.

O escritório tinha alguém com dois videocassetes.

PLAY.

REC.

PLAY.

REC.

PLAY.

REC.

Em pouco tempo a coisa começou a circular por Lisboa com uma velocidade que relatos posteriores descrevem como extraordinária. A imprensa já discutia rumores sobre as gravações em setembro de 1989; jornais e cronistas começaram a abordar o assunto e, em outubro, o caso já fazia parte do debate público nacional.

A própria retrospectiva anual da RTP colocaria Tomás Taveira entre os acontecimentos marcantes de Portugal em 1989.

Isso é extraordinário.

Porque significa que estamos diante de um fenômeno que hoje chamaríamos simplesmente:

VIRAL

Só que viral sem internet.


📰 E então Portugal descobriu a bomba

O assunto saiu das salas privadas.

Chegou aos jornais.

Chegou às conversas.

Chegou aos cafés.

Chegou às universidades.

Chegou aos escritórios.

Chegou inevitavelmente à televisão.

E então aconteceu aquilo que sempre acontece quando um escândalo entra no imaginário popular:

o fato perdeu o controle sobre a própria narrativa.

Cada pessoa acrescentava alguma coisa.

Alguém conhecia alguém que conhecia alguém.

A cassete que uma pessoa tinha visto não parecia exatamente igual à cassete que outra jurava ter visto.

Apareceram versões.

Rumores.

Personagens supostos.

Locais supostos.

Frases supostas.

Detalhes supostos.

Alguns verdadeiros.

Outros provavelmente inventados.

E outros pertencentes àquela categoria maravilhosa da cultura popular:

“Não aconteceu exatamente assim, mas todo mundo lembra que aconteceu.”

Groucho Marx retorna ao recinto:

“Finalmente encontramos uma fonte histórica confiável: um sujeito no café que ouviu de um cunhado.”


😂 Portugal fez aquilo que qualquer sociedade faz diante do absurdo

Transformou em humor.

Vieram piadas.

Referências.

Imitações.

Bordões.

Insinuações televisivas.

Conversas de café.

Humoristas perceberam imediatamente que não era necessário explicar nada.

Bastava uma frase.

Uma entonação.

Uma referência.

O público completava mentalmente o resto.

E aí surge uma das expressões mais interessantes associadas à mitologia:

“Estudasses.”

Décadas depois, portugueses ainda discutem se a célebre expressão realmente aparece da maneira como a memória coletiva afirma.

Isso é maravilhoso do ponto de vista antropológico.

Porque significa que o meme ficou maior que a fonte.

A frase passou a existir independentemente da gravação.

Ela tornou-se patrimônio oral.

O cidadão poderia nunca ter visto VHS nenhum.

Mesmo assim conhecia a piada.


🎵 E a coisa entrou na música

Era inevitável.

A cultura popular portuguesa absorveu o episódio.

Uma das referências conhecidas aparece em “Na Cabana do Pai Tomás”, dos Sitiados, exemplo de como o caso deixou de pertencer apenas às páginas dos jornais e passou para o repertório humorístico e musical.

Depois vieram referências.

Samples.

Montagens.

MP3.

Paródias.

Arquivos com nomes absolutamente suspeitos.

E começou um fenômeno ainda mais interessante:

pessoas passaram a conhecer a referência sem conhecer sua origem.

Isso é o estágio final de um meme.

Quando alguém ri de uma frase sem saber exatamente por que aquela frase é engraçada, o acontecimento original já entrou no folclore.


💿 CORTA PARA 2002

Portugal.

BPN.

Um brasileiro recém-chegado tentando compreender aquele maravilhoso sistema operacional chamado:

PORTUGAL 2002 ENTERPRISE EDITION

Meu colega provavelmente percebeu rapidamente uma falha grave na minha formação.

Eu conhecia Pessoa.

Conhecia Saramago.

Conhecia alguma história portuguesa.

Mas desconhecia parte essencial do folclore contemporâneo nacional.

Era inadmissível.

Então veio o CD.

CD 17

Aquilo era praticamente um curso de integração cultural.

Esqueça treinamento corporativo.

Esqueça PowerPoint.

Esqueça Recursos Humanos.

O verdadeiro onboarding português estava num CD-R.

Eu coloquei aquilo no computador.

E comecei uma das mais curiosas aulas de antropologia da minha vida.

De repente várias frases que eu já havia ouvido começaram a fazer sentido.

Piadas que anteriormente passavam pelo meu ouvido sem autenticação receberam credenciais.

Referências televisivas começaram a encaixar.

Era como descobrir que você passou meses ouvindo chamadas para uma subrotina sem possuir o copybook.

Finalmente eu tinha o copybook.


🫏 O detalhe importante: em 2002 aquilo já era arqueologia

Treze anos haviam passado desde 1989.

Mas a história continuava viva.

Isso me impressionou.

Porque eu não estava simplesmente assistindo a um escândalo antigo.

Estava observando a transmissão de memória coletiva entre tecnologias.

Primeiro:

VHS

Depois:

cópia de VHS

Depois:

cópia da cópia da cópia

Depois:

digitalização

Depois:

CD-R

Depois:

MPG

Depois:

AVI

E então chegou a cavalaria.

🫏 eMule

Para quem não viveu aquela maravilhosa época, o eMule era uma espécie de biblioteca de Alexandria administrada por adolescentes, piratas digitais e computadores ligados durante 72 horas.

Você procurava Beethoven.

Recebia Beethoven.

Às vezes.

Nas outras ocasiões recebia alguma coisa chamada:

BEETHOVEN_COMPLETE_SYMPHONIES_FINAL_REAL_100_PERCENT.avi

E descobria que a humanidade tinha outros planos para sua noite.

Tomás Taveira encontrou ali sua segunda juventude digital.

O que havia circulado fisicamente em Lisboa agora poderia atravessar Portugal.

Brasil.

França.

Luxemburgo.

Suíça.

Qualquer lugar onde existisse um português emigrado, uma conexão ADSL e paciência suficiente.


🌍 A diáspora digital do VHS

Esse é provavelmente o aspecto mais fascinante.

A primeira geração conheceu o caso como acontecimento.

A segunda conheceu como cassete.

A terceira conheceu como arquivo.

A quarta conheceu como meme.

E a quinta talvez conheça apenas:

“Estudasses.”

Sem contexto.

Sem VHS.

Sem 1989.

Sem saber sequer quem era Tomás Taveira.

Isso é folclore.

Exatamente como uma expressão medieval pode sobreviver séculos depois de desaparecer o acontecimento que lhe deu origem.

Só que aqui conseguimos observar praticamente todas as etapas.


👨‍🏫 As duas biografias de Tomás Taveira

E aqui chegamos ao ponto que mais me fascina nessa história.

Tomás Taveira passou a possuir duas biografias simultâneas.

Biografia A — institucional

Arquiteto.

Professor.

Pós-modernismo.

MIT.

Olaias.

Amoreiras.

BNU.

Metro das Olaias.

Alvalade XXI.

Aveiro.

Leiria.

Projetos internacionais.

É uma carreira arquitetônica extensa e documentada.

Mas existe:

Biografia B — popular

A cassete.

As frases.

As imitações.

As músicas.

Os CDs.

Os AVI.

O eMule.

As piadas de café.

Os memes.

As referências que atravessaram gerações.

As duas biografias pertencem à mesma pessoa.

Mas vivem em bancos de dados culturais completamente diferentes.


🏟️ E a ironia tornou-se arquitetônica

Isso produz situações absolutamente surreais.

Você pode entrar numa obra projetada por Tomás Taveira sem conhecer Tomás Taveira.

Pode assistir futebol num estádio relacionado à sua obra.

Pode passar pelas Olaias.

Pode olhar as Amoreiras dominando parte da paisagem lisboeta.

E alguém ao seu lado pode conhecer apenas:

a piada.

Enquanto outro conhece apenas:

o arquiteto.

Dois portugueses podem falar do mesmo homem e aparentemente estar falando de pessoas completamente diferentes.

Esse é o verdadeiro fork.

TOMAS_TAVEIRA_ARCHITECT.EXE

e

TOMAS_TAVEIRA_FOLKLORE.EXE

Ambos continuam rodando.


📺 E o século XXI não executou DELETE

Esse talvez seja o detalhe mais extraordinário.

Era perfeitamente possível que tudo desaparecesse.

VHS deteriora.

CD-R deteriora.

Discos rígidos morrem.

Sites fecham.

Links quebram.

Servidores desaparecem.

Mas cultura popular possui redundância.

Uma pessoa guarda.

Outra copia.

Outra comenta.

Outra transforma em música.

Outra escreve num fórum.

Outra faz meme.

Outra pergunta:

“De onde vem essa história?”

E alguém responde.

A transmissão recomeça.

Décadas depois, o assunto ainda reaparece na imprensa e em produções culturais, enquanto discussões online continuam debatendo inclusive quais frases pertenciam realmente às gravações e quais foram acrescentadas posteriormente pela memória coletiva.

É quase um sistema distribuído.

Não existe servidor central.

Não existe administrador.

Não existe documentação.

Mas os dados sobrevivem.


🧠 O verdadeiro CD 17

Hoje percebo que aquele CD que recebi em 2002 não continha simplesmente arquivos.

Continha contexto cultural.

Meu colega do BPN estava realizando uma operação muito antiga.

A mesma operação pela qual pessoas transmitem lendas há milhares de anos.

Só havia mudado o suporte.

Antes:

“Meu avô contou ao meu pai.”

Depois:

“Tenho uma cassete.”

Em 2002:

“Leva este CD.”

Depois:

“Procura no eMule.”

Mais tarde:

“Procura no YouTube.”

Depois:

“Vi num meme.”

E provavelmente algum arqueólogo digital em 2126 encontrará uma referência perdida e perguntará:

“Mas afinal quem diabos era esse arquiteto?”


🎩 Groucho Marx fecha o arquivo

Groucho apaga o charuto.

Olha para as Amoreiras.

Olha para uma velha cassete VHS.

Olha para o CD 17.

Olha para um diretório perdido do eMule.

E finalmente declara:

“Passei a vida acreditando que a imortalidade exigia uma grande obra. Aparentemente também ajuda alguém esquecer uma cassete no lugar errado.”

E talvez essa seja a conclusão perfeita.

Tomás Taveira construiu edifícios destinados a durar décadas.

Mas paralelamente ajudou, involuntariamente, a construir algo muito mais difícil de demolir:

uma lenda popular.

Quando cheguei a Portugal em 2002, eu conhecia apenas a primeira camada daquele país.

O território.

A língua.

Os bancos.

Os cafés.

Os elétricos.

Fernando Pessoa.

Camões.

Depois veio o CD 17.

E compreendi uma verdade essencial sobre meu processo de alusitanamento:

um país não é feito apenas da história que coloca nos museus.

É feito também das histórias que conta baixinho.

Das piadas que atravessam gerações.

Dos bordões cuja origem ninguém mais sabe explicar.

Das músicas que escondem referências.

Das cassetes copiadas clandestinamente.

Dos CDs emprestados no escritório.

Dos arquivos que sobreviveram ao eMule.

E daquela pergunta inevitável que todo estrangeiro faz quando percebe que todos à mesa estão rindo menos ele:

“Espera… qual é a história?”

Foi assim que, em 2002, um colega do BPN colocou um CD-R na minha mão.

Eu pensava que estava recebendo um disco.

Na verdade estava recebendo Portugal — Disco 17 de instalação.

E aparentemente ainda faltavam os outros dezesseis.

ESTUDASSES. E agora quando ouvires uma musica xula com refrão mixado, todinho la dentro, saberá quem foi Tavera das Tascas.


https://andarilhovisitaportugal.blogspot.com/

sexta-feira, 4 de novembro de 2022

ABEND : Quando um Programa Morre em Produção, o Código do Erro é Apenas a Primeira Evidência Encontrada na Cena do Crime

 

Bellacosa Mainframe e uma analise forense aos abends em mainframe

☕ Um Café no Bellacosa Mainframe

ABEND sem Mistérios para Programadores COBOL

Quando um Programa Morre em Produção, o Código do Erro é Apenas a Primeira Evidência Encontrada na Cena do Crime

O telefone toca às 2h17 da madrugada.

Do outro lado da linha, uma voz cansada anuncia:

— O fechamento noturno parou.

No monitor, dezenas de jobs aguardam processamento. Arquivos não foram atualizados. Relatórios não foram produzidos. O sistema responsável por calcular pagamentos, atualizar saldos ou consolidar transações encerrou de maneira inesperada.

Na tela do SDSF, uma mensagem chama a atenção:

IEF450I PAGTO01 STEP010 - ABEND=S0C7

Para o programador COBOL iniciante, aquelas letras parecem uma inscrição encontrada em uma tumba antiga:

S0C7

Seria um problema no JCL?

Um erro de banco de dados?

Um campo numérico corrompido?

Uma falha do sistema operacional?

Um usuário digitou algo errado?

Ou o programa simplesmente decidiu abandonar o turno da madrugada?

No laboratório do CSI Las Vegas, ninguém olha para uma evidência isolada e imediatamente acusa o mordomo. Um fio de cabelo não resolve sozinho um homicídio. Uma impressão digital precisa de contexto. Uma mancha precisa ser analisada. Um objeto fora do lugar pode ser causa, consequência ou apenas coincidência.

No IBM Mainframe, o raciocínio deve ser exatamente o mesmo.

O ABEND não é necessariamente a causa do incidente. Ele é a primeira evidência encontrada na cena do crime.

O bom profissional não se limita a decorar que S0C7 significa “erro de dados”. Ele investiga:

  • qual instrução falhou;

  • qual programa estava em execução;

  • qual registro estava sendo processado;

  • qual era o conteúdo real do campo;

  • quem gravou aquele dado;

  • qual versão do copybook foi usada;

  • quais alterações entraram recentemente;

  • por que as validações anteriores não detectaram o problema;

  • e, principalmente, como impedir que ele aconteça novamente.

Coloque as luvas, acenda a luminária ultravioleta e abra o SDSF.

A investigação começou.


Bellacosa Mainframe e os abends mais comuns no ambiente mainframe

1. O que é realmente um ABEND?

ABEND é uma abreviação de:

ABnormal END

Ou seja, fim anormal.

Significa que um programa, uma etapa de job, uma transação ou algum componente do processamento terminou de maneira diferente da esperada.

Em um cenário normal, o programa COBOL chega ao final de sua execução e devolve um código de retorno:

MOVE 0 TO RETURN-CODE
GOBACK.

Nesse caso, tudo indica que o processamento terminou normalmente.

Mas um término anormal pode ocorrer quando:

  • o processador tenta executar uma instrução inválida;

  • o programa acessa uma região de memória não permitida;

  • uma operação decimal encontra dados incompatíveis;

  • o tempo de execução excede o limite;

  • um módulo chamado não é encontrado;

  • um arquivo não pode ser aberto;

  • o espaço em disco se esgota;

  • uma transação CICS entra em loop;

  • um comando SQL recebe timeout ou deadlock;

  • a aplicação decide interromper voluntariamente o processamento.

Portanto, dizer apenas “o programa deu ABEND” é semelhante a dizer:

“A vítima morreu.”

A frase informa o resultado, mas não explica o mecanismo, a causa, a sequência dos acontecimentos nem a responsabilidade.


2. A primeira regra da investigação: não altere a cena do crime

Um erro muito comum durante incidentes é tentar resolver o problema rápido demais.

O programador vê um S0C7, imagina que algum campo numérico está inválido e acrescenta uma inicialização:

MOVE ZEROS TO WS-VALOR

O programa deixa de cair.

Caso encerrado?

Não necessariamente.

Talvez o campo estivesse sendo sobrescrito por outro módulo. Talvez o copybook estivesse divergente. Talvez um arquivo tivesse registros com layouts diferentes. Talvez o programa anterior estivesse gravando lixo. Talvez a alteração apenas escondesse o sintoma.

No CSI, limpar a mesa antes de coletar impressões digitais seria um desastre.

No mainframe, sobrescrever datasets, excluir dumps, recompilar sem guardar evidências ou reiniciar o processamento sem documentar o estado original pode destruir pistas fundamentais.

Antes de alterar qualquer coisa, preserve:

Código do ABEND
Nome do job
Nome do step
Programa em execução
Data e horário
JOBLOG
JESMSGLG
JESJCL
JESYSMSG
SYSOUT
CEEDUMP
SYSUDUMP
Relatório do compilador
Versão do load module
Arquivo ou registro em processamento
SQLCODE e SQLSTATE
Mensagens CICS ou IMS

Essa é a cadeia de custódia digital do incidente.


3. As famílias de ABENDs

O universo do IBM Z possui diferentes categorias de falhas. A classificação ajuda a decidir onde iniciar a busca.

3.1 System ABENDs

Normalmente aparecem no formato:

Sxxx

Exemplos:

S0C1
S0C4
S0C7
S0CB
S322
S806

Esses códigos indicam condições detectadas pelo sistema, pelo processador ou por componentes do ambiente de execução.

O primeiro caractere é a letra S, de System ABEND.

Entretanto, atenção a uma curiosidade que confunde muitos iniciantes: em códigos como S0C7, o caractere depois do zero é a letra C, e não o número zero.

O código correto é:

S0C7

e não:

SOC7

Visualmente são parecidos, especialmente em algumas fontes, mas tecnicamente são diferentes.

Esse pequeno detalhe é um verdadeiro easter egg da tipografia mainframe: durante décadas, muita documentação informal escreveu “SOC7”, embora a representação correta seja “S-zero-C-sete”.

3.2 User ABENDs

Aparecem no formato:

Uxxxx

Exemplos:

U0016
U0999
U3000
U4038

São geralmente provocados deliberadamente pela aplicação, por um utilitário ou pelo Language Environment.

Um User ABEND não significa necessariamente defeito do sistema. Pode representar uma decisão controlada:

“Uma condição de negócio ou técnica tornou inseguro continuar.”

Por exemplo, uma aplicação pode interromper o processamento ao detectar que o total de controle do arquivo não coincide com o total informado no trailer.

Em vez de continuar e corromper milhares de registros, ela termina com:

U3000

Nesse caso, o ABEND é parte da proteção do sistema.

3.3 Erros de JCL e alocação

Alguns incidentes ocorrem antes mesmo de o programa COBOL executar sua primeira instrução.

Exemplos:

  • erro de sintaxe no JCL;

  • DDNAME ausente;

  • dataset não catalogado;

  • disposição incompatível;

  • volume indisponível;

  • DCB incorreto;

  • espaço insuficiente;

  • membro inexistente na biblioteca.

A mensagem mais importante pode estar no JESYSMSG ou em mensagens IEC, IEF e IGD, e não no código COBOL.

3.4 Erros DB2

No ambiente DB2, muitas falhas são identificadas por:

SQLCODE
SQLSTATE
REASON CODE
RESOURCE NAME

Exemplos conhecidos:

-805
-818
-904
-911
-913
-922

Esses códigos podem aparecer antes de um User ABEND gerado pela própria aplicação. Portanto, o Uxxxx pode ser apenas a embalagem; a causa verdadeira está no SQLCODE.

3.5 ABENDs CICS

No CICS, encontramos códigos como:

ASRA
AICA
APCT
AEY9
AEI0
AKCP

Eles dizem respeito a transações, programas, comandos EXEC CICS, proteção de storage, tempo de execução, recursos e outras condições do ambiente online.

3.6 Condições IMS

No IMS, a investigação pode envolver:

  • status codes DL/I;

  • PSB;

  • PCB;

  • DBD;

  • ACB;

  • região IMS;

  • mensagem de entrada;

  • checkpoint;

  • chamadas GU, GN, ISRT, REPL ou DLET.

Em outras palavras, cada família possui seu próprio laboratório criminalístico.


4. S0C1 — a instrução que não deveria existir

O S0C1 significa, em termos gerais, Operation Exception.

O processador tentou executar uma sequência de bytes que não representa uma instrução válida naquele contexto.

Imagine que o programa deveria saltar para o endereço de uma rotina:

ENDEREÇO 000A3000

Mas, devido a um ponteiro corrompido ou retorno inválido, ele salta para uma área contendo dados:

F1F2F3F4

Esses bytes podem representar os caracteres “1234” em EBCDIC, mas o processador tenta interpretá-los como instruções de máquina.

O resultado é uma operação inválida.

Possíveis causas:

  • endereço de retorno destruído;

  • CALL para módulo incorreto;

  • incompatibilidade de parâmetros;

  • load module corrompido;

  • execução desviada para área de dados;

  • armazenamento sobrescrito;

  • uso incorreto de ponteiros;

  • versão errada de programa carregada.

O S0C1 costuma exigir análise de PSW, registradores e offset.

Não é um ABEND que se resolve apenas procurando uma variável com valor estranho.


5. S0C4 — invasão de propriedade digital

O S0C4 está associado a condições como Protection Exception ou outros problemas de endereçamento, dependendo do código de razão.

Em linguagem simples, o programa tentou acessar uma área de memória de maneira inválida.

Imagine um hotel em Las Vegas.

O programa possui a chave do quarto 3270, mas tenta entrar no quarto 0, em um andar inexistente ou numa área restrita do hotel.

O sistema operacional funciona como o segurança:

“Você não tem permissão para acessar esse endereço.”

Entre as causas mais comuns estão:

  • índice ou subscrito fora dos limites;

  • parâmetro ausente em um CALL;

  • definição errada na LINKAGE SECTION;

  • ponteiro nulo ou inválido;

  • diferença de layout entre programa chamador e chamado;

  • sobreposição de storage;

  • tabela acessada além da quantidade de ocorrências;

  • endereço de arquivo ou área de comunicação corrompido.

Considere:

01  WS-TABELA.
    05 WS-ITEM OCCURS 10 TIMES.
       10 WS-CODIGO PIC X(05).

01  WS-INDICE PIC 99.

MOVE 15 TO WS-INDICE
MOVE 'ABCDE' TO WS-CODIGO(WS-INDICE)

A tabela possui dez posições, mas o programa tenta acessar a posição quinze.

Dependendo do compilador, das opções de runtime e da organização do storage, o programa pode:

  • gerar uma condição detectável;

  • sobrescrever outra variável;

  • continuar silenciosamente;

  • cair mais tarde em outro ponto;

  • produzir S0C4;

  • provocar um S0C7 aparentemente sem relação.

Esse é um detalhe fundamental: o local onde o programa cai pode não ser o local onde o problema começou.

A vítima pode ter sido encontrada no cassino, mas o crime ocorreu no estacionamento.


6. S0C7 — o famoso dado decimal inválido

O S0C7 é provavelmente o ABEND mais conhecido entre programadores COBOL.

Ele ocorre quando uma instrução decimal tenta operar sobre um conteúdo que não possui representação decimal válida.

Considere:

01  WS-VALOR PIC S9(05)V99 COMP-3.

Esse campo utiliza formato decimal compactado, também chamado packed decimal.

Em COMP-3, cada dígito ocupa meio byte, e o último nibble contém o sinal.

Um valor válido poderia estar representado internamente como:

12 34 56 7C

O nibble C representa sinal positivo.

Se a área contiver algo como:

12 3A 56 7C

o nibble A apareceu em uma posição onde deveria existir um dígito de zero a nove.

Ao executar uma operação aritmética, o hardware detecta que aquilo não é um decimal válido e provoca uma data exception: S0C7.

De onde vem o dado inválido?

As causas mais comuns incluem:

  • campo não inicializado;

  • arquivo com layout diferente;

  • registro curto;

  • MOVE de campo alfanumérico para área redefinida;

  • REDEFINES incorreto;

  • copybook divergente;

  • parâmetro enviado com tamanho errado;

  • sobrescrita de memória;

  • processamento de header ou trailer como detalhe;

  • conteúdo hexadecimal incompatível;

  • arquivo convertido de ASCII para EBCDIC de maneira inadequada.

Exemplo clássico:

01  REGISTRO-ENTRADA.
    05 TP-REGISTRO PIC X.
    05 VALOR       PIC 9(07).

READ ARQ-ENTRADA
ADD VALOR TO WS-TOTAL

O programa pressupõe que todos os registros possuem o mesmo layout.

Mas o arquivo contém:

H20260725ARQUIVO DE PAGAMENTOS
D0001250
D0003300
TTOTAL=0000002

Quando o programa tenta somar o campo VALOR do trailer, pode encontrar letras no lugar de dígitos.

A solução correta não é simplesmente substituir tudo por zero. É interpretar o tipo de registro:

EVALUATE TP-REGISTRO
    WHEN 'H'
        PERFORM TRATAR-HEADER
    WHEN 'D'
        PERFORM TRATAR-DETALHE
    WHEN 'T'
        PERFORM TRATAR-TRAILER
    WHEN OTHER
        PERFORM TRATAR-REGISTRO-INVALIDO
END-EVALUATE

7. S0CB — divisão por zero

O S0CB representa uma exceção decimal associada, frequentemente, à divisão por zero.

Exemplo:

COMPUTE WS-MEDIA =
    WS-TOTAL / WS-QUANTIDADE

Se:

WS-QUANTIDADE = 0

a operação não possui resultado matemático definido.

A prevenção é simples:

IF WS-QUANTIDADE > ZERO
    COMPUTE WS-MEDIA =
        WS-TOTAL / WS-QUANTIDADE
ELSE
    MOVE ZERO TO WS-MEDIA
    DISPLAY 'QUANTIDADE INVALIDA PARA CALCULO'
END-IF

Mas existe uma pergunta mais profunda:

Por que a quantidade chegou a zero?

Talvez o arquivo estivesse vazio. Talvez nenhum registro tenha passado pelas validações. Talvez o contador não tenha sido incrementado. Talvez o programa tenha lido o arquivo errado.

Evitar o ABEND é importante. Entender o cenário de negócio é indispensável.


8. S0CC e overflow decimal

Um overflow ocorre quando o resultado excede a capacidade do campo de destino.

Exemplo:

01  WS-TOTAL PIC 9(05).

MOVE 99999 TO WS-TOTAL
ADD 1 TO WS-TOTAL

O campo suporta, no máximo:

99999

O resultado:

100000

precisaria de seis dígitos.

Dependendo da instrução gerada, opções do compilador e contexto, poderá ocorrer uma exceção decimal ou truncamento.

A defesa COBOL inclui:

ADD WS-VALOR TO WS-TOTAL
    ON SIZE ERROR
        DISPLAY 'OVERFLOW NO TOTAL'
        MOVE 12 TO RETURN-CODE
    NOT ON SIZE ERROR
        CONTINUE
END-ADD

A cláusula ON SIZE ERROR é como o detector de fumaça do programa. Ela não impede que o calor aumente, mas permite reagir antes que o edifício inteiro pegue fogo.


9. S322 — o programa que nunca voltou

O S322 geralmente indica que o tempo permitido para execução foi excedido.

Causas comuns:

  • loop infinito;

  • arquivo gigantesco;

  • algoritmo ineficiente;

  • parâmetro TIME muito baixo;

  • espera excessiva;

  • leitura repetida do mesmo registro;

  • cursor DB2 mal controlado;

  • condição de saída impossível.

Exemplo perigoso:

PERFORM UNTIL WS-FIM = 'S'
    READ ARQ-ENTRADA
        AT END
            MOVE 'S' TO WS-FIM
    END-READ

    PERFORM PROCESSAR-REGISTRO
END-PERFORM

Parece correto.

Mas suponha que PROCESSAR-REGISTRO mova acidentalmente espaço para WS-FIM. O programa poderá continuar tentando ler após o fim do arquivo ou entrar em comportamento imprevisível.

Outro clássico:

PERFORM VARYING WS-I FROM 1 BY 1
    UNTIL WS-I = 10

Nesse caso, o loop processa de 1 a 9. Porém, se o incremento ou a condição estiverem incorretos:

PERFORM VARYING WS-I FROM 1 BY 2
    UNTIL WS-I = 10

os valores serão:

1, 3, 5, 7, 9, 11, 13...

A condição WS-I = 10 nunca será verdadeira.

Esse é o tipo de detalhe que faria Gil Grissom observar calmamente:

“O problema não está no corpo. Está no padrão.”


10. S806 — o módulo desaparecido

O S806 indica que o sistema não conseguiu localizar ou carregar o módulo solicitado.

Exemplo:

CALL 'CALCJURO' USING AREA-CALCULO

O programa CALCJURO precisa estar disponível em uma biblioteca acessível ao carregador.

No batch, isso normalmente envolve:

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

Possíveis causas:

  • membro não existe;

  • nome incorreto no CALL;

  • STEPLIB ausente;

  • JOBLIB incorreta;

  • biblioteca não catalogada;

  • módulo foi compilado, mas não link-editado;

  • versão instalada em outro ambiente;

  • biblioteca concatenada na ordem errada;

  • alias inexistente;

  • módulo deletado ou renomeado.

Um detalhe importante: a ordem de concatenação importa.

//STEPLIB DD DSN=EMPRESA.LOAD.TESTE,DISP=SHR
//        DD DSN=EMPRESA.LOAD.PROD,DISP=SHR

Se o mesmo módulo existir nas duas bibliotecas, a primeira ocorrência encontrada será carregada.

Você pode pensar que está executando a versão de produção, enquanto o sistema está carregando uma versão antiga de teste.

Essa é a versão mainframe do suspeito com identidade falsa.


11. Os ABENDs de espaço: SB37, SD37 e SE37

Arquivos sequenciais, temporários, relatórios e operações de SORT podem exigir mais espaço do que o previsto.

Um JCL pode conter:

//SAIDA DD DSN=EMPRESA.RELATORIO,
//         DISP=(NEW,CATLG,DELETE),
//         SPACE=(CYL,(5,2)),
//         DCB=(RECFM=FB,LRECL=200,BLKSIZE=0)

O sistema aloca cinco cilindros primários e permite extensões secundárias de dois cilindros.

Se o arquivo crescer demais, poderá ocorrer um ABEND relacionado a espaço.

De maneira simplificada:

  • SB37: não foi possível obter mais espaço;

  • SD37: não havia especificação secundária suficiente ou disponível;

  • SE37: o dataset atingiu limite de extensões ou não conseguiu expandir adequadamente.

A correção pode envolver:

  • aumentar espaço primário;

  • aumentar espaço secundário;

  • rever unidade de alocação;

  • utilizar RLSE;

  • avaliar DATACLAS;

  • permitir volumes adicionais;

  • usar dataset estendido;

  • melhorar estimativa;

  • excluir dados desnecessários;

  • revisar a lógica que está produzindo volume excessivo.

Mas cuidado: aumentar espaço sem investigar pode apenas alimentar um programa em loop que está gravando registros infinitamente.

Nunca entregue um armazém maior ao suspeito antes de descobrir por que ele acumulou cinco milhões de caixas.


12. CICS: quando o crime acontece online

No batch, temos jobs e steps. No CICS, temos transações e tasks.

ASRA

O ASRA normalmente indica que um programa de aplicação sofreu uma exceção, como S0C4 ou S0C7, dentro do ambiente CICS.

A investigação deve considerar:

  • programa em execução;

  • offset;

  • comando EXEC CICS anterior;

  • COMMAREA;

  • channels e containers;

  • dados de tela;

  • mapa BMS;

  • recursos acessados;

  • dump da transação.

APCT

O APCT geralmente está relacionado a programa não encontrado, não habilitado ou problema na definição do programa.

É o primo online do S806.

Verifique:

  • definição PROGRAM;

  • nome solicitado;

  • CSD;

  • estado ENABLED;

  • NEWCOPY ou PHASEIN;

  • biblioteca DFHRPL;

  • região correta.

AICA

O AICA indica que a task excedeu o tempo permitido sem devolver controle adequadamente ao CICS.

Causa comum:

PERFORM UNTIL CONDICAO-FINAL
    PERFORM PROCESSAMENTO
END-PERFORM

sem comandos CICS que permitam gerenciamento adequado da task ou com condição de saída incorreta.

AEY9

Frequentemente relacionado à indisponibilidade de uma conexão, especialmente em cenários envolvendo DB2, dependendo do contexto.

O código isolado nunca é suficiente. Consulte mensagens associadas e estado dos recursos.


13. DB2: o ABEND pode ser apenas o envelope

Considere um programa COBOL-DB2:

EXEC SQL
    SELECT SALDO
      INTO :WS-SALDO
      FROM CONTA
     WHERE NUM_CONTA = :WS-CONTA
END-EXEC

Depois do comando, o programa precisa verificar:

EVALUATE SQLCODE
    WHEN 0
        CONTINUE
    WHEN 100
        DISPLAY 'CONTA NAO ENCONTRADA'
    WHEN OTHER
        DISPLAY 'ERRO SQL: ' SQLCODE
        PERFORM TRATAR-ERRO-DB2
END-EVALUATE

Alguns códigos importantes:

SQLCODE -805

Package não encontrado ou combinação de localização, coleção, package e consistência incompatível.

Investigue:

  • BIND;

  • COLLECTION;

  • PACKAGE;

  • PLAN;

  • DBRM;

  • versão implantada.

SQLCODE -818

Timestamp de consistência do programa não corresponde ao DBRM ou package.

É o famoso caso em que programa e package parecem casados, mas o exame de DNA revela que pertencem a compilações diferentes.

SQLCODE -911 e -913

Relacionados a deadlock ou timeout.

Pode haver rollback. A aplicação precisa entender o estado da unidade de trabalho antes de simplesmente repetir o processamento.

SQLCODE -904

Recurso indisponível.

A mensagem contém reason code e resource name, fundamentais para a investigação.

SQLCODE -922

Problema de autorização.

Pode envolver RACF, privilégios DB2, plano, package ou identidade de execução.


14. O dump: a autópsia digital

Quando o programa termina anormalmente, o dump pode registrar o estado do processo no momento da falha.

Dependendo da configuração, você pode encontrar:

SYSUDUMP
SYSABEND
SYSMDUMP
CEEDUMP
IPCSDUMP
CICS Transaction Dump

No dump, procure:

  • nome do programa;

  • código da condição;

  • PSW;

  • registradores;

  • endereço da falha;

  • offset;

  • traceback;

  • cadeia de chamadas;

  • parâmetros;

  • conteúdo das áreas;

  • mensagens do Language Environment.

O que é o PSW?

PSW significa Program Status Word.

Ele contém informações sobre o estado do processador, incluindo o endereço da instrução associada à interrupção.

Pode ser comparado à última coordenada registrada pelo GPS da vítima.

O que são os registradores?

A arquitetura IBM Z possui registradores de uso geral. Durante a execução, eles podem conter:

  • endereços;

  • contadores;

  • parâmetros;

  • ponteiros;

  • resultados intermediários.

Em análises de S0C4, observar registradores pode revelar que o programa tentou acessar endereço zero, um endereço muito baixo ou uma área incompatível.

O que é o offset?

O offset indica a distância entre o início do módulo e a instrução problemática.

Exemplo:

Programa: PAGTO001
Offset:   X'00001A7C'

Com o listing da compilação, é possível relacionar esse offset à instrução COBOL correspondente.

Esse processo é uma das competências mais valiosas em suporte mainframe.


15. Passo a passo de investigação

Aqui está um procedimento prático para programadores iniciantes.

Passo 1 — Identifique o incidente

Registre:

Job
Step
Procstep
Programa
Código do ABEND
Horário
Ambiente

Exemplo:

JOB:      FATU001
STEP:     STEP030
PROGRAMA: PGMFAT03
ABEND:    S0C7
AMBIENTE: PRODUÇÃO

Passo 2 — Leia o JOBLOG inteiro

Não procure apenas a linha contendo o ABEND.

Mensagens anteriores podem informar:

  • falha de abertura;

  • dataset incorreto;

  • SQLCODE;

  • warning;

  • arquivo vazio;

  • registro rejeitado;

  • módulo carregado;

  • condição LE.

Passo 3 — Localize o ponto da falha

Use:

  • offset;

  • traceback;

  • listing;

  • compilação com opções adequadas;

  • ferramentas de debugging;

  • Fault Analyzer, Abend-AID ou equivalentes, quando disponíveis.

Passo 4 — Examine os dados

Descubra:

  • qual registro estava sendo lido;

  • qual chave estava sendo processada;

  • qual campo estava inválido;

  • qual era o conteúdo hexadecimal;

  • se o layout corresponde ao arquivo.

Passo 5 — Verifique entradas e dependências

Analise:

  • JCL;

  • PROC;

  • PARM;

  • SYSIN;

  • datasets;

  • GDGs;

  • tabelas DB2;

  • módulos chamados;

  • copybooks;

  • versões instaladas.

Passo 6 — Consulte alterações recentes

Pergunte:

  • houve mudança no programa?

  • no copybook?

  • no arquivo?

  • na tabela DB2?

  • no BIND?

  • na segurança?

  • no agendamento?

  • no processo anterior?

Passo 7 — Reproduza controladamente

Monte um teste com:

  • mesmo registro;

  • mesma versão;

  • mesmo layout;

  • dados reduzidos;

  • ambiente seguro;

  • dumps habilitados.

Passo 8 — Corrija a causa

Não apenas o sintoma.

Passo 9 — Execute regressão

Teste:

  • cenário que falhou;

  • cenário normal;

  • limites;

  • arquivo vazio;

  • valores máximos;

  • dados inválidos;

  • retorno de chamadas;

  • erros de SQL.

Passo 10 — Documente

Registre:

Sintoma
Causa raiz
Evidência
Correção
Teste
Prevenção
Procedimento de recuperação

Essa documentação transforma um incidente em conhecimento institucional.


16. Como prevenir ABENDs

Um programa robusto não é aquele que nunca encontra erros. É aquele que detecta condições anormais antes que elas se transformem em corrupção ou interrupção descontrolada.

Use validações:

IF CAMPO-NUMERICO IS NUMERIC
    COMPUTE WS-RESULTADO = CAMPO-NUMERICO * 10
ELSE
    DISPLAY 'CAMPO INVALIDO: ' CAMPO-NUMERICO
    PERFORM TRATAR-REGISTRO-INVALIDO
END-IF

Verifique file status:

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

Após operações:

OPEN INPUT ARQ-CLIENTE

IF WS-FILE-STATUS NOT = '00'
    DISPLAY 'ERRO NO OPEN: ' WS-FILE-STATUS
    MOVE 12 TO RETURN-CODE
    GOBACK
END-IF

Use ON SIZE ERROR, avalie SQLCODE, valide limites de tabelas, inicialize estruturas e trate retornos de programas chamados.

Também utilize opções de compilação e ferramentas de teste que ajudem a detectar:

  • subscritos inválidos;

  • dados não inicializados;

  • incompatibilidade de parâmetros;

  • problemas de storage;

  • caminhos não testados.


17. Curiosidades da sala de evidências

Curiosidade 1 — Um S0C7 pode ser causado por um erro de tabela

O programa acessa uma posição inexistente, sobrescreve um campo COMP-3 e só cai minutos depois, quando tenta somá-lo.

O ABEND é decimal, mas a causa raiz é endereçamento.

Curiosidade 2 — Reiniciar pode mudar o sintoma

Depois de um restart, o programa pode processar registros diferentes, usar outro volume, encontrar locks distintos ou carregar outra versão.

O fato de funcionar após reinício não prova que o problema desapareceu.

Curiosidade 3 — Um User ABEND pode ser sinal de maturidade

Aplicações críticas preferem encerrar de maneira controlada a continuar com dados inconsistentes.

Curiosidade 4 — O registro culpado pode ter sido criado meses antes

Um dado inválido pode permanecer armazenado até que uma nova rotina tente utilizá-lo numericamente.

Curiosidade 5 — O programa que caiu pode ser inocente

Ele apenas recebeu dados corrompidos de um sistema anterior.

No CSI, isso seria o equivalente a encontrar a arma na mão de alguém que apenas a recolheu do chão.


18. O easter egg do laboratório

Em determinado episódio imaginário de CSI z/OS: Las Vegas Batch Unit, a equipe encontra um cartão perfurado escondido atrás de um terminal 3270.

No cartão, está escrito:

IDENTIFICATION DIVISION.
PROGRAM-ID. GILGRISS.

Ao lado, uma mensagem:

THE EVIDENCE NEVER LIES.
THE DATA SOMETIMES DOES.

A primeira frase homenageia a filosofia investigativa da série.

A segunda pertence ao mundo COBOL.

Porque bytes não possuem intenção, mas podem possuir:

  • layout errado;

  • sinal inválido;

  • codificação inesperada;

  • origem desconhecida;

  • tamanho incompatível;

  • histórico comprometido.

O dado não “mente” no sentido humano. Porém, quando interpretado por um layout incorreto, ele pode contar uma história completamente falsa.


Conclusão — O ABEND não é o fim

Para o iniciante, o ABEND parece uma parede.

Para o profissional experiente, ele é uma porta.

Atrás dela estão:

  • a arquitetura do z/OS;

  • a representação de dados COBOL;

  • o funcionamento do processador;

  • o Language Environment;

  • a alocação de datasets;

  • a integração com DB2;

  • a execução transacional no CICS;

  • os mecanismos do IMS;

  • a segurança RACF;

  • os processos de compilação, link-edit e implantação.

Aprender ABENDs não significa decorar listas.

Significa aprender a investigar sistemas.

Quando aparecer um S0C7, não pergunte apenas:

“Qual campo está inválido?”

Pergunte também:

“Como ele ficou inválido?”

Quando aparecer um S806, não pergunte apenas:

“Onde está o módulo?”

Pergunte:

“Qual biblioteca deveria fornecer esse módulo e por que a cadeia de implantação não o disponibilizou?”

Quando surgir um S322, não aumente imediatamente o parâmetro TIME.

Pergunte:

“O volume realmente cresceu ou o programa deixou de avançar?”

O programador comum procura uma correção rápida.

O investigador mainframe procura a sequência completa dos acontecimentos.

E quando as luzes do data center diminuem, os jobs aguardam na fila e um código hexadecimal aparece no monitor, lembre-se:

O ABEND não é a conclusão da história. É o momento em que o sistema começa a contar o que aconteceu.

No laboratório Bellacosa Mainframe, cada byte deixa uma marca.

Cada dump preserva uma cena.

Cada registrador guarda uma posição.

Cada mensagem possui um horário.

E cada programa que terminou de forma anormal ainda tem muito a dizer — desde que o investigador saiba onde procurar.

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