Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

Endevor-Exits per Cobol-Hülse Rexx-Programm Allgemeine Endevor-Zahlen Endevor-Installation Exit-Programmierung die Sprache die Voraussetzungen technische.

Ähnliche Präsentationen


Präsentation zum Thema: "Endevor-Exits per Cobol-Hülse Rexx-Programm Allgemeine Endevor-Zahlen Endevor-Installation Exit-Programmierung die Sprache die Voraussetzungen technische."—  Präsentation transkript:

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

2 Exit-Programmierung 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) die Voraussetzungen ~

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

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

5 Cobol-Sourcecode EXIT7 Der Cobol-Standard-Kopf EXIT7 ~ * - 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 Schnittstelle Endevor Cobol-Exit EXIT7 ~ 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 copybook from CA (in this case: package copybook) Location: HLQ.LLQ.SOURCE(PKGXBLKS)

7 Cobol-Sourcecode EXIT7 Der erste Aufruf von Endevor EXIT7 ~ A001-MAIN SECTION. A001. MOVE 0 TO REXX-RETURN-CODE. MOVE 0 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.

8 Cobol-Sourcecode EXIT7 Setup für Folgeaufrufe EXIT7 ~ * * * * * 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

9 Cobol-Sourcecode EXIT7 Setup für Folgeaufrufe EXIT7 ~ 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

10 Cobol-Sourcecode EXIT7 Setup für Folgeaufrufe EXIT7 ~ 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.

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

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

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

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

15 Exit-Programmierung Schnittstelle zum Aufruf einer compiled Rexx (Call aus Cobol) EXIT7 ~ * * * initialize rexx parameters * * * A020-IRXEXEC-INIT SECTION. A020. MOVE SPACES TO IRXEXEC-PARM. MOVE 48 TO EXECBLK-LENGTH. MOVE 0 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 0 TO EXECBLK-DSNLEN. SET EXECBLK-PTR TO ADDRESS OF EXECBLK. MOVE REXX-PARAM-LENGTH TO ARGSTRING-LENGTH(1) MOVE -1 TO ARGSTRING-LAST1 SET ARGSTRING-PTR(1) TO ADDRESS OF IRXEXEC-PARM. SET ARGTABLE-PTR TO ADDRESS OF ARGUMENT. MOVE 0 TO EVALBLK-EVPAD1. * EVSIZE = see above in working-storage MOVE 34 TO EVALBLK-EVSIZE. MOVE 0 TO EVALBLK-EVLEN. MOVE 0 TO EVALBLK-EVPAD2. SET EVALBLK-PTR TO ADDRESS OF EVALBLK. MOVE LOW-VALUE TO FLAGS. MOVE X'E0' TO FBYTE5. MOVE 0 TO DUMMY-ZERO. Z020. EXIT. (256+16)/8=34 DD-Name muss allokiert sein. Inhalt: Die gerufene Rexx. Name der gerufenen Rexx

16 Exit-Programmierung Schnittstelle zum Aufruf einer compiled Rexx (COMPILED Rexx !!) EXIT7 ~ 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 1 Byte 2 Byte 3 Byte 4 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 _*

17 Exit-Programmierung Schnittstelle zum Aufruf einer compiled Rexx (Call aus Cobol) EXIT7 ~ *********************************************************** **** 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 PECB-BEFORE PERFORM A110-do-something... GO TO Y001. E001. *...

18 Exit-Programmierung Schnittstelle zum Aufruf einer compiled Rexx (Call aus Cobol) EXIT7 ~ * * * 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.

19 Exit-Programmierung Schnittstelle zum Aufruf einer compiled Rexx (Call aus Cobol) EXIT7 ~ * * * 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 DUMMY-ZERO. MOVE REXX-RESULT TO REXX-RETURN-CODE. Z800. EXIT. Dynamischer CALL

20 Exit-Programmierung Schnittstelle zum Aufruf einer compiled Rexx (Error-Handling/Standard) EXIT7 ~ Y001. IF REXX-RETURN-CODE = ZEROES MOVE 0 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 17 TO PECB-ERROR-MESS-LENGTH SET PECB-ABORT-RC TO TRUE MOVE REXX-RETURN-CODE TO PECB-NDVR-HIGH-RC GO TO Z001. IF REXX-RETURN-CODE = MOVE "2021" TO PECB-MESSAGE-ID MOVE "parameter form COBOL to REXX wrong |" TO PECB-MESSAGE MOVE 42 TO PECB-ERROR-MESS-LENGTH SET PECB-ABORT-RC TO TRUE MOVE REXX-RETURN-CODE TO PECB-NDVR-HIGH-RC GO TO Z001. IF REXX-RETURN-CODE > DISPLAY "RC>2000?="REXX-RETURN-CODE MOVE "2000" TO PECB-MESSAGE-ID MOVE "RC >=20000 | exit terminated || " TO PECB-MESSAGE MOVE 42 TO PECB-ERROR-MESS-LENGTH SET PECB-ABORT-RC TO TRUE MOVE REXX-RETURN-CODE TO PECB-NDVR-HIGH-RC GO TO Z001.

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

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

23 Exit-Programmierung Parameterübergabe vom Cobol-Exit an die Rexx: EXIT7 ~ /* 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) 01 IRXEXEC-PARM. 10 RX-FUNCTION PIC X(2). 10 FILLER PIC X(1). 10 RX-C1PKGID PIC X(16). 10 FILLER PIC X(1). 10 RX-C1PKGTY PIC X(10). 10 FILLER PIC X(1). 10 RX-C1ACTION PIC X(8). 10 FILLER PIC X(1). 10 RX-C1USERID PIC X(8). 10 FILLER PIC X(1). 10 RX-C1CCID PIC X(12). 10 FILLER PIC X(1). 10 RX-C1ENVMNT PIC X(8). 10 FILLER PIC X(1). 10 RX-C1STGID PIC X(1). 10 FILLER PIC X(1). 10 RX-C1SUBSYS PIC X(8). 10 FILLER PIC X(1). 10 RX-C1SYSTEM PIC X(8). 10 FILLER PIC X(1). 10 RX-C1ELTYPE PIC X(8). 10 FILLER PIC X(1). 10 RX-C1ELEM PIC X(8). 10 FILLER PIC X(1). 10 RX-MODE PIC X(1).

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

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

26 Exit-Programmierung 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….. Voraussetzungen ~

27 Exit-Programmierung Am Schluss die C1UEXITS ändern: EXIT7 ~ 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 HLQ.LLQ.TABLES …umwandlung… HLQ.LLQ.AUTHLIB Package Exit7 kann in BATCH laufen Nummer, Name, Anchor, Auth [USE_ALTID=Y/N möglich]


Herunterladen ppt "Endevor-Exits per Cobol-Hülse Rexx-Programm Allgemeine Endevor-Zahlen Endevor-Installation Exit-Programmierung die Sprache die Voraussetzungen technische."

Ähnliche Präsentationen


Google-Anzeigen