Translate

Mostrar mensagens com a etiqueta pseudo conversacao. Mostrar todas as mensagens
Mostrar mensagens com a etiqueta pseudo conversacao. Mostrar todas as mensagens

sábado, 20 de junho de 2026

☕ LAB - CICS BMS para Padawans

 

Bellacosa Mainframe laboratorio pratico CICS BMS

☕ LAB Bellacosa Mainframe

CICS BMS para Padawans

Bem-vindo ao Laboratório Bellacosa Mainframe – CICS BMS para Padawans. Este conjunto de exercícios foi projetado para conduzir um desenvolvedor COBOL iniciante por uma jornada gradual de aprendizado, partindo da criação do primeiro MAPSET BMS até a construção de uma pequena aplicação pseudo-conversacional semelhante às encontradas em bancos, seguradoras e grandes empresas. 

O objetivo não é apenas aprender a sintaxe das macros DFHMSD, DFHMDI e DFHMDF, mas desenvolver a forma de pensar utilizada por desenvolvedores CICS experientes.

Ao longo dos laboratórios, o aluno será estimulado a raciocinar em termos de interface, estado, fluxo de navegação, persistência temporária de informações e interação entre usuário e aplicação. Inicialmente, o foco será compreender como uma tela 3270 é construída, como os campos são definidos, protegidos ou liberados para edição e como o BMS abstrai as características do terminal. 

Em seguida, serão introduzidos os conceitos de SEND MAP, RECEIVE MAP, EIBAID, DFHAID, posicionamento dinâmico de cursor e tratamento de teclas funcionais.

Nos desafios mais avançados, espera-se que o aluno seja capaz de projetar uma aplicação utilizando pseudo-conversação, COMMAREA, paginação, mensagens de erro e validações, adotando uma abordagem semelhante à empregada em sistemas corporativos reais. 

Mais importante do que memorizar comandos é desenvolver o raciocínio arquitetural necessário para compreender como aplicações CICS foram concebidas, evoluíram ao longo das décadas e continuam sustentando milhões de transações críticas diariamente no ecossistema IBM Z.

10 Laboratórios Práticos de BMS


LAB01 – Meu Primeiro BMS

Objetivo:

Criar o primeiro MAPSET.

Resultado esperado:

HELLO BMS

PF3=Sair

Atividades

Criar um DFHMSD

Criar um DFHMDI

Criar dois DFHMDF

Gerar Physical Map

Gerar Symbolic Map


Solução

HELLO DFHMSD TYPE=&SYSPARM,
       LANG=COBOL,
       MODE=OUT,
       TIOAPFX=YES

TELA1 DFHMDI SIZE=(24,80)

      DFHMDF POS=(5,25),
              LENGTH=10,
              INITIAL='HELLO BMS',
              ATTRB=(PROT,BRT)

      DFHMDF POS=(22,2),
              LENGTH=8,
              INITIAL='PF3=Sair',
              ATTRB=(ASKIP)

      DFHMSD TYPE=FINAL

END

LAB02 – Criando Campo de Entrada

Objetivo

Campo editável.


Resultado

Nome :

______________

Atividades

Adicionar campo input

Posicionar cursor

Testar MDT


Solução

NOME DFHMDF POS=(5,15),
              LENGTH=30,
              ATTRB=(UNPROT,IC)

LAB03 – Campos Protegidos

Objetivo

Criar labels.


Resultado

CPF:


Cidade:


Email:

Solução

DFHMDF POS=(1,1),
        LENGTH=4,
        INITIAL='CPF:',
        ATTRB=(ASKIP)

LAB04 – Tela Cadastro Cliente

Objetivo

Montar tela completa.


Resultado

Codigo:


Nome:


CPF:


Cidade:


Telefone:



PF3


PF5


ENTER

Atividades

Criar 5 campos

Criar mensagens

Criar PF Keys


Solução

CODIGO DFHMDF
        POS=(5,15),
        LENGTH=6,
        ATTRB=(UNPROT,IC)



CPF DFHMDF
        POS=(7,15),
        LENGTH=11,
        ATTRB=(UNPROT,NUM)

LAB05 – SEND MAP

Objetivo

Mostrar tela.


Atividades

Criar programa COBOL

Executar SEND


Solução

EXEC CICS SEND MAP

MAP('TELA01')

MAPSET('CLIMAP')

ERASE

FREEKB

END-EXEC.

LAB06 – RECEIVE MAP

Objetivo

Receber dados.


Atividades

Capturar nome.

Capturar CPF.


Solução

EXEC CICS RECEIVE

MAP('TELA01')

MAPSET('CLIMAP')

INTO(TELA01I)

END-EXEC.

LAB07 – Tratando ENTER e PF3

Objetivo

Usar DFHAID.


Atividades

Copy DFHAID

Verificar tecla


Solução

COPY DFHAID.



EVALUATE EIBAID


WHEN DFHENTER

PERFORM PROCESSA



WHEN DFHPF3

PERFORM SAIR



END-EVALUATE

LAB08 – Cursor Dinâmico

Objetivo

Cursor em campo inválido.


Exemplo

CPF inválido


Cursor volta CPF

Solução

MOVE -1 TO CPFL



EXEC CICS SEND

CURSOR

END-EXEC

LAB09 – Pseudo Conversação

Objetivo

Implementar COMMAREA.


Atividades

Salvar contexto

Retornar transação


Solução

EXEC CICS RETURN


TRANSID('CLI1')


COMMAREA(WS-COMM)


LENGTH(100)


END-EXEC.

Primeira vez

IF EIBCALEN = ZERO

PERFORM PRIMEIRA-VEZ

END-IF.

LAB10 – Mini Sistema Bancário

Objetivo

Criar aplicação real.


Funcionalidades

Consultar Cliente

Cadastrar

Alterar

Excluir

Paginar

PF7

PF8

PF3


Tela


==================================

CLIENTES


Codigo


Nome


CPF



PF3=Sair

PF5=Limpar

PF7=Anterior

PF8=Próximo


==================================


Desafio Extra

Implementar:

MAPFAIL

HANDLE CONDITION

HANDLE AID

FSET

FRSET

DATAONLY

MAPONLY


Gabarito Esperado

Ao final dos 10 labs o aluno deverá dominar:

✅ DFHMSD

✅ DFHMDI

✅ DFHMDF

✅ SEND MAP

✅ RECEIVE MAP

✅ DFHAID

✅ EIBAID

✅ CURSOR

✅ MDT

✅ FSET

✅ COMMAREA

✅ Pseudo-conversação

✅ CEDA

✅ CEMT

✅ INSTALL

✅ BMS Physical

✅ Symbolic Maps


🏆 Desafio Bellacosa Mainframe (Boss Fight)

Construa uma aplicação semelhante a um sistema bancário contendo:

  • Login

  • Menu Principal

  • Consulta Cliente

  • Inclusão

  • Alteração

  • Exclusão

  • Paginação PF7/PF8

  • Help PF1

  • Mensagens de erro

  • COMMAREA

  • TSQ para paginação

  • DB2 (simulado)

  • CEDF para debug

Se conseguir completar este laboratório, você estará muito próximo do nível esperado de um Desenvolvedor COBOL/CICS Júnior pronto para atuar em projetos corporativos IBM Z.


quinta-feira, 3 de dezembro de 2020

CICS Conversacional e Pseudo-Conversacional - Parte IV

 

Bellacosa Mainframe e a conversação em CICS Parte IV

☕ Um Café no Bellacosa Mainframe

CICS Conversacional e Pseudo-Conversacional

Parte 4 — COMMAREA, TSQ, TDQ, Temporary Storage, Control Blocks e os Bastidores do CICS

"Salve novamente, jovem Padawan Mainframe! Se você chegou até aqui, parabéns. Você já compreendeu como a pseudo-conversação revolucionou a escalabilidade do CICS, descobriu Channels, Containers, APIs REST e até OpenTelemetry. Mas agora vamos abrir a tampa do motor do CICS. Vamos conhecer o que acontece por trás das cortinas."

Pegue mais um café.

Abra o IPCS.

Deixe o CEDF ligado.

Reserve uma aba do SDSF.

Porque agora vamos entrar na sala das máquinas.


O que realmente acontece dentro do CICS?

Quando executamos:

EXEC CICS SEND MAP
END-EXEC

Muita gente imagina algo parecido com:

Programa

Tela

Fim.

Mas o CICS faz muito mais.


Fluxo interno

Programa COBOL

        │

        ▼

Translator

        │

        ▼

EXEC Interface

        │

        ▼

Kernel CICS

        │

        ▼

Terminal Control

        │

        ▼

BMS

        │

        ▼

TIOA

        │

        ▼

3270

TIOA

Talvez uma das estruturas menos conhecidas pelos iniciantes.

TIOA

Terminal Input Output Area

É uma área onde ficam armazenados.

Dados digitados.

Cursor.

Atributos.

AID Keys.


Exemplo

ENTER

PF3

PF5

CPF

Nome

Cursor linha 7

Cursor coluna 15

Tudo isso.

Na TIOA.


TCA

Task Control Area.

Cada task possui.


Guarda.

Status.

Transação.

Programa.

Recursos.

Flags.


EIB

Você já conhece.

Mas agora sabemos.

Ele é derivado.

Da TCA.


Control Blocks interessantes

TCT

Terminal Control Table


PPT

Program Processing Table


FCT

File Control Table


PCT

Program Control Table


SIT

System Initialization Table


Temporary Storage Queue

TSQ

Muito usada.

Em pseudo-conversação.


Imagine.

1000 registros.

Não cabem.

Na COMMAREA.


Salvamos em TSQ.


EXEC CICS WRITEQ TS

QUEUE('CLI0001')

FROM(WS-DADOS)

END-EXEC



Lendo.



EXEC CICS READQ TS

QUEUE('CLI0001')

INTO(WS-DADOS)

END-EXEC



TDQ

Transient Data Queue

Muito utilizada.

Para logs.

Integração.

Mensageria.


TSQ versus TDQ

CaracterísticaTSQTDQ
Leitura múltiplaSimNão
AtualizaçãoSimNão
SequencialNãoSim
PersistênciaOpcionalSim
Uso típicoEstadoLogs

COMMAREA versus TSQ

COMMAREA

64 KB

TSQ

Megabytes


Exemplo bancário

Tela.

Lista.

5000 clientes.

Salvar TSQ.

Usuário PF8.

Recupera TSQ.

Próxima página.


Paginando consultas

PF7

Anterior

PF8

Próxima




IF EIBAID = DFHPF8

PERFORM PAGINA-SEGUINTE


END-IF



Boas práticas

Nunca coloque.

Tabela enorme.

Na COMMAREA.


Use.

TSQ.

Ou.

Containers.


LINK

Outro comando muito importante.

Chamando programa.




EXEC CICS LINK

PROGRAM('CLI0002')

COMMAREA(WS-COMM)

END-EXEC



Retorna.

Para chamador.


XCTL

Diferente.

Não retorna.



EXEC CICS XCTL

PROGRAM('MENU0001')

END-EXEC



Programa anterior.

Morre.

Novo.

Assume controle.


START

Assíncrono.

Agenda execução.




EXEC CICS START

TRANSID('CLI1')

END-EXEC



DELAY

Muito curioso.



EXEC CICS DELAY

FOR SECONDS(5)

END-EXEC



Raramente utilizado.


CEMT

Melhor amigo.

Administrador.


Consultar tasks.


CEMT I TASK



Consultar programas.



CEMT I PROGRAM



Consultar files.



CEMT I FILE



Consultar TSQ.



CEMT I TSQUEUE



CEDF

Ferramenta maravilhosa.


Permite.

Passo a passo.

SEND.

RECEIVE.

LINK.

READ.

WRITE.

DB2.




CEDF ON



CECI

Testador.

Interativo.



CECI READ FILE




CECI RECEIVE MAP



Curiosidades Bellacosa Mainframe

Existem sistemas.

Que utilizam.

TSQ.

Desde 1988.

Ainda funcionando.

No z16.

No z17.

Sem alterações.


Easter Egg Mainframe

Muitos programadores escondiam.

Comentários.

Como.



* THIS PROGRAM IS OLDER THAN YOU


Ou.



* IF IT BREAKS


* RUN AWAY



Ou.



* WRITTEN DURING NIGHT SHIFT


* POWERED BY COFFEE



O que veremos na Parte 5

✔ Program Control;

✔ HANDLE CONDITION;

✔ HANDLE ABEND;

✔ RESP e RESP2;

✔ Syncpoint;

✔ Journaling;

✔ Recoverable Resources;

✔ Mirror Transactions;

✔ DPL;

✔ IPIC;

✔ CICSplex;

✔ CPSM;

✔ Threadsafety;

✔ Open TCBs;

✔ OTE;

✔ E muitos outros segredos do universo CICS.


No Bellacosa Mainframe aprendemos uma regra simples: se você acredita que já conhece o CICS, provavelmente apenas encontrou a próxima porta do labirinto. Porque no IBM Z sempre existe mais um control block para estudar, mais um dump para analisar e mais um café esperando para ser servido.

 

sexta-feira, 4 de setembro de 2020

CICS Conversacional e Pseudo-Conversacional - Parte II

 

Bellacosa Mainframe e a conversação em cics parte II

☕ Um Café no Bellacosa Mainframe

CICS Conversacional e Pseudo-Conversacional

Parte 2 — Escalabilidade, COMMAREA, Channels, Web Services e Boas Práticas

"Na primeira parte aprendemos que programas conversacionais gostam de ficar esperando o usuário pensar, enquanto programas pseudo-conversacionais executam como ninjas do IBM Z: aparecem, trabalham, desaparecem e retornam apenas quando necessários. Agora vamos entender por que a IBM praticamente transformou a pseudo-conversação em padrão de mercado."

Pegue mais um café, abra o CEDF, deixe o CEMT pronto e vamos continuar nossa jornada.


Os problemas do modelo Conversacional

O modelo conversacional é elegante.

É simples.

É intuitivo.

Mas infelizmente é extremamente caro.

Vamos imaginar um banco.

Cenário

50.000 usuários.

Cada usuário demora:

20 segundos

para preencher uma tela.


Aplicação Conversacional

Programa fica ativo.

Task permanece viva.

TCB permanece associado.

TCA permanece ocupada.

Storage continua reservado.

EIB continua residente.

Tudo isso...

Durante vinte segundos.


Resultado

Pouca escalabilidade.

Maior uso de CPU.

Maior consumo de memória.

Possibilidade de gargalos.


O fenômeno Think Time

Um dos maiores inimigos do CICS.

Think Time.

Tempo em que o usuário está apenas pensando.

Exemplos:

Lendo uma tela.

Pegando um documento.

Atendendo telefone.

Procurando CPF.

Conversando com cliente.


Conversacional

Think Time = recursos desperdiçados


Pseudo

Think Time = recursos liberados


A IBM fez uma escolha inteligente

Ao invés de esperar.

Finaliza a task.

Salva contexto.

Cria nova task depois.


Visualmente:

Task 1

Mostra tela

RETURN


=================


Usuário pensa


=================


Task 2


Recebe dados


Processa


RETURN

Múltiplas telas

Poucos desenvolvedores COBOL iniciantes percebem.

Uma pseudo-conversação pode navegar por dezenas de telas.

Exemplo:

Menu

Consulta

Inclusão

Alteração

Confirmação

Resumo

Help

Paginação


Exemplo

MENU

PF5

CONSULTA

ENTER

DETALHE

PF3

MENU


Tudo utilizando.

COMMAREA.


COMMAREA

Provavelmente um dos conceitos mais importantes do CICS.

Ela guarda estado.

Entre uma task.

E outra.


Exemplo:


01 WS-COMM.

   05 WS-MODO PIC X.

   05 WS-PAGINA PIC 99.

   05 WS-CPF PIC 9(11).

   05 WS-NOME PIC X(30).


Limitação

COMMAREA possui limite.

64 KB.


Antigamente

Era suficiente.


Hoje.

JSON.

REST.

SOAP.

XML.

JWT.

Podem ultrapassar facilmente.

64 KB.


Surge Channels e Containers

Introduzidos para resolver isso.


COMMAREA

64 KB


Container

Gigabytes.


Exemplo


EXEC CICS PUT CONTAINER

CONTAINER('CLIENTE')

FROM(WS-DADOS)

END-EXEC



Recuperando.


EXEC CICS GET CONTAINER

CONTAINER('CLIENTE')

INTO(WS-DADOS)

END-EXEC



Qual utilizar?

Sistemas antigos

COMMAREA


Novos projetos

Channels

Containers


EIBCALEN

Nos projetos antigos.

Era rei.




IF EIBCALEN = ZERO


PERFORM PRIMEIRA-VEZ


ELSE


PERFORM RETORNO


END-IF



Pseudo-Conversação com BMS

Fluxo típico.


SEND MAP

RETURN

Usuário ENTER

Nova Task

RECEIVE

DB2

SEND

RETURN


Web Services no CICS

Muitos acreditam.

Que CICS é apenas 3270.

Isso está muito longe da realidade.


CICS suporta.

SOAP.

REST.

JSON.

XML.

MQ.

JMS.

TCP/IP.

HTTP.

HTTPS.


Exemplo

Angular

API

zOS Connect

CICS

COBOL

DB2


Visualmente



Browser


   │


REST API


   │


zOS Connect


   │


CICS


   │


COBOL


   │


DB2



O COBOL muda?

Quase nada.


Exemplo


PERFORM VALIDA


PERFORM CONSULTA-DB2


PERFORM RETORNA-DADOS




Interface muda.

Negócio permanece.


SOAP

Muito usado.

Seguradoras.

Governo.

ERP.


REST

Dominante.

OpenAPI.

Swagger.

JSON.


BMS ainda é importante?

Sim.

Muito.


Milhares de aplicações.

Continuam em produção.


Além disso.

BMS ensina.

Arquitetura.

Separação de responsabilidades.

Persistência de contexto.

Gerenciamento de estado.


Problemas comuns

MAPFAIL

Usuário apertou PF3.

Sem alterar dados.


INVREQ

Sequência incorreta.


LENGERR

Área pequena.


ASRA

S0C7.

S0C4.

S0CB.


Como debugar?

CEDF.

Excelente.



CEDF ON



Programa para.

Comando por comando.


CECI

Muito útil.


Exemplo


CECI RECEIVE MAP



CEMT

Consultar recursos.



CEMT I TASK




CEMT I PROG




CEMT I TRAN



Boas práticas

Sempre usar pseudo-conversação


Utilizar COMMAREA pequena


Preferir Containers

Projetos novos.


Não salvar tabelas grandes

Na COMMAREA.


Usar MDT apenas quando necessário


Utilizar DATAONLY

Reduz tráfego.


Evitar múltiplos SEND

Na mesma task.


Validar EIBRESP

Sempre.


Exemplo



IF EIBRESP NOT = DFHRESP(NORMAL)

PERFORM TRATA-ERRO


END-IF



Curiosidade Bellacosa Mainframe

Alguns bancos possuem aplicações pseudo-conversacionais escritas em 1986.

Elas foram migradas.

De 3090.

Para 9672.

Para z900.

Para z990.

Para z9.

Para z10.

Para z14.

Para z16.

E continuam praticamente inalteradas.


Easter Egg Mainframe

Nos anos 80.

Muitos desenvolvedores colocavam comentários curiosos.

Exemplo.



* MAY THE COBOL BE WITH YOU


Ou.



* DO NOT TOUCH


* WORKS SINCE 1987


Ou o clássico.



* IF YOU CHANGE THIS


* BUY COFFEE FOR THE TEAM



Continua...

Na Parte 3 veremos:

✔ Web Open Interface (WOI);

✔ CICS Event Processing;

✔ Programas COBOL completos;

✔ Pseudo-conversação com múltiplos MAPSETs;

✔ BMS avançado;

✔ Channels versus TSQ;

✔ Segurança RACF;

✔ Web Services SOAP e REST detalhados;

✔ Observabilidade moderna;

✔ OpenTelemetry;

✔ Curiosidades e easter eggs pouco conhecidos do universo CICS.

quarta-feira, 1 de julho de 2020

CICS Conversacional e Pseudo-Conversacional - Parte I

 

Bellacosa Mainframe e as tecnicas de conversação em programas CICS parte I

☕ Um Café no Bellacosa Mainframe

CICS Conversacional e Pseudo-Conversacional

Parte 1 — Das Conversas Eternas ao Modelo que Move o Mundo

"Salve, jovem Padawan Mainframe! Pegue seu café, abra uma sessão do SDSF, deixe o IPCS de prontidão e venha comigo entender uma das maiores sacadas de engenharia já criadas pela IBM. Hoje vamos falar sobre dois conceitos que sustentam boa parte das aplicações bancárias do planeta: CICS Conversacional e Pseudo-Conversacional."


O que é uma aplicação Conversacional?

Imagine que você está conversando com alguém pelo telefone.

Você liga.

A pessoa atende.

A ligação permanece aberta.

Vocês conversam.

Você pensa.

Procura um documento.

Vai tomar café.

Volta.

Continua falando.

Finalmente desliga.

Foi exatamente esta filosofia que inspirou o primeiro modelo de aplicações CICS.

Modelo Conversacional

O programa permanece residente na memória durante toda a interação com o usuário.

Visualmente:

Usuário
   │
EXEC CICS RECEIVE
   │
Programa permanece ativo
   │
Processa
   │
EXEC CICS SEND
   │
Espera usuário
   │
EXEC CICS RECEIVE
   │
Processa
   │
EXEC CICS SEND
   │
...
   │
EXEC CICS RETURN

O programa nunca sai da memória.

A task permanece viva.

A TCA continua alocada.

O TCB continua associado.

A área de trabalho permanece disponível.

Tudo fica esperando.

Inclusive o usuário.


O problema

Vamos imaginar um banco em 1982.

Existem:

5.000 terminais.

3.000 usuários.

2.000 consultas simultâneas.

Cada usuário fica parado.

Lendo a tela.

Pensando.

Conferindo CPF.

Procurando documentos.

Tomando café.

Atendendo telefone.

Conversando.

Enquanto isso...

O programa continua residente.

A task continua viva.

O CICS continua consumindo recursos.

A memória continua ocupada.


O nascimento da pseudo-conversação

Os engenheiros da IBM olharam para isso e disseram:

"Por que manter um programa carregado esperando um ser humano pensar?"

E a resposta foi brilhante.

Não vamos esperar.

Vamos embora.

Quando o usuário voltar...

Criamos outra task.

Recuperamos o estado.

Continuamos.

Nascia a pseudo-conversação.


O que é Pseudo-Conversação?

A pseudo-conversação é um modelo onde o programa não fica esperando.

Ele:

Mostra a tela.

Encerra a task.

Libera recursos.

Quando o usuário aperta ENTER...

Uma nova task é criada.

Tudo continua.

Como se nada tivesse acontecido.


Fluxo


Usuário

   │

Executa CLI1

   │

Programa COBOL

   │

SEND MAP

   │

RETURN TRANSID

COMMAREA

   │

Task termina



=====================


Usuário digita


ENTER


=====================


Nova Task


Recebe COMMAREA


RECEIVE MAP


Processa


SEND MAP


RETURN


É quase uma ilusão.

Parece conversacional.

Mas não é.

Por isso o nome:

Pseudo-Conversacional.


Comparando os dois modelos

CaracterísticaConversacionalPseudo
Task ativaSimNão
Programa residenteSimNão
Consome memóriaAltaBaixa
EscalabilidadeRuimExcelente
Usado atualmenteRaroPadrão
Ideal para milhares usuáriosNãoSim

Por que a IBM venceu?

Porque ela resolveu um problema gigantesco.

Imagine.

100 mil usuários.

Cada um esperando.

Em modelo conversacional.

Seria inviável.

No pseudo.

As tasks duram poucos milissegundos.

O usuário pensa.

Mas o mainframe trabalha em outra coisa.


Analogia moderna

Conversacional:

Você deixa o Uber esperando na porta enquanto toma banho.

Pseudo-conversacional:

Você pede outro Uber quando estiver pronto.

O custo muda completamente.


O segredo: COMMAREA

A memória da aplicação.

Entre uma task e outra.

Exemplo:


01 WS-COMM.

   05 WS-CLIENTE.

      10 WS-CODIGO PIC 9(6).

      10 WS-NOME PIC X(30).

      10 WS-PAGINA PIC 99.

      10 WS-MODO PIC X.



Primeira execução

Como descobrir?

Usando:

EIBCALEN



IF EIBCALEN = ZERO

   PERFORM PRIMEIRA-VEZ

END-IF


Primeira vez.

Sem COMMAREA.


Retorno



IF EIBCALEN > ZERO

   PERFORM RETORNO


END-IF


Existe contexto.

Usuário voltou.


Salvando estado



EXEC CICS RETURN

TRANSID('CLI1')

COMMAREA(WS-COMM)

LENGTH(100)

END-EXEC.


CICS guarda.

Task termina.

Memória liberada.


Criando nova task

Usuário aperta ENTER.

CICS cria:

Nova TCA

Nova Task

Novo TCB

Novo EIB

Mas entrega a COMMAREA.

Tudo continua.

Mágica.

Engenharia.

IBM.


O papel do BMS

Sem BMS.

Pseudo-conversação seria muito mais complicada.

Precisaríamos:

Salvar coordenadas.

Salvar cursor.

Salvar atributos.

Salvar campos.

O BMS faz tudo isso.


SEND MAP

Mostra tela.



EXEC CICS SEND MAP

MAP('TELA1')

MAPSET('CLIMAP')

ERASE

FREEKB

END-EXEC.



RECEIVE MAP

Recebe dados.



EXEC CICS RECEIVE MAP

MAP('TELA1')

MAPSET('CLIMAP')

INTO(TELA1I)

END-EXEC.



Curiosidade Bellacosa Mainframe

Muitos sistemas bancários desenvolvidos em 1985 ainda utilizam exatamente este modelo.

Mudou o hardware.

Mudou o storage.

Mudou a CPU.

Mudou a interface.

Mas a arquitetura continua.

E continua funcionando.

Talvez esta seja uma das maiores demonstrações da elegância da engenharia IBM.


Easter Egg Mainframe

Alguns desenvolvedores chamavam aplicações conversacionais de:

Programas preguiçosos.

Porque passavam a maior parte do tempo...

Esperando o usuário pensar.

Enquanto os programas pseudo-conversacionais eram apelidados de:

Programas ninja.

Aparecem.

Executam.

Desaparecem.

Voltam.

Executam.

Somem novamente.

Tudo em poucos milissegundos.


Continua...

Na Parte 2 veremos:

✔ Problemas clássicos do modelo conversacional;

✔ Deadlocks de recursos;

✔ Pseudo-conversação com múltiplas telas;

✔ COMMAREA versus Channels e Containers;

✔ Web Services no CICS;

✔ REST, SOAP e z/OS Connect;

✔ Exemplos COBOL completos;

✔ Boas práticas;

✔ Troubleshooting;

✔ Curiosidades e easter eggs pouco conhecidos do universo CICS.


segunda-feira, 1 de junho de 2020

CICS BMS para Desenvolvedores COBOL – Parte 3

 

Bellacosa Mainframe e a terceira parte do mini curso CICS BMS

☕ Um Café no Bellacosa Mainframe

CICS BMS para Desenvolvedores COBOL – Parte 3

Construindo uma Aplicação Real: Cadastro de Clientes, Pseudo-Conversação e Troubleshooting

"Até agora aprendemos o que é BMS, como criar mapas, compilá-los, instalá-los no CICS e navegar entre SEND MAP, RECEIVE MAP e HANDLE AID. Agora chegou a hora de montar uma aplicação semelhante às encontradas em bancos, seguradoras e empresas de telecomunicações."

Pegue mais um café, abra uma sessão do IPCS, outra do SDSF e vamos colocar a mão na massa.


O Projeto

Nosso sistema será composto por uma transação chamada:

CLI1

Associada ao programa:

CLICAD

Utilizando o MAPSET:

CLIMAP

Nossa tela

Visualmente teremos:

----------------------------------------------------------

               CADASTRO DE CLIENTES


Codigo.......: _______

Nome.........: ___________________________

CPF..........: ___________

Cidade.......: ___________________________

Telefone.....: ___________

Email........: ___________________________



Mensagem.....:



PF3=Sair   PF5=Limpar   PF7=Consultar


----------------------------------------------------------

O MAPSET

DFHMSD


CLIMAP DFHMSD TYPE=&SYSPARM,
               MODE=INOUT,
               LANG=COBOL,
               STORAGE=AUTO,
               TIOAPFX=YES,
               CTRL=(FREEKB)



DFHMDI


TELA01 DFHMDI SIZE=(24,80)



Campos protegidos

Labels.

Nunca serão alterados.

Exemplo:


DFHMDF POS=(5,2),
        LENGTH=10,
        INITIAL='Codigo:',
        ATTRB=(ASKIP,NORM)



DFHMDF POS=(6,2),
        INITIAL='Nome:',
        LENGTH=10,
        ATTRB=(ASKIP)




Campos de entrada

Código


CODIGO DFHMDF POS=(5,15),
                LENGTH=6,
                ATTRB=(UNPROT,IC),
                PICIN='9(6)'


Observe.

IC

Cursor inicial.


Nome


NOME DFHMDF POS=(6,15),
              LENGTH=30,
              ATTRB=UNPROT



CPF


CPF DFHMDF POS=(7,15),
             LENGTH=11,
             ATTRB=(UNPROT,NUM)



Cidade


CIDADE DFHMDF POS=(8,15),
                 LENGTH=25,
                 ATTRB=UNPROT



Mensagem

Protegida.

Sempre enviada.


MSG DFHMDF POS=(22,2),
             LENGTH=70,
             ATTRB=(PROT,FSET,BRT)



O MDT

Muitos iniciantes demoram a entender.

MDT significa:

Modified Data Tag

Indica se um campo foi alterado.

Se não estiver ligado.

Campo não chega ao COBOL.


FSET

Força transmissão.


ATTRB=(FSET)

Excelente para mensagens.

Datas.

Campos protegidos.


Bloqueando campos

Imagine uma consulta.

Usuário não pode alterar.

Mudamos.

De:

UNPROT

Para:

PROT

Alternando dinamicamente

Muito comum.

Modo Inclusão.

Nome -> UNPROT

Modo Consulta.

Nome -> PROT

Posicionando cursor

Existe um truque elegante.


MOVE -1 TO NOMEL


Depois:


EXEC CICS SEND MAP
CURSOR
END-EXEC


BMS procura.

Campo cujo L=-1.

Cursor aparece ali.


Tratando PF Keys

COPY DFHAID


COPY DFHAID.



Avaliando



EVALUATE EIBAID


WHEN DFHENTER

PERFORM GRAVA



WHEN DFHPF3

PERFORM SAIR



WHEN DFHPF5

PERFORM LIMPA



WHEN DFHPF7

PERFORM CONSULTA



WHEN OTHER

PERFORM ERRO



END-EVALUATE



PF3


EXEC CICS RETURN
END-EXEC



PF5

Limpa campos.


MOVE SPACES TO TELA01O


SEND novamente.


PF7

Consulta.

DB2.

VSAM.

IMS.

Pode ser qualquer backend.


A Arquitetura em 3 Camadas

Poucos percebem.

Já fazíamos isso nos anos 80.


Camada Apresentação

BMS

MAPSET


Camada Negócio

COBOL

CLICAD


Camada Dados

DB2

VSAM

IMS


Visualmente:


Terminal

    │

MAPSET

    │

COBOL

    │

DB2




Pseudo-Conversação

Talvez o conceito mais importante.

Não existe programa residente.

CICS trabalha com tarefas curtas.


Fluxo



Usuário


↓

EXECUTA CLI1



↓

Programa


↓

SEND MAP


↓

RETURN



===================



Usuário ENTER



===================



Nova Task



↓

RECEIVE MAP


↓

Valida


↓

DB2


↓

SEND MAP




Primeira chamada


IF EIBCALEN = ZERO


PERFORM PRIMEIRA-VEZ


END-IF



Retorno



IF EIBCALEN > ZERO


PERFORM RETORNO


END-IF




COMMAREA

Persistência.

Entre tasks.


01 WS-COMM.

05 WS-CODIGO PIC 9(6).

05 WS-MODO PIC X.



RETURN


EXEC CICS RETURN


TRANSID('CLI1')

COMMAREA(WS-COMM)

LENGTH(100)


END-EXEC



Troubleshooting

MAPFAIL

Muito comum.

Usuário apertou PF3.

Sem digitação.

RESP=36

INVREQ

Comando inválido.

Exemplo:

SEND DATAONLY

Antes de MAPONLY.


LENGERR

Tamanho incorreto.


ASRA

Favorito dos desenvolvedores.

Normalmente:

S0C7

S0C4

S0CB


CEDF

Melhor amigo.

Debug online.


CEDF ON



Executa.

Comando por comando.


CECI

Excelente ferramenta.

Testar comandos.

Exemplo.


CECI INQUIRE PROGRAM(CLICAD)




Curiosidades

SDF II

Editor gráfico.

Muito usado.

Década de 80.

Desenhava telas.

Gerava BMS.


Cores

Suportava:

Azul

Branco

Verde

Turquesa

Vermelho

Amarelo


Easter Egg Mainframe

Alguns programadores escondiam mensagens.

Campos DRK.

Exemplo.


DFHMDF POS=(24,1),

ATTRB=(DRK,PROT),

INITIAL='MAY THE COBOL BE WITH YOU'


Usuário nunca via.

Mas um dump IPCS entregava.


Releases do CICS

1970

Primeiros CICS.

1980

BMS consolidado.

1990

SDF II.

2000

CICS TS.

2010

Web Services.

2020

REST.

JSON.

zOS Connect.

2025+

CICS TS 6.x.

IA.

OpenTelemetry.

APIs modernas.


Considerações Finais

Aprender BMS é muito mais do que aprender a desenhar telas 3270.

É compreender a forma como milhares de aplicações críticas foram construídas.

É entender pseudo-conversação.

É conhecer a origem das arquiteturas em camadas.

É perceber que muitos conceitos considerados modernos já estavam presentes em aplicações escritas décadas atrás.

E talvez esta seja a principal lição do universo IBM Z:

A tecnologia muda.

Interfaces mudam.

Frameworks desaparecem.

Mas sistemas bem projetados atravessam gerações.

No próximo café do Bellacosa Mainframe, continuaremos explorando os bastidores do CICS, porque, no IBM Z, sempre existe mais um comando, mais um control block e mais uma curiosidade esperando para ser descoberta.


sábado, 2 de maio de 2020

CICS BMS para Desenvolvedores COBOL – Parte 2

Bellacosa Mainframe apresenta a Parte II do mini curso CICS BMS


☕ Um Café no Bellacosa Mainframe

CICS BMS para Desenvolvedores COBOL – Parte 2

Da Codificação do MAPSET até a Instalação no CICS

"No primeiro artigo aprendemos a desenhar nosso primeiro mapa. Agora chegou a hora de colocá-lo em produção dentro do CICS."

Pegue seu café, abra o SDSF, reserve uma aba do JESMSGLG e vamos continuar nossa jornada.


O que produz um MAPSET?

Muitos desenvolvedores iniciantes acreditam que um mapa BMS gera apenas uma tela.

Na verdade ele produz dois artefatos distintos.

Mapa Físico

MAPSET Source
        │
Assembler
        │
        ▼
 Physical Map
        │
     DFHRPL

Exemplo

CLIENTES

É utilizado pelo CICS.


Mapa Simbólico

MAPSET Source
        │
Assembler
        │
SYSPUNCH
        │
        ▼
Symbolic Map
        │
COPYLIB

Exemplo

CLIENTEM

Será utilizado pelo COBOL.


Utilizando &SYSPARM

Muito elegante.

Ao invés de manter dois fontes.

Errado

TYPE=MAP


TYPE=DSECT

Correto

TYPE=&SYSPARM

Assembly

Mapa físico

PARM='MAP'

Mapa simbólico

PARM='DSECT'

Compilando um BMS

Etapa 1

Assembler

Etapa 2

Linkedit

Etapa 3

Instalação CICS


Exemplo JCL

Symbolic


//ASM EXEC PGM=ASMA90,
 // PARM='OBJECT,NODECK'




//SYSIN DD DSN=USER.BMS(CLIENTE)


//SYSPUNCH DD DSN=USER.COPYLIB(CLIENTE)



Physical

//ASM EXEC PGM=ASMA90




//SYSLMOD DD
DSN=CICS.LOAD(CLIENTE)




Linkedit


//LKED EXEC PGM=IEWL



//SYSLMOD DD
DSN=CICS.LOAD(CLIENTE)





Onde fica cada objeto?

ObjetoBiblioteca
Physical MapDFHRPL
Programa COBOLDFHRPL
Symbolic MapCOPYLIB
JCLPROCLIB
BMS FonteSOURCELIB

CEDA

Definir recursos.

Menu clássico.

CEDA DEF MAPSET(CLIENTE)

Exemplo

CEDA DEF MAPSET(CLIENTE)

GROUP(BANCO)

DESCRIPTION(Clientes)




INSTALL

Após definir.

Necessário instalar.

CEDA INSTALL GROUP(BANCO)

ou

CEDA INSTALL MAPSET(CLIENTE)

Verificando

Com CEMT

CEMT INQ MAPSET(CLIENTE)

Resultado

Enabled

Installed



CEMT

Comando preferido dos administradores.

Consultar

CEMT I MAPSET

Desabilitar

CEMT SET MAPSET(CLIENTE)
DISABLED

Habilitar

CEMT SET MAPSET(CLIENTE)
ENABLED

Nosso primeiro RECEIVE

Programa envia.

Usuário digita.

Programa recebe.




EXEC CICS RECEIVE

MAP('TELA01')

MAPSET('CLIENTE')

INTO(TELA01I)

END-EXEC



O EIB

Executive Interface Block

Equivale ao SQLCA.

DB2

SQLCA

CICS

EIB


DFHEIBLK

Copy automático.

Não precisa incluir.


Campos úteis.


EIBTRNID

Transação.

CLI1

EIBTRMID

Terminal.

A123

EIBTASKN

Task atual.


EIBCALEN

Comprimento da COMMAREA.

Muito importante.


EIBAID

Tecla pressionada.


DFHAID

Copybook.

COPY DFHAID.

ENTER

DFHENTER

PF3

DFHPF3

PF5

DFHPF5

PF7

DFHPF7

PF8

DFHPF8

CLEAR

DFHCLEAR

Tratando teclas



EVALUATE EIBAID


WHEN DFHENTER


PERFORM PROCESSA



WHEN DFHPF3


PERFORM SAIR




WHEN DFHPF5


PERFORM REFRESH




WHEN DFHPF7


PERFORM PAGEUP




WHEN DFHPF8


PERFORM PAGEDOWN




WHEN OTHER


PERFORM ERRO



END-EVALUATE




HANDLE AID

Muito elegante.

Instala um roteador.



EXEC CICS HANDLE AID


DFHENTER(PROC1)

DFHPF3(PROC2)

DFHPF7(PROC3)

DFHPF8(PROC4)

ANYKEY(PROC5)


END-EXEC




Pseudo Conversação

Um dos conceitos mais importantes do CICS.

Não mantemos programa residente.

Fluxo:



Usuário


↓

EXECUTA


↓

PROGRAMA


↓

SEND MAP


↓

RETURN


TRANSID


COMMAREA


↓

Task termina



==================



Usuário ENTER



==================



Nova Task


↓

RECEIVE


↓

PROCESSA


↓

SEND


↓

RETURN




EIBCALEN

Primeira execução?

Ou retorno?



IF EIBCALEN = ZERO


PERFORM PRIMEIRA-VEZ


ELSE


PERFORM RETORNO



END-IF




Primeira pseudo-conversação




IF EIBCALEN = ZERO


PERFORM MONTA-TELA


ELSE


PERFORM PROCESSA


END-IF




EXEC CICS RETURN


TRANSID('CLI1')

COMMAREA(WS-COMM)


LENGTH(100)


END-EXEC




Curiosidades Bellacosa Mainframe

Durante os anos 80 e 90 era comum encontrar MAPSETs contendo 40 ou 50 telas.

Muitos bancos utilizavam convenções curiosas:

CLI001


CLI002


CLI003


CLI999




Algumas equipes chamavam a última tela de erro de:

TELAMORTE


ABEND01


SOC4MAP


LASTMAP




Easter Egg Mainframe

Pouca gente sabe, mas muitos desenvolvedores antigos escondiam mensagens em campos DRK (Dark).

Exemplo:

DFHMDF POS=(24,1),
LENGTH=20,
ATTRB=(DRK,PROT),
INITIAL='BELLACOSA RULES'

O usuário nunca via.

Mas bastava descarregar a TIOA em um dump IPCS para encontrar a mensagem.


Continua na Parte 3

Na próxima etapa construiremos um Sistema de Cadastro de Clientes completo, contendo:

✔ Cadastro, Consulta e Alteração;

✔ Campos protegidos e desbloqueados;

✔ Cursor dinâmico;

✔ FSET, MDT e FRSET;

✔ Mensagens de erro;

✔ PF3, PF5, PF7 e PF8;

✔ Múltiplos mapas no mesmo MAPSET;

✔ Fluxograma completo de navegação;

✔ Troubleshooting de MAPFAIL, INVREQ, LENGERR e ASRA;

✔ Curiosidades sobre SDF II, 3279 colorido e a evolução do BMS até o CICS TS 6.x.


domingo, 6 de maio de 2012

☕🔥 CICS COMMANDS — O UNIVERSO OCULTO QUE MOVE O MAINFRAME MUNDIAL

 

Bellacosa Mainframe e os comandos cics mainframe

☕🔥 CICS COMMANDS — O UNIVERSO OCULTO QUE MOVE O MAINFRAME MUNDIAL

A Anatomia Completa dos Comandos CICS Que Todo Programador IBM Z Precisa Dominar

O CICS (Customer Information Control System) não é apenas um monitor transacional.

Ele é o “sistema nervoso” de milhares de bancos, companhias aéreas, seguradoras, governos e bolsas de valores.

Enquanto aplicações web modernas fazem milhões de chamadas REST…

o CICS já fazia processamento transacional distribuído, controle de concorrência, recuperação automática, segurança, filas, locking e gerenciamento de sessões desde os anos 70.

E tudo isso através dos famosos:

EXEC CICS
END-EXEC

A lista enviada contém praticamente o “arsenal clássico” do programador CICS.

Agora vamos muito além da referência.

Vamos explorar:

  • arquitetura,

  • filosofia,

  • comportamento interno,

  • performance,

  • armadilhas,

  • uso real em produção,

  • relação com VSAM,

  • pseudo-conversação,

  • concorrência,

  • recovery,

  • e o impacto histórico de cada grupo de comandos.


🔥 1 — A FILOSOFIA DO CICS

Antes de entender comandos…

precisa entender o modelo mental do CICS.

O CICS NÃO funciona como batch.

No batch:

  • programa começa,

  • executa,

  • termina.

No CICS:

  • milhares de tarefas coexistem,

  • compartilham memória,

  • disputam recursos,

  • acessam arquivos simultaneamente,

  • conversam com terminais,

  • podem ser interrompidas,

  • retomadas,

  • rollbackadas,

  • sincronizadas.

Por isso os comandos CICS existem.

Eles são uma “API do sistema operacional transacional”.


☕ 2 — OS COMANDOS MAIS IMPORTANTES DA HISTÓRIA DO CICS

Se fosse montar o “Top Tier” dos comandos mais usados no mundo real:

CategoriaComandos
Navegação de telaSEND, RECEIVE, SEND MAP
Fluxo de programaLINK, XCTL, RETURN
Arquivos VSAMREAD, WRITE, REWRITE, DELETE
BrowseSTARTBR, READNEXT, ENDBR
FilasWRITEQ TS, READQ TS
Tratamento de erroHANDLE CONDITION
Controle transacionalSYNCPOINT
MemóriaGETMAIN, FREEMAIN
ConcorrênciaENQ, DEQ
TemporizaçãoSTART, DELAY
Debug/RecoveryABEND, DUMP

Esses comandos sustentam literalmente bilhões de transações diárias.


🔥 3 — LINK vs XCTL — O DUELO MAIS IMPORTANTE DO CICS

EXEC CICS LINK

EXEC CICS LINK PROGRAM('PROG2')
END-EXEC

O LINK:

  • chama outro programa,

  • espera terminar,

  • volta para o chamador.

É semelhante ao:

  • CALL COBOL,

  • subrotina,

  • procedure call.

Mas com superpoderes:

  • troca de contexto CICS,

  • proteção transacional,

  • comunicação entre regiões,

  • syncpoint awareness.


EXEC CICS XCTL

EXEC CICS XCTL PROGRAM('MENU001')
END-EXEC

Aqui o programa atual MORRE.

O controle é transferido.

Não existe retorno.

É praticamente um:

  • GOTO inter-programas.


Impacto arquitetural

LINK:

  • aumenta stack lógica,

  • mantém contexto,

  • pode gerar encadeamentos enormes.

XCTL:

  • economiza recursos,

  • reduz profundidade,

  • muito usado em menus.


☕ 4 — O CORAÇÃO DO CICS: SEND e RECEIVE

Sem SEND/RECEIVE…

não existiria terminal 3270.


SEND MAP

EXEC CICS SEND MAP('TELA1')
END-EXEC

O BMS:

  • formata tela,

  • monta buffer 3270,

  • gerencia atributos,

  • protege campos,

  • controla cursor.


RECEIVE MAP

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

Recebe:

  • ENTER,

  • PFKEY,

  • PAKEY,

  • dados digitados.


O detalhe histórico incrível

Os terminais 3270 NÃO eram “burros”.

Eles tinham:

  • buffer local,

  • atributos físicos,

  • otimização de transmissão.

O CICS explorava isso décadas antes do AJAX existir.


🔥 5 — HANDLE CONDITION — A “EXCEPTION” DO MUNDO MAINFRAME

EXEC CICS HANDLE CONDITION
     NOTFND(SEM-REGISTRO)
END-EXEC

É o ancestral dos:

  • try/catch,

  • exception handlers,

  • middleware exception routing.


O que poucos entendem

HANDLE CONDITION NÃO captura COBOL errors.

Ele captura:

  • RESP CICS,

  • condições transacionais,

  • erros de recurso,

  • timeouts,

  • locks,

  • fim de browse.


Problema clássico

Junior faz:

READ FILE
IF RESP NOT = NORMAL

Veterano faz:

HANDLE CONDITION
    NOTFND(...)
    DUPREC(...)
    ENDFILE(...)

Porque:

  • reduz boilerplate,

  • melhora legibilidade,

  • segue padrão CICS.


☕ 6 — READ UPDATE + REWRITE — O LOCK INVISÍVEL

Esse é um dos conceitos mais importantes do CICS.


READ UPDATE

EXEC CICS READ
     FILE('CLIENTE')
     RIDFLD(CHAVE)
     UPDATE
END-EXEC

Aqui o registro fica LOCKADO.

Nenhuma outra task altera.


Depois:

EXEC CICS REWRITE
END-EXEC

ou:

EXEC CICS UNLOCK
END-EXEC

O perigo mortal

Se esquecer:

  • REWRITE,

  • DELETE,

  • UNLOCK,

  • SYNCPOINT,

você cria:

  • contention,

  • deadlocks,

  • waits,

  • tasks congeladas.

Isso derruba produção REAL.


🔥 7 — STARTBR / READNEXT — O “CURSOR VSAM”

Esses comandos implementam navegação sequencial.


STARTBR

EXEC CICS STARTBR
     FILE('CLI')
     RIDFLD(CHAVE)
END-EXEC

Abre um browse.


READNEXT

EXEC CICS READNEXT
END-EXEC

Lê o próximo.


ENDBR

EXEC CICS ENDBR
END-EXEC

Fecha browse.


Isso é equivalente ao quê?

Praticamente um cursor DB2.

Mas para:

  • VSAM KSDS,

  • RRDS,

  • ESDS.


☕ 8 — WRITEQ TS — O REDIS DOS ANOS 80

Temporary Storage Queue.


WRITEQ TS

EXEC CICS WRITEQ TS
     QUEUE('TEMP01')
END-EXEC

READQ TS

EXEC CICS READQ TS
END-EXEC

O que isso fazia?

Muito antes de:

  • Redis,

  • Memcached,

  • sessões web,

o CICS já tinha:

  • filas temporárias,

  • compartilhamento de estado,

  • persistência opcional,

  • armazenamento em memória ou disco.


TS Queue virou:

  • sessão web primitiva,

  • cache transacional,

  • passing area,

  • workflow storage.


🔥 9 — SYNCPOINT — O COMMIT DO CICS

EXEC CICS SYNCPOINT
END-EXEC

Esse comando é MONSTRUOSAMENTE importante.

Ele sincroniza:

  • VSAM,

  • DB2,

  • MQ,

  • journals,

  • recoverable TS queues.


Sem SYNCPOINT

Nada é garantido.


Com ROLLBACK

EXEC CICS SYNCPOINT ROLLBACK
END-EXEC

Tudo volta.


Isso é engenharia de altíssimo nível

O CICS fazia two-phase commit quando boa parte do mundo ainda usava arquivos flat sem recovery.


☕ 10 — GETMAIN / FREEMAIN — O malloc/free DO CICS


GETMAIN

EXEC CICS GETMAIN
     SET(PTR)
     LENGTH(1000)
END-EXEC

Aloca memória.


FREEMAIN

EXEC CICS FREEMAIN
     DATA(PTR)
END-EXEC

Libera memória.


O problema clássico

Se esquecer FREEMAIN:

🔥 storage leak.

E em CICS:

  • leak = SOS condition,

  • região degradando,

  • task abending,

  • operação entrando em pânico.


🔥 11 — ENQ / DEQ — O CONTROLE DE CONCORRÊNCIA EMPRESARIAL


ENQ

EXEC CICS ENQ
     RESOURCE('CLIENTE123')
END-EXEC

Reserva recurso lógico.


DEQ

EXEC CICS DEQ
END-EXEC

Libera.


Isso é fundamental porque:

Em sistemas financeiros:

  • duas tasks NÃO podem atualizar simultaneamente.


Exemplos reais

  • saldo bancário,

  • limite de cartão,

  • número de apólice,

  • geração de boleto,

  • emissão de passagem aérea.


☕ 12 — ABEND — O GRITO DE SOCORRO DO CICS

EXEC CICS ABEND
     ABCODE('ERRO')
END-EXEC

Força abend.


Por que isso existe?

Porque às vezes continuar é PIOR.

O ABEND:

  • protege integridade,

  • força rollback,

  • gera dump,

  • interrompe corrupção.


Grandes sistemas usam isso estrategicamente

Em ambientes críticos:

  • “falhar rápido” é mais seguro.


🔥 13 — DUMP — A AUTÓPSIA DIGITAL

EXEC CICS DUMP
END-EXEC

Gera snapshot da região.


Dump contém:

  • memória,

  • TCA,

  • TWA,

  • COMMAREA,

  • registers,

  • control blocks,

  • trace.


O dump é literalmente:

a caixa-preta do avião do mainframe.


☕ 14 — START — O AGENDADOR INTERNO

EXEC CICS START
     TRANSID('TRN1')
END-EXEC

Agenda transação futura.


Isso criou:

  • workflows,

  • processamento assíncrono,

  • retries automáticos,

  • timers,

  • batch online.

Muito antes de:

  • Kafka,

  • cron distribuído,

  • microservices schedulers.


🔥 15 — RETURN COMMAREA — O SEGREDO DA PSEUDO-CONVERSAÇÃO

Esse é o conceito MAIS IMPORTANTE do CICS clássico.


O problema

Terminal é lento.

Não dá para deixar task presa esperando usuário digitar.


Solução genial do CICS

A task termina.

Mas guarda estado.


RETURN COMMAREA

EXEC CICS RETURN
     TRANSID('MENU')
     COMMAREA(AREA)
END-EXEC

O que acontece?

  1. Task termina

  2. Usuário pensa

  3. Nova task nasce

  4. COMMAREA restaura contexto


Isso revolucionou computação

Pseudo-conversação:

  • economiza memória,

  • aumenta escalabilidade,

  • permite milhares de usuários simultâneos.

Esse conceito foi MUITO à frente do seu tempo.


☕ 16 — O QUE SEPARA UM JUNIOR DE UM VETERANO CICS

Junior:

  • aprende sintaxe.

Veterano:

  • entende:

    • locking,

    • pseudo-conversação,

    • recovery,

    • task lifetime,

    • syncpoint,

    • storage,

    • contention,

    • dispatching,

    • response time.


🔥 17 — A VERDADE QUE POUCOS FALAM SOBRE CICS

Muitos pensam:

“CICS é antigo.”

Mas a realidade é:

O CICS resolveu:

  • concorrência massiva,

  • alta disponibilidade,

  • transação distribuída,

  • recovery,

  • rollback,

  • escalabilidade,

  • segurança,

  • workload management,

décadas antes da computação moderna reinventar esses conceitos.

Grande parte do que hoje chamam:

  • microservices,

  • orchestration,

  • transactional middleware,

  • distributed coordination,

o CICS já fazia em produção bancária desde o século passado.


☕ CONCLUSÃO — O CICS NÃO É APENAS UM PRODUTO

É UMA DAS MAIORES OBRAS DE ENGENHARIA DA HISTÓRIA DA COMPUTAÇÃO

Cada comando CICS carrega:

  • décadas de evolução,

  • engenharia enterprise,

  • otimização extrema,

  • compatibilidade histórica,

  • confiabilidade absurda.

Quando alguém escreve:

EXEC CICS READ

existe um universo inteiro acontecendo por trás:

  • locks,

  • buffers,

  • recovery,

  • journaling,

  • dispatching,

  • integrity control,

  • syncpoint management,

  • task scheduling.

E é exatamente isso que torna o mundo IBM Z tão fascinante.