MainframeSupports
tip uge 38/2006:

Hvordan holder man egentlig en lille pause i sit program? Det afhænger rigtig meget af programmeringssproget og også af det miljø ens program afvikles i. Hvis dit program skal afvikles af CICS, så skal du helst bruge en

EXEC CICS
  DELAY SECONDS(X)
END-EXEC

og det uanset hvilket programmeringssprog, dit program ellers er skrevet i. X skal være et 4 bytes binært felt. Hvis X=5 vil dit CICS program holde en pause i 5 sekunder, før det kører videre.

Hvis dit program skal køre i batch eller under TSO, så er du nødt til at ty til de muligheder, som programmeringssproget har. I PL/I gøres det ganske let med statementet DELAY(Y), hvor Y er en FIXED BIN(31). Hvis Y=5000, vil dit PL/I program holde 5 sekunders pause, da Y angives i millisekunder.

I COBOL og REXX findes der overraskende nok ingen indbyggede statements eller funktioner til at holde en pause med. Mange installationer har lavet deres egne pause moduler, som kan kaldes på den ene eller anden måde, men faktisk findes der et Language Environment modul kaldet ILBOWAT0, som kan benyttes til formålet. I REXX gør du sådan her:

X=5
PARM=D2C(X,4)
ADDRESS LINKPGM "ILBOWAT0 PARM"

Hvis ovenstående ikke virker, vil jeg gerne høre om det. Det kan skyldes, at din installation ikke kører Language Environment, selv om det er ret usandsynligt. X angives her i sekunder, så igen vil ovenstående REXX kode få dit program til at holde pause i 5 sekunder.

I COBOL er det lidt mere kompliceret. Det skyldes, at ILBOWAT0 af en eller anden underlig grund forventer at parameteren til programmet befinder sig under 16M grænsen. Det sørger REXX LINKPGM automatisk for. For at du kan anvende ILBOWAT0 smertefrit fra andre COBOL programmer, så kan du med fordel lave et COBOL skal-progam rundt om ILBOWAT0. Dette skal-program kan du så kalde som et hvilket som helst andet COBOL program uden at skulle tænke på om parameteren er over eller under 16M grænsen. Skal-programmet kan se således ud:

CBL DATA(24)
identification division.
program-id. cblwait.
data division.
working-storage section.
01  ilbowat0 pic x(8) value 'ILBOWAT0'.
01  ilbowat0parm pic s9(9) binary.
linkage section.
01  waitParm pic s9(9) binary.
procedure division using waitParm.
    move waitParm to ilbowat0parm
    call ilbowat0 using ilbowat0parm
end program cblwait.

Ovenstående program skal ende med at blive et selvstændigt LOAD modul med navnet CBLWAIT. Dette LOAD modul skal ligge i et bibliotek på STEPLIB concateneringen i batch og på en tasklib concaterering i TSO (typisk ISPLLIB eller STEPLIBX). Måske kan du overtale en systemprogrammør til at lægge CBLWAIT ind i et LINKLIST bibliotek, så slipper du for at tænke på STEPLIB for CBLWAIT. Herefter kan det kaldes således fra et andet COBOL program for at vente i 5 sekunder (X er erklæret som en PIC S9(9) BINARY og cblwait som en pic x(8) value 'CBLWAIT'):

move 5 to x
call cblwait using x

Hvis du skriver CALL 'CBLWAIT' USING X i stedet, så risikerer du mærkelige problemer med 16M grænsen, så lad være med det. Og så er det vist tid til en lille pause.

Forrige danske tip        Last tip in english        Tip oversigten