Translate

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.


Sem comentários:

Enviar um comentário