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

Translate

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

sexta-feira, 6 de outubro de 2023

MIB Entra no CPD — O Dia em que o Agente J Descobriu no Spufi que o Alienígena Era Só um SELECT no SYSIBM

 

Bellacosa Mainframe explorando o ISPF DB e Spufi

☕ Um Café no Bellacosa Mainframe

MIB Entra no CPD — O Dia em que o Agente J Descobriu No Spufi que o Alienígena Era Só um SELECT no SYSIBM

Ou: como TSO/E, ISPF, o menu DB, DB2I, SPUFI, catálogo Db2, SQLCODE e alguns datasets transformam a primeira tela verde do z/OS em uma investigação digna dos Homens de Preto

Há um momento curioso na vida de praticamente todo iniciante em mainframe.

Ele recebe um USER-ID, abre um emulador 3270, faz logon no z/OS e encontra uma tela cheia de opções, siglas e nomes que parecem ter sido escritos por alguma organização secreta do governo.

TSO.

ISPF.

DB.

DB2I.

SPUFI.

SYSIBM.

Para alguém vindo de Windows, Linux, VS Code, Java, Python ou bancos de dados gráficos, isso pode parecer menos um ambiente de desenvolvimento e mais a porta de entrada de uma base subterrânea dos MIB — Men in Black.

O agente novato olha para a tela.

O agente veterano coloca os óculos escuros.

— Não se preocupe. O alienígena é só um dataset.

E é exatamente assim que começaremos esta missão.

Nosso objetivo é entender, passo a passo, como um programador COBOL iniciante entra no z/OS, passa pelo TSO/E, encontra o ISPF, acessa o menu relacionado ao Db2, chega ao DB2I, entra no SPUFI e finalmente utiliza SQL para investigar o catálogo do próprio banco através das tabelas SYSIBM.

Nada de neuralizador.

Nada de nave espacial.

Só mainframe.

O que, dependendo do dia, pode ser mais assustador.



1. Caso MIB-0001 — afinal, o que é o z/OS?

Antes de investigar o ISPF, precisamos estabelecer a cena do crime.

O z/OS é o sistema operacional utilizado nos mainframes IBM Z.

Ele administra coisas como:

  • memória;

  • processadores;

  • jobs;

  • datasets;

  • segurança;

  • subsistemas;

  • comunicação;

  • transações;

  • bancos de dados;

  • aplicações críticas.

Ou seja, quando você entra no ambiente, não está “entrando no ISPF”.

Você está entrando em um universo muito maior.

Podemos imaginar:

IBM Z
  │
  ▼
z/OS
  │
  ├── JES2
  ├── TSO/E
  ├── RACF
  ├── Db2
  ├── CICS
  ├── IMS
  └── outras centenas de componentes

O ISPF é apenas uma das formas de interagir com esse universo.

É como a recepção da sede dos MIB.

A sede é enorme.

A recepção é só onde você começa a andar.



2. Primeiro contato: o TSO/E

O usuário normalmente acessa o ambiente através de um terminal ou emulador 3270.

Depois do logon, entra no TSO/E.

TSO significa:

Time Sharing Option

O TSO/E fornece uma interface interativa para usuários do z/OS.

Uma simplificação útil é:

Usuário
   │
   ▼
Emulador 3270
   │
   ▼
TSO/E
   │
   ▼
ISPF

O TSO/E permite executar comandos, iniciar programas e trabalhar de forma interativa.

Mas trabalhar diretamente no TSO seria menos amigável.

Foi aí que o ISPF virou protagonista.



3. Caso MIB-0002 — o que é ISPF?

ISPF significa:

Interactive System Productivity Facility

Ele é um ambiente interativo baseado em painéis, menus, comandos e serviços.

Para um iniciante, a melhor frase é:

ISPF é a bancada de trabalho interativa do usuário no z/OS.

Não é o sistema operacional.

Não é o TSO.

Não é o Db2.

Ele funciona sobre o TSO/E e fornece uma interface muito mais organizada para tarefas do dia a dia.

Pense assim:

z/OS = cidade inteira

TSO/E = seu acesso à cidade

ISPF = seu escritório dentro dela

No ISPF você pode:

  • editar datasets;

  • visualizar membros de PDS/PDSE;

  • trabalhar com JCL;

  • navegar por utilitários;

  • chamar ferramentas;

  • acessar produtos instalados;

  • executar comandos;

  • utilizar interfaces de sistemas como Db2.

Uma tela típica pode mostrar algo parecido com:

0  Settings
1  View
2  Edit
3  Utilities
4  Foreground
5  Batch
6  Command
...

Só que existe um detalhe importante.

O ISPF é altamente customizável.

Cada empresa pode adicionar suas próprias opções.

Por isso, você pode encontrar:

DB
SDSF
CICS
IMS
MQ
ENDEVOR
FILEAID
ISPW

e outras opções que não fazem parte necessariamente do menu padrão.



4. Alerta MIB: não confunda 3270 com ISPF

Esse erro é extremamente comum.

O iniciante olha para a tela preta ou verde e diz:

“Estou no ISPF.”

Talvez esteja.

Mas a tela em si é geralmente exibida através de um terminal ou emulador 3270.

O 3270 é uma tecnologia de terminal.

O ISPF é um ambiente de software.

Portanto:

Emulador 3270
       │
       ▼
     TSO/E
       │
       ▼
      ISPF

É como confundir o monitor com o Windows.

O monitor mostra.

O sistema executa.

No mainframe, a diferença também existe.



5. Caso MIB-0003 — o misterioso menu DB

Agora chegamos à parte que mais confunde quem está começando.

Você está no ISPF e alguém diz:

“Digite DB.”

O iniciante pensa:

— Então DB é o Db2?

Não necessariamente.

O DB geralmente é uma opção de menu criada ou configurada pela instalação para chegar a ferramentas relacionadas ao Db2.

Em alguns ambientes pode aparecer como:

DB

Em outros:

DB2

Em outros ainda pode haver uma opção numérica.

Portanto, não existe uma lei universal dizendo:

DB = opção padrão do ISPF

O que normalmente acontece é algo parecido com:

ISPF
  │
  ▼
DB
  │
  ▼
DB2I

Ou seja, DB é a porta.

O Db2 continua do outro lado.



6. DB2I — a sala de equipamentos dos agentes

DB2I significa:

Db2 Interactive

Ele é um conjunto tradicional de painéis ISPF para interagir com funções relacionadas ao Db2 for z/OS.

Dentro dele você pode encontrar opções como:

SPUFI
DCLGEN
PROGRAM PREPARATION
COMMANDS
UTILITIES

Os nomes e números podem variar.

Mas a ideia é:

ISPF
  │
  ▼
DB
  │
  ▼
DB2I
  │
  ├── SPUFI
  ├── DCLGEN
  ├── preparação
  └── outras funções

O DB2I não é o banco.

Ele é uma interface.

Isso precisa ficar muito claro.



7. Caso MIB-0004 — SPUFI entra em cena

Agora encontramos um dos instrumentos mais clássicos do programador Db2 no z/OS:

SPUFI

O nome significa:

SQL Processor Using File Input

O nome é praticamente uma confissão.

Ele processa SQL usando um arquivo de entrada.

Ou, em linguagem mainframe:

um dataset de entrada.

A filosofia é:

dataset com SQL
      │
      ▼
    SPUFI
      │
      ▼
 Db2 for z/OS
      │
      ▼
resultado
      │
      ▼
dataset de saída

Quem vem de ferramentas modernas espera abrir um editor SQL e clicar em “Run”.

No SPUFI, a cultura é outra.

Você informa um dataset com SQL.

O SPUFI lê.

Executa.

E grava o resultado.

MIB aprovaria.

Tudo documentado.

Tudo rastreável.

Nada de clicar em um botão misterioso e esperar o universo colaborar.



8. Como funciona a tela do SPUFI?

Você pode encontrar campos semelhantes a:

INPUT DATA SET NAME  ===> USER.SQLIN

OUTPUT DATA SET NAME ===> USER.SQLOUT

EDIT INPUT           ===> YES

EXECUTE              ===> YES

BROWSE OUTPUT        ===> YES

Algumas telas também incluem opções relacionadas a:

AUTOCOMMIT
CHANGE DEFAULTS

A ideia do fluxo é:

EDIT
  │
  ▼
EXECUTE
  │
  ▼
BROWSE

Primeiro você edita o SQL.

Depois executa.

Depois lê o resultado.

Simplicidade antiga.

Mas extremamente eficiente.


9. Primeira missão SPUFI

O primeiro SQL de laboratório pode ser:

SELECT CURRENT DATE,
       CURRENT TIME
FROM SYSIBM.SYSDUMMY1;

Isso testa se:

  • SPUFI está funcionando;

  • você está conectado a um Db2;

  • o Db2 está respondendo;

  • seu ambiente está minimamente configurado.

SYSIBM.SYSDUMMY1 é uma tabela especial muito usada para executar expressões simples.

Você pode consultar:

SELECT CURRENT USER
FROM SYSIBM.SYSDUMMY1;

ou:

SELECT CURRENT TIMESTAMP
FROM SYSIBM.SYSDUMMY1;

Esses comandos são excelentes para o primeiro contato.


10. E qual Db2 estou usando?

Essa pergunta é ótima.

Num z/OS podem existir vários subsistemas Db2.

Por exemplo:

DB2D  desenvolvimento
DB2H  homologação
DB2P  produção

Esses nomes são apenas exemplos.

O identificador do subsistema é chamado normalmente de:

SSID — Subsystem Identifier

No DB2I você pode encontrar um campo parecido com:

DB2 SUBSYSTEM ID ===> DB2D

Isso ajuda a identificar o subsistema utilizado.

Seu USER-ID pode ter acesso a um e não a outro.

Por exemplo:

USER123
  │
  ├── DB2D → acesso
  ├── DB2H → acesso limitado
  └── DB2P → sem acesso

E isso é muito importante:

acessar um subsistema não significa poder fazer qualquer coisa dentro dele.


11. Identidade dentro do Db2

Depois de entrar no SPUFI, uma boa consulta é:

SELECT CURRENT USER,
       CURRENT SQLID,
       CURRENT SERVER
FROM SYSIBM.SYSDUMMY1;

Isso ajuda a responder:

  • quem sou eu para o Db2?

  • qual SQLID está sendo usado?

  • qual servidor/local location está associado à sessão?

Só tenha cuidado:

CURRENT SERVER não é obrigatoriamente o mesmo nome do SSID.

No mundo Db2, nomes de location, subsystem e ambiente podem ter relações que nem sempre são idênticas.

Não trate tudo como sinônimo.


12. Caso MIB-0005 — o que é SYSIBM?

Agora começa a investigação de verdade.

O Db2 não guarda apenas dados de negócio.

Ele também guarda informações sobre os próprios objetos.

Imagine uma aplicação com:

CLIENTES
CONTAS
PEDIDOS
PRODUTOS

Essas tabelas guardam dados.

Mas o Db2 também precisa saber:

  • quais tabelas existem;

  • quais colunas possuem;

  • quais índices existem;

  • quais views existem;

  • quais constraints foram definidas;

  • quais tipos de dados existem;

  • quem criou determinados objetos.

Essas informações são chamadas de:

metadados

E boa parte desses metadados está registrada em tabelas de catálogo.

Muitas delas estão associadas ao schema:

SYSIBM

Portanto:

Dados
│
├── CLIENTES
├── PEDIDOS
└── CONTAS

Metadados
│
└── SYSIBM
     ├── SYSTABLES
     ├── SYSCOLUMNS
     ├── SYSINDEXES
     └── ...

Uma analogia excelente:

SYSIBM é como a biblioteca administrativa do Db2.

Lá o banco guarda informação sobre o próprio universo.


13. SYSTABLES — “mostre-me os objetos”

Uma das tabelas mais importantes é:

SYSIBM.SYSTABLES

Podemos consultar:

SELECT CREATOR,
       NAME,
       TYPE
FROM SYSIBM.SYSTABLES
WHERE CREATOR = 'SYSIBM'
FETCH FIRST 20 ROWS ONLY;

Isso permite visualizar objetos cadastrados no catálogo.

Aqui aprendemos três partes fundamentais do SQL:

SELECT
FROM
WHERE

Ou seja:

SELECT → o que quero ver
FROM   → de onde quero buscar
WHERE  → quais registros quero

Simples.

Mas poderoso.


14. SYSCOLUMNS — “agente, descreva o suspeito”

Encontramos uma tabela.

Agora queremos saber quais colunas ela possui.

Consultamos:

SYSIBM.SYSCOLUMNS

Por exemplo:

SELECT TBCREATOR,
       TBNAME,
       NAME,
       COLNO,
       COLTYPE,
       LENGTH
FROM SYSIBM.SYSCOLUMNS
WHERE TBCREATOR = 'SYSIBM'
  AND TBNAME = 'SYSTABLES'
ORDER BY COLNO;

Agora o próprio Db2 está descrevendo uma tabela do próprio catálogo.

É quase um interrogatório recursivo.

E isso é extremamente útil quando recebemos um programa COBOL antigo.


15. SYSINDEXES — seguindo as pegadas

Se queremos investigar índices:

SYSIBM.SYSINDEXES

Podemos usar algo semelhante a:

SELECT CREATOR,
       NAME,
       TBCREATOR,
       TBNAME
FROM SYSIBM.SYSINDEXES
WHERE TBCREATOR = 'SYSIBM'
  AND TBNAME = 'SYSTABLES';

Agora conseguimos responder:

existem índices relacionados a esta tabela?

Para manutenção de aplicações, isso é uma informação valiosa.


16. O catálogo como ferramenta de investigação

É aqui que o iniciante começa a crescer.

Em vez de perguntar:

“Onde está a tabela CLIENTES?”

ele pode procurar:

SELECT CREATOR,
       NAME,
       TYPE
FROM SYSIBM.SYSTABLES
WHERE NAME = 'CLIENTES';

Ou se não souber o nome completo:

SELECT CREATOR,
       NAME
FROM SYSIBM.SYSTABLES
WHERE NAME LIKE '%CLIENT%';

Você começa a investigar.

E investigar é uma das competências mais importantes de qualquer profissional de mainframe.


17. LIKE — procurando alienígenas parcialmente identificados

O operador LIKE permite buscar padrões.

Por exemplo:

WHERE NAME LIKE 'EMP%'

significa:

começa com EMP

Enquanto:

WHERE NAME LIKE '%EMP%'

significa:

contém EMP

E:

WHERE NAME LIKE '%EMP'

significa:

termina com EMP

MIB chama isso de busca por descrição parcial do extraterrestre.

Db2 chama de SQL.


18. FETCH FIRST — não abra todos os arquivos secretos

Evite iniciar sua carreira com:

SELECT *
FROM SYSIBM.SYSTABLES;

Em ambientes grandes isso pode trazer uma quantidade enorme de informação.

Prefira:

FETCH FIRST 20 ROWS ONLY

ou outro limite adequado.

É uma excelente disciplina.

Especialmente para iniciantes.

Regra prática:

investigue aos poucos.


19. ORDER BY — se a ordem importa, diga

Nunca confie na ordem natural dos resultados.

Se quer ordenar por posição de coluna:

ORDER BY COLNO;

Se quer por nome:

ORDER BY NAME;

Sem ORDER BY, você não deve assumir que os dados virão sempre na mesma ordem.

Essa regra vale no SPUFI.

Vale no COBOL.

Vale na produção.

Vale no universo inteiro.


20. SQLCODE — o relatório da investigação

Quando executamos SQL, o Db2 informa o resultado através de códigos.

O mais famoso é o:

SQLCODE

Por exemplo:

SQLCODE = 0

normalmente significa sucesso.

Um clássico:

SQLCODE = +100

é associado à condição de nenhuma linha encontrada em determinados contextos.

Valores negativos geralmente representam erros.

Por exemplo:

-204

normalmente indica problema relacionado a objeto não encontrado ou não definido no contexto esperado.

Mas não decore cegamente.

O reflexo correto é:

SQL falhou
   │
   ▼
ler SQLCODE
   │
   ▼
ler SQLSTATE
   │
   ▼
ler mensagem
   │
   ▼
investigar

Não faça manutenção por astrologia.


21. Erro proposital é ferramenta de aprendizado

No laboratório, você pode executar algo propositalmente errado:

SELECT XPTO
FROM SYSIBM.SYSTABLES;

Se XPTO não existir, o Db2 reclamará.

Isso permite treinar a leitura de mensagens.

O iniciante que aprende a interpretar erros vale muito mais do que aquele que só consegue repetir exemplos que funcionam.


22. SELECT que retorna zero linhas não está necessariamente errado

Outro erro conceitual clássico.

Você executa:

SELECT CREATOR,
       NAME
FROM SYSIBM.SYSTABLES
WHERE NAME = 'ET_DE_VARGINHA';

Se nenhuma tabela tiver esse nome, provavelmente retornará zero registros.

Isso não quer dizer que o SQL está errado.

Quer dizer apenas:

comando válido
+
nenhum registro satisfaz a condição

Essa diferença será fundamental quando você trabalhar com COBOL + Db2.


23. SPUFI e COBOL: irmãos mais próximos do que parecem

Depois você encontrará programas como:

EXEC SQL
   SELECT NOME,
          SALDO
     INTO :WS-NOME,
          :WS-SALDO
     FROM CLIENTES
    WHERE ID_CLIENTE = :WS-ID
END-EXEC.

Antes de colocar um SQL dentro do COBOL, é muito comum testar a consulta primeiro no SPUFI.

Por exemplo:

SELECT NOME,
       SALDO
FROM CLIENTES
WHERE ID_CLIENTE = 123;

Se funcionar, você já validou parte da lógica SQL.

Depois transforma isso em embedded SQL no programa.


24. O que são host variables?

No COBOL, o Db2 precisa trocar dados com variáveis do programa.

Por isso aparecem:

:WS-NOME
:WS-SALDO

O : identifica uma host variable.

Ou seja:

Db2
 │
 ├── NOME  ───────► WS-NOME
 └── SALDO ───────► WS-SALDO

No SPUFI você não precisa pensar nisso inicialmente.

E esse é um dos motivos pelos quais SPUFI é tão bom para aprendizado.

Primeiro:

SQL puro

Depois:

SQL + COBOL

25. O DCLGEN espreita na sala ao lado

No DB2I você também pode encontrar o:

DCLGEN

Ele ajuda a gerar declarações relacionadas às tabelas Db2 para utilização em programas.

Ou seja:

Tabela Db2
   │
   ▼
DCLGEN
   │
   ▼
estrutura compatível com programa COBOL

Esse será um próximo passo natural depois de dominar SPUFI e catálogo.


26. O pipeline COBOL + Db2

Mais adiante você aprenderá:

COBOL + SQL
     │
     ▼
PRECOMPILE
   /    \
  ▼      ▼
COBOL   DBRM
  │      │
  ▼      ▼
COMPILE BIND
  │      │
  ▼      ▼
OBJ    PACKAGE

É aí que o Db2 deixa de parecer apenas “um banco acessado pelo SPUFI” e passa a fazer parte da execução de aplicações corporativas reais.


27. AUTOCOMMIT — botão vermelho da sala MIB

SPUFI também pode executar comandos de alteração:

INSERT
UPDATE
DELETE

E aí entra uma palavra importantíssima:

COMMIT

Dependendo da configuração de AUTOCOMMIT, alterações podem ser confirmadas automaticamente.

E isso é perigoso para iniciantes.

Imagine:

UPDATE CLIENTES
SET STATUS = 'I';

Sem WHERE.

Parabéns.

Você pode ter atualizado a tabela inteira.

Portanto a regra Bellacosa é simples:

SELECT primeiro

COUNT depois

confira o alvo

somente então considere UPDATE

Especialmente em ambiente real.

Produção não é laboratório.


28. Como descobrir o Db2 disponível para seu USER-ID

Quando entrar num novo ambiente, siga esta sequência.

Primeiro:

TSO/E
  │
  ▼
ISPF
  │
  ▼
DB / DB2I

Veja qual SSID está configurado.

Depois entre no SPUFI.

Execute:

SELECT CURRENT USER,
       CURRENT SQLID,
       CURRENT SERVER
FROM SYSIBM.SYSDUMMY1;

Isso ajuda a entender sua identidade e contexto dentro do Db2.

Depois:

SELECT CURRENT DATE,
       CURRENT TIME
FROM SYSIBM.SYSDUMMY1;

Se funcionar, há comunicação.

Depois explore:

SELECT CREATOR,
       NAME,
       TYPE
FROM SYSIBM.SYSTABLES
WHERE CREATOR = 'SYSIBM'
FETCH FIRST 20 ROWS ONLY;

Pronto.

A investigação começou.


29. Checklist MIB para seu primeiro dia no Db2

Ao receber um USER-ID novo, descubra:

Qual é meu USER-ID TSO?

Qual menu dá acesso ao Db2?

Qual é o SSID?

Consigo entrar no DB2I?

Consigo abrir o SPUFI?

Qual dataset de entrada devo usar?

Qual dataset de saída devo usar?

Qual é meu CURRENT USER?

Qual é meu CURRENT SQLID?

Qual é meu CURRENT SERVER?

Consigo consultar SYSIBM.SYSTABLES?

Consigo consultar SYSCOLUMNS?

Consigo consultar SYSINDEXES?

Se você responde a essas perguntas, já não está mais completamente perdido.


30. Easter egg: o neuralizador do programador COBOL

Todo profissional experiente já viu alguém fazer:

SELECT *

sem filtro.

Depois a tela enche.

O usuário aperta PF3.

Aperta de novo.

Mais uma vez.

Olha para o colega.

O colega olha de volta.

Ninguém fala sobre o que aconteceu.

Esse é o neuralizador oficial do ISPF.


31. Outra curiosidade: o mainframe gosta de saber quem fez o quê

Em sistemas modernos, muita gente vende como novidade:

  • rastreabilidade;

  • autenticação;

  • privilégios;

  • logs;

  • identidades;

  • separação de ambientes;

  • transações;

  • controle de acesso.

O mainframe olha e diz:

“Interessante. Fazemos isso há algumas décadas.”

Db2, RACF, JES2 e z/OS foram construídos num mundo em que compartilhamento de recursos, segurança e auditoria não eram acessórios.

E por isso conceitos como USER-ID, autorização, subsystem e catálogo importam tanto.


32. O mapa final da missão

Se você guardar apenas um desenho deste artigo, guarde este:

                    IBM Z
                      │
                      ▼
                    z/OS
                      │
                      ▼
                    TSO/E
                      │
                      ▼
                    ISPF
                      │
                      ▼
                     DB
                      │
                      ▼
                    DB2I
                      │
                      ▼
                    SPUFI
                      │
                      ▼
                 Db2 for z/OS
                      │
          ┌───────────┼───────────┐
          ▼           ▼           ▼
      SYSTABLES   SYSCOLUMNS   SYSINDEXES
          │           │           │
          ▼           ▼           ▼
       objetos      colunas      índices

Esse desenho explica praticamente toda a nossa conversa.


Epílogo — agente, bem-vindo ao mainframe

O iniciante olha para o ISPF e vê uma tela antiga.

O especialista olha e vê uma interface para décadas de evolução tecnológica.

O iniciante olha para DB e vê duas letras misteriosas.

O especialista vê uma rota para o Db2.

O iniciante olha para SPUFI e vê uma ferramenta ultrapassada.

O especialista vê uma bancada rápida para testar SQL, investigar catálogo, validar hipóteses e compreender dados.

O iniciante olha para SYSIBM e vê tabelas estranhas.

O especialista vê o mapa do território.

E talvez essa seja a maior lição deste laboratório.

Mainframe não é sobre decorar siglas.

É sobre aprender a navegar.

Quando você entende:

TSO/E
ISPF
DB
DB2I
SPUFI
SYSIBM
SQLCODE

as coisas deixam de parecer uma coleção de artefatos alienígenas.

Elas começam a formar um sistema.

Você entende onde está.

Sabe quem é.

Descobre qual Db2 está acessando.

Investiga seus objetos.

Lê suas mensagens.

Testa SQL.

E depois conecta tudo ao COBOL.

Esse é o ponto em que o agente novato deixa de perguntar:

“Onde eu clico?”

e começa a perguntar:

“Qual componente estou usando, qual informação ele me fornece e qual é o próximo ponto da investigação?”

Nesse momento, os Homens de Preto podem guardar o neuralizador.

O programador COBOL já começou a enxergar o universo.

☕ E no Bellacosa Mainframe, até alienígena precisa de USER-ID, autorização e um bom WHERE.



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

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