MainframeSupports
tip uge 44/2007:

Forleden var der en kollega, der spurgte mig, hvordan man fik variable i PL/I til at huske deres værdi fra kald til kald ligesom variable i COBOLs working-storage section. Så kom jeg i tanke om et tip, jeg skrev helt tilbage i uge 8/2001. Tippet viser, hvordan en variabel i en procedure overlever fra kald til kald, men rent faktisk overlever controlled variable også fra programkald til programkald. Du kan derfor kode dit PL/I program således for at opnå samme effekt for variable som i COBOL:

myCobWS: PROC(parameter1, parameter2);

DCL allocation BUILTIN;
DCL 1 ws CONTROLLED
  , 2 wsVar1 FIXED BIN(31)
  , 2 wsVar2 CHAR(20)
  , 2 wsVar3 FIXED DEC(15,2)
  ;

CALL makeCobolWS;
CALL normalProcessing;

normalProcessing: PROC;

/* Here you code what your PL/I program normally does */

END normalProcessing;

makeCobolWS: PROC;

  IF allocation(ws) = 0
  THEN DO;
    ALLOCATE ws;
    ws = '';
  END;

END initWS;

END myCobWS;

I proceduren initWS behøver du ikke nulstille strukturen ws, da den vil være initialiseret på samme måde som enhver almindelig uinitialiseret PL/I variabel. Hvis du skulle have behov for særlig initialisering af en working-storage variabel ved første kald af programmet, så er det på det sted, hvor jeg initialiserer ws, at det skal foregå. Alle variable i strukturen ws vil overleve mellem hver eneste kald til programmet.

Jeg har afprøvet ovenstående i forskellige kombinationer. Uanset om programmet er statisk linket ind i et load-modul eller kaldes dynamisk, så virker det. I den nyeste udgave af PL/I gør det heller ingen forskel om programmet kaldes fra COBOL i stedet for fra PL/I. Hvis du fra samme program kalder programmet både dynamisk og statisk, så har den dynamisk kaldte version af programmet en anden working-storage end den statisk kaldte. Det gælder i øvrigt også, hvis det kaldte program var et COBOL program. Der er altså ingen forskel på overlevelsen af en controlled variabel i forhold til variable i COBOL working-storage.

Under CICS skal du være opmærksom på, at hverken controlled variable eller COBOL working-storage overlever, hvis du laver EXEC CICS LINK til programmet, i hvert fald fungerer det på den måde på den installation, hvor jeg arbejder i øjeblikket. Det er i øvrigt hamrende irriterende, men sådan har det vist altid været, i hvert fald ifølge en anden god kollega, som jeg har stor tillid til. Selv husker jeg det ikke så godt.

Forrige danske tip        Last tip in english        Tip oversigten