| Bellacosa Mainframe e o CICS BMS faça o seu primeiro mapa 3270 |
🚀 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."
"O BMS está com problema."
"O RECEIVE MAP retornou MAPFAIL."
"Verifica o DFHAID."
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 3270
Essa 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=Gravar
Essa tela inteira é um MAP.
O que é um MAPSET?
Um MAPSET é um conjunto de MAPs.
Exemplo:
MAPSET CLIENTE
LOGIN
MENU
CONSULTA
INCLUSAO
ALTERACAO
CONFIRMACAO
Um ú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
DFHMDF
Se 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=AUTO
Ele funciona como o cabeçalho do MAPSET.
TYPE
O parâmetro TYPE possui três valores importantes.
MAP
Gera o Physical Map.
TYPE=MAP
DSECT
Gera o Symbolic Map.
TYPE=DSECT
FINAL
Finaliza o MAPSET.
DFHMSD TYPE=FINAL
DFHMDI
Define uma tela.
Exemplo:
MENU01 DFHMDI SIZE=(24,80)
Significa:
24 linhas
80 colunas
Padrã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=PROT
Usuário não altera.
UNPROT
Campo editável.
ATTRB=UNPROT
ASKIP
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
END
Pronto.
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.
DFHRPL
Symbolic Map
Copybook COBOL.
Utilizado pelo programa.
COPYLIB
Fluxo de Geração
Fonte BMS
│
Assembler
│
+-----------+
| Physical |
+-----------+
│
DFHRPL
│
+-----------+
| Symbolic |
+-----------+
│
COPYLIB
JCL 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=&SYSPARM
para 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-EXEC
RECEIVE MAP
Recebe dados.
EXEC CICS
RECEIVE MAP('TELA01')
MAPSET('HELLOMAP')
INTO(TELA01I)
END-EXEC
EIBAID
Após RECEIVE verificamos qual tecla foi pressionada.
COPY DFHAID.
Exemplo:
IF EIBAID = DFHPF3
GO TO SAIDA
END-IF
Teclas Mais Utilizadas
ENTER
PF3
PF5
PF7
PF8
PF12
CLEAR
Capturando 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-EVALUATE
HANDLE AID
Alternativa elegante.
EXEC CICS HANDLE AID
DFHENTER(PROCESSA)
DFHPF3(SAIR)
DFHPF5(GRAVAR)
END-EXEC
O CICS faz o roteamento automaticamente.
Posicionando o Cursor
O truque clássico.
MOVE -1 TO NOMEL
Depois:
EXEC CICS
SEND MAP
CURSOR
END-EXEC
O cursor será posicionado naquele campo.
Tela Real de Cadastro
Imagine:
CLIENTE
Código....: _____
Nome......: ____________________
Cidade....: ____________________
Telefone..: _______________
PF3=Sair
PF5=Gravar
PF12=Cancelar
Campos 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 ENTER
Não.
O CICS mata a task.
Sempre.
Fluxo real:
EXEC CICS SEND MAP
EXEC CICS RETURN
Task termina.
Usuário pressiona ENTER.
Nova task é criada.
EXEC CICS RECEIVE MAP
Processamento 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
IMS
Separaçã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) DISABLED
O Easter Egg dos Campos MDT
Muitos iniciantes não sabem:
Se um campo não for alterado:
MDT=0
Ele pode nem retornar ao programa.
Por isso existe:
FSET
Que força:
MDT=1
Curiosidade 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 TS
Hoje temos:
CICS Transaction Server
executando 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.