Chamada de programas COBOL via Container.
A comunicação entre as rotinas/programas COBOL pode ser realizada de variadas formas, neste post será demonstrado como realizar a comunicação entre rotinas por meio de container.
A comunicação via container é realizada dentro de um canal de comunicação, e dentro deste canal é gravado os containers de requisição e de resposta.
Então, antes de requisitar a chamada da ROTINA-B é necessário que a ROTINA-A tenha gravado o container de requisição para a ROTINA-B. Assim, um dos primeiros processos que serão executados pela ROTINA-B é de recuperar o container de requisição, de modo que após todo o seu processamento será gravado no canal de comunicação um container com a resposta da execução da ROTINA-B, para que a ROTINA-A recupere este container.
A imagem abaixo demonstra um exemplo de cada processo (passo) que é executado, para haver comunicação via container.
Os passos numerados na imagem acima, são:
- É gravado um container de requisição para a rotina A.
- A rotina A recupera o container de requisição.
- Após processar os dados de entrada a rotina A grava um container de requisição para a rotina B.
- A rotina B recupera o container com os dados de entrada gravado pela rotina A.
- Se ocorrer ERRO no processamento da rotina B é gravado um container de erro, se não é executado o passo 6.
- Após todo o processamento da rotina B é gravado o container de resposta.
- Ao voltar a rotina A, está tenta recuperar um container de ERRO. De modo a verificar se ocorreu algum problema na execução da rotina B. Se não ocorreu nada é executado o passo 8.
- A rotina A recupera o container de resposta da rotina B.
- Grava um container de ERRO se acontecer um erro de processamento na rotina A, antes ou depois de requisitar outra rotina.
- Após todo o processamento da rotina A, é gravado um container de resposta.
- Quem requisitou a rotina A recupera a resposta da execução.
- Grava o container de dados no canal de comunicação:
EXEC CICS PUT
CONTAINER ( 'NM-CTNR-*' ) * Nome do container
FROM ( DADO-RPST-RTIN-* ) * Nível 1 do grupo das variáveis
FLENGTH ( LENGTH OF DADO-RPST-RTIN-* ) *
Nível 1 do grupo das variáveis
RESP ( CICS-RESP ) * Variável para o de código
CICS
RESP2 ( CICS-RESP2 ) * Variável para o de código
CICS
END-EXEC.
- Realiza a chamada para a outra rotina.
EXEC CICS LINK
PROGRAM ( 'ROTINA-B' ) * Nome do container
CHANNEL ( CANAL-ATUAL ) * Variável
que armazena o canal de comunicação
RESP ( CICS-RESP ) * Variável para o de código CICS
RESP2 ( CICS-RESP2 ) * Variável para o de código CICS
END-EXEC.
- Recupera o container de dados do canal de comunicação.
EXEC CICS GET
CONTAINER ( 'NM-CTNR-*' ) * Nome do container
CHANNEL ( CANAL-ATUAL ) * Variável que armazena o
canal de comunicação
INTO (
DADO-RQSC-RTIN-* ) * Nível 1 do
grupo das variáveis
FLENGTH ( LENGTH OF DADO-RQSC-RTIN-* ) * Nível 1 do grupo
das variáveis
RESP ( CICS-RESP ) * Variável para o de código
CICS
RESP2
( CICS-RESP2 ) * Variável
para o de código CICS
END-EXEC.
No código de exemplo não foi utilizado o Delete container. Mas é uma boa
pratica deletar o container que irá ser gravado, é uma forma de garantir que
não terá sujeira no container a ser gravado no canal de comunicação.
A section para realizar o Delete container, é:
*
*----------------------------------------------------------------*
950000-EXCR-CTNR-DADO-RPST SECTION.
*----------------------------------------------------------------*
*
-- DELETA O CONTAINER DE RESPOSTA SE ESTE EXISTIR
*
EXEC CICS DELETE
CONTAINER ( ‘nome-do-container' )
CHANNEL ( CANAL-ATUAL )
RESP ( CICS-RESP )
RESP2 ( CICS-RESP2 )
END-EXEC.
*
EVALUATE TRUE
WHEN CICS-RESP = DFHRESP(CONTAINERERR)
WHEN CICS-RESP =
DFHRESP(NORMAL)
MOVE ZEROS TO CICS-RESP
CICS-RESP2
WHEN OTHER
PERFORM 99900x-ERRO-0x
END-EVALUATE.
*
950000-FIM.
EXIT.
*
Para não produzir uma página grande, neste post não adicionei os prints do código COBOL. Mas não se preocupe acesse os códigos da rotina A e da rotina B logo abaixo.
Nenhum comentário:
Postar um comentário