Es soll ein Kommando definiert und mittels Prozedur implementiert werden, das den Inhalt einer SAM- oder ISAM-Datei auf SYSOUT ausgibt. Standardmäßig stehen in den auszugebenden Dateien Sätze variabler Länge. Es können aber auch Dateien mit Sätzen fester Länge ausgegeben werden. Bei den auszugebenden ISAM-Dateien ist der ISAM-Schlüssel im Standardfall acht Byte lang. Er kann aber auch kürzer sein. Das Kommando soll folgendes Format haben:
TYPE-FILE |
NAME = <filename 1..54> ,ACCESS-METHOD = *ISAM(...) / *SAM *ISAM
,RECORD-SIZE = *VARIABLE / <integer 1..256> |
Das Kommando wird mittels Prozedur implementiert. Die symbolischen Operanden stehen als Stellungsoperanden in der Operandenliste des BEGIN-PROCEDURE-Kommandos. In der Prozedur wird mit dem Dienstprogramm EDT gearbeitet. Die folgende Prozedur steht in der Datei $SDFUSR.TYPE.FILE:
/ BEGIN-PROCEDURE N,PARAM=YES(PROC-PARAM=(&FILE,&ACCESS,&KEY,&RECORD),- / ESCAPE-CHARACTER='&') / MODIFY-JOB-SWITCHES ON=(4,5) / ASSIGN-SYSDTA TO-FILE=*SYSCMD / CREATE-JV JV=RECORD-SIZE / MODIFY-JV JV=RECORD-SIZE,VALUE='&RECORD' / LOAD-PROGRAM FROM-FILE=$EDT / SKIP-COMMAND TO-LABEL=&ACCESS "ACCESS IST ISAM ODER SAM" /.SAM SKIP-COMMANDS TO-LABEL=SAM1,IF=JV(COND=(RECORD-SIZE='VARIABLE')) / SET-FILE-LINK LINK-NAME=EDTSAM,FILE-NAME=&FILE,ACCES-METHOD=SAM,- / RECORD-FORMAT=FIXED(REC-SIZE=&RECORD) /.SAM1 RESUME-PROGRAM @ READ '&FILE' / HOLD-PROGRAM / SKIP-COMMANDS TO-LABEL=COMMON,IF=JV(COND=(RECORD-SIZE='VARIABLE')) / REMOVE-FILE-LINK LINK-NAME=EDTSAM / SKIP-COMMANDS TO-LABEL=COMMON /.ISAM CREATE-JV JV=ISAM-KEY / MODIFY-JV JV=ISAM-KEY,VALUE='&KEY' / SKIP-COMMANDS TO-LABEL=ISAM3,IF=JV(COND=(ISAM-KEY='8' AND - / RECORD-SIZE='VARIABLE')) / SKIP-COMMANDS TO-LABEL=ISAM1,IF=JV(COND=(ISAM-KEY='8')) / SKIP-COMMANDS TO-LABEL=ISAM2,IF=JV(COND=(RECORD-SIZE='VARIABLE')) / SET-FILE-LINK LINK-NAME=EDTISAM,FILE-NAME=&FILE,ACCESS-METHOD=- / ISAM(KEY-LEN=&KEY,KEY-POS=1),RECORD-FORMAT=FIXED(REC-SIZE=&RECORD) / SKIP-COMMANDS TO-LABEL=ISAM3 /.ISAM1 SET-FILE-LINK LINK-NAME=EDTISAM,FILE-NAME=&FILE,ACCES-METHOD=- / ISAM(KEY-LEN=8,KEY-POS=1),RECORD-FORMAT=FIXED(REC-SIZE=&RECORD) / SKIP-COMMANDS TO-LABEL=ISAM3 /.ISAM2 SET-FILE-LINK LINK-NAME=EDTISAM,FILE-NAME=&FILE,ACCES-METHOD=- / ISAM(KEY-LEN=&KEY) /.ISAM3 RESUME-PROGRAM @ GET '&FILE' / HOLD-PROGRAM / SKIP-COMMANDS TO-LABEL=ISAM4,IF=JV(COND=(ISAM-KEY='8' AND - / RECORD-SIZE='VARIABLE')) / REMOVE-FILE-LINK LINK-NAME=EDTISAM /.ISAM4 DELETE-JV JV=ISAM-KEY /.COMMON RESUME-PROGRAM @ PRINT %.-$N @ HALT / SET-JOB-STEP / DELETE-JV JV=RECORD-SIZE / ASSIGN-SYSDTA TO-FILE=*PRIMARY / MODIFY-JOB-SWITCHES OFF=(4,5) / END-PROCEDURE
Das Kommando TYPE-FILE wird in der Benutzersyntaxdatei SDF.USER.SYNTAX definiert. Anschließend wird es getestet.
|
(1) | Unter der Benutzerkennung SDFUSR wird eine Task gestartet. |
(2) | Die bei der LOGON-Verarbeitung automatisch aktivierte Benutzersyntaxdatei SDF.USER.SYNTAX wird deaktiviert. |
(3) | SDF-A wird geladen und gestartet. |
(4) | Die bereits existierende Benutzersyntaxdatei SDF.USER.SYNTAX wird eröffnet. |
(5) | In der Globalinformation wird festgelegt, dass das Fortsetzungszeichen „-“ für Folgezeilen bei Eingabe von SYSCMD in Spalte 2 bis 72 stehen kann. |
(6) | Der Kopf des Kommandos TYPE-FILE wird definiert. Es erhält einen englischen Hilfetext und wird dem Anwendungsbereich USER zugeordnet. Es ist mittels der Prozedur implementiert, die in der Datei $SDFUSR.TYPE.FILE steht. |
(7) | Der erste Operand des Kommandos TYPE-FILE wird definiert. Sein Name ist NAME. Er erhält einen englischen Hilfetext. In dem an die Prozedur zu übergebenden String steht er an erster Position. |
(8) | Es wird definiert, dass der Wert des Operanden NAME vom Datentyp FILENAME sein muss. |
(9) | Der zweite Operand des Kommandos TYPE-FILE wird definiert. Sein Name ist ACCESS-METHOD. Sein Default-Wert ist ISAM. In dem an die Prozedur zu übergebenden String steht er an zweiter Position. |
|
(10) | Es wird definiert, dass das Schlüsselwort ISAM ein zulässiger Wert des Operanden ACCESS-METHOD ist. ISAM leitet eine Struktur ein. |
(11) | Der erste Operand in der Struktur ISAM wird definiert. Sein Name ist KEY-LENGTH. Sein Default-Wert ist die Ganzzahl 8. In dem an die Prozedur zu übergebenden String steht er an dritter Position. |
(12) | Es wird definiert, dass der Wert des Operanden KEY-LENGTH vom Datentyp INTEGER sein muss. Als untere Schranke wird 1 und als obere 8 definiert. |
(13) | Die gerade bearbeitete Struktur ISAM wird geschlossen. |
(14) | Es wird definiert, dass das Schlüsselwort SAM ein zulässiger Wert des Operanden ACCESS-METHOD ist. |
(15) | Der dritte Operand des Kommandos TYPE-FILE wird definiert. Sein Name ist RECORD-SIZE. Sein Default-Wert ist VARIABLE. In dem an die Prozedur zu übergebenden String steht er an vierter Position. |
(16) | Es wird definiert, dass das Schlüsselwort VARIABLE ein zulässiger Wert des Operanden RECORD-SIZE ist. |
(17) | Es wird definiert, dass der Wert des Operanden RECORD-SIZE vom Datentyp INTEGER sein kann. Als untere Grenze wird 1 und als obere 256 definiert. |
(18) | Die Definition des Kommandos TYPE-FILE wird beendet. |
|
(19) | Die in der Benutzersyntaxdatei SDF.USER.SYNTAX erstellte Definition des Kommandos TYPE-FILE wird in der ausführlichsten Form ausgegeben. Für FILENAME hat SDF-A standardmäßig eine minimale Länge von 1 und eine maximale von 54 Zeichen festgesetzt. | ||||||
(20) | SDF lehnt das Kommando TYPE-FILE ab, da es in keiner aktivierten Syntaxdatei definiert ist. | ||||||
(21) | Die Benutzersyntaxdatei SDF.USER.SYNTAX wird aktiviert. | ||||||
(22) | Verschiedene ISAM-Dateien werden mit dem Kommando TYPE-FILE ausgegeben:
|
|
(23) | Die SAM-Datei DEMO.4 wird mit dem Kommando TYPE-FILE ausgegeben. Sie hat eine feste Satzlänge von 60 Byte. |
(24) | Für die Eingabe des Kommandos TYPE-FILE wird in den temporär geführten Dialog gewechselt. Über die Operanden NAME und RECORD-SIZE werden weitere Informationen angefordert. |
|
Es wird angegeben, dass der Name der auszugebenden Datei demo.5 ist und dass die Sätze eine feste Länge von 55 Byte haben. Die Zugriffsmethode *ISAM(KEY-LENGTH=8) ist der Default-Wert und deshalb schon voreingestellt.
Anschließend wird das Kommando ausgeführt. Nach der Kommandoausführung wird die Task beendet.