MainframeSupports
tip uge 39/2002:

Når man laver EDIT macroer, der laver meget, så kører de ikke altid så hurtigt som det er ønskeligt. Man kan heldigvis skrive EDIT macroer i andre sprog end CLIST og REXX. Det vil jeg nu illustrere med et eksempel i COBOL.

Først er der lige en vigtig detalje. EDIT macroer skrevet i eksempelvis COBOL ender med at blive til LOAD moduler. LOAD moduler ligger ikke i SYSPROC eller SYSEXEC concateneringen, så derfor skal man fortælle ISPF editoren, at ens favorit EDIT macro nu er et LOAD modul. Det gøres enten ved at skrive et ¤-tegn foran navnet på LOAD modulet eller ved at lave en lille forbrænder REXX (eller CLIST) som kan se således ud:

/* REXX */
ADDRESS ISREDIT
"MACRO"
"DEFINE MYMACRO PGM MACRO"
"MYMACRO"

Denne REXX EDIT macro starter et LOAD modul, der hedder MYMACRO. Macro kaldet DEFINE MYMACRO PGM MACRO fortæller ISPF editoren, at den skal kigge efter macroen med navnet MYMACRO i LOAD modul søgerækken. Macro kaldet MYMACRO starter simpelthen macroen. Jeg kan varmt anbefale dette trick til opstarten, da det dels er besværligt at huske at indtaste ¤ foran macro navnet og dels, at ¤ i nogen emulatorer er et helt andet tegn. Eksempelvis angiver ISPF EDIT-manualen, at man skal bruge ! før macro navnet, men på de fleste danske installationer er ! mappet til ¤. På din installation er det måske et helt fjerde tegn, der vil virke. Derfor er den lille forbrænder en særdeles god ide.

Det er nu op til MYMACRO at overholde konventionerne for god EDIT macro opførsel i LOAD moduler. Lad os derfor straks kaste os over et eksempel på, hvordan MYMACRO kan se ud:

.
01  ISPF-COMMAND PIC X(8).
01  ISPF-NAME PIC X(8).
01  ISPF-TYPE PIC X(8).
01  BYTE-COUNT PIC S9(9) COMP.
01  MACRO-COMMAND PIC X(80).
01  MACRO-COMMANDL PIC S9(9) COMP.
01  CSRLINE PIC S9(9) COMP.
.
MOVE 'ISREDIT' TO ISPF-COMMAND
MOVE 5 to MACRO-COMMANDL
MOVE 'MACRO' to MACRO-COMMAND
CALL 'ISPLINK' USING ISPF-COMMAND MACRO-COMMAND MACRO-COMMANDL
.
MOVE 'VDEFINE' TO ISPF-COMMAND
MOVE 'CSRLINE' TO ISPF-NAME
MOVE 'FIXED' TO ISPF-TYPE
MOVE 4 TO BYTE-COUNT
CALL 'ISPLINK' USING ISPF-COMMAND ISPF-NAME CSRLINE ISPF-TYPE BYTE-COUNT
.
MOVE 'ISREDIT' TO ISPF-COMMAND
MOVE 25 to MACRO-COMMANDL
MOVE '(CSRLINE) = LINENUM .ZCSR' to MACRO-COMMAND
CALL 'ISPLINK' USING ISPF-COMMAND MACRO-COMMAND MACRO-COMMANDL
.
DISPLAY 'CURSOR-LINE IS LINE ' CSRLINE
.
MOVE 'VDELETE' TO ISPF-COMMAND
MOVE 'CSRLINE' TO ISPF-NAME
CALL 'ISPLINK' USING ISPF-COMMAND ISPF-NAME

Jeg har udeladt en hel del af de nødvendige COBOL besværgelser for at kunne komme hurtigere til sagen. Først de nødvendige erklæringer. Herefter et kald til ISPF via ISPLINK som svarer præcist til ISREDIT "MACRO" i en REXX. Nu vil ISPF editoren opfatte programmet som en EDIT macro. Herefter er det bare derudaf, næsten. Alle variable, der kommunikeres mellem EDIT og programmet SKAL VDEFINEs. Så det gør jeg med et linie-nummer kaldet CSRLINE. Næste kald sætter CSRLINE til nummeret på den linie, som cursoren stod i, da jeg trykkede Enter. Dette linie-nummer skriver jeg nu ud med en DISPLAY bare for at se om det virker. Til sidst rydder jeg pænt op over for ISPF ved at VDELETE de variable, jeg har VDEFINEt.

Herefter er det sådan set kun fantasien, der sætter grænserne. For en god ordens skyld vil jeg nævne, at man kan udstede ISREDIT kommandoerne fra programmet på en anden måde, hvor man i stedet for at skulle angive længden på EDIT macro kommandoen bare angiver det samme delimiter tegn i starten og i slutningen af kommandoen. Du kan læse meget mere om EDIT macroer i ISPF manualen EDIT and EDIT macroes. Hvis du ikke har dyrket VDEFINEs og VDELETEs, så kan du læse mere i manualen ISPF services guide eller skrive til mig, hvis du mener, der er et behov for et tip om VDEFINEs og VDELETEs.

Forrige danske tip        Last tip in english        Tip oversigten