MainframeSupports
tip uge 3/2005:

Tilbage i uge 21 skrev jeg om, hvordan man kan kalde loadmoduler fra REXX. En af de uhensigtsmæssige detaljer er, at man skal konvertere REXX-variable til de strukturer, der passer til loadmodulerne. Det vil jo være langt smartere, hvis man kunne kommunikere via REXX-variable. Og det kan man selvfølgelig også, selv om det ikke er verdens mest elegante interface. Heldigvis kan man skjule de mest kryptiske detaljer i et undermodul, men her får du et kørende eksempel på, hvordan man udfylder en REXX-variabel i COBOL, som efterfølgende kan benyttes direkte i den REXX, der kalder COBOL-programmet.

Al kommunikation med REXX-variable fra andre programmeringssprog sker via modulet IRXEXCOM. Dette modul kræver nogle ret kryptiske parametre, som du kan læse meget mere om ved at klikke her. For at få det til at virke fra COBOL skal du bruge følgende erklæringer i COBOL working-storage section:

01 irxexcom pic x(8) value 'IRXEXCOM'.

01 shvBlock.
02 ShvNext pic s9(9) binary.
02 ShvUser pic s9(9) binary.
02 ShvCode pic x(1).
02 ShvRet pic x(1).
02 X pic x(2).
02 ShvBufl pic s9(9) binary.
02 ShvNamA pointer.
02 ShvNamL pic s9(9) binary.
02 ShvValA pointer.
02 ShvValL pic s9(9) binary.

01 rexxVarName pic x(8).
01 rexxVarValue pic x(100).
01 rexxVarNameL pic s9(9) binary.
01 rexxVarValueL pic s9(9) binary.

01 nilValue pic s9(9) binary.
01 filler redefines nilValue.
02 nil pointer.

Brugen af alle disse variable vil fremgå af følgende stump kode, der skal placeres i procedure division. Tilgiv mig den manglende indrykning:

move 0 to nilValue

move 'REXXVAR' to rexxVarName
move 7 to rexxVarNameL
move 'HI REXX FROM COBOL' to rexxVarValue
move 18 to rexxVarValueL

move 0 to ShvNext
move 0 to ShvUser
move 'S' to ShvCode
move x'00' to ShvRet
move x'0000' to X
move 0 to ShvBufl
set shvNamA to address of rexxVarName
move rexxVarNameL to shvNamL
set shvValA to address of rexxVarValue
move rexxVarValueL to shvValL

call irxexcom using irxexcom nil nil shvBlock

Den allerførste move skal kun foretages en eneste gang i programmet. De næste fire move statements skal udføres for hver gang man ønsker at lave en REXX-variabel. RexxVarName udfyldes med navnet på REXX-variablen, rexxVarNameL udfyldes med længden på variabelnavnet, rexxVarValue udfyldes med den værdi REXX-variablen skal tildeles og rexxVarValueL med det antal tegn, som værdien fylder. Læg mærke til, at man kun skal benytte tegn til at kommunikere med. Ikke noget med binære eller pakkede værdier. REXX skal nok oversætte tegnstrengen til noget, der kan regnes på, hvis ellers REXX reglerne herfor er overholdt. Det giver selvfølgelig lidt arbejde i COBOL programmet med at oversætte fra binært eller pakket format til en streng af læsbare tegn.

De sidste mange move statements inden selve kaldet vil jeg anbefale at foretage før hvert eneste kald til IRXEXCOM, da IRXEXCOM kan ændre på de angivne variable. De sidste fire moves inden kaldet er de mest interessante, da det er her, at selve opdateringen af REXX-variablen klargøres vha. de fire rexxVar-variable.

Til sidst foretages kaldet til IRXEXCOM. Jeg har med vilje benyttet en variabel til at indeholde navnet på det modul, der kaldes. Så undgår du problemer med at få linket IRXEXCOM ind i dit COBOL loadmodul, da det bliver kaldt dynamisk. En anden vigtig detalje er brugen af variablen nil. Hvis du erstatter nil med COBOL ordet NULL, så virker kaldet ikke i følge forskellige kilder, jeg har læst på internettet. Det står der selvfølgelig ikke noget om i afsnittet om IRXEXCOM, som jeg har henvist til tidligere i tippet.

IRXEXCOM kan meget andet end at opdatere en REXX-variabel. Den kan også læse og fjerne REXX-variable og meget andet. Men det må du selv læse dig til og prøve af. Nu kender du i hvert fald hovedingredienserne og ved, hvor du kan læse mere. PL/I hajerne kan med garanti nemt omforme ovenstående kode til en generel anvendelig PL/I procedure. God fornøjelse.

Forrige danske tip        Last tip in english        Tip oversigten