MainframeSupports
tip uge 20/2003:

Har du nogensinde været i en situation, hvor du ønskede at udstede en TSO-kommando fra PL/1 eller COBOL? Når dette ønske opstår, ender det oftest med, at man løser problemet ved at lave et REXX program i stedet for, så hvad skal vi egentlig kunne udstede TSO-kommandoer fra PL/1 eller COBOL for? Tja, jeg har mange gange ønsket at kunne lave en dynamisk allokering af et dataset, og da jeg ikke kan ret meget assembler og da slet ikke finde ud af at lave kald til SVC 99, som er MVS rutinen, der laver allokeringer, ja så er TSO ALLOC min eneste udvej. Der er også andre handy TSO kommandoer, eksempelvis DELETE, og når først pandoras box er åben, så er det svært at stoppe igen.

Vejen til TSO fra kompilerende programmeringssprog går gennem programmet TSOLNK, som også kaldes IKJEFTSR. Hvordan man kalder TSOLNK/IKJEFTSR fra COBOL og PL/1 er beskrevet i kapitel 23 i manualen TSO/E Programming Services på nettet. Dette link er til den nyeste udgave af manualen, men der er vist ikke sket noget nyt i de sidste mange releases af TSO, så den kan sagtens anvendes, selv om din installation ikke kører på den nyeste version af MVS. Det er meget sandsynligt, at der findes en "let at kalde" udgave af TSOLNK på din installation. Det er desværre bare oftest sådan, at disse udgaver ikke er særligt kendte, og at der ikke er nogen tilbage, der kan huske, hvad den pågældende "let at kalde" udgave hedder, og hvordan man kalder den. Derfor kommer jeg med et par eksempler på, hvordan TSOLNK kan kaldes.

I COBOL kan det se således ud:

* WORKING STORAGE DECLARATIONS
 01  PARM1 PICTURE S9(9) COMP.
 01  PARM2 PICTURE X(80).
 01  PARM3 PICTURE S9(9) VALUE +80 COMP.
 01  PARM4 PICTURE S9(9) VALUE +0 COMP.
 01  PARM5 PICTURE S9(9) VALUE +0 COMP.
 01  PARM6 PICTURE S9(9) VALUE +0 COMP.

* STATEMENTS IN PROCEDURE DIVISIONS
     MOVE 261 TO PARM1
     MOVE 'ALLOC FI(MYDDNAME) DA(''MY.OWN.DATASET'') SHR' TO PARM2
     CALL 'TSOLNK' USING PARM1 PARM2 PARM3 PARM4 PARM5 PARM6
     IF RETURN-CODE NOT = 0
       DISPLAY 'ALLOC FAILED WITH TSO RETURN-CODE = ' RETURN-CODE
     END-IF

Variablen PARM1 består egentlig af en lang række flag, som kan sættes på alle mulige og umulige måder. Jeg benytter den angivne værdi, fordi den virker i alle de tilfælde, jeg har haft brug for. Hvis du oplever problemer eller ikke kan styre din nysgerrighed, så nærlæs ovenstående manual. PARM2 indeholder selve TSO kommandoen, og PARM3 længden på kommandoen. I COBOL arbejder man ikke med variabel længde tegnstrenge, så her er du nødt til at afsætte en tegnstreng lang nok til at indeholde den længste TSO-kommando, du vil udføre. PARM3 indeholder længden på PARM2. I eksemplet var der altså ikke noget i vejen for at sætte PARM3 til 43 i stedet, men det virker fint med 80. PARM4, PARM5 og PARM6 er diverse returkoder, men den rigtige TSO returkode returneres i RETURN-CODE, selvom det ikke fremgår af manualen. Igen må jeg henvise til manualen, hvis du vil have yderligere informationer om PARM4, 5 og 6.

I PL/1 kan det se således ud:

DCL PARM1 FIXED BIN(31);
DCL PARM2 CHAR(80);
DCL PARM3 FIXED BIN(31);
DCL PARM4 FIXED BIN(31);
DCL PARM5 FIXED BIN(31);
DCL PARM6 FIXED BIN(31);
DCL TSOLNK EXT ENTRY OPTIONS(ASM INTER RETCODE);

PARM1 = 261;
PARM2 = 'ALLOC FI(MYDDNAME) DA(''MY.OWN.DATASET'') SHR';
PARM3 = 43;
CALL TSOLNK(PARM1, PARM2, PARM3, PARM4, PARM5, PARM6);
IF PLIRETV() ^= 0
THEN
  DISPLAY('ALLOC FAILED WITH TSO RETURN-CODE = ' !! PLIRETV());

Variablerne PARM1, PARM2 og PARM3 erklæres og sættes på præcis samme måde som i COBOL. Selv om PL/1 arbejder med variabel længde tegnstrenge, så kan de ikke benyttes ved kald til TSOLNK. I dette eksempel har jeg sat PARM3 til 43, men 80 ville også virke. PARM4, PARM5 og PARM6 indeholder præcist det samme som ved kald fra COBOL og igen er den rigtige TSO returkode i PLIRETV() (som svarer til COBOL's RETURN-CODE).

For at ovenstående eksempler virker, så skal programmerne selvfølgelig eksekveres under TSO. Hvis programmet også laver SQL-kald, så er TSO højst sandsynligt allerede aktiveret, da DSN kun virker under TSO. Ellers må du strikke et rent TSO job sammen for at eksekvere dit program. God fornøjelse.

Forrige danske tip        Last tip in english        Tip oversigten