Beispiel Adressenverwaltung
Mit diesem Anwendungsbeispiel für eine UTM-Anwendung auf einem BS2000-System können Adressdaten verwaltet werden, die in einer Datei stehen. Die Anwendung stellt dazu die nachfolgenden Funktionen zur Verfügung, die durch Eintrag des jeweiligen TACs in das dafür vorgesehene Feld aufgerufen werden. Die Ein- und Ausgaben erfolgen in einem Format.
TAC | Funktion | Erklärung |
1 | Anzeige | gibt eine in der Datei vorhandene Adresse aus. Suchbegriff ist dabei der Name und die ersten zwei Buchstaben des Vornamens, welche in den zugehörigen Feldern anzugeben sind. |
2 | Neueintrag | trägt eine neue Adresse in die Datei ein. Eine Adresse mit dem gleichen Suchbegriff (s.o.) darf dort nicht schon vorhanden sein. |
3 | Ändern | ändert einen Adresseintrag. Die Adresse muss in der Datei schon |
4 | Löschen | Löscht eine in der Datei vorhandene Adresse. |
Bei Fehlbedienung erscheint in der untersten Zeile des Formats eine Fehlermeldung.
Die oben genannten Ziffern sind die Transaktionscodes (TACs), die die Anwendung steuern. Dabei rufen der Transaktionscode 1 das Teilprogramm ANZEIGE und die Transaktionscodes 2, 3 und 4 das Teilprogramm AENDERN auf. Diese Teilprogramme verzweigen dann jeweils in das Teilprogramm DATEIEN. Dieses Teilprogramm wird als START- und SHUT-Exit eingesetzt und enthält die Unterprogramme, die die Ein-/Ausgaben auf die Adressdatei durchführen.
Das Teilprogramm BADTACS wird von openUTM automatisch aufgerufen, wenn ein ungültiger TAC eingegeben wird. Nach dem Aufbau der Verbindung mit der Anwendung und erfolgtem KDCSIGN wird sofort von openUTM das Format ausgegeben (Startformat). Die Arbeit mit dem Benutzer erfolgt dann im strengen Dialog, d.h. auf die Eingabe eines TACs und des Schlüssels reagiert die Anwendung mit der Ausgabe des Formats das die gesuchte Adresse enthält bzw. mit einer Erfolgs- oder einer Fehlermeldung in der untersten Zeile.
Die folgenden Struktogramme zeigen den Aufbau der Teilprogramme:
Bild:
Struktogramm des Teilprogramms ANZEIGE
Bild:
Struktogramm des Teilprogramms AENDERN
Der Vollständigkeit halber ist im Anschluss an die COBOL-Programme die Generierung dieser Anwendung aufgeführt. Die genaue Bedeutung der einzelnen Operanden und Anweisungen entnehmen Sie bitte dem openUTM-Handbuch „Anwendungen generieren“.
Das folgende Bild zeigt das Format, das bei dieser Anwendung verwendet wurde:
Bild: Das *Format "FORMA", mit dem diese Anwendung arbeitet
Im Folgenden ist die Struktur der Adressierungshilfe für dieses Format abgedruckt.
* USER-AREA-LEN: 228 41 TACO PIC X(8). 41 FUNKTIONO PIC X(26). 41 NAMEO PIC X(14). 41 VNSO PIC X(2). 41 VNSRESTO PIC X(18). 41 STRASSEO PIC X(26). 41 NRO PIC X(10). 41 PLZO PIC X(5). 41 ORTO PIC X(24). 41 TELO PIC X(16). 41 MELDTEXTO PIC X(80).
Die Felder "FUNKTIONO" und "MELDTEXTO" sind geschützte Felder, das Feld "PLZO" ist numerisch.
IDENTIFICATION DIVISION. PROGRAM-ID. ANZEIGE. ***************************************************************** ENVIRONMENT DIVISION. ***************************************************************** DATA DIVISION. WORKING-STORAGE SECTION. COPY KCOPC. 01 FEHLERTEXT. 05 FILLER PIC X(21) VALUE "*** F E H L E R ***". 05 FILLER PIC X(14) VALUE "TEILPROGRAMM: ". 05 F-TP PIC X(08). 05 FILLER PIC X(17) VALUE " OPERATIONSCODE: ". 05 F-OP PIC X(04). 05 FILLER PIC X(13) VALUE " RETURNCODE: ". 05 F-CD PIC X(03). LINKAGE SECTION. COPY KCKBC. 05 KBPRG PIC X(228). COPY KCPAC. 03 NB. 05 TAC PIC X(008). 05 DATEN PIC X(220). 03 FILLER REDEFINES NB. COPY FORMAO. ***************************************************************** PROCEDURE DIVISION USING KCKBC KCSPAB. INIT-OPERATION-SECTION. MOVE SPACES TO NB. MOVE INIT TO KCOP. MOVE 0 TO KCLKBPRG. MOVE 512 TO KCLPAB. CALL "KDCS" USING KCPAC. IF KCRCCC NOT = ZERO THEN MOVE INIT TO F-OP GO TO FEHLER-BEHANDLUNG. MGET-OPERATION. MOVE MGET TO KCOP. MOVE 228 TO KCLA. MOVE "*FORMA" TO KCMF. CALL "KDCS" USING KCPAC DATEN. IF KCRCCC NOT = ZERO THEN MOVE MGET TO F-OP GO TO FEHLER-BEHANDLUNG. * AUFRUF DES TEILPROGRAMMS "DATEIEN", UM DIE LESEROUTINE * * AUFZURUFEN * LESE-OPERATION. CALL "DATEIEN" USING KCKBC, KCSPAB. MPUT-OPERATION. MOVE MPUT TO KCOP. MOVE "NE" TO KCOM. MOVE 228 TO KCLM. MOVE SPACES TO KCRN. MOVE "*FORMA" TO KCMF. CALL "KDCS" USING KCPAC NB. IF KCRCCC NOT = ZERO THEN MOVE MPUT TO F-OP GO TO FEHLER-BEHANDLUNG. PEND-OPERATION. MOVE PEND TO KCOP. MOVE "FI" TO KCOM. CALL "KDCS" USING KCPAC NB. PROG-ENDE. EXIT PROGRAM. FEHLER-BEHANDLUNG. MOVE "ANZEIGE" TO F-TP. MOVE KCRCCC TO F-CD. MOVE FEHLERTEXT TO NB. MOVE MPUT TO KCOP. MOVE "NE" TO KCOM. MOVE 80 TO KCLM. MOVE SPACES TO KCRN. MOVE SPACES TO KCMF. MOVE ZEROES TO KCDF. CALL "KDCS" USING KCPAC NB. MOVE PEND TO KCOP. MOVE "ER" TO KCOM. CALL "KDCS" USING KCPAC. GO TO PROG-ENDE.
IDENTIFICATION DIVISION. PROGRAM-ID. AENDERN. ***************************************************************** ENVIRONMENT DIVISION. ***************************************************************** DATA DIVISION. WORKING-STORAGE SECTION. COPY KCOPC. 01 FEHLERTEXT. 05 FILLER PIC X(21) VALUE "*** F E H L E R ***". 05 FILLER PIC X(14) VALUE "TEILPROGRAMM: ". 05 F-TP PIC X(08). 05 FILLER PIC X(17) VALUE " OPERATIONSCODE: ". 05 F-OP PIC X(04). 05 FILLER PIC X(13) VALUE " RETURNCODE: ". 05 F-CD PIC X(03). LINKAGE SECTION. COPY KCKBC. 05 KBPRG PIC X(228). COPY KCPAC. 03 NB. 05 TAC PIC X(008). 05 DATEN PIC X(220). 03 FILLER REDEFINES NB. COPY FORMAO. ***************************************************************** PROCEDURE DIVISION USING KCKBC, KCSPAB. *************************************** INIT-OPERATION-SECTION. MOVE SPACES TO NB. MOVE INIT TO KCOP. MOVE 0 TO KCLKBPRG. MOVE 512 TO KCLPAB. CALL "KDCS" USING KCPAC. IF KCRCCC NOT = ZERO THEN MOVE INIT TO F-OP GO TO FEHLER-BEHANDLUNG. MGET-OPERATION. MOVE MGET TO KCOP. MOVE 228 TO KCLA. MOVE "*FORMA" TO KCMF. CALL "KDCS" USING KCPAC DATEN. IF KCRCCC NOT = ZERO THEN MOVE MGET TO F-OP GO TO FEHLER-BEHANDLUNG. * AUFRUF DES TEILPROGRAMMS "DATEIEN", UM DORT ABHAENGIG VOM TAC * * ZU DEN ROUTINEN SCHREIBEN, UEBERSCHREIBEN UND LOESCHEN ZU * * VERZWEIGEN * DATEI-OPERATION. CALL "DATEIEN" USING KCKBC, KCSPAB. MPUT-OPERATION. MOVE MPUT TO KCOP. MOVE "NE" TO KCOM. MOVE 228 TO KCLM. MOVE SPACES TO KCRN. MOVE "*FORMA" TO KCMF. CALL "KDCS" USING KCPAC NB. IF KCRCCC NOT = ZERO THEN MOVE MPUT TO F-OP GO TO FEHLER-BEHANDLUNG. PEND-OPERATION. MOVE PEND TO KCOP. MOVE "FI" TO KCOM. CALL "KDCS" USING KCPAC NB. PROG-ENDE. EXIT PROGRAM. FEHLER-BEHANDLUNG. MOVE "AENDERN" TO F-TP. MOVE KCRCCC TO F-CD. MOVE FEHLERTEXT TO NB. MOVE MPUT TO KCOP. MOVE "NE" TO KCOM. MOVE 80 TO KCLM. MOVE SPACES TO KCRN. MOVE SPACES TO KCMF. MOVE ZEROES TO KCDF. CALL "KDCS" USING KCPAC NB. MOVE PEND TO KCOP. MOVE "ER" TO KCOM. CALL "KDCS" USING KCPAC. GO TO PROG-ENDE.
IDENTIFICATION DIVISION. PROGRAM-ID. DATEIEN ENVIRONMENT DIVISION. *********************** INPUT-OUTPUT SECTION. *---------------------- FILE-CONTROL. SELECT ADRESSEN ASSIGN TO "adressen" ACCESS MODE IS RANDOM ORGANIZATION IS INDEXED RECORD KEY IS D-NAME FILE STATUS IS DATEISTATUS. DATA DIVISION. **************** FILE SECTION. *-------------- FD ADRESSEN LABEL RECORD IS STANDARD. 01 D-ADRESSATZ. 05 D-NAME. 10 D-NACHNAME PIC X(14). 10 D-VNS PIC X(02). 05 D-VORNAME PIC X(18). 05 D-STRASSE PIC X(26). 05 D-NR PIC X(10). 05 D-PLZ PIC X(04). 05 D-ORT PIC X(24). 05 D-TEL PIC X(16). WORKING-STORAGE SECTION. *------------------------ 01 DATEIFEHLERZEILE. 05 FILLER PIC X(24) VALUE " *** DATEIFEHLER NR.: ". 05 DATEISTATUS PIC X(02). 05 FILLER PIC X(04) VALUE " ***". 05 FILLER PIC X(50) VALUE SPACES. LINKAGE SECTION. *----------------- COPY KCKBC. 05 KBPRG PIC X(228). COPY KCPAC. 03 NB. 05 TAC PIC X(008). 05 DATEN PIC X(220). 03 FILLER REDEFINES NB. COPY FORMAO. PROCEDURE DIVISION USING KCKBC KCSPAB. **************************************** STEUER SECTION. *----------------- STEUER-BEGIN. IF KCTACVG = "STARTUP" THEN OPEN I-O ADRESSEN GO TO STEUER-END. IF KCTACVG = "SHUTDOWN" THEN CLOSE ADRESSEN GO TO STEUER-END. IF KCTACVG = "1" THEN GO TO LESEN-BEGIN. IF KCTACVG = "2" THEN GO TO SCHREIBEN-BEGIN. IF KCTACVG = "3" THEN GO TO UEBERSCHREIBEN-BEGIN. IF KCTACVG = "4" THEN GO TO LOESCHEN-BEGIN. STEUER-END. EXIT PROGRAM. LESEN SECTION. *------------------------------------------ LESEN-BEGIN. * VERSORGEN DES ISAM-SCHLUESSELS MOVE NAMEO TO D-NACHNAME. MOVE VNSO TO D-VNS. MOVE SPACES TO STRASSEO NRO ORTO TELO. MOVE ZEROES TO PLZO. MOVE KCTACVG TO TACO. MOVE "ANZEIGE VON ADRESSEN. " TO FUNKTIONO. READ ADRESSEN RECORD INVALID KEY PERFORM DATEIFEHLER GO TO LESEN-END. MOVE D-NACHNAME TO NAMEO. MOVE D-VNS TO VNSO. MOVE D-VORNAME TO VNSRESTO. MOVE D-STRASSE TO STRASSEO. MOVE D-NR TO NRO. MOVE D-PLZ TO PLZO. MOVE D-ORT TO ORTO. MOVE D-TEL TO TELO. LESEN-END. EXIT PROGRAM. SCHREIBEN SECTION. *---------------------------------------------- SCHREIBEN-BEGIN. ENTRY "SCHREIBEN" USING ADRESSATZ. MOVE VNSO TO D-VNS. MOVE VNSRESTO TO D-VORNAME. MOVE STRASSEO TO D-STRASSE. MOVE NRO TO D-NR. MOVE PLZO TO D-PLZ. MOVE ORTO TO D-ORT. MOVE TELO TO D-TEL. MOVE KCTACVG TO TACO. MOVE "NEUEINTRAG VON ADRESSEN. " TO FUNKTIONO. MOVE " * ADRESSE IST EINGETRAGEN * " TO MELDTEXTO. WRITE D-ADRESSATZ INVALID KEY PERFORM DATEIFEHLER. SCHREIBEN-END. EXIT PROGRAM. UEBERSCHREIBEN SECTION. *--------------------------------------------- UEBERSCHREIBEN-BEGIN. * Satz lesen zum Sperren des Satzes MOVE NAMEO TO D-NACHNAME. MOVE VNSO TO D-VNS. MOVE "AENDERN VON ADRESSEN. " TO FUNKTIONO. READ ADRESSEN RECORD INVALID KEY PERFORM DATEIFEHLER GO TO UEBERSCHREIBEN-END. MOVE VNSRESTO TO D-VORNAME. MOVE STRASSEO TO D-STRASSE. MOVE NRO TO D-NR. MOVE PLZO TO D-PLZ. MOVE ORTO TO D-ORT. MOVE TELO TO D-TEL. MOVE " * ADRESSE IST GEAENDERT * " TO MELDTEXTO. REWRITE D-ADRESSATZ INVALID KEY PERFORM DATEIFEHLER. UEBERSCHREIBEN-END. EXIT PROGRAM. LOESCHEN SECTION. *--------------------------------------------- LOESCHEN-BEGIN. * Satz lesen zum Sperren des Satzes MOVE NAMEO TO D-NACHNAME. MOVE VNSO TO D-VNS. MOVE "LOESCHEN VON ADRESSEN" TO FUNKTIONO. READ ADRESSEN RECORD INVALID KEY PERFORM DATEIFEHLER GO TO LOESCHEN-END. DELETE ADRESSEN RECORD INVALID KEY PERFORM DATEIFEHLER GO TO LOESCHEN-END. MOVE KCTACVG TO TACO. MOVE "* ADRESSE GELOESCHT *" TO MELDTEXTO. LOESCHEN-END. EXIT PROGRAM. DATEIFEHLER SECTION. *--------------------- DATEIFEHLER-BEGIN. IF DATEISTATUS = 22 THEN MOVE "*** ADRESSE MIT DIESEM NAMEN SCHON VORHANDEN. ***" TO MELDTEXTO GO TO DATEIFEHLER-END. IF DATEISTATUS = 23 THEN MOVE "*** ADRESSE MIT DIESEM NAMEN NICHT VORHANDEN. ***" TO MELDTEXTO GO TO DATEIFEHLER-END. MOVE DATEIFEHLERZEILE TO MELDTEXTO. DATEIFEHLER-END. EXIT.
IDENTIFICATION DIVISION. PROGRAM-ID. BADTACS. ***************************************************************** ENVIRONMENT DIVISION. ***************************************************************** DATA DIVISION. WORKING-STORAGE SECTION. 77 BTEXT PIC X(41) VALUE "FALSCHER TAC - BITTE EINGABE WIEDERHOLEN.". 77 STAR PIC X(6) VALUE ALL "*". COPY KCOPC. 01 FEHLERTEXT. 05 FILLER PIC X(21) VALUE "*** F E H L E R ***". 05 FILLER PIC X(14) VALUE "TEILPROGRAMM: ". 05 F-TP PIC X(08). 05 FILLER PIC X(17) VALUE " OPERATIONSCODE: ". 05 F-OP PIC X(04). 05 FILLER PIC X(13) VALUE " RETURNCODE: ". 05 F-CD PIC X(03). LINKAGE SECTION. COPY KCKBC. 05 FILLER PIC X. COPY KCPAC. 03 NB. 05 TRANSAC PIC X(08). 05 DATEN PIC X(220). 03 NB-A REDEFINES NB. COPY FORMAO. 41 FEHLER REDEFINES MELDTEXTO. 45 STAR1 PIC X(6). 45 BADTEXT PIC X(41). 45 STAR2 PIC X(6). 45 REST PIC X(27). **************************************************************** PROCEDURE DIVISION USING KCKBC KCSPAB. *************************************** INIT-OPERATION-SECTION. MOVE SPACES TO NB. MOVE INIT TO KCOP. MOVE 0 TO KCLKBPRG. MOVE 228 TO KCLPAB. CALL "KDCS" USING KCPAC. IF KCRCCC NOT = ZERO THEN MOVE INIT TO F-OP GO TO FEHLER-BEHANDLUNG. MGET-OPERATION. MOVE MGET TO KCOP. MOVE 228 TO KCLA. MOVE "*FORMA" TO KCMF. CALL "KDCS" USING KCPAC, DATEN. IF KCRCCC = "05Z" THEN MOVE SPACES TO NB-A. GO TO MPUT-OPERATION. IF KCRCCC NOT = ZERO THEN MOVE MGET TO F-OP GO TO FEHLER-BEHANDLUNG. MPUT-OPERATION. MOVE BTEXT TO BADTEXT. MOVE STAR TO STAR1. MOVE STAR TO STAR2. MOVE SPACES TO REST. MOVE SPACES TO TAC. MOVE MPUT TO KCOP. MOVE "NE" TO KCOM. MOVE 228 TO KCLM. MOVE SPACES TO KCRN. MOVE "*FORMA" TO KCMF. CALL "KDCS" USING KCPAC, NB. IF KCRCCC NOT = ZERO THEN MOVE MPUT TO F-OP GO TO FEHLER-BEHANDLUNG. PEND-OPERATION. MOVE PEND TO KCOP. MOVE "FI" TO KCOM. CALL "KDCS" USING KCPAC. PROG-ENDE. EXIT PROGRAM. FEHLER-BEHANDLUNG. MOVE "BADTACS" TO F-TP. MOVE KCRCCC TO F-CD. MOVE FEHLERTEXT TO NB. MOVE MPUT TO KCOP. MOVE "NE" TO KCOM. MOVE 80 TO KCLM. MOVE SPACES TO KCRN. MOVE SPACES TO KCMF. MOVE ZEROES TO KCDF. CALL "KDCS" USING KCPAC NB. MOVE PEND TO KCOP. MOVE "ER" TO KCOM. CALL "KDCS" USING KCPAC. GO TO PROG-ENDE.
REM ************************************************************** REM *** D E F - A N W E I S U N G E N *** REM *** *** REM *** KDCFILE = APPLI *** REM ************************************************************** MAX APPLINAME=A MAX KDCFILE=(KDCFILE.APPLI,S),TASKS=2,ASYNTASKS=0 MAX CONRTIME=5,LOGACKWAIT=60 ROOT ADR1ROOT OPTION GEN=ALL REM ************************************************************** REM ************ PROGRAM-ANWEISUNGEN ************ REM ************************************************************** PROGRAM KDCADM,COMP=C PROGRAM TPREAD,COMP=COB1 PROGRAM TPUPDATE,COMP=COB1 PROGRAM TPFILE,COMP=COB1 PROGRAM BADTACS,COMP=COB1 REM ************************************************************** REM ************ EXIT-ANWEISUNGEN ************ REM ************************************************************** EXIT PROGRAM=TPFILE,USAGE=START EXIT PROGRAM=TPFILE,USAGE=SHUT REM ************************************************************** REM ************ TAC-ANWEISUNGEN ************ REM ************************************************************** DEFAULT TAC ADMIN=Y,PROGRAM=KDCADM TAC KDCTAC TAC KDCLTERM TAC KDCPTERM TAC KDCSWTCH TAC KDCUSER TAC KDCSEND TAC KDCAPPL TAC KDCDIAG TAC KDCLOG TAC KDCINF TAC KDCHELP TAC KDCSHUT DEFAULT TAC TYPE=A,ADMIN=Y,PROGRAM=KDCADM TAC KDCTACA TAC KDCLTRMA TAC KDCPTRMA TAC KDCSWCHA TAC KDCUSERA TAC KDCSENDA TAC KDCAPPLA TAC KDCDIAGA TAC KDCLOGA TAC KDCINFA TAC KDCHELPA TAC KDCSHUTA TAC KDCTCLA DEFAULT TAC TYPE=D,PROGRAM=(STD) TAC KDCBADTC,PROGRAM=BADTACS TAC 1,LOCK=1,PROGRAM=TPREAD TAC 2,LOCK=2,PROGRAM=TPUPDATE TAC 3,LOCK=2,PROGRAM=TPUPDATE TAC 4,LOCK=2,PROGRAM=TPUPDATEREM ************************************************************** REM ************ USER-ANWEISUNGEN ************ REM ************************************************************** USER GUENTER,PASS=C'AUFGEHTS',KSET=BUND1,PERMIT=ADMIN,FORMAT=*FORMA USER BESSY,PASS=C'HH',KSET=BUND2,STATUS=ON,FORMAT=*FORMA USER HAPPI,KSET=BUND3,STATUS=ON,FORMAT=*FORMA REM ************************************************************** REM ************ FORMSYS-ANWEISUNG ************ REM ************************************************************** FORMSYS TYPE=FHS REM ************************************************************** REM ************ PTERM/LTERM-ANWEISUNGEN ************ REM ************************************************************** DEFAULT PTERM PRONAM=DSR01,PTYPE=T9750 PTERM DSS01,LTERM=UTMDST1 PTERM DSS02,LTERM=UTMDST2 PTERM DSS03,LTERM=UTMDST3 DEFAULT PTERM PRONAM=DSR01,PTYPE=T9022,USAGE=O PTERM G01,LTERM=DRUCKER,CONNECT=A LTERM UTMDST1,KSET=BUND1 LTERM UTMDST2,LOCK=4,KSET=BUND1 LTERM UTMDST3,LOCK=5,KSET=BUND1 LTERM DRUCKER,USAGE=O REM ************************************************************** REM ************ KSET-ANWEISUNGEN ************ REM ************************************************************** KSET BUND1,KEYS=(1,2,3,4,5) KSET BUND2,KEYS=(1,2,4) KSET BUND3,KEYS=(1) REM ************************************************************** REM ************ TLS-ANWEISUNGEN ************ REM ************************************************************** TLS TLSA TLS TLSB END