COBOL - Exemplos: instruções CALL estáticas e dinâmicas



Desenvolvido por DORNELLES Carlos Alberto - Analista de Sistemas - Brasília DF. - cad_cobol@hotmail.com

COBOL - Estruturação de aplicativos complexos - Exemplos: instruções CALL estáticas e dinâmicas

Enterprise COBOL for z/OS, Version 4.2, Programming Guide


Este exemplo mostra como você pode codificar chamadas estáticas e dinâmicas.

O exemplo tem três partes:

  • Código que usa uma chamada estática para chamar um subprograma
  • Código que usa uma chamada dinâmica para chamar o mesmo subprograma
  • O subprograma que é chamado pelos dois tipos de chamadas

O exemplo a seguir mostra como você codificaria chamadas estáticas:

PROCESS NODYNAM NODLL
IDENTIFICATION DIVISION.
DATA DIVISION.
WORKING-STORAGE SECTION.
01  RECORD-2                   PIC X.              (6)
01  RECORD-1.                                      (2)
    05  PAY                    PICTURE S9(5)V99.
    05  HOURLY-RATE            PICTURE S9V99.
    05  HOURS                  PICTURE S99V9.
. . .
PROCEDURE DIVISION.
    CALL "SUBPROG" USING RECORD-1.                 (1)
    CALL "PAYMASTR" USING RECORD-1 RECORD-2.       (5)
    STOP RUN. 

O exemplo a seguir mostra como você codificaria chamadas dinâmicas:

DATA DIVISION.
WORKING-STORAGE SECTION.
77  PGM-NAME                   PICTURE X(8).
01  RECORD-2                   PIC x.              (6)
01  RECORD-1.                                      (2)
    05  PAY                    PICTURE S9(5)V99.
    05  HOURLY-RATE            PICTURE S9V99.
    05  HOURS                  PICTURE S99V9.
. . .
PROCEDURE DIVISION.
. . .
    MOVE "SUBPROG" TO PGM-NAME.
    CALL PGM-NAME USING RECORD-1.                  (1)
    CANCEL PGM-NAME.
    MOVE "PAYMASTR" TO PGM-NAME.                   (4)
    CALL PGM-NAME USING RECORD-1 RECORD-2.         (5)
    STOP RUN.

O exemplo a seguir mostra um subprograma chamado que é chamado por cada um dos dois programas de chamada anteriores:

IDENTIFICATION DIVISION.
PROGRAM-ID. SUBPROG.
DATA DIVISION.
LINKAGE SECTION.
01  PAYREC.                                        (2)
    10 PAY            PICTURE S9(5)V99.
    10 HOURLY-RATE    PICTURE S9V99.
    10 HOURS          PICTURE S99V9.
77  PAY-CODE          PICTURE 9.                   (6)
PROCEDURE DIVISION USING PAYREC.                   (1)
. . .
    EXIT PROGRAM.                                  (3)
    ENTRY "PAYMASTR" USING PAYREC PAY-CODE.        (5)
    . . .
    GOBACK.                                        (7)
(1)
O processamento começa no programa de chamada.
Quando a primeira instrução CALL é executada, o controle é transferido para a primeira instrução de PROCEDURE DIVISION em SUBPROG, que é o programa chamado.

Em cada uma das instruções CALL, o operando da primeira opção USING é identificado como RECORD-1.

(2)
Quando SUBPROG recebe o controle, os valores em RECORD-1 são disponibilizados para SUBPROG; no entanto, em SUBPROG, eles são chamados de PAYREC.

As sequências de caracteres PICTURE em PAYREC e PAY-CODE contêm o mesmo número de caracteres que RECORD-1 e RECORD-2, embora as descrições não sejam idênticas.

(3)
Quando o processamento em SUBPROG atinge a instrução EXIT PROGRAM, o controle é retornado ao programa de chamada.
O processamento continua naquele programa até que a segunda instrução CALL seja emitida.
(4)
No exemplo de um programa chamado dinamicamente, porque a segunda instrução CALL se refere a outro ponto de entrada em SUBPROG, uma instrução CANCEL é emitida antes da segunda instrução CALL.
(5)
Com a segunda instrução CALL no programa de chamada, o controle é novamente transferido para SUBPROG, mas desta vez o processamento começa na instrução seguinte à instrução ENTRY em SUBPROG.
(6)
Os valores em RECORD-1 são novamente disponibilizados para PAYREC.
Além disso, o valor em RECORD-2 agora é disponibilizado para SUBPROG por meio do operando USING correspondente, PAY-CODE.

Quando o controle é transferido pela segunda vez do programa vinculado estaticamente, SUBPROG é disponibilizado em seu último estado usado (ou seja, se algum valor no armazenamento de SUBPROG foi alterado durante a primeira execução, esses valores alterados ainda estão em vigor).
Quando o controle é transferido do programa vinculado dinamicamente, no entanto, SUBPROG é disponibilizado em seu estado inicial, por causa da instrução CANCEL que foi executada.

(7)
Quando o processamento atinge a instrução GOBACK, o controle é retornado ao programa de chamada na instrução imediatamente após a segunda instrução CALL.

Em qualquer execução do programa chamado e em qualquer um dos dois programas de chamada, se os valores em RECORD-1 forem alterados entre o momento da primeira CALL e a segunda, os valores passados no momento da segunda instrução CALL serão valores alterados, não os originais.
Se quiser usar os valores originais, você deve salvá-los.


© Copyright IBM Corp.