segunda-feira, 18 de abril de 2016

Chamada de programa via Commarea

Olá!

Em um post anterior (Chamada de programas COBOL via Container) apresentei uma das formas de realizar o trânsito de dados entre os programas COBOL com o uso de containers. Neste post será demonstrado a utilização de Commarea, que é mais uma forma de como os dados podem ser tramitados.

Sendo que uma das características que diferenciam a chamada via Container e Commarea, é o tamanho da informação que pode ser passada de um programa para o outro. Por exemplo, quando utilizamos Container é possível tramitar até 64.000k de bytes dentro de um container, e quando é feito via Commarea somente até 32.000k bytes. Para mais informações sobre a quantidade de dados suportados veja no post:
Quantidade de dados suportados Commarea / Container.

Assim, a idea básica, é que quando uma ROTINA-A chama a ROTINA-C via Commarea, é criado uma área comum que "conectar" as duas rotinas, de modo que essa área pode suportar até 32.000k bytes de informação.

Para melhor entender veja a imagem abaixo e a descrição de seus processos, que simulam a chamada da ROTINA-C para retornar o nome do aluno à ROTINA-A:

Fluxo de dados via Commarea

Os processos para o fluxo de dados para a imagem acima, são:

  1. A ROTINA-A realiza a chamada (CALL / LINK ) da ROTINA-C via Commarea, informando o código do aluno.
  2. Então a ROTINA-C recebe o código do aluno e faz seu processamento para retornar o nome do aluno.
  3. Assim a ROTINA-C preenche a variável NM-ALUNO na área comum com o nome do aluno referente ao código informado.
  4. De modo que a ROTINA-C devolve (GOBACK) o processamento para a ROTINA-A.
  5. Por fim, ao retornar a ROTINA-A a variável já está preenchida com o nome do aluno, assim está rotina continuará com o seu processamento.
E não necessariamente as duas rotinas precisam ser Commarea, pois como está sendo apresentado a chamada da ROTINA-C é feita via Commarea. Então, o programa que está sendo chamado (ROTINA-C) tem que ser Commarea, por outro lado o programa chamador (ROTINA-A) pode ser Commarea ou Container.

Então, para apresentar o respectivo processo da imagem acima, irei utilizar o mesmo código da ROTINA-A usado no post citado logo no inicio, só que com a incrementação do código para chamar a ROTINA-C.

O que defini as variáveis que comporão a área comum é o que está na Linkage Section da rotina que irá ser chamada (ROTINA-C). Sendo uma boa pratica que está área seja um BOOK, pois no programa chamador (ROTINA-A) deverá conter a mesma declaração de variáveis. Então, para facilitar cria-se um book que ambos programas deverão incluir.

Os comandos principais na ROTINA-A e ROTINA-C para esse tipo de chamada, são apresentados abaixo:

ROTINA-C
O book da ROTINA-C:
           03 REQUISICAO.
      * --    OBRIGATORIOS
               05 CD-ALUNO                       PIC  9(009) COMP.
      *
           03 RESPOSTA.
      * --    CONTROLE DE ERRO
               05 CD-ERRO                        PIC  9(009) COMP.
               05 TX-ERRO                        PIC  X(120).
      * --    DADOS PROCESSADOS

               05 NM-ALUNO                       PIC  X(050).

Sendo que o book acima será incluído logo na Linkage Section da ROTINA-C:
      *
      *----------------------------------------------------------------*
       LINKAGE                          SECTION.
      *----------------------------------------------------------------*
      * BOOK INCLUIDO DA ROTINA-C
       01 DFHCOMMAREA.
-INC BOOK-ROTINA-C

ROTINA-A
As alterações necessárias na ROTINA-A para realizar a chamada da ROTINA-C, são:

  • O include do book da ROTINA-C:

      * BOOK INCLUIDO DA ROTINA-C
       01 BOOK-DA-ROTINA-C.
-INC BOOK-ROTINA-C


  • O comando EXEC CICS LINK:

           EXEC CICS LINK
              PROGRAM  ( 'ROTINA-C'              )
              COMMAREA ( BOOK-ROTINA-C           )
              LENGTH   ( LENGTH OF BOOK-ROTINA-C )
              RESP     ( CICS-RESP               )
              RESP2    ( CICS-RESP2              )
           END-EXEC.

De modo que a ROTINA-C também pode ser chamada por meio de um comando CALL, e para não deixar uma página grande, este será demonstrado em outro post.

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

Até o próximo post!