segunda-feira, 28 de março de 2016

Chamada de programa via Container

Olá!

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:

  1. É gravado um container de requisição para a rotina A.
  2. A rotina A recupera o container de requisição.
  3. Após processar os dados de entrada a rotina A grava um container de requisição para a rotina B.
  4. A rotina B recupera o container com os dados de entrada gravado pela rotina A.
  5. Se ocorrer ERRO no processamento da rotina B é gravado um container de erro, se não é executado o passo 6.
  6. Após todo o processamento da rotina B é gravado o container de resposta.
  7. 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.
  8. A rotina A recupera o container de resposta da rotina B.
  9. Grava um container de ERRO se acontecer um erro de processamento na rotina A, antes ou depois de requisitar outra rotina.
  10. Após todo o processamento da rotina A, é gravado um container de resposta.
  11. Quem requisitou a rotina A recupera a resposta da execução.
Os três comandos básicos para uma comunicação via container são: EXEC CICS PUT, LINK e GET.
  • 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.

Para Ctrl + C dos códigos acesse aqui.
Consultar a relação de Termos e Abreviaturas acesse aqui.

Até o próximo post!

Nenhum comentário:

Postar um comentário