🚀 CICS BMS para Padawans: Do Primeiro MAP ao Mundo Real dos Sistemas Bancários
Salve, jovem Padawan!
Se você começou recentemente sua jornada no universo IBM Mainframe, provavelmente já ouviu alguém dizer:
"Precisamos alterar o MAPSET."
E naquele momento você pensou:
"Mas afinal, o que é um MAP? O que é um MAPSET? E por que existe um programa Assembly dentro de uma aplicação COBOL?"
Respire fundo.
Hoje vamos mergulhar em um dos componentes mais clássicos do CICS: o BMS (Basic Mapping Support), a tecnologia que durante décadas foi responsável pelas telas utilizadas por bancos, seguradoras, companhias aéreas, operadoras de telecomunicações e praticamente qualquer grande empresa que executava aplicações online em Mainframe.
Prepare seu terminal 3270 imaginário.
Vamos começar.
Antes do BMS
Nos primeiros anos do processamento online, cada terminal possuía características próprias.
O programador precisava conhecer:
- Modelo do terminal
- Posicionamento da tela
- Características do dispositivo
- Códigos de controle
Isso gerava enorme dependência de hardware.
Para resolver esse problema, a IBM criou o BMS.
O que é BMS?
BMS significa:
Basic Mapping Support
Ou:
Suporte Básico de Mapeamento
O objetivo do BMS é separar:
- Interface do usuário
- Lógica de negócio
Em vez do programa COBOL controlar diretamente a tela, ele conversa com o BMS.
O BMS conversa com o terminal.
Arquitetura Simplificada
COBOL
│
▼
Symbolic Map
│
▼
BMS
│
▼
Physical Map
│
▼
Terminal 3270Essa separação tornou os sistemas muito mais flexíveis.
O que é um MAP?
Um MAP é uma tela.
Exemplo:
+--------------------------------------+
| CADASTRO DE CLIENTES |
+--------------------------------------+
Código.....: _____
Nome.......: _______________________
Cidade.....: _______________________
PF3=Sair PF5=GravarEssa tela inteira é um MAP.
O que é um MAPSET?
Um MAPSET é um conjunto de MAPs.
Exemplo:
MAPSET CLIENTE
LOGIN
MENU
CONSULTA
INCLUSAO
ALTERACAO
CONFIRMACAOUm único programa pode utilizar vários MAPs pertencentes ao mesmo MAPSET.
As Três Macros Sagradas do BMS
Todo BMS possui apenas três macros principais:
DFHMSD
DFHMDI
DFHMDFSe você entender essas três macros, entenderá praticamente todo o BMS.
DFHMSD
Define o MAPSET.
Exemplo:
CLIENTE DFHMSD TYPE=&SYSPARM,
LANG=COBOL,
MODE=INOUT,
TIOAPFX=YES,
STORAGE=AUTOEle funciona como o cabeçalho do MAPSET.
TYPE
O parâmetro TYPE possui três valores importantes.
MAP
Gera o Physical Map.
TYPE=MAPDSECT
Gera o Symbolic Map.
TYPE=DSECTFINAL
Finaliza o MAPSET.
DFHMSD TYPE=FINALDFHMDI
Define uma tela.
Exemplo:
MENU01 DFHMDI SIZE=(24,80)Significa:
24 linhas
80 colunasPadrão dos terminais 3270 clássicos.
DFHMDF
Define um campo.
Exemplo:
NOME DFHMDF POS=(5,20),
LENGTH=30,
ATTRB=(UNPROT)Aqui estamos criando um campo editável.
Atributos Mais Utilizados
PROT
Campo protegido.
ATTRB=PROTUsuário não altera.
UNPROT
Campo editável.
ATTRB=UNPROTASKIP
Cursor pula automaticamente.
Muito usado em títulos.
IC
Initial Cursor.
Posiciona cursor inicialmente.
ATTRB=(UNPROT,IC)NUM
Aceita apenas números.
ATTRB=(UNPROT,NUM)FSET
Força MDT.
Campo sempre retorna ao programa.
DRK
Campo invisível.
Muito usado para IDs internos.
Nosso Primeiro Hello World BMS
HELLOMAP DFHMSD TYPE=&SYSPARM,
LANG=COBOL,
MODE=INOUT,
TIOAPFX=YES
TELA01 DFHMDI SIZE=(24,80)
DFHMDF POS=(1,25),
LENGTH=20,
INITIAL='HELLO CICS WORLD',
ATTRB=(PROT,BRT)
DFHMDF POS=(5,10),
LENGTH=20,
INITIAL='Digite Nome:',
ATTRB=(PROT)
NOME DFHMDF POS=(5,30),
LENGTH=30,
ATTRB=(UNPROT,IC)
DFHMSD TYPE=FINAL
ENDPronto.
Você acabou de criar sua primeira tela CICS.
O Processo de Compilação
O BMS gera dois artefatos.
Physical Map
Load Module.
Utilizado pelo CICS.
DFHRPLSymbolic Map
Copybook COBOL.
Utilizado pelo programa.
COPYLIBFluxo de Geração
Fonte BMS
│
Assembler
│
+-----------+
| Physical |
+-----------+
│
DFHRPL
│
+-----------+
| Symbolic |
+-----------+
│
COPYLIBJCL de Montagem
Normalmente:
//ASM EXEC PGM=ASMA90,
//PARM='MAP'Para gerar Physical.
Depois:
//ASM EXEC PGM=ASMA90,
//PARM='DSECT'Para gerar Symbolic.
Muitos ambientes usam:
TYPE=&SYSPARMpara gerar ambos a partir do mesmo fonte.
O Copybook Gerado
O BMS gera estruturas automaticamente.
Exemplo:
01 TELA01I.
05 NOMEL PIC S9(4) COMP.
05 NOMEF PIC X.
05 NOMEI PIC X(30).
01 TELA01O.
05 NOMEO PIC X(30).O Significado dos Campos
NOMEL
Comprimento digitado.
NOMEF
Flag MDT.
NOMEI
Entrada.
NOMEO
Saída.
SEND MAP
Exibe tela.
EXEC CICS
SEND MAP('TELA01')
MAPSET('HELLOMAP')
FROM(TELA01O)
ERASE
FREEKB
END-EXECRECEIVE MAP
Recebe dados.
EXEC CICS
RECEIVE MAP('TELA01')
MAPSET('HELLOMAP')
INTO(TELA01I)
END-EXECEIBAID
Após RECEIVE verificamos qual tecla foi pressionada.
COPY DFHAID.Exemplo:
IF EIBAID = DFHPF3
GO TO SAIDA
END-IFTeclas Mais Utilizadas
ENTER
PF3
PF5
PF7
PF8
PF12
CLEARCapturando PF Keys
EVALUATE EIBAID
WHEN DFHENTER
PERFORM PROCESSA
WHEN DFHPF3
PERFORM SAIR
WHEN DFHPF5
PERFORM GRAVAR
WHEN DFHPF7
PERFORM PAGE-UP
WHEN DFHPF8
PERFORM PAGE-DOWN
END-EVALUATEHANDLE AID
Alternativa elegante.
EXEC CICS HANDLE AID
DFHENTER(PROCESSA)
DFHPF3(SAIR)
DFHPF5(GRAVAR)
END-EXECO CICS faz o roteamento automaticamente.
Posicionando o Cursor
O truque clássico.
MOVE -1 TO NOMELDepois:
EXEC CICS
SEND MAP
CURSOR
END-EXECO cursor será posicionado naquele campo.
Tela Real de Cadastro
Imagine:
CLIENTE
Código....: _____
Nome......: ____________________
Cidade....: ____________________
Telefone..: _______________
PF3=Sair
PF5=Gravar
PF12=CancelarCampos Protegidos
ATTRB=(PROT)Usuário não altera.
Campos Editáveis
ATTRB=(UNPROT)Usuário digita.
Campo Invisível
ATTRB=(DRK)Muito usado para:
- IDs internos
- Chaves VSAM
- Controle de paginação
- Status ocultos
Pseudo-Conversação
Um dos conceitos mais importantes do CICS.
Iniciantes imaginam:
Programa fica executando
esperando ENTERNão.
O CICS mata a task.
Sempre.
Fluxo real:
EXEC CICS SEND MAP
EXEC CICS RETURNTask termina.
Usuário pressiona ENTER.
Nova task é criada.
EXEC CICS RECEIVE MAPProcessamento continua.
Por isso chamamos:
Pseudo-Conversação
Parece contínuo.
Mas não é.
Arquitetura de Três Camadas
Uma boa prática.
MAP
│
Programa CICS
│
Camada Negócio
│
DB2
VSAM
MQ
IMSSeparação melhora manutenção.
Cadastro da Transação
CEDA.
Criar programa:
CEDA DEF PROGRAM(PROGCLI)Criar transação:
CEDA DEF TRANS(CLI1)
PROGRAM(PROGCLI)Instalar:
CEDA INSTALL GROUP(MYGRP)CEMT
Visualizar recursos.
Programa:
CEMT INQ PROGRAM(PROGCLI)Transação:
CEMT INQ TRANS(CLI1)Desabilitar:
CEMT SET PROGRAM(PROGCLI) DISABLEDO Easter Egg dos Campos MDT
Muitos iniciantes não sabem:
Se um campo não for alterado:
MDT=0Ele pode nem retornar ao programa.
Por isso existe:
FSETQue força:
MDT=1Curiosidade Histórica
O BMS surgiu para suportar os terminais IBM 3270.
Na época, largura de banda era extremamente limitada.
Cada byte enviado importava.
Por isso o protocolo 3270 era absurdamente eficiente.
Muito mais eficiente que várias interfaces modernas.
Quem Criou?
O BMS nasceu dentro do ecossistema CICS da IBM durante a expansão dos sistemas transacionais nas décadas de 1970 e 1980.
Ele se tornou padrão de mercado para aplicações online em Mainframe.
Releases do CICS
Alguns marcos históricos:
CICS DOS
CICS OS/VS
CICS MVS
CICS ESA
CICS TSHoje temos:
CICS Transaction Serverexecutando em z/OS moderno.
Curiosidade Bancária
Existem sistemas em produção hoje com:
- 30 anos
- 40 anos
- milhões de linhas COBOL
- centenas de MAPSETs
que continuam usando exatamente o mesmo conceito BMS criado décadas atrás.
Conclusão
O BMS é muito mais do que um simples mecanismo de telas.
Ele representa uma filosofia de arquitetura que separa interface, apresentação e lógica de negócio, permitindo que aplicações COBOL permaneçam estáveis por décadas.
Todo desenvolvedor COBOL que deseja atuar seriamente com CICS precisa dominar:
- MAP
- MAPSET
- DFHMSD
- DFHMDI
- DFHMDF
- SEND MAP
- RECEIVE MAP
- DFHAID
- EIBAID
- Pseudo-conversação
- CEDA
- CEMT
Esses conceitos aparecem diariamente em bancos, seguradoras, operadoras, bolsas de valores e empresas que processam bilhões de transações por dia.
E agora, jovem Padawan, quando alguém disser:
"Precisamos alterar o MAPSET."
você já saberá exatamente do que estão falando.
☕ Até o próximo Café no Bellacosa Mainframe.