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:
- A ROTINA-A realiza a chamada (CALL / LINK ) da ROTINA-C via Commarea, informando o código do aluno.
- Então a ROTINA-C recebe o código do aluno e faz seu processamento para retornar o nome do aluno.
- Assim a ROTINA-C preenche a variável NM-ALUNO na área comum com o nome do aluno referente ao código informado.
- De modo que a ROTINA-C devolve (GOBACK) o processamento para a ROTINA-A.
- 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:
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.
Nenhum comentário:
Postar um comentário