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:
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:
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.