MainframeSupports
tip uge 24/1999:

 
Selvom ANS85 Cobol nu har nogle år på bagen, er der vist nogle få features, som det ikke er alle Cobol programmører, der har kendskab til. Kender du f.eks. til "Nested programs"?

Et nested program er Cobols ord for en intern procedure. En intern procedure adskiller sig fra en paragraph eller en section ved, at den har sine egne variable, der er skjult for overprogrammet - fuldstændigt som en ekstern procedure. Forskellen er, at de kan dele variable, hvis de ønsker det. En anden fordel er, at en intern procedures navn kan være længere end 8 karakterer.

Det er faktisk meget enkelt at benytte nestede programmer. Man har simpelthen en ny "IDENTIFICATION DIVISION. PROGRAM-ID." i bunden af hovedprogrammet. Navnet efter PROGRAM-ID er navnet på den interne procedure. Man kan have mange interne procedurer i et program, og sågar interne procedurer inden i interne procedurer. For at compileren kan finde rundt i det hele, må man fortælle, hvornår en procedure slutter. Det gøres med et "END PROGRAM xxx" statement.

Lad os se på et eksempel:

IDENTIFICATION DIVISION
PROGRAM ID. OVER1.
ENVIRONMENT DIVISION.
:
DATA DIVISION.
WORKING-STORAGE SECTION.
77 FELT1 PIC X(8).
77 P1 PIC 9(3).
:
IDENTIFICATION DIVISION.
:
CALL 'LAV-ET-ELLER-ANDET' USING P1
:
STOP RUN.
IDENTIFICATION DIVISION.
PROGRAM-ID. LAV-ET-ELLER-ANDET.
DATA DIVISION.
WORKING-STORAGE SECTION.
77 FELT1 PIC S9(4) COMP.
LINKAGE SECTION.
77 P-F PIC S9(3).
PROCEDURE DIVISION USING P-F.
:
END PROGRAM LAV-ET-ELLER-ANDET.
END PROGRAM OVER1.

Programmet LAV-ET-ELLER-ANDET er en intern procedure i programmet OVER1. Bemærk at begge programmerne benytter variablen FELT1 - med to forskellige definitioner. Det er ikke noget problem, da programmerne ikke kan se hinandens variable. (Det er dog ikke særlig smart for den, der skal rette programmet på et eller andet tidspunkt.)

Man skal være meget opmærksom på, hvor man definerer sine interne procedurer i forhold til hinanden. Et program kan nemlig kun kalde et program, der er " directly containend" i det.

Hvis vi skriver den nye IDENTIFICATION DIVISION, efter END PROGRAM LAV-ET-ELLER-ANDET er programmet "directly contained" i OVER1 og kan således ikke kaldes af LAV-ET-ELLER-ANDET.

Hvis vi skriver den umiddelbart før "END PROGRAM LAV-ET-ELLER-ANDET", vil den være "directly contained" i LAV-ET-ELLER-ANDET, og kan derfor kaldes af LAV-ET-ELLER-ANDET. Men den er nu "indirectly contained" i OVER1. OVER1 kan derfor ikke kalde LAV-ET-ELLER-ANDET.

Hvis både OVER1 og LAV-ET-ELLER-ANDET skal kunne kalde den nye procedure, skal den defineres inden i LAV-ET-ELLER-ANDET og den skal defineres som et COMMON program ved at skrive COMMON efter programnavnet i PROGRAM-ID.

Det var egentlig min mening at slå lidt på tromme for nestede programmer, men det kom vist til at lyde mere besværligt ende det er. Læs mere om nestede programmer i VS COBOL II Application Programmeing Guide, eller brug trial-and-error.

Hvis programmet er et CICS program skal det angives i preprocessor parametrene. Skriv til os, så sender vi oplysninger om det .

Sidste uges tip        Tip oversigten