MainframeSupports
tip uge 41/2005:

Egentlig burde dette tip kaldes for en advarsel, da jeg for nylig fandt ud af, at der sandelig også er faldgruber forbundet med at benytte REXX i TSO. Når man laver en CALL eller et funktionskald i REXX, så vil REXX fortolkeren først kigge efter en label i programmet med det angivne navn. Hvis der ikke findes en label, så forsøger REXX fortolkeren at kigge efter en anden REXX med det angivne navn.

Når REXX fortolkeren laver et eksternt kald, så troede jeg (før jeg blev klogere), at så kiggede den først i SYSEXEC concateneringen og derefter i SYSPROC concateneringen præcis som en ISPF SELECT CMD og TSO kommandoen gør. Men det er desværre langt mere kompliceret end som så. Hvis den kaldene REXX er load'et fra SYSPROC, så kigger REXX fortolkeren i SYSPROC efter den kaldte REXX. Denne finurlighed opdagede jeg, fordi jeg ville "skygge" for en REXX på SYSPROC ved at definere den nye version på SYSEXEC. Men den nye version blev til min store forbløffelse ikke kaldt. Hovedreglen er altså, at en CALL fra REXX til en anden REXX altid holder sig til REXX'er i den concatenering, som kalderen blev load'et fra. Hvis den kaldte REXX ikke findes i concateneringen, så (først nu) følges standard fremgangsmåden.

Forestil dig følgende REXX:

/* REXX: CALLING (LOADED FROM SYSEXEC) */
ADDRESS TSO "ALTLIB ACTIVATE APPLICATION(EXEC) DATASET(MY.EXECS)"
CALL CALLER
ADDRESS TSO "ALTLIB DEACTIVATE APPLICATION(EXEC)"

Hvis CALLING er load'et fra SYSEXEC, så vil REXX fortolkeren altså først kigge i SYSEXEC efter CALLER. Hvis CALLER ikke findes i SYSEXEC vil REXX fortolkeren kigge i ALTLIB, men altså kun hvis CALLER ikke findes i SYSEXEC. Denne detalje kan være ret frustrerende, da det umiddelbart får ALTLIB kommandoen til at fremstå som om den overhovedet ikke virker, hvis CALLER findes i SYSEXEC. Ovenstående REXX bør rettes til følgende for at få den ønskede effekt:

/* REXX: CALLING (LOADED FROM SYSEXEC) */
ADDRESS TSO "ALTLIB ACTIVATE APPLICATION(EXEC) DATASET(MY.EXECS)"
ADDRESS TSO "%CALLER"
ADDRESS TSO "ALTLIB DEACTIVATE APPLICATION(EXEC)"

hvis CALLER altså i forvejen findes på SYSEXEC og i stedet ønskes load'et fra ALTLIB concateneringen. I øvrigt kan du forhindre REXX fortolkeren i at kigge efter en label i REXX'en ved at skrive CALL 'CALLER' i stedet for CALL CALLER. Husk at programnavnet skal skrives med stort, når det er angivet som en konstant, ellers kan REXX fortolkeren ikke finde ud af det i følge manualen.

Forrige danske tip        Last tip in english        Tip oversigten