MainframeSupports
tip uge 1/2010:

Jeg har for mange år siden truet med at skrive et tip om ISPF funktionerne VDEFINE og VDELETE. Disse to funktioner er specielle, fordi de kun kan bruges fra en compilerende programmeringssprog via ISPF-interfacet ISPLINK. VDEFINE funktionen bruges til at skabe forbindelse mellem en ISPF-variabel og en variabel i dit program, mens VDELETE fjerner forbindelsen igen. Jeg vil først lige vise, hvordan du kalder VDEFINE og VDELETE fra henholdsvis COBOL og PL/I. Husk altid at kontrollere RETURN-CODE i COBOL og pliretv() i PL/I efter et kald til ISPLINK. Værdien 0 angiver, at alt er gået godt. Først COBOL:

...
01  ISPF-COMMAND PIC X(8).
01  ISPF-NAME PIC X(8).
01  VAR-TYPE PIC X(8).
01  VAR-LEN PIC S9(9) COMP.
01  ISPFVAR PIC X(10).
...
MOVE 'VDEFINE' TO ISPF-COMMAND
MOVE 'ISPFVAR' TO ISPF-NAME
MOVE 'CHAR' TO VAR-TYPE
MOVE 10 TO VAR-LEN
CALL 'ISPLINK' USING ISPF-COMMAND ISPF-NAME ISPFVAR VAR-TYPE VAR-LEN
...
MOVE 'VDELETE' TO ISPF-COMMAND
MOVE 'ISPFVAR' TO ISPF-NAME
CALL 'ISPLINK' USING ISPF-COMMAND ISPF-NAME

Og så PL/I:

...
DCL ISPLINK EXTERNAL ENTRY OPTIONS(ASM INTER RETCODE);
DCL ISPFVAR CHAR(10);
...
CALL ISPLINK('VDEFINE ', 'ISPFVAR ', ISPFVAR, 'CHAR ', STG(ISPFVAR));
...
CALL ISPLINK('VDELETE ', 'ISPFVAR ');

Her ses det tydeligt, hvor overlegent et programmeringssprog PL/I er, bortset fra at det er vigtigt at angive de efterstillede blanke, hvis du benytter konstanter i kaldet til ISPLINK som i eksemplet her. STG(ISPFVAR) returnerer længden af ISPFVAR, her 10. Det er en rigtig god ide at benytte STG-funktionen her, da man slipper for at rette flere steder, hvis længden ændres i erklæringen. Det viste VDEFINE-kald skaber forbindelse til en ISPF-variabel kaldet ISPFVAR. Det er ikke noget krav, at variablen i programmet hedder det samme, men det letter forståelsen af, hvad der foregår. På VDEFINE-kaldet angiver man overfor ISPF, hvordan variablen i programmet er defineret. ISPF vil forsøge at konvertere til det angivne format. Du kan eksempelvis benytte FIXED som variabel-type, men det kræver, at ISPF-variablen kun indeholder numeriske tegn, ellers får du uventede resultater.

Hvis du fra flere forskellige moduler skaber forbindelse til den samme ISPF-variabel, vil hvert modul få sin egen forbindelse. Det er vigtigt at fjerne forbindelsen igen med en VDELETE for hver VDEFINE, da der ellers kan gå kludder i, hvad du tror ISPF-variablen indeholder, især hvis du opdaterer den. ISPF kan også forledes til at tro, at programmets variable stadig er til rådighed efter programmets afslutning, hvis du glemmer at lave VDELETE.

Nu har jeg omtalt ISPF-variable uden at nævne, hvad de er for nogen. Hvis du for eksempel gerne vil udfylde eller have fat i værdien af et felt på et ISPF-panel, så sker det via en ISPF-variabel. Det samme gælder for kolonner i en ISPF-tabel eller variable i et ISPF-skeleton. En af de interessante anvendelser er at få adgang til værdien af diverse Z-variable, som er foruddefinerede ISPF-variable. Bemærk at ISPF-variable ikke er det samme som variable i REXX eller CLIST, så VDEFINE er ikke måden at få fat på værdien af en REXX-variabel. I REXX (og CLIST) skabes forbindelsen mellem ISPF-variable og REXX-variable bare automatisk, hvad der gør det langt nemmere at bruge ISPF fra REXX i forhold til at bruge ISPF fra COBOL eller PL/I.

Hvis du laver VDEFINE af en Z-variabel og ikke kan forstå, hvorfor du ikke får fat i værdien, så er det fordi du skal udføre en VGET for at få fat i værdien. Du kan undgå VGET ved at tilføje en ekstra parameter på VDEFINE-kaldet som du giver værdien COPY. Du kan i øvrigt VDEFINE og VDELETE mange variable på een gang. Følg linket for VDEFINE og VDELETE øverst i tippet for at læse mere. Hvis du undrer dig over, hvad en name-list er, så er det enten et enkelt ISPF-variabelnavn som angivet i mine eksempler eller en række ISPF-variabelnavne omkranset af parentereser eksempelvis (ISPFVAR1 ISPFVAR2).

Forrige danske tip        Last tip in english        Tip oversigten