Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

Endevor-Exits per Cobol-Hülse <-> Rexx-Programm

Ähnliche Präsentationen


Präsentation zum Thema: "Endevor-Exits per Cobol-Hülse <-> Rexx-Programm"—  Präsentation transkript:

1 Endevor-Exits per Cobol-Hülse <-> Rexx-Programm
Agenda Allgemeine Endevor-Zahlen Endevor-Installation Exit-Programmierung die Sprache die Voraussetzungen technische Einzelheiten ~

2 Exit-Programmierung Was wird benötigt: Was wird nicht benötigt:
die Voraussetzungen Was wird benötigt: Cobol-Sourcecode für den Exit (Hülse) Schnittstelle „Cobol calls Rexx“ Rexx-Sourcecode für die Exit-Logik Rexx-Loadlibrary und Allokation C1UEXITS ändern Was wird nicht benötigt: ISPF-Umgebung (sonst wäre der Aufruf mit „ISPEXEC Select CMD“ einfacher !) EXIT7 als Beispiel (Package Exit) ~

3 Inhalt Allgemeine Endevor-Zahlen Endevor-Installation
Agenda Allgemeine Endevor-Zahlen Endevor-Installation Exit-Programmierung die Sprache die Voraussetzungen technische Einzelheiten Cobol-Sourcecode Rexx-Sourcecode Rexx-Loadlibrary und Allokation C1UEXITS ~

4 Inhalt Allgemeine Endevor-Zahlen Endevor-Installation
Agenda Allgemeine Endevor-Zahlen Endevor-Installation Exit-Programmierung die Sprache die Voraussetzungen technische Einzelheiten Cobol-Sourcecode Rexx-Sourcecode Rexx-Loadlibrary und Allokation C1UEXITS ~

5 Cobol-Sourcecode EXIT7
Der Cobol-Standard-Kopf * - Cobol-Wrapper for Endevor exits invoking Rexx programs - * * * IDENTIFICATION DIVISION. * PROGRAM-ID C1UEXT07. AUTHOR BRIDGESTONE. INSTALLATION. IBM-370. DATE-WRITTEN. DATE-COMPILED. REMARKS. ****************************************************************** * This cobol program has only the functionality to receive data from Endevor during an exit * call, to format them and call the Rexx. Example here is for EXIT7 (packages). ENVIRONMENT DIVISION. CONFIGURATION SECTION. SOURCE-COMPUTER. IBM-370 * WITH DEBUGGING MODE . OBJECT-COMPUTER IBM-370. SPECIAL-NAMES. DECIMAL-POINT IS COMMA. INPUT-OUTPUT SECTION. FILE-CONTROL. DATA DIVISION. FILE SECTION. ~

6 Cobol-Sourcecode EXIT7
copybook from CA (in this case: package copybook) Location: HLQ.LLQ.SOURCE(PKGXBLKS) EXIT7 Schnittstelle Endevor <-> Cobol-Exit LINKAGE SECTION. * COPY PKGXBLKS. * PROCEDURE DIVISION USING PACKAGE-EXIT-BLOCK PACKAGE-REQUEST-BLOCK PACKAGE-EXIT-HEADER-BLOCK PACKAGE-EXIT-FILE-BLOCK PACKAGE-EXIT-ACTION-BLOCK PACKAGE-EXIT-APPROVER-MAP PACKAGE-EXIT-BACKOUT-BLOCK PACKAGE-EXIT-SHIPMENT-BLOCK PACKAGE-EXIT-SCL-BLOCK PACKAGE-EXIT-COLLECT-BLOCK . A001-MAIN SECTION. ~ 6

7 Cobol-Sourcecode EXIT7
Der erste Aufruf von Endevor A001-MAIN SECTION. A001. MOVE TO REXX-RETURN-CODE. MOVE TO RETURN-CODE. * ** first Endevor-call of exit7 initialize the * ** options when Endevor shall call the exit7. IF SETUP-EXIT-OPTIONS PERFORM A998-SET-UP MOVE ZEROS TO RETURN-CODE MOVE 0 TO PECB-NDVR-EXIT-RC GO TO Z001. Z001. GOBACK. ~ 7

8 Cobol-Sourcecode EXIT7
Setup für Folgeaufrufe * * * * * define all exit points (for 1st call) * A998-SET-UP SECTION. * SET TO Y, IF THIS EXIT POINT SHALL CALL THIS PROGRAM MOVE 'N' TO PECB-BEFORE-BACKIN MOVE 'N' TO PECB-AFTER-BACKIN MOVE 'N' TO PECB-BEFORE-BACKOUT MOVE 'N' TO PECB-AFTER-BACKOUT MOVE 'N' TO PECB-BEFORE-CAST MOVE 'Y' TO PECB-MID-CAST MOVE 'N' TO PECB-AFTER-CAST MOVE 'N' TO PECB-BEFORE-COMMIT MOVE 'N' TO PECB-AFTER-COMMIT MOVE 'Y' TO PECB-BEFORE-CREATE-BLD MOVE 'N' TO PECB-AFTER-CREATE-BLD MOVE 'Y' TO PECB-BEFORE-CREATE-COPY MOVE 'N' TO PECB-AFTER-CREATE-COPY MOVE 'Y' TO PECB-BEFORE-CREATE-EDIT MOVE 'N' TO PECB-AFTER-CREATE-EDIT MOVE 'Y' TO PECB-BEFORE-CREATE-IMPT MOVE 'N' TO PECB-AFTER-CREATE-IMPT ~ 8

9 Cobol-Sourcecode EXIT7
Setup für Folgeaufrufe MOVE 'N' TO PECB-BEFORE-DELETE MOVE 'N' TO PECB-AFTER-DELETE MOVE 'N' TO PECB-BEFORE-DSPLY-APPR MOVE 'N' TO PECB-BEFORE-DSPLY-BKOUT MOVE 'N' TO PECB-BEFORE-DSPLY-SCL MOVE 'N' TO PECB-BEFORE-DSPLY-ELMSM MOVE 'N' TO PECB-BEFORE-DSPLY-PKG MOVE 'N' TO PECB-BEFORE-DSPLY-RPT MOVE 'Y' TO PECB-BEFORE-EXEC MOVE 'N' TO PECB-AFTER-EXEC MOVE 'N' TO PECB-BEFORE-EXPORT MOVE 'N' TO PECB-AFTER-EXPORT MOVE 'N' TO PECB-BEFORE-GENPID MOVE 'N' TO PECB-AFTER-GENPID MOVE 'N' TO PECB-BEFORE-LIST MOVE 'N' TO PECB-AFTER-LIST MOVE 'N' TO PECB-BEFORE-MOD-BLD MOVE 'N' TO PECB-AFTER-MOD-BLD MOVE 'N' TO PECB-BEFORE-MOD-CPY MOVE 'N' TO PECB-AFTER-MOD-CPY MOVE 'N' TO PECB-BEFORE-MOD-EDIT MOVE 'N' TO PECB-AFTER-MOD-EDIT MOVE 'N' TO PECB-BEFORE-MOD-IMPT MOVE 'N' TO PECB-AFTER-MOD-IMPT ~ 9

10 Cobol-Sourcecode EXIT7
Setup für Folgeaufrufe MOVE 'N' TO PECB-BEFORE-RESET MOVE 'N' TO PECB-AFTER-RESET MOVE 'N' TO PECB-BEFORE-REV-APPR MOVE 'N' TO PECB-AFTER-REV-APPR MOVE 'N' TO PECB-BEFORE-REV-DENY MOVE 'N' TO PECB-AFTER-REV-DENY MOVE 'N' TO PECB-BEFORE-SHIP-XMIT MOVE 'N' TO PECB-AFTER-SHIP-XMIT MOVE 'N' TO PECB-BEFORE-SHIP-CON MOVE 'N' TO PECB-AFTER-SHIP-CON * DO IT IN BATCH AND FOREGROUND MOVE 'Y' TO PECB-TSO-EXECUTE MOVE 'Y' TO PECB-BATCH-EXECUTE . * Z998. EXIT. ~ 10

11 Exit-Programmierung EXIT7 Schnittstelle zum Aufruf einer compiled Rexx (Call-Definition) WORKING-STORAGE SECTION. * ******************************************* * * Field definitions for REXX program * USED-REXX-PROGRAMS REXXPGM PIC X(8). [name of your own Rexx program (e.g. REXXEX7)] IRXEXEC-NAME PIC X(8). [“IRXEXEC”] * exec-control-block (EXECBLK-PTR) EXECBLK. EXECBLK-ACRYN PIC X(8). [string 'IRXEXECB'] EXECBLK-LENGTH PIC S9(8) BINARY. [length of EXEC-BLOCKS (IN BYTES)] EXECBLK-RESERVED PIC S9(8) BINARY. [unused] EXECBLK-MEMBER PIC X(8). [EXEC membername if using PDS oder blank if using PO] EXECBLK-DDNAME PIC X(8). [blank, then DEFAULT=SYSEXEC] EXECBLK-SUBCOM PIC X(8). [blank, then DEFAULT=TSO] EXECBLK-DSNPTR POINTER. [name if EXEC-LOAD-DATASET oder 0, then no LOAD-DATASET] EXECBLK-DSNLEN PIC S9(8) BINARY. [length of DATASETNAME oder 0, When DSNPTR=NULL] ~ 11

12 Exit-Programmierung EXIT7 Schnittstelle zum Aufruf einer compiled Rexx (Call-Definition) wird später erklärt… * Parameters (ARGTABLE-PTR) ARGUMENT. ARGUMENT OCCURS 1 TIMES. ARGSTRING-PTR POINTER. ARGSTRING-LENGTH PIC S9(8) BINARY. ARGSTRING-LAST PIC S9(8) BINARY. * Flags FLAGS. FBYTE PIC X(4). FBYTE PIC X(1). * data request block (EVALBLK-PTR) EVALBLK. EVALBLK-EVPAD PIC S9(8) BINARY. * evalblk-evsize = (evdata +16) / 8 EVALBLK-EVSIZE PIC S9(8) BINARY. EVALBLK-EVLEN PIC S9(8) BINARY. EVALBLK-EVPAD PIC S9(8) BINARY. EVALBLK-EVDATA PIC X(256). EVALBLK-EVDATA-RED REDEFINES EVALBLK-EVDATA. REXX-RESULT PIC 9(5). REXX-ERROR-MSG PIC X(251). DUMMY-ZERO PIC S9(8) BINARY. * ******************************************* * * Field definitions for COBOL exit * POINTER-FIELDS. EXECBLK-PTR POINTER. ARGTABLE-PTR POINTER. EVALBLK-PTR POINTER. Rückgabe aus Rexx ~ 12

13 Exit-Programmierung EXIT7 Schnittstelle zum Aufruf einer compiled Rexx (Parameter-Definition) * your parameters for the rexx program IRXEXEC-PARM. RX-FUNCTION PIC X(2). FILLER PIC X(1). RX-C1PKGID PIC X(16). RX-C1PKGTY PIC X(10). RX-C1ACTION PIC X(8). RX-C1USERID PIC X(8). RX-C1CCID PIC X(12). RX-C1ENVMNT PIC X(8). RX-C1STGID PIC X(1). RX-C1SUBSYS PIC X(8). RX-C1SYSTEM PIC X(8). RX-C1ELTYPE PIC X(8). RX-C1ELEM PIC X(8). RX-MODE PIC X(1). * length of "IRXEXEC-PARM" REXX-PARAM-LENGTH PIC 9(4) VALUE 110. MISCELLANEOUS. REXX-RETURN-CODE PIC S9(8) BINARY. FUNCTION PIC X(2). ~ 13

14 Exit-Programmierung EXIT7 Schnittstelle zum Aufruf einer compiled Rexx (Call aus Cobol) * initialize rexx values B001. IF PACT-SEQ-NBR-FOR-ENTRY = ZEROS MOVE ZEROS TO PECB-UEXIT-HOLD-FIELD. PERFORM A020-IRXEXEC-INIT. ~ 14

15 Exit-Programmierung EXIT7 Schnittstelle zum Aufruf einer compiled Rexx (Call aus Cobol) * * * initialize rexx parameters * A020-IRXEXEC-INIT SECTION. A020. MOVE SPACES TO IRXEXEC-PARM. MOVE TO EXECBLK-LENGTH. MOVE TO EXECBLK-RESERVED. * this is the loadlibrary where your rexx programm resides. * please allocate this library before you start Endevor * in your TSO session. MOVE "REXXLOAD" TO EXECBLK-DDNAME. MOVE " " TO EXECBLK-SUBCOM. MOVE "REXXEXT7" TO REXXPGM. MOVE REXXPGM TO EXECBLK-MEMBER. SET EXECBLK-DSNPTR TO NULL. MOVE TO EXECBLK-DSNLEN. SET EXECBLK-PTR TO ADDRESS OF EXECBLK. MOVE REXX-PARAM-LENGTH TO ARGSTRING-LENGTH(1) MOVE TO ARGSTRING-LAST1 SET ARGSTRING-PTR(1) TO ADDRESS OF IRXEXEC-PARM. SET ARGTABLE-PTR TO ADDRESS OF ARGUMENT. MOVE TO EVALBLK-EVPAD1. * EVSIZE = see above in working-storage MOVE TO EVALBLK-EVSIZE. MOVE TO EVALBLK-EVLEN. MOVE TO EVALBLK-EVPAD2. SET EVALBLK-PTR TO ADDRESS OF EVALBLK. MOVE LOW-VALUE TO FLAGS. MOVE X'E0' TO FBYTE5. MOVE TO DUMMY-ZERO. Z020. EXIT. DD-Name muss allokiert sein. Inhalt: Die gerufene Rexx. Name der gerufenen Rexx (256+16)/8=34 ~ 15

16 Exit-Programmierung EXIT7 Schnittstelle zum Aufruf einer compiled Rexx (COMPILED Rexx !!) MOVE LOW-VALUE TO FLAGS. MOVE X'E0' TO FBYTE5. _* ************ IBM-Def ***************** _* BIT-FLAGS FüR IRXEXEC (4 Bytes, USES ONLY BIT0-3) _* (AB BIT4 = RESERVED) _* (siehe auch "TSO/E REXX REFERENCE", 12.17) _* _* ABER: mit 4 Bytes geht es nicht !!!!!!!!!!!!! :-(( * ************ My-DEF ****************** _* => Nur mit 5 Bytes ! _* Deshalb einfach X(5) und mit LOW-VALUE initialisiert. _* Die BIT0-3-Bestückung bezieht sich auf das HI-Byte _* des 5.Bytes. _* Beispiel: _* Byte Byte Byte Byte Byte 5 _* _* darauf kommts an => ^^^^ _* Mögliche Werte des HI-BYTE5: _* X'10' / 0001 => failed X'20' / 0010 => failed _* X'30' / 0011 => failed X'40' / 0100 => failed _* X'50' / 0101 => failed X'60' / 0110 => failed _* X'70' / 0111 => failed X'80' / 1000 => ok _* X'90' / 1001 => ok X'A0' / 1010 => ok _* X'B0' / 1100 => ok X'C0' / 1011 => ok _* X'D0' / 1101 => ok X'E0' / 1110 => ok _* X'F0' / 1111 => ok ~ 16

17 Exit-Programmierung EXIT7 Schnittstelle zum Aufruf einer compiled Rexx (Call aus Cobol) *********************************************************** **** the following sections check the event of the ** **** calling Endevor ** C001. * check sth before Endevor creates the package IF CREATE-PACKAGE AND PECB-BEFORE PERFORM A100-do-something... GO TO Y001. D001. * check sth before Endevor executes the package IF EXECUTE-PACKAGE AND PERFORM A110-do-something... E001. * ~ 17

18 Exit-Programmierung EXIT7 Schnittstelle zum Aufruf einer compiled Rexx (Call aus Cobol) * * * your routines to check something with * * your rexx program * A100-do-something... (here: check name convention of a PKGname) A100. MOVE "01" TO RX-FUNCTION . MOVE PECB-PACKAGE-ID TO RX-C1PKGID MOVE "NONE" TO RX-C1PKGTY MOVE "NONE" TO RX-C1ACTION . MOVE "NONE" TO RX-C1CCID MOVE "NONE" TO RX-C1ENVMNT . MOVE "NONE" TO RX-C1SYSTEM . MOVE "NONE" TO RX-C1SUBSYS . MOVE "NONE" TO RX-C1ELEM MOVE "NONE" TO RX-C1ELTYPE . MOVE "NONE" TO RX-C1STGID MOVE " " TO RX-C1USERID . MOVE PECB-MODE TO RX-MODE. B100. PERFORM A800-CALL-REXX. Z100. EXIT. ~ 18

19 Exit-Programmierung EXIT7 Schnittstelle zum Aufruf einer compiled Rexx (Call aus Cobol) * * * calling the rexx * A800-CALL-REXX SECTION. A800. MOVE "IRXEXECB" TO EXECBLK-ACRYN. MOVE "IRXEXEC " TO IRXEXEC-NAME. CALL IRXEXEC-NAME USING EXECBLK-PTR ARGTABLE-PTR FLAGS DUMMY-ZERO EVALBLK-PTR DUMMY-ZERO. MOVE REXX-RESULT TO REXX-RETURN-CODE. Z800. EXIT. Dynamischer CALL ~ 19

20 Exit-Programmierung EXIT7 Schnittstelle zum Aufruf einer compiled Rexx (Error-Handling/Standard) Y001. IF REXX-RETURN-CODE = ZEROES MOVE TO PECB-NDVR-EXIT-RC GO TO Z001. IF REXX-RETURN-CODE = 20 MOVE "0020" TO PECB-MESSAGE-ID MOVE "ext-rexx failed " TO PECB-MESSAGE MOVE TO PECB-ERROR-MESS-LENGTH SET PECB-ABORT-RC TO TRUE MOVE REXX-RETURN-CODE TO PECB-NDVR-HIGH-RC IF REXX-RETURN-CODE = 20021 MOVE "2021" TO PECB-MESSAGE-ID MOVE "parameter form COBOL to REXX wrong |" TO PECB-MESSAGE MOVE TO PECB-ERROR-MESS-LENGTH IF REXX-RETURN-CODE > 19999 DISPLAY "RC>2000?="REXX-RETURN-CODE MOVE "2000" TO PECB-MESSAGE-ID MOVE "RC >=20000 | exit terminated || " ~ 20

21 Exit-Programmierung EXIT7 Schnittstelle zum Aufruf einer compiled Rexx (Error-Handling/eigene) ************************************************************ * all other error messages you set in the rexx * you can handle here... * your error handling... IF... MOVE TO PECB-NDVR-HIGH-RC. SET PECB-ABORT-RC TO TRUE. MOVE TO RETURN-CODE. Z001. GOBACK. ~ 21

22 Inhalt Allgemeine Endevor-Zahlen Endevor-Installation
Agenda Allgemeine Endevor-Zahlen Endevor-Installation Exit-Programmierung die Sprache die Voraussetzungen technische Einzelheiten Cobol-Sourcecode Rexx-Sourcecode Rexx-Loadlibrary und Allokation C1UEXITS ~

23 Exit-Programmierung Parameterübergabe vom Cobol-Exit an die Rexx: ~
IRXEXEC-PARM. RX-FUNCTION PIC X(2). FILLER PIC X(1). RX-C1PKGID PIC X(16). RX-C1PKGTY PIC X(10). RX-C1ACTION PIC X(8). RX-C1USERID PIC X(8). RX-C1CCID PIC X(12). RX-C1ENVMNT PIC X(8). RX-C1STGID PIC X(1). RX-C1SUBSYS PIC X(8). RX-C1SYSTEM PIC X(8). RX-C1ELTYPE PIC X(8). RX-C1ELEM PIC X(8). RX-MODE PIC X(1). /* REXX ***********************************/ PARSE ARG in_c1uext07_param IN_FUNKTION = word(in_c1uext07_param,1) IN_C1PKGID = word(in_c1uext07_param,2) IN_C1PKGTY = word(in_c1uext07_param,3) IN_C1ACTION = word(in_c1uext07_param,4) IN_C1USERID = word(in_c1uext07_param,5) IN_C1CCID = word(in_c1uext07_param,6) IN_C1ENVMNT = word(in_c1uext07_param,7) IN_C1STGID = word(in_c1uext07_param,8) IN_C1SUBSYS = word(in_c1uext07_param,9) IN_C1SYSTEM = word(in_c1uext07_param,10) IN_C1ELTYPE = word(in_c1uext07_param,11) IN_C1ELEM = word(in_c1uext07_param,12) /* Modus: T=TSO/Online + B=Batch */ IN_MODUS = word(in_c1uext07_param,13) ~

24 Exit-Programmierung Rexx-Funktion: ~
/* Hier die Exit-Logik/Funktionen verarbeiten... */ select when IN_FUNKTION = "01" then do if pos(substr(IN_C1PKGID,1,1),'ABCEFGHKMNPRSZ ') = 0 then say "Namenskonventionen !! - Paketart " !!, substr(IN_C1PKGID,1,1) !! " nicht erlaubt !" rc_exit = 703 end exit rc_exit ~ 24

25 Inhalt Allgemeine Endevor-Zahlen Endevor-Installation
Agenda Allgemeine Endevor-Zahlen Endevor-Installation Exit-Programmierung die Sprache die Voraussetzungen technische Einzelheiten Cobol-Sourcecode Rexx-Sourcecode Rexx-Loadlibrary und Allokation C1UEXITS ~

26 Exit-Programmierung Rexx-Loadlibrary und Allokation:
Voraussetzungen Rexx-Loadlibrary und Allokation: DD-Name „REXXLOAD“ muss im TSO und Batch verfügbar sein im TSO: z. B. in der Logon-Prozedur in Batch: „REXXLOAD DD DISP=SHR,DSN=Rexxloadlib….. “ ~ 26

27 Exit-Programmierung Am Schluss die C1UEXITS ändern: HLQ.LLQ.TABLES
…umwandlung… HLQ.LLQ.AUTHLIB C1UEXITS TITLE 'DEFINE USER EXITS' * * * MULTIPLE USER EXIT SUPPORT * * * * TYPE=START DEFINITION MUST PROCEDE ANY EXIT DEFINITION STATEMENT. * C1UEXITS §C1UEXIT TYPE=START,XIT7BAT=YES * SEE USER EXITS MANUAL FOR A DESCRIPTION OF * * DEFINING MULTIPLE USER EXITS * §C1UEXIT EXIT#=2,NAME=C1UEXT02,ANCHID=0,AUTH=YES §C1UEXIT EXIT#=7,NAME=C1UEXT07,ANCHID=0,AUTH=NO * TYPE=DEFINITION DENOTES THE END OF THE EXIT TABLE * §C1UEXIT TYPE=END END Nummer, Name, Anchor, Auth [USE_ALTID=Y/N möglich] Package Exit7 kann in BATCH laufen ~ 27


Herunterladen ppt "Endevor-Exits per Cobol-Hülse <-> Rexx-Programm"

Ähnliche Präsentationen


Google-Anzeigen