MVS/ESA JCL: Einführung in die Praxis [3., korr.und akt. Aufl. Reprint 2014] 9783486599008, 9783486250589

JCL (Job Control Language) ist der Schlüssel zur Job-Verarbeitung in MVS-Systemen. Dieses Buch zeigt, wie man JCL effekt

268 86 27MB

German Pages 415 [408] Year 1999

Report DMCA / Copyright

DOWNLOAD PDF FILE

Recommend Papers

MVS/ESA JCL: Einführung in die Praxis [3., korr.und akt. Aufl. Reprint 2014]
 9783486599008, 9783486250589

  • 0 0 0
  • Like this paper and download? You can publish your own PDF file online for free in a few minutes! Sign Up
File loading please wait...
Citation preview

Herausgegeben von

Dr. Klaus Becker-Berke

MVS/ESA JCL Einführung in die Praxis von

Michael Winter Deutsche Lufthansa AG

3., korrigierte und aktualisierte Auflage

Oldenbourg Verlag München Wien

Michael Winter sammelte nach seinem Studium mehrjährige Erfahrung als Anwendungsentwickler in der IBM-Welt in den Umgebungen DOS/VSE und MVS/TSO, bevor er als EDV-Dozent zur Deutschen Lufthansa AG wechselte. Er ist dort verantwortlich für die Schulung der Programmierer in den Bereichen TSO/ISPF, MVS, JCL und REXX sowie systemnaher Software. Anschrift: Michael Winter Lufthansa Systems GmbH Am Weiher 24 65451 Kelsterbach Tel.:+49 69 696 6587 Fax: +49 69 696 6588 E-Mail: [email protected]

Die Deutsche Bibliothek CIP-Einheitsaufnahme -

Winter, Michael: MVS ESA JCL : Einfuhrung in die Praxis / von Michael Winter. [Hrsg. von Klaus Becker-Berke.]. 3., korrigierte und aktualisierte Aufl. München ; Wien : Oldenbourg, 1999 -

ISBN 3-486-25058-2 -

© 1999 Oldenbourg Wissenschaftsverlag GmbH Rosenheimer Straße 145, D-81671 München Telefon: (089) 45051-0, Internet: http://www.oldenbourg.de Das Werk einschließlich aller Abbildungen ist urheberrechtlich geschützt. Jede Verwertung außerhalb der Grenzen des Urheberrechtsgesetzes ist ohne Zustimmung des Verlages unzulässig und strafbar. Das gilt insbesondere für Vervielfältigungen, Übersetzungen, Mikroverfilmungen und die Einspeicherung und Bearbeitung in elektronischen Systemen.

Lektorat:

Birgit Zoglmeier Herstellung: Rainer Haiti Umschlagkonzeption: Kraxenberger Kommunikationshaus, München Gedruckt auf säure- und chlorfreiem Papier Gesamtherstellung: R. Oldenbourg Graphische Betriebe GmbH, München

Inhaltsverzeichnis V

Inhaltsverzeichnis

Vorwort.XIII

Auflage.XIV Einleitung.1

Vorwort 1

zur

3.

Warum ist JCL so wichtig?.1 Wie ist dieses Buch aufgebaut?.1 Wer kann dieses Buch nutzen?.2 Was dieses Buch nicht ist.3

1.1

Grundbegriffe.3

MVS-Betriebssysteme.3

Speichermedien.4 Plattenspeicher.4 Magnetbänder und Kassetten.5 Logische versus physische Records.6 Datenverwaltung VTOC, VVDS und Katalog.6

Datenverwaltung und -Sicherung: DFHSM und RACF.11 Datenmanagement SMS.11 Zugriffsmethoden.12 -

-

VSAM.12

QSAM.12 Record-Formate.12

Datenorganisation PS oder PO.13 1.2 Der Ablauf des Jobs.13 Die 5 Jobphasen.14 Der Initiator.17 1.3 Fehlermeldungen.20 -

2

JCL.23 Aufbau der JCL-Anweisungen.23 Das Identifikationsfeld.23 Das Namefeld.24 Das Operationsfeld.24 Das Parameterfeld.24 Das Kommentarfeld.25

Fortsetzungsregeln.25

Default-Werte.26 Parameter.26

2.1 Die JOB-Anweisung.26 Der Beginn der JOB-Anweisung.27

VI Inhaltsverzeichnis

CLASS.28 MSGCLASS.28 MSGLEVEL.29 NOTIFY.30 REGION auf Job-Ebene.30 TIME auf Job-Ebene.31

TYPRUN.31 COND auf Job-Ebene.31 RESTART.33

Beispiele.33 EXEC-Anweisung.34

2.2 Die

PGM.34

PROC als Parameter der EXEC-Anweisung.35

PARM.35 COND auf EXEC-Ebene.36 TIME und REGION auf EXEC-Ebene.38 Abhängiges Ausführen von Steps mit IF/ELSE.38 2.3 Die DD-Anweisung für Datasets auf Platte.41 Existierende Datasets ansprechen.41

Verbindung zum Anwendungsprogramm.42 Beispiele für das Ansprechen existierender Datasets.42 Datasets auf Plattenspeicher anlegen.44 DSNAME.44 DISP.46

Der Subparameter status.46 Der normal-disp Subparameter.47 Der abnormal-disp Subparameter.49

Die Defaults für den DISP-Parameter.49 Beispiele zur Verwendung des DISP-Parameters.50

UNIT.51 VOLUME.52 SPACE.54

DCB.55 LRECL.57 BLKSIZE.57 Arbeiten mit dem Katalog.61 Besondere DD-Anweisungen.62 DD-Namen für Utility Output.62 DD-Namen für DISPLAY Output.63 Die STEPLIB DD-Anweisung.63 Die JOBLIB DD-Anweisung.64 Der DD DUMM Y-Parameter.65 Verketten von Datasets.66 DD SYSOUT-Anweisungen.67 Der DCB-Parameter.67 Der OUTLIM-Parameter.68

Inhaltsverzeichnis VII Der COPIES-Parameter.68 Der DEST-Parameter.68 Der SEGMENT-Parameter.69 Der SPIN-Parameter.69 Der FREE-Parameter.70 Die SYSIN DD-Anweisung.70

Output Management.73 DD-Anweisung für Datasets auf Bändern oder Kassetten.83

2.4 Die

Ansprechen von Datasets auf Band oder Kassette.83

Der Parameter UNIT=AFF.84 Schreiben von Datasets auf Band oder Kassette.85 Ein Dataset auf Band oder Kassette schreiben.86

EXPDT.86 RETPD.87

Beispiel für ein Anlegen eines Datasets auf einer Kassette.87 Arbeiten mit dem Katalog bei Bändern/Kassetten.88 Mehrere Datasets hintereinander auf Band oder Kassette schreiben.90 LABEL.91 VOLUME für Band Verarbeitung.91 Beispiele für Multi-File Technik.94 Ein großes Dataset auf mehrere Kassetten schreiben.97 Besonderheiten bei Band- bzw. Kassettenverarbeitung.98 MVDs lesen oder mit DISP=MOD erweitern.98

UNIT=(„DEFER).98

Der unit-Subparameter.98 Der Anzahl-Subparameter.98 Der DEFER-Subparameter.99 Nicht katalogisierte Datasets von Bändern/Kassetten lesen.99

Bänder exportieren.100 Standardbänder importieren.100 Kassetten/Bänder ohne Standardlabel verarbeiten.100 Die Subparameter NL, LTM und BLP.101 ASCII Daten auf Kassetten/Bändern verarbeiten.103 OPTCD für Bandverarbeitung.103 2.5 PASSen von Datasets zwischen Steps.104 Was passiert beim PASSen.104 2.6 Temporäre Datasets.108 Der DSN temporäre Datasets.108

Symbolische DSNs.108 Rückbezüge (Referbacks).109

DISP=(,PASS) für temporäre Datasets.111 UNIT und temporäre Datasets.112 Mögliche Probleme bei der Benutzung temporärer Datasets.113

Nicht-eindeutige symbolische DSNs.113 RESTART und

temporäre Datasets.114

VIII Inhaltsverzeichnis 2.7 Die OUTPUT JCL-Anweisung.117

ADDRESS.118 BUILDING.119 CLASS.119 COPIES.119 DEFAULT.119 DEPT.120 DEST.120 NAME.120 ROOM.120 TITLE.121

3

JCL-Prozeduren.123 Arten

3.1

von

Prozeduren.124

Benutzung katalogisierter Prozeduren.124

Katalogisierte Prozeduren auf privaten Bibliotheken.128 Die JCLLIB-Anweisung.129 Möglichkeiten der Anpassung.129 Ändern von EXEC-An Weisungen.130 Ändern von DD-Anweisungen.131

3.2

Hinzufügen von DD-Anweisungen.132 Gleichzeitiges Einfügen und Ändern von Anweisungen.133 Eigene Prozeduren schreiben.136 In-Stream-Prozeduren.137

Symbolische Parameter einsetzen.139 Wertzuweisungen für symbolische Parameter.140

SYSIN und Prozeduren.146 Die SYSIN DD DDNAME-Anweisung.146 Die SYSIN DD DSN-Anweisung.147 Die SET-An Weisung.151 Die INCLUDE-Anweisung.152

4

Utility-Programme.155 Allgemeine Merkmale von Utility-Programmen.155 Kontrollkommandos für

4.1

Utility-Programme.156

IDCAMS.157

Datasets löschen mit dem IDCAMS DELETE-Kommando.157

PURGE NOPURGE.158 SCRATCH NOSCRATCH.158 IDCAMS DELETE Beispiele.159 Datasets kopieren mit dem REPRO-Kommando.164 Datasets drucken mit dem PRINT-Kommando.167 -

-

-

4.2 IEBGENER.171 Datasets kopieren mit IEBGENER (SYNCGENR).171 Datasets umformatieren mit IEBGENER.175

Inhaltsverzeichnis IX Das GENERATE-Kommando.175 Das RECORD-Kommando.176 4.3 IEHPROGM.178 Bänder/Kassetten mit IEHPROGM entkatalogisieren.179 4.4 Die SORT Utility.180 JCL-Anweisungen für Sort-Programme.181 Sortieren mit dem SORT FIELDS-Kommando.183 Erhalten der ursprünglichen Reihenfolge.'..185 Beispiel für einen SORT über ein Feld.185 Verbesserungen der Performance beim SORT.187 Records auswählen mit INCLUDE oder OMIT.187 Verkürzung des zu sortierenden Records mit INREC.190 Einsatz von SUM FIELDS im SORT.192 Echtes Summieren mit SUM FIELDS.193 Unterdrücken von Duplikaten.195 Mischen von Datasets mit MERGE FIELDS.196 Kopieren von Datasets mit OPTION COPY.197 SORT Beispiele.198 4.5 Generation Data Groups.203 Erzeugen des GDG-Basiseintrags mit IDCAMS.204 Erzeugen einer neuen Generation.205 Abändern von Basisparametern.207 Ändern des LIMITS ohne SMS.208 Ändern des LIMITS mit SMS.209 Ansprechen existierender GDGs.210 Löschen einer GDG ohne SMS.210 Löschen einer GDG mit SMS.211 Besonderheiten von GDGs.212 4.6 IEBCOPY.212 Bibliotheken kompressen mit IEBCOPY.212 4.7 IEFBR14.213 Dispositions-Verarbeitung mit IEFBR14.214

5

VSAM.217 Arten von VSAM-Datasets.217 VSAM KSDS-Datasets.218

Die Datenkomponente.218 Das Kontrollintervall (CI).219 Die Control Area.223 Die Indexkomponente.223 Lesen von Records.225

DerCI-Split.228 DerCA-Split.229

KSDS-Datasets mit Alternativschlüssel.230 VSAM ESDS-Datasets.231

X Inhaltsverzeichnis

VSAM RRDS-Datasets.232 Die relative Byte Adresse (RBA).232

Übersicht VSAM-Datasets.232

5.1 Linear Data Sets.233 5.2 IDCAMS für VSAM-Datasets.234 Anlegen von VSAM-Datasets mit DEFINE CLUSTER.236

NAME.237 Platzanforderung für VSAM-Datasets.237 VOLUMES.238 Die

Datasetorganisationsparameter.239

RECORDSIZE.239 CONTROLINTERVALSIZE.239

UNIQUE.240

SUB ALLOCATION

KEYS.240 FREESPACE.241 SHAREOPTIONS.241 ERASE NOERASE.243 RECOVERY SPEED.243 IMBED NOIMBED.243 REPLICATE NOREPLICATE.244 ORDERED UNORDERED.244 KEYRANGES.245 REUSE NOREUSE.246 BUFFERSPACE.246 FOR-TO.247 SPANNED NONSPANNED.247 Anlegen eines KSDS-Dataset.247 Anlegen eines ESDS-Datasets.249 Anlegen eines RRDS-Datasets.250 Anlegen eines LDS-Datasets.251 -

-

-

-

-

-

-

-

VSAM-Datasets laden mit dem REPRO-Kommando.252 VSAM KSDS-Datasets reorganisieren.255 VSAM-Datasets mit Alternativindex anlegen.257 Das DEFINE AIX-Kommando.259

Beispiel für DEFINE AIX.262

Pfade für AIX-Datasets mit DEFINE PATH definieren.263 Beispiel für Anlegen eines Pfades.265 Alternativindex laden mit BLDINDEX.265 Beispiel für BLDINDEX.266 Erstellen und Laden des AIX.268 Ansprechen über den AIX im Batch.269 VSAM Informationen mit LISTCAT abrufen.270 Der Output des LISTCAT.272 VSAM-Datasets recovern VERIFY.278 JCL für existierende VSAM-Datasets.279 Der AMP-Parameter in der DD-Anweisung.279 -

Inhaltsverzeichnis XI VSAM-Datasets drucken mit dem PRINT-Kommando.280 VSAM-Datasets löschen mit IDCAMS DELETE.283 PURGE NOPURGE.284 ERASE NOERASE.284 IDCAMS DELETE Beispiel.284 Return Codes verändern mit IDCAMS Modal-Kommandos.287 5.3 COBOL für VSAM-Datasets.288 Die SELECT ASSIGN-Anweisung.288 SELECT ASSIGN für KSDS-Datasets.288 SELECT ASSIGN für ESDS-Datasets.289 SELECT ASSIGN für RRDS-Datasets.290 Die FD-Anweisung.,.290 Die OPEN-Anweisung.291 -

-

-

Lesezugriffe.292 Schreibzugriffe.293 Löschen von Records.293 START und READ NEXT.293

Beispiel.294 6

SMS

-

Storage Management Subsystem.303

6.1 SMS installiert, aber nicht aktiviert.304 Wegfall der Blocksize-Angaben.304 Konkatenieren von Kassettendatasets.307 Konkatenieren von ungleichen Datenträgern.308 Ändern des LIMITS eines Generationdatasets.308 Kilobytes und Megabytes beim Anlegen eines VSAM-Dataset.309 6.2 SMS installiert und aktiviert.310 Neue JCL-Anweisungen für SMS.311 AVGREC und SPACE.311

DATACLAS.311 KEYLEN.312 KEYOFF.313 LIKE.313 MGMTCLAS.314 RECORG.315 REFDD.315 SECMODEL.316 STORCLAS.316 Neue IDCAMS-Parameter für SMS.317

6.3

SMS-managed

vs.

nicht-SMS-managed.317

Anlegen von Datasets unter SMS ohne ACS.318 Sequentielle Datasets.318

VSAM-Datasets......320

Anlegen von Datasets unter SMS mit ACS.322 Sequentielle Datasets.322

XII Inhaltsverzeichnis

6.4

VSAM-Datasets.324 Mögliche Probleme beim Einsatz von SMS.324 VOL=SER in der JCL.324 DISP=(OLD,DELETE) bei VSAM-Datasets.326 Datasets auf mehreren Platten.326 Löschen und entkatalogisieren von Datasets.327 Nicht optimierte Blocksize.329 JOBCAT und STEPCAT.329 Neue Defaults beim DISP-Parameter.330

7

JCL-Schnittstellen.333

7.1 JCL aus CLISTen submitten.333 7.2 JCL aus REXX EXECs submitten.337 7.3 JCL mit File Tailoring Services generieren.339 Erzeugen eines temporären Jobs.340 Erzeugen des Jobs als Member einer Bibliothek.342 Erzeugen des Jobs aus mehreren SKEL Membern.344 7.4 TSO-Kommandos mit JCL absetzen.347

8

JCL-Fehler und ABENDs.349 Fehler in der JOB-Anweisung.349 Fortsetzungsfehler.349 Häufige Laufzeitfehler.351

Unsichtbare Fehler.352 8.1 ABEND Codes.353 ABEND Codes 001 bis 04F.353 ABEND Codes 100 bis EFF.355 ABEND Codes xFO bis xFF.357 ABEND Codes Fxx bis FFF.357

9

Anhang.359

9.1 Aufbau von Volume und Header Records.359 9.2 Nutzungsraten unterschiedlicher BLKSIZEs.363 9.3 CI-Größe und Plattennutzung.364 9.4 Glossar.366 9.5 Literatur.380 9.6 Installationsspezifische Daten.382 9.7 COBOL Return Codes für das FSl-Feld.384 9.8 Index.386

Vorwort Von einem, der auszog, JCL zu lehren Mal ganz ehrlich: Wie sind Sie

zu

Ihrer ersten JCL

gekommen?

War es nicht auch so, daß ein netter Kollege Ihnen anbot, seine JCL zu kopieren. "Da ändern Sie mal meine Userid in Ihre und dann wird das Ganze schon funktionieren". Und es funktionierte. Manchmal. Manchmal funktionierte es auch nicht und der nette Kollege hatte gerade Urlaub. Dann war man gezwungen, Änderungen an Dingen vorzunehmen, die man womöglich nicht verstand. Die Resultate sind meist dementsprechend. Erstaunlicherweise gibt es heutzutage noch viele Verantwortliche in der DV-Industrie, die der Meinung sind, man könne JCL so eben nebenbei lernen. Gerade für Anwendungsprogrammierer wird eine JCL-Ausbildung oft für überflüssig gehalten. Die Folgen dieser Haltung konnte ich am eigenen Leib erfahren. Auch ich bin in der oben beschriebenen Weise zum ersten Mal mit JCL in Berührung gekommen. Eine gezielte JCLAusbildung gab es nicht. 'Learning by doing' war angesagt, meistens war es jedoch 'Learning by surprise' oder 'Learning by ABEND'. Ich habe so ziemlich jeden JCL-Fehler und jeden ABEND mitgemacht. Doch diese Art, JCL zu lernen, ist sehr langwierig und ineffizient. Damals hätte ich ein Buch, wie es jetzt hier vorliegt, gut gebrauchen können. Dieses Buch ist aus den Erfahrungen der Praxis entstanden. Es vermittelt Ihnen die Kenntnisse, die Sie brauchen, um mit JCL sicher umgehen zu können. Es vermittelt auch wichtige Zusammenhänge. Sie sollen nicht nur Syntax beherrschen lernen, sondern Sie sollen vor allen Dingen verstehen, warum bestimmte Dinge so funktionieren, wie sie funktionieren. Das Buch ist in zweierlei Hinsicht strukturiert. Zum einen im Hinblick auf die Parameter, die Sie einsetzen müssen, zum anderen im Hinblick auf bestimmte Funktionen und Aufgabenstellungen, die Ihnen in Ihrer täglichen Arbeit begegnen können. Die Neuerungen, die sich mit der Version 4.2 (oder höher) von MVS/ESA ergeben haben, sind in diesem Buch berücksichtigt. Gleiches gilt für SMS, das Storage Management Subsystem, das in den letzten Jahren zu einem integralen Bestandteil der Datenverwaltung in der MVS-Welt wurde. Alle Neuerungen, die in Zusammenhang mit SMS stehen, werden vorgestellt. Großen Wert habe ich auf die Vollständigkeit der Beispiele gelegt. So ist nicht nur die JCL erläutert, es wird auch gezeigt, wie das entsprechende Programmcoding auszusehen hat. Ich habe mich entschlossen, dies immer an COBOL-Beispielen darzustellen, da diese Programmiersprache in der IBM-Welt noch immer große Bedeutung hat. Die im Buch verwendeten Begriffe und Abkürzungen werden bei ihrem ersten Auftauchen erläutert. Im Anhang befindet sich ein Glossar, in dem die wichtigsten Begriffe zusammengefaßt sind. Sollten Sie Dinge in diesem Buch entdecken, die bei Ihnen so nicht funktionieren, so halten Sie Rücksprache mit Ihrer Systemprogrammierung. Es ist durchaus denkbar, daß bei

XIV Vorwort

Ihnen Besonderheiten installiert worden sind. Ansonsten würde ich mich freuen, wenn Sie sich an den Verlag wenden würden. Dies gilt auch, wenn Sie bestimmte Dinge in diesem Buch erwartet und dennoch nicht gefunden haben. Ihre Anregungen können dann bei einer

Neuauflage Berücksichtigung finden.

Ich wünsche, daß Ihnen dieses Buch einige Aha-Erlebnisse vermitteln wird. Wenn es Ihnen gelingt, JCL damit zu meistern, so würde mich dies am meisten freuen. Dann hätte sich die Arbeit des Lehrenden gelohnt.

Frankfurt, im März 1996 Michael Winter

Vorwort zur 3.

Auflage

Sechs Jahre sind nunmehr seit dem Erscheinen der ersten Auflage dieses Buches vergangen. In dieser Zeit hat sich die EDV-Welt gravierend verändert. So stark sind Veränderungen, daß selbst die Prognosen der Fachleute über den Haufen geworfen wurden.

gibt Sie immer noch, entgegen aller Prognosen: Die IBM-Hosts. Auch sie haben sich angepaßt (wenngleich man das von der JCL nicht sagen kann, sie ist nun mal nicht so dynamisch). Sie werden die Jahrtausendwende erleben und, so hoffen alle, gut bewältigen.

Es

Da es die Rechner immer noch gibt, müssen die Programme weiter laufen. Der Bedarf nach JCL ist also immer noch vorhanden. Ich hoffe, daß es Ihnen mit Hilfe dieses Buches gelingen wird, praktische Probleme mit Hilfe von JCL zu bewältigen.

Frankfurt, im März 1999 Michael Winter

1

Einleitung

vorliegende Buch befaßt sich mit Job Control Language JCL. Um die Eigenheiten dieser Kontrollsprache zu verstehen, muß man wissen, daß man es bei JCL mit einem Produkt aus der Computer-Urzeit zu tun hat. JCL hat seine Ursprünge in den sechziger Jahren, als IBM die Computerserie der /360er Reihe einführte. Die JCL, die Sie heute benutzen, unterscheidet sich im Prinzip nicht von der, die es schon vor fast 30 Jahren gegeben hat. Dies ist auch einer der Gründe dafür, daß der Umgang mit JCL bisweilen schwerfällt. Das

-

JCL brauchen Sie, wann immer Sie Batch-Verarbeitung betreiben. Der Begriff BatchVerarbeitung ist ebenfalls ein Relikt aus der EDV-Urzeit, wurde damit doch der physische Lochkartenstapel bezeichnet, mit dessen Hilfe man früher Jobs in das System einlas. Heute werden die JCL-Anweisungen selbstverständlich auf elektronischem Wege erzeugt. Der

Begriff Batch-Verarbeitung ist jedoch geblieben.

Warum ist JCL

so

wichtig?

Wenn Sie auf einem IBM Großrechnersystem arbeiten, kommen Sie zwangsläufig mit JCL in Berührung. JCL wird gebraucht, um Anwendungsprogramme zu kompilieren und zu linken. Ohne JCL gibt es keine ausführbaren Programme. Anwendungsprogramme enthalten ausschließlich logische Datenbeschreibungen. Die Verbindung zu den physischen Daten erfolgt über JCL. Wenn Sie Funktionen, wie Kopieren von Datasets, nicht ständig manuell mit ISPF ausführen wollen, so brauchen Sie auch dazu JCL.

Gegensatz zu Ihrem Programm beschreibt JCL physische Daten. Zwar gibt es heute einen Trend, den Programmierer von den Zwängen der physischen Datensicht zu befreien, doch Sie sollten sich klarmachen, daß, auch wenn es wünschenswert ist, auf die physische Datensicht nicht verzichtet werden kann. Eine optimale physische Datenstruktur entscheidet letztlich über die Performance eines Programms. Sie entscheidet auch über eine optimale Nutzung der Im

Speicherressourcen. Dagegen ist die Frage, ob strukturiert oder unstrukturiert programmiert wurde, für die Performance und die

Speicherplatznutzung ohne jede Bedeutung.

Wie ist dieses Buch

aufgebaut?

In diesem einleitenden Kapitel wird auf einige wichtige Grundlagen Verständnis der Bedeutung der JCL-Parameter von Bedeutung ist.

eingegangen, die zum

MVS/ESA JCL

2

Kapitel Werden Ihnen alle wichtigen JOB-, EXEC- und DD-Anweisungen Sie lernen, existierende Datasets anzusprechen und neue Datasets im Job zu erzeugen. Die unterschiedliche Syntax für das Anlegen auf Platte bzw. Band/Kassette wird erläutert. Sie erlernen auch den Umgang mit temporären Datasets und wie Sie diese Datasets an die folgenden Steps übergeben können. Zur Vereinfachung wiederkehrender Abläufe lassen sich JCL-Prozeduren einrichten. Im Kapitel 3 lernen Sie, wie man vorhandene Prozeduren einsetzen kann und wie man eigene Prozeduren schreiben kann. Prozeduren geben Ihnen die Möglichkeit, Variable in der JCL zu definieren. Damit kann JCL sehr flexibel eingesetzt werden. Für eine ganze Reihe von wichtigen Funktionen, gibt es sogenannte Utility-Programme. Sie werden benötigt, um z.B. mit dem Katalog richtig umgehen zu können oder Datasets zu kopieren. Auf alle wichtigen Utility-Funktionen wird im Rahmen des Kapitels 4 Im zweiten

vorgestellt.

eingegangen. Umgang mit VSAM-Datasets erfordert eine umfangreiche Syntax, auf die im Kapitel 5 eingegangen wird. Sie lernen, wie die verschiedenen Arten von VSAM Datasets angelegt werden. Außerdem wird die Möglichkeit, Alternativindices zu definieren, erläutert. Dabei werden auch Performanceaspekte berücksichtigt. Wenn oben gesagt wurde, daß JCL in den letzten Jahren (Jahrzehnten) sehr statisch war, so gilt das nicht für SMS. Mit der Einführung vom SMS (System Managed Storage) ergeben Der

sich eine Reihe von Änderungen für die Benutzer von JCL. Zudem werden mit SMS 10 JCL-Parameter eingeführt. Im Kapitel 6 wird deren Benutzung ebenso erläutert wie auch Probleme, die sich beim Umstieg von einer Nicht-SMS auf eine SMS-Umgebung ergeben können. Im siebten Kapitel wird auf wichtige JCL-Schnittstellen eingegangen. Es wird gezeigt, wie Jobs auf andere Weise als durch einen SUBMIT aus einem Dataset heraus gestartet werden können. Dabei handelt es sich um die Möglichkeit, CLISTen oder REXX Execs zu nutzen. Der Dateierstellungsservice des ISPF (File Tailoring Service) stellt eine elegante Möglichkeit dar, JCL zu generieren. Auch dies wird im siebten Kapitel vorgestellt. Fehlermeldungen und ABENDs sind im Kapitel acht erläutert. Im neunten Kapitel finden Sie technische Daten, die für die Performance von Bedeutung sind. neue

Wer kann dieses Buch nutzen? Alle, die unter den Betriebssystemen MVS/XA und MVS/ESA arbeiten. Parameter, die erst mit MVS/ESA verfügbar wurden, sind mit (ESA) gekennzeichnet. Parameter, die mit der Version 4 von MVS/ESA verfügbar wurden, sind mit (ESA/4) gekennzeichnet. Ob Sie JCL-Neuling sind oder schon JCL-Erfahrung besitzen, spielt keine Rolle. Sie werden in jedem Fall

von

diesem Buch profitieren können.

Einleitung

3

Was dieses Buch nicht ist Dieses Buch will kein Ersatz für ein IBM Handbuch sein. Aus diesem Grund wird Ihnen immer nur die Syntax vorgestellt, die Sie in der Praxis brauchen. Auf eine vollständige Darstellung von in der Praxis nur sehr selten eingesetzten Parametern wird daher verzichtet.

1.1

Grundbegriffe

Wie Sie sehr bald merken werden, tauchen einige Begriffe in diesem Buch immer wieder auf. Es handelt sich dabei um zentrale Merkmale der MVS-Umgebung.

MVS-Betriebssysteme MVS/ESA ist bereits die dritte Generation der MVS-Betriebssysteme. MVS steht für ein Betriebssystem, das in der Lage ist, einen virtuellen Speicher zu benutzen. MVS ging aus einer Reihe von Vorgängersystemen hervor, deren Ursprung in das Jahr 1964 zurück reicht. Damals brachte IBM die Rechner der Reihe /360 auf den Markt und versprach seinen Kunden Aufwärtskompatibilität. Dieses Versprechen wurde bis heute immer eingehalten. Das wichtigste Betriebssystem der Nachfolgereihe /370 wurde MVS. In seiner Ursprungsversion MVS/370 bot es einen virtuellen Speicher mit 16 MB und eine 24Bit Adressierung. Schon gegen Ende der 70er Jahre konnte MVS/370 den gewachsenen Platzanforderungen nicht mehr gerecht werden. Insbesondere On-Line-Anwendungen wie IMS forderten ihren Preis. Die Antwort war das Betriebssystem MVS/XA, wobei XA für Extended Architecture steht. MVS/XA arbeitet mit einem virtuellen Speicher von 2 GB und einer auf 31 Bit erweiterten Adressierung. Das 32. Bit gibt den Adressierungsmodus an. Um die Kompatibilität zu wahren, wurde der virtuelle Speicher logisch um die 16 MB Linie gruppiert. 24-Bit Programme laufen unterhalb dieser Linie, 31-Bit Programme unterhalb und oberhalb dieser Linie. Da unter MVS/XA auch die Abwicklung von I/Os neu gestaltet wurde, brachte dieses System erhebliche Vorteile gegenüber MVS/370. Der Bedarf an virtuellem Speicher wuchs und wächst unaufhaltsam weiter. Moderne OnLine-Systeme wie DB2 oder CICS brauchen immer mehr Platz. Die zu verwaltenden Objekte nehmen an Größe zu. Das neueste Betriebssystem MVS/ESA (Enterprise System Architecture) bietet einen maximalen adressierbaren Bereich von fast unvorstellbaren 16 TB (Terabyte). Während beim Wechsel von MVS/370 auf MVS/XA die Adressierung von 24 Bit auf 31 Bit wuchs, ist bei MVS/ESA der adressierbare Bereich in die Breite gewachsen. Auch bei MVS/ESA wird mit 31 Bit adressiert. Zusätzlich zum normalen Adreßraum mit 2 GB, der schon unter XA verfügbar war, gibt es unter ESA NurDatenräume mit der Bezeichnung Data Space und HiPer Space, die ebenfalls 2 GB groß sind. Data Spaces sind byteadressierbar, in HiPer Spaces wird blockweise (4.096 Byte) adressiert. HiPer steht übrigens für High Performance.

Multiple Virtual Storage,

-

-

4

MVS/ESA JCL

Emführung von Nur-Datenräumen wird die Möglichkeit gegeben, die Daten adreßmäßig vom normalen Adreßraum zu trennen. Derzeit lassen sich die Data bzw. HiPer Spaces von höheren Programmiersprachen nur über die Data Windowing Services ansprechen, deren Benutzung derzeit noch etwas umständlich ist. Mit Assembler lassen sich beide Datenräume nutzen. Softwareprodukte wie DB 2 oder SYNCSORT nutzen diese Datenräume bereits. Dadurch ist es möglich, physische I/Os zu reduzieren. Durch die

Speichermedien Speicherung von Daten stehen Ihnen zwei verschiedene Möglichkeiten zu Verfügung: 1. Plattenspeicher mit der Möglichkeit des Direktzugriffs. 2. Kassetten und Bänder für die Speicherung von Massendaten und die Datensicherung mit der Möglichkeit des rein sequentiellen Zugriffs. Der einzelne Datenträger, egal ob Platte oder Band/Kassette, wird als Volume bezeichnet. Jedes Volume hat eine eindeutige Bezeichnung, von der häufig auch als vol-ser-no die Rede ist. Diese Volume-serial-number dient der exakten Bezeichnung. Bei Platten enthält die vol-ser-no Buchstaben, die Angaben für Bänder/Kassetten sind rein numerisch. Die Unit bezeichnet eine Gruppe gleichartiger Datenträger. Diese Bezeichnung wird Ihnen häufiger als die vol-ser-no begegnen, denn oft ist es praktischer, sich nur für einen Für die

Datenträgertyp

zu

entscheiden, als für eine ganz bestimmte Platte oder ein bestimmtes

Band.

Plattenspeicher Die am häufigsten genutzten Plattenspeicher sind die IBM Modelle 3380 und 3390. Die älteren Typen der Baureihe 3350 und 3330 sind heutzutage nur noch vereinzelt im Einsatz. Die einzelnen Baureihen unterscheiden sich hinsichtlich ihrer physischen Konfiguration. Innerhalb einer Modellreihe gibt es nur Unterschiede hinsichtlich der

Gesamtspeicherkapazität. Jeder Plattenspeicher hat

Summe der übereinander rotieren.

eine

Volume-Bezeichnung. Ein Platten-Volume besteht aus der angebrachten physischen Platten, die um eine gemeinsame Achse

Zusammenhang mit der Speicherung von Daten auf Platte gibt es zwei wichtige Begriffe: 1. Spur (Track) und 2. Cylinder Jede Platte besteht aus Magnetspuren, die in der Form von konzentrischen Kreisen auf der Plattenoberfläche abgelegt sind. Obwohl alle Spuren einen unterschiedlichen Radius besitzen, ist ihre Speicherkapazität gleich. Die Speicherdichte der einzelnen Spuren ist unterschiedlich und nimmt nach innen hin zu. Dies hat aber heute keinerlei praktische Bedeutung mehr. Im

5

Einleitung

jede Plattenoberfläche gibt es einen Lese-Schreibkopf. 15 Lese-Schreibköpfe sind an Zugriffsarm gekoppelt und werden immer gemeinsam über die Plattenoberflächen geführt. Die Summe der übereinander auf den verschiedenen Platten liegenden Spuren wird als Cylinder bezeichnet. Kontrolliert werden die Plattenspeicher von den Storage Control Units (SCU). Verbreitet sind heutzutage die Baureihen 3880 und 3990. Die SCU der Baureihe 3990 hat die Besonderheit, daß sie Platten des Typs 3380 und 3390 gemeinsam kontrollieren kann. Die Tatsache, daß diese Plattentypen hinsichtlich der Spurkapazität unterschiedlich konfiguriert sind, macht der SCU nichts aus. Allerdings kann es Ihnen Probleme bereiten, in dieser Konfiguration eine optimale physische Recordgröße zu errechnen. Die einzelnen Plattenbaureihen unterscheiden sich hinsichtlich der Spurkapazität. Diese Unterschiede sind für den Programmierer von großer Bedeutung. Ziel sollte es immer sein, den Platz auf der Platte optimal zu nutzen. Dies kann man dadurch erreichen, daß man es MVS ermöglicht, eine optimale physische Recordgröße zu errechnen. Man kann auch selber eine entsprechende Angabe mit dem BLKSIZE-Parameter machen, dann ist man aber auch selber für die Optimierung zuständig. Dies läßt sich durch Benutzung von JCL erreichen. Wer JCL falsch einsetzt, kann in diesem Punkt jedoch böse Überraschungen erleben. Im schlimmsten Fall kommt man auf Nutzungsgrade, die unter 10% des verfügbaren Platzes liegen. Die folgende Übersicht zeigt die wesentlichen physischen Merkmale verschiedener Plattenspeicher:

Für

einen

t

Baureihe

Bytes/Spur

Spur/Cyl

Kap/Vol (MB)

3380 A/B/D

47.476

15

630

2,52

3380 E/J

47.476

15

1.260

5,04

3380 K

47.476

15

1.890

7,56

3390-1

56.664

15

946

11,35

56.664

15

1.892

3390-2

Da mehrere

physische

Volumes

zu

einem

logischen

Volume

Kap/Laufwerk (GB)

22,7

zusammengefaßt

werden

können, ergeben sich maximale Speicherkapazitäten von bis zu 22,7 GB auf einer 3390-2.

Magnetbänder und Kassetten zum Zwecke der Datensicherung werden heutzutage Magnetkassetten und Magnetbänder verwendet, wobei die Magnetkassetten wegen ihrer leichteren Bedienung die

Vornehmlich

MVS/ESA JCL

6

Magnetbänder weitgehend verdrängt haben. Daten auf Band oder Kassette können nur sequentiell verarbeitet werden. Die Speicherkapazität einer Kassette vom Typ 3480 liegt bei 250 MB. Was die JCL betrifft, so macht es keinen Unterschied, ob Sie auf eine Kassette oder ein Band zugreifen. Aus diesem Grund werden in diesem Buch die Begriffe Band und Kassette synonym benutzt.

Logische versus physische Records In Ihren Anwendungsprogrammen werden immer logische Records verarbeitet. Auf den Datenträgern werden aber die logischen Records nicht einzeln abgespeichert; sie werden zu physischen Records, die aus mehrerem logischen Records bestehen, zusammengefaßt. Diese physischen Records heißen Blöcke. Ihre Größe kann mit einem bestimmtem JCLParameter beeinflußt werden.

Zwischen den Blöcken müssen Lücken, sogenannte Gaps, frei bleiben. Dies ist notwendig, um dem Lese-Schreibkopf das Aufsetzen am Beginn eines Blocks zu ermöglichen. Die Größe der Lücke ist erheblich. Sie beträgt 492 Byte bei einer 3380 und 666 Byte bei einer 3390. Auch zwischen den Blöcken von Daten, die auf Band oder Kassette gespeichert werden, müssen Lücken frei bleiben. Diese Gaps sind es, die das Abspeichern in Blöcken erforderlich machen. Würde man z.B. einen logischen Record von 80 Byte Länge in der physisch gleichen Länge abspeichern, so würde auf einen physischen Record von 80 Byte Länge eine Lücke von 492 Byte folgen. Der Effekt wäre eine miserable Platzausnutzung. Nur 1/6 der Spur wäre mit Daten belegt. Bei Bändern/Kassetten sieht diese Rechnung ähnlich aus. Während Sie früher gezwungen waren, sich eine optimale Blockgröße selbst zu errechnen, wird diese Funktion heute vom Betriebssystem übernommen. Dies bedeutet für Sie eine wesentliche Erleichterung und garantiert sowohl eine optimale Speicherplatznutzung als auch eine gute I/O-Performance.

Datenverwaltung VTOC, VVDS und Katalog -

Ebenso wie die Betriebssysteme, so ist auch die Art und Weise, wie Datenbestände verwaltet werden, evolutionär gewachsen. Dies erklärt die duale Struktur der Datasetverwaltung. Die untere Ebene ist die des Plattenverzeichnisses (VTOC) und der Bandverzeichnisse (Label), die obere Ebene ist die des Kataloges. Das Plattenverzeichnis wird als VTOC bezeichnet. Die Abkürzung bedeutet Volume Table of Content. Der VTOC enthält die Namen der auf der Platte befindlichen Datasets und gibt die Position auf der Platte an. Außerdem wird im VTOC Information über Umfang und Position von freiem Platz auf der Platte verwaltet. Als Rechenzentren nur wenige Platten zu verwalten hatten, genügte es, sich die Platte zu merken, auf der ein Dataset angelegt wurde oder aber alle Platten durchsuchen zu lassen, wenn von einem Dataset gelesen werden sollte. Mit der Zunahme der Platten wurde diese

Einleitung Form der Verwaltung immer ineffizienter. Hinzu eine sehr I/O-intensive Angelegenheit ist.

1

kommt, daß das Durchsuchen des VTOCs

Um das Auffinden von Datasets zu vereinfachen, wurde eine Katalogstruktur entwickelt. In seiner ursprünglichen Form war der Katalog ein Dataset, in dem die DSNs aller anderen Datasets und der Name der Platte verzeichnet war, auf dem die Datasets tatsächlich standen. Um ein Arbeiten mit dieser Katalogstruktur zu ermöglichen, war es jetzt notwendig geworden, beim Anlegen eines Datasets darauf zu achten, daß ein Eintrag sowohl im VTOC der Platte als auch im Katalog erfolgte. Die Einträge müssen synchron gehalten werden. In Nicht-SMS-Umgebungen gibt es immer noch die Möglichkeit, sogenannte nicht katalogisierte Datasets anzulegen. Für diese Datasets existiert zwar ein Eintrag im VTOC, aber kein Eintrag im Katalog. Ein weiteres Problem kann auftreten, wenn ein Dataset angelegt wird, dessen Namen im Katalog schon existiert. Wird der Katalogeintrag vor dem Anlegen nicht entfernt, so wird das Dataset zwar im VTOC einer Platte eingetragen, nicht aber im Katalog. Auch hier ist das Ergebnis ein nicht-katalogisiertes Dataset. Auch dieses Problem kann nur in Umgebungen auftreten, in denen SMS nicht aktiv ist. Eine Zeit lang existierten in MVS-Umgebungen verschiedene Katalogsysteme nebeneinander. Diesem Durcheinander wurde durch die Einführung der Integrated Catalog Facility (ICF) ein Ende gemacht. Mit ICF können sowohl normale (sequentielle) als auch

VSAM-Datasets verwaltet werden. Der ICF-Katalog besteht aus einem Master- und mehreren Userkatalogen. Der MasterKatalog enthält als Eintrag den ersten Teil des Datasetnamens (DSN) und den Verweis auf den Userkatalog. Im Userkatalog ist der eigentliche Datasetname (DSN), der Datenträger (UNIT) und die Plattennummer der Platte (VOLUME) verzeichnet, auf dem das gesuchte Dataset steht. Warum nun diese scheinbar komplizierte Struktur? Ein Grund ist die Datensicherheit. Wie der Name schon vermuten läßt, ist der Master-Katalog ein zentraler Teil der Datasetverwaltung. Um ihn zu schützen, haben die normalen User auf diesem Katalog nur eine Leseberechtigung. Einträge dürfen nur von der Systemprogrammierung gemacht werden. Bevor ein neuer User sich zum ersten Mal zum ISPF anmelden kann, muß seine USERID im Master-Katalog eingetragen sein, ansonsten kann das ISPF Profildataset nicht angelegt werden, wodurch das Anmelden zum ISPF mißlingt.

Im ihm zugeordneten Userkatalog hat der User Updateberechtigung. Sie ist notwendig, um z.B. ein Dataset neu eintragen zu können. Die Tatsache, daß mehrere Userkataloge eingesetzt werden können, bietet den Vorteil, daß der einzelne Userkatalog nicht zu groß wird, was wiederum für einen schnellen Zugriff sehr wichtig ist.

MVS/ESA JCL

8

Die

folgende Abbildung zeigt den grundsätzlichen Aufbau von Master- und Userkatalog:

MVS ICF

TD2104

=

Katalogstruktur Integrated Catalog Facility

TD2105

TD2106

9

Einleitung Am folgenden Beispiel soll erläutert UWIN.CLIST lokalisiert wird.

DSN

=

/

werden, wie mit Hilfe des Katalogs das Dataset

T842.CLIST —

Master Katalog

DATA SET NOT CATALOGED

Verarbeitung

DATA SET NOT FOUND

MVS/ESA JCL

10

In der JCL wird

nur

der Datasetname UWIN.CLIST mit Hilfe des DSN-Parameters UWIN auf dem Master-

angegeben. Zunächst wird mit Hilfe des ersten Teil des DSN Katalog gelesen. Eintrag im Master-Katalog für User UWIN und für HLQ T999: HLQ

UCAT

T999

UCAT.T800

UWIN

UCAT.T800

Der Master-Katalog enthält als Einträge nicht nur USERIDS sondern auch andere High Level Qualifier. High Level Qualifier sind zulässige erste Teile des DSN. Ob Sie diese HLQ benutzen dürfen, hängt von Ihrer RACF-Berechtigung ab.

Eintrag im verzeichnet ist: Der

Master-Katalog verweist auf den Userkatalog,

in dem der

komplette

DSN

Eintrag im Userkatalog für das Dataset UWIN.CLIST: DSN

UNIT

VOLUME

UWIN.CLIST

3390

DSK013

Der Eintrag besagt, daß das Dataset UWIN.CLIST auf einer Platte des die Bezeichnung DSK013 trägt.

Typs 3380 steht, die

Im VTOC der Platte DSK013 ist der DSN UWIN.CLIST und die Position dieses Datasets auf der Platte verzeichnet. Was wäre passiert, wenn ein nicht existierendes Dataset gesucht worden wäre? Nehmen wir an, Sie hätten sich verschrieben und nach dem Dataset UWfNN.CLIST gesucht. Da für UWINN kein Eintrag im

Master-Katalog existiert, käme es zu einem

DATASET NOT CATALOGED Fehler. Hätten Sie nach UWIN.CLST gesucht, und es wäre zum gleichen Fehler gekommen.

so

hätte der

Eintrag

im

Userkatalog gefehlt

Neben den Komponenten Master-Katalog, Userkatalog und VTOC gibt es noch ein weiteres wichtiges Systemdataset: das VVDS (VSAM Volume Data Set). Auf jeder Platte, auf der VSAM-Datasets stehen, gibt es ein VVDS. Mit dem VVDS wird die große Zahl von Statistikeinträgen gehandhabt, die VSAM-Datasets mit sich herumschleppen müssen. Das VVDS enthält alle Statistikeinträge für die auf der gleichen Platte stehenden VSAMDatasets. Diese Statistiken sind ein wichtiger Indikator für das Performanceverhalten von VSAM-Datasets. Vor der Einrichtung des VVDS wurden all diese Statistikeinträge im Userkatalog verwaltet. Dies führte zu einer hohen Zahl von Zugriffen auf den Userkatalog und beeinträchtigte sowohl die Performance des Katalogs, der seinerseits die Struktur eines

11

Einleitung

VSAM-Dataset hat, wie auch die der VSAM-Datasets allgemein. Durch die Einrichtung des VVDS wird die Zahl der Zugriffe auf den Katalog vermindert und das Synchronitätsverhalten verbessert, denn das VSAM-Dataset und das zugehörige VVDS liegen ja immer auf demselben Volume. Da der Master- und Userkatalog ebenfalls als VSAM-Datasets organisiert sind, gibt es auf den Platten, auf denen Master- und Userkataloge angesiedelt sind, jeweils ein VVDS.

Datenverwaltung und -Sicherung: DFHSM und RACF große Zahl der Datasets, die von einem Großsystem zu verwalten sind, zwingt zu einer optimalen Datenorganisation. So stehen auf den meisten MVS-Installationen zwei große Systemsoftwarepakete zur Verfügung, die dem Datenmanagement und dem Datenschutz (Zugriffsschutz) dienen. DFHSM (Data Facility/Hierarchical Storage Manager) ist ein System, daß die Datenverwaltung auf dem Großsystem optimieren hilft. Es besteht aus einer Migrationsund einer Backupkomponente. Die Migrationskomponente sorgt dafür, daß nicht oder selten benötigte Datasets entweder komprimiert oder auf Band/Kassette ausgelagert und erst bei Bedarf wieder geladen werden. Fragmentierte Datasets werden automatisch wieder zusammengefügt. Die Backupkomponente zieht von allen Daten in regelmäßigen Abständen Kopien (Backups). Im Falle eines Datenverlusts können diese Backups zum Recovern von Datasets Die

verwendet werden.

Access Control Facility) regelt den Zugang zum System und den Zugriff auf Daten (Lese- und Schreibvorgänge). Es stellt sicher, (Anmeldevorgang) daß nur autorisierte User Zugang zu den für sie bestimmten Datenbeständen haben. Zudem überwacht RACF die Art des Zugriffs. RACF

(Ressource

Mehr über den DFHSM und RACF erfahren Sie in dem Band: TSO Teuffei (siehe Literaturverzeichnis im Anhang).

Datenmanagement

-

von

Dr. Michael

SMS

SMS System Managed Storage oder Storage Management Subsystem ist ein Produkt, daß die Verwaltung von Datasets auf Plattenspeicher vereinfachen soll. Es kann unter MVS/ESA eingesetzt werden. Die meisten MVS-Installationen setzen SMS als selbstverständliche Ergänzung ein. -

-

Die wichtigste Neuerung unter SMS ist die Tatsache, daß es in einem von SMS kontrollierten Umfeld keine nicht-katalogisierten Datasets mehr geben kann. Außerdem lassen sich mit SMS VSAM-Datasets ohne die Benutzung der Utility IDCAMS definieren (und auch löschen!). Bei SMS unterscheidet man die Zustände installiert und aktiviert. Bereits im nicht aktivierten Zustand bringt SMS einige erhebliche Vorteile. Wegen seiner großen Bedeutung wurde SMS das gesamte Kapitel 6 in diesem Buch gewidmet.

MVS/ESA JCL

12

Zugriffsmethoden Die Zugriffsmethoden erlauben es, in Ihrem Anwendungsprogramm logische Records verarbeiten zu können, ohne sich um deren physische Struktur kümmern zu müssen. Wir werden uns mit den zwei wichtigsten Zugriffsmethoden auseinandersetzen: VSAM und

QSAM.

Die Zugriffsmethode ISAM (Indexed Sequential Access Method) ist veraltet und wurde durch VSAM abgelöst. Sie wird deshalb in diesem Buch nicht besprochen. VSAM VSAM ist die Abkürzung für Virtual Storage Access Method. Es ist eine Zugriffsmethode, die vier Datasetarten unterstützt, eine davon mit der Möglichkeit des Direktzugriffs. Das Thema VSAM ist so umfangreich, daß ihm das komplette Kapitel 5 gewidmet wurde.

VSAM-Datasets können nur auf Plattenspeichern

angelegt werden.

QSAM

QSAM steht für Queued Storage Access Method. Zugriff auf sequentielle Datasets erlaubt. Die

Es ist eine Zugriffsmethode, die den Datasets können auf Platte oder

Band/Kassette residieren.

im Hauptspeicher Platz für fünf Blöcke in einem Verfügung gestellt. Die Größe dieser Puffer entspricht der Blocksize. Setzt Ihr Programm den OPEN-Befehl für ein sequentielles Dataset ab, so werden die fünf Puffer gefüllt. Ihr Programm arbeitet dann die Records sequentiell mit READ-Anweisungen ab. Während Ihr Programm die Daten aus den Puffern verarbeitet, werden die bereits gelesenen Puffer asynchron wieder aufgefüllt. Sind die Daten aus dem fünften Puffer abgearbeitet worden, so kann unmittelbar im ersten Puffer weitergelesen werden, da QSAM die Daten schon zur Verfügung gestellt hat. Um die Tatsache, daß irgendwelche Puffer im Spiel sind, brauchen Sie sich in Ihrem Anwendungsprogramm nicht zu kümmern. Dies alles übernimmt die Zugriffsmethode QSAM. Beim Schreiben wird mit QSAM zunächst in die Puffer geschrieben und dann asynchron auf den gewünschten Datenträger übertragen. Dem

Anwendungsprogramm wird

sogenannten Puffer

zur

Record-Formate Bei

sequentiellen oder PO-Datasets werden folgende Record-Formate unterschieden: logische Recordlänge (F)

1. Fixe

2. Variable

logische Recordlänge (V) logische Recordlänge (U) Mehrere logische Records sind zu einem physischen wird durch ein auf F oder V folgendes B dargestellt.

3. Undefinierte

4.

Record

zusammengefaßt.

Dies

13

Einleitung

Das am häufigsten verwendete Format ist FB, wobei B für blocked steht. Die logischen Records werden zu einem physischen Block zusammengefaßt. Die Länge des physischen Blocks ist ein Mehrfaches der logischen Recordlänge. Die maximal zulässige Blockgröße ist 32760. Sollen variabel lange logische Records zu einem Block zusammengefaßt werden, so ist als Format VB anzugeben. Am Anfang eines jeden Blocks befindet sich ein 4 Byte langes Feld, das die tatsächliche Länge des Blocks beschreibt. Dies hat Auswirkungen auf Ihr Anwendungsprogramm. So stehen Ihnen bei einer maximalen Blockgröße von 32760 Byte nur 32756 zur Verfügung.

Beim Undefinierten Record-Format gibt es keine logischen Records. Dieses Format wird für Bibliotheken benötigt, in deren Member sich ausführbare Programme Load Modules befinden.

nur

-

-

Datenorganisation

-

PS oder PO

Wenn Sie

Batch-Verarbeitung betreiben, so haben Sie es am häufigsten mit Physisch Sequentiellen Datasets PS-Datasets zu tun. Bei dieser Datasetform werden die Records einer nach dem anderen weg geschrieben. In Jobs werden sehr häufig PS-Datasets als Ausgabedatasets erzeugt. Daneben gibt es noch eine weitere Organisationsform, die Bibliothek oder PO-Dataset. PO kommt aus dem Englischen und heißt Partitioned Organized, meint also eine Datasetform, die in sich noch einmal untergliedert ist. Der Vergleich mit der Bibliothek ist recht passend, denn wie eine Bibliothek besteht ein PO-Dataset aus einem Verzeichnis (Directory) und vielen Büchern (Member). Editiert -

-

werden die Member und nicht das gesamte Dataset. Bibliotheken werden u.a. zum Entwickeln von Programmen eingesetzt, aber auch die JCL, die einen Job steuert, wird als Member einer Bibliothek abgelegt. Das Haupteinsatzgebiet von Bibliotheken ist ISPF. In Jobs werden nur sehr selten Bibliotheken erzeugt.

1.2

Der Ablauf des Jobs

Ein Job ist eine Folge von JCL-Anweisungen. Jeder Job muß mit der JOB-Anweisung beginnen. Ein Job kann ein oder mehrere Programme ausführen. Für jedes Programm wird eine EXEC-Anweisung benötigt. Die Beziehung zu den physischen Daten wird über DDAnweisungen hergestellt. DD steht für Data Definition. Damit haben wir die drei wichtigsten Arten von JCL-Anweisungen kennengelernt. Wie sie syntaktisch aussehen, wird später erläutert. Ein Job wird als Member eines PO-Dataset abgelegt. Es ist möglich, mehrere Jobs in ein Member zu stellen. Diese Vorgehensweise ist jedoch unüblich. Ein kompletter Job kann folgendermaßen aussehen:

MVS/ESA JCL

14

edit-uwin.schulung idcams(br1401) 01.05 scroll ===> page command ===> ****** **************************** top of data ****************************** 000001 //uwin217c job (uwin,abtdg02),'m.winter1,class=x,msgclass=h 000002 //br14 exec pgm=iefbr14 000003 //delds dd dsn=uwin.test.outfile, 000004 // disp=(old,delete) .

-

******

***************************

.

bottom of data

****************************

jetzt noch nicht alles verstehen, ist das nicht schlimm. Alles wird noch ausführlich erläutert. Die grundsätzliche Folge der verschiedenen Anweisungen ist jedoch gut zu erkennen. Alles, was vom Beginn einer EXEC-Anweisung bis zum Beginn der nächsten EXECAnweisung steht, wird als Step oder Job Step bezeichnet. Ein Job muß zumindest einen Step besitzen. Er kann aus bis zu 255 Steps bestehen. Die DD-Anweisungen gehören immer zum Step. Ihre Zahl ist auf 3273 pro Step limitiert. Mit Hilfe einer DD-Anweisung wird entweder ein Dataset erzeugt oder ein existierendes Wenn Sie

Dataset angesprochen.

Um den Job zu aktivieren, geben Sie in der Kommandozeile des ISPF-Bildschirms den Befehl: SUBMIT ein. Ihr Job durchläuft dann 5 Phasen, die jetzt im einzelnen besprochen werden.

Die 5

Jobphasen

Die Abbildung auf der folgenden Seite

zeigt den Ablauf des Jobs:

SUBMIT

Ihren Job erstellen Sie in der Regel unter ISPF als Member eines PO-Dataset. Wollen Sie den Job ausführen lassen, so setzen Sie den ISPF-Befehl: SUBMIT ab. Durch den SUBMIT-Befehl übergeben Sie Ihren Job der Kontrolle des Job Entry Subsystems (JES). Von JES gibt es zwei Varianten: JES2 und JES3. Beide unterscheiden sich etwas in der Art, wie Sie Jobs abhandeln. JES2 ging aus einem Vorgängerprodukt namens HASP hervor. Dieses Houston Automatic Spooling Program wurde in den 60er Jahren für Einprozessorbetriebssysteme entwickelt. Die meisten MVS-Installationen nutzen heute JES2. JES3 wurde aus dem Vorgängerprodukt ASP (Asynchronous Multiprocessing System) entwickelt und war von Anfang an für Mehrprozessorumgebungen ausgelegt. Obwohl heute fast alle Mainframes mehrere Prozessoren haben, ist JES2 zu über 90% im Einsatz. Die Operator-Meldungen, die Sie zurückbekommen, beginnen mit $HASP. Sie stammen also noch aus der Zeit, als dieses Job Management System entwickelt wurde.

15

Einleitung

Die fünf JOB-Phasen::

SUBMIT

KONVERTIERUNG

JCL ERROR

JOB EXECUTION

OUTPUT PROCESSING JOB PURGING

Konvertierung und Syntaxprüfung Da JCL Variable enthalten kann (siehe dazu das Kapitel JCL-Prozeduren), müssen diese Variablen aufgelöst werden, bevor eine syntaktische Prüfung erfolgen kann. Zusammen mit den JCL-Anweisungen können auch Daten übergeben werden. Diese sogenannten SYSIN-Daten nehmen am Konvertierungsprozeß nicht teil. Daher ist es Unsinn, dort Variable anzugeben, auch wenn dies wünschenswert wäre. Da SYSIN-Daten nicht auf Syntax geprüft werden, können sie auch keinen JCL Syntaxfehler auslösen. Der Konvertierung folgt die Syntaxprüfung. Dort werden die JCL-Anweisungen auf formale Richtigkeit geprüft. Grob gesagt werden Fehler links vom Gleichheitszeichen fast immer erkannt. Fehler auf der rechten Seite des Gleichheitszeichens werden nur dann erkannt, wenn sogenannte Schlüsselwörter falsch angegeben wurden oder positionelle Parameter an der falschen Stelle stehen. Wenn Sie syntaktische Fehler begangenen haben, bekommen Sie eine:

MVS/ESA JCL

16

JCL ERROR-

Meldung. Ihr Job kommt dann erst gar nicht auf die Warteschlange. Noch unter HASP war dies anders. Da konnte es passieren, daß man nach dem SUBMIT 30 Minuten warten mußte, bis der Job anlief und dann wegen eines trivialen Fehlers abbrach. Das kann heute nicht mehr passieren. Fehler werden beim Syntax Check nicht erkannt. So können Sie ein Programm gar nicht existiert. Solange der Programmname syntaktisch korrekt eingegeben ist (max. 8 Zeichen, darf nicht mit einer Zahl beginnen), wird es nicht zu einem JCL-Fehler kommen. Wohl aber kommt es zu einem ABEND zur Laufzeit. Es kann aber während der Laufzeit des Programms zu einem Allokationsfehler kommen, der ebenfalls als JCL ERROR gemeldet wird. Syntaktische und Allokationsfehler sollten nicht miteinander verwechselt werden.

Logische

aufrufen, das

(Job Execution) Wenn Ihr Job syntaktisch einwandfrei ist, dann wird er auf einer Warteschlange plaziert und steht zur Ausführung an. Die Frage, wann Ihr Job ausgeführt wird, hängt zuallererst von der Job-Klasse und deren Priorität ab. Die Frage des Zeitpunkts des SUBMITs ist nur dann interessant, wenn Jobs in der gleichen Klasse laufen. Job-Klassen sind ein Instrument, um den Ablauf der Jobs zu steuern. Eine Job-Klasse kann Die Ausführung des Jobs

einen oder mehrere Initiator besitzen. Der Initiator ist ein Systemprogramm, daß einen Job ausführt. Wie dies im einzelnen geschieht, wird noch erläutert. Job-Klassen werden eingerichtet, um unterschiedlichen Bedürfnissen Rechnung zu tragen. So gibt es Job-Klassen mit einem hohen Anteil an CPU-Zeit, Job-Klassen, in denen Band/Kassettenverarbeitung zugelassen ist oder nicht oder Job-Klassen, die Jobs nur zu bestimmten Zeiten, z.B. nachts laufen lassen. Wichtig zu wissen ist, daß mit den JobKlassen auch Limitierungen einhergehen. So gibt es in den meisten MVS-Installationen nur wenige Job-Klassen mit unlimitierter CPU-Zeit. Wenn aber die Job-Klasse ein CPUZeitlimit vorgibt, so können Sie es auch durch die Angabe entsprechender JCL-Parameter nicht erhöhen. Die Ausgabeverarbeitung (Output Processing) Wenn Ihr Job Output, z.B. Druckoutput erzeugt, so wird dieser nicht unmittelbar auf den Drucker gelegt, sondern wird in einem Zwischendataset gespeichert. Diese Vorgehensweise ist notwendig, da Sie in einer Multiprogramming Umgebung arbeiten. Dieses Zwischendataset wird auf dem sogenannten Spool Volume angelegt. Dies geschieht automatisch. Diese Form des Outputs wird als SYSOUT (SYStem OUTput) bezeichnet. Erst wenn der Step beendet ist, wird mit dem Drucken begonnen. Job entfernen

(Purge Processing)

Ist der letzte Output, den der Job erzeugt hat, abgearbeitet (z.B. gedruckt), so wird der Job aus dem System entfernt. In den meisten MVS-Installationen wird der Job von einem

Einleitung

17

Output Management System übernommen. Typische Beispiele sind das BETA92 oder IOF (Input-Output Facility). Dort können Sie dann die Ergebnisse Ihres Jobs anschauen. Der Initiator

Job-Ausführung wollen wir uns noch einmal genauer ansehen. Er ist der für uns entscheidende. Der Job wird wie bereits gesagt von einem Systemprogramm mit dem Namen Initiator zur Ausführung gebracht. Einzige Aufgabe des Inititiators ist es, nach Jobs Ausschau zu halten, die ausgeführt werden können. Der Initiator ist einer oder mehreren Job-Klassen zugeordnet. Ein Job kann von einem Initiator nur dann ausgeführt werden, wenn die im Job angegebene Job-Klasse mit der übereinstimmt, für die der Initiator zuständig ist. Gibt es für eine bestimmte Job-Klasse nur einen Initiator, so kann das eine erhebliche Wartezeit bedeuten. Job-Klassen für Band- bzw. Kassettenverarbeitung besitzen meist nur einen oder wenige Initiator. Sehr aktiven JobKlassen sind viele Initiator zugeordnet. Die Wartezeiten in diesen Klassen sind daher meist Den Schritt

gering.

Job Initiation Die

wichtigste Aufgabe der Job Initiation ist sicherzustellen, daß im Job keine Datasets angefordert werden, die von anderen Jobs reserviert wurden. Sollte dies der Fall sein, so geht der Initiator in einen sogenannten 'wait state' und der Operator wird informiert. Ansonsten wird der nächste Schritt: Step Initiation ausgeführt. Step Initiation Wichtigste Aufgabe dieses Schrittes ist festzustellen, ob der Step wegen einer besonderen Bedingung unter Umständen nicht ausgeführt werden soll. Dazu wird, falls angegeben, der COND-Parameter überprüft bzw. Bedingungen geprüft, die mit IF/ELSE/ENDIF gesetzt wurden.

MVS/ESA JCL

18 Der schematische Ablauf der Jobphase

JOB-AUSFÜHRUNG sieht folgendermaßen aus:

JOB EXECUTION:

JOB INITIATION

STEP INITIATION

ALLOKATION PGM EXECUTION

DEALLOKATION

Step Allokation Durch die Allokation werden dem Step die benötigten Ressourcen zur Verfügung gestellt. Können die Ressourcen nicht zur Verfügung gestellt werden, so kommt es zum Abbruch des Steps (und damit des Jobs). Dies ist z.B. dann der Fall, wenn Sie für ein neues Dataset mehr Platz anfordern als zur Verfügung steht. In diesem Fall erhalten Sie einen JCLAllokationsfehler. Es gibt auch Fälle, in denen der Step nicht anlaufen kann. Dieser Fall ist gegeben, wenn Sie mehr Lese-Schreibstationen anfordern als zur Verfügung stehen. Die Art und Weise, wie die Allokation ausgeführt wird, unterscheidet sich je nachdem, ob bei Ihnen SMS aktiv ist oder nicht. Beim Aufsuchen vorhandener Datasets gibt es keinen Unterschied, wohl aber beim Anlegen neuer Datasets. Außerdem macht es bei der

19

Einleitung

Allokation einen Unterschied, wenn Sie Datasets auf Plattenspeicher oder Datasets auf Band/Kassette ansprechen. Werden vorhandene Datasets, die auf Plattenspeicher residieren, angesprochen, so wird der Katalog abgesucht. Wird im Userkatalog der Eintrag für den DSN gefunden, so wird sichergestellt, daß die Platte, auf der sich das Dataset befindet, für den Step verfügbar ist. Zu diesem Zeitpunkt wird aber noch nicht in den VTOC der Platte geschaut. Dies geschieht erst, wenn das Programm einen OPEN absetzt. Beim

Anlegen

von

Nicht-SMS-Datasets wird eine Platte

zugewiesen.

Danach wird das

Dataset angelegt, vorausgesetzt, der angeforderte Platz ist verfügbar. Das Dataset erhält dann einen Eintrag im VTOC. Beachten Sie, daß das Dataset zu diesem Zeitpunkt nicht katalogisiert ist. Reicht der Platz nicht, kommt es zu einem JCL-Fehler.

Werden SMS-Datasets angelegt, so wird zunächst überprüft, ob bereits ein Eintrag im Katalog für den zu vergebenden Datasetnamen existiert. Ist dies der Fall, so kommt es zu einem JCL-Fehler. Der Step bricht ab. Auf diese Weise wird verhindert, daß ein nichtkatalogisiertes Dataset angelegt wird. Sofern der Datasetname vergeben werden darf, wird eine Platte, die ebenfalls der Kontrolle von SMS unterliegt, zugewiesen. Das Dataset erhält einen VTOC-Eintrag und wird sofort katalogisiert. Dies ist der entscheidende Unterschied zu Nicht-SMS-Umgebungen. Dort wird das Katalogisieren von den Step-TerminationRoutinen übernommen. Wird anhand des Kataloges festgestellt, daß ein Dataset auf Band oder Kassette residiert oder soll ein neues Dataset auf Band/Kassette geschrieben werden, so erhält der Operator eine Meldung (Mount Message). Er muß dann eine freie oder die betreffende Kassette in eine Lese-Schreibstation einlegen. Die Lese-Schreibstation ist damit für Sie reserviert. Ein wichtiger Unterschied zwischen Plattenspeicher und Band/Kassette ist der, daß Ihnen die Lese-Schreibstation exklusiv zur Verfügung steht während sich viele User den Zugriff auf eine Platte teilen können ('shared access'). Beachten Sie auch, daß für jedes Dataset, das vom Band/von der Kassette gelesen oder geschrieben werden soll, eine Lese-Schreibstation belegt wird. Die

Ausführung des Programms Nach der Allokation folgt die Programmausführung. Dabei können sowohl vom User geschriebene Programme wie auch Utility-Programme ausgeführt werden. Erst wenn jetzt ein OPEN gemacht wird, wird beim Lesen von Plattendatasets der VTOC abgesucht. Sollte wider Erwarten das Dataset dort nicht vorhanden sein, kommt es zu einem DATASET NOT FOUND JCL Error.

Step-Ende (Step Termination) In diesem Schritt werden die bei der

Step-Allokation belegten Ressourcen wieder freigegeben. Außerdem wird versucht, die Datasets in den Zustand zu bringen, den der User mit Hilfe der JCL bestimmt hat. Dieser gewünschte Zustand kann sich unterscheiden, je

MVS/ESA JCL

20

nachdem, ob der Step normal endet (normale Disposition) oder abbricht (abnormale

Disposition). Vor Stepbeginn vorhandene

Datasets läßt man meist in dem Zustand zurück, wie man sie vorfand. Neue Datasets sollte man katalogisieren, wenn der Step normal endet. Bricht er ab, sollte man sie löschen. Wichtig ist, daß bei neuen Datasets, die nicht SMS-kontrolliert sind, erst jetzt mit dem Versuch des Katalogisierens begonnen wird. Sollte der DSN im Userkatalog schon vorhanden sein, kann nicht katalogisiert werden. Der Step endet aber trotzdem normal. Das auf der Platte angelegte Dataset bleibt bestehen. Auf diese Weise ist dann ein sogenanntes nicht-katalogisiertes Dataset entstanden. Sollten Datasets, die während des Programms geöffnet wurden, nicht geschlossen worden sein, so übernehmen die Step-Termination-Routinen diese Aufgabe. Sollte der Job aus mehreren Steps bestehen, so werden jetzt die Schritte ab Step-Initiation erneut durchlaufen. Dies geschieht solange, bis der letzte Step beendet ist. Das Ende des Jobs

(Job Termination)

Normalerweise haben die Job-Termination-Routinen nichts zu tun. Es gibt aber einige Sonderfälle, in denen sie eingreifen müssen, z.B. dann, wenn ein Dataset an Folgestep übergeben wurde, dort aber nicht angenommen wurde. In diesem Fall entscheiden die Job Termination Routinen, was mit dem Dataset geschieht. Unter Umständen können dabei überraschende Resultate produziert werden.

1.3

Fehlermeldungen

Bei der Benutzung von JCL kann es zum Auftreten unterschiedlicher Fehlerbedingungen kommen. Es handelt sich dabei um JCL-Fehler und ABnonnal ENDs (ABEND).

Bei JCL-Fehlem ist zwischen syntaktischen und Allokationsfehlern zu unterscheiden. Die syntaktischen JCL-Fehler lassen sich relativ leicht beheben. Sie werden beim Syntax Check entdeckt und gemeldet. Der Job kommt erst gar nicht zur Ausführung. Allokationsfehler treten erst während des Joblaufs auf. So kann es sein, daß der für ein neu anzulegendes Dataset angeforderte Platz nicht zur Verfügung gestellt werden kann. In diesem Fall kommt es zu einem SPACE REQUESTED NOT AVAILABALE-Fehler. Der Job Step bricht dann ab. Vorangegangene Steps sind aber bereits gelaufen. Der Job muß neu gestartet werden, und dieser Neustart kann wiederum mühsam sein. Allokationsfehler lassen sich nicht immer ausschließen. ABENDs treten auf, wenn Ihr Programm versucht eine Instruktion auszuführen, die es aus welchen Gründen auch immer nicht ausführen darf. Meist ist es nicht einmal Ihr Programm selbst, daß die Kontrolle hat, sondern ein Systemprogramm, daß von Ihrem Programm mit Hilfe eines SVC (Supervisor Call) aufgerufen wurde. MVS beendet dann die Ausführung Ihres Programms und gibt einen sogenannten System Completion Code oder ABEND Code zurück. Der Code besteht aus drei Zeichen und ist mit dem SVC verknüpft. So zeigt ein Code von xl3 ein Problem beim Öffnen eines Dataset an. Um die Ursache des -

-

Einleitung

21

ABEND herauszufinden, müssen Sie das entsprechende IBM Manual: GC28-1815 MVS/ESA Message Library: System Codes konsultieren. Dort werden Sie häufig auf die Manuals: MVS/ESA Message Library: System Messages Vol. I und II verwiesen. Hier finden sich dann genaue Informationen zum ABEND und den zu ergreifenden Maßnahmen. Im Kapitel 8 wird erläutert, wie die verschiedenen Fehlermeldungen zu interpretieren sind.

JCL

2

Bevor auf die einzelnen

JCL-Anweisungen eingegangen wird, syntaktischen Grundzüge erläutert werden.

sollen

an

dieser Stelle die

Aufbau der JCL-Anweisungen Job

Control-Anweisungen

müssen in einem ganz bestimmten Format erstellt werden. Die

Länge eines JCL-Records muß 80 Byte betragen. Diese Länge stammt noch aus der Lochkartenära, doch nur 72 Byte sind tatsächlich verfugbar. Die JCL-Anweisungen werden in der Regel als Member einer Bibliothek gespeichert. Diese Bibliothek sollte den Namen:

userid.*.CNTL tragen, wobei bei * ein beliebiger String bis zu acht Zeichen eingesetzt werden kann. CNTL

steht als Abkürzung für Control. Sie kann unter der ISPF Option 3.2 erstellt werden. Eine JCL-Anweisung kann aus bis zu vier verschiedenen Feldern bestehen. Diese Felder werden im einzelnen beschrieben.

Das Identifikationsfeld Das Identifikationsfeld beginnt auf Position 1 und hat eine Länge von 2 oder 3 Normale JCL-Anweisungen beginnen immer mit der Zeichenfolge '//'.

Byte.

Besondere Bedeutung haben die Zeichenfolgen '/*', die das Ende von Daten oder Kontrollanweisungen kennzeichnet (Standard Delimiter Anweisung), und '//*', die am Beginn einer Kommentarzeile steht. Beispiele:

ID-Feld

Bedeutung

//

Normale

//*

Kommentarzeile

P

Ende

von

JCL-Anweisung Daten

MVS/ESA JCL

24

Das Namefeld Unmittelbar auf das Identifikationsfeld folgt das Namefeld. Der Name darf maximal acht Zeichen lang sein. Er darf aus den Buchstaben A-Z, 0-9 und den Zeichen '#', '@' und '$' bestehen. Nummern an der ersten Stelle des Namens sind nicht erlaubt. Im Namefeld muß eine Angabe stehen, wenn es sich um eine JOB-Anweisung handelt. In einer EXEC-Anweisung sollte eine Angabe erfolgen. Dieser Name wird dann der sogenannte Stepname. Ein Step ist immer mit einer EXEC-Anweisung verbunden.

Bei DD-Anweisungen (Data Definition) wird mit der Angabe im Namefeld die Verbindung zwischen logischen und physischen Datasetnamen hergestellt. Der Name selbst ist weitgehend wahlfrei mit Ausnahme bestimmter Namen, auf die später eingegangen wird. Grundsätzlich sollte man bei DD-Anweisungen keine Feldnamen vergeben, die mit SYS anfangen, denn es gibt eine Reihe reservierter Feldnamen.

Beispiele: ID Namefeld -

//TJWINUEB

//STEP1 //EINGABE1 Das

Operationsfeld

Das Operationsfeld kennzeichnet die Funktion, die die JCL-Anweisung hat. Zwischen dem Namefeld und dem Operationsfeld muß mindestens ein blank stehen. Ausführlich betrachtet werden JOB, EXEC, DD und OUTPUT. IF, ELSE, ENDIF, SET und JCLLIB sind ab der Version 4.2 von MVS/ESA verfügbar. PROC und PEND haben nur für JCL-Prozeduren Bedeutung und werden im Kapitel 3: JCL-Prozeduren ausführlich vorgestellt.

Beispiele: ID Namefeld -

Operation

//UWINUEB

JOB

//STEP1

EXEC

//EINGABE 1

DD

Das Parameterfeld Das Parameterfeld ist das umfangreichste von allen. Zwischen dem Operationsfeld und dem Namefeld muß mindestens ein Leerzeichen stehen. Besteht das Parameterfeld aus mehreren Parametern, so werden diese durch Kommata abgetrennt. Besteht ein Parameter aus

JCL

25

mehreren Subparametern, so müssen diese umklammert und mit Kommata abgetrennt werden, wobei keine Leerzeichen eingefügt werden dürfen (ein Leerzeichen kennzeichnet das Ende einer JCL-Anweisung). Parameter können Schlüsselwort-Parameter oder Positionelle Parameter sein.

Beispiel 1 (ein Parameter im Parameterfeld): ID Namefeld

Op

Parameter

//EINGABE

DD

SYSOUT=*

Beispiel 2 (mehrere Parameter im Parameterfeld): ID-Namefeld Op Parameter

//EINGABE

DD

DSN=TJWIN.

TESTFILE, DISP=SHR

Beispiel 3 (ein Parameter mit mehreren Subparametern): ID-Namefeld Op Parameter

//EINGABE

DD

DCB=(RECFM=FB,LRECL=287)

Das Koninicntai leid Eine Kommentarzeile muß mit //* beginnen. Daran anschließend kann eine beliebige werden. Die Benutzung von Kommentaren ist sehr nützlich für Dokumentationszwecke. Nicht kommentierte JCL ist genauso fürchterlich wie unkommentierte Programme. Nutzen Sie deshalb die Kommentarmöglichkeit. Kommentare können auch rechts angehängt werden. Sie müssen von den Anweisungen durch mindestens ein Leerzeichen getrennt werden.

Zeichenfolge eingegeben

Fortsetzungsregeln Ein Komma muß am Ende der ersten Zeile stehen, in jeder Folgezeile muß nach dem '//' ein Leerzeichen stehen. Neue Anweisungen müssen zwischen Spalte 4 und Spalte 16 beginnen. Wird auf Spalte 17 oder später begonnen, betrachtet MVS dies als Kommentar.

Hier ein Beispiel für Fortsetzungsregeln und Kommentare. Die JCL-Anweisung auf Zeile 300 wird fortgesetzt. Auf den Zeilen 300 und 400 stehen Kommentare. Auf Zeile 600 folgt den JCL-Anweisungen ein Kommentar:

MVS/ESA JCL

26 EDIT-UWIN.SCHULUNG.CNTL(UEBUNGI)

01.00

.

-

COMMAND

===>

COLUMNS 001 072 SCROLL ===> PAGE

//UWINUEB1 JOB (998,ABTDG02),1M.WINTER1,CLASS=X,MSGCLASS=H //STEP1 EXEC PGM=IEFBR14 //* DIES IST EIN BEISPIEL FUER EINEN KOMMENTAR AUSSER//* HALB VON JCL-ANWEISUNGEN 000500 //INPUT DD DSN=UUIN.SCHULUNG.INPUT,

000100 000200 000300 000400

DISP=SHR

000600 // ******

KOMMENTARE KOENNEN AUCH HIER BEGINNEN BOTTOM OF DATA ***************************

****************************

Default-Werte

einige Parameter und Subparameter existieren systemseitige Default-Werte (Standardeinstellungen). Will man diese übernehmen, so braucht man den entsprechenden

Für

Parameter nicht

sich um einen Schlüsselwort-Parameter handelt. Bei Abwesenheit desselben durch ein Komma aber aus Dokumentationsgründen für erforderlich Default-Parameter dennoch kodieren.

zu

kodieren,

wenn es

positionellen Parametern muß die gekennzeichnet werden. Wenn man es hält, so kann man

Parameter Wie bereits erwähnt gibt es zwei Arten 1. positionelle (positional) und

von

Parametern:

(keyword) Parameter Wie der Name schon sagt, werden positionelle Parameter anhand ihrer Position erkannt. Werden sie weggelassen, so muß an ihre Stelle ein Komma treten. In diesem Fall werden Default-Werte angenommen. Gegebenenfalls sind mehrere Kommata für mehrere fehlende positionelle Parameter zu setzen. Fehlende positionelle Parameter am Schluß einer Anweisung brauchen nicht durch ein Komma ersetzt zu werden. Schlüsselwort-Parameter werden unabhängig von ihrer Position erkannt. Sie können überall 2. Schlüsselwort-

innerhalb des Parameter-Feldes stehen.

2.1

Die JOB-Anweisung

Ein Job ist eine Folge von JCL-Anweisungen, die mindestens aus einer JOB und einer oder mehreren EXEC-Anweisungen besteht. Jede EXEC-Anweisung markiert den Beginn eines Steps. Jeder Step ist mit der Ausführung eines Programmes verknüpft. Ein Job besteht also aus mindestens einem Step, er kann aber auch eine Vielzahl von Steps umfassen (bis 255).

Jeder Job muß mit einer Job-Anweisung beginnen. Aus ihm ergibt sich der Job-Name, der Abrechnungscode, die Klasse, in der der Job laufen soll, Art und Umfang der Nachrichten,

JCL

27

die man sind.

von

MVS zurückbekommen will und der

Ort,

an

den die

Ausgaben

zu

schicken

Syntax: JOB

(acct.info[,add.acct.info])[,'programmierer name'], CLASS=jobklasse, MSGCLASS=outputklasse[,] [NOTIFY=userid,] [MSGLEVEL=(anweisung,nachricht)5] [TYPRUN=SCAN,] [REGION=wertK oder wertM,] [TIME=(min,sec),] [COND=(zahl,operator),] [RESTART=stepname]

Die einzelnen Parameter werden in den

Der

folgenden Kapiteln erläutert.

Beginn der JOB-Anweisung

Syntax:

//jobname

JOB (acct.info[,add.acct.info]), ['Programmierer name',]

jobname ist ein bis zu 8 Zeichen langer String, der aus Buchstaben, Zahlen und den Zeichen '#', '@' und '$' bestehen kann. Das erste Zeichen darf keine Ziffer sein.

jeder MVS-Installation gibt es eigene Regeln für die Vergabe von Job-Namen. Erkundigen Sie sich, wie die entsprechenden Vorschriften bei Ihnen sind. In den Beispielen In

wird davon ausgegangen, daß der Job-Name aus der USERID: UWIN und vier wahlfreien Zeichen bestehen darf. Auf das JOB-Schlüsselwort folgt in Klammern die Abrechnungsinformation (account info). Auf sie kann das Feld additional account info folgen. Beide Angaben sind rein installationsabhängig. Erkundigen Sie sich, wie diese Angaben für Sie lauten müssen. Der Name desjenigen, der den Job abschickt, folgt nach den Abrechnungsinformationen. Beachten Sie, daß der Name in Hochkommata gesetzt wird. (Das ist unumgänglich, wenn z.B. Punkte im Namen verwendet werden).' Die folgenden Beispiele zeigen den Beginn von Job-Anweisungen.

MVS/ESA JCL

28

EDIT-UWIN.SCHULUNG.CNTLCUEB1) -

COMMAND

===>

01.00-. COLUMNS 001 072 SCROLL ===> PAGE

000001 //UWINUEB1 JOB (998,ABTDG02),'M.WINTER1, 000002 // MSGCLASS=Y, CLASS=A 000003 // 000004 //*_

UWIN.SCHULUNG.CNTLCUEB1)

EDIT

COMMAND 000001 //PRODP001 JOB

01.00

C OLUMNS 001 072

-

-

SCROLL

===>

===>

PAGE

(124),1M.WINTER 1,

000002 // MSGCLASS=Y, CLASS=A 000003 // 000004 //*_

CLASS Syntax:

CLASS=jobklasse Als Wert für jobklasse sind 0-9 und A-Z

zulässig.

Zuteilung von Jobs in bestimmte Job-Klassen dient der optimalen Auslastung des Systems. Es gibt daher Klassen für Produktion und Entwicklung, Klassen für Jobs mit hohem CPU-Anteil oder Klassen für Jobs, die viele I-Os durchführen. Auch die Frage, ob Band- bzw. Kassettenverarbeitung zugelassen ist, spielt bei der Wahl der Job-Klasse eine Die

Rolle.

Erkundigen Sie sich, welche Job-Klassen benutzen dürfen.

in Ihrer Installation

generiert sind und welche Sie

MSGCLASS Syntax:

MSGCLASS=outputklasse Als Wert für outputklasse sind 0-9 und A-Z zulässig. Der Parameter MSGCLASS teilt MVS mit, wo der Output hingestellt werden soll, d.h. soll er gedruckt werden oder nur ins IOF Menü laufen, wo er angeschaut werden kann. Mit jeder Output-Klasse ist ein Maximum an sogenanntem SYSOUT Output verbunden. Wird dieses Maximum überschritten, so erhält man an einen S722 ABEND. Wenn dieser

29

JCL

Fall eintreten sollte, so müssen Sie ihrem Job eine andere MSGCLASS zuordnen. Erkundigen Sie sich, welche MSGCLASSes bei Ihnen generiert sind.

MSGLEVEL Syntax:

MSGLEVEL=(anweisung,nachricht) Default:

MSGLEVEL=(1,1)_

Mit MSGLEVEL bestimmen Sie Art und Umfang der von System zurückzugebenden Meldungen. Der Parameter besteht aus zwei positionellen Subparametern: 1.

2.

Subparameter anweisung (Zahl zwischen 0 und 2) Bedeutung: Der

0

=

1

=

2

=

JOB-Anweisung drucken alle JCL-Anweisungen drucken, einschließlich solcher von Prozeduren nur JCL-Anweisungen des Eingabestroms drucken (von JCL-Prozeduren stammende Anweisungen werden nicht gedruckt) nur

Subparameter nachricht (Meldung) (Zahl zwischen 0 und 1) Bedeutung: 0 nur STEP-Ende-Meldungen drucken, keine Allokations- und Deallokations-Meldungen drucken 1 alle Meldungen drucken Der

=

=

Der Default für den MSGLEVEL Parameter ist

MSGLEVEL=(1,1) Anhand des MSGLEVEL-Parameters soll die Bedeutung positioneller Parameter erläutert werden. Will man z.B. den ersten Parameter weglassen, so kann man:

//

MSGLEVEL=(,0)

eingeben. Das Komma steht für den fehlenden ersten positionellen Subparameter. An seine Stelle tritt der Default-Wert 1. man den zweiten Subparameter (nachricht) weglassen will,

Wenn

//

MSGLEVEL=(2 ) ,

so

könnte man:

MVS/ESA JCL

30

eingeben. Da jedoch das Komma nicht erforderlich ist, Subparameter weggelassen wird, kann man statt dessen:

//

wenn

der letzte

positionelle

MSGLEVEL=(2)

Die Klammern sind jedoch nur dann erforderlich, wenn mehrere Subparameter voneinander getrennt werden sollen. Da hier nur noch ein Subparameter übrig bleibt, kann man bedenkenlos:

eingeben.

//

MSGLEVEL=2

eingeben. NOTIFY Syntax:

NOTIFY=userid Wird NOTIFY angegeben, so meldet sich MVS bei Beendigung des Jobs bei dem User, dessen USERID eingetragen ist. Die Benutzung dieses Parameters kann sehr nützlich sein. In den meisten Installationen ist als Standard NOTIFY=userid gesetzt, so daß man im Normalfall nichts angeben braucht.

REGION auf Job-Ebene Syntax: REGION=wertK oder wertM In vielen Installationen wird einem TSO User eine Region von 4096 K als 'private region' Verfügung gestellt. Dieser Platz steht dem Programm im virtuellen Speicher zur

zur

Verfügung. Sollte ein Anwendungsprogramm mehr Platz benötigen, so kann mit REGION mehr Platz angefordert werden. Die Anforderung kann in Kilobyte oder Megabyte erfolgen. Wenn MVS den angeforderten Platz nicht zur Verfügung stellen kann, kommt es zu einem

Abbruch.

Es ist auch möglich, REGION auf Step-Ebene einzusetzen.

31

JCL

TIME auf Job-Ebene Syntax:

TIME=[min,sec] TIME wird überwiegend in Testumgebungen verwandt. Der Parameter dient dazu, einen Abbruch zu erzeugen, wenn das Programm die angegebene CPU-Zeit überschreiten sollte. In diesem Fall kommt es zu einem S322 ABEND. Der TIME-Parameter ist also eine Notbremse für den Fall eines Loops. Die Zeitvorgabe, die sich durch die CLASS ergibt, kann mit dem TIME-Parameter zwar herab, nicht aber herauf gesetzt werden. Minuten und Sekundenangabe werden durch ein Komma getrennt. Steht nur eine Zahl da, so wird sie als Minuten interpretiert.

Beispiele für den Parameter TIME: TIME=2

TIME=(1,45) TIME=30

TIME=(,30)

gibt ein Limit von 2 Minuten an gibt ein Limit von 1 Minute und 45 gibt ein Limit von 30 Minuten an gibt ein Limit von 30 Sekunden an

Sekunden

an

TYPRUN

Syntax:

TYPRUN=SCAN TYPRUN=SCAN bewirkt eine Syntaxprüfung der JCL. Der Job selbst kommt nicht zur Ausführung, auch dann nicht, wenn die JCL-Anweisungen fehlerfrei sind. JCLAllokationsfehler, die sich erst zur Laufzeit bemerkbar machen, können mit dieser

Anweisung nicht aufgespürt werden. COND auf Job-Ebene Syntax:

COND=[zahl,operator] Als zahl kann ein

beliebiger Wert zwischen 0 und 9999 stehen.

MVS/ESA JCL

32

Als

Operatoren unter op sind möglich: EQUAL

EQ

GT GE LT LE NE

> >=

< 8, dann wird der Job abgebrochen. Als Zahl kann ein beliebiger Wert zwischen 0 und 9999 stehen. Will man z.B. erreichen, daß der Job abbricht, wenn ein Step einen Return Code von 12 oder mehr zurückgibt, so kann man bei der Formulierung der Bedingung wie folgt

verfahren:

33

JCL

Gewünschte Bedingung: Wenn RC >=

12, dann breche ab.

Umkehrung: Wenn 12

*****************************

TOP OF DATA

===>

PAGE

*****************************

000001 //UWIN217G JOB (998,ABTDG02),1M.WINTER',CLASS=A, MSGCLASS=Y 000002 // ****** **************************** BOTTOM OF DATA ***************************

MVS/ESA JCL

34

Dieses

Beispiel zeigt eine um mehrere Parameter ergänzte JOB-Anweisung:

edit-uwin.schulung.cntl(pgm01)

01.15 -

command ******

.

columns 001 072 ===> page

scroll

===> *****************************

000001 //uwin217g job

top of data

*****************************

(998,abtdg02),'m.winter1,class=a,notify=uwin,

msgclass=y,

000002 000003 000004 000005

// // // //*

******

****************************

time=(,10), msglevel=(1,1) msglevel=(1,1),typrun=scan BOTTOM OF DATA

***************************

Die EXEC-Anweisung

2.2

EXEC-Anweisung werden Programme oder Prozeduren aufgerufen. Sie markiert gleichzeitig den Beginn eines Steps. Mindestens ein Step muß vorhanden sein, d.h. zu jedem Job gehört zumindest eine EXEC-Anweisung. Mit der

Syntax:

PGM=pgmname | [PROC]=procname[,] [PARM=,parameter,J] [COND=(zahl,operator[,stepname]),] [TIME=(min,sec),] [REGION=wertK oder wertM]

EXEC

PGM Syntax:

PGM=pgmname Mit pgmname wird der Name des auszuführenden Programms angegeben. Es kann ein vom User geschriebenes Programm sein oder ein Utility-Programm. User-Programme müssen zuerst kompiliert und gelinkt werden.

Programme werden normalerweise in den sogenannten LINKLIBs gefunden. Als LLNKLIB wird die SYS 1 .LINKLIB und die mit ihr verketteten Bibliotheken bezeichnet. Auf diesen Bibliotheken stehen ausführbare Programme (Lademodule), die allen Usern einer MVSInstallation zugänglich sind. Es gibt jedoch auch die Möglichkeit, mit privaten

35

JCL

Ladebibliotheken werden.

zu

arbeiten. Dann muß mit der STEPLIB

PROC als Parameter der

DD-Anweisung gearbeitet

EXEC-Anweisung

Syntax:

[PROC=]procname Mit procname wird der Name der auszuführenden Prozedur PROC kann, muß aber nicht angegeben werden:

//COMPLINK

EXEC PROC=COBCL

//COMPLINK

EXEC COBCL

Beide Anweisungen bewirken, daß die Prozedur COBCL

angegeben.

Das Schlüsselwort

aufgerufen wird.

Prozeduren werden auf der SYS1.PROCLIB und den mit ihr verketteten Bibliotheken gefunden. Auf diesen Bibliotheken stehen Prozeduren, die allen Usern einer MVSInstallation zugänglich sind. Unter MVS/ESA Version 4 gibt es jedoch auch die Möglichkeit, private Prozedurbibliotheken zu definieren. Diese Möglichkeit wird im Kapitel über JCL-Prozeduren behandelt. Obwohl es syntaktisch nicht erforderlich ist, sollte bei jeder EXEC-Anweisung immer ein

Stepname angegeben werden.

PARM Über den PARM-Parameter lassen sich Informationen an Anwendungsprogramme weitergeben. Die Länge des Parameters darf 100 Zeichen nicht überschreiten. In den Anwendungsprogrammen muß ein geeignetes Feld für die Aufnahme der Parameter definiert werden. Dem eigentlichen Parameter ist ein Feld vorangestellt, dem die tatsächliche Länge des übergebenen Parameters entnommen werden kann.

Beispiel: Anweisung in der JCL:

//STEP1

EXEC

PGM=PGM01,PARM='STRING'

36

MVS/ESA JCL

Aufbereitung der LINKAGE SECTION in einem COBOL-Programm: LINKAGE SECTION. 01

PARAMETER.

05 LAENGE 05 PARM1

PIC PIC

S9(4) COMP. X(100).

Notwendige Anpassung der PROCEDURE DIVISION-Anweisung: PROCEDURE DIVISION USING PARAMETER.

COND auf EXEC-Ebene

Solange Ihnen die Version 4 von MVS/ESA noch nicht zur Verfügung steht, müssen Sie sich mit dem vorhandenen COND-Parameter abplagen. Wenn Sie die folgenden Ausführungen gelesen haben, werden Sie die Einführung der Version 4 von MVS/ESA kaum noch erwarten können. Syntax:

COND=(zahl,operator[,stepname]) Syntax ist ähnlich wie beim COND-Parameter auf Job-Ebene. Es wird immer die Bedingung formuliert, die zum Nicht-Ausfuhren des Steps führt. Nachfolgende Steps werden wieder ausgeführt. Wird der Subparameter stepname weggelassen, so bezieht sich die Abfrage auf den höchsten bisher zurückgegebenen Return Code. Ansonsten bezieht sich die Abfrage auf den Return Code des angegebenen Steps. Es ist auch möglich, die Return Codes mehrerer Steps abzufragen. Diese Abfragen sind dann mit einem logischen UND verknüpft. Der Return Code selbst ist nicht Bestandteil der Syntax. Ihn muß man sich gedanklich ergänzen (siehe COND auf JOB-Ebene). Die

37

JCL Ein Beispiel soll dies verdeutlichen:

//STEP1

EXEC PGM=PROGl

//STEP2

EXEC

PGM=PROG2,COND=(0,NE,STEP1)

//STEP3

EXEC

PGM=PROG3,COND=(12,LE,STEP1)

//STEP4

EXEC PGM=PROG4

Die Ausführung von STEP2 ist abhängig von dem Return Code, der bei Beendigung von STEP1 erzeugt wird. Ist der Return Code von STEP1 ungleich 0, dann soll STEP2 nicht ausgeführt werden. In diesem Fall springt MVS sofort zu STEP3. Dieser Step wird aber nur dann ausgeführt, wenn der RC von STEP1 kleiner 12 ist, andernfalls wird auch dieser Step nicht ausgeführt. STEP4 wird unabhängig von den Return Codes von STEP1 STEP3 -

ausgeführt. Im Gegensatz zum COND-Parameter auf Job-Ebene führt der COND-Parameter in der EXEC-Anweisung nicht zu einem Abbruch des gesamten Jobs. Lediglich der betreffende Step wird nicht ausgeführt. Nachfolgende Steps werden aber ausgeführt. Erzeugt in obigem Beispiel STEP1 einen RC von 4, so wird STEP2 übersprungen, STEP3 und STEP4 aber gelangen zur Ausführung. Es können auch die Return Codes mehrerer Steps abgefragt werden. Beachten Sie die zusätzliche Klammerung, die in diesem Fall notwendig wird:

//STEP1

EXEC PGM=PROGl

//STEP2

EXEC PGM=PROG2

//STEP3 //

EXEC

//STEP4

EXEC PGM=PROG4

PGM=PROG3,

COND=((12,LE,STEP1),(8,LE,STEP2))

STEP3 wird ausgeführt,

wenn

STEP1 einen RC




******

*****************************

000001 000002 000003 000004

//uwin217g

// //chkcat //sysprint 000005 //sysin

===>

page

*****************************

job (998,abtdg02),'m.winter1,class=a,not ify=uwin, msgclass=y,time=(,10) exec pgm=idcams dd sysout=* dd

*

(uwin-schulung.ds99)

000006

delete

000007 000008 000009 000010 000011 000012

if maxcc

//step1

8 then set maxcc exec pgm=pgm01 =

dd

=

0

dsn=uwin.schulung.load,disp=shr

000013 000014 000015 000016 000017

//steplib //sysprint //sysabout //sysout //outfile // // // //

******

****************************

Besondere

top of data

dd sysout=* dd sys0ut=* dd sys0ut=* dd

dsn=uwin.schulung.ds99,

disp=(new,catlg), recfm=fb,

space=(trk,(5,1),rlse), un it=dskprm

bottom of data

***************************

DD-Anweisungen

DD-Feldnamen sind grundsätzlich wahlfrei. Es gibt jedoch eine Reihe festgelegter Feldnamen für bestimmte DD-Anweisungen, die eine besondere Bedeutung haben.

DD-Anweisungen mit festgelegten Feldnamen gibt es eine Reihe weiterer spezieller DD-Anweisungen, auf die im folgenden Abschnitt eingegangen wird. Grundsätzlich sollte man keinesfalls DD-Feldnamen kreieren, die mit SYS beginnen, da sonst zufällige Namensgleichheiten mit festgelegten DD-Feldnamen nicht auszuschließen

Neben solchen

sind.

DD-Namen für Utility

Output

Syntax: //SYSPRINT DD SYSOUT=*

63

JCL

Über den MSGLEVEL-Parameter lassen sich Art und Umfang der gewünschten JobInformationen steuern. Diese Messages werden auf das Spool-Volume geschrieben. Dafür

sind keine besonderen Angaben nötig, sofern kein Utility-Programm ausgeführt wird. Utility-Programme wie z.B. IDCAMS erzeugen jedoch einen zusätzlichen Output, für den auf dem Spool-Volume ein Dataset angelegt werden muß. Dieses Dataset muß unter dem DD-Namen SYSPRINT angesprochen werden. Um den Output auf das Spool-Volume zu legen, genügt die Angabe SYSOUT=*. Diese Anweisung bewirkt, daß alle Messages, die sich auf den Output einer Utility beziehen, in ein Dataset namens SYSPRINT geschrieben werden. Der Stern hinter SYSOUT dient dazu, die in MSGCLASS angegebene Output-Klasse zu verwenden. Es ist jedoch auch möglich, eine bestimmte Output-Klasse zu benutzen. Diese muß dann explizit angegeben werden. Es ist auch möglich, den Output in ein sequentielles Dataset laufen zu lassen. Von dieser Möglichkeit wird aber nur selten Gebrauch gemacht. Da diese Anweisung häufig gebraucht wird, sollte immer aufzunehmen. Wird SYSPRINT nicht benötigt, DD-Namen für DISPLAY

sich angewöhnen, diese Zeile entsteht kein Schaden.

man so

Output

Syntax: //SYSOUT

DD SYSOUT=*

Dient der Ausgabe von DISPLAY-Kommandos in einem COBOL Anwendungsprogramm. Die beiden SYSOUT sollten nicht miteinander verwechselt werden. Das erste SYSOUT ist ein Feldname (DD-Name), das zweite ist ein DD-Parameter und bewirkt die Umleitung auf das Spool-Volume. Dieser DD-Name ist installationsabhängig. Es kann sein, daß er bei Ihnen SYSOUX oder ähnlich heißt. Erkundigen Sie sich, welche Bezeichnung bei Ihnen zu verwenden ist. Die STEPLIB

DD-Anweisung

Syntax:

//STEPLIB DD DSN=dsname,DISP=SHR Die STEPLIB

DD-Anweisung benötigen Sie, wenn das Programm, das durch die EXECAnweisung ausgeführt werden soll, nicht auf einer sogenannten LINKLIB, sondern auf einer privaten Ladebibliothek steht. Als LINKLIB bezeichnet man eine Verkettung von Bibliotheken, die ausführbare Programme enthalten. So stehen z.B. alle Utility-Programme auf einer LINKLIB. Wo die von Ihnen kompilierten und gelinkten Programme stehen, ist abhängig von der Compileund Link-Prozedur, die in Ihrem Unternehmen verwendet wird. Es kann, muß aber keine

64

MVS/ESA JCL

LINKLIB sein. Für den Fall, daß es sich bei der Ladebibliothek nicht handelt, müssen Sie den Bibliotheksnamen unter STEPLIB angeben.

//STEP1 //STEPLIB

um

eine LINKLIB

EXEC PGM=PGM01 DD DSN=UWIN.LOAD,DISP=SHR

UWIN.LOAD muß eine Ladebibliothek sein, d.h. sie muß das Record-Format U besitzen und die logische Record-Länge muß 0 sein. Die BLKSIZE muß von 0 verschieden sein. Ist STEPLIB angegeben, so schaut MVS nur auf die dort angegebene Bibliothek und auf keine andere. Ist das Programm dort nicht vorhanden, kommt es zu einem S806 ABEND. Sollen mehrere Bibliotheken durchsucht werden, so müssen sie verkettet (konkateniert) werden. Ein Maximum von 16 verketteten Bibliotheken ist möglich.

//STEP1 //STEPLIB //

EXEC PGM=PGM01

DSN=UWIN.LOADl,DISP=SHR DD DSN=UWIN.LOAD2,DISP=SHR

DD

Die Funktionsweise der Verkettung wird weiter unten erläutert. Die STEPLIB DD-Anweisung kann irgendwo im Step stehen. Aus Gründen der Übersichtlichkeit sollte sie jedoch unmittelbar auf die EXEC-Anweisung folgen. Die JOBLIB

DD-Anweisung

Syntax: //JOBLIB DD DSN=dsname,DISP=SHR Im

Gegensatz zur STEPLIB DD-Anweisung bezieht sich die JOBLIB DD-Anweisung auf den gesamten Job. Die JOBLIB DD-Anweisung muß zwischen der JOB-Anweisung und der ersten EXECAnweisung stehen. Steht sie an einer anderen Stelle, kommt es unweigerlich zu einem JCLFehler. IEF606I

MISPLACED DD STATEMENT

Werden STEPLIB und JOBLIB zusammen angegeben, so gilt immer die STEPLIBAnweisung im betreffenden Step. Die unter JOBLIB genannten Bibliotheken werden dann nicht abgesucht.

Sollen mehrere Bibliotheken durchsucht werden, so müssen sie verkettet (konkateniert) werden. Ein Maximum von 16 verketteten Bibliotheken ist möglich. Bei der Benutzung von JOBLIB werden im Unterschied zu STEPLIB neben den angegebenen Bibliotheken auch die LINKLIB-Bibliotheken durchsucht. Es kann daher nicht so leicht zu einem S806 ABEND kommen.

65

JCL Das

folgende Beispiel zeigt

Beachten Sie, daß im STEP1 wird.

einen JOB mit JOBLIB- und STEPLIB-Anweisungen. die Bibliothek: UWIN.SCHULUNG.LOAD abgesucht

nur

edit-uwin. schulung. cntl(pgm01)

01.15

.-.

-

command ******

columns 001 072 ===> page

scroll

===> *****************************

fop op data

*****************************

000001 //uwin217g job (998,abtdg02),1m.winter1,class=a,n0tify=uwin, 000002 // msgclass=y, 000003 // msglevel=(1,1) dd dsn=uuin.load,disp=shr 000004 //joblib 000005 // dd dsn=sys1.linklib,disp=shr dd dsn=sys1.loadlib,disp=shr 000006 // exec pgm=idcams 000007 //chkcat 000008 //sysprint dd sysout=* dd * 000009 //sysin delete (uwin.schulung.ds99) 000010 if maxcc = 8 then set maxcc = 0 000011 exec pgm=pgm01 000012 //step1 000013 //steplib dd dsn=uwin.schulung.load,disp=shr 000014 //sysprint dd sysout=* 000015 //sysabout dd sysout=* 000016 //sysout dd sysout=* 000017 //outfile dd dsn=uwin.schulung.ds99, 000018 // disp=(new,catlg), 000019 // recfm=fb, 000020 // space=(trk,(5,1),rlse), unit=dskprm 000021 // ******

****************************

bottom of data

***************************

Der DD DUMMY-Parameter

Will man in Testumgebungen das Vorhandensein eines Dataset nur simulieren, so kann dazu der DUMMY-Parameter verwendet werden. Bei Ausgabedatasets wird in die Luft geschrieben, bei Eingabedatasets wird beim ersten READ die End-of-File Bedingung

zurückgegeben.

Unter Umständen können auch

DCB-Angaben zusammen mit DUMMY eingesetzt werden.

Beispiel:

//EINGABE //AUSGABE

DD DUMMY DD

DUMMY,BLKSIZE=23440

Wie man VSAM-Datasets auf DUMMY setzt, ist im

Kapitel über VSAM erläutert.

MVS/ESA JCL

66

Verketten

von

Datasets

MVS bietet die Möglichkeit, mit Hilfe von JCL mehrere physische Datasets zu einem logischen Dataset zu verketten (Concatenation of Datasets). Voraussetzung ist, daß alle zu verkettenden Datasets die gleiche LRECL besitzen, die BLKSIZE kann, muß aber nicht identisch sein.

Verkettet werden können nur gleichartige Datasets, also sequentiell mit sequentiell, PODatasets mit PO-Datasets. Sofern SMS installiert ist, spielt der Datenträger keine Rolle, d.h. ein sequentielles Dataset auf Band kann sehr wohl mit einem sequentiellen Dataset auf Platte verkettet werden. Ohne SMS muß die Art des Datenträgers gleich sein. Bei der Verkettung erhält nur das erste Dataset einen DD-Namen, die übrigen folgen

unmittelbar, wie folgendes Beispiel zeigt:

//INPUT // //

DD DSN=UWIN.JANUAR,DISP=SHR DD DSN=UWIN.FEBRUAR,DISP=SHR DD

DSN=UWIN.MAERZ,DISP=SHR

Das Anwendungsprogramm betrachtet die so verketteten Datasets als ein logisches Dataset. Es ist also nur ein OPEN und ein CLOSE erforderlich. Sehr häufig werden Verkettungen im Zusammenhang mit STEPLIB oder JOBLIB

eingesetzt.

//STEP1 //STEPLIB // // Beachten Sie

EXEC PGM=PGM04

DSN=UWIN.LOAD,DISP=SHR DSN=UGOS.LOADLIB,DISP=SHR DD DSN=SYS1.LOADLIB,DISP=SHR DD DD

Folgendes:

Stehen in den verketteten Bibliotheken Member mit gleichem Namen, so wird immer das Member gefunden, das in der Bibliothek steht, die in der Verkettung zuerst genannt wird. Stehen also im obigen Beispiel zwei Member mit Namen PGM04 auf den Bibliotheken UWIN.LOAD und UGOS.LOADLIB, so wird immer das Member auf der UWIN.LOAD gefunden und zur Ausführung gebracht. Achten Sie beim Kompilieren und Linken darauf, daß das ausführbare Programm auf die richtige Bibliothek kommt. Wird das Programm PGM04 neu kompiliert und gelinkt und anschließend als ausführbares Modul auf die UGOS.LOADLIB gestellt, so wird beim Ausführen von STEP1 immer die alte Version des PGM04, das auf der UWIN.LOAD steht, ausgeführt. Dies kann zu erheblicher Verwirrung führen, da Sie annehmen könnten, die von Ihnen vorgenommenen Programmänderungen hätten nichts bewirkt. Überprüfen Sie die verketteten Bibliotheken auf Namensgleichheiten von Membem und versuchen Sie, diesen Zustand nach Möglichkeit zu vermeiden.

67

JCL

DD

SYSOUT-Anweisungen

Der DD-Parameter SYSOUT dient dazu, Ausgaben auf das Spool-Volume zu schreiben. Diese Ausgaben können sofort gedruckt werden oder aber zunächst gehalten und angeschaut werden. Den Output auf SYSOUT umzuleiten, kann beim Testen Vorteile bringen, da man sich unter anderem das Vergeben eines DSN und damit alle Katalogprobleme erspart. Einige Parameter, wie VOL, DISP und LABEL, dürfen nicht eingesetzt werden, andere wie UNIT oder SPACE können zwar angegeben werden, sie werden aber ignoriert. Damit vereinfacht sich unser Beispiel-Job erheblich. Er braucht jetzt auch keinen vorgeschalteten IDCAMS-Step mehr. edit-uwin schulung. cn tl (pgm01)

01.15

.

-

command

.

columns 001 072 ===> page

scroll

===>

******

*****************************

000001 000002 000003 000004 000005

//uwin217g

job

// //

msgclass=y,

top of data

*****************************

(998,abtdg02),1m.winter1,class=a,not ify=uwin,

msglevel=(1,1)

//step1

exec pgm=pgm01

dd

000006 000007 000008 000009

//steplib //sysprint //sysabout //sysout //outfile

******

****************************

dsn=uwin.schulung.load,disp=shr

dd sys0ut=*

dd sys0ut=* dd sysout=* dd sys0ut=*

Sozusagen als Ausgleich gibt auf die hier eingegangen wird:

es

für

bottom of data

***************************

SYSOUT-Anweisungen einige

besondere Parameter,

Der DCB-Parameter

Auch für SYSOUT-Datasets kann der DCB-Parameter angegeben werden. Er muß angegeben werden, wenn im Anwendungsprogramm keinerlei Angaben zur LRECL und RECFM gemacht werden. Die BLKSIZE läßt man am besten vom System errechnen. Im Gegensatz zu Datasets auf Platte oder Band haben kleine BLKSIZEs keine negativen Auswirkungen auf Platznutzung und Performance.

SYSOUT-Output häufig gedruckt wird, findet sich folgende Angabe: DD SYSOUT=*,LRECL=13 3, //DRUCK RECFM=FBA,BLKSIZE=13 3 II

Da

RECFM=FBA bewirkt, daß das erste Byte als Drucksteuerzeichen

interpretiert wird.

68

MVS/ESA JCL

Der OUTLIM-Parameter

Syntax:

OUTLIM=nnnn Der OUTLIM-Parameter dient der Begrenzung des Outputs. Er findet vor allen Dingen in Testumgebungen Verwendung. Er kann nur zusammen mit dem SYSOUT-Parameter verwendet werden. Bei normalen Datasets kann er zwar angegeben werden, ist aber unwirksam. Als Wert für nnnn kann eine beliebige Zahl zwischen 1 und 16.777.215 verwendet werden.

Wird die angegebene Zahl überschritten, so kommt es zu einem S722 ABEND. Der OUTLIM-Parameter ist somit eine Art Notbremse für den Fall eines Loops. Mit ihm läßt sich das überflüssige Drucken von Seiten im Fehlerfall zumindest begrenzen. Der COPIES-Parameter

Syntax: COPIES=nnn Mit COPIES wird die Zahl der Kopien angegeben, die erzeugt werden sollen. Die Zahl kann zwischen 1 (Default) und 254 liegen. Der DEST-Parameter

Syntax (JES2): DEST=LOCAL DEST=name DEST=Nnnnn DEST=NnnRmmmm DEST=NnnnRmmm DEST=NnnnnRmm DEST=Rnnnn DEST=RMnnnn DEST=RMTnnnn

DEST=Unnnn_ Unter dem Job Entry

Subsystem 3 weicht die Syntax geringfügig ab. Mit LOCAL wird irgendein lokaler Drucker angesprochen. name kann nur genutzt werden, wenn in Ihrer Installation entsprechende Festlegungen getroffen worden sind.

69

JCL

Mit Nnnnn wird die Nummer eines Knotens angegeben. Dies ist dann erforderlich, wenn sich Rechenzentrum und Drucker an verschiedenen Orten befinden. Mit den Angaben NnnRmmmmm, NnnnRmmmm und NnnnnRmmm wird eine Kombination von Knoten und Datenfernverarbeitungsstation angegeben. Mit Rnnnn, RMnnnn oder RMTnnnn wird ein remote angeschlossenes Terminal

angesprochen. Mit Unnnn wird ein spezielles Routing angesprochen, das wird der Output an eine bestimmte Destination geleitet.

installationsabhängig

ist. Damit

Beispiel:

//SYSPRINT

DD

SYSOUT=A,DEST=U0302

In diesem Fall wird der SYSPRINT unmittelbar auf den Drucker mit der logischen Adresse U0302 gelegt. Zum Umleiten eines Druck verwenden.

Outputs können Sie auch das /*ROUTE

JES2-Kommando

Der SEGMENT-Parameter

Syntax:

SEGMENT=pages Mit der Version 4 von MVS/ESA wurde der SEGMENT-Parameter verfügbar. Er dient dazu, bei großem Output mit dem Drucken zu beginnen, obwohl der Job-Step noch nicht beendet ist.

Beispiel:

//SYSOUT

DD

SYSOUT=A,SEGMENT=100

Sind 100 Seiten erzeugt worden, so werden sie zum Druck freigegeben. Sind unter SYSOUT=A mehrere physische Drucker zusammen definiert, so kann es passieren, daß die unterschiedlichen Segmente auf unterschiedlichen Druckern

gedruckt werden.

Der SPIN-Parameter

Syntax:

SPIN=UNALLOC

70

MVS/ESA JCL

Durch die Angabe SPIN=UNALLOC ist es möglich, ein SYSOUT-Dataset bereits bei StepEnde zu deallokieren, wonach mit dem Drucken begonnen werden kann (Normalerweise ist dies bei SYSOUT-Datasets erst nach Job-Ende möglich). Wird SEGMENT und SPIN angegeben,

so

überschreibt SEGMENT SPIN.

Der FREE-Parameter

Syntax:

FREE=CLOSE Mit FREE=CLOSE wird ein Dataset schon beim CLOSE deallokiert, also noch vor dem Step-Ende. Damit kann noch etwas früher mit dem Drucken begonnen werden als bei der Angabe SPIN=UNALLOC.

Beispiel:

//SYSOUT

DD

SYSOUT=A,SPIN=UNALLOC,FREE=CLOSE

Die SYSIN DD-Anweisung Syntax: //SYSIN

DD

*

DD

DSN=datasetname,DISP=SHR

DD

DSN=datasetname(member),DISP=SHR

oder

//SYSIN oder

//SYSIN

Mit der SYSIN DD-Anweisung wird MVS angezeigt, daß nunmehr entweder Input-Daten unmittelbar folgen oder das angesprochene Dataset den Input enthält. Alle Utility-Programme haben eine SYSIN-Anweisung. MVS erkennt das Ende von SYSIN-Anweisungen daran, daß entweder das Delimiterzeichen /* vorkommt oder eine neue JCL-Anweisung mit // beginnt. Das folgende Beispiel zeigt einen typischen Fall. Im Step CHKCAT wird das Programm IDCAMS aufgerufen, das seine Steueranweisungen über die SYSIN DD * Anweisung erhält.

71

JCL EDIT-UWIN.SCHULUNG.CNTL(PGMOI)

01.15

.

-

COMMAND ******

===>

*****************************

fop OF DATA

COLUMNS 001 072 SCROLL ===> PAGE

*****************************

000001 //UWIN217G JOB (998,ABTDG02),1M.WINTER ,CLASS=A,NOTIFY=UWIN, 000002 // MSGCLASS=Y, EXEC PGM=IDCAMS 000003 //CHKCAT 000004 //SYSPRINT DD SYSOUT=* DD * 000005 //SYSIN DELETE (UWIN.SCHULUNG.DS99) 000006 IF MAXCC = 8 THEN SET MAXCC = 0 000007 1

000008 /* _

_

Umgebungen, die den Einsatz von SYSIN DD * nicht zulassen, z.B. bei Prozeduren müssen die SYSIN-Daten in ein Dataset gestellt werden. Am besten eignet sich dazu ein Member einer Bibliothek. Das folgende Beispiel ist eine Alternative zum vorherigen In

-

-

Beispiel.

EDIT -UWIN.SCHULUNG.CNTL(PGM01) COMMAND ===>

01.15 .COLUMNS 001 072 -

SCROLL

******

*****************************

000001 000002 000003 000004 000005 000006 000007

//UWIN217G JOB (998,ABTDG02),'M.WINTER1,CLASS=A,NOTIFY=UWIN, MSGCLASS=Y, //

******

****************************

// //

//*

TOP OF DATA

===>

PAGE

*****************************

TIME=(,10), MSGLEVEL=(1,1) MSGLEVEL=(1,1),TYPRUN=SCAN

EXEC PGM=IDCAMS //CHKCAT DD SYSOUT=* //SYSPRINT DD DSN=UWIN.SCHULUNG.DATA(DELDS99),DISP=SHR 000008 //SYSIN

BOTTOM OF DATA

***************************

Das Member DELDS99 der Bibliothek UWIN.SCHULUNG.DATA muß aussehen: EDIT-UWIN.SCHULUNG.DATA(DELDS99)

01.15 -

COMMAND ******

*****************************

DELETE (UWIN.SCHULUNG.DS99) 000001 IF MAXCC = 8 THEN SET MAXCC 000002 000003 /* ******

.

===>

****************************

TOP OF DATA =

folgendermaßen

COLUMNS 001 072 SCROLL ===> PAGE

*****************************

0

BOTTOM OF DATA

***************************

Eine Alternative zu dieser Methode bietet die SYSIN DD DDNAME-Anweisung. Sie verschiebt die inhaltliche Definition eines Feldes auf einen späteren Zeitpunkt im Job. Im Kapitel über Prozeduren ist diese Technik erläutert. Das Ende von SYSIN-Daten wird entweder am Zeichen /* oder an der nächsten folgenden JCL-Anweisung erkannt. Für den Fall, daß die SYSIN-Daten JCL-Anweisungen enthalten,

MVS/ESA JCL

72

muß verhindert werden, daß das Lesen der SYSIN-Daten vorzeitig beendet wird. Dies wird durch die Benutzung von SYSIN DD DATA anstelle von SYSIN DD * erreicht: edit-uwin.schulung.cntl(pgm01)

01.15 -

command

.

===>

columns 001 072 scroll ===> page

******

*****************************

000001 000002 000003 000004 000005 000006 000007 000008 000009 000010 000011 000012 000013 000014 000015 000016

//uwin217g job (998,abtdg02),'m.winter1,class=a,not ify=uwin, // msgclass=y, // //

//* //copy //sysprint //sysin //uwin217g // // //

//* //br14 /* //ende

top of data

*****************************

t1me=(,10), msglevel=(1,1) msglevel=(1,1),typrun=scan exec proc=test1 dd sysout=* dd data job

(998,abtdg02),1m.winter 1,class=a,not ify=uwin,

msgclass=y,

time=(,10), msglevel=(1,1) msglevel=(1,1),typrun=scan exec pgm=iefbr14 exec

proc=abschl_

Während sonst das Zeichen /* nicht unbedingt stehen muß, ist es bei der Verwendung von SYSIN DD DATA unbedingt erforderlich. Wird es weggelassen, werden auch die folgenden JCL-Anweisungen als Teil der SYSIN-Daten gelesen. Wenn auch das Zeichen /* Teil der SYSIN-Daten sein soll, so muß ein anderes Delimiterzeichen definiert werden. Dies geschieht mit dem DLM-Parameter und sieht dann

folgendermaßen aus:

73

JCL 01.15

EDIT-UWIN. SCHULUNG .CN TL (PGM01)

.

-

COMMAND ******

COLUMNS 001 072 ===> PAGE

SCROLL

===>

*****************************

top OF DATA

*****************************

000001 //UWIN217G (998,ABTDG02),'M.WINTER',CLASS=A,NOTIFY=UWIN, 000002 // MSGCLASS=Y, 000003 // TIME=(,10), 000004 // MSGLEVEL=(1,1) 000005 //* MSGLEVEL=(1,1),TYPRUN=SCAN 000006 //COPY EXEC PGM=JOBGEN DD SYSOUT=* 000007 //SYSPRINT DD 000008 //SYSIN DATA,DLM=$$ 000009 //UWIN217G JOB (998,ABTDG02),'M.WINTER1,CLASS=A,NOT IFY=UWIN, MSGCLASS=Y 000010 // EXEC PGM=IDCAMS 000011 //CHKCAT 000012 //SYSPRINT DD SYSOUT=* DD * 000013 //SYSIN DELETE (UWIN.SCHULUNG.DS99) 000014 8 THEN SET MAXCC = 0 IF MAXCC 000015 000016 /* EXEC PGM=IEFBR14 000017 //BR14 DD 000018 //OUTFILE DSN=UWIN.SCHULUNG.DS99, 000019 // DISP=(NEW,CATLG), 000020 // RECFM=FB,LRECL=80, 000021 // SPACE=(TRK,(5,1),RLSE), 000022 // UNIT=DSKPRM 000023 $$ 000024 //ENDE EXEC PROC=ABSCHL JOB

=

Die Zeilen 000009 bis 000022 werden als Daten Anweisungen bestehen.

interpretiert,

obwohl diese

aus

JCL-

Output Management Fast alle MVS Installationen haben heutzutage ein Output Management System installiert, das ähnlich dem hier vorgestellten ist. Es handelt sich dabei um die Input-Output-Facility. Nachfolgend ist das eigentliche Job List Menü abgebildet. Es zeigt immer zumindest einen RUNNING JOB, das ist der eigene User, den MVS als Job verwaltet. Sofern weitere Jobs gerade am Laufen sind, würden sie ebenfalls hier angezeigt. Fertige Jobs werden unter OUTPUT JOBS angezeigt.

Um die Jobs anzuschauen, gibt es zwei Möglichkeiten: 1. Eingabe der Jobnummer in der Kommandozeile.

2.

In die

Eingabezeile vor der Jobnummer springen und dort ein s eingeben.

MVS/ESA JCL

74 Im

folgenden Panel sind beide Möglichkeiten eingetragen.

---.---.

IOF JOB LIST MENU .

COMMAND

===>

2

SCROLL

---.-.

RUNNING JOBS

SCREEN

===>

--.

.JOBNAME--JOBID- -ACT-HELD--SYSID.CPU-I/O-STEP.PROCSTEP-SWP IN S21 :01 2.47 ISPF#AS T2731 1 UUIN OUTPUT JOBS ---.

.

.JOBNAME--JOBID--ACT-HELD-DEST.GRPS--RECORDS-BUSY DEVICE--HELDDS-2 UWIN217G

S.

J2746_FRA21_4

Summary Die wichtigsten Informationen im IOF JOB SUMMARY befinden sich in den MESSAGES und in SYSPRINT, sofern dieser nicht leer ist. Schauen Sie immer in die Messages, auch Das Job

bei Return Code 0. Ist SYSPRINT nicht leer, verlassen Sie sich auf die dort abgelegten Informationen. Die Meldungen in MESSAGES können unter Umständen denen widersprechen, die in SYSPRINT stehen. In diesem Fall ignorieren Sie die MESSAGES. =

Im IOF JOB SUMMARY finden Sie unter den DD-Namen alle die wieder, denen JCL SYSOUT=* zugeordnet haben. Unter der Rubrik RECORDS steht die ausgegebenen Records. Bei einigen DD-Namen stehen keine Records. Dies ungewöhnlich, da z.B. unter dem DD-Namen SYSABOUT nur im Falle eines

Angaben stehen würden. Sollte ein Step wegen eines gesetzten

COND-Parameters nicht

anstelle des RC ein *.

IOF JOB SUMMARY COMMAND ===> JOBNAME JOB ID- STATUS --RAN/RECEIVED-DAY--UWIN217G J05683 OUTPUT 10:43 6/13/91 TODAY --RC--STEP-PROCSTEP- PROC-.COMMENTS. 0 CHKCAT -

-

-

0

-

-

-

Sie in der Zahl der ist nicht ABENDs

gelaufen sein,

so

steht

SCROLL ===> SCREEN -DEST.--COPIES. FRA21 1

STEP1

.DDNAME

1 2 3 4 5

LOG

STEP.STAT-ACT-GRP-CLS--RECORDS--DEST9 HELD 14

*

JCL

*

HELD

9

15

MESSAGES

*

HELD SEL

9

SYSPRINT CHKCAT

HELD

9

57 9

SYSPRINT STEP1

DONE

9

SYSABOUT STEP1 SYSOUT STEP1

DONE

9 9

DONE

FORMS-

-COPIES

75

JCL

RC

Hier wird der Return Code für jeden im Job

ausgeführten

Step angezeigt. STEP

Name der

Steps hier CHKCAT und STEP1.

PROCSTEP

Name des

PROC

Name der

LOG

Hier befindet sich die Jobstatistik

Steps in einer Prozedur (ist Prozedur aufgerufen wurde).

leer weil keine

aufgerufenen Prozedur (s.o.). (meist

von nur

ge-

ringem Interesse). JCL

Hier wird die verwendete JCL angezeigt. Dies ist besonders wichtig, wenn in der JCL symbolische Parameter stehen, die zur Laufzeit substituiert werden (häufig bei

Prozeduren). MESSAGES

Hier werden die wichtig, aber auch

System-Messages abgestellt (sehr unzuverlässig, falls ein SYSPRJNT

erzeugt wird). SYSPRINT

Hier werden Meldungen von Utilities

SYSABOUT

Hier werden

SYSOUT

Hier werden

abgestellt.

abgestellt.

Kurzdumps abgestellt.

Displays,

z.B. eines

COBOL-Programms,

MVS/ESA JCL

76 Das Job LOG browse command

*

log

--

page

1-- cols

line

1 -

-

-

scroll

===>

*******************************

jes2

top of data

job

job 5683 job 5683 job 5683 job 5683 job 5683

1 80 screen

***********************************

system

log

nod

s21 --

--

10.43.56 10.43.56 10.43.57 10.43.59 10.43.59

===>

ich70001i uuin last access at 10:42:17 on thursday, june class c sys s21 init 3 $hasp373 uwin217g started 1 104356 104357 .07 s000 uwin217g chkcat .05 sooo 1 104357 104359 uuin217g step1 shasp395 uwin217g ended -

-

-

jes2 job statistics

13 jun 91 job execution date 17 cards read 95 sysout print records 0 sysout punch records 5 SYSOUT SPOOL KBYTES 0.05 minutes execution time bottom of data

*******************************

Dem oben 1. 2.

********************************

abgebildeten JOB LOG können folgende Informationen entnommen werden:

Anfangs- und Endezeit Laufzeit (nicht CPU-Zeit)

3. Der verwendete Initiator 4. Job-Klasse 5. Nummer des Initiators 6. CPU-Zeit 7. Zahl der Ein- und

Ausgabe-Records

Die Abkürzung $HASP steht für Houston Automatic Spooling Program. Es wurde eigens für die NASA in den sechziger Jahren entwickelt. Es ist der Vorläufer des heutigen JES2.

77

JCL Die JCL

Hier ist die im Job benutzte JCL abgebildet. Sie unterscheidet sich nicht von der JCL, wie sie im Member der CNTL Bibliothek steht, da es keine symbolischen Parameter gab, die hätten aufgelöst werden können. BROWSE

*

JCL

COMMAND

1-- LINE

PAGE

SCROLL

===>

********************************

1 //UWIN217G JOB

2 3

4 5 6 7 8 9 10

1-- COLS

1

80

--

-

// // //CHKCAT //SYSPRINT //SYSIN //STEP1 //STEPLIB //SYSPRINT //SYSABOUT //SYSOUT //OUTFILE // // //

tqp op DATA

===>

SCREEN

**********************************

(998.ABTDG02),'M.WINTER1,CLASS=A, NOTIFY=UWIN,MSGCLASS=Y

TIME=(,10),MSGLEVEL=(1,1),USER=UWIN EXEC PGM=IDCAMS DD SYS0UT=*

DD

*

EXEC PGM=PGM01 DD DSN=UWIN.SCHULUNG.LOAD,DISP=SHR DD SYSOUT=* DD SYS0UT=* DD SYSOUT=*

DD

DSN=UWIN.SCHULUNG.DS99.DISP=(,CATLG), RECFM=FB,

SPACE=(TRK,(5,1),RLSE), UNI T=DSKPRM

*******************************

BOTTOM OF DATA

********************************

Sollten Sie JCL-Fehler bei der Syntax-Prüfung erhalten haben, so sind die fehlerhaften Anweisungen numeriert. Die Numerierung entspricht der obigen Anzeige. Beachten Sie, daß unter Umständen der Fehler in der vorhergehenden oder folgenden JCL-Anweisung stecken kann. Die unter SYSIN gemachten Angaben können Sie hier nicht sehen. Sie finden sich unter dem SYSPRINT des Steps CHKCAT wieder. Die

Messages Die Messages geben wichtige Hinweise darauf, wie es Messages für jeden Step und einmal für den Job. Die Step Messages bestehen aus:

ein Job

gelaufen

ist. Grob gesagt

Allokationsmeldungen Step-Ende-Meldung mit Return-Code des Steps 3. Deallokationsmeldungen 4. Statistikmeldungen Im folgenden Beispiel wird zunächst auf die Messages für STEP1 Bezug genommen. 1.

2.

gibt

MVS/ESA JCL

78

IEF236I 1EF237I IEF237I IEF237I IEF237I IEF237I IEF142I IEF285I IEF285I IEF285I IEF285I IEF285I IEF285I IEF285I

ALLOC. FOR UWIN217G STEP1 6F0 ALLOCATED TO STEPLIB JES2 ALLOCATED TO SYSPRINT JES2 ALLOCATED TO SYSABOUT JES2 ALLOCATED TO SYSOUT 827 ALLOCATED TO OUTFILE STEP WAS EXECUTED

UWIN217G STEP1 -

-

UWIN.SCHULUNG.LOAD

COND CODE 0000 KEPT

VOL SER NOS= PRM013.

JES2.JOB05683.SO000103 JES2.JOB05683.SO000104 JES2.JOB05683.SO000105 UWIN.SCHULUNG.DS99 VOL SER NOS= PRM004.

SYSOUT SYSOUT SYSOUT CATALOGED

Jede Message beginnt mit einer Message Codes nachgesehen werden kann. So sind

Identification, die

im Handbuch:

IEF237I

6F0 ALLOCATED TO STEPLIB

IEF23 7I

82 7 ALLOCATED TO OUTFILE

Messages and

aus, daß das Dataset unter dem DD-Namen STEPLIB auf der physischen Adresse 6F0 (die UNIT-Adresse) gefunden wurde und für den Step zur Verfügung steht. Für das unter OUTFILE angesprochene Dataset wurde die UNIT mit der physischen Bezeichnung 827 (ebenfalls eine Platte) allokiert.

sogenannte Allokationsmeldungen. Sie sagen

Auf die Allokationsmeldungen folgt die mit einem Return Code von 0 endete.

Sie sagt aus, daß der

Stepl

STEP WAS EXECUTED COND CODE 0000 Auf die Step-Ende-Meldung folgen die Deallokationsmeldungen. Hier wird die Disposition wirksam, die Sie in Ihrer JCL angegeben haben. Da die Bibliothek UWIN.SCHULUNG.LOAD mit DISP=SHR angesprochen wurde und diese Disposition auf DISP=(SHR,KEEP,KEEP) ergänzt wird, ist die folgende Deallokationsmeldung verständlich. Sie sagt aus, daß das Dataset behalten wurde und auf der Platte mit der Bezeichnung PRM013 steht. IEF142I

UWIN217G

Step-Ende-Meldung.

STEP1

-

-

IEF285I

UWIN.SCHULUNG.LOAD

IEF285I

VOL SER NOS= PRM013.

KEPT

Deallokationsmeldung für das Dataset UWIN.SCHULUNG.DS99 lautet anders. Die in JCL-angegebene DISP=(,CATLG) wurde in DISP=(NEW,CATLG,CATLG) umgesetzt. Da das Katalogisieren erfolgreich war, wird dies entsprechend gemeldet: Die der

JCL_79 UWIN.SCHULUNG.DS99

IEF285I IEF2 85I

CATALOGED

VOL SER NOS= PRM004

Die Meldung sagt aus, daß das Dataset UWIN.SCHULUNG.DS99 auf dem Volume PRM004 angelegt wurde.

katalogisiert wurde und

Alle DD-Namen, die sich auf das Spool-Volume beziehen, werden JES2 zugeordnet. Sie werden auf SYSOUT gelegt. Dabei wird die MSGCLASS wirksam, die darüber entscheidet, ob der Output gleich gedruckt oder behalten wird. Die Statistiken bestehen aus zwei Teilen: Step-Statistik (für jeden Step) und Job-Statistik (1 mal). Achten sollte man besonders auf die verbrauchte CPU-Zeit. / START 91164.1043 / STOP 91164.1043 CPU

IEF373I STEP /STEP1 IEF374I STEP /STEP1

OMIN 00.05SEC SRB

OMIN 00.OOS

*********************************************** *.

.*

STEP STATISTICS

*************************************************** *

JOBNAME

*

*

CPU

STEPNAME END TIME

*

ELAPSED TIME

UWIN217G 10:43:57 1

*

STORAGE USED

392K

*

STORAGE REO

0

*

PAGES OUT

*

START TIME

*

STEP1 10:43:59 .05 OK 0

TIME -

*

PAGES IN

*

* * * *

***************************************************

6F0= IEF375I IEF376I

2

0

000=

000=

0

000=

/UWIN217G/ START 91164.1043 JOB /UWIN217G/ STOP 91164.1043 CPU

0

827=

3

JOB

OMIN 00.12SEC SRB

OMIN 00.OOS

*************************************************** *

LH-RECHENZENTRUM

*

FRAAD2

*************************************************** *

JOBNAME

*

START TIME

*

ELAPSED TIME

UWIN217G 10:43:56 3

*

DATE

*

END

TIME

*

CPU

TIME

06/13/91

*

10:43:59 .12

* *

-

*************************************************** *******************************

Es wurde bereits gesagt, daß die MESSAGES haben. Dies wird am

bottom OF DATA

********************************

Meldungen unter SYSPRJNT Vorrang Beispiel des Steps CHKCAT illustriert:

vor

denen unter

MVS/ESA JCL

80

chkcat

sysprint

browse

scroll

===>

********************************

idcams

1— cols

1-- line

page

1

80

--

-

command

===>

screen

**********************************

top of data

time: 10:43:56

system services

(uwin.schulung.ds99)

delete

idc0550i entry (a) uwin.schulung.ds99 deleted idc0001i function completed, highest condition code was 0

if maxcc

8 then set maxcc

=

=

0

idc0002i idcams processing complete. maximum condition code was 0 rottom of data ********************************

*******************************

um den SYSPRTNT des Programms. Aus ihm UWm.SCHULUNG.DS99 gelöscht wurde. Dies bedeutet: 1. Der Eintrag im User-Katalog wurde gelöscht und

Es handelt sich

geht hervor, daß der Eintrag

2. der Eintrag im VTOC der Platte wurde

Betrachtet

man

die

gewinnen: browse command

-

gelöscht. zugehörigen Messages, so könnte *

messages

--

page

man

einen ganz anderen Eindruck 1-- cols

1-- line

scroll

===>

********************************

1 80 screen

**********************************

top of data

ief285i

kept

uwin.schulung.ds99 vol ser nos= prm021. ief285i ief142i uwin217g chkcat step was executed -

===>

cond code 0000 -

Hier steht, daß das Dataset UWIN.SCHULUNG.DS99 behalten wird. Dies ist jedoch effektiv falsch. Wenn die Meldungen unter Messages und SYSPRINT einander widersprechen, so verlassen Sie sich auf die SYSPRINT-Meldungen.

Gefahren

von

Return Code

=

0

Endet ein Step mit dem Return Code 0, so denkt man, daß alles in Ordnung ist. In der Regel ist dem auch so, aber nicht unbedingt. Folgender Job wird zweimal hintereinander abgeschickt. Beachten Sie, daß dieser Job keinen Step CHKCAT hat, also der Katalog bei Job-Beginn nicht überprüft wird.

81

JCL edit-uwin schulung. cn tl (pgh01) command ===>

01.16

.

---.

scroll

*****************************

000001 000002 000003 000004 000005 000006 000007

//uwin217g

job

//

msgclass=y

//step1

exec pgm=pgm01

//steplib //outfile // //

dd

dsn=uwin.schulung.load,disp=shr

dd

dsn=uwin.schulung.ds99,disp=(,catlg),

Was

===>

page

*****************************

******

******

columns 001 072

-

top of data

(998,abtdg02),1m.winter1,class=a,notify=uwin,

recfm=fb,

unit=dskprm,space=(trk,(5,1),rlse)

****************************

bottom of data

***************************

folgt, ist der Output des zuletzt abgeschickten Jobs. Der Return Code von STEP1

.

ist 0!

iof job summary -

command

scroll ===> screen -dest.copies.

===>

--jobname---jobid--status---ran/received-day-10:49 6/13/91 today uwin217g j05711 output

fra21

1

-rc- -step.procstep- -proc.comments. -

0 step1 .ddname-step-stat-act-grp-cls * log HELD * jcl HELD messages * HELD SEL sysprint step1 DONE sysabout step1 DONE sysout DONE step1

Schaut man jedoch in die

RECORDS--DEST-

•forms-

COPIES -

13 12 36

Messages, so erlebt man eine Überraschung:

MVS/ESA JCL

82

*

MESSAGES

BROWSE

--

1-- LINE

PAGE

1-- COLS

1

80

-

COMMAND

SCROLL

===>

********************************

top OF DATA

===>

SCREEN

**********************************

ICH700011 UWIN LAST ACCESS AT 10:43:55 ON THURSDAY, JUNE 13, 1991 IEF236I ALLOC. FOR UWIN217G STEP1 IEF237I 6F0 ALLOCATED TO STEPLIB IEF237I JES2 ALLOCATED TO SYSPRINT IEF237I JES2 ALLOCATED TO SYSABOUT IEF237I JES2 ALLOCATED TO SYSOUT IEF237I 833 ALLOCATED TO OUTFILE COND CODE 0000 STEP WAS EXECUTED IEF142I UWIN217G STEP1 UWIN.SCHULUNG.LOAD KEPT IEF285I VOL SER NOS= PRM013. IEF285I SYSOUT JES2.JOB05711 .SO000101 IEF285I SYSOUT JES2.JOB05711.SO000102 IEF285I SYSOUT IEF285I JES2.JOB05711 .SO000103 NOT CATLGD 2 IEF287I UWIN.SCHULUNG.DS99 VOL SER NOS= PRM024. IEF287I IEF373I STEP /STEP1 / START 91164.1049 OMIN 00.05SEC SRB IEF374I STEP /STEP1 OMIN 00.OOS / STOP 91164.1049 CPU -

-

Deallokationsmeldung für UWIN.SCHULUNG.DS99 sagt aus, daß das Dataset nicht katalogisiert wurde. Es exisitiert daher nach wie vor der alte Katalogeintrag, der auf das Volume PRM004 verweist. In der obigen Meldung ist allerdings auch vom Volume Die

PRM024 die Rede.

passiert? Existiert der DSN im Katalog nicht und läuft der Job ohne CHKCAT, passiert beim ersten Mal nichts Besonderes. MVS wählt ein passendes Volume der Gruppe DSKPRM aus. Der DSN wird beim Beginn des Steps (Allokation) im VTOC dieses Volumes (PRM004) eingetragen, beim Step-Ende (Deallokation) erfolgt der Eintrag im Was ist nun

so

Katalog mit Verweis auf das Volume PRM004. Beim zweiten Joblauf sucht MVS wieder ein passendes Volume der Gruppe DSKPRM. Die Wahrscheinlichkeit, daß wieder PRM004 genommen wird, ist sehr gering. In diesem Fall

wählt MVS das Volume PRM024 aus und trägt den DSN im VTOC der Platte ein. Beim Step-Ende versucht MVS, das Dataset zu katalogisieren. Dabei kommt es zu einem Fehler, da der DSN bereits im Katalog eingetragen ist. Daher die Meldung NOT CATLGD 2. Im Return Code schlägt sich das allerdings nicht nieder. Was hier passiert ist, ist Code 16 verdient hätte. Wenn

die MESSAGES nicht überprüft, dann fällt dieser Fehler nicht auf. Die Folge Zugriff auf falsche Daten, der zu Anfang aller Wahrscheinlichkeit nach unbemerkt

man

wäre der

bliebe.

streng genommen ein katastrophaler Fehler, der den Return

Außerdem wurde ein Dataset angelegt, das so ohne weiteres nicht mehr auffindbar ist, denn für das auf dem Volume PRM024 angelegte Dataset gibt es keinen Hinweis im Katalog. Nur mit Hilfe der Volume-Nummer läßt sich dieses Dataset überhaupt noch ansprechen.

83

JCL

Sofern in Ihrer Installation File-AID installiert ist, können Sie mit Hilfe der Option F.3.7. (VTOC) die VTOCs durchsuchen lassen und die nicht katalogisierten Datasets wieder entfernen. Job-Management-Systeme wie BETA92 weisen einen NOT CATLGD 2 zwar im Job Summary aus, fahren aber u.U. mit der Verarbeitung fort. Sofern bei Ihnen SMS aktiv ist, kann es zu dem oben beschriebenen Problem nicht kommen. Der zweite Job würde bereits in der Allokationsphase abbrechen, da SMS bereits in dieser Phase versucht, zu katalogisieren. Kommt es dabei zu einem Fehler, weil das Dataset schon existiert, bricht der Job mit einem JCL Error ab.

2.4

Die DD-Anweisung für Datasets auf Bändern oder Kassetten

Bisher haben wir nur Datasets betrachtet, die auf einer Platteneinheit residieren. Die Verarbeitung von Bändern oder Kassetten hat jedoch einige Besonderheiten. Während sich beim Lesen von Datasets, die auf Band oder Kassette stehen, nur wenig ändert, kommt es beim Anlegen darauf an, welche Technik Sie verwenden. Es können dann eine ganze Reihe zusätzlicher Parameter erforderlich werden. Beachten Sie bitte, daß, wie bereits erwähnt, in den folgenden Abschnitten die Begriffe Band und Kassette synonym verwendet werden. Was die JCL angeht, so unterscheidet sie sich nicht, was Bänder und Kassetten betrifft.

Ansprechen von Datasets auf Band oder Kassette Beim

Ansprechen eines Datasets, das auf Band gespeichert ist, gelten im Prinzip die gleichen Regeln wie bei solchen, die auf Platte residieren, d.h. ist das Dataset katalogisiert, so genügt die Angabe des DSN- und des DISP-Parameters.

//EINGABE

DD DSN=TJWIN.

CASSDAT1, DISP=OLD

Bei Band- bzw Kassettendatasets können Sie bedenkenlos DISP=OLD angeben, da dieser Datenträger ohnehin nicht gleichzeitig von anderen Usern angesprochen werden kann. Alle notwendigen Informationen wie UNIT (TAPE oder CASS), Nummer der Kassette sowie Position des Dataset auf der Kassette werden dem Katalogeintrag entnommen. Wenn Sie in einem Step mehrere Datasets, die auf Band oder Kassette liegen, ansprechen, so versucht MVS, Ihnen so viele Lese-Schreibstationen zur Verfügung zu stellen, wie sie Datasets allokieren.

//EINGABE1 //EINGABE2 //EINGABE3 //EINGABE4

DSN=UWIN.CASSDATl,DISP=OLD DSN=UWIN.CASSDAT2,DISP=OLD DD DSN=UWIN.CASSDAT3,DISP=OLD DD DSN=UWIN.CASSDAT4,DISP=OLD DD DD

MVS/ESA JCL

84

Für jeden DD-Namen, der auf ein auf Band oder Kassette liegendes Dataset verweist, wird pro Step eine Lese-Schreibstation benötigt und allokiert. Im obigen Beispiel wären dies 4. Die Zahl der zur Verfügung stehenden Lese-Schreibstationen ist jedoch begrenzt. Unter

Umständen kann es daher schon bei der Allokation zu Problemen kommen. Wenn mehr als ein Band- bzw. Kassettendataset pro Step verarbeitet werden soll, sollte man immer von der Möglichkeit Gebrauch machen, die Zahl der zu allokierenden Lese-Schreibstationen so gering wie möglich zu halten. Dies können Sie mit dem Parameter UNIT=AFF=ddname

tun.

Der Parameter UNIT=AFF

Syntax:

UNIT=AFF=ddname Wenn in einem

Step

Bänder nacheinander

gelesen werden,

so

läßt sich die Zahl der Lese-

Schreibstationen, die allokiert werden, durch die Benutzung des AFF-Subparameters

vermindern. Mit UNIT=AFF=ddname wird auf eine andere DD-Anweisung im gleichen Step verwiesen. Dadurch wird bewirkt, daß die gleiche Lese-Schreibstation mehrmals hintereinander verwendet wird. Ein Beispiel soll dies illustrieren:

//EINGABE1 //EINGABE2 // //EINGABE3 // //EINGABE4 //

DD DD

DSN=UWIN.CASSDAT1,DISP=OLD DSN=UWIN.CASSDAT2,DISP=OLD,

UNIT=AFF=EINGABE1 DD DSN=UWIN.CASSDAT3,DISP=OLD, UNIT=AFF=EINGABE1 DD DSN=UWIN.CASSDAT4,DISP=OLD,

UNIT=AFF=EINGABE1

Im Gegensatz zum ersten Beispiel wird jetzt nur eine Lese-Schreibstation belegt. Funktionieren wird das Ganze aber nur, wenn das Anwendungsprogramm das unter EINGABE 1 angesprochene Dataset schließt, bevor das unter EINGABE2 angesprochene Dataset geöffnet wird. Das Problem mit der Belegung vieler Lese-Schreibstationen tritt auch dann auf, wenn mehrere physische Datasets verkettet werden:

//EINGABE1 // // //

DD DD

DD DD

DSN=UWIN.CASSDAT1,DISP=OLD DSN=UWIN.CASSDAT2,DISP=OLD DSN=UWIN.CASSDAT3,DISP=OLD DSN=UWIN.CASSDAT4,DISP=OLD

JCL

85

Auch in diesem Fall werden 4 Lese-Schreibstationen angefordert. Die Lösung des Problems

geschieht analog zum ersten Beispiel:

//EINGABE1 // // // // // //

DD DD

DSN=UWIN.CASSDAT1,DISP=OLD DSN=TJWIN.CASSDAT2,DISP=0LD,

UNIT=AFF=EINGABE1 DD

DSN=UWIN.CASSDAT3,DISP=OLD,

UNIT=AFF=EINGABE1 DD

DSN=UWIN.CASSDAT4,DISP=OLD,

UNIT=AFF=EINGABE1

Bei einer Verkettung kann es nicht zu dem oben beschriebenen OPEN/CLOSE Problem kommen. Gleiches gilt bei der Benutzung eines IDCAMS REPRO.

Schreiben

von

Datasets auf Band oder Kassette

Wenn Sie Datasets auf Band oder Kassette anlegen wollen, haben Sie die Wahl zwischen drei grundsätzlichen Möglichkeiten: 1. Ein Dataset auf ein Band/eine Kassette schreiben.

Dies ist die am häufigsten genutzte Form der Speicherung. Da aber die Datasets, die auf Band gespeichert werden, meist klein sind (gemessen an der Speicherkapazität eines Bandes bzw. einer Kassette) und nur einen Bruchteil des Bandes einnehmen, kann dies zu einer Verschwendung von Bändern fuhren. Der Vorteil

ist, daß diese Datasets später mit DISP=MOD erweitert werden können.

2. Viele Datasets auf ein Band/eine Kassette schreiben.

Diese Technik wird auch Multi-File-Technik genannt. Dies ist eine effektive Form der Speicherung, weil sie die vorhandenen Ressourcen optimal nutzt. Probleme beim Ansprechen der Datasets entstehen dann nicht, wenn jedes auf dem Band befindliche Dataset katalogisiert wird. Diese Form der Speicherung empfiehlt sich besonders für Sicherungen. Bedenken Sie jedoch, daß Ihre Datasets ohnehin vom HSM gesichert werden. Nachteil dieser Technik: Die mehr verändert werden.

so

geschriebenen

Datasets können in ihrer Größe nicht

3. Ein Dataset auf viele Bänder/Kassetten schreiben.

Sehr große Datasets können unter Umständen mehrere Bänder benötigen. In diesem Fall

erzeugt MVS ein 'Multi-Volume Dataset' (MVD). Sofern nicht mehr als fünf Bänder

benötigt werden, überschritten,

erfolgen.

so

sind keine besonderen muß eine Angabe der

Angaben erforderlich. Wird diese geschätzten Anzahl der benötigten

Grenze Bänder

86

MVS/ESA JCL

Ein Dataset auf Band oder Kassette schreiben Wenn ein Dataset auf Band/Kassette geschrieben werden soll, so ist dies syntaktisch am leichtesten. Sie brauchen nur mit dem UNIT-Parameter mitteilen, daß Sie auf Band/Kassette schreiben wollen und Sie müssen eine Schutzfrist angeben.

gesehen

In den meisten MVS-Installationen sind die und UNIT=TAPE für Bänder generiert.

Gruppennamen

UNIT=CASS für Kassetten

EXPDT

Syntax:

EXPDT=yyddd

oder yyyy/ddd

Wenn Sie Datasets auf Band- bzw. Kassetten schreiben wollen, so wird Ihnen dazu eine Kassette aus einem Pool freier oder leerer Kassetten zur Verfügung gestellt. Diese Kassetten heißen Scratch-Kassetten. Es handelt sich dabei entweder um ganz neue Kassetten, die frisch initialisiert wurden, oder um Kassetten, deren Schutzfrist abgelaufen ist und die daher wieder zur allgemeinen Verfügung stehen. Um nun zu verhindern, daß Ihr Dataset vorzeitig überschrieben wird, müssen Sie eine Schutzfrist angeben. Sie können dabei ein bestimmtes Datum angeben oder den Schutz der Kassette an den Katalogeintrag der auf der Kassetten befindlichen Datasets koppeln. Beides geht mit dem EXPDT-Parameter. Bei der Benutzung des EXPDT-Parameters erfolgt die Angabe eines Auslaufdatums in der Form: yyddd oder yyyy/ddd. Soll die Kassette nicht vor dem 31.12.1992 überschrieben werden, so ist

//

EXPDT=92365

anzugeben. Für die Zeit ab dem Jahr 2000 ist die Angaben in folgender Form erfolgen:

//

Syntax bereits erweitert

EXPDT=200l/365

Wenn Sie den Schutz der Kassette an den mit einer besonderen Wertzuweisung:

//

worden. Es können dann

Katalogeintrag koppeln wollen,

so

geschieht dies

EXPDT=99000

Die Kassette ist dann

entkatalogisieren.

solange geschützt,

Wird weder EXPDT oder RETPD

Tag überschrieben werden.

bis Sie die darauf befindlichen Datasets

angegeben,

so

kann die Kassette bereits

am

folgenden

87

JCL Eine besondere

Bedeutung hat auch

die

Wertzuweisung EXPDT=98000. Sofern eine Tape

Management Utility installiert ist, bewirkt diese Angabe, daß dort keine Einträge gemacht werden. Dies hat Bedeutung im Zusammenhang mit Exportbändern. In

vorhandener

JCL

LABEL=EXPDT=yyddd.

finden Sie womöglich Sie ist gleichwertig.

noch

die

alte

Syntaxvariante

RETPD

Syntax:

RETPD=nnnn Im Gegensatz zu EXPDT, das ein Datum angibt, wird mit RETPD ein Zeitraum während dem die Kassette nicht überschrieben werden darf. Soll eine Kassette nicht vor Ablauf von 30 Tagen überschrieben werden, so ist:

//

angegeben,

RETPD=30

anzugeben. Eine Möglichkeit RETPD nicht.

der

Kopplung

mit dem

Katalogeintrag

In vorhandener JCL finden Sie womöglich LABEL=RETPD=nnnn. Sie ist gleichwertig.

noch

wie bei EXPDT die

alte

gibt

es

bei

Syntaxvariante

Beispiel für ein Anlegen eines Datasets auf einer Kassette Das folgende Beispiel zeigt ein Anlegen eines Datasets auf einer Kassette. Wie Sie sehen, unterscheidet sich die JCL nur geringfügig von der, die Sie beim Anlegen von Datasets auf Platte verwenden. Bei UNIT muß ein anderer Gruppenname angegeben werden, der Parameter SPACE fällt ganz weg, dafür müssen Sie einen der Parameter EXPDT oder RETPD verwenden.

Wenn Sie verfahren, wie hier gezeigt, dann sollten Sie sicherstellen, daß der Platz, den die Kassette bietet, gut ausgenutzt wird. Es macht keinen Sinn, ein Dataset mit 5 MB auf eine Kassette mit 250 MB Speicherkapazität zu speichern.

MVS/ESA JCL

88

edit-uwin.schulung.cntl(pgmoi)

01.16 -

command

.

===>

******

*****************************

000001 000002 000003 000004

//uwin217g

job

// // //

msgclass=y, time=(,10),

000005 000006 000007 000008 000009 000010 000011 000012 000013 000014

//* //step1

******

****************************

//steplib //sysprint //sysabout //sysout //outfile // // //

fop of data

columns 001 072 scroll ===> page

*****************************

(998,abtdg02),1m.winter1,class=t,not ify=uwin,

msglevel=(1,1) msglevel=(1,1),typrun=scan exec pgm=pgm01 dd

dsn=uwin.schulung.load,disp=shr

dd sysout=* dd sysout=* dd sysout=* dd dsn=uwin.cassdat1,disp=(new,catlg,delete),

recfm=fb, expdt=99000, unit=cass bottom of data

***************************

Einen SPACE-Parameter brauchen Sie bei Band- bzw. Kassettendatasets nicht angeben.

Meldungen sind ähnlich wie beim Anlegen auf Platte. An der Tatsache, daß bei der Deallokationsmeldung VOL SER NOS 717922 eine rein numerische Angabe erfolgt, kann man erkennen, daß es sich beim Datenträger um ein Band oder eine Kassette handelt. Die

=

ief236i alloc for uwin217g step1 ief237i 0d8 allocated to outfile step was executed ief142i uwin217g step1 ief287i uwin.cassdat1 vol ser nos= 717922. ief287i -

Wenn Sie diesen Job Fehler!

so

Arbeiten mit dem

-

cond code 0000 cataloged

ein zweites Mal abschicken, kommt es

zu

einem NOT CATLGD 2-

Katalog bei Bändern/Kassetten

Auch wenn Sie Datasets auf Band/Kassette anlegen, sollten Sie darauf nicht katalogisierten Datasets angelegt werden.

achten, daß keine

Ähnlich wie beim VTOC haben auch Bänder/Kassetten Kontrolleinträge. Diese können

jedoch von Ihnen nicht gelöscht werden. Da es ohnehin nicht möglich ist, den Eintrag auf dem Band zu löschen, reicht das Löschen des

Katalogeintrags

aus.

Dies wurde früher beim IDCAMS DELETE mit dem

Zusatzparameter NOSCRATCH erreicht. Verwenden Sie diesen Zusatzparameter

nicht mehr! IDCAMS Band/Kassettendatasets automatisch und setzt NOSCRATCH von sich aus.

erkennt

89

JCL EDIT-UWIN.SCHULUNG.CNTL(PGM01)

01.16

.

-

COMMAND ******

===>

*****************************

TOP OF DATA

COLUMNS 001 072 SCROLL ===> PAGE

*****************************

000001 //UUIN217G JOB (998,ABTDG02),1M.WINTER 1, 000002 // CLASS=T, 000003 // MSGCLASS=Y, 000004 // TIME=(,10), 000005 // MSGLEVEL=(1,1), NOTIFY=UUIN 000006 // EXEC PGM=IDCAMS 000007 //UNCAT 000008 //SYSPRINT DD SYSOUT=* DD * 000009 //SYSIN DELETE UWIN.CASSDAT1 000010 000011 IF MAXCC = 8 THEN SET MAXCC = 0 000012 000013 000014 000015

/* //STEP1 //STEPLIB //SYSPRINT //SYSABOUT //SYSDBOUT //SYSOUT //OUTFILE

000016 000017 000018 000019 000020 // 000021 // 000022 // 000023 // ******

EXEC PGM=PGM01 DD DSN=UWIN.SCHULUNG.LOAD,DISP=SHR DD SYSOUT=* DD SYSOUT=* DD SYSOUT=* DD SYSOUT=* DD DSN=UWIN.CASSDAT1,

DISP=(NEW,CATLG,DELETE), RECFM=FB, EXPDT=99000, UNIT=CASS

****************************

BOTTOM OF DATA

***************************

vorhergehende Beispiel ist um einen IDCAMS Step ergänzt worden. Auch ohne die Benutzung des NOSCRATCH-Parameters wird das überflüssige Einlegen der Kassette Das

verhindert. Dies führt zu einer erheblichen

Zeitersparnis.

90

MVS/ESA JCL

Der SYSPRINT für den BROWSE

Step UNCAT hat folgendes Aussehen:

SYSPRINT

UNCAT

-

COMMAND

********************************

IDCAMS

PAGE

1-- LINE

--

===>

TOP OF DATA

1-- COLS 1 80 SCROLL ===> SCREEN

**********************************

SYSTEM SERVICES

TIME: 10:43:56

DELETE UWIN.CASSDAT1

IDC0550I ENTRY (A) UWIN.CASSDAT1 DELETED IDC0001I FUNCTION COMPLETED, HIGHEST CONDITION CODE WAS 0 IF MAXCC

=

8 THEN SET MAXCC

=

0

IDC0002I IDCAMS PROCESSING COMPLETE. MAXIMUM CONDITION CODE WAS 0 BOTTOM OF DATA ********************************

*******************************

Die Meldung sagt aus, daß der Katalogeintrag für UwTN.CASSDATl gelöscht wurde. Der wirksam gewordene Parameter NOSCRATCH ist nicht zu sehen. Da das Dataset auf der Kassette mit EXPDT=99000 angelegt wurde, ist durch das Entkatalogisieren des Datasets auch die Kassette wieder freigegeben worden. Sie ist wieder zu einer Scratch-Kassette geworden. Wenn beim Anlegen eines Dataset nicht mit EXPDT=99000 gearbeitet wurde, dann bleibt die Kassette solange gesperrt, bis die Frist, die durch die Angaben des EXPDT- oder RETPD-Parameters gesetzt wurde, abgelaufen ist. Dies gilt auch dann, wenn das auf der Kassette befindliche Dataset mit IDCAMS entkatalogisiert wurde. Die Schutzfrist bezieht sich immer auf die physische Kassette, nicht auf das Dataset. Sie sich, ob in Ihrem Unternehmen eine Tape Management Utility installiert ist. Unter Umständen kann sie dazu verwendet werden, Bänder oder Kassetten, deren

Erkundigen

Schutzfrist noch nicht abgelaufen

ist, wieder freizugeben.

Mehrere Datasets hintereinander auf Band oder Kassette schreiben Es gibt viele Gründe, die dafür sprechen, Datasets hintereinander auf Band/Kassette zu schreiben. Zum einen können dadurch viele Kassetten eingespart werden, zum anderen gibt es Verarbeitungsformen, wo die Datasets ohnehin nicht mehr erweitert werden müssen. Ein typischer Fall sind Datasets, die tagsüber on-Line und nachts im Batch verarbeitet werden. Vor dem Beginn der Batch-Verarbeitung sichert man die Datasets, damit für den Notfall ein Zurückladen erfolgen kann. Für diese Sicherung bietet sich Band/Kassette als

Datenträger an.

JCL

91

Wenn Sie die Datasets hintereinander anordnen wollen, so müssen Sie folgende Probleme lösen: 1. Sie müssen MVS mitteilen, wenn Sie auf eine andere als die erste Position schreiben wollen. Dies geschieht mit dem LABEL-Parameter. 2. Sie müssen MVS dazu bringen, die gleiche Kassette weiter zu verwenden. Dies erreichen Sie mit einer Angabe im VOL-Parameter. 3. Sie sollten ein vorzeitiges Zurückspulen der Kassette verhindern. Auch dies können Sie mit dem VOL-Parameter erreichen. 4. Sofern insgesamt mehr als 5 Kassetten beim Hintereinanderschreiben so ist dies ebenfalls mit dem VOL-Parameter mitzuteilen.

benötigt werden,

LABEL

Syntax:

LABEL=Dataset-Position Der Default-Wert ist:

LABEL=1 Mit dem LABEL-Parameter wird MVS mitgeteilt, welche Position auf der Kassette ein bestimmtes Dataset einnehmen soll. Diese Angabe ist nur dann notwendig, wenn auf eine andere als die erste Position geschrieben werden soll.

Sie können mit LABEL= aufsteigend durchnumerieren. Dabei oder mehrere Kassetten eingesetzt werden. VOLUME für

spielt es keine Rolle, ob eine

Bandverarbeitung

Syntax:

VOL=([PRIVATE][,RETAIN][,Volume-Sequenz][,Volume-Anzahl] [,SER=(vol-ser-no,vol-ser-no,...)]) [,REF=*.ddname]) [,REF=*.stepname.ddname]) [,REF=*. stepname. procstepname.ddname])

Wie Sie sehen, ist der VOLUME-Parameter recht kompliziert aufgebaut. Er besteht aus vier positioneilen und zwei Schlüsselwort-Subparametern. Alle Subparameter außer SER und REF sind positioneil.

MVS/ESA JCL

92

Der PRIVATE-Subparameter

Die Angabe von PRIVATE sollte heutzutage unterbleiben. Sie hatte früher Bedeutung als Schutz gegen unerwünschtes Lesen. Da der PRIVATE-Subparameter positioneil ist, muß seine Abwesenheit durch ein Komma gekennzeichnet werden. Die Angabe von PRIVATE bewirkt, daß ein weiterer Output auf dieses Band nur dann geschrieben werden darf, wenn ein 'Specific Volume Request' gemacht wird. Dies bedeutet, daß die Angabe der Vol-Ser-No erfolgen muß, obwohl das Dataset katalogisiert ist. Im Endeffekt handelt es sich also nur um eine weitere Sicherungsmaßnahme, die das unabsichtliche Überschreiben von Daten verhindern soll. Diese

Vorgehensweise ist nicht zu empfehlen.

Der RETAIN-Subparameter

Während die Anwendung des PRIVATE-Subparameters wenig bringt, ist die Anwendung des RETAIN-Subparameters sehr sinnvoll, da sie den Operator von überflüssiger Arbeit entlastet. RETAIN bewirkt, daß am Ende eines Steps das Band/die Kassette nicht zurückgespult wird. Wird im folgenden Step die gleiche Kassette benötigt, so steht sie sofort zur Verfügung. Dies bringt neben einer nicht unbedeutenden Zeitersparnis auch eine Entlastung für den Operator.

//

VOL=(,RETAIN)

Durch diese

Angabe wird das vorzeitige Zurückspulen unterbunden.

Der Volume-Sequenz-Subparameter

Der Volume-Sequenz-Subparameter hat nur eine geringe Bedeutung im Zusammenhang mit 'Multi-Volume Datasets (MVD)', d.h. Datasets, die mehr als ein Band beanspruchen. Wird bei Volume-Sequenz eine Zahl angegeben, so wird nicht das erste, sondern das mit der Zahl versehene Band angefordert. Wir werden diesen Subparameter hier nicht weiter betrachten. Der Volume-Anzahl-Subparameter

Mit Hilfe des Volume Anzahl-Subparameters kann man MVS mitteilen, wieviele Kassetten/Bänder ein Dataset voraussichtlich benötigt. Der Default-Wert ist 5. Wenn man also mehr Kassetten/Bänder benötigt, muß eine Angabe im Volume-Anzahl-Subparameter erfolgen. Die Angaben werden von MVS nach folgendem Schema aufgerundet:

93

JCL

Angabe

von

MVS angenommener Wert

keine 1 -5

6-20

20

>20

Mehrfaches

von

15

+

5, also 35, 50, 65 usw. bis maximal 255

Beispiel:

VOL=(,,,8)

//

Dadurch werden maximal 20 Kassetten angefordert. Die ersten drei Kommata stehen für die nicht kodierten positioneilen Parameter. Der

SER-Subparameter

SER ist ein Schlüsselwort-Subparameter in der VOLUME Anweisung. Mit ihm kann eine ganz bestimmte Kassette angefordert werden. Eine solche explizite VOLUME Angabe ist im Normalfall nicht notwendig. Ausnahme sind nicht katalogisierte Datasets, die auf Band oder Kassette stehen. Der

REF-Subparameter Der REF-Subparameter wird benötigt, wenn mehrere Datasets auf eine Kassette hintereinander geschrieben werden sollen. Mit Hilfe eines Rückbezugs (referback) wird MVS angewiesen, die vol-ser-no des vorhergehenden Datasets zu benutzen. Dadurch wird die gleiche Kassette weiterbenutzt. Außerdem wird die Übernahme der UNIT-Angabe bewirkt. Dort, wo VOL=REF eingesetzt wird, brauchen Sie also UNIT nicht mehr anzugeben. Je nachdem, ob dieses Dataset im gleichen oder einem vorhergehenden Step angesprochen wurde, unterscheidet sich die Syntax:

// wenn

// wenn

// wenn

VOL=REF=*.ddname beide Datasets im

gleichen Step angesprochen werden bzw.

VOL=REF=*.stepname.ddname auf einen vorhergehenden

Step Bezug genommen wird.

VOL=REF=*.stepname.procstepname.ddname auf einen vorhergehenden

Step in einer Prozedur Bezug genommen wird.

MVS/ESA JCL

94

gleichzeitig ein Zurückspulen der Kassette verhindert werden, Subparameter mit anzugeben: VOL=(,RETAIN,REF=*.ddname) // Soll

so

ist der RETAIN-

oder

//

VOL=(,RETAIN,REF=*.stepname.ddname)

oder

// //

VOL=(,RETAIN,

REF=*.stepname.procstepname.ddname)

Machen Sie Rückbezüge mit VOL=REF immer auf den unmittelbar vorhergehenden Step oder das unmittelbar vorhergehende Dataset. Lassen Sie niemals alle Rückbezüge auf den ersten Step des Jobs verweisen. Sonst bekommen Sie Probleme, wenn mehr als eine Kassette beschrieben wird.

Beispiele für Multi-File Technik Im folgenden Beispiel werden drei Datasets in drei Steps hintereinander weggeschrieben: 000001 //UWIN217X JOB (998,ABTDG02),'M.WINTER1, 000002 // CLASS=T,MSGCLASS=Y 000003 //CLRCAT EXEC PGM=IDCAHS 000004 //SYSPRINT DD SYS0UT=* DD * 000005 //SYSIN DELETE UWIN.CASSDAT1 000006 DELETE UWIN.CASSDAT2 000007 DELETE UWIN.CASSDAT3 000008

Das

Beispiel wird auf der folgenden Seite fortgesetzt.

95

JCL 000009 000010 000011 000012 000013 000014 000015 000016 000017 000018 000019 000020

//STEP1

EXEC PGM=PGH05

//STEPLIB //SYSOUT //SYSDBOUT //SYSABOUT //OUTFILE // // // // //

DD

//STEP2

000021 //STEPLIB 000022 //SYSOUT

DSN=UWIN.SCHULUNG.LOAD,DISP=SHR

DD SYSOUT=*

DD SYSOUT=* DD SYSOUT=*

DSN=UWIN.CASSDAT1, DISP=(,CATLG,DELETE), UNIT=CASSA, VOL=(,RETAIN), DD

RECFM=FB, EXPDT=99000 EXEC PGM=PGM06 DD

DSN=UWIN.SCHULUNG.LOAD,DISP=SHR

DD SYSOUT=*

000023 //SYSDBOUT DD SYSOUT=* 000024 //SYSABOUT DD SYSOUT=* 000025 //OUTFILE DD DSN=UUIN.CASSDAT2, 000026 // DISP=(,CATLG,DELETE), 000027 // VOL=(,RETAIN,REF=*.STEP1.OUTFILE), 000028 // RECFM=VB, 000029 // LABEL=2,EXPDT=99000 EXEC PGM=PGM07 000030 //STEP3 000031 //STEPLIB DD DSN=UWIN.SCHULUNG.LOAD,DISP=SHR DD SYS0UT=* 000032 //SYSOUT 000033 //SYSDBOUT DD SYSOUT=* 000034 //SYSABOUT DD SYSOUT=* 000035 //OUTFILE DD DSN=UWIN.CASSDAT3, 000036 // DISP=(,CATLG,DELETE), 000037 // V0L=REF=*.STEP2.0UTFILE, 000038 // RECFM=FB, 000039 //_LABEL=3,EXPDT=99000_

LABEL= muß in STEP2 und STEP3 eingesetzt werden, da nicht mehr auf die erste Position geschrieben werden kann. Die Rückbezüge im Parameter VOL=REF verweisen immer auf den unmittelbar vorhergehenden Step. Dies ist für den Fall wichtig, daß mehrere Kassetten für die Aufnahme des Datenbestandes erforderlich sind.

Beachten Sie, daß in STEP3 RETAIN weggelassen wurde. Es gibt keinen vernünftigen Grund, das Zurückspulen zu verzögern. Durch den Wegfall von RETAIN vereinfacht sich die Schreibweise des VOL-Parameters erheblich.

MVS/ESA JCL

96 Im

folgenden Beispiel werden drei Datasets in einem Step gesichert. Kopieren verwendet. IDCAMS benötigt die LRECL-Angabe!

Dazu wird IDCAMS

zum

edit command

uwin.schulung.cntl(cass)

01.00

******

*****************************

000001 000002 000003 000004 000005 000006 000007 000008 000009 000010 000011 000012 000013 000014 000015 000016 000017 000018 000019

//uwin217x

job

// // //* // //clrcat //sysprint //sysin

class=t, msgclass=y, notify=uwin,typrun=scan

fop of data

(998,abtdg02),'h.winter',

notify=uwin exec pgh=idcams dd sysout=*

dd

*

delete

uwin.ksds.save

delete

uwin.esds.save

delete

uwin.rrds.save

exec pgh=idcams //save dd sys0ut=* //sysprint dd dsn=uwin.ksds,disp=shr //ini

//in2 //in3 //out1

// // 000020 // 000021 // 000022 // 000023 //out2 000024 // 000025 // 000026 // 000027 // 000028 //

Das

.

-

===>

dsn=uwin.esds,disp=shr dsn=uwin.rrds,disp=shr dd dsn=uwin.ksds.save, disp=(,catlg,delete), unit=cass, vol=(,retain), dd

dd

recfm=fb,lrecl=94, expdt=99000

dsn=uwin.ksds.save, disp=(,catlg,delete), dd

vol=(,retain,ref=*.out1), label=2, recfm=fb,lrecl=278, expdt=99000

Beispiel wird fortgesetzt:

columns 001 072 scroll ===> page

*****************************

97

JCL

000029 000030 000031 000032 000033 000034 000035 000036 000037 000038

Ein

//OUT3

DSN=UWIN.KSDS.SAVE, DISP=(,CATLG,DELETE) V0L=REF=*.0UT2, LABEL=3, DD

// // // // // //SYSIN REPRO

,

RECFM=FB,LRECL=85, EXPDT=99000 *

DD

INFILE(IN1) OUTFILE(0UT1)

REPRO INFILEUN2) OUTFILE(OUT2) REPRO INFILE(IN3) OUTFILE(OUT3)

großes Dataset auf mehrere Kassetten schreiben

Beim ersten Schreiben eines großen Datasets auf Band/Kassette ist nur darauf zu achten, ob möglicherweise mehr als 5 Kassetten benötigt werden. In diesem Fall ist der Subparameter Volume-Anzahl-einzusetzen. Datasets, die mehr als eine Kassette einnehmen, werden als Multi-Volume Datasets (MVD) bezeichnet. 000001 //UWIN217X 000002 // 000003 //CLRCAT 000004 //SYSPRINT

000005 000006 000007 000008 000009 000010 000011 000012 000013 000014

//SYSIN DELETE

//STEP1 //STEPLIB //OUTFILE // // // // //

Wieviele Kassetten IEF287I IEF287I

JOB

(998,ABTDG02),'M.WINTER',

CLASS=T,MSGCLASS=Y EXEC PGM=IDCAMS

DD SYSOUT=* DD * UWIN.BIGFILE EXEC PGM=PGM91

DSN=UUIN.SCHULUNG.LOAD,DISP=SHR DSN=UWIN.BIGFILE, DISP=(,CATLG,DELETE), UNIT=CASS, DD

DD

V0L=(,,,20), RECFM=FB, EXPDT=99000

eingesetzt wurden geht aus der Deallokationsmeldung hervor.

UWIN.BIGFILE VOL SER NQS=

Für das Dataset wurden

CATALOGED

717922, 717923, 633998, 722556, 766221, 433221.

insgesamt sechs Kassetten benötigt.

98

MVS/ESA JCL

Besonderheiten bei Band- bzw.

Kassettenverarbeitung

Bei der Verarbeitung von Bändern/Kassetten können eine Reihe von Optimierungsmöglichkeiten genutzt werden. Dies betrifft vor allem MVDs (Multi-Volume Datasets). Daneben gibt es Fälle, in denen Bänder verarbeitet werden müssen, die nicht den IBM-Standardkonventionen entsprechen. Gelegentlich müssen auch Bänder verarbeitet werden, die ASCII Daten enthalten. Auf solche Sonderfälle und die dafür notwendigen Parameter wird jetzt eingegangen. MVDs lesen oder mit DISP=MOD erweitern Soll ein MVD gelesen werden, so kann es sinnvoll sein, eine zweite Lese-Schreibstation anzufordern. Dies bringt eine Zeitersparnis, wenn das Ende der ersten Kassette erreicht wird. In diesem Fall wird die zweite Kassette in eine zweite Lese-Schreibstation eingelegt, bevor das Ende der ersten Kassette erreicht ist. Sollen MVDs mit DISP=MOD erweitert werden, so kann es zu einer vermeidbaren kommen. Sie ist dadurch bedingt, daß der Operator beim Ansprechen des Datasets immer eine 'Mount Message' für die erste Kassette bekommt, d.h. er wird aufgefordert, die erste Kassette in eine Lese-Schreibstation einzulegen. Der neue Datenbestand muß aber ans Ende der letzten Kassette angehängt werden. Erst beim OPEN wird festgestellt, welches die letzte Kassettennummer ist. Mit dem UNIT-Parameter läßt sich diese Verzögerung beseitigen.

Verzögerung

UNIT=(„DEFER) Syntax:

UNIT=(Unit[,Anzahl][,DEFER]) Der

unit-Subparameter Diesen Subparameter kennen Sie bereits, normalerweise in der Form UNIT=gruppenname. Der

Anzahl-Subparameter Anzahl-Subparameter kann

Mit dem

man für ein Dataset mehrere Lese-Schreibstationen anfordern. Dies ist nur bei Multi-Volume Datasets sinnvoll. Fordern Sie niemals mehr als 2 Lese-Schreibstationen an. Dies ist nicht nur sinnlos, sondern führt auch zu einer unnötigen Belegung von Lese-Schreibstationen. Auch für den Fall, daß es sich bei Ihrem Dataset um ein Multi-Volume Dataset handelt (d.h. das Dataset benötigt mehr als ein Band/eine Kassette), reichen zwei LeseSchreibstationen völlig aus. Wird eine Kassette auf der Lese-Schreibstation 1 bearbeitet, so hat der Operator Zeit, die andere Kassette auf der Lese-Schreibstation 2 zu wechseln.

99

JCL Der

DEFER-Subparameter

Wird in einem Job eine Kassette benötigt, so erhält der Operator zur Allokationszeit eine 'Mount Message', d.h. die Aufforderung, entweder eine Scratch-Kassette einzulegen (beim Anlegen von Datasets) oder eine bestimmte Kassette einzulegen (beim Lesen von

Datasets). Bei der Erweiterung eines MVDs mit DISP=MOD erhält der Operator zunächst die Aufforderung, die erste Kassette einzulegen. Mit der Angabe TJNIT=(„DEFER) wird aber diese Meldung solange verzögert, bis ein OPEN dann auch die richtige Kassette angefordert.

//OUTFILE //

DD

abgesetzt wird.

In diesem Moment wird

DSN=UWIN.BIGFILE,DISP=MOD,

UNIT=(,,DEFER)

Der Einsatz von UNIT=(„DEFER) ist nur dann sinnvoll, MVD handelt. Ansonsten fuhrt es zu unnützer Verzögerung.

wenn es

sich wirklich im ein

Ein weiterer Fall, bei dem UNIT=(„DEFER) eingesetzt werden kann, ist gegeben, wenn nicht sicher ist, ob ein auf der Kassette liegendes Dataset tatsächlich geöffnet wird. Diese Angabe ist nur dann sinnvoll, wenn zu erwarten ist, daß die Kassette tatsächlich nicht benötigt wird. Ansonsten führt es nur zu unnützer Verzögerung, da der Operator, wenn er erst zur Open-Zeit die Mount Message erhält, keine Möglichkeit hat, den 'wait state' des Programms zu verhindern. Zu beachten ist, daß bei der Benutzung von DEFER die Lese-Schreibstation belegt wird, und zwar unabhängig davon, ob es zu einem OPEN kommt oder nicht. Nicht

katalogisierte Datasets von Bändern/Kassetten lesen Im Zusammenhang mit Bändern/Kassetten werden häufig nicht katalogisierte Datasets eingesetzt. Beim Lesen nicht katalogisierter Datasets ist die zusätzliche Angabe von UNIT,

VOL=SER und evtl. LABEL erforderlich. Problematisch ist die Verwaltung nicht katalogisierter Datasets. In einigen Installationen sind Tape Management Systeme installiert (z.B CA1), um den Zugriff auf nicht mehr katalogisierte Datenbestände zu ermöglichen.

Will man ein nicht katalogisiertes Dataset auf Kassette ansprechen, so muß man die Kassettennummer wissen und unter Umständen auch die Position des Dataset auf der Kassette, falls es nicht auf Position 1 steht. Außerdem muß der DSN korrekt angegeben werden.

Beispiel:

//EINGABE //

DSN=UWIN.TEST.UNCAT,DISP=OLD, UNIT=CASS,VOL=SER=778201,LABEL=2 DD

Sollte einer der Parameter DSN, VOL=SER oder LABEL falsch einem 813-04 ABEND.

es zu

angegeben sein, so kommt

100

MVS/ESA JCL

Bänder exportieren

werden Bänder aus einer Installation heraus verschickt. Die darauf befindlichen Datasets sollten nicht katalogisiert werden, da ansonsten Katalogeinträge für nicht verfügbare Bänder existieren.

Häufig

Sofern eine Tape Management Utility installiert ist, sollte darauf geachtet werden, daß auch dort bei Exportbändern keinerlei Einträge gemacht werden. Dies läßt sich mit der Angabe EXPDT=98000 erreichen.

//EXDAT // // // //

DD

DSN=UWIN.EXPORT.DATEN.M9201,

DISP=(NEW,KEEP,DELETE), UNIT=TAPE, EXPDT=98000, RECFM=FB,LRECL=453

Standardbänder

importieren Standardbänder zu importieren stellt kein allzu großes Problem dar. Der neue Datenbestand sollte katalogisiert werden. Im folgenden Beispiel werden zwei Datasets auf Band importiert.

//IMPDAT1 // // //IMPDAT2 // // //

DD

DSN=UWIN.IMPORT.DATEN.M9201,

DISP=(OLD,CATLG,DELETE), UNIT=TAPE,VOL=SER=76 6 991 DD

DSN=UWIN.IMPORT.DATEN.M9202,

DISP=(OLD,CATLG,DELETE), UNIT=TAPE,VOL=SER=7669 91, LABEL=2

Sollen Datasets auf Bändern, die nicht den IBM-Standardkonventionen entsprechen, importiert werden, so sollten sie auf einen anderen Datenträger (Kassette oder Platte) kopiert werden. Wie Nicht-Standardbänder verarbeitet werden, erfahren Sie im folgenden Kapitel. Kassetten/Bänder ohne Standardlabel verarbeiten

Standardisierte Bänder und Kassetten von IBM sind nach einem ganz bestimmten Muster Sie enthalten neben den Daten Blöcke mit Steuerinformationen. Die verschiedenen Bestandteile sind mit Hilfe von Markierungen (Tape Marks) voneinander

aufgebaut. getrennt.

Am Anfang des Bandes/der Kassette steht der Volume Record gefolgt von Header 1 und Header2 Record. Anschließend folgt eine Tape Mark. Zwischen dieser und der nächsten

JCL

101

Mark stehen die Datensätze. Danach steht nochmals eine Tape Mark.

Tape

folgen

die Trailer Records 1 und 2. Am Ende

Record, der häufig auch nur als Volume Record bezeichnet wird, steht eines jeden Bandes/Kassette. In ihm ist u.a. die Volume Serial Number Anfang mit der das Band/die Kassette identifiziert wird. Diese Angabe ist für normale abgelegt, (nicht importierte) Bänder/Kassetten rein numerisch. Für jedes Dataset stehen zwei Header Records zur Verfügung (HDR1, HDR2). Im HDR1 stehen u.a. der DSN, die Vol-ser-no für das Dataset, die mit der des gesamten Volumes identisch sein kann, das Datum des Anlegens des Datasets, die Position des Datasets auf der Kassette und die Schutzfrist. Im HDR2 stehen u.a. Record-Format, Blockgröße bzw. Blockfaktor, Record-Länge und Schreibdichte. Der Initial Volume am

Der genaue Aufbau der Header ist im

Anhang erläutert.

Auf HDR1 und HDR2 können bis zu weitere acht User Labels folgen. Von dieser Möglichkeit wird im normalen DV-Alltag allerdings nur sehr selten Gebrauch gemacht. Spätestens jetzt folgt eine Tape Mark. Danach folgen die eigentlichen Datensätze, die ihrerseits mit einer Tape Mark abgeschlossen werden. Auf sie folgen zwei Trailer oder End-of-File (EOF) Records, deren Aufbau mit denen der Header Records identisch ist. Ihr Vorhandensein ermöglicht ein Rückwärtslesen der Kassetten. Auf sie folgen zum Abschluß zwei Tape Marks.

Reicht ein Band für die Aufnahme des Datenbestandes nicht aus, so können weitere Bänder für das Speichern verwendet werden. In diesem Fall wird an das Ende des ersten und jeden weiteren Bandes, auf dem das Dataset noch nicht endet, ein End-of-Volume Record (EOV)

geschrieben. Es gibt eine Reihe

von Umgebungen, in denen andere Labelarten verwendet werden. Sie unterscheiden sich hinsichtlich der Zahl und der Position der Tape Marks. Manchmal kann es auch notwendig werden, die Header Records zu lesen, um Informationen über das

Dataset

zu

erhalten.

Für die Verarbeitung von Bändern/Kassetten ohne Standardlabel wird eine LABEL-Parameters benötigt.

Erweiterung des

Die

Subparameter NL, LTM und BLP Syntax:

LABEL=(pos,labeltyp) Default:

LABEL=(1,SL)_

Der pos-Subparameter

Diesen Parameter kennen Sie bereits. Er ist Position geschrieben werden soll. Der Default-Wert ist 1.

anzugeben,

wenn

auf eine andere als die erste

102

MVS/ESA JCL

Der Label-Typ-Subparameter Der Label-Typ-Subparameter gibt an, welches Format das Tape Label hat. In der Regel wird dies die Angabe SL für Standard Label sein. Daher ist dies auch der Default-Wert. Folgende Label Angaben sind möglich:

Standard Label Standard und User Labels ISO/ANSI Labels ISO/ANSI und User Labels Non-Standard Label No Label Bypass Label Processing Leading Tape Mark

SL SUL AL AUL NSL NL BLP LTM

Von den verschiedenen Möglichkeiten haben außer SL nur NL, BLP und LTM eine praktische Bedeutung. Neben den normalen Label-Typen (SL, AL, SUL, AUL) gibt es die Möglichkeit, innerhalb einer Installation andere, nicht standardgemäße Label zu definieren. Davon wird aber nur selten Gebrauch gemacht. In diesem Fall ist NSL anzugeben. Wenn NL, LTM oder BLP benutzt wird, so ist zu beachten, daß alle Informationen, die normalerweise dem Label entnommen werden können, nicht zur Verfügung stehen. Dies bedeutet, daß Parameter wie LRECL, RECFM und BLKSIZE mit angegeben werden müssen. Der DSN spielt übrigens keine Rolle. Er wird nicht verifiziert.

NL (No Label) ist beim Fehlen von Labein Datensätze unmittelbar am Bandanfang.

//NLTAPE // // Steht

vor

beginnen

die

DSN=EGAL,DISP=OLD,UNIT=TAPE, VOL=SER=111655,LABEL=(l,NL), RECFM=FB,LRECL=8 0,BLKSIZE=24 0 0 0

den Datensätzen eine einzelne Tape kann z.B. bei

BLP steht für

In diesem Fall

DD

anzugeben. Diese Konfiguration Umgebung angelegt wurden.

//DOSTAPE // //

anzugeben.

DD

Mark, so ist LTM (Leading Tape Mark) Tapes auftreten, die in einer DOS/VSE-

DSN=EGAL,DISP=OLD,UNIT=TAPE,

VOL=SER=254221,LABEL=(,LTM), RECFM=FB,LRECL=140,BLKSIZE=28000

Bypass Label Processing. Es ist eine Option, die Sie einsetzen können, um Informationen über einen auf Band befindlichen unbekannten Datenbestand zu erhalten. So können Sie mit LABEL=(1,BLP) die Header Records 1 und 2 des ersten Datasets auf der Kassette lesen (vorausgesetzt es handelt es sich um eine SL Kassette). Mit LABEL=(4,BLP) erhalten Sie die Header Records des zweiten Datasets. Mit der Utility IEBGENER können Sie den Header z.B. drucken lassen.

JCL

103

//FINDOUT EXEC PGM=IEBGENER //SYSPRINT DD SYSOUT=* DD DSN=EGAL,DISP=OLD,UNIT=TAPE, //SYSUT1 VOL=SER=111655,LABEL=(4,BLP), // RECFM=FB,LRECL=8 0,BLKSIZE=8 0 // DD SYSOUT=A //SYSUT2 DD DUMMY //SYSIN In

einigen MVS-Installationen ist der Einsatz von LTM und BLP nicht ohne weiteres Erkundigen Sie sich, welche Konventionen in Ihrer Installation einzuhalten sind.

erlaubt.

ASCII Daten auf Kassetten/Bändern verarbeiten

Alle IBM Mainframe Systeme arbeiten mit dem EBCDIC. EBCDIC steht für: Extended Binary Coded Decimal Interchange Code. Es kann jedoch auch notwendig werden, Bänder zu verarbeiten, deren Daten im ASCII Format stehen. ASCII steht für: American Standard Code for Information Interchange. Sollen Bänder/Kassetten mit ASCII Daten gelesen oder geschrieben werden, so können die Daten übersetzt werden. Denkbar ist z.B. der Einsatz eines Streamers in einem PCNetzwerk. Die dort im ASCII Format geschriebenen Daten sollen in einem MVS-System verarbeitet werden. Dies stellt eine Alternative zu einem File Transfer dar. OPTCD für

Bandverarbeitung

Syntax:

DCB=(...,OPTCD=Q) Beim Lesen von Bändern erfolgt eine Übersetzung von ASCII nach EBCDIC, beim Schreiben von Bändern wird von EBCDIC nach ASCII übersetzt. ASCII Bänder haben in der Regel keine IBM-Standardlabel. Meist folgen die Daten nach der ersten Tape Marke. Setzen Sie in diesem Fall den LABEL-Parameter auf LTM. Im folgenden Beispiel werden die Daten von einem Band gelesen, das ASCII Daten enthält. Durch die Angabe von OPTCD=Q wird eine Übersetzung von ASCII nach EBCDIC bewirkt. Der Datenbestand wird ans Ende des bestehenden Datasets UWIN.TRANSDAT

angehängt:

104

MVS/ESAJCL

//TRANSLAT EXEC PGM=IEBGENER //SYSPRINT DD SYSOUT=* DD DSN=EGAL,DISP=OLD,UNIT=TAPE, //SYSUT1 VOL=SER=121771,LABEL=(,LTM), // DCB=(RECFM=FB,LRECL=80,BLKSIZE=16000, // OPTCD=Q) // DD DSN=UWIN.TRANSDAT,DISP=MOD //SYSUT2 DD DUMMY //SYSIN

2.5

PASSen von Datasets zwischen Steps

Möglichkeit, Datasets mit DISP=(,CATLG) zu katalogisieren oder mit DISP=(,DELETE) zu löschen, gibt es die DISP=(,PASS), mit der ein Dataset an einen Folge-Step weitergegeben (gepassed) wird. In diesem Fall behält man sich vor, was mit dem Dataset bei Beendigung des Jobs geschehen soll. Notwendig ist diese Vorgehensweise bei temporären Datasets. Da temporäre Datasets nicht katalogisiert werden dürfen, ist das PASSen die einzige Möglichkeit, solche Datasets über mehrere Steps hinweg anzusprechen. Aus diesem Grund wird DISP=(,PASS) und das Arbeiten mit temporären Datasets in einem Kapitel behandelt. Neben der

Was

passiert beim PASSen

Wird ein Dataset gepassed, so erfolgt ein Eintrag in einer Tabelle, der sogenannten Passed Data Set Queue (PDSQ). Für jedes gepasste Dataset erfolgt ein Eintrag. Betrachten wir einmal,

//STEP1 //OUTPUT1 // // // // //STEP2 //INPUT

was

bei der Ausführung der folgenden JCL

geschieht:

EXEC PGM=PGM01 DD

DSN=UWIN.TESTOUT,

DISP=(NEW,PASS), UNIT=DSKPRM,

RECFM=FB,LRECL=234,

SPACE=(CYL,(1,1),RLSE) EXEC PGM=PGM02 DD

DSN=UWIN.TESTOUT,DISP=(OLD,DELETE)

JCL

105

In STEP1 wird ein Dataset mit dem DSN UWIN.TESTOUT neu angelegt. Es wird aber weder katalogisiert noch gelöscht, sondern mit der Normal-Disposition PASS an den Folge-

Step weitergegeben. Die Angabe von DISP=(,PASS) bewirkt, daß am Ende von STEP1 MVS einen Eintrag in der sogenannten Passed Data Set Queue (PDSQ) kreiert. Die PDSQ befindet sich im Hauptspeicher, im Gegensatz zu Katalogeinträgen, die auf Platte residieren. Der Eintrag für das gepasste Dataset sieht folgendermaßen aus: Eintrag in der PDSQ: DSN

Volume

Unit

UWIN.TESTOUT

DSK005

338Ö

Die Allokationsroutinen von STEP2 stellen bei dem DD-Namen INPUT fest, daß es sich ein existierendes Dataset (DISP=OLD) handelt, für die keine spezifische VOLUMEInformation angegeben wurde. Daher muß im Katalog nach den Einträgen geschaut werden. Bevor dies aber geschieht, muß die Passed Data Set Queue durchsucht werden, um festzustellen, ob dort ein Eintrag vorhanden ist. In diesem Beispiel findet MVS den Eintrag für das Dataset und entnimmt ihm die notwendigen VOLUME- und UNIT-Angaben. Anschließend wird dieser Eintrag aus der Passed Data Set Queue entfernt. Dies bedeutet, daß der Folge-Step das Dataset angenommen hat. Was passiert aber, wenn ein gepasstes Dataset nicht angenommen wird? In diesem Fall übernehmen es die Job Termination-Routinen, die übriggebliebenen Einträge in der PDSQ zu löschen. Für das Dataset ergeben sich dabei die folgenden vier Möglichkeiten: 1. Wenn das Dataset während des Jobs erstellt und weder katalogisiert noch behalten wurde (KEEP soll bei neuen Datasets nicht verwendet werden!), so wird es gelöscht. Dies trifft für temporäre Datasets immer zu. um

2. Ein Dataset wird in einem Job

Step erstellt und katalogisiert und in einem darauf Job Step gepassed, und dieser Pass wird nicht angenommen. In diesem Fall bleibt das Dataset katalogisiert. folgenden

3. Ein Dataset wird in einem Job Step erstellt, gepassed und im Folge-Step katalogisiert, ohne dabei aber angenommen zu werden (Dies ist durchaus möglich). Die Ergebnisse sind schwer vorherzusagen. Diese Form von JCL ist unter allen Umständen zu

vermeiden.

4. Ein Dataset, das vor Job-Beginn Das Dataset bleibt katalogisiert.

existiert, wird gepassed, ohne angenommen zu werden.

Zu allen vier Möglichkeiten werden im

folgenden Beispiele gegeben:

MVS/ESA JCL

106 1.

//STEP1 //OUTPUT1 // // // // //STEP2 //INPUT

EXEC PGM=PGM01 DD DSN=UWIN.TESTOUT,

DISP=(NEW,PASS), UNIT=DSKPRM, RECFM=FB,LRECL=234

,

SPACE=(CYL, (1,1) ,RLSE) EXEC PGM=PGM02,COND=(4,LT,STEP1) DD DSN=UWIN.TESTOUT,DISP=(OLD,CATLG)

Werden beide Steps ausgeführt, so wird das gepasste Dataset angenommen und Gibt STEP1 jedoch einen Return Code von 4 oder mehr zurück, so wird STEP2 nicht mehr ausgeführt. Die Job Termination-Routinen finden einen Eintrag in der Passed Data Set Queue und löschen ihn und damit das Dataset.

katalogisiert. 2.

//STEP1 //OUTPUT1 // // // // //STEP2 //INPUT //STEP3 //INPUT

EXEC PGM=PGM01 DD DSN=UWIN.TESTOUT,

DISP=(NEW,PASS), UNIT=DSKPRM, RECFM=FB,LRECL=234

,

SPACE=(CYL, (1,1) ,RLSE) EXEC PGM=PGM02 DD DSN=UWIN.TESTOUT,DISP=(OLD,CATLG)

EXEC PGM=PGM03 DD DSN=UWIN.TESTOUT,DISP=(OLD,PASS)

Dataset in STEP1 erstellt, an STEP2 gepassed und dort Auffinden des Dataset den Katalog und passed das Dataset weiter. Dieser Pass wird nicht mehr angenommen. Da das Dataset zum Zeitpunkt des Passens in STEP3 jedoch schon katalogisiert war, bleibt es katalogisiert. In diesem

Beispiel wird das katalogisiert. STEP3 benutzt

zum

JCL

107

3.

//STEP1 //OUTPUT1 // // // // //STEP2 //INPUT //

EXEC PGM=PGM01 DD DSN=UWIN.TESTOUT,

DISP=(NEW,PASS), UNIT=DSKPRM, RECFM=FB,LRECL=234,

SPACE=(CYL,(1,1),RLSE) EXEC PGM=PGM02 DD DSN=UWIN.TESTOUT,DISP=(OLD,CATLG),

VOL=REF=*.STEP1.OUTPUT1

Diese JCL ist ausgesprochen gefährlich. In ihr ist eine Anweisung enthalten, die bei Datasets auf Platte nicht zum Einsatz kommen sollte: Die Anweisung VOL=REF. Sie hat nur im Zusammenhang mit Bandverarbeitung Berechtigung, wenn mehrere Datasets hintereinander auf ein Band geschrieben werden sollen. In obigem Beispiel hat die völlig überflüssige Benutzung der Anweisung VOL=REF verheerende Folgen. STEP1 erstellt das Dataset, macht einen Eintrag in der Passed Data Set Queue (PDSQ) und übergibt es an STEP2. Da im STEP2 bei INPUT der VOL=REFSubparameter angegeben ist, wird die entsprechende VOLUME- und UNIT-Information durch den Rückbezug von STEP1 übernommen. STEP2 braucht daher nicht mehr in die PDSQ zu schauen. Die Folge: Das Dataset wird nicht angenommen. Deshalb wird der in der PDSQ befindliche Eintrag nicht gelöscht. STEP2 katalogisiert das Dataset. Die Job Termination-Routinen finden jedoch einen Eintrag in der PDSQ und starten einen Löschvorgang. In Nicht-SMS-Umgebungen löschen sie nur den Eintrag im VTOC der Platte, während der Katalogeintrag im ICF bestehen bleibt. Somit existiert nach dem Job ein Katalogeintrag für ein nicht existierendes Dataset. Unter SMS werden beide wird.

Einträge gelöscht,

Wird die Anweisung VOL=REF

was vom

User mit Sicherheit nicht

gewünscht

entfernt, so entstehen keinerlei Probleme.

4.

//STEP1 //OUTPUT1 // //STEP2 //INPUT

EXEC PGM=PGM01 DD DSN=UWIN.TESTOUT,

DISP=(OLD,PASS) EXEC PGM=PGM02 DD

DSN=UWIN.TESTOUT,DISP=(OLD,PASS)

108

MVS/ESA JCL

In diesem Fall existiert das Dataset bereits vor Job-Beginn. Der PASS bewirkt einen minimalen Performancevorteil in STEP2, da die PDSQ im Speicher gehalten wird und ein erneuter Read im ICF nicht notwendig wird. Der Pass im STEP2 wird nicht angenommen. Da das Dataset aber bereits katalogisiert war, bleibt es katalogisiert.

2.6

Temporäre Datasets

Bei der Verarbeitung umfangreicher Jobs werden häufig Datasets angelegt, die nur zur Laufzeit des Jobs benötigt werden. Ein typisches Anwendungsfeld von temporären Datasets ergibt sich in Zusammenhang mit der Benutzung der SORT-Utility. Diese wird im Kapitel über Utilities behandelt. Das Besondere an diesen Datasets ist, daß man sie in einem Step erzeugen kann und ohne sie katalogisieren zu müssen an den folgenden Step weitergeben kann.

Der DSN

temporäre Datasets

Für temporäre Datasets werden keine zu katalogisierenden Namen vergeben. Man kann entweder mit einem symbolischen DSN arbeiten oder aber den DSN ganz weglassen. Im letzteren Fall muß dann im Folge-Step mit einem Rückbezug (referback) gearbeitet werden. Wie dies geschehen muß, wird weiter unten gezeigt.

Symbolische DSNs Ein von

symbolischer DSN beginnt immer mit der Zeichenfolge &&. Darauf maximal acht Zeichen. Typische symbolische DSNs sind:

//DDI

DD DSN=5c&TEMPDAT

//DDI

DD DSN=&&SORTOUT

//DDI

DD DSN=&&LOADSET

folgt

ein

String

Diese DSNs können dann in den Folge-Steps wieder verwendet werden. Wird im Job mehr als ein symbolischer DSN verwendet, so sollte auf Eindeutigkeit geachtet werden. Diese

Eindeutigkeit ist syntaktisch nicht zwingend vorgeschrieben. Wer jedoch mit abhängiger Step-Steuerung (COND-Parameter auf Step-Ebene) arbeitet, kann böse Überraschungen erleben. Unter Umständen werden falsche Datasets angefaßt, ohne daß sich das in einer Fehlermeldung niederschlagen muß. Im folgenden Beispiel wird ein symbolischer Name vergeben:

109

JCL uwin.schulung.cntl(tempi)

edit

01 14 -

command

.

c olumns 001 072 ===> page

scroll

===>

*****************************

******

*****************************

000001 000002 000003 000004 000005 000006 000007 000008 000009

//uwinc job (998,abtdg02),'m.winter1,class=a,notify=uwin, // msgclass=y,msglevel=(1,1) exec pgm=pgm01 //step1

//input1

dd

//

disp=shr

//output1

dd

// // // 000010 // 000011 //step2 000012 //input2 000013 //output2 000014 // 000015 // 000016 // 000017 //

Top of data

dsn=uwin.schulung.testdat.input,

dsn=&&tempdat, disp=(new,pass), unit=sysda, recfm=fb,

space=(cyl,(1,1),rlse) exec pgm=pgm02

dsn=&&tempdat,disp=(old,delete) dsn=uwin.schulung.testdat.output2, disp=(new,catlg,delete), dd dd

unit=prmdsk, recfm=fb,

space=(cyl,(1,1),rlse)_

In diesem Beispiel erhält OUTPUT1 den symbolischen DSN &&TEMPDAT. Dieses Dataset wird an STEP2 übergeben, dort als INPUT2 verwendet und anschließend gelöscht. Für den

symbolischen Namen generiert MVS einen DSN nach folgendem Muster:

SYS90 003.TO91524.RD001.UWIN.TEMPDAT

folgt auf SYS das julianische Datum. Auf T folgt die Zeit, zu der JES2 initialisiert wurde. RD001 ist die Kennung des verwendeten Readers. Darauf folgt die USERID und schließlich der symbolische Name. Wird der gleiche symbolische Name mehrfach verwendet, so wird zwar nicht der gleiche physische DSN generiert, es kann aber trotzdem zu Problemen kommen. Im ersten Level

Rückbezüge (Referbacks) Rückbezüge sind Verweise auf DD-Namen, genauer auf Parameter, die mit diesem DDBeziehung stehen. Sie werden häufig eingesetzt für den DSN-, DCB-, VOL- und PGM-Parameter. Sie können sich auf DD-Namen des gleichen Steps oder DD-Namen eines vorangehenden Steps beziehen. Syntax für Rückbezüge auf DD-Namen innerhalb desselben Steps:

Namen in

parameter=*.ddname

MVS/ESA JCL

110

Syntax fur Rückbezüge auf DD-Namen vorhergehender Steps:

parameter=*.stepname.ddname Syntax für Rückbezüge auf DD-Namen vorhergehender Steps in Prozeduren:

parameter=*.stepname.procstepname.ddname Auf der folgenden Seite werden beide Möglichkeiten eines 1. Rückbezug innerhalb eines Steps:

Rückbezugs vorgestellt.

000001 //UWINC JOB (998,ABTDG02),'M.WINTER',CLASS=A,NOTIFY=UWIN, 000002 // MSGCLASS=Y,MSGLEVEL=(1,1) EXEC PGM=PGM01 000003 //STEP1 000004 //OUTPUT 1 DD DSN=UWIN.SCHULUNG.TESTDAT.0UTPUT1, 000005 // DISP=(NEW,CATLG,DELETE), 000006 // UNIT=DSKPRM, 000007 // RECFM=FB, 000008 // SPACE=(CYL,(1,1),RLSE) 000009 //OUTPUT2 DD DSN=UWIN.SCHULUNG.TESTDAT.0UTPUT2, 000010 // DISP=(NEW,CATLG,DELETE), 000011 // UNIT=DSKPRM, 000012 // 000013 // ******

DCB=*.0UTPUT1, SPACE=(CYL,(1,1),RLSE)

****************************

BOTTOM OF DATA

***************************

In diesem Fall wurde für OUTPUT2 die DCB-Information von OUTPUT1

kopiert.

111

JCL

2.

Rückbezug auf einen vorhergehenden Step:

000001 //UWINC JOB (998,ABTDG02),1H.WINTER 1, CLASS=A,NOTIFY=UWIN, 000002 // MSGCLASS=Y,MSGLEVEL=(1,1) EXEC PGM=PGM01 000003 //STEP1 000004 //OUTPUT1 DD DISP=(NEW,PASS),

000005 000006 000007 000008 000009 000010 000011 000012

// // //

RECFM=FB,LRECL=234, SPACE=(CYL,(1,1),RLSE)

//STEP2

EXEC PGM=PGM02

//STEPLIB //INPUT2

DD

//OUTPUT2

// 000013 // 000014 // 000015 // ******

UNIT=SYSDA,

DSN=UWIN.SCHULUNG.LOAD,DISP=SHR DSN=*.STEP1.OUTPUT,DISP=(OLD,DELETE) DD DSN=UWIN.SCHULUNG.TESTDAT.OUTPUT2, DISP=(NEW,CATLG,DELETE), DD

UN IT=PRMDSK,

DCB=*.STEP1.OUTPUT1, SPACE=(CYL,(1,1),RLSE)

****************************

BOTTOM OF DATA

***************************

erfolgt ein Rückbezug auf den DSN von OUTPUT1 in Stepl. Dies scheint für diesen DD-Namen wurde der DSN-Parameter weggelassen. In diesem denn erstaunlich, Fall generiert MVS einen Namen und zwar nach folgendem Muster: In diesem Fall

SYS90 0 03.TO91524.RDOOl.UWIN.RO0 00 0 001 Im ersten Level

folgt auf SYS das julianische Datum. Auf T folgt die Zeit, zu der JES2 initialisiert wurde. RD001 ist die Kennung des verwendeten Readers. Darauf folgt die USERID und schließlich eine laufende Nummer, die eins steht für das erste im Job erzeugte temporäre Dataset. Für jedes neue wird diese Zahl um eins erhöht. Damit ist die Eindeutigkeit des Namens sichergestellt. Rückbezüge auf vorhergehende Steps funktionieren Bezug genommen wird, auch ausgeführt wurde.

nur

dann,

wenn

der

Step, auf den

DISP=(,PASS) für temporäre Datasets Für die im vorhergehenden Abschnitt verwendeten temporären Datasets wurde im DISPParameter (,PASS) angegeben. Über die Verwendung bei nicht-temporären Datasets wurde bereits gesprochen. Da die Dispositionen KEEP und CATLG für temporäre Datasets nicht zugelassen sind, kann eine Weiterverwendung in einem Folge-Step nur mit DISP=(,PASS) ermöglicht werden. Im

Folge-Step muß das gepasste Dataset angenommen werden und gelöscht oder nochmals gepassed werden. Werden temporäre Datasets gepassed und nicht angenommen, so erfolgt die Löschung durch die Job Termination-Routinen.

112

MVS/ESA JCL

Sollen temporäre Datasets annehmenden Step

am

Ende des annehmenden

Steps gelöscht werden,

so

ist im

DISP=(OLD,DELETE) anzugeben. Falls sie in einem weiteren können sie mit:

Folge-Step

weiterverarbeitet werden

sollen,

so

DISP=(OLD,PASS) nochmals weitergegeben werden. Das OLD muß in beiden Fällen annehmen würde. Das

stehen, keinesfalls ein Komma, das den Default NEW

folgende Beispiel zeigt eine typische Verwendung temporärer Datasets:

//STEP1 //OUTPUT1 // // // // //STEP2 //INPUT //STEP3 //INPUT

EXEC PGM=PGM01 DD DSN=&&TEMPDAT,

DISP=(NEW,PASS), UNIT=SYSDA, RECFM=FB,

SPACE=(CYL, (1,1) ,RLSE) EXEC PGM=PGM02 DD

DSN=&&TEMPDAT,DISP=(OLD,PASS)

EXEC PGM=PGM03 DD

DSN=&&TEMPDAT,DISP=(OLD,DELETE)

Bei dieser Art JCL können keinerlei Probleme entstehen. &&TEMPDAT wird in STEP1 erzeugt, von STEP2 angenommen und an STEP3 übergeben, wo es angenommen und wieder gelöscht wird.

UNIT und

temporäre Datasets

Temporäre Datasets existieren bloß für die Zeit des Joblaufs. Der von ihnen eingenommene spätestens zu diesem Zeitpunkt wieder frei. Daher dürfen temporäre Datasets auf Plattenpools angelegt werden, die für permanente Datasets üblicherweise nicht zugelassen Platz wird

sind. In fast jeder MVS-Installation gibt es einen Plattenpool mit dem Namen SYSDA. Mit diesem Gruppennamen wird ein Pool sogenannter Work-Datasets angesprochen. Wenn man sich angewöhnt, bei der Benutzung temporärer Datasets:

UNIT=SYSDA

113

JCL

anzugeben, so macht man mit Sicherheit nichts falsch.

Mögliche Probleme bei der Benutzung temporärer Datasets großen Vorteile des Benutzung temporärer Datasets ist die Tatsache, daß Plattenplatz bei Beendigung des Steps sofort wieder freigegeben werden kann. Der Performancevorteil, der durch das Nicht-Katalogisieren entsteht, ist dagegen unbedeutend. Probleme können entstehen, wenn sich Unachtsamkeiten im Umgang mit symbolischen Eine der

DSNs einschleichen oder der Job nach einem Abbruch mit RESTART neu laufen soll.

Nicht-eindeutige symbolische DSNs Es wurde bereits ausgeführt, daß man bei der Benutzung symbolischer DSNs auf Eindeutigkeit achten sollte. Das folgende Beispiel soll demonstrieren, was passieren kann, wenn man sich an diese Regel nicht hält.

//STEP1 //OUTPUT1 // // // // // //STEP2 //INPUT2 //OUTPUT2 // // // // //STEP3 //INPUT3

EXEC PGM=PGM01 DD DSN=&&TEMPDAT,

DISP=(NEW,PASS), UNIT=SYSDA, RECFM=FB, LRECL=234,

SPACE=(CYL,(1,1),RLSE) EXEC PGM=PGM0 2,COND=(4,LT,STEP1) DD DSN=&&TEMPDAT,DISP=(OLD,DELETE) DD DSN=&&TEMPDAT,DISP=(,PASS), UNIT=SYSDA, RECFM=FB, LRECL=234,

SPACE=(CYL,(1,1),RLSE) EXEC PGM=PGM03 DD DSN=&&TEMPDAT,DISP=(OLD,DELETE)

Die vorstehende JCL ist syntaktisch völlig korrekt. Was aber passiert, wenn STEP1 einen Return Code von 4 zurück gibt? Dann wird STEP2 nicht ausgeführt. STEP3 aber wird ausgeführt. Nur erhält er als Input nicht den Output von STEP2, sondern den von STEP1. Fehler treten wahrscheinlich keine auf, da auch der DCB von OUTPUT 1 und OUTPUT2 identisch ist. Der Job kann völlig normal durchlaufen, wenn auch mit den falschen Daten. Wären, wie im folgenden Beispiel, eindeutige symbolische Namen verwendet worden, wäre es in jedem Fall zu einem Fehler gekommen:

MVS/ESA JCL

114

//STEP1 //0UTPUT1 // // // //

EXEC PGM=PGM01 DD DSN=&&TEMP1,

DISP=(NEW,PASS), UNIT=SYSDA, RECFM=FB,LRECL=234,

SPACE=(CYL,(1,1),RLSE) PGM=PGM02,COND=(4,LT,STEP1) DSN=&&TEMP1,DISP=(OLD,DELETE) DSN=&&TEMP2,DISP=(,PASS),

//STEP2 //INPUT2 //OUTPUT2 // // // //STEP3 //INPUT3

UNIT=SYSDA, RECFM=FB,LRECL=234,

Wird STEP2 nicht

ausgeführt,

Fehlermeldung: IEF212I

EXEC DD DD

SPACE=(CYL, (1,1) ,RLSE) EXEC PGM=PGM03 DD

DSN=&&TEMP2,DISP=(OLD,DELETE) so

JOBNAME

kommt

es

bei der

STEP3

Ausführung

von

STEP3

zu

folgender

INPUT3 -

DATA SET NOT FOUND

RESTART und

temporäre Datasets

Jobs, die für die Produktion bestimmt sind, sollten grundsätzlich

so geschrieben sein, daß der Job im Falle eines Abbruchs nach der Fehlerbehebung mit RESTART neu gestartet werden kann. Mit RESTART wird normalerweise auf dem Step aufgesetzt, bei dem der Abbruch erfolgte. Wird in Jobs mit temporären Datasets gearbeitet, so ist große Vorsicht bei der Benutzung von RESTART geboten.

//STEP14 //OUTPUT1 // // // //

EXEC PGM=PGM01 DD

DSN=&&TEMPDAT,

DISP=(NEW,PASS), UNIT=SYSDA, RECFM=FB,LRECL=234

,

SPACE=(CYL, (50,5) ,RLSE)

115

JCL

//STEP15 //INPUT2 //0UTPUT2 // // // //

DD

PGM=PGM02,COND=(4,LT,STEP1) DSN=&&TEMPDAT,DISP=(OLD,DELETE)

DD

DSN=UWIN.SCHULUNG.OUTPUT,

EXEC

DISP=(,PASS), UNIT=SYSDA, RECFM=FB,LRECL=2265,

SPACE=(CYL, (500,100) ,RLSE)

vorhergehenden Beispiel wird im STEP 14 ein großes Output Dataset erzeugt, das als Input für STEP2 dient. STEP2 seinerseits erzeugt ein noch größeres Output Dataset. Kommt es jetzt bei STEP 15 zu einem Abbruch, z.B. weil der für OUTPUT2 zu allokierende Platz nicht ausreicht, so ist auch das in STEP1 erzeugte Dataset verloren, da es von den Job Termination-Routinen gelöscht wird. In diesem Fall ist ein Restart nur ab STEP 14 möglich. Dieser Step kann aber wegen des großen Outputs sehr zeitintensiv sein. Wäre das Dataset in STEP 14 katalogisiert worden, hätte der Restart ab STEP 15 erfolgen können. Grundsätzlich gilt: Wenn mit dem Parameter RESTART gearbeitet werden soll, so kann die Benutzung temporärer Datasets nicht empfohlen werden. In solchen Fällen ist es besser, die Datasets zu katalogisieren. Um zu verhindern, daß diese Datasets, die ja nach Job-Ende nicht mehr benötigt werden, Plattenplatz wegnehmen, sollte am Ende des Jobs ein Step laufen, der diese Datasets wieder löscht. Dies wird an folgendem Beispiel gezeigt: Im

//STEP14 //OUTPUT1 // // // // Das

EXEC PGM=PGM01 DD

DSN=UWIN.OUTPUTl,

DISP=(NEW,CATLG,DELETE), UNIT=SYSDA, RECFM=FB,LRECL=234,

SPACE=(CYL, (50,5) ,RLSE)

Beispiel wird auf der folgenden Seite fortgesetzt.

MVS/ESA JCL

116

11STEP15 //INPUT2 //OUTPUT2 // // // // //CLEARCAT //SYSPRINT //SYSIN DELETE DELETE

EXEC PGM=PGM02,COND=(4,LT,STEP1) DD DSN=UWIN.0UTPUT1,DISP=0LD DD

DSN=UWIN.OUTPUT2,

DISP=(,CATLG,DELETE), UNIT=SYSDA, RECFM=FB,LRECL=234,

SPACE=(CYL, (100,10) ,RLSE) EXEC PGM=IDCAMS DD SYSOUT=* DD

*

(UWIN.OUTPUT1) (UWIN.OUTPUT2)

Alternativ dazu kann auch die

//STEP14 //OUTPUT1 // // // // //STEP15 //INPUT2 // //OUTPUT2 // // // //

Disposition im STEP 15 angepaßt werden.

EXEC PGM=PGM01 DD DSN=UWIN.OUTPUT1,

DISP=(NEW,CATLG,DELETE), UNIT=SYSDA, RECFM=FB,LRECL=234

,

SPACE=(CYL, (50,5) ,RLSE) EXEC PGM=PGM02,COND=(4,LT,STEP1) DD

DSN=UWIN.OUTPUTl,

DISP=(OLD,DELETE,KEEP) DD

DSN=UWIN.OUTPUT2,

DISP=(,CATLG,DELETE), UNIT=SYSDA, RECFM=FB,LRECL=234

,

SPACE=(CYL, (100,10) ,RLSE)

Das Dataset UWIN.OUTPUT1 wird im STEP 14 katalogisiert. Sie dient nur als INPUT für STEP 15 und wird danach nicht mehr benötigt. Das heißt, im Normalfall soll dieses Dataset beim Ende vom STEP 15 gelöscht werden, im Falle eines Abbruchs von STEP 15 aber behalten werden. In diesem Fall wird INPUT 1 nur dann gelöscht, wenn STEP 15 normal endet. Bricht STEP 15 ab, so wird die abnormale Disposition KEEP wirksam und das Dataset wird behalten. Dies ist eine der wenigen Fälle, wo KEEP als abnormal-disp explizit angegeben

117

JCL

angegeben worden, so würde der Default (OLD,DELETE,DELETE) gelöscht. Die zuletzt aufgezeigte Möglichkeit hat den Vorteil, daß der Plattenplatz bereits beim StepEnde und nicht wie im Beispiel zuvor erst bei Job-Ende freigegeben wird. werden muß und auch sinnvoll ist. Wäre

es

nicht

angenommen und das Dataset würde

2.7

Die OUTPUT JCL-Anweisung

Syntax:

//feldname OUTPUT parameter.parameter,... Output JCL-Anweisung kann in Zusammenhang mit SYSOUT-Datasets (Spool Datasets) verwendet werden. Sie macht vor allen Dingen dann Sinn, wenn man sich die ständige Wiederholung von Parametern bei der Benutzung DD SYSOUT-Anweisungen

Die

ersparen will. Die OUTPUT-Anweisung kann mit einem Rückbezug (referback) angesprochen werden, es gibt jedoch auch die Möglichkeit, mit Hilfe des DEFAULT=YES-Parameters die Übernahme der dort abgelegten Angaben für alle folgenden DD SYSOUT-Anweisungen zu

erzwingen. Beispiel:

//STEP1 //FORM1 //SYSPRINT

//STEP2 //SYSPRINT

EXEC PGM=P0001 OUTPUT COPIES=3 DD

SYSOUT=*,OUTPUT=*.FORM1

EXEC PGM=P0002 DD

SYSOUT=*,OUTPUT=*.STEP1.FORM1

In diesem Beispiel nimmt der SYSPRINT in STEP1 einen Bezug auf die im gleichen Step verwendete OUTPUT-Anweisung. Im STEP2 wird für SYSPRINT ebenfalls Bezug auf die OUTPUT-Anweisung von STEP1 genommen. Da dies aber bereits ein zurückliegender Step ist, muß der Stepname im Rückbezug mit angegeben werden. Dies ist auf Dauer sehr umständlich. Daher gibt es den DEFAULT=YES-Parameter, der diese Arbeit abnimmt. Er gilt für alle SYSOUT-Datasets, solange keine neue OUTPUTAnweisung mit DEFAULT=YES gesetzt wird.

MVS/ESA JCL

118

//UWINUEB2 JOB OUTPUT COPIES=3,DEST=U03 02, //FORM1 DEFAULT=YES,CLASS=A // EXEC PGM=P0 0 01 //STEP1 //SYSPRINT DD SYSOUT=* ...

//STEP2 //SYSPRINT

EXEC PGM=P0002 DD SYSOUT=*

Da DEFAULT=YES angegeben wurde, wird der SYSPRINT Output in beiden Steps dreimal gedruckt und auf den Drucker U0302 gelegt. Sollen Parameter der OUTPUT-

Anweisung überschrieben werden, so geschieht dies Parameters in der DD SYSOUT-Anweisung.

durch die

Angabe des entsprechenden

//UWINUEB2 JOB OUTPUT COPIES=3,DEST=U0302, //FORM1 DEFAULT=YES,CLASS=A // EXEC PGM=P0001 //STEP1 //SYSPRINT DD SYSOUT=* .

//STEP2 //SYSPRINT

.

.

EXEC PGM=P0002 DD

SYSOUT=*,COPIES=2

In diesem Fall wird der SYSPRINT

von

STEP2

wichtigsten Parameter der OUTPUT wiedergegeben. Für eine vollständige Handbücher verwiesen. Die

nur

zweimal

gedruckt.

JCL-Anweisung werden auf den folgenden Seiten Übersicht wird auf die entsprechenden IBM-

ADDRESS Syntax:

ADDRESS=('Lieferadresse,..., Lieferadresse') Mit ADDRESS können 4 Zeilen zu 60 Zeichen als Lieferadresse angegeben werden. Sie erscheinen auf den Trennblättern, die am Beginn jedes Outputs gedruckt werden.

119

JCL

BUILDING Syntax:

BUILDlNG='Gebäudename' Wie auch ADDRESS, so erscheint BUILDING auf der allerersten Seite des Es steht eine Zeile mit 60 Zeichen zur Verfügung.

Druckoutputs.

CLASS Syntax:

CLASS=outputklasse Durch die Angabe von CLASS kann eine bestimmte Output-Klasse verwendet werden. Der Parameter darf nicht mit dem CLASS-Parameter der JOB-Anweisung verwechselt werden. Wird nichts oder CLASS=* angegeben, so wird der bei MSGCLASS angegebene Wert übernommen.

Erfolgt

eine

Angabe,

muß bei der SYSOUT

so

DD-Anweisung Folgendes angegeben

werden:

//SYSPRINT

DD

SYSOUT=(,),OUTPUT=*.FORM1

Es handelt sich dann um eine sogenannte Null

SYSOUT-Anweisung.

COPIES Syntax: COPIES=nnn Damit läßt sich die Zahl der Kopien

DEFAULT Syntax:

DEFAULT=YES/NO

angeben. Maximal 255

sind

zulässig.

120

MVS/ESA JCL

Wird DEFAULT=YES gesetzt, so gelten die Angaben in dieser OUTPUT-Anweisung für alle folgenden SYSOUT-Datasets. Der eingestellte Default bleibt bis zum Auftauchen einer neuen OUTPUT-Anweisung mit DEFAULT=YES gültig.

DEPT Syntax:

DEPT='Abteilungsname' Mit DEPT läßt sich der Abteilungsname auf dem Trennblättern Zeile mit 60 Zeichen zur Verfügung.

ausgeben.

Es steht eine

DEST Syntax:

DEST=RDnnnn oder Unnnn Mit DEST=Unnnn kann eine angegeben werden.

logische,

mit DEST=RDnnnn eine

physische Druckeradresse

NAME Syntax:

NAME='name* Dient der Angabe des Namens einer Zeile mit 60 Zeichen zur Verfügung.

Person, die den Output erhalten soll. Es steht eine

ROOM Syntax:

ROOM='raumbezeichnung' Dient der

Verfügung.

Angabe

einer

Raumbezeichnung.

Es steht eine Zeile mit 60 Zeichen

zur

JCL

121

TITLE Syntax: TITLE='titel' Dient der Angabe eines Titels auf den Trennblättern. Es steht eine Zeile mit 60 Zeichen

Verfugung.

zur

3

JCL-Prozeduren

Anwendungsprogrammierer müssen in fast allen MVS-Installationen JCL-Prozeduren benutzen, um Programme kompilieren und linken (evtl. auch ausführen) zu können. Um diese Prozeduren optimal nutzen zu können, müssen bestimmte Kenntnisse über die Funktionsweise

JCL-Prozeduren vorhanden sein. Darüber hinaus können auch eigene Prozeduren schreiben. Dies kann Testabläufe erheblich verkürzen und vereinfacht auch die Übernahme von Programmen in die Produktion. von

Anwendungsprogrammierer

Prozeduren sind nichts anderes als Stücke vorgefertigter JCL, die häufig benutzt werden. Anders als in 'normaler' JCL, dürfen in Prozeduren Variable benutzt werden. Sie werden hier meist als symbolische Parameter bezeichnet. Zusätzlich besteht die Möglichkeit, EXEC- und DD-Anweisungen zu ergänzen bzw. zu überschreiben. Dies geht in allen Prozeduren, auch solchen, die keine Variable enthalten. Wir werden uns im Rahmen dieses 1.

Kapitels mit folgenden Fragen befassen:

2.

Wie benutze ich vorhandene Prozeduren? Wie kann ich vorhandene Prozeduren meinen Bedürfhissen

3.

Wie kann ich vorhandene Prozeduren

4.

Wie kann ich

anpassen?

ergänzen?

eigene Prozeduren schreiben? 5. Wie kann ich mit eigenen Prozedurbibliotheken arbeiten? Solange Ihnen die Version 4 von MVS/ESA noch nicht zur Verfugung steht, können Sie nur die im System definierten Prozedurbibliotheken beim Aufruf katalogisierter Prozeduren nutzen. Das Absuchen von Ladebibliotheken, auf denen Programme stehen, läßt sich durch die STEPLIB- oder JOBLIB DD-Anweisung steuern. Bei Prozedurbibliotheken wird erst mit der Version 4 von MVS/ESA ein entsprechender Mechanismus eingeführt. Beim Aufruf einer Prozedur wird die SYS1.PROCLIB und die mit ihr verbundenen Bibliotheken abgesucht. Um andere Bibliotheken abzusuchen, muß die Initialisierung des JES entsprechend angepaßt werden. Mit der Einführung der Version 4 von MVS/ESA wird die Möglichkeit gegeben, private Prozedurbibliotheken zu benutzen. Dies stellt einen bedeutenden Fortschritt dar, weil die Testumgebung dann mit der Produktionsumgebung identisch ist. In-Stream-Prozeduren brauchen dann nicht mehr verwendet werden.

MVS/ESA JCL

124

Arten Es

von

Prozeduren

gibt zweierlei Arten von Prozeduren:

1.

In-Stream-Prozeduren

2.

Katalogisierte Prozeduren

In-Stream-Prozeduren sehen fast aus wie normale JCL, mit Ausnahme einiger zusätzlicher Parameter. Sie eignen sich besonders für Testzwecke. Der Aufruf und die Prozedur selber befinden sich innerhalb der JCL. Daher auch die Bezeichnung 'In-Stream'.

Katalogisierte Prozeduren werden als" Member einer oder mehrerer Bibliotheken gespeichert. In jeder MVS-Installation ist die SYS1.PROCLIB vorhanden. Daneben können der Systemprogrammierung weitere Prozedurbibliotheken definiert werden. von Erkundigen Sie sich, wie diese Bibliotheken bei Ihnen heißen. Katalogisierte Prozeduren können mit der EXEC PROC-Anweisung aufgerufen werden. Es ist dann nur der Name des Members anzugeben, in dem die Prozedur enthalten ist. Prozeduren werden meist als In-Stream-Prozeduren entwickelt. Fertige und ausgetestete Prozeduren werden 'katalogisiert', d.h. sie kommen als Member auf eine der oben angegebenen Bibliotheken. Prozeduren besitzen gegenüber normaler JCL einige syntaktische Besonderheiten:

3.

Prozeduren dürfen weder eine JOB-Anweisung noch eine Delimiter-Anweisung (/* ) oder Leer-Anweisung (//) enthalten. Die JOBLIB DD- und JOBCAT DD-Anweisungen dürfen nicht innerhalb von Prozeduren verwendet werden. Die Anweisung DD * sowie DD DATA dürfen nicht verwendet werden.

4.

In Prozeduren dürfen keine JES2-Konfrollkommandos verwendet werden.

5.

Bis zur Einführung von MVS/ESA Version 4 dürfen Prozeduren ihrerseits keine weiteren Prozeduren aufrufen. Aus Prozeduren heraus dürfen maximal 15 weitere Prozeduren aufgerufen werden (erst ab MVS/ESA Version 4).

1. 2.

6.

3.1

Benutzung katalogisierter Prozeduren

Katalogisierte

Prozeduren werden in mehreren Systembibliotheken, u.a. in der SYS1.PROCLIB vorgehalten. Sie können von jedem MVS-Benutzer aufgerufen werden. Der Aufruf geschieht in einer EXEC-Anweisung:

Syntax: EXEC

[PROC=]procname

125

JCL-Prozeduren Prozeduren können einfach durch die Angabe von EXEC procname aufgerufen Schlüsselwort PROC ist optional.

werden, das

Anhand einer Prozedur COBCL, die COBOL-Programme kompiliert und linkt und so oder so ähnlich auch bei Ihnen installiert sein kann, soll die Benutzung vorhandener Prozeduren erläutert werden. Ein Problem bei der Benutzung katalogisierter Prozeduren ist die Tatsache, daß man die dahinter steckende JCL nicht ohne weiteres sehen kann. Zwar kann man in das Member schauen, das die Prozedur enthält, doch können in ihm symbolische Parameter enthalten sein, die vor der Ausführung der Prozedur ersetzt werden. Zudem können beim Aufruf Veränderungen oder Hinzufügungen vorgenommen werden. Prozeduren sollte man sich daher im IOF-Menü anschauen. Wenn man verhindern will, daß die Prozedur ausgeführt wird, kann man in der JOB-Anweisung den Parameter TYPRUN=SCAN setzen. Auf diese Weise kann man zumindest den Zustand nach der Ersetzung von Variablen sehen. Leider gibt es keine Möglichkeit, die aktive JCL sichtbar zu machen, die nach Hinzufügungen oder Veränderungen wirksam wird. Bevor wir die JCL nach der Ersetzung betrachten, zunächst einmal ein typischer Aufruf der COBCL-Prozedur: edit-uwin.schulung.cntl(cl)

01.14

.

-

command

===>

columns 001 072 scroll ===> page

******

*****************************

000001 000002 000003 000004 000005 000006 000007

//uwinc job (998,abtdg02),1m.winter 1,class=a,notify=uwin, // msgclass=y,msglevel=(1,1) exec pr0c=c0bcl //step1 dd dsn=uwin.schulung.cobol(pgm05) ,disp=shr //cob.sysin //lked.syslmod dd dsn=uwin.schulung.load,disp=shr dd * //lked.sysin

******

****************************

name

Top of data

*****************************

pgm05(r)

Lassen Sie sich durch das, noch erläutert werden. Die Compile- und Aussehen:

was

bottom of data

auf den Zeilen 4-7

Link-Prozedur, die in

unserem

***************************

angegeben ist, nicht verwirren. Es wird

Beispiel aufgerufen wird,

hat

folgendes

MVS/ESA JCL

126 01.14

EDIT-USER.PROCLIB(COBCL)

.

-

COMMAND

===>

COLUMNS 001 072 SCROLL ===> PAGE

*****************************

******

*****************************

000001 000002 000003 000004 000005 000006 000007 000008 000009 000010 000011 000012 000013 000014 000015 000016 000017 000018 000019 000020 000021 000022 000023 000024 000025 000026 000027 000028 000029 000030 000031 000032 000033

PROC ADV=,BUF=4K,DATA=31,DYNAM=,FDUMP=,FLAG=1 I,E1,LIB=,LN=68, //COBCL LIST=,LITCHAR=,MAP=,NUMPROC=NOPFD,OFFSET=,OPT=NOOPT,RES=, // RENT=,SEQ=NOSEQ,SSRANGE=,TEST=,TRUNC=STD,VBREF=,XREF=,ZWB=, // // OUT='*',VAL1=,VAL2= EXEC PGM=IGYCRCTL,C0ND=(8,LE), //COB PARM=(&ADV,IBUF(&BUF)',,DATA(&DATA),,&DYNAM,&FDUMP, // •F(&FLAG),,&LIB,ILC(&LN),,&LIST,&LITCHAR,&MAP, // 'NUMPROCC&NUMPROC)1,&OFFSET,&OPT,&RENT,&RES,&SEQ, // &SSRANGE.&TEST,'TRUNC(&TRUNC)',&VBREF,&XREF,&ZWB) // //STEPLIB DD DSN=SYS1.COB2COMP,DISP=SHR //SYSPRINT DD SYSOUT=&OUT

******

****************************

//SYSPUNCH //SYSUT1 //SYSUT2 //SYSUT3 //SYSUT4 //SYSUT5 //SYSUT6 //SYSUT7 //SYSLIN // //SYSIN //LKED // //SYSLIB // // // //SYSLIN //

Top OF DATA

DD

DUMMY,SYSOUT=B

DD

UNIT=SYSDA,SPACE=(CYL,(1,1))

DD UN IT=SYSDA,SPACE=(CYL,(1,1))

DD

IT=SYSDA,SPACE=(CYL,(1,1)) UNIT=SYSDA,SPACE=(CYL,(1,1)) UN IT=SYSDA,SPACE=(CYL,(1,1)) UNIT=SYSDA,SPACE=(CYL,(1,1)) UN IT=SYSDA,SPACE=(CYL,(1,1))

DD

DSN=&&LOADSET,DISP=(NEW,PASS),UNIT=SYSDA,

DD UN DD

DD DD

SPACE=(TRK,(3,3)),DCB=BLKSIZE=3200 DSN=&&LIBRA,DISP=(OLD,DELETE) EXEC PGM=IEWL,COND ((5,LT,COB),(8, LE)),

DD

=

DD

PARM=ILIST,XREF,LET,SIZE=(&VAL1,&VAL2)1 DSN=SYS1 .COB2LIB,DISP=SHR DSN=IMS.S2.PGMLINK,DISP=SHR

DD

DSN=USER.LOADLIB,DISP=SHR

DD

DSN=SYS1.ROUT874,DISP=SHR DSN=&&LOADSET,DISP=(OLD,DELETE)

DD

DD

DD DDNAME=SYSIN

//SYSLMOD DD DSN=USER.LOADLIB,DISP=SHR DD UN IT=SYSDA,SPACE = (TRK,(50,5)) //SYSUT1 //SYSPRINT DD SYSOUT=&OUT BOTTOM OF DATA

***************************

Weder die JCL, die die Prozedur aufruft, noch das Member, das die Prozedur enthält, geben wieder, was eigentlich geschieht. Aufschluß bringt erst der Zustand, der zur Laufzeit aktiv wird. Ihn kann

man

zumindest teilweise in der JCL des IOF sehen.

127

JCL-Prozeduren ****************************

xoP OF DATA

*******************************

1 //UWINC JOB (998,ABTDG02),'M.WINTER1,CLASS=A,NOT IFY=UWIN,MSGCLASS=Y MSGLEVEL=(1,1),USER=UWIN // EXEC PROC=COBCL 2 //STEP1 PROC OUT='*',VAL1=,VAL2= 3 XXCOBCL EXEC PGM=IGYCRCTL,COND=(8,LE), 4 XXCOB PARM='N00PT' XX 5 XXSTEPLIB DD DSN=SYS1.COB2COMP,DISP=SHR 6 XXSYSPRINT DD SYSOUT=&OUT SYSOUT=* IEF653I SUBSTITUTION JCL 7 XXSYSPUNCH DD DUMMY,SYSOUT=B -

8 9 10 11 12 13 14 15

XXSYSUT1 XXSYSUT2 XXSYSUT3 XXSYSUT4 XXSYSUT5 XXSYSUT6 XXSYSUT7

DD

XXSYSLIN

DD

DD DD DD DD DD

DD

UNIT=SYSDA,SPACE=(CYL, UNIT=SYSDA,SPACE=(CYL, UNIT=SYSDA,SPACE=(CYL, UNIT=SYSDA,SPACE=(CYL, UNIT=SYSDA,SPACE=(CYL, UNIT=SYSDA,SPACE=(CYL, UNIT=SYSDA,SPACE=(CYL, DSN=&&LOADSET,DISP=(NEW PASS),UNIT=SYSDA,

SPACE=(TRK,(3,3)),DCB=B

XX

KSIZE=3200

DD DSN=UWIN.SCHULUNG.COBOL(PGM05),DISP=SHR 16 //COB.SYSIN DD DSN=&&LIBRA,DISP=(OLD,DELETE) X/SYSIN EXEC PGM=IEWL,COND=((5,LT,COB),(8,LE)), 17 XXLKED

PARM='LIST,XREF,LET,SIZE=(&VAL1,&VAL2)'

XX

IEF653I SUBSTITUTION JCL

PARM=1 LI ST,XREF,LET,SIZE=(,)1 DSN=SYS1.COB2LIB,DISP=SHR DSN=IMS.S2.PGMLINK,DISP=SHR DSN=USER.LOADLIB,DISP=SHR DSN=SYS1.R0UT874,DISP=SHR DSN=&&LOADSET,DISP=(OLD,DELETE) -

18 XXSYSLIB 19 XX 20 XX 21 XX 22 XXSYSLIN

DD

DD DD DD DD

DD DDNAME=SYSIN 23 XX 24 //LKED.SYSLMOD DD DSN=UWIN.SCHULUNG.LOAD,DISP=SHR X/SYSLMOD DD DSN=USER.LOADLIB,DISP=SHR DD UNIT=SYSDA,SPACE=(TRK,(50,5)) 25 XXSYSUT1 26 XXSYSPRINT DD SYSOUT=&OUT IEF653I SUBSTITUTION JCL SYSOUT=* DD * 27 //LKED.SYSIN ******************************** BOTTOM OF DATA ******************************** -

Die Ausgabe umfaßt sowohl die JCL, mit denen die Prozedur aufgerufen wurde, als auch die der Prozedur. Die Herkunft der Anweisungen läßt sich am Identifikationsfeld erkennen. JCL-Anweisungen, mit der die Prozedur aufgerufen wurde, beginnen mit der Zeichenfolge '//'. JCL-Anweisungen der Prozedur selber beginnen mit 'XX'. Daneben gibt es noch die Zeichenfolge 'X/', die eine JCL-Anweisung der Prozedur markiert, die durch den Aufruf

128

MVS/ESA JCL

verändert wurde. Eine Übersicht über die verschiedenen Identifikationsfelder befindet sich auf der folgenden Seite. Im oben angegebenen Beispiel stammen die Anweisungen mit den Nummern 1,2, 16, 24 und 27 aus der aufrufenden JCL. Zeile 16 und 24 wurden geändert. Zeile 27 wurde

hinzugefügt.

Die Prozedur COBCL besteht aus zwei Steps: COB und LKED. Im Step COB wird das Quellprogramm kompiliert. Der Input für den Step COB, d.h. das COBOL Quellprogramm, wird unter dem DD-Namen SYSIN angesprochen. Der kompilierte Code wird in das temporäre Dataset &&LOADSET gestellt und dem Step LKED übergeben. Im Step LKED wird das Programm gelinkt und würde normalerweise auf die USER.LOADLIB gestellt. In diesem besonderen Fall wurde jedoch die SYSLMOD DDAnweisung geändert und das ausführbare Programm wird als Member auf die Bibliothek UWIN.SCHULUNG.LOAD gestellt.

Identifikationsfelder in Identifikation

katalogisierten Prozeduren: Bedeutung normale

JCL-Anweisung der aufrufenden JCL

XX

JCL-Anweisung der Prozedur bzw. fortgesetzte Anweisung

XI

beim Aufruf modifizierte

XX*

JCL-Anweisungen

JCL-Anweisung der Prozedur

der Prozedur, die in Kommentare

umgesetzt wurden (meist Hinweis auf Fehlerfall) Kommentare bzw. JES2

Kontrollanweisungen

Bis auf die Zeichenfolge XX* erkennen wir alle in der COBCL-Prozedur wieder. Werden Zeilen modifiziert, so steht die beim Aufruf übergebene Modifikation, die mit // beginnt, eine Zeile über der in der Prozedur vorhandenen Anweisung, die mit X/ beginnt (siehe

Anweisung 24).

Katalogisierte Prozeduren auf privaten Bibliotheken Mit der Einführung von MVS/ESA Vers. 4 besteht die Möglichkeit, katalogisierte Prozeduren auf private Bibliotheken zu stellen. Um diese Möglichkeit nutzen zu können, muß mit der JCLLIB-Anweisung gearbeitet werden.

129

JCL-Prozeduren

Die JCLLIB-Anweisung Syntax:

ORDER=(dsname,dsname,...,dsname)

// JCLLIB

Unter MVS/ESA Version 4 wird die

möglich, private

JCLLIB-Anweisung verfügbar werden.

Prozedurbibliotheken

zu

Mit ihr ist es definieren. Der Mechanismus ähnelt dem der

JOBLIB- und

STEPLIB-DD-Anweisungen. JCLLIB-Anweisung listet die Bibliotheken auf, die bei den EXEC PROCAnweisungen zu durchsuchen sind. Pro Job darf nur eine JCLLIB-Anweisung verwendet werden. Sie muß zwischen der JOB und der ersten EXEC-Anweisung stehen. Sie enthält Die

einen oder mehrere DSNs

von

Bibliotheken.

Beispiel: JOB (998,ABTDG02),CLASS=A,MSGCLASS=Y //UWINPROC // JCLLIB ORDER=(UWIN.SCHULUNG.PROCLIB,USER.PROCLIB)

//STEP1_EXEC TESTPROC_ Bei der obigen Angabe werden die beiden Bibliotheken in der angegebenen Reihenfolge nach einem Member namens TESTPROC durchsucht. Die SYS 1.PROCLIB wird nicht durchsucht! Falls dies geschehen soll, so muß auch ihr DSN in die Liste der DSNs aufgenommen werden.

Soll eine

JCLLIB-Anweisung fortgesetzt werden, so gilt:

1.

erste Zeile nach einem Komma beenden und

2.

auf der Fortsetzungszeile zwischen

Spalte 4 und

16

beginnen.

JOB (998,ABTDG02),CLASS=A,MSGCLASS=Y //UWINPROC // JCLLIB 0RDER=(UWIN.SCHULUNG.PROCLIB,USER.PROCLIB, // SYSUSER1.PROCLIB,SYSUSER2.PROCLIB)

//STEP1

EXEC

TESTPROC_

Möglichkeiten der Anpassung Beim Anpassen 1. 2.

3.

4.

von

Prozeduren gibt es

grundsätzlich vier Möglichkeiten:

EXEC- oder

DD-Anweisungen der Prozedur sollen abgeändert werden. Es sollen zusätzliche DD-Anweisungen aufgenommen werden. Parameter von EXEC- oder DD-Anweisungen der Prozedur sollen ungültig gemacht werden. Es sollen in einer Prozedur mit mehreren Steps sowohl Anweisungen zusätzliche Anweisungen aufgenommen werden.

geändert als auch

MVS/ESA JCL

130

Ändern von EXEC-Anweisungen In Prozeduren können EXEC- und DD-Anweisungen geändert werden (JOB-Anweisungen dürfen in Prozeduren nicht auftauchen). Das Ändern einer EXEC-Anweisung erfolgt nach

folgendem Schema: Syntax:

parameter.procstepname=wert Der

zu

ändernde Parameter wird als Teil der EXEC

Ändern einer EXEC-Anweisung soll auch

am

erläutert werden:

01.16

EDIT-UWIN.SCHULUNG.CNTL(CL)

Beispiel

Dieses des Aufrufs der COBCL-Prozedur

PROC-Anweisung kodiert.

.

-

COMMAND ******

===> *****************************

T0p OF DATA

COLUMNS 001 072 SCROLL ===> PAGE

*****************************

000001 //UWINC JOB (998,ABTDG02),'M.WINTER',CLASS=A,NOTIFY=UWIN, 000002 // MSGCLASS=Y,MSGLEVEL=(1,1) EXEC PROC=COBCL,TIME.COB=(0,5) 000003 //STEP1 000004 //COB.SYSIN DD DSN=UWIN.SCHULUNG.C0B0L(PGM05),DISP=SHR

000005 //LKED.SYSLMOD DD DSN=UWIN.SCHULUNG.LOAD,DISP=SHR 000006 //LKED.SYSIN DD * NAME PGM05(R) 000007 ****** **************************** BOTTOM OF DATA ***************************

Zeile 3 des Aufrufs wurde ergänzt:

//STEP1

EXEC

PROC=COBCL,TIME.COB=(0,5)

Durch diese Angabe wird für die EXEC-Anweisung im Step COB der TIME Parameter auf 5 Sekunden festgesetzt. Dadurch wurde diese EXEC-Anweisung abgeändert.

Prozeduren, die Programme kompilieren und linken, benötigen häufig den PARMParameter, um die Optionen für den Compiler setzen zu können:

//STEP1 //

PROC=COBCL, PARM.COB='NOOPT,LIB'

EXEC

Angabe bewirkt, daß für den Step COB die Compiler Optionen NOOPTimize und LIBrary gesetzt werden. Sollen für eine Prozedur, die aus mehreren Steps besteht, mehrere EXEC-Anweisungen überschrieben werden, so ist genau auf die Reihenfolge der Steps zu achten. Das folgende Beispiel bezieht sich auf eine fiktive Prozedur, die aus drei Steps besteht. Diese

JCL-Prozeduren In diesem

Beispiel

131

wird der TIME-Parameter für die

Steps STEP1, STEP2 und

STEP3

geändert:

//PROCSTEP EXEC TEST,TIME.STEP1=(,5), TIME.STEP2=(,15), // TIME.STEP3=1 // Wird, wie im folgenden Beispiel, die richtige Reihenfolge nicht eingehalten, kommt es bei der Ausfuhrung der Prozedur zu einem Fehler:

//PROCSTEP // //

TEST,TIME.STEP1=(,5), TIME.STEP3= (,15) EXEC

,

TIME.STEP2=1

Die Überschreibung von STEP1 und STEP3 funktioniert zwar noch, die Ersetzung bei STEP2 kann aber nicht mehr durchgeführt werden, da innerhalb der Prozedur bei der Ersetzung nicht beliebig vorwärts und rückwärts gesprungen werden kann. Die Fehlermeldung selbst klingt etwas irreführend:

IEF611I

OVERRIDDEN STEP NOT FOUND IN PROCEDURE

Dies könnte schließen lassen, daß der angesprochene aber nur die Reihenfolge im Aufruf falsch. Ein Hinzufugen von neuen Prozedur ist nicht möglich.

Steps mit Hilfe

von

Step nicht existiert.

EXEC-Anweisungen

Tatsächlich

war

beim Aufruf einer

Ändern von DD-Anweisungen Will man

DD-Anweisungen überschreiben, so gilt folgende Syntax:

//procstepname.ddname DD parameter=wert Während Änderungen von EXEC-Anweisungen als Teil der EXEC PROC-Anweisung kodiert werden, folgen die geänderten DD-Anweisungen auf die EXEC PROC-Anweisung. Es braucht nur der DD-Parameter angegeben werden, der geändert werden soll. Es ist nicht erforderlich, die komplette DD-Anweisung neu zu kodieren.

//COB.SYSUT1

DD

SPACE=(CYL, (2,1))

Durch diese Angabe wird dem Workdataset SYSUT1 im Step COB mehr Platz zugewiesen. Die Angabe im UNIT-Parameter bleibt unverändert. Während das oben angegebene Beispiel keinerlei praktische Bedeutung besitzt, wird das folgende Beispiel in der Praxis häufig eingesetzt. Es geht darum, ein gelinktes Programm auf eine private Ladebibliothek zu stellen. Dazu werden Angaben der SYSLMOD DD-

MVS/ESA JCL

132

Anweisung geändert. seinen

Unter SYSLMOD

(SYS

Load

Output ab.

//LKED.SYSLMOD

DD

MODule) stellt

das

Programm

IEWL

DSN=UWIN.SCHULUNG.LOAD,DISP=SHR

Hier wird im Step LKED die DD-Anweisung mit dem Namen SYSLMOD geändert. Es werden nur der oder die geänderten Parameter angegeben. In diesem Beispiel handelt es sich dabei um den DSN- und den DISP-Parameter. Dadurch wird das ausführbare Programm nicht auf die USER.LOADLIB, sondern auf die private Ladebibliothek UWIN.SCHULUNG.LOAD gestellt. Leider sieht der Output für diese Form der Überschreibung nicht besonders übersichtlich aus, da die geänderten und die ursprünglichen Parameter zusammen ausgegeben werden. Dies sieht dann BROWSE

JCL

folgendermaßen aus: *

PAGE 1-- LINE 24 //LKED.SYSLMOD DD DSN=UWIN.SCHULUNG.LOAD,DISP=SHR X/SYSLMOD DD DSN=USER.LOADLIB,DISP=SHR DD UNIT=SYSDA,SPACE=(TRK,(50,5)) 25 XXSYSUT1 26 XXSYSPRINT DD SYSOUT=&OUT IEF653I SUBSTITUTION JCL SYS0UT=* DD * 27 //LKED.SYSIN -

28-- COLS

1

80

--

-

*******************************

BOTTOM OF DATA

********************************

Zeile 24 zeigt die Anweisung, so wie sie beim Aufruf angegeben wurde. Daher beginnt die Zeile mit //. Auf der Folgezeile findet sich die Anweisung, auf die sich die Überschreibung bezieht. Sie beginnt mit der Zeichenfolge X/. Dadurch wird kenntlich gemacht, daß diese Anweisung überschrieben wurde. Sie wird allerdings unverändert dargestellt, also auch mit den Parametern, die eigentlich überschrieben worden sind. So steht in der Ausgabe zwar noch DSN=USER.LOADLIB, effektiv geworden ist aber der Parameter DSN=UWlN.SCHULUNG.LOAD, wie es in der Überschreibung angegeben ist. Die optische Darstellung des Outputs ist äußerst verwirrend und vielleicht mit ein Grund dafür, daß die Benutzung von Prozeduren nicht so schrecklich populär ist.

Hinzufügen von DD-Anweisungen Neben der Möglichkeit, bestehende DD-Anweisungen zu ändern, können katalogisierten Prozeduren auch zusätzliche DD-Anweisungen mitgegeben werden. Beim Einfügen von Anweisungen gelten die gleichen Syntaxregeln wie für die Änderungen von DD-Anweisungen. Beim Aufruf der Prozedur müssen erst die Änderungen von DD-Anweisungen erfolgen und dann die Hinzufügungen. Im folgenden Beispiel wird Prozedur COBCL um ein Dataset mit dem DD-Namen SYSLIB ergänzt. Dies ist von Bedeutung, wenn beim Compile mit der LIB Option gearbeitet wird.

133

JCL-Prozeduren EDIT

---

01.16

UWIN.SCHULUNG.CNTL(CL)

.

-

COMMAND

===>

fop OF DATA

COLUMNS 001 072 SCROLL ===> PAGE

*****************************

******

****************************

000001 000002 000003 000004 000005 000006 000007

//UWINC JOB (998,ABTDG02),'M.WINTER",CLASS=A,NOTIFY=UWIN, // MSGCLASS=Y,MSGLEVEL=(1,1) EXEC PROC=COBCL,PARM.COB=1NOOPT,LIB1 //STEP1 DD DSN=UWIN.SCHULUNG.COBOL(PGM05),DISP=SHR //COB.SYSIN DD DSN=UWIN.SCHULUNG.COPYLIB,DISP=SHR //COB.SYSLIB DD * //LKED.SYSIN NAME PGM05(R)

******

****************************

BOTTOM OF DATA

**************************

Gleichzeitiges Einfügen und Ändern von Anweisungen

Häufig ist es nötig, beim Aufruf von Prozeduren sowohl Anweisungen zu ändern, als auch neue Anweisungen mitzugeben. Hierbei ist genau auf die Reihenfolge der Steps innerhalb der Prozedur zu achten.

Es

gilt folgende Regel:

Zunächst werden alle Änderungen von EXEC-Anweisungen angegeben. Dabei ist auf die Reihenfolge der Steps zu achten. Dann werden Änderungen von DD-Anweisungen für den ersten Step angeben, dann zusätzliche DD-Anweisungen. Danach folgen Änderungen für den nächsten Step, dann Ergänzungen für den nächsten Step usw. In der Prozedur COBCL muß im Step COB unter dem DD-Namen SYSLIB der Name des Dataset stehen, auf dem die Copy-Member für den COBOL Compile stehen. Die Prozedur ist um diesen DD-Namen zu ergänzen. SYSLMOD soll eine

geändert werden.

private

Ladebibliothek sein. Die

DD-Anweisung

muß

entsprechend

So sieht der Aufruf aus: 01.16

EDIT-UWIN.SCHULUNG.CNTL(CL) -

COMMAND

.

===>

COLUMNS 001 072 SCROLL ===> PAGE

*****************************

******

*****************************

000001 000002 000003 000004

//UWINC JOB (998,ABTDG02),'M.WINTER',CLASS=A,NOTIFY=UWIN, // MSGCLASS=Y,MSGLEVEL = (1,1)

******

****************************

//STEP1

EXEC

TOP OF DATA

PR0C=C0BCL,PARM.C0B= NOOPT,LIB'

DD DSN=UWIN-SCHULUNG.COBOL(PGM05),DISP=SHR //COB.SYSIN DD DSN=UWIN.SCHULUNG.COPYLIB,DISP=SHR 000005 //COB.SYSLIB 000006 //LKED.SYSLMOD DD DSN=UWIN.SCHULUNG.LOAD,DISP=SHR DD * 000007 //LKED.SYSIN NAME PGM05(R) 000008 BOTTOM OF DATA

***************************

MVS/ESA JCL

134

ist, daß die Anweisungen COB.SYSIN und COB.SYSLIB in der angegeben Wird die Reihenfolge vertauscht, so wird die Anweisung COB.SYSIN der Prozedur nicht mehr überschrieben. Als Name des Input Datasets steht

Zu beachten

Reihenfolge erfolgen. dann &&LIBRA und

es

kommt zu einem JCL-Error.

Ungültigmachen von Anweisungen Bisweilen kann es erforderlich werden, Teile von JCL-Anweisungen, die sich in der Prozedur befinden, ungültig zu machen. In diesem Fall wird der Parameter beim Aufruf der Prozedur auf blank gesetzt.

Beispiel verdeutlicht werden: Die Prozedur WAHNSINN besteht aus zwei Steps, Dies soll

an

einem

STEP1 und STEP2. Jeder

Zeitlimit:

//STEP1 //.... //.... //.... //STEP2

EXEC

PGM=XY,TIME=(,30)

EXEC

PGM=ABC,TIME=(,10)

Step hat ein

Beim Aufruf der Prozedur soll nun das Zeitlimit von STEP1 ungültig gemacht werden, das Zeitlimit von STEP2 soll auf 30 Sekunden erhöht werden. Dies geschieht auf folgende Weise:

//PROCSTEP //

EXEC WAHNSINN,

TIME.STEP1=,TIME.STEP2=(,30)

Besonderheiten bei Concatenated Data Sets

Beim Ändern

Parametern innerhalb verketteter (concatenated) Datasets sind besondere Am Beispiel der SYSLIB DD-Anweisung im Step LKED der beachten. Syntaxregeln Prozedur COBCL soll die Art und Weise der Überschreibung verdeutlicht werden. SYSLIB 4 besteht aus verketteten Datasets. Bei der dritten soll nun der DSN=UWIN.SCHULUNG.COPYLIB anstelle von USER.LOADLIB stehen. von

zu

JCL-Prozeduren

135

Der Aufruf der Prozedur COBCL muß dann

so

01.16

edit-uwin.schulung.cntl(cl)

aussehen: .

-

command ******

===> *****************************

top of data

columns 001 072 scroll ===> page

*****************************

000001 //uwinc job (998,abtdg02),'m.winter1,class=a,notify=uwin, 000002 // msgclass=y,msglevel=(1,1) exec proc=cobcl,parm.cob=1noopt,lib1,time=(,10) 000003 //step1 dd dsn=uwin.schulung.cobol(pgm05),disp=shr 000004 //cob.sysin 000005 //lked.syslib dd dd 000006 // dd dsn=uwin.schulung.copylib,disp=shr 000007 // dd * 000008 //lked.sysin name pgm05(r) 000009 ******

****************************

bottom of data

***************************

Für jede nicht geänderte Zeile steht eine DD-Anweisung mit blank. Die zu ändernde Zeile wird angegeben. Nachfolgende Zeilen brauchen nicht angegeben zu werden, sofern keine weitere Änderung erfolgt.

Will

ein weiteres oder mehrere Datasets der Konkatenation hinzufügen, so verfährt ähnlich. Dies läßt sich ebenfalls am Beispiel der SYSLIB DD-Anweisung im Step LKED demonstrieren. Zusätzlich zu den bereits angegebenen soll das Dataset SYS1.ROUT875 konkateniert werden: man

man

******

*****************************

000001 000002 000003 000004 000005 000006 000007 000008 000009 000010 000011

//uwinc job (998,abtdg02),'m.winter',class=a,notify=uwin, // msgclass=y,msglevel=(1,1)

******

//step1

exec

//cob.sysin //cob.syslib // // // // //lked.sysin name

top of data

*****************************

pr0c=c0bcl,parm.cob='noopt,lib',time=(,10) dsn=uwin.schulung.cobol(pgm05),disp=shr

dd dd dd

dd dd dd

dsn=sys1.r0ut875,disp=shr

dd

*

pgm05(r)

****************************

In diesem Fall folgen auf die vier leeren

bottom of data

***************************

DD-Anweisungen das zu ergänzende Dataset.

Beeinflussen der gesamten Prozedur Neben der Möglichkeit, die Anweisungen einzelner Steps abzuändern bzw. zu ergänzen, können auch Parameter, die die gesamte Prozedur beeinflussen, eingesetzt werden. In diesem Fall steht bei den zusätzlichen Parametern auf der EXEC-Ebene kein Stepname. Auf diese Art und Weise lassen sich nur EXEC-Anweisungen überschreiben.

MVS/ESA JCL

136

01.16

edit-uwin.schulung.cntl(cl)

.

-

command ******

===> *****************************

jqp of data

columns 001 072 scroll ===> page

*****************************

000001 //uwinc job (998,abtdg02),'m.winter',class=a,not ify=uwin, 000002 // msgclass=y,msglevel=(1,1) exec proc=cobcl,parm.cob=1noopt,lib',time=(,10) 000003 //step1 dd dsn=uwin.schulung.cobol(pgm05),disp=shr 000004 //cob.sysin dd unit=sysda,space=(cyl,(1,1)) 000005 //c0b.sysut8 000006 //lked.syslmod dd dsn=uwin.schulung.load,disp=shr dd * 000007 //lked.sysin name pgm05(r) 000008 ****** **************************** bottom of data ***************************

obigen Beispiel steht für die gesamte Prozedur nur noch 10 CPU Sekunden zur Verfügung. Man beachte den Unterschied zum Überschreiben einer EXEC-Anweisung für einen bestimmten Step. Eine Ausnahme bildet der PARM-Parameter. Er gilt nur für den ersten Step, auch dann, wenn er ohne Stepnamen angegeben wurde. Übersicht über Gültigkeit der Parameter auf EXEC Ebene: Im

COND

gilt für alle Steps der Prozedur

PARM

gilt

REGION

Sift ^ur a^e Steps der Prozedur

TIME

gilt für alle Steps der Prozedur

3.2 Wie

nur für den ersten Step der Prozedur sollten weitere PARM-Parameter besitzen, so werden diese ignoriert

Steps

Eigene Prozeduren schreiben man

bereits

an

der COBCL-Prozedur

gesehen hat,

ist

es

sehr

sinnvoll,

von

vielen

Benutzern häufig genutzte JCL in Form einer Prozedur auf die SYS1.PROCLIB zu stellen. Der Benutzer kann die Prozedur beim Aufruf seinen eigenen Bedürfnissen anpassen, ohne dabei den JCL-Quellcode der Prozedur selbst ändern zu müssen.

Was für das Kompilieren und Linken gilt, ist auch für Anwendungsprogramme gültig. Auch sie können in einer Prozedur zusammengefaßt werden. Der Aufruf ist recht einfach. Wer entsprechende Dialog Manager und CLIST bzw. REXX Kenntnisse besitzt, kann sogar Panels entwickeln, die wenig erfahrenen Benutzern das Submitten von Jobs/Prozeduren ermöglichen. Bei der Übernahme von Jobs in die Produktion sind häufig Änderungen notwendig. Werden Prozeduren benutzt, so muß nur der Aufruf geändert wer-

JCL-Prozeduren

137

den. Für die Datasets können in der Prozedur symbolische Namen vergeben werden. Dies hat den Vorteil, daß die Prozedur bei Übergabe an die Produktion nicht geändert werden muß. Es ändert sich lediglich der Aufruf, bei dem die symbolischen Namen belegt werden.

Solange die Version 4 von MVS/ESA noch nicht verfügbar ist, müssen

Sie Prozeduren als In-Stream-Prozeduren erstellen. Sie sehen ein wie normales Member einer aus sogenannte CNTL-Bibliothek. In-Stream-Prozeduren, die fertig und ausgetestet sind, werden als katalogisierte Prozeduren auf die entsprechende PROCLIB gestellt. Lassen Sie sich von dem Begriff 'katalogisiert' nicht verwirren. Er hat hier eine andere Bedeutung als bei einem Dataset. Selbstverständlich entwickeln Sie Ihre Prozeduren auf einer Bibliothek, die katalogisiert ist.

In-Stream-Prozeduren Um

einem normalen Job eine In-Stream-Prozedur zu machen, genügt die Angabe zusätzlicher einiger JCL-Anweisungen. Jede In-Stream-Prozedur benötigt ein ganz normale JOB-Anweisung. Auf sie folgt die Prozedur, deren Anfang und Ende markiert werden. Nach der Ende-Anweisung wird die Prozedur sofort aufgerufen. aus

Zunächst einmal muß MVS Anfang und Ende der Prozedur angezeigt werden. Außerdem benötigt die Prozedur einen Namen. Mit Hilfe der PROC- und PEND- Anweisungen wird diese Aufgabe gelöst. edit-uwin.schulung.cntl(proc01)

01.16

.

-

command

===>

columns 001 072 ===> page

scroll

******

*****************************

000001 000002 000003 000004 000005 000006 000007 000008 000009 000010 000011 000012 000013

//uwinc job (998,abtdg02),'m.winter1,class=a,notify=uwin,msgclass=y proc //test exec pgm=pgm01 //step1 //steplib dd dsn=uwin.schulung.load,disp=shr dd dsn=uwin.schulung.testdat.januar.input,disp=shr //input dd dsn=uwin.schulung.testdat.januar.output, //output // disp=(new,catlg,delete), // unit=dskprm,space=(cyl,(5,1),rlse), // recfm=fb,lrecl=234 //sysprint dd sysout=* dd sysout=* //sysout pend // exec test //do

******

****************************

yop of data

*****************************

bottom of data

***************************

Bis auf die Zeilen 2, 12 und 13 gleicht die JCL einem normalen Job. In Zeile 2 wird der Prozedur ein Name zugewiesen, der

wiederverwendet wird.

später beim Aufruf

MVS/ESA JCL

138

Syntax:

//procname PROC Damit ist der Anfang der Prozedur markiert und ein Name zugewiesen. Das Ende eine Prozedur wird durch die PEND- (Procedure END) Anweisung in Zeile 12 angezeigt. Ein Feldname darf nicht angegeben werden.

Syntax:

// PEND Um die Prozedur ausführen zu lassen, muß sie jetzt einer EXEC-Anweisung in Zeile 13.

nur

noch aufrufen. Dies

geschieht mit

Syntax:

//stepname EXEC procname Keine Fehler vorausgesetzt, wird die Prozedur normalen Job eine In-Stream-Prozedur geworden.

In-Stream-Prozeduren verwenden die Identifikation

jetzt ausgeführt.

Somit ist

aus

einem

folgenden Identifikationsfelder:

Bedeutung normale JCL-Anweisung

++

JCL-Anweisung der Prozedur bzw. fortgesetzte Anweisung

+/

beim Aufruf modifizierte JCL-Anweisung der Prozedur

++*

JCL-Anweisungen der Prozedur, (meist Hinweis auf Fehlerfall) Kommentare bzw. JES2

die in Kommentare umgesetzt wurden

Kontrollanweisungen

139

JCL-Prozeduren Die JCL, die im IOF-Menü für eine In-Stream-Prozedur aus (Fortsetzung auf der folgenden Seite): ********************************

TOP OF DATA

ausgegeben wird,

sieht wie

folgt

**********************************

1 //UWINC JOB (998,ABTDG02),'M.WINTER', CLASS=A,NOTIFY=UWIN,MSGCLASS=Y II TIME=(,05),MSGLEVEL=(1,1),TYPRUN=SCAN,USER=UWIN PROC //TEST EXEC PGM=PGM01 //STEP1

//STEPLIB DD DSN=UWIN.SCHULUNG.LOAD,DISP=SHR //SYSPRINT DD SYSOUT=* DD SYS0UT=* //SYSOUT DD DSN=UWIN.SCHULUNG.TESTDAT,JANUAR.INPUT,DISP=SHR //INPUT DD DSN=UWIN.SCHULUNG.TESTDAT,JANUAR.OUTPUT, //OUTPUT // DISP=(,CATLG,DELETE), // UNIT=DSKPRM,SPACE=(CYL,(5,1),RLSE), // RECFM=FB,LRECL=234, // PEND 2 //DO EXEC TEST PROC 3 ++TEST EXEC PGM=PGM01 4 ++STEP1 5 ++STEPLIB 6 ++INFILE

DD DD

DISP=SHR

++

7 ++0UTPUT ++ ++ ++

DSN=UWIN.SCHULUNG.LOAD,DISP=SHR DSN=UWIN.SCHULUNG.TESTDAT,JANUAR.INPUT,

DD

DSN=UWIN.SCHULUNG.TESTDAT,JANUAR.OUTPUT, DISP=(,CATLG,DELETE), UNIT=DSKPRM,SPACE=(CYL,(5,1),RLSE), RECFM=FB,LRECL=234,

8 ++SYSPRINT DD SYSOUT=* 9 ++SYSOUT DD SYSOUT=* *******************************

BOTTOM OF DATA

*******************************

Zunächst erscheinen die JCL-Anweisungen in der Reihenfolge, in der sie eingegeben wurden. Sie werden jedoch nicht numeriert. Die JOB-Anweisung hat die Nummer 1, die zweite Anweisung ist DO EXEC TEST.

Wie katalogisierte Identifikationsfelder.

Prozeduren

haben

auch

In-Stream-Prozeduren

besondere

Symbolische Parameter einsetzen Das zuletzt gezeigte Beispiel unterscheidet sich kaum von normaler JCL, sieht man einmal von der PROC-, PEND- und der zusätzlichen EXEC-Anweisung ab. Man erkennt auch, daß der DSN Bestandteil 'JANUAR' zweimal vorkommt und kann sich unschwer vorstellen, daß dieser Parameter bei der Verarbeitung im Folgemonat geändert werden muß. Diese Änderungen lassen sich mit Hilfe symbolischer Parameter vereinfachen.

MVS/ESA JCL

140

Symbolische Parameter sind nichts anderes als Platzhalter, die vom JES bei der der Prozedur eingesetzt werden. Im oben angegebenen Beispiel würde dies folgendermaßen aussehen: Statt

//

Auflösung

DD DSN=TJWIN. SCHULUNG. TESTDAT JANUAR. INPUT .

wird

//

DD DSN=UWIN.SCHULUNG.TESTDAT.&MONAT..INPUT

angegeben. Der '&' vor MONAT zeigt an, daß es sich um einen symbolischen Parameter handelt. Der Inhalt des symbolischen Parameters wird normalerweise beim Aufruf der Prozedur mitgegeben.

Wertzuweisungen für symbolische Parameter Direkt im Anschluß an den Aufruf der Prozedur können die Variablen besetzt werden. Dabei darf dem Variablennamen kein & vorangestellt werden.

//PROCSTEP

EXEC

TEST,MONAT=JANUAR

Beim Lesen der Prozedur sucht JES nach einem Parameter mit der Bezeichnung MONAT und ersetzt in der Prozedur den symbolischen Parameter durch den zugeordneten Wert. In der JCL im IOF-Menü wird sowohl der symbolische Parameter als auch die vorgenommene Ersetzung, die durch die Meldung IEF653I erkennbar ist, ausgegeben.

141

JCL-Prozeduren BROWSE

*

JCL

PAGE

COMMAND

1-- LINE

1-- COLS

1

80

--

-

SCROLL

===>

********************************

1 //UWING JOB

// //TEST

-pop op DATA

===>

SCREEN

**********************************

(998,ABTDG02),'M.WINTER1,CLASS=A,NOTIFY=UWIN,MSGCLASS=Y TIME=(,05),MSGLEVEL=(1,1),TYPRUN=SCAN,USER=UWIN PROC

EXEC PGM=PGM2 //STEP1 DD //STEPLIB DSN=UWIN.SCHULUNG.LOAD,DISP=SHR //SYSPRINT DD SYSOUT=*

//SYSABOUT DD SYSOUT=* DD SYSOUT=* //SYSOUT DD DSN=UWIN.TEST.&MONAT..INPUT,DISP=SHR //INFILE //OUTFILE DD DSN=UWIN.TEST.&MONAT..OUTPUT,DISP=(,CATLG,DELETE), // RECFM=FB,LRECL=80, // SPACE=(TRK,(5,1),RLSE), UNIT=3380 // // PEND 2 //DO EXEC TEST,MONAT=JANUAR PROC 3 ++TEST 4 ++STEP1 EXEC PGM=PGM2 5 ++STEPLIB DD DSN=UWIN.SCHULUNG.LOAD,DISP=SHR 6 ++SYSPRINT DD SYSOUT=* 7 ++SYSABOUT DD SYSOUT=* DD SYSOUT=* 8 ++SYSOUT ++INFILE DD 9 DSN=UWIN.TEST.&MONAT..INPUT,DISP=SHR IEF653I SUBSTITUTION JCL DSN=UWIN.TEST.JANUAR.INPUT,DISP=SHR 10 ++OUTFILE DD DSN=UWIN.TEST.&MONAT..OUTPUT,DISP=(,CATLG,DELETE), IEF653I SUBSTITUTION JCL DSN=UWIN.TEST.JANUAR.OUTPUT,DISP=(,CATLG -

-

++ ++ ++

RECFM=FB,LRECL=80, SPACE=(TRK,(5,1),RLSE), UNIT=3380

*******************************

BOTTOM OF DATA

********************************

MVS/ESA JCL

142

Bei der Ersetzung symbolischer Parameter sieht der Output ganz vernünftig aus. Leider gilt aber auch bei In-Stream-Prozeduren, daß bei Überschreibungen bzw. Hinzufügungen von Parametern der Output genauso schlimm aussieht wie bei katalogisierten Prozeduren. Im folgenden Beispiel wurde der SPACE-Parameter von OUTFILE geändert: 000001 000002 000003 000004 000005 000006 000007 000008 000009 000010 000011 000012 000013 000014 000015 000016

//UWING JOB (998,ABTDG02),'M.WINTER1,CLASS=A,NOTIFY=UWIN, HSGCLASS=Y // PROC //TEST EXEC PGM=PGM2 //STEP1 //STEPLIB DD DSN=UWIN.SCHULUNG.LOAD,DISP=SHR //SYSPRINT DD SYSOUT=* //SYSABOUT DD SYSOUT=* DD SYSOUT=* //SYSOUT DD DSN=UWIN.TEST.&MONAT..INPUT,DISP=SHR //INFILE //OUTFILE DD DSN=UWIN.TEST.&MONAT..OUTPUT,DISP=(,CATLG,DELETE), // RECFM=FB,LRECL=80, // SPACE=(TRK,(5,1),RLSE), UNIT=3380 // // PEND //DO EXEC TEST,M0NAT=JANUAR

******

****************************

//STEP1.OUTFILE DD SPACE=(TRK,(10,3)) BOTTOM OF DATA

***************************

143

JCL-Prozeduren Der

Output sieht folgendermaßen aus:

BROWSE COMMAND

*

JCL

1-- LINE

PAGE --

-

===>

TOP OF DATA

********************************

1 //UWING JOB

// //TEST

1 80 1-- COLS SCROLL ===> SCREEN

**********************************

(998,ABTDG02),'M.WINTER',CLASS=A,NOTIFY=UWIN,MSGCLASS=Y TIME (,05),MSGLEVEL=(1,D,TYPRUN=SCAN,USER=UWIN =

PROC

EXEC PGM=PGM2 //STEP1 //STEPLIB DD DSN=UWIN.SCHULUNG.LOAD,DISP=SHR //SYSPRINT DD SYSOUT=*

//SYSABOUT DD SYSOUT=* DD SYSOUT=* //SYSOUT DD DSN=UWIN.TEST.&MONAT. INPUT,DISP=SHR //OUTFILE DD DSN=UWIN.TEST-&MONAT..OUTPUT,DISP=(,CATLG,DELETE), // RECFM=FB,LRECL=80, // SPACE=(TRK,(5,1),RLSE), UNIT=3380 // // PEND 2 //DO EXEC TEST,MONAT=JANUAR PROC 3 ++TEST EXEC PGM=PGM2 4 ++STEP1 5 ++STEPLIB DD DSN=UWIN.SCHULUNG.LOAD,DISP=SHR 6 ++SYSPRINT DD SYSOUT=* 7 ++SYSABOUT DD SYSOUT=*

//i'NFILE

8 ++SYSOUT 9 ++INFILE

.

DD SYSOUT=*

DSN=UWIN.TEST.&MONAT..INPUT,DISP=SHR DSN=UWIN.TEST.JANUAR.INPUT,DISP=SHR 10 //STEP1.OUTFILE DD SPACE=(TRK,(10,3)) +/0UTFILE DD DSN=UWIN.TEST.&MONAT..OUTPUT,DISP=(,CATLG.DELETE), IEF653I SUBSTITUTION JCL DSN=UWIN.TEST.JANUAR.OUTPUT,DISP=(,CATLG ++ RECFM=FB,LRECL=80, ++ SPACE=(TRK,(5,1),RLSE), DD

IEF653I SUBSTITUTION JCL

-

-

++

UNIT=3380

*******************************

BOTTOM OF DATA

********************************

Man kann nicht gerade behaupten, daß dieser Output übersichtlich sei. Auf Zeile 10 erkennt die beim Aufruf geänderte DD-Anweisung mit dem SPACE-Parameter. Hinzu kommt noch die Ersetzung des symbolischen Parameters &MONAT. jetzt man

sieht, ist das Problem das gleiche wie bei katalogisierten Prozeduren. Vorsicht muß man walten lassen, wenn entweder mehrere symbolische Parameter Wie man

hintereinander gehängt werden oder auf den symbolischen Parameter weitere Angaben folgen. Der erste nach einem symbolischen Parameter auftretende Punkt wird als Ende-

MVS/ESA JCL

144

Markierung für diesen

Parameter interpretiert. Man muß aufpassen, daß einem die die die verschiedenen Teile des DSNs voneinander trennen, nicht verlorengehen.

Punkte,

Würde anstelle:

//EIN1

DD DSN=UWIN.SCHULUNG.TESTDAT.&MONAT..INPUT

//EIN1

DD DSN=UWIN.SCHULUNG.TESTDAT.&MONAT.INPUT

stehen, so würde der DSN folgendermaßen aufgelöst:

//EIN1

DD DSN=UWIN.SCHULUNG.TESTDAT.JANUARINPUT

Die Folge wäre ein JCL-Fehler, da der DSN-Bestandteil JANUARINPUT mehr als 8 Zeichen lang ist.

gibt es zwei Möglichkeiten, dieses Problem zu lösen: Durch Anhängen des Punktes in der Wertzuweisung, also: Grundsätzlich

//PROCNAME

PROC MONAT='JANUAR.'

oder das Begrenzen des symbolischen Parameters mit einem Punkt. In diesem Fall stehen dann zwei Punkte hintereinander, der erste zeigt das Ende des symbolischen Parameters an, der zweite trennt die Bestandteile des DSN voneinander:

//EIN1

DD DSN=UWIN.SCHULUNG.TESTDAT.&MONAT..INPUT

Die erste Möglichkeit, den Punkt in die Wertzuweisung zu nehmen, in diesem Fall müssen Anführungsstriche stehen, da der Punkt als ein Sonderzeichen interpretiert wird -

bedingt empfohlen werden, angegebene symbolische Parameter am kann

da Probleme auftreten können, wenn der so Ende eines DSN steht. In diesem Fall darf der Punkt nicht stehen. Aus diesem Grande ist die zweite Möglichkeit, das Einfügen eines weiteren Punktes in der Prozedur, vorzuziehen. -

nur

folgende Beispiel soll erläutern, wie die Prozedur wird folgendermaßen aufgerufen: Das

//STEP

EXEC

Ersetzung von Platzhaltern funktioniert.

TEST,VAR1=COPY,VAR2=LIB

Eine

145

JCL-Prozeduren

JCL in Prozedur

Auflösung durch JES

DSN=&VAR1 DSN=&VAR2 DSN=&VAR1&VAR2 DSN=&VAR1.&VAR2 DSN=&VAR1..&VAR2 DSN=TEST&VAR2 DSN=&VAR1.DATA DSN=&VAR1..DATA DSN=&VAR1.A

DSN DSN DSN DSN DSN DSN DSN DSN DSN

Die Punkte sind ungeheuer Wäre in der Prozedur:

wichtig.

Im letzten

COPY LIB COPYLIB COPYLIB COPY.LIB TESTLIB COPYDATA COPY.DATA COPYA

Beispiel wurde der DSN=COPYA erzeugt.

DSN=&VAR1A

angegeben worden, so hätte JES nach dem Variablennamen: VARIA gesucht und ihn nicht gefunden. Das Resultat wäre ein JCL-Fehler gewesen. Bisher haben wir nur Beispiele betrachtet, in denen der DSN oder Teile von ihm als symbolische Parameter verwandt wurden. Symbolische Parameter können anstelle jedes Parameters stehen. So kann z.B. eine Output-Klasse variabel gesteuert werden. Ebenso lassen sich Zuweisungen für den SPACE-Parameter treffen. Um in unserer Beispielprozedur zu bleiben. Nicht immer soll der Output ins IOF-Menü gestellt werden. Manchmal will man ihn auch drucken lassen. Dies läßt sich erreichen, wenn anstelle des * ein symbolischer Parameter steht, wie in folgendem Beispiel gezeigt wird:

MVS/ESA JCL

146

edit-uuin.schulung.cntl(procoi)

01.16

---.

-

command ******

===>

*****************************

jqp op data

columns 001 072 scroll ===> page

*****************************

000001 //uuinc job (998,abtdg02),'m.winter',class=a,not ify=uwin, 000002 // msgclass=y,msglevel=(1,1) proc 000003 //test exec pgm=pgm01 000004 //step1 000005 //steplib dd dsn=uwin .schulung.load,disp=shr dd dsn=uwin.schulung.testdat.&monat..input,disp=shr 000006 //input dd dsn=uwin.schulung.testdat.&monat..output, 000007 //output 000008 // disp=(new,catlg,delete), 000009 // unit=dskprm, 000010 // recfm=fb,lrecl=234, 000011 // space=(cyl,(1,1),rlse) 000012 //sysprint dd sys0ut=&0ut dd sysout=&out 000013 //sysout 000014 // pend exec test,out=a,monat=januar 000015 //do ******

****************************

bottom of data

***************************

Bei SYSPRINT und SYSOUT wird der symbolische Parameter &OUT durch A ersetzt. Dadurch wird der dort erzeugte Output unmittelbar auf den Drucker gelegt.

SYSIN und Prozeduren Sie werden wahrscheinlich bemerkt haben, daß in den bisher gezeigten Beispielen kein IDCAMS-Step vorangestellt war, der den Katalog bereinigt hätte. Insofern hätte ein mehrfaches Ausfuhren der Prozedur einen NOT CATLGD 2-Fehler zur Folge, unter SMS wäre es sogar zu einem Abbruch des Jobs gekommen. Das Problem besteht darin, daß IDCAMS eine SYSIN-Anweisung braucht, über die die Steueranweisungen gegeben werden. Innerhalb von Prozeduren ist jedoch die Benutzung von DD * Anweisungen verboten. Man kann deshalb auch nicht die Anweisung SYSIN DD * einsetzen. Um das Problem zu lösen, muß die Übergabe der SYSIN-Parameter außerhalb der Prozedur erfolgen. Dazu kann die SYSIN DD DDNAME-Anweisung eingesetzt werden. Die SYSIN DD

DDNAME-Anweisung

Syntax: //SYSIN DD DDNAME=ddname DDNAME-Anweisung verschiebt die inhaltliche Beschreibung des Feldes auf einen späteren Zeitpunkt im Job. Auf diese Weise wird eine in der Prozedur unzulässige DD *

Die

147

JCL-Prozeduren vermieden. Statt dessen werden die IDCAMS außerhalb der Prozedur übergeben.

Anweisung Wie dies

für das

Programm

geschehen kann, soll am folgenden Beispiel verdeutlicht werden:

EDIT-UWIN. SCHULUNG.CNTL(PROC01) COMMAND ===> ******

Kontrollanweisungen

*****************************

01.16

.

-

yep OF DATA

COLUMNS 001 072 SCROLL ===> PAGE

*****************************

000001 //UWINC JOB (998,ABTDG02),'M.WINTER1 ,CLASS=A,NOTIFY=UWIN, 000002 // MSGCLASS=Y,MSGLEVEL=(1,1) 000003 //TEST PROC EXEC PGM=IDCAMS 000004 //CLRCAT 000005 //SYSPRINT DD SYSOUT=* 000006 //SYSIN 000007 //STEP1

DD DDNAME=LOESCH

000008 000009 000010 000011 000012 000013 000014 000015

DD

000016 000017 000018 000019 000020 000021 ******

//STEPLIB //INPUT //OUTPUT // // // // //SYSPRINT //SYSOUT // PEND //DO //LOESCH

EXEC PGM=PGM01

DSN=UWIN.SCHULUNG.LOAD,DISP=SHR

DSN=UWIN.SCHULUNG.TESTDAT.&MONAT..INPUT.DISP=SHR DSN=UWIN.SCHULUNG.TESTDAT.&MONAT..OUTPUT, DISP=(NEW,CATLG,DELETE), DD DD

UNIT=DSKPRM,

RECFM=FB,LRECL=234, SPACE=(CYL,(1,1),RLSE) DD SYSOUT=&OUT DD SYSOUT=&OUT

EXEC TEST,OUT=A,MONAT=JANUAR DD * DELETE UWIN.SCHULUNG .TESTDAT.JANUAR.OUTPUT IF MAXCC = 8 THEN SET MAXCC = 0

****************************

BOTTOM OF DATA

***************************

Da die

Anweisung //LOESCH DD * jetzt außerhalb der Prozedur steht, ist sie zulässig. Allerdings hat die Sache noch einen Haken: In der SYSIN-Anweisung darf keine Variable stehen. Man kann also nicht:

SYSIN DD * DELETE UWIN.SCHULUNG.TESTDAT.&MONAT..OUTPUT

schreiben, da bei SYSIN Daten keine Variablenersetzung erfolgt. Mit Hilfe der SYSIN DD DSN-Anweisung ergibt sich jedoch eine Möglichkeit, auch hier variabel zu arbeiten. Die SYSIN DD

DSN-Anweisung Das nächste Beispiel beruht auf folgender Technik:

MVS/ESA JCL

148

Die Steueranweisungen werden in verschiedene Member einer Bibliothek geschrieben. Die Membernamen sind so gewählt, daß sie den Variableninhalten entsprechen, die beim Aufruf der Prozedur ersetzt werden. edit-uwi n.schulung. del (januar) command ===> ******

*****************************

01.15 -

.

fop of data

columns 001 072 scroll ===> page

*****************************

delete (uwin.schulung.testdat.januar.output) 000001 if maxcc = 8 then set maxcc =0 000002 000003 /* ****** **************************** bottom of data ***************************

Auf der gleichen Bibliothek stehen die Member für Februar, März usw. In der Prozedur wird nun dafür gesorgt, daß die entsprechenden Member angezogen werden: ******

*****************************

top of data

*****************************

000001 //uwinc job (998,abtdg02),'m.winter1,class=a,notify=uwin, 000002 // msgclass=y,msglevel=(1,1) 000003 //test proc exec pgm=idcams 000004 //clrcat 000005 //sysprint dd sys0ut=* dd dsn=uwin.schulung.del(&m0nat),disp=shr 000006 //sysin exec pgm=pgm01 000007 //step1 000008 //steplib dd dsn=uwin.schulung.load,disp=shr dd dsn=uwin.schulung.testdat.&m0nat..input,disp=shr 000009 //input 000010 //output dd dsn=uwin.schulung.testdat.&monat..output, 000011 // disp=(new,catlg,delete), 000012 // unit=dskprm, 000013 // recfm=fb,lrecl=234, 000014 // space=(trk,(5,1),rlse) 000015 //sysprint dd sysout=&out dd sysout=&out 000016 //sysout 000017 // pend exec test,out=a,m0nat=januar 000018 //do ******

****************************

bottom of data

***************************

Der Membername wird als Variable abgestellt. Beim Aufruf der Prozedur wird er ersetzt und das entsprechende Member der Bibliothek UWIN.SCHULUNG.DEL gelesen. Dieses Member enthält dann die für den IDCAMS Step notwendigen Kontrollanweisungen.

Symbolische Parameter vorbesetzen Es gibt viele Situationen, in denen es sinnvoll ist, Standardwerte vorzugeben. Der Benutzer ist dann nicht mehr gezwungen, jeden symbolischen Parameter beim Aufruf zu besetzen. Die Vorbesetzung erfolgt in der Prozedur auf der PROC-Zeile.

JCL-Prozeduren

149

Im folgenden Beispiel enthält der SPACE Parameter auf Zeile 14 zwei symbolische Parameter: PRIM und SEK. Mit ihrer Hilfe kann der Umfang der Platzanforderung festgelegt werden. Werden diese symbolischen Parameter beim Aufruf der Prozedur auf Zeile 18 nicht besetzt, so treten die Werte 5 und 1 an ihre Stelle, die in der PROCAnweisung auf Zeile 3 festgelegt wurden. Werden beim Aufruf andere Werte übergeben, so werden die Standardwerte damit überschrieben. ******

*****************************

000001 000002 000003 000004 000005 000006 000007 000008

000012 000013 000014 000015 000016 000017 000018

//uwinc // //test //clrcat //sysprint //sysin //step1 //steplib //input //output // // // // //sysprint //sysout // pend //do

******

****************************

000009 000010 000011

job

fop of data

*****************************

(998,abtdg02),'m.winter',class=a,notify=uwin, msgclass=y,msglevel=(1,1) proc prim=5,sek=1 exec pgm=idcams dd sys0ut=* dd dsn=uwin.schulung.del(&m0nat)

,di sp=shr

exec pgm=pgm01 dd dsn=uwin.schulung.load,disp=shr dd dd

dsn=uwin.schulung.testdat.&m0nat..input,disp=shr dsn=uwin.schulung.testdat.&m0nat..output,

disp=(new,catlg,delete), unit=dskprm,

recfm=fb,lrecl=234, space=(trk,(&prim,&sek),rlse) dd sysout=&out dd sysout=&out

exec

test,out=a,monat=januar bottom of data

***************************

Auslassen

symbolischer Parameter Unter Umständen kann es vorkommen,

daß man einen symbolischen Parameter überhaupt nicht mit einem Wert besetzen will. Auch in diesem Fall muß der Parameter angegeben werden, allerdings folgt auf das Gleichheitszeichen nichts. Man muß sehr genau überlegen, ob das Auslassen eines Parameters überhaupt möglich ist. Betrachten wir nochmals den symbolischen Parameter &MONAT. In der Prozedur steht:

//EIN1

DD DSN=UWIN.SCHULUNG.&MONAT..INPUT

Wird &MONAT beim Aufruf der Prozedur ausgelassen, also:

//STEP

EXEC

TEST,MONAT=,OUT=*

150

MVS/ESA JCL

angegeben, so kommt es zu einem JCL-Fehler, weil folgende Ersetzung stattfindet:

//EIN1

DD DSN=TJWIN. SCHULUNG.

.

INPUT

Im DSN

folgen zwei Punkte unmittelbar aufeinander. Dies ist aber syntaktisch falsch. Um das Auslassen des DSN zu ermöglichen, müßte man schon zu der bereits beschriebenen Möglichkeit greifen, den Punkt mit in den Parameter zu übernehmen. Die Nachteile dieser Möglichkeit sind bereits beschrieben worden. Ein Fall, bei dem das Auslassen Sinn macht, soll hier kurz beschrieben werden. Es geht um die Möglichkeit, ein Dataset auf DUMMY zu setzen, also zu verhindern, daß es einen Output erzeugt oder einen Input wirklich liest. Um nun zu erreichen, daß wahlweise auf DUMMY gesetzt werden kann, muß man zu einem kleinen Trick greifen. So muß die Anweisung lauten, wenn ein Input erfolgen soll:

//INPUT //

DD

DSN=UWIN.SCHULUNG.JANUAR.INPUT,

DISP=SHR

das Dataset auf DUMMY gesetzt ist die Lesezugriff EOF Bedingung zurückgegeben):

und so,

wenn

//INPUT // //

DD

Fall wird beim ersten

DUMMY,

DSN=UWIN.SCHULUNG.JANUAR.INPUT, DISP=SHR

In der Prozedur wird nun

//INPUT //

(In diesem

DD

angegeben:

&SUPP.DSN=UWIN.SCHULUNG.JANUAR.INPUT,

DISP=SHR

Beim Aufruf wird nun entweder:

//STEP1

EXEC

TEST,SUPP='DUMMY,1

oder

//STEP1

EXEC TEST,SUPP=

angegeben. Im ersten Fall wird der Input unterdrückt, im zweiten Fall erfolgt er. Der Trick besteht nun darin, das Komma mit in die Wertzuweisung zu nehmen. Dies ist unbedingt notwendig, denn sonst würde folgendes passieren:

151

JCL-Prozeduren

/'/INPUT

DD &SUPP

//

DISP=SHR

.

,

DSN=UWIN. SCHULUNG J7ANUAR INPUT, .

.

Ruft man mit

//STEP

EXEC TEST,SUPP=DUMMY

auf, so ist alles in Ordnung. Ruft man aber mit:

//STEP

EXEC TEST,SUPP=

auf, so erfolgt folgende Ersetzung:

//INPUT //

DD

,DSN=UWIN.SCHULUNG.JANUAR.INPUT,

DISP=SHR

und schon hat man einen wunderschönen

JCL-Fehler, da auf DD kein Komma folgen darf.

Schachteln von Prozeduren Unter MVS/ESA Version 4 ist es möglich, Prozeduren bis zu einer Tiefe von 15 Ebenen zu schachteln. Dies gilt für katalogisierte und für In-Stream-Prozeduren. Besondere Angaben

sind nicht nötig, außer daß eine Prozedur ihrerseits eine EXEC PROC-Anweisung enthält.

Problematisch ist das Schachteln von Prozeduren in zweierlei Hinsicht: 1. Alle Stepnamen sollten eindeutig sein, damit es bei Überschreibungen nicht zu Verwechslungen kommen kann. 2. Überschreibungen gelten nur für das nächst tieferliegende Level. Will man noch tiefer liegende Parameter überschreiben, so müssen die entsprechenden Angaben in die aufgerufenen Prozedur mit eingebaut werden. Ob dann noch eine Übersichtlichkeit gegeben ist, sei dahingestellt. Da bei bereits vorhandenen Prozeduren davon auszugehen eindeutig sind, sollte die Schachtelungsmöglichkeit nur bei werden.

Die

ist, daß die Stepnamen nicht

Neuentwicklungen eingesetzt

SET-Anweisung

Syntax: SET

parameter=wert[,parameter=wert,...]

Einführung von MVS/ESA Version 4 gibt es eine einfache Wertzuweisung mit einer SET-Anweisung (ähnlich wie in Clisten). Sie Wertzuweisung in der PROC-Anweisung ergänzen oder ersetzen.

Mit der

Form der kann die

MVS/ESA JCL

152

Beispiel:

//STEP1 SET // //OUTPUT

EXEC TESTPROC MONAT=JANUAR DD DSN=SCHULUNG.OUTFILE.&MONAT

ist identisch mit:

//STEP1 //OUTPUT

EXEC TESTPROC,MONAT=JANUAR DD DSN=SCHULUNG.OUTFILE.&MONAT,...

SET-Anweisung erlaubt eine größere Flexibilität. Sie kann auch innerhalb katalogisierter Prozeduren stehen. Bisher waren Wertzuweisungen nur beim Aufruf der Prozedur möglich. Die Verwendung von SET-Anweisungen ist übrigens nicht auf Prozeduren beschränkt. Sie kann auch innerhalb 'normaler' JCL eingesetzt werden und manche Prozedur überflüssig machen. Die

Die

INCLUDE-Anweisung

Syntax:

// INCLUDE MEMBER=name Mit Hilfe der INCLUDE-Anweisung ist es ab der Version 4 von MVS/ESA möglich, JCL in Prozeduren oder andere JCL hinein zu kopieren. Die INCLUDE-Anweisung kann nur zusammen mit der JCLLIB-Anweisung eingesetzt werden. Die JCLLIB-Anweisung enthält die Namen der zu durchsuchenden Bibliotheken, die INCLUDE-Anweisung den Membernamen. Für das Format der Bibliotheken gilt das gleiche wie bei JCLLIB. Die INCLUDE-Anweisung kann ihrerseits in einem Member stehen, das durch INCLUDE aufgerufen wurde. Auf diese Weise ist eine Schachtelungstiefe bis zu 15 Ebenen möglich. Das Member, das mit INCLUDE aufgerufen wird, darf keine PROC/PEND, JCLLIB, DD *, DD DATA oder JES2 Anweisungen enthalten. Zusammen mit der SET-Anweisung ergeben sich interessante Möglichkeiten:

//UWININC1 JOB (998,ABTDG02),'M.WINTER', // CLASS=A,MSGCLASS=A // JCLLIB ORDER=(UWIN.PRINTREP)

page

******************************

000001 //uwin217c job (uwin,abtdg02),'m.winter 1,n0tify=uwi n, 000002 // class=t,msgclass=y 000003 //***************************************************************

000004 000005 000006 000007 000008 000009

//* idcams zum loeschen eines dataset //* //* //***************************************************************

exec pgm=idcams //delete //sysprint dd sysout=* dd * 000010 //sysin

000011

delete uwin.schulung.ds31

******************************

bottom of data

Der SYSPRINT liefert das Ergebnis. Für den erfolgreiches Löschen gemeldet: sysprint

browse

1-- line

1-- cols

--

===>

*******************************

idcams

Fall, daß das Dataset existiert, wird ein

page

uncat

-

command

********************************

scroll

===>

1 80 screen

yop of data **********************************

system services

time: 12:06:43

delete uwin.schulung.ds31

idc0550i entry (a) uwin.schulung.ds31 deleted idc0001i function completed, highest condition code was 0

idc0002i idcams processing complete. maximum condition code was 0 ******************************

bottom of data ********************************

Sollte das Dataset bereits nicht mehr existiert 8 gemeldet.

von

haben,

so

wird dies mit einem Return Code

MVS/ESA JCL

160 ************************************

IDCAMS

TOP OF DATA

*****************************

TIME: 12:05:26

SYSTEM SERVICES

DELETE UWIN.SCHULUNG.DS31

IDC3012I ENTRY UWIN.SCHULUNG.DS31 NOT FOUND REASON CODE IS IGGOCLEG-42 IDC3009I ** VSAM CATALOG RETURN CODE IS 8 IDC0551I ** ENTRY UWIN.SCHULUNG.DS31 NOT DELETED -

IDC0001I FUNCTION COMPLETED, HIGHEST CONDITION CODE WAS 8

IDC0002I IDCAMS PROCESSING COMPLETE. MAXIMUM CONDITION CODE WAS 8 ******************************

BOTTOM OF DATA

********************************

Dieser Return Code ist (meistens) harmlos.

IDCAMS DELETE -

Beispiel 2

Soll ein Dataset auf Band/Kassette gelöscht werden, so kann heute auf den Zusatzparameter NSCR (NOSCRATCH) verzichtet werden. NSCR Angaben in existierender JCL können entfernt werden, sofern SMS im Einsatz ist: EDIT-UWIN.SCHULUNG.IDCAMS(DEL02)

01.05

.-.

-

COMMAND

SCROLL

===>

******

*****************************

000001 000002 000003 000004 000005 000006 000007 000008 000009

//UWIN217C JOB (UWIN.ABTDG02),1 M.WINTER 1,NOT IFY=UWIN, CLASS=T,MSGCLASS=Y //

TOP OF DATA

===>

PAGE

*****************************

//*************************************************************** //* IDCAMS ZUM LOESCHEN EINES DATASET AUF BAND/KASSETTE //* //* //*************************************************************** EXEC PGM=IDCAMS //DELETE DD SYS0UT=* //SYSPRINT

DD * 000010 //SYSIN DELETE UWIN.SCHULUNG.TESTCASS 000011 *******************************

BOTTOM OF DATA

*******************************

Util ity-Program m e

Sofern das Löschen ******

IDCAMS

161

erfolgreich war, erscheint folgende Meldung:

*****************************

TOP OF DATA

****************************

SYSTEM SERVICES

TIME: 12:05:26

DELETE UWIN.SCHULUNG.TESTCASS

IDC0550I ENTRY (A) UUIN.SCHULUNG.TESTCASS DELETED

IDC0001I FUNCTION COMPLETED, HIGHEST CONDITION CODE WAS 0

IDC0002I IDCAMS PROCESSING COMPLETE. MAXIMUM CONDITION CODE WAS 0 *******************************

BOTTOM OF DATA

*******************************

Beachten Sie, daß auch nach dem DELETE das Band/die Kassette unbenutzbar sofern nicht abgelaufene Schutzfristen existieren. IDCAMS DELETE

-

bleibt,

Beispiel 3

Wie schon erwähnt, ist ein RC von 8 meistens harmlos. Es gibt jedoch leider einige Situationen, wo der RC von 8 auf ein schwerwiegendes Problem hinweist. Eine dieser Situationen ist gegeben, wenn der Eintrag im User-Katalog auf ein falsches Volume verweist. Eine solche Situation ist zugegebenermaßen sehr selten. Sie kann jedoch eintreten, wenn ein neues Volume unter einer neuen logischen Bezeichnung in Betrieb genommen wird und eine alte Platte 'abgehängt' wird. Sofern die Einträge im Katalog nicht korrekt nachgeführt werden, kann der Eintrag dort auf ein altes, nicht mehr existierendes Volume verweisen. Eine ähnliche Situation tritt ein, wenn durch falsche Benutzung des VOL=REF-Parameters und des Parameters DISP=(,PASS) ein Katalogeintrag für ein nicht existierendes Dataset erzeugt wird. Im

folgenden Beispiel soll das Dataset UWIN.SCHULUNG.DS51 gelöscht werden.

MVS/ESA JCL

162

UWIN.SCHULUNG.IDCAMS(DELOI)

EDIT

01.05

---.

-

-

COMMAND

SCROLL

===>

******

*****************************

000001 000002 000003 000004

//UWIN217D

JOB

// //

MSGCLASS=Y,

//

yep OF DATA

===>

PAGE

****************************

(998,ABTDG02),'M.WINTER 1,CLASS=C,NOT IFY=UWIN,

TIME=(,05), MSGLEVEL=(1,1) MSGLEVEL=(1,1),TYPRUN=SCAN

000005 //* EXEC PGM=IDCAMS 000006 //UNCAT 000007 //SYSPRINT DD SYS0UT=* DD * 000008 //SYSIN DELETE UWIN.SCHULUNG.DS51 000009 ******************************* BOTTOM OF DATA

*******************************

Für das Dataset UWIN.SCHULUNG.DS51 gibt es zwar einen Erntrag im Katalog, aber keinen VTOC-Eintrag mehr. Da beim DELETE zunächst versucht wird, den VTOC-Eintrag zu löschen, muß es zu einem Fehler kommen, denn ein nicht vorhandener Eintrag läßt sich nicht löschen. Die

Meldungen in SYSPRINT sehen folgendermaßen aus:

******

IDCAMS

*****************************

TOP OF DATA

*****************************

SYSTEM SERVICES

TIME: 12:05:26

DELETE UWIN.SCHULUNG.DS51

IKJ56232I DATA SET UWIN.SCHULUNG.DS51 NOT ON VOLUME AS INDICATED IN THE IKJ56232I CATALOG OR VOL PARAMETER IDC0551 I ** ENTRY UWIN.SCHULUNG .DS51 NOT DELETED

IDC0001I FUNCTION COMPLETED, HIGHEST CONDITION CODE WAS 8 IDC0002I IDCAMS PROCESSING COMPLETE. MAXIMUM CONDITION CODE WAS 8 *******************************

BOTTOM OF DATA

********************************

Die Folge dieses Fehlers ist äußerst unangenehm. Durch das nicht erfolgreiche Löschen wird es beim erneuten Anlegen eines Datasets unter dem gleichen Namen zu einem NOT CATLGD 2-Fehler kommen, falls SMS aktiviert ist, kommt es sogar zu einem Abbruch des Jobs. Diese Situation läßt sich vermeiden, wenn man auf den normalen DELETE noch einen DELETE NSCR folgen läßt. Sofern der normale DELETE nicht erfolgreich ist, bereinigt

Utility-Programme

163

der DELETE NSCR den Katalog und ermöglicht so die Weiterverarbeitung. Dies geht jedoch nur in Nicht-SMS-Umgebungen, da NSCR dort für Plattendatasets benutzt werden darf. Unter SMS ist die Benutzung von NSCR nicht möglich. Allerdings kann es dort jedoch nicht zu dem oben beschriebenen Problem kommen. Da nunmehr im IDCAMS Step auf jeden Fall ein Return Code von 8 geliefert wird es kann nur eines der beiden Kommandos erfolgreich ausgeführt werden, kann es in der Folge -

des Jobs unter Umständen zu Problemen kommen. Sollte der COND-Parameter in der Weise eingesetzt sein, daß bei einem Return Code von mehr als 4 ein Abbruch erfolgt, so wäre diese Bedingung nunmehr erfüllt.

überflüssigen Abbruch zu vermeiden, wird der Return Code auf 0 geschieht mit Hilfe eines IDCAMS Modal-Kommandos. Mit ihm ist es möglich, den Return Code abzuprüfen und umzusetzen.

Um einen solchen zurückgesetzt. Dies

edit-uwin.schulung.idcams(del01)

01.05

.-.-.

-

command

===>

scroll

******

*****************************

000001 000002 000003 000004 000005 000006 000007 000008 000009 000010 000011

//uwin217d job (998,abtdg02),1m.winter1,class=c,not ify=uwin, // msgclass=y, // //

//*

1. 2.

===>

page

*****************************

time=(,05), msglevel=(1,1) msglevel=(1,1),typrun=scan

exec pgm=idcams //uncat //sysprint dd sysout=* dd * //sysin delete uwin.schulung.ds51 delete uwin.schulung.ds51 noscratch 8 then set maxcc = 0 if maxcc =

*******************************

Aus den

top of data

bottom 0f data

********************************

Meldungen geht hervor:

Das erste Löschen

war nicht erfolgreich, Katalog angegebenen Volume befand. Das zweite Löschen war erfolgreich.

da das Dataset sich nicht auf dem im User-

MVS/ESA JCL

164

******************************** TOP OF DATA **********************************

IDCAMS

TIME: 12:06:43

SYSTEM SERVICES

DELETE UWIN.SCHULUNG.DS51

IKJ56232I DATA SET UWIN.SCHULUNG.DS51 NOT ON VOLUME AS INDICATED IN THE IKJ56232I CATALOG OR VOL PARAMETER IDC0551I ** ENTRY UWIN.SCHULUNG.DS51 NOT DELETED IDC0001I FUNCTION COMPLETED, HIGHEST CONDITION CODE WAS 8

NOSCRATCH

DELETE UWIN.SCHULUNG.DS51

IDC0550I ENTRY (A) UWIN.SCHULUNG.DS51 DELETED IDC0001I FUNCTION COMPLETED, HIGHEST CONDITION CODE WAS 0

IF MAXCC

=

8 THEN SET MAXCC

=

0

IDC0002I IDCAMS PROCESSING COMPLETE. MAXIMUM CONDITION CODE WAS 0 *******************************

Datasets

BOTTOM OF DATA

********************************

kopieren mit dem REPRO-Kommando

Mit dem IDCAMS REPRO-Kommando lassen sich Datasets kopieren.

Syntax:

REPRO

INFILE(ddname) OUTFILE(ddname) SKIP(zahl) COUNT(zahl)

INDATASET(dsname) OUTDATASET(dsname) -

-

Um die INFILE-/OUTFILE-Parameter benutzen zu können, müssen die DD-Namen in der JCL enthalten sein. Wird ein nicht existierendes Dataset angesprochen, bricht der Job mit einem Fehler ab. Bei der Benutzung von INDATASET oder OUTDATASET werden keine DDAnweisungen benötigt. In diesem Fall kommt es zu einer dynamischen Allokation. Diese

Util ity-Programme

165

hat aber gegenüber der normalem Allokation mit INFILE bzw. OUTFILE einen entscheidenden Nachteil: Kann das Dataset vorübergehend nicht allokiert werden, weil z.B. ein anderer User exklusiv darauf zugreift, so wird nicht gewartet, sondern es kommt zur

Meldung:

DATASET ALLOCATED BY ANOTHER JOB OR USER

TRY LA-

TER

Die Funktion wird dann nicht ausgeführt. Aus diesem Grund sollten Sie immer mit INFILE oder OUTFILE arbeiten. Sie sind dann auf der sicheren Seite. Mit SKIP kann eine bestimmte Zahl von Records am Anfang des Datasets übersprungen werden. COUNT beschränkt die Zahl der zu kopierenden Records. SKIP und COUNT dürfen nur einmal angegeben werden.

Die

folgenden Beispiele sollen beide Möglichkeiten illustrieren:

edit-uwin.schulung.

idcams(rep01)

01.05

-.-.

-

command ******

===>

scroll

*****************************

-pop of data

===>

page

*****************************

//uwin217c job (uwin,abtdg02),'m.winter',not ify=uwin, class=t,msgclass=y //******************************* //* idcams zum kopieren sequentieller datasets //* //* //*************************************************************** exec pgm=idcams //delete //sysprint dd sysout=* dd * 000010 //sysin 000001 000002 000003 000004 000005 000006 000007 000008 000009

//

000011

delete uwin.schulung.ds99.back exec pgm=idcams 000012 //repro 000013 //sysprint dd sysout=* 000014 //ein dd dsn=uwin.schulung.ds99,disp=old

000015 //aus 000016 // 000017 //

dd dsn=uwin.schulung.ds99.back, disp=(new,catlg,delete), unit=dskprm, space=(cyl,(1,1)), lrecl=120,recfm=fb

000018 // 000019 // 000020 //sysin dd * repro infile(ein) outfile(aus) 000021

Bei der Verwendung von REPRO haben Sie die Wahl, ob Sie das komplette Dataset oder aber nur einen Teilbereich kopieren wollen. Durch die Angabe von COUNT und/oder SKIP läßt sich die Zahl der zu kopierenden Records beschränken.

MVS/ESA JCL

166 EDIT-UUIN.SCHULUNG. IDCAMS(REP01) COMMAND ===>

01.05

.--.-.

-

SCROLL

*****************************

000001 000002 000003 000005 000007 000008 000009 000010 000011 000012 000013 000014 000015 000016 000017 000018 000019 000020 000021

//UUIN217C JOB (UWIN,ABTDG02),'M.WINTER' NOTI FY=UWI N, CLASS=T,MSGCLASS=Y //

TOP OF DATA

===>

PAGE

*****************************

******

,

//*************************************************************** //*

IDCAMS ZUM KOPIEREN SEQUENTIELLER DATASETS

//******************************** EXEC PGM=IDCAMS //DELETE //SYSPRINT DD SYSOUT=* DD * //SYSIN DELETE UWIN.SCHULUNG.DS99.BACK EXEC PGM=IDCAMS //REPRO DD SYSOUT=* //SYSPRINT DD DSN=UWIN.SCHULUNG.DS99,DISP=OLD //EIN DD DSN=UWIN.SCHULUNG.DS99.BACK, //AUS DISP=(NEU,CATLG,DELETE), // UNIT=DSKPRM, // // SPACE=(CYL,(5,1),RLSE), // LRECL=120,RECFM=FB //SYSIN DD * REPRO INFILE(EIN) OUTFILE(AUS) -

COUNTC1000)

000022

In diesem Fall werden

nur

die ersten 1000 Records

Mit den folgenden Kontrollkommandos wird ein Ende des Dataset erreicht:

//SYSIN

DD

kopiert. Kopieren

ab dem 1001. Record bis

zum

*

INFILE(EIN) OUTFILE(AUS) SKIP(1000)

REPRO

Jetzt wird alles ab dem 1001. Record bis

zum

COUNT und SKIP können auch zusammen werden nur die Kontrollkommandos gezeigt:

//SYSIN

DD

-

Ende des Dataset kopiert.

eingesetzt

werden. Auch in diesem

*

INFILE(EIN) OUTFILE(AUS) SKIP(500) COUNT(1000)

REPRO

-

Beispiel

Utility-Program m e

167

Jetzt werden die Records 501 bis 1500 kopiert. Im SYSPRINT wird die Zahl der bearbeiteten Records gemeldet. Der SYSPRINT des IDCAMS REPRO ist wesentlich aussagekräftiger als der des IEBGENER. browse

sysprint

savedisk-- page

1-- cols 1 80 scroll ===> screen

1-- line

-

command

===>

*******************************

idcams

repro

top of data

***********************************

system services

time: 09:07:08

infilecin1) outfile(0ut1) -

(5) count (15) skip

-

idc0005i number of records processed was 15 idc0001i function

completed,

highest condition code was 0

idc0002i idcams processing complete. maximum condition code was 0 bottom of data ********************************

*******************************

Ein mehrfaches Einsetzen von COUNT und SKIP ist nicht möglich. Obwohl wird folgende Kontrollanweisung zu einem Fehler führen:

//SYSIN

DD

es

schön wäre,

*

INFILE(EIN) OUTFILE(AUS) SKIP(500)

REPRO

-

COUNT(1000) SKIP(500) COUNT(1000) Ein solches alternierendes

Kopieren ist (leider) nicht möglich.

Datasets drucken mit dem PRINT-Kommando Mit Hilfe des IDCAMS PRINT-Kommandos läßt sich der Inhalt von Datasets ausdrucken. Dabei kann das Ausgabeformat gewählt werden, ebenso kann Anfang und Ende des Drucks bestimmt werden.

168

MVS/ESA JCL

Syntax: PRINT

INFILE(ddname) | INDATASET(Eintrag-Name)

CHARACTER | HEX | DUMP

-

-

SKIP(Zahl) COUNT(Zahl)

druckenden Datasets kann über INFILE dann ist die Angabe einer DDAnweisung erforderlich oder über INDATASET hier muß der Datasetname eingesetzt werden mitgeteilt werden. Bei der Benutzung von INDATASET kann das bereits beschriebene Allokations-Problem auftauchen. Der Name des

zu

-

-

-

-

Das Format der 1.

Ausgabe kann in verschiedener Form erfolgen: Schriftform (CHARacter). Gepackte numerische Felder

werden.

können nicht

dargestellt

Ausgabe nur in HEX-Zeichen (HEX). Dieser Output ist nur schwer lesbar. 3. Ausgabe im DUMP-Format. DUMP ist der Default, er braucht nicht angegeben zu werden. Bei einer Ausgabe im DUMP-Format stehen auf der linken Seite die HEXZeichen, auf der rechten Seite die entsprechenden Darstellungen im Character-Format. Mit SKIP läßt sich eine bestimmte Zahl von Records am Anfang des Datasets überspringen.

2.

Mit COUNT läßt sich eine maximale Zahl der zu druckenden Records definieren. SKIP und COUNT können einzeln oder zusammen eingesetzt werden. Wird SKIP einzeln eingesetzt, wird bis zum Ende des Datasets gedruckt.

Utility-Programme

169

Im folgenden Beispiel werden die Records 11-15 eines Form gedruckt:

uwin.schulung.idcams(prt01)

edit -

command

01.05

sequentiellen Datasets in Character

.

-

===>

scroll

******

****************************

000001 000002 000003 000004 000005 000006 000007 000008 000009 000010 000011 000012

//uwin217c job (uwin.abtdg02),'m.winter 1,notify=uwin,

yop Qp data

===>

page

******************************

//

class=t,msgclass=y //******************************* //* //* idcams zum drucken eines sequentiellen dataset //* //*************************************************************** exec pgm=idcams //print //sysprint dd sysout=*

//in //sysin

dd

dsn=uwin.schulung.ds99,disp=shr

dd

*

print inf ile(in) -

000014 000015

count(4) -

char

******************************

Die im Dataset vorhandenen werden.

bottom of data

gepackten

*********************************

Felder können in diesem Format nicht

gelesen

listing of data set -uwin.schulung.ds99

1

record sequence number -

00001mueller

sabine

record sequence number

am hang 44

5000koeln

oberweg 7

2000hamburg

waldgasse 21

1000berlin

keplerstrasse 3

5000koeln

2 -

00002schneider

werner

3

record sequence number -

00003sielder

norbert

record sequence number

4 -

00004becker

erika

folgenden Beispiel wurde der Parameter CHAR weggelassen. In diesem Fall tritt der Default DUMP in Kraft, d.h. es erfolgt eine Ausgabe in Hexadezimal- und CharacterFormat: Im

MVS/ESA JCL

170 EDIT-UWIN.SCHULUNG.IDCAMS(PRT01)

01.05

.-.

-

COMMAND

SCROLL

===>

******

****************************

000001 000002 000003 000004 000005 000006 000007 000008 000009 000010 000011

//UWIN217C //

jop OF DATA

===>

PAGE

******************************

JOB (UWIN.ABTDG02),1M.WINTER 1,NOT IFY=UWIN, CLASS=T,MSGCLASS=Y

//*************************************************************** //* //* //*

IDCAMS ZUM DRUCKEN EINES SEQUENTIELLEN DATASET

//*************************************************************** EXEC PGM=IDCAMS //PRINT //SYSPRINT DD SYSOUT=* DD DSN=UWIN.SCHULUNG.DS99,DISP=SHR //IN DD * //SYSIN PRINT INFILE(IN)

000012 000014

-

COUNTC3)

******************************

Aus Gründen der

BOTTOM OF DATA

*********************************

Übersichtlichkeit ist der Hex-Teil des folgenden Outputs unvollständig

wiedergegeben. LISTING OF DATA SET -UWIN.SCHULUNG.DS99 RECORD SEQUENCE NUMBER

1 FOF0F0F0 F1D4E4C5 D3D3C5D9 40404040 4040C1D4 40C8C1D5 C740F4F4 40404040 40404040 40404040 40404000 0002076F -

000000 000020 000040

RECORD SEQUENCE NUMBER 2 000000 F0F0F0F0 F2E2C3C8 D5C5C9C4 C5D94040

*00001MUELLER * AM HANG 44 *

SABINE 5000KOELN

* * *

_?

-

000020 000040

4040D6C2 C5D9E6C5 C740F740 40404040 C7404040 40404040 40404000 0003801F

RECORD SEQUENCE NUMBER 3 000000 F0F0F0F0 F3E2C9C5 D3C4C5D9 40404040 000020 4040E6C1 D3C4C7C1 E2E2C540 F2F14040

*00002SCHNEIDER * OBERWEG 7 *G

WERNER

*00003SIELDER

NORBERT

*

2000HAMBUR* *

.

-

000040

40404040 40404040 40404000 0004721F

Der Vorteil des

gepackten

* *

WALDGASSE 21 .

1000BERLIN* *

Outputs besteht darin, daß er einerseits gut lesbar ist, andererseits die Felder im Hex-Teil entschlüsselt werden können.

Utility-Programme

4.2

171

IEBGENER

Hauptfunktion der IEBGENER-Utility besteht im Kopieren von Datasets. Dies geschieht in der Regel zum Erzeugen eines Backups. Kommt es während der Verarbeitung zu Fehlern, so können Datasets mit Hilfe der Backups wiederhergestellt werden. Die

In vielen MVS-Installationen ist das

Programm SYNCGENR von der Fa. SYNCSORT installiert. Beim Aufruf der IEBGENER Funktionen kann deshalb das Programm SYNCGENR aufgerufen werden. In den Fällen, in denen IEBGENER nicht ausgeführt werden braucht, verzweigt SYNCGENR zu SORT. Ist die SYSIN DD-Anweisung nicht DUMMY, wird immer IEBGENER ausgeführt. Erkundigen Sie sich, ob bei Ihnen IEBGENER aufgerufen werden muß oder ob Sie SYNCGENR aufrufen können. Neben der reinen Kopierfunktion bietet IEBGENER weitere Möglichkeiten. So kann beim Kopieren eine Umformatierung erfolgen, z.B. können gepackte Felder entpackt werden. Die Reihenfolge der Datenfelder im Ziel-Record kann anders gewählt werden als die Ausgangsrecord vorhandene. Diese Möglichkeit kann unter Umständen das Schreiben eines Anwendungsprogrammes ersparen. Auf weitere exotische Möglichkeiten, die IEBGENER bietet, z.B. Anlegen eines Member in einer Bibliothek, wird hier nicht eingegangen. Diese Funktionen werden heutzutage mit ISPF erledigt.

IEBGENER kann für jedes sequentielle Dataset benutzt werden, unabhängig davon, ob sie auf Band oder Platte steht. VSAM-Datasets kann IEBGENER nicht verarbeiten. Hierzu ist die IDCAMS-Utility zu verwenden.

Datasets

kopieren mit IEBGENER (SYNCGENR)

Die Kopierfunktion von IEBGENER wird am häufigsten genutzt. Größere Backups sollten auf Band bzw. Kassette gezogen werden. Ansonsten kann auch von Platte auf Platte kopiert werden. Falls Bänder oder Kassetten verwendet werden sollen, muß der Job in einer Klasse laufen, die für Bandverarbeitung zugelassen ist. Für jedes IEBGENER-Programm müssen drei DD-Anweisungen mit bestimmten Feldnamen existieren. Diese Feldnamen sind nicht wahlfrei: 1.

2. 3.

DD-Anweisung mit dem Feldnamen SYSUT1 enthält das Ausgangsdataset. Die DD-Anweisung mit dem Feldnamen SYSUT2 enthält das Zieldataset. Auf die SYSIN DD-Anweisung folgen normalerweise die Kontrollkommandos. Wenn die Kopierfunktion von IEBGENER aufgerufen wird, sind aber keine Kontrollkommandos erforderlich. Daher wird die SYSIN DD-Anweisung auf DUMMY gesetzt. Keinesfalls darf sie einfach weggelassen werden. Dies würde zu Die

einem JCL-Fehler führen.

Da das unter SYSUT2 allokierte Ausgabedataset meist neu angelegt wird, ist daran denken, daß in einem vorhergehenden Step der Katalog mit IDCAMS bereinigt wird.

zu

Welche Art von Datenträger beim Kopiervorgang gewählt wird, spielt keine Rolle. Es kann also von Platte auf Band, von Platte auf Platte, von Band auf Platte oder von Band auf Band

172

MVS/ESA JCL

kopiert werden. Auch kann die SYSUT1 DD-Anweisung auf * gesetzt werden. In diesem Fall folgen die zu kopierenden Daten unmittelbar auf die SYSUT1-Anweisung (In-StreamDaten).

Wird unter SYSUT2 ein neues Dataset angelegt, so werden die DCB-Anweisungen (RECFM, LRECL) von SYSUT1 übernommen. Die Blocksize wird selbständig bestimmt, wobei die für den Datenträger optimale BLKSIZE benutzt wird. Soll SYSUT2 ein anderes Format erhalten, so ist RECFM und meist auch LRECL anzugeben. Es gibt einen wesentlichen Unterschied zum Kopieren mit IDCAMS. IEBGENER kann pro Step nur einen Kopiervorgang durchführen. Sollen mehrere Kopiervorgänge durchgeführt werden, so müssen entsprechend vieles Steps durchlaufen werden. Die JCL wird dadurch aufgebläht. Andererseits ist in Ihrem Unternehmen möglicherweise SYNCSORT installiert. Dieser ist aller Wahrscheinlichkeit nach schneller als ein IDCAMS REPRO, mit dem ebenfalls kopiert werden kann. Prüfen Sie das einfach mal nach. Sie sollten sich dann für die Möglichkeit entscheiden, die in Ihrer Installation das beste Ergebnis liefert. Die folgenden Beispiele sollen verschiedene Kopiervorgänge illustrieren. Im ersten Beispiel wird eine Kopie eines Datasets auf Platte erstellt: EDIT-UWIN.SCHULUNG.UTIL(SYNC001)

01.05

-.-

-

COMMAND

===>

SCROLL

===>

******

*****************************

000001 000002 000003 000004

//UWIN217C JOB (UWIN,ABTDG02),'M.WINTER1,NOT IFY=UWIN, // CLASS=T,MSGCLASS=Y //*************************************************************** //* IEBGENER ZUM KOPIEREN SEQUENTIELLER DATASETS //* //* //*************************************************************** EXEC PGM=IDCAMS //DELETE

000005 000006 000007 000008

TOP OF DATA

PAGE

*****************************

000009 //SYSPRINT DD SYS0UT=* 000010 //SYSIN DD * DELETE UWI N.SCHULUNG.DS99.BACKUP 000011 EXEC PGM=IEBGENER 000012 //COPY 000013 //SYSPRINT DD SYS0UT=* DD DSN=UWIN.SCHULUNG.DS99,DISP=OLD 000014 //SYSUT1 DD DSN=UWIN.SCHULUNG.DS99.BACKUP, 000015 //SYSUT2 000016 // DISP=(,CATLG,DELETE), 000017 // SPACE=(TRK,(5,1),RLSE), 000018 // UNIT=SYSDA 000019 //SYSIN DD DUMMY

Die Meldung im SYSPRINT ist sehr knapp: Dies zeigt das erfolgreiche Kopieren an.

'Processing ended at End-Of-Dataset (EOD)'.

173

Utility-Programme sysprint

browse

page

copy

1-- line

1-- cols

--

-

command

scroll

===>

********************************

top of data

===>

1 80 screen

**********************************

generate

data set utility -

processing ended at eod *******************************

Im folgenden Beispiel wird ein Kassette gezogen:

bottom of data

Backup

eines Datasets, das auf einer Platte steht, auf

edit-jjwin.schulung.util(sync001 )

01.05 -

command ******

********************************

.

scroll

===> *****************************

top of data

===>

page

*****************************

000001 //uwin217c job (uwin,abtdg02),'m.winter1,not ify=uwin, 000002 // class=t,msgclass=y 000003 //*************************************************************** 000004 //* 000005 //* 000006 //* 000007 000008 000009 000010 000011 000012 000013 000014 000015 000016 000017 000018 000019

iebgener zum kopieren sequentieller datasets

//*************************************************************** exec pgm=idcams //delete //sysprint dd sysout=* dd * //sysin delete

//copy //sysprint //sysut1 //sysut2 // // // //sysin

uwin.schulung. testcass exec pgm=syncgenr dd sysout=* dd dd

dsn=uwin.schulung.ds99,disp=old dsn=uwin.schulung.testcass, disp=(,catlg,delete),

expdt=99000, unit=cass dd dummy

*******************************

bottom of data

********************************

In diesem Job wird ein Dataset von Platte auf Kassette kopiert. Als DISP für das Ausgangsdataset wird OLD gesetzt, um zu verhindern, daß Zugriffe auf das Dataset während der Sicherung erfolgen. Andere User, die während der Sicherung auf dieses Dataset zugreifen wollen, werden in einen Wartezustand versetzt. Der Parameter EXPDT=99000 bewirkt, daß die Kassette, solange darauf befindliche Datasets katalogisiert sind, nicht überschrieben werden kann. Wird das Dataset UWIN.SCHULUNG.TESTCASS entkatalogisiert (z.B. durch IDCAMS), wird die Kassette automatisch freigegeben, sofern sich nicht noch weitere Datasets auf der Kassette befinden.

174

MVS/ESA JCL

Im

Dies ist eine

folgenden Beispiel werden In-Stream-Daten auf Platte kopiert. Möglichkeit, ohne großen Aufwand Testdaten in ein Dataset zu schreiben: ******

*****************************

TOP OF DATA

*****************************

000001 //UWIN217C JOB (UWIN.ABTDG02),1 M.WINTER 1,NOTIFY=UWIN, 000002 // CLASS=T,MSGCLASS=Y 000003 //*************************************************************** 000004 //* 000005 //* IEBGENER ZUM KOPIEREN SEQUENTIELLER DATASETS 000006 //* 000007 //*************************************************************** 000008 //DELETE EXEC PGM=IDCAMS 000009 //SYSPRINT DD SYS0UT=* 000010 000011 000012 000013 000014 000015 000016

//SYSIN

DD

*

DELETE UWIN.SCHULUNG.TEST1 EXEC PGM=SYNCGENR //COPY //SYSPRINT DD SYSOUT=*

//SYSUT1

DD

*

0001SCHNEIDER 0002DAUBER

000017 0004SCHMID 000018 0006MUELLER 000019 /*

//SYSUT2 // // // // 000025 //SYSIN

000020 000021 000022 000023 000024

AM

KLAUS

HAUPTSTRASSE 5 IN DER AU 7 OBERGASSE 15

DIETER HANS DD

MÜHLGARTEN 22

WERNER

6000FRANKFURT 8000MUENCHEN 8500NUERNBERG 7000STUTTGART

DSN=UWIN.SCHULUNG.TEST1, DISP=(,CATLG,DELETE), RECFM=FB,LRECL=72, SPACE=(TRK,(5,1),RLSE), UNIT=SYSDA

DD DUMMY

*******************************

BOTTOM OF DATA

********************************

folgen auf die SYSUT1 DD * Anweisung die Input Daten, deren Ende durch eine Delimiter-Anweisung (/*) gekennzeichnet ist. Dieses Zeichen ist an dieser Stelle nicht unbedingt erforderlich, da das Ende der Daten auch durch die nächste auftauchende JCLAnweisung markiert wird. LRECL wurde angegeben, um zu verhindern, daß die ISPF-Standardlänge von 80 Byte zum Zuge kommt. IEBGENER kann auch zum Drucken verwendet werden. In diesem Fall wird die Ausgabe auf den Drucker gelegt: In diesem Fall

175

Utility-Programme ******

*****************************

TOP OF DATA

*****************************

000001 //UWIN217C JOB (UWIN,ABTDG02),1M.WINTER',NOT IFY=UWIN, 000002 // CLASS=A,MSGCLASS=Y 000003 //*************************************************************** 000004 //* IEBGENER ZUM DRUCKEN SEQUENTIELLER DATASETS 000005 //* 000006 000007 000008 000009 000010 000011

//*

//*************************************************************** EXEC PGM=SYNCGENR //PRINT DD SYSOUT=* //SYSPRINT

//SYSUT1 //SYSUT2

000012 //SYSIN

DD

DSN=UWIN.SCHULUNG.DS99,DISP=SHR

DD SYSOUT=A DP

DUMMY_

Datasets umformatieren mit IEBGENER Wie bereits erwähnt bietet IEBGENER neben der einfachen Kopierfunktion weitere Funktionen. Um sie nutzen zu können, werden in der SYSIN DD-Anweisung Kontrollkommandos mitgegeben. Syntax der IEBGENER Kontrollkommandos:

[label]

operation

parameter

Kommentar

Das Feld operation gibt die Art des Kontrollkommandos RECORD befrachten.

an.

Wir werden GENERATE und

Das Feld operation besteht aus einem oder mehreren Schlüsselwortparametern. Wir werden die Parameter MAXFLDS und MAXLITS betrachten. Kommentare können für notwendig hält.

angeschlossen werden,

sofern

man

das

aus

Dokumentationsgründen

Um ein IEBGENER-Kontrollkommando fortzusetzen, ist es notwendig, auf der ersten Zeile mit einem Komma abzuschließen und auf jeder Folgezeile auf Spalte 16 zu beginnen. Das GENERATE-Kommando

Das GENERATE-Kommando dient der Allokation für die auszuführende zwei Parameter: 1. 2.

Operation. Es hat

(MAXimum FieLDS) gibt die maximale Zahl der FIELD-Parameter im RECORD-Kommando an. folgenden MAXLITS (MAXimum LITeralS) gibt die maximale Zahl der Zeichen an, die in den FIELD-Parametern der folgenden RECORD-Kommandos enthalten sind. MAXFLDS

MVS/ESA JCL

176

Während die Zahl der benutzten Felder leicht zu überblicken ist, lassen sich die Literale nur schwer überblicken. Da aber immer die maximale Anzahl angegeben werden muß, behilft man sich dadurch, daß man immer eine Zahl angibt, die über der erwarteten Anzahl liegt.

Syntax:

GENERATE

MAXFLDS=wert,MAXLITS=wert

Wenn man

GENERATE MAXFLDS=10 0,MAXLITS=10 0

angibt, so dürfte dies in fast allen Fällen ausreichen. Aufpassen muß man bei der Fehlermeldung, die man erhält, wenn die Zuweisung dennoch nicht ausreicht. Sie lautet lapidar: 'INVALID SPACE ALLOCATION' und führt einen meistens in die Irre, da man annehmen könnte, daß z.B. der zugewiesene Platz für das Zieldataset nicht ausreicht. Wenn man diese Funktion benutzt und die erwähnte Fehlermeldung auftaucht, sollte man vor allem das Feld MAXLITS noch einmal überprüfen. Die gleiche Meldung erhält man, wenn man versehentlich MAXFIELDS statt MAXFLDS schreibt. Daher gilt es, sehr sorgfältig auf die Syntax zu achten. Das RECORD-Kommando Das zweite Kontrollkommando, das zum Umformatieren benötigt wird, ist das RECORDKommando. Ihm schließt sich der Parameter FIELD an. Für jedes zu formatierende Feld ist ein FIELD-Parameter anzugeben.

Die

Syntax des Parameters FIELD sieht folgendermaßen aus:

FIELD=(Länge,{lnput-Pos j 'Literal'},[Konversion],Out-Pos) Alle Parameter sind

positioneil.

Erläuterung: 1.

Länge ist die Länge in Byte des Input-Feldes oder des Literais,

das verarbeitet werden

soll. Der Default-Wert ist 80.

2.

3.

4.

Input-Pos gibt den Beginn des Feldes im Input-Record an. Der Default-Wert ist 1. Wenn ein Literal in den Output-Record eingefügt werden soll, so wird es in Anführungszeichen gesetzt. Die Länge des Literais darf 40 Byte nicht übersteigen. Konversion kann benutzt werden, um numerische Felder zu entpacken, in diesem Fall muß PZ angegeben werden, oder um numerische Felder zu packen, in diesem Fall ist ZP anzugeben. Wenn keine Konversion erfolgen soll, so steht ein Komma, um das Fehlen des positionellen Parameters zu kennzeichnen. Out-Pos gibt die Startposition des Feldes im Output-Record an. Der Default-Wert ist 1.

Utility-Programme

177

Wenn man numerische Felder entpackt, so muß man darauf achten, daß ihnen im Record genügend Platz zur Verfügung gestellt wird.

Output-

Wichtiger Hinweis ! Das

Entpacken funktioniert nur mit nicht-negativen Zahlen.

Einige Beispiele sollen die Anwendung des FIELD-Parameters illustrieren: FIELD=(4,55,,1) bewirkt, daß ein Feld mit 4 Byte Länge, das am 55. Byte des steht ohne Konversion auf das 1. Byte des Output-Records gestellt wird. Der Parameter

Input-Records

FIELD=(5,76,PZ,39) Der Parameter bewirkt, daß das Feld auf der Position 76 des Input-Records auf das 39. Byte des Output-Records gestellt wird. Dabei wird ein Entpackungsprozeß durchgeführt. Die Länge des Feldes, das im Input-Record 5 Byte einnimmt, wächst auf 9 Byte. Der folgende Job formatiert einen und Umsatz besteht.

neuen

Record, der aus den Felder: PLZ, Name, Vorname

edit-uwin.schulung.utilloes(iebgen01) -

command

===>

01.02 .columns 001 072 scroll ===> page

******

*****************************

000001 000002 000003 000004 000005 000006

//uuin217s job (998,abtdg02),'m.winter 1,

-pop of data

*****************************

// class=c,msgclass=9 exec pgm=idcams //del //sysprint dd sys0ut=* dd * //sysin delete uwin.schulung.ds991 8 then set maxcc = 0 if maxcc 000007 exec pgm=iebgener 000008 //copy 000009 //sysprint dd sysout=* 000010 //sysut1 dd dsn=uwin.schulung.ds99,disp=old 000011 //sysut2 dd dsn=uwin.schulung.ds991, 000012 // disp=(,catlg,delete), =

000013 // space=(trk,(5,1),rlse), un it=dskprm 000014 // dd * 000015 //sysin 000016 generate maxflds=4,maxlits=1 000017 record field (4,55, , 1), 000018 field=(14,6,,5), 000019 field=(20,35,,19), 000020 field=(5,76,pz,39) =

******

****************************

bottom of data

***************************

MVS/ESA JCL

178

Beachten Sie die Fortsetzung des Record-Kommandos auf Spalte 16. LRECL braucht bei SYSUT2 nicht angegeben werden. LRECL wird automatisch errechnet, ebenso die BLKSIZE.

So sieht der Beginn des Ausgangsdataset 000001 000002 000003 000004

00001MUELLER 00002SCHNEIDER 00003SIELDER 00004BECKER 000005 00005PARKER 000006 00006ZAUM 000007 00007WERNER 000008 00008MÜLLER 000009 00009WILHELM 000010 00010MUELLER

SABINE WERNER NORBERT ERIKA LASSE MICHAEL VERENA KARL NOTKER PETER

aus:

5000KOELN 2000HAMBURG WALDGASSE 21 1000BERLIN KEPLERSTRASSE 3 5000KOELN AM FLEET 65 2000HAMBURG RASSELWEG 2 1000BERLIN HALMSTRASSE 6 5000KOELN FISCHERSTRASSE 56 2000HAMBURG AM ACKER 5 1000BERLIN AN DER ROSENELLER 1 5000KOELN AM HANG 44 OBERWEG 7

So sieht der Anfang des umformatierten Dataset aus: 000001 000002 000003 000004 000005 000006

5000MUELLER 2000SCHNEIDER 1000SIELDER 5000BECKER 2000PARKER 1000ZAUM

000007 000008 000009 000010

5000WERNER

2000MÜLLER 1000WILHELM 5000MUELLER

000001156 000001271 WALDGASSE 21 000001386 KEPLERSTRASSE 3 000001501 AM FLEET 65 000001616 RASSELWEG 2 000001731 HALMSTRASSE 6 000001846 FISCHERSTRASSE 56 000001961 AM ACKER 5 000002076 AN DER ROSENELLER 1 000002191 AM HANG 44 OBERWEG 7

Bitte beachten Sie, daß das hier gezeigte Entpacken des Umsatzfeldes konnte, weil keine negativen Werte auftraten!

4.3

nur

funktionieren

IEHPROGM

Wie viele Utilities stammt IEHPROGM noch aus einer Zeit, als es noch kein ISPF gab. Von den vielen Funktionen, die IEHPROGM ausführen kann, ist heutzutage nur noch eine interessant. Unter SMS sollte IEHPROGM nicht mehr eingesetzt werden.

Utility-Programme

179

Bänder/Kassetten mit IEHPROGM Die

entkatalogisieren

Syntax der Steueranweisung lautet:

UNCATLG DSNAME=dsname Wir werden hier

nur

die Funktion UNCATLG näher betrachten. Sie kann

eingesetzt

werden, wenn man Datasets auf Bändern/Kassetten entkatalogisieren will. Dies bringt einen Zeitvorteil, da das betreffende Band nicht eingelegt werden muß. IEHPROGM sollte nur bei Bändern/Kassetten eingesetzt werden, die entweder EXPDT=99000 besitzen oder deren RETPD oder EXPDT abgelaufen ist. Die Steueranweisung UNCATLG von IEHPROGM löscht lediglich den Katalogeintrag für das Band/die Kassette. Ist das EXPDT noch nicht erreicht bzw. die RETPD noch nicht abgelaufen, so kann das Band/die Kassette nicht weiter verwendet werden. In diesem Zusammenhang kam es in manchen MVS-Installationen schon zu einer Knappheit an Bändern bzw. Kassetten. 01.05

edit-uwin.schulung.util(iehpr)

.-.

-

command ******

scroll

===> *****************************

fop of data

page

===>

*****************************

000001 //uwin217c job (uwin,abtdg02),'m.winter1,notify=uwin, 000002 // class=t,msgclass=9 000003 //*************************************************************** iehprogm zum entkatalogisieren von baendern, mit 000004 //* 000005 //* expdt=99000 oder abgelaufener retpd 000006 //*************************************************************** 000007 //copy exec pgm=iehprogm 000008 //sysprint dd sysout=* dd * 000009 //sysin uncatlg dsname=uwin.testband 000010

Beim

erfolgreichen Entkatalogisieren sieht der SYSPRINT wie folgt aus: sysprint

browse

scratch

-

command

1-- line

page

1-- cols

1

80

--

===>

scroll

********************************

top of data

===>

screen

**********************************

iehprogm

system support utilities -

uncatlg dsname=uwin.testband normal end of task returned from uncatlg utility end *******************************

bottom of data

********************************

MVS/ESA JCL

180

Wenn man Datasets auf Platte löschen will, so sollte man dies nicht mit IEHPROGM tun. Dies ist zwar möglich, aber umständlich, weil für die Vorgänge VTOC-Eintrag löschen und Eintrag im User-Katalog löschen zwei Kommandos erforderlich sind. In alter JCL können Sie gelegentlich noch diese SCRATCH- und UNCATLG-Anweisungen finden. Wesentlich einfacher ist es jedoch, IDCAMS zu verwenden, da Sie damit die beiden Vorgänge mit einer Anweisung anstoßen können.

4.4

Die SORT Utility

steht man vor dem Problem, daß man bei der Batch-Verarbeitung eines Dataset die Records in einer anderen als der ursprünglichen Reihenfolge verarbeiten will. Zur Lösung dieses Problems bieten sich mehrere Möglichkeiten an:

Häufig 1.

2.

Sofern das Dataset als VSAM KSDS- oder RRDS-Dataset existiert: Lesen über den Schlüssel bzw. Relative Record Nummer. Ein direktes Lesen hat gegenüber dem sequentiellen Lesen den Nachteil, daß wesentlich mehr physische I/Os benötigt werden. Unter Umständen werden mehrere physische I/Os benötigt, um einen logischen Record zu lesen. Beim sequentiellen Lesen werden dagegen mit einem physischen I/O viele logische Datensätze zur Verfügung gestellt, nämlich genau so viele, wie ein Block enthält.

Direkt lesen sollten Sie von einem VSAM-Dataset nur dann, wenn eine vergleichsweise geringe Zahl von Records bezogen auf die Zahl der gesamten Records des Datasets verarbeitet werden soll. Ansonsten sollten Sie versuchen, sequentiell zu verarbeiten. Umsortieren des Datasets mit Hilfe eines Anwendungsprogrammes, z.B. COBOL, unter Zuhilfenahme der COBOL SORT-Anweisung. Diese Vorgehensweise kann nur dann empfohlen werden, wenn im SORT-Teil Daten verändert werden. Ansonsten sollte auf die unter 3. genannte Möglichkeit zurückgegriffen werden. Wenn Sie den COBOL SORT benutzen, so setzen Sie nach Möglichkeit die Compiler Option FASTSRT ein.

3.

Umsortieren des Datasets mit Hilfe von JCL und des bei Ihnen installierten Programmes zum Sortieren. Das kann das Originalprogramm DFSORT von IBM oder SYNCSORT sein. Die Benutzung eines solchen Programms ist aus Performancegründen die beste Option. Die syntaktischen Unterschiede zwischen DFSORT und SYNCSORT sind marginal. Im Rahmen dieses

1.

Kapitels werden wir uns mit folgenden Funktionen befassen: Sortieren über ein oder mehrere Felder mit dem SORT FIELDS-Kommando.

2.

Unterdrücken von Records mit FIELDS=NONE.

3.

Vorauswahl der

4. 5.

gleichen

Inhalten auf den Sortierfeldern mit SUM

sortierenden Records mit INCLUDE bzw. OMIT. Umformatieren der zu sortierenden Records mit INREC bzw. OUTREC. Bilden von Summenfeldern mit SUM FIELDS. zu

Utility-Programme

181

Kopieren mit der OPTION COPY. Im Rahmen dieses Kapitels werden wir uns auf ein Beispieldataset beziehen, das auf der folgenden Seite abgebildet ist. Es besteht aus einer fünfstelligen Personalnummer, Name und Vorname, Strasse, PLZ und Ort sowie einem im COMP-3 dargestellten Feld, das einen 6.

Umsatz enthält.

JCL-Anweisungen für Sort-Programme Um das

benötigt: 1.

2.

3.

SORT-Programm laufen

lassen

zu

können, werden folgende Informationen

Die Ladebibliothek, auf der das SORT-Programm steht. In den meisten Installationen ist dies die SYS1.SORTLIB. Da diese Bibliothek eine LINKLIB ist, braucht in der JCL keine STEPLIB-Anweisung zu stehen. Zuweisungen für die Ein- und Ausgabe-Datasets.

Temporäre Datasets, die für den eigentlichen Sortiervorgang benötigt werden, falls der virtuelle Speicher nicht ausreicht.

4.

Ein Dataset für

5.

Die

Sortmeldungen. eigentlichen Sort-Kontrollkommandos. Das in diesem Kapitel verwendete Beispieldataset: 00001MUELLER 00002SCHNEIDER 00003SIELDER 00004BECKER 00005PARKER 00006ZAUM 00007WERNER 00008MÜLLER 00009WILHELM 0001OMUELLER 00011SCHNEIDER 00012TROTZ 00013KUBIK 00014ANDERSON 00015VAN DAALEN 00016ECKART 00017ANTON 00018LACROSS 00101TRAUTMANN 00102HESS 00103KAEMPFER

SABINE WERNER NORBERT ERIKA LASSE MICHAEL VERENA KARL NOTKER PETER ELLI CLAUDIA VERA JUERGEN ELMAR SABINE JUERGEN NORBERT

WALTRAUD WILHELM NORBERT

AM HANG 44 OBERWEG 7

5000KOELN 2000HAMBURG WALDGASSE 21 1000BERLIN KEPLERSTRASSE 3 5000KOELN AM FLEET 65 2000HAMBURG RASSELWEG 2 1000BERLIN HALMSTRASSE 6 5000KOELN FISCHERSTRASSE 56 2000HAMBURG AM ACKER 5 1000BERLIN AN DER ROSENELLER 1 5000KOELN CAPRISTRASSE 432 2000HAMBURG AM LANDWEHR 87 1000BERLIN VOCKSTRASSE 32 5000KOELN LAUBENGASSE 12 2000HAMBURG ULMENWEG 77 1000BERLIN ROTTALLEE 4 5000KOELN GELANWEG 65 2000HAMBURG RUE DE RIVOLI 7 0000PARIS WEBERSTRASSE 6 5000KOELN OBERWEG 7 2000HAMBURG AM HANG 44 1000BERLIN

++++? +++++

++++? +++&+

+++/? +++++

+++D? +++0+ ++++? +++++

++++? +++++

++++? +++++

++++?

+++H+ +++R? +++++

++++? +++++ ++++

MVS/ESA JCL

182

Das Eingabe-Dataset wird über die SORTIN DD-Anweisung angesprochen. Sollen mehrere Datasets mit der MERGE Funktion gemischt werden, so werden die Eingabe-Datasets mit SORTIN01, SORTIN02 angesprochen. Es sind maximal 16 SORTIN Datasets erlaubt.

Ausgabe-Dataset wird über die SORTOUT DD-Anweisung angesprochen. In der Regel wird unter SORTOUT ein neues Dataset erzeugt. Die temporären Datasets, die unter Umständen während des Sortiervorganges als Zwischenspeicher benutzt werden, werden über die SORTWKnn DD-Anweisungen angesprochen, wobei nn eine Zahl zwischen Ol und 16 ist. Es muß mindestens eine SORTWKnn angegeben werden. In der Regel werden jedoch nur eine oder zwei temporäre Datasets benötigt. Eine Erhöhung der Zahl der temporären Datasets erhöht die Performance nicht. Der eigentliche Sortiervorgang fmdet im virtuellen Speicher statt. Das

Verbesserung der Performance kann eine Vergrößerung der Region beitragen. Bei der Sortierung großer Datasets sollten Sie den REGION-Parameter des Sort Steps erhöhen. Dies gilt, wenn Sie unter MVS/XA arbeiten. Wenn bei Ihnen schon MVS/ESA installiert ist, dann kann es sein, daß das bei Ihnen verwendete Sortprogramm Data- oder Hiper Spaces nutzen kann. Wenn dem so ist, so brauchen Sie Ihre REGION nicht erhöhen. Das Dataset für Systemmeldungen wird nicht, wie bei Utilities üblich, über die SYSPRINT DD-Anweisung angesprochen. Sofern bei Ihnen SYNC-SORT installiert ist, so verwenden Sie die //SRTMSG DD-Anweisung. Ist bei Ihnen DFSORT installiert, so verwenden Sie die //SYSOUT DD-Anweisung für die Meldungen der Utility. Die grundlegende JCL für einen Sort sieht demnach folgendermaßen aus: Zur

//UWINSRT1 // // // //SORT1 //SRTMSG //SORTIN //SORTOUT // // // // //SORTWK01 //SORTWK02 //SYSIN

JOB

(998,ABTDG02),'M.WINTER',

CLASS=C, MSGCLASS=9, NOTIFY=UWIN EXEC

PGM=SORT,REGION=8M

DD SYSOUT=*

DD DD

DSN=UWIN.SCHULUNG.SORTIN,DISP=SHR DSN=UWIN.SCHULUNG.SORTOUT,

DISP=(,CATLG,DELETE), RECFM=FB,LRECL=8 0, UNIT=SYSDA,

SPACE=(CYL, (100,10) ,RLSE) DD UNIT=3 3 90,SPACE=(TRK, (10,1) ) DD UNIT 3390,SPACE=(TRK, (10,1) ) =

DD

*

SORT KONTROLL KOMMANDOS

183

Utility-Programme

Auf die Sort Kontroll-Kommandos wird im folgenden Kapitel eingegangen. Im vorliegenden Fall wird das Sortout-Dataset neu angelegt und katalogisiert. Wir werden jedoch sehen, daß es auch andere Möglichkeiten gibt, das Dataset für die Weiterverarbeitung vorzubereiten. Auch dies wird noch erläutert werden. Keinesfalls sollte der DSN für SORTIN und SORTOUT gleich sein. (Dies ist syntaktisch zulässig !) Dann würde der sortierte Output im Input-Dataset stehen. Die ursprüngliche Reihenfolge der Records ginge damit für immer verloren. Die Angabe des UNIT- und SPACE-Parameters für die SORTWKnn-Datasets reicht völlig aus (DISP nimmt den Default (NEW.DELETE) an, der DSN wird vom System generiert). Auch wenn kein SORTWKnn-Dataset beim SORT eingesetzt wird, so muß mindestens die SORTWK01 DD-Anweisung vorhanden sein.

Sortiereif mit dem SORT FIELDS-Kommando Wie alle Kontrollkommandos für Utilities, so werden auch die Sort-Kontrollkommandos über die SYSIN DD * Anweisung zugewiesen. Die Syntax der Sort-Kontrollkommandos ist ähnlich, aber nicht identisch mit der von IEBGENER und IDCAMS. Mit Hilfe von SORT FIELDS (nicht FIELD wie bei IEBGENER) wird mitgeteilt, über welche Felder sortiert werden soll und wie das Format der Felder ist. Die Syntax der SortKontrollkommandos sieht folgendermaßen aus:

SORT

FIELDS=(position,länge,format,reihenfolge...)

oder

SORT

FIELDS=(position,länge,reihenfolge),FORMAT=format

Die so definierten Felder werden im weiteren Verlauf als Sortierfelder bezeichnet. Sortiert werden kann über ein Feld oder mehrere Felder. Die oben erwähnten Parameter haben 1. 2. 3.

folgende Bedeutung: Bytes des Sortierfeldes im Eingabe-Record an

die Position des ersten

position gibt länge gibt die Länge des Sortierfeldes an format ist ein zwei Byte langer String, der das Format der Daten im Sortierfeld angibt. Möglich sind: Character (alphabetische Sortierung) CH Zoned Decimal (numerische Sortierung für Felder im DISPLAY-Format) ZD Packed Decimal (numerische Sortierung für Felder im COMP-3-Format) PD Fl Signed Fixed Point Binary (numerische Sortierung, Daten im COMPFormat mit Vorzeichen) Bl Unsigned Binary (numerische Sortierung, Daten im COMP-Format ohne

MVS/ESA JCL

184

Vorzeichen) FL

Signed normalized mit Exponent)

floating

Point

(für

Felder mit

Gleitkommadarstellung

reihenfolge gibt an, ob aufsteigend (A für Ascending) oder absteigend (D für Descending) sortiert werden soll. Beispiele für Angaben eines oder mehrerer Sortierfelder. Die Feldnamen beziehen sich auf das Beispieldataset: 1. SORT FIELDS (6,19, CH, A)

4.

=

Hier wird über ein 19 Byte langes Feld, das an der Position 6 beginnt, sortiert. Das Format ist Character. Die Sortierreihenfolge ist aufsteigend. Es wird aufsteigend nach Nachnamen sortiert. 2.

SORT

FIELDS=(55,4,ZD,A,6,19,CH,A)

Hier wird über zwei Felder sortiert. Das erste ist ein 4 Byte langes Feld, das an der Position 55 beginnt. Das zweite Sortierfeld beginnt an der Position 6 und ist 19 Byte lang. Das Format des ersten Feldes ist ZD, das des zweiten Character. Es wird aufsteigend nach Postleitzahlen und innerhalb gleicher Postleitzahlen aufsteigend nach Nachnamen sortiert.

Sortierung erfolgt in folgender Weise: Zunächst erfolgt die Sortierung nach dem ersten Sortierfeld (Major Control Field). Stehen auf dem ersten Sortierfeld gleiche Werte, so erfolgt die weitere Sortierung nach dem zweiten Sortierfeld (Minor Control Field). Stehen auf beiden Sortierfeldern gleiche Werte, so ist die Reihenfolge im Ausgabedataset nicht vorhersagbar. SORT FIELDS= (76, 5, PD,A) Die

3.

Hier wird über ein 5 Byte langes Feld, das an der Position 76 beginnt, sortiert. Das Format ist Packed Decimal. Das Format des Feldes muß also 9(9) COMP-3 oder 9(08) COMP-3 sein. Die Sortierreihenfolge ist aufsteigend. Es wird aufsteigend nach Umsatz sortiert. 4.

SORT FI ELDS

=

(55,4, ZD, A,

76 , 5 , PD,

D)

Hier wird über 2 Felder sortiert. Es wird aufsteigend nach Postleitzahlen und innerhalb gleicher Postleitzahlen absteigend nach Umsatz sortiert.

wird das Format CHaracter mißbraucht, um über Felder zu sortieren, die in anderen Formaten stehen. Tatsächlich kann man ein Feld im ZD-Format mit CH sortieren, wenn auch mit etwas schlechterer Performance. Es gibt jedoch auch 'Spezialisten', die Felder, die im COMP-3-Format stehen, mit CH sortieren. Das kann gut gehen (sofern die Werte positiv sind und mit den Zahlen nicht gerechnet wurde). Bei negativen Zahlen geht dies aber nicht. Verwenden Sie daher immer die korrekten Formate. Sie vermeiden damit unliebsame Überraschungen.

Häufig

185

Utility-Programme Erhalten der

ursprünglichen Reihenfolge

Mit Hilfe des Parameters EQUALS | NOEQUALS kann auf die Reihenfolge der Ausgabe eingewirkt werden, wenn auf dem Sortierfeld (den Sortierfeldern) gleiche Werte stehen.

EQUALS bewirkt, daß die Reihenfolge von Eingabe-Records, die gleiche Werte auf den Sortierfeldern stehen haben, erhalten bleibt. Die Benutzung der Option EQUALS verlangsamt den Sort erheblich. Deshalb ist NOEQUALS der Default. Er gibt an, daß die Reihenfolge von EingabeRecords, die gleiche Werte auf den Sortierfeldern stehen haben, nicht berücksichtigt wird. EQUALS sollte nur dann angewandt werden, wenn zwingende Gründe dafür sprechen. Beispiel für die Benutzung des EQUALS-Parameters:

//SYSIN SORT

DD

*

FIELDS=(55,4,ZD,A),EQUALS

Beispiel für einen SORT über ein Feld Im folgenden Beispiel wird das Eingabedataset UWIN.SCHULUNG.DS99 über den Der Nachnamen sortiert. Output wird in das neu erzeugte Dataset UWIN.SCHULUNG.SORTOOl gestellt. Der dem Sortstep vorangestellte IDCAMS Step bereinigt den Katalog.

186

edit

MVS/ESA JCL

-

uwin.schulung.procauf(sort01)

01.04 -

command

.

******

*****************************

000001 000002 000003 000004 000005

//uwinsrt1

job

// //

msgclass=9, time=(,05), msglevel=(1,1),typrun=scan msglevel=(1,1)

//*

columns 001 072 ===> page

scroll

===>

Top of data

*****************************

(998,abtdg02),'m.winter1,class=c,notify=uwin,

// exec pgm=idcams 000006 //clrcat 000007 //sysprint dd sysout=* 000008 //sysin dd * 000009 delete (uwin.schulung.sort001) exec pgm=sort 000010 //step1 dd dsn=uwin.schulung.ds99,disp=shr 000011 //sortin 000012 //sysprint dd sysout=* dd sysout=* 000013 //srtmsg 000014 //sortwk01 dd unit=3390,space=(cyl,(1,1)) 000015 //sortwk02 dd un it=3390,space=(cyl,(1,1)) 000016 //sortout dd dsn=uwin.schulung.sort001,disp=(,catlg,delete), 000017 // recfm=fb,lrecl=80, 000018 // space=(trk,(5,1),rlse), unit=dskprm 000019 // 000020 //********************************************************************* * 000021 //* * 000022 //* 6 sortiere ab spalte über 14 bytes absteigend alphabetisch * entspricht absteigend nach nachnamen 000023 //* * 000024 //* 000025 //********************************************************************* dd * 000026 //sysin sort fields=(6,14,ch,d) 000027 ****** **************************** bottom of data ***************************

Den den SORT Step betreffenden Output finden Sie unter SRTMSG oder unter SYSOUT. Dies ist abhängig davon, ob bei Ihnen SYNCSORT oder DFSORT installiert ist.

Im Output sind die Datasetattribute von SORTIN und SORTOUT die Zahl der gelesenen und sortierten Records angegeben.

dargestellt. Außerdem ist

Sollten Ihnen beim Schreiben der Kontrollanweisungen Fehler unterlaufen diese ebenfalls an dieser Stelle gemeldet.

sein,

so

werden

Util ity-Programme browse command

187

srtmsg

wer045c wer246i wer054i wer169i wer052i

1-- line

1-- cols

--

scroll

===>

********************************

wer108i wer110i wer177i

page

step1

-

yep of data

sortin

:

recfm=fb

lrecl=

sortout

:

recfm=fb

lrecl=

===>

1 80 screen

**********************************

80 blksize= 27920 80 blksize= 27920

turnaround sort performed end sort phase filesize 3,040 bytes

38,

rcd in tpf level 2+ end syncsort

-

out

38

uwinsrt1,step1,,diag=cc00,1d9d,337d,600c

*******************************

bottom of data

********************************

Verbesserungen der Performance beim SORT Beim Einsatz des SORT lassen sich einige Performance-Vorteile durch die Benutzung geeigneter Parameter erzielen. Dies betrifft die Zahl der zu sortierenden Records, die sich beschränken läßt, und das Record-Layout, das verkürzt werden kann. Records auswählen mit INCLUDE oder OMIT

Soll der Sort nur über einen Teilbereich des Input-Dataset erfolgen, so kann mit den INCLUDE/OMIT-Parametern die Auswahl der Records gesteuert werden. Diese Vorgehensweise wird dringend empfohlen, da dadurch die Zahl der zu sortierenden Records verringert und die Performance deutlich verbessert wird. Der INCLUDE-Parameter beschreibt die Bedingung, unter denen Records am Sort teilnehmen sollen. Der OMIT-Parameter beschreibt die Bedingung, unter denen die Records am SORT nicht teilnehmen sollen. Benutzen Sie den Parameter, mit dem Sie die Bedingung am leichtesten formulieren können. Sie dürfen nur ein INCLUDE oder ein OMIT verwenden. Verwenden Sie INCLUDE und OMIT gleichzeitig, kommt es zu einem Fehler. Auf INCLUDE bzw. OMIT folgt ein COND-Parameter, der die Auswahlbedingung beschreibt. Mehrere Bedingungen können durch ein logisches AND oder OR verknüpft werden. Es kann auch geklammert werden. Die

allgemeine Syntax sieht folgendermaßen aus:

INCLUDE

COND=(cond1,AND°OR,cond2,....)

oder

OMIT

COND=(cond1,AND°OR,cond2.)

wobei condn

folgendermaßen aufgebaut ist:

188

MVS/ESA JCL

Bedingung bei Vergleich des Feldes mit einem String:

(position,länge,format,operator,string) Bedingung bei Vergleich des Feldes mit einem anderen Feld des Records:

(position,länge,format,operator,position,iänge,format) Als operator sind zulässig:

Operator EQ

Bedeutung

NE

Equal To Not Equal To

GT

Greater Than

GE

Greater Than

LT

Less Than

LE

Less Than

or

or

Equal To

Equal To

Operator wird benutzt, um den Inhalt des ersten Feldes mit dem eines zweiten Feldes, Characterstring, einem Hexstring oder einer Dezimalzahl (Display-Format) zu vergleichen. Wenn mit einem String verglichen werden soll, so muß einem Characterstring der Buchstabe C, einem Hexstring der Buchstabe X vorangestellt werden (s. Beispiele unten). Beispiele für: 1. Vergleich mit einer Dezimalzahl INCLUDE COND=(55,4,ZD,EQ,6000) Hier wird der Inhalt des Feldes PLZ mit der Zahl 6000 verglichen. 2. Vergleich mit einem Character-String INCLUDE COND=(59,3,CH,EQ,C'FRA') Hier wird der Inhalt des Feldes mit der Zeichenfolge 'FRA' verglichen. 3. Vergleich mit einem Hexadezimal-String INCLUDE COND=(76,1,CH,EQ,X'00') Hier wird der Inhalt des Feldes mit dem Hexadezimal-String '00' verglichen (Dies ist ein etwas umständlicher Weg, den Umsatz zu vergleichen). 4. Feld-Feld Vergleich INCLUDE COND=(6,1 ,CH,GT,20,1 ,CH) Hier wird der Record nur dann sortiert, wenn auf der erste Buchstabe des Nachnamens größer als der des Vornamens ist. Der

mit einem

Utility-Programme

189

Nicht alle Feldformate können miteinander Auskunft über die zulässigen Vergleiche:

verglichen werden. Die folgende Übersicht gibt

Vergleich Feld-Feld Format

CH

BI

ZD

PD

Bl

CH ZD PD

Vergleich Feld-Konstante Format

Character-String

Hex-String

Dezimalzahl

BI

CH ZD PD

Beispiele für die Benutzung der Parameters INCLUDE bzw. OMIT: 1.

INCLUDE

COND=(55,4,ZD,EQ,6000) FIELDS=(6,29,CH,A)

SORT

Es werden nur die Records sortiert, die ab Position 55 die Zahl 6000 (PLZ) stehen haben. Anschließend werden diese Records aufsteigend nach Nachname und Vorname sortiert. Die übrigen Records nehmen am Sortiervorgang nicht teil.

2.

INCLUDE

COND=(6,7,CH,EQ,C'MUELLER',AND, SORT

55,4,ZD,EQ,6000) FIELDS=(6,2 9,CH,A)

Es werden nur die Records sortiert, deren Nachname mit dem String 'MUELLER' beginnt und die in Frankfurt wohnen. Die übrigen Records nehmen am Sortiervorgang nicht teil. Anschließend werden diese Records nach Nachname und Vorname sortiert.

Muß ein Kontrollkommando fortgesetzt werden, so beenden Sie es auf der ersten Zeile an einer Stelle, an der ein Komma steht und setzen dann auf der neuen Zeile fort.

MVS/ESA JCL

190

3.

INCLUDE

COND=(5,15,CH,EQ,C'MUELLER',AND, 55,4,CH,EQ,X'F6F0F0F0') SORT FIELDS=(5,15,CH,A)

Beschreibung ist identisch mit der unter 2, lediglich Vergleichsstring als Hexadezimalzeichen dargestellt. OMIT COND=(55,4,ZD,EQ,5000) SORT FIELDS=(6,29,CH,A)

Diese 4.

wurde der

Es werden alle Records außer denen mit PLZ 5000 sortiert. Anschließend werden diese Records nach Name und Vorname sortiert. =

Verkürzung des zu sortierenden Records mit INREC Mit Hilfe des INREC-Kommandos lassen sich aus dem Eingabe-Record gezielt die Felder auswählen, die sortiert und später weiterverarbeitet werden sollen. Diese Vorgehensweise ist dann empfehlenswert, wenn aus einem großen Record vergleichsweise wenige Felder benötigt werden. Die Benutzung von INREC kann die Performance bedeutend erhöhen. Nachteilig wirkt sich die Verkürzung der Records insofern aus, als daß die folgenden Anwendungsprogramme auf den verkürzten Record abgestimmt sein müssen.

Syntax:

INREC

FIELDS=(pos,länge,pos.länge,...)

von INREC soll am folgenden Beispiel verdeutlicht werden. Vom werden nur die Personalnummer, die PLZ und der Wohnort benötigt. Die Ausgangsrecord Sortierung soll aufsteigend nach Ortsnamen erfolgen. Die Reihenfolge der Felder im Ausgabe-Record soll PLZ, Ort, Personalnummer sein. Zu beachten ist, daß sich die nachfolgenden Sort-Kommandos auf das durch INREC erzeugte Record Layout beziehen. Der komplette Job sieht folgendermaßen aus:

Die Benutzung

Utility-Programme

191

EDIT-UWIN.SCHULUNG.UTI L(SORT09) COMMAND ===>

01.04 -

.

COLUMNS 001 072 SCROLL ===> PAGE

*****************************

******

*****************************

000001 000002 000003 000004

//UWINSRT3 JOB (998,ABTDG02),'M.WINTER1,CLASS=C,NOTIFY=UUIN,

Tfjp OF DATA

// MSGCLASS=9, // TIME=(,05), // MSGLEVEL=(1,1) EXEC PGM=IDCAMS .000005 //CLRCAT 000006 //SYSPRINT DD SYSOUT=* DD * 000007 //SYSIN DELETE (UWIN.SCHULUNG.SORT003) 000008 EXEC PGM=SORT 000009 //STEP1 DD DSN=UWIN.SCHULUNG.DS99,DISP=SHR 000010 //SORTIN 000011 //SYSPRINT DD SYSOUT=* DD SYSOUT=* 000012 //SRTMSG 000013 //SORTWK01 DD UNIT=3390,SPACE=(CYL,(1,1)) 000014 //SORTWK02 DD UNIT=3390,SPACE=(CYL,(1,1)) 000015 //SORTOUT DD DSN=UWIN.SCHULUNG.SORT003,DISP=(,CATLG,DELETE), 000016 // RECFM=FB, 000017 // SPACE=(TRK,(5,1),RLSE), UNIT=DSKPRM 000018 // 000019 //********************************************************************* * 000020 //* * ZIEHE FELD PLZ, ORT UND PERS.NR HERAUS 000021 //* * SORTIERE SO ENTSTANDENE DATASET AUFSTEIGEND NACH ORTSNAMEN 000022 //* * 000023 //* ACHTUNG !! ANGABEN BEI SORT FIELDS BEZIEHEN SICH AUF NEUES AYOUT* 000024 //* * 000025 //* 000026 //********************************************************************* 000027 //SYSIN DD * INREC FIELDS=(55,4,59,15,1,5) 000028 SORT FIELDS=(5,15,CH,A) 000029 ******

****************************

BOTTOM OF DATA

***************************

Die SORT FIELDS-Anweisung bezieht sich bereits auf das durch INREC erzeugte neue Record Layout. Da der Ortsname jetzt auf dem fünften Byte beginnt, muß die entsprechende SORT FIELDS-Anweisung angepaßt werden. Wäre SORT FIELDS=(55,4,ZD,A) angegeben worden, so wäre es zu einem Fehler gekommen, weil das neue Ausgabedataset nur noch 24 Byte umfaßt. Die LRECL wird vom Sort selbständig errechnet, die BLKISZE automatisch optimiert. '

Wenn Sie mit INREC arbeiten, so brauchen Sie bei SORTOUT den Parameter LRECL nicht angeben. Der Wert wird vom SORT ermittelt. Wenn Sie aber selber eine Angabe für LRECL machen, so muß diese mindestens so groß sein, wie die Summe der Längenangaben unter INREC.

MVS/ESA JCL

192 Das

Ausgabe-Dataset hat folgendes Aussehen:

browse command

uwin.schulung.ds99

--.

.

--

===>

*********************************

1000berlin 1000berlin 1000berlin 1000berlin 1000berlin 1000berlin 2000hamburg 2000hamburg 2000hamburg 2000hamburg 2000hamburg 2000hamburg 2000hamburg 5000koeln 5000koeln 5000koeln 5000koeln 5000koeln 5000koeln 5000koeln 0000paris

top of data

l i ne 00000000 col 001 080 scroll ===> page

********************************

00003 00006 00009 00012 00015 00103 00002 00005 00008 00011 00014 00017 00102 00001 00004 00007 00010 00013 00016 00101 00018

Einsatz von SUM FIELDS im SORT Die

Summen zu bilden, wird im SORT auf zweierlei Weise Bilden echter Summen auf numerisch definierten Feldern.

Möglichkeit,

1.

eingesetzt:

Unterdrücken von Records, die auf den Sortierkontrollfeldern gleiche Weite stehen haben. Je nachdem, welcher Zweck erreicht werden soll, unterscheidet sich die Syntax:

2.

Für 1:

SUM

FIELDS=(pos,länge,format)

oder für 2:

SUM FIELDS=NONE

193

Utility-Programme

Die zweite Funktion wird häufig im Zusammenhang mit VSAM KSDS-Datasets eingesetzt, wenn eine beliebiges sequentielles Dataset zum Laden des VSAM-Datasets verwendet werden soll. Man verwendet dann den SORT, um aufsteigend nach dem Schlüsselfeld zu sortieren und unterdrückt etwaige Records mit identischen Schlüsselfeldem mit dem SUM

FIELDS=NONE-Kommando.

Echtes Summieren mit SUM FIELDS Da der Umgang mit dem normalen SUM-Kommando etwas schwierig sein kann, wird er hier in mehreren Schritten dargestellt. In unserem Beispieldataset sollen die Umsätze für jeden Ort summiert werden. Daher ist es zunächst einmal notwendig, den Datenbestand aufsteigend nach Postleitzahlen zu sortieren. Anschließend erfolgt das Summieren über das Umsatzfeld. Es werden nur soviele Records ausgegeben,~wie Postleitzahlen vorhanden sind. Die Felder, über die sortiert und summiert wird, dürfen nicht identisch sein. Im

folgenden Beispiel werden nur die erforderlichen SORT-Kontrollkommandos gezeigt.

SORT SUM

FIELDS=(55,4,CH,A) FIELDS=(76,5,PD)

Zunächst wird nach PLZ sortiert und dann innerhalb

Wie

man an

BROWSE

dem SRTMSG

gleicher PLZs addiert. Output erkennt, gibt es nur noch 4 Ausgabe-Records:

SRTMSG

PAGE

STEP1

-

COMMAND

1-- LINE

1-- COLS

--

SCROLL

===>

********************************

TOP OF DATA

WER108I WER110I WER177I

SORTIN

:

RECFM=FB

LRECL=

SORTOUT

:

RECFM=FB

LRECL=

WER045C WER055I WER246I

END SORT PHASE

WER054I WER169I WER052I

RCD IN

===>

1 80 SCREEN

**********************************

80 BLKSIZE= 27920 80 BLKSIZE= 27920

TURNAROUND SORT PERFORMED

0,

INSERT FILESIZE

3,040

38,

TPF LEVEL 2+ END SYNCSORT

34

DELETE

BYTES

OUT

4

UWINSRT3,STEP1,,DIAG=8200,17D1,7977,2C06 -

*******************************

Und

so

BOTTOM OF DATA

sieht das erzeugte Dataset aus:

********************************

MVS/ESA JCL

194 UWIN.SCHULUNG.SORT003

BROWSE

.-.

--

COMMAND

===>

*********************************

00018LACROSS 00103KAEMPFER 00005PARKER 00101TRAUTMANN

NORBERT NORBERT LASSE

WALTRAUD

********************************

TOP OF DATA

********************************

RUE DE RIVOLI 7 AM HANG 44 AM FLEET 65 WEBERSTRASSE 6 BOTTOM OF DATA

LINE 00000000 COL 001 080 SCROLL ===> PAGE

0000PARIS 1000BERLIN 2000HAMBURG 5000KOELN

+++++ ++++ +++++

+++++

*******************************

Die Ausgabe hat aber noch zwei Schönheitsfehler. Die Angaben, die vor der PLZ und den Summen stehen, sind völlig uninteressant und sogar verwirrend, weil man z.B annehmen könnte, daß die rechts dargestellte Umsatzzahl sich auf die zuvor genannte Person beziehen könnte. Dem ist aber nicht so. Klarheit kann man schaffen, in dem man die INRECAnweisung zusätzlich einsetzt. Außerdem lassen sich die Umsatzzahlen besser im DISPLAY-Format lesen. Durch Anhängen des aktuellen Formats in der INREC-Anweisung wird ein Entpacken der Felder bewirkt. Beachten Sie, daß sich die Angaben für SORT FIELDS und SUM FIELDS im folgenden Beispiel auf das mit INREC erzeugte Record-Layout beziehen. Das Feld, über das summiert wird, wuchs durch das Entpacken auf neun Byte an:

FIELDS=(59,15,76,5,PD) FIELDS=(1,15,CH,A) FIELDS=(16,9,ZD)

INREC

SORT SUM

Durch INREC wird ein Record erzeugt, der nur die Felder Ort und Umsatz dieses Feld wird entpackt enthält. Anschließend wird über Ort sortiert und über Umsatz die Summe -

-

gebildet. BROWSE

UWIN.SCHULUNG.SORT006

.

--

COMMAND

===>

*********************************

BERLIN KOELN

000041127 000039172 000041363

PARIS

000003111

HAMBURG

********************************

Noch ein

TOP OF DATA

BOTTOM OF DATA

LINE 00000000 COL 001 020 SCROLL ===> PAGE

********************************

*******************************

Tip:

Sollte das Umsatzfeld für die Ausgabe der Summe nicht groß genug sein, mehrere Möglichkeiten, in der INREC-Anweisung zusätzlich Platz zu schaffen.

FIELDS=(59,15,2Z,76,5) SORT FIELDS=(1,15,CH,A) SUM FIELDS=(16,7,PD) INREC

so

gibt

es

Utility-Programme

195

Durch die Angabe 2Z wurde das numerische Feld um zwei Byte erweitert. Es werden zwei Byte mit x'OO' eingefügt. Diese Erweiterung funktioniert bei allen Zahlenformaten, mit Ausnahme negativer, binär dargestellter Zahlen (S9(n) COMP). Bei Zahlen, die im Displayformat dargestellt sind, können einfach C'OO' eingefügt werden. Dadurch kann z.B. das Feld PLZ um ein Byte erweitert und links mit 0 aufgefüllt werden: INREC SORT

FIELDS=(1,54,C'0',55,4,59,15) FIELDS=(55,5,ZD,A)

In vorangehenden Beispiel wurde die PLZ um ein PLZ sortiert. Das Ergebnis sieht wie folgt aus: *********************************

00018LACROSS 00003SIELDER 00006ZAUM 00009WILHELM 00012TROTZ

CLAUDIA

00015VAN DAALEN

ELMAR

00103KAEMPFER 00002SCHNEIDER 00005PARKER

WERNER

00008MÜLLER

KARL

00011SCHNEIDER 00014ANDERSON 00017ANTON 00102HESS 00001MUELLER 00004BECKER 00007WERNER 0001OMUELLER 00013KUBIK 00016ECKART 00101TRAUTMANN

ELLI

Unterdrücken

NORBERT NORBERT MICHAEL NOTKER

von

NORBERT LASSE

JUERGEN

JUERGEN WILHELM SABINE

ERIKA VERENA PETER VERA SABINE WALTRAUD

Byte erweitert und anschließend nach

TOP OF DATA ******************************** RUE DE RIVOLI 7 00000PARIS WALDGASSE 21 01000BERLIN

RASSELWEG 2

01000BERLIN 01000BERLIN AM LANDWEHR 87 01000BERLIN ULMENWEG 77 01000BERLIN AM HANG 44 01000BERLIN OBERWEG 7 02000HAMBURG AM FLEET 65 02000HAMBURG FISCHERSTRASSE 56 02000HAMBURG CAPRISTRASSE 432 02000HAMBURG LAUBENGASSE 12 02000HAMBURG GELANWEG 65 02000HAMBURG OBERWEG 7 02000HAMBURG AM HANG 44 05000KOELN KEPLERSTRASSE 3 05000KOELN HALMSTRASSE 6 05000KOELN AN DER ROSENELLER 1 05000KOELN VOCKSTRASSE 32 05000KOELN ROTTALLEE 4 05000KOELN WEBERSTRASSE 6 05000KOELN AM ACKER 5

Duplikaten

Für das Laden von VSAM KSDS-Datasets können sequentielle Datasets verwendet werden, sofern diese auf den Schlüsselfeldern des VSAM-Datasets keine identischen Werte stehen haben. Mit SUM FIELDS=NONE läßt sich dieser Zustand auf elegante Weise erreichen. In unserem Beispiel soll unser Dataset zum Laden eines VSAM-Dataset verwendet werden. Im VSAM-Dataset soll der Schlüssel aus Name und Vorname bestehen. Zu diesem Zweck wird die Personalnummer durch den Einsatz des INREC-Kommandos abgetrennt und

MVS/ESA JCL

196

anschließende über Name und Vorname sortiert, wobei Duplikate unterdrückt werden. Die SORT-Kontrollanweisungen müssen folgendermaßen aussehen: INREC SORT

FIELDS=(6,75) FIELDS=(1,29,CH,A)

SUM FIELDS=NONE Es wird ein 75 Byte langer Ausgaberecord erzeugt. Das so erzeugte Dataset kann dann zum Laden des VSAM-Datasets verwendet werden. Dies geschieht dann mit der REPRO Funktion von IDCAMS.

Mischen von Datasets mit MERGE FIELDS Mit dem MERGE-Kommando können mehrere physische Datasets zu einem verschmolzen werden. Im Gegensatz zu einer Konkatenation, die nur ein zusammenhängendes physisches Dataset vortäuscht, wird mit MERGE aus mehreren Datasets ein neues erzeugt.

Syntax des MERGE ist ähnlich wie bei SORT. Syntax:

Die

MERGE

FIELDS=(pos,länge,format,reihenfolge)

Es können auch mehrere Felder

angegeben werden.

ACHTUNG !!! Das Kommando MERGE funktioniert nur dann, wenn die Datasets, die verschmolzen werden sollen, auf den im MERGE FIELDS angegebenen Feldern bereits sortiert sind.

Aus diesem Grund folgt der Merge Step meist auf zwei oder mehr Sort-Steps. Es können bis zu 16 Datasets verschmolzen werden. Diese Datasets werden unter den DD-Namen SORTINOT, SORTIN02 usw. angesprochen.

197

Utility-Programme

Beispiel für einen MERGE: EDIT-UWIN.SCHULUNG.UTIL(SORTOI)

01.04

.

-

COMMAND ******

COLUMNS 001 072 ===> PAGE

SCROLL

===> *****************************

fop op DATA

*****************************

000001 //UUINSRT1 JOB (998,ABTDG02),1M.WINTER1,CLASS=C,NOTIFY=UWIN, 000002 // MSGCLASS=9, 000003 // TIME=(,05), 000004 //* MSGLEVEL=(1,1),TYPRUN=SCAN 000005 // MSGLEVEL=(1,1) EXEC PGM=IDCAMS 000006 //CLRCAT 000007 //SYSPRINT DD SYSOUT=* DD * 000008 //SYSIN DELETE (UWIN.SCHULUNG.SORT001) 000009 EXEC PGM=SORT 000010 //STEP1 000011 //SORTIN01 DD DSN=UWIN.SCHULUNG.DS88,DISP=SHR 000012 //SORTIN02 DD DSN=UWIN.SCHULUNG.DS99.DISP=SHR 000013 //SYSPRINT DD SYSOUT=* DD SYSOUT=* 000014 //SRTMSG 000015 //SORTWK01 DD UN IT=3390,SPACE (CYL,(1,1)) 000016 //SORTWK02 DD UN IT=3390,SPACE (CYL,(1,1)) 000017 //SORTOUT DD DSN=UWIN.SCHULUNG.SORT001,DISP=(,CATLG,DELETE), 000018 // RECFM=FB,LRECL=80, 000019 // SPACE=(TRK,(5,1),RLSE), UN IT=DSKPRM 000020 // 000021 //******************************** 000022 //* ERZEUGE EIN NEUES DATASET AUS DEN UNTER SORTIN01 UND SORTIN02 000023 //* GENANNTEN. DIE DATASET SIND VORSORTIERT NACH NACHNAME 000024 //* 000025 //* =

=

000026 //******************************* 000027 //SYSIN DD * MERGE FIELDS=(6,15,CH,A) 000028 ******

****************************

ßOTTOM OF DATA

***************************

Kopieren von Datasets mit OPTION COPY SORT bietet eine Möglichkeit zum Kopieren von Datasets. Manche SYNCGENR rufen die SORT COPY OPTION auf.

Syntax:

SORT FIELDS=COPY

Programme wie

MVS/ESA JCL

198

oder

OPTION COPY Beide Angaben bewirken eine

SORT

Kopie von SORTIN auf SORTOUT.

Beispiele

Die folgenden werden kann.

Beispiele zeigen

verschiedene Situationen, in denen der SORT

eingesetzt

SORT Beispiel 1 Das erste Beispiel zeigt einen MERGE zweier Datasets. Das Dataset DS99 und DS88 werden gemischt. Zum besseren Verständnis ist das Dataset DS88 nochmals abgebildet: 00001MUELLER 00002SCHNEIDER 00003SIELDER

00004BECKER 00005PARKER 00006ZAUM 00007WERNER

SABINE

WERNER NORBERT SABINE WERNER NORBERT SABINE

00008MÜLLER

WERNER

00009WILHELM 0001OMUELLER 00011SCHNEIDER

NORBERT

AM HANG 44 OBERWEG 7

5000KOELN 2000HAMBURG 1000BERLIN 5000KOELN 2000HAMBURG 1000BERLIN 5000KOELN 2000HAMBURG 1000BERLIN 5000KOELN 2000HAMBURG

AM STRAUCH 77 AM HANG 44 OBERWEG 7 AM STRAUCH 77 AM HANG 44

SABINE

OBERWEG 7 AM STRAUCH 77 AM HANG 44

WERNER

OBERWEG 7

Das Ausgabe-Dataset nach dem MERGE. Die Records daß sie ab Byte 76 nochmals die PLZ besitzen:

von

DS88 sind daran

5000 2000 6000 5000 2000 6000 5000 2000 6000 5000 2000 zu

erkennen,

199

Utility-Programme SABINE

00001MUELLER 00001MUELLER 00002SCHNEIDER 00002SCHNEIDER 00003SIELDER 00003SIELDER 00004BECKER 00004BECKER 00005PARKER 00005PARKER 00006ZAUM 00006ZAUM 00007WERNER 00007WERNER

SABINE WERNER WERNER NORBERT NORBERT

KEPLERSTRASSE 3 AM HANG 44

WERNER

OBERWEG 7

LASSE

AM FLEET 65 RASSELWEG 2

SABINE VERENA KARL WERNER

NORBERT NOTKER PETER SABINE WERNER

0001OMUELLER 00010MUELLER 00011SCHNEIDER

AM STRAUCH 77 WALDGASSE 21

SABINE

NORBERT

00009WILHELM 00009WILHELM

OBERWEG 7 OBERWEG 7

ERIKA

MICHAEL

00008MÜLLER 00008MÜLLER

AM HANG 44 AM HANG 44

AM STRAUCH 77 AM HANG 44

HALMSTRASSE 6 FISCHERSTRASSE 56 OBERWEG 7 AM STRAUCH 77

5000KOELN 5000KOELN 2000HAMBURG 2000HAMBURG 1000BERLIN 1000BERLIN 5000KOELN 5000KOELN 2000HAMBURG 2000HAMBURG 1000BERLIN 1000BERLIN 5000KOELN 5000KOELN 2000HAMBURG 2000HAMBURG 1000BERLIN 1000BERLIN

AM ACKER 5 AN DER ROSENELLER 15000KOELN AM HANG 44 5000KOELN OBERWEG 7 2000HAMBURG

5000 ++++? +++++

2000 6000 ++++? +++&+ 5000 2000

+++/? +++++

6000 5000 +++D? +++0+ 2000 6000 ++++? +++++

5000 2000

Die Tatsache, daß auf den Sortierfeldern (Bytes 1-5) jetzt gleiche Werte stehen, ist unbedeutend. Entscheidend für das Funktionieren des MERGE war, daß vor dem MERGE beide Datasets aufsteigend nach Personalnummer sortiert waren.

Beispiel 2 Das zweite Beispiel zeigt ein Aufsummieren Gesamtsumme nicht geeignet ist: INREC FIELDS=(59,15,55,4) SORT

SORT SUM

Feld, welches für die Aufnahme der

FIELDS=(1,15,CH,A) FIELDS=(16,4,ZD)

Deshalb werden wäre:

über ein

so

viele Records erzeugt, wie

es zur

Gesamtdarstellung der Summe nötig

MVS/ESA JCL

200

9000 3000 8000 8000 8000

BERLIN BERLIN

HAMBURG HAMBURG HAMBURG

5000 5000 5000 5000

KOELN KOELN KOELN KOELN

5000 5000 5000

KOELN KOELN KOELN

5000 5000 5000 5000 5000 5000

KOELN KOELN KOELN KOELN KOELN

KOELN

PARIS_0000_ Lösen läßt sich das Problem, indem in der INREC-Anweisung zwei Nullen eingefügt werden. Beachten Sie, daß in diesem Fall die Records des Ausgabedataset zwei Byte sind als im vorherigen Beispiel:

länger

FIELDS=(59,15,C'00',55,4) SORT FIELDS=(1,15,CH,A) SUM FIELDS=(16,6,ZD) INREC

Die Ausgabe zeigt jetzt nur noch einen Record für eine Stadt. Sollten Sie über COMP-3Felder summieren wollen, so können Sie mit beim INREC mit der Angabe 2Z 2 binäre Nullen einfügen. BROWSE

--

UWIN.SCHULUNG.SORT008 .

COMMAND

===>

*********************************

BERLIN HAMBURG

KOELN PARIS

TOP OF DATA

L I NE 00000000 COL 001 021 SCROLL ===> PAGE

********************************

012000 024000

065000 000000

********************************

BOTTOM OF DATA

*******************************

SORT Beispiel 3

folgenden Beispiele zeigen zwei verschiedene Techniken zur Übergabe temporärer Sort Ausgabedatasets an einen Folge-Step zur Weiterverarbeitung. Die

Utility-Programme

201

Im eisten Step wird das temporäre Dataset &&SORTOUT an weitergepassed, dort verarbeitet und bei Beendigung des Steps gelöscht: edit-uwin.schulung.jcl(pass07) -

command

===>

******

*****************************

000001 000002 000003 000004 000005

//uuin217s // //

//* //

den

Folge-Step

01.01 -.-columns 001 072 scroll ===> page tqp of data *****************************

job (998,abtdg02),1m.winter1,class=c,notify=uwin, msgclass=9, time=(,05), msglevel=(1,1),typrun=scan msglevel=(1,1)

000006 //clrcat exec pgm=idcams 000007 //sysprint dd sysout=* dd * 000008 //sysin 000009 delete uwin.schulung.sortout delete uuin.schulung.ds11 000010

000011 000012 000013 000014 000015 000016 000017 000018 000019 000020 000021

//step1

exec pgm=sort

//sysprint //srtmsg //sortwk01 //sortwk02 //sortin //sortout // // // //sysin

dd sysout=* dd sysout=* dd un it=3380,space = (cyl,(1,1))

it-3380,space (cyl,(1,1)) dsn=uwin.schulung.ds99,disp=shr dsn=&&sortout,disp=(,pass) recfm=fb,lrecl=80, space=(trk,(5,1),rlse),

dd un dd dd

=

unit=sysda dd

*

sort fields=(55,4,a,6,14,d),format=ch 000022 000023 //step2 exec pgm=pgm04 000024 //steplib dd dsn=uwin.schulung.load,disp=shr 000025 //sysprint dd sysout=* 000026 //sysabout dd sysout=* 000027 //sysout dd sysout=* 000028 //infile dd dsn=&&sortout,disp=(old,delete) 000029 //outfile dd dsn=uuin.schulung.ds11,disp=(,catlg,delete), 000030 // recfm=fb,lrecl=80, 000031 // space=(trk,(5,1),rlse),

000032 // ******

un it=dskprm

****************************

bottom of data

***************************

Im zweiten Beispiel wird für das SORTOUT Dataset kein DSN vergeben. MVS generiert in diesem Fall einen Namen. Das Ansprechen des Datasets erfolgt im STEP1 mit einem Rückbezug auf die SORTOUT DD-Anweisung des Steps SORT:

MVS/ESA JCL

202 01.01

EDIT-UWIN. SCHULUNG. JCUPASS08) COMMAND ===>

.

-

yep OF DATA

COLUMNS 001 072 SCROLL ===> PAGE

*****************************

******

*****************************

000001 000002 000003 000004

//UWIN217S JOB (998,ABTDG02) 'M.WINTER1,CLASS=C,NOT IFY=UWIN, ,

MSGCLASS=9, TIME=(,05), MSGLEVEL=(1,1),TYPRUN=SCAN MSGLEVEL=(1,1)

// //

//*

000005 // EXEC PGM=IDCAMS 000006 //CLRCAT 000007 //SYSPRINT DD SYSOUT=* DD * 000008 //SYSIN 000009 000010 000011 000012 000013 000014 000015 000016 000017 000018 000019 000020 000021 000022 000023 000024 000025 000026 000027 000028 000029 000030 000031 000032

DELETE UWIN.SCHULUNG.SORTOUT DELETE UWIN.SCHULUNG.DS11 EXEC PGM=SORT //SORT

******

****************************

//SYSPRINT DD SYSOUT=* DD SYSOUT=* //SRTMSG

//SORTWK01 DD UNIT=3380,SPACE=(CYL,(1,1)) //SORTWK02 DD UN IT=3380,SPACE (CYL,(1,1)) =

//SORTIN //SORTOUT // // // //SYSIN SORT

DD

DSN=UWIN.SCHULUNG.DS99,DISP=SHR

DD

DISP=(,PASS)

RECFM=FB,LRECL=80, SPACE=(TRK,(5,1),RLSE), UNIT=SYSDA DD

*

FIELDS=(6,14,CH,D,20,15,CH,A)

//STEP1

EXEC PGM=PGM04

//STEPLIB //SYSPRINT //SYSABOUT //SYSOUT //INFILE //OUTFILE // // //

DD

DSN=UWIN.SCHULUNG.LOAD,DISP=SHR

DD SYSOUT=* DD SYSOUT=* DD SYSOUT=* DD DD

DSN=*.SORT.SORTOUT,DISP=(OLD.DELETE) DSN=UWIN.SCHULUNG.DS11,DISP=(,CATLG,DELETE), RECFM=FB,LRECL=80, SPACE=(TRK,(5,1),RLSE), UNIT=DSKPRM

BOTTOM OF DATA

***************************

Ihnen wird aufgefallen sein, daß als Programm nur SORT aufgerufen wurde. In den meisten Installationen ist dieser Name über einen Alias-Namen mit dem tatsächlich auszuführenden SORT-Programm verknüpft. Erkundigen Sie sich, ob Sie in gleicher Weise verfahren können oder aber explizit DFSORT oder SYNCSORT als PGM-Name angeben müssen. Beachten Sie, daß in den eben genannten Beispielen die unter SORTOUT genannten Datasets verloren

gehen,

wenn es

im STEP1

zu

einem ABEND kommen sollte. Dies

Utility-Programme hängt mit der sicher ist.

4.5

203

Benutzung

der

PASS zusammen, die nicht RESTART-

Disposition

Generation Data Groups

Generationdatasets

(Generation

Data

Group

GDG)

eröffnen die

Möglichkeit,

Datasets

über einen relativen DSN anzusprechen. Der Vorteil von GDGs besteht darin, daß man mit der gleichen JCL immer neue Datasetnamen ansprechen kann. Folgendes Beispiel soll dies illustrieren:

//INPUT //OUTPUT // // //

-

DD

DSN=UWIN.MONTAG,DISP=SHR

DD

DSN=UWIN.DIENSTAG,

DISP=(,CATLG,DELETE), UNIT=DSKPRM,RECFM=FB, SPACE=(CYL, (5,1) ,RLSE)

Wie man sich leicht vorstellen kann, müßte diese JCL jeden Tag geändert werden oder es müßte für jeden Tag der Woche eine andere JCL vorgehalten werden. Bei GDGs sieht die Sache anders aus:

//INPUT //OUTPUT // // // //

DD DD

DSN=UWIN.TAG(0),DISP=SHR DSN=UWIN.TAG(+1),

DISP=(,CATLG,DELETE), UNIT=DSKPRM, RECFM=FB,

SPACE=(CYL,(5,1),RLSE)

Die beiden DSNs sind sogenannte 'relative' Namen. MVS erzeugt daraus absolute Namen, denn nur die können vom Katalog verarbeitet werden. Vorausgesetzt, daß bereits 10 Generationen des Datasets existieren, so wird unter dem DD-Namen OUTPUT der DSN UWIN.TAG.G0011V00 Bei der erzeugt. folgenden Generation wird UWIN.TAG.G0012V00 erzeugt. Der DD-Name INPUT spricht die 10. Generation an, da sich das TAG(O) auf die letzte existierende Generation bezieht. Bevor mit GDGs in der oben angegebenen Weise (TAG(+1)) gearbeitet werden kann, muß ein GDG-Basiseintrag erzeugt werden. Wie dies zu geschehen hat, wird im folgenden

Kapitel gezeigt. Die V00

am

Ende des absoluten DSN steht für Version 00. Sie besitzt aber keinerlei

praktische Bedeutung.

204

MVS/ESA JCL

Erzeugen des GDG-Basiseintrags mit IDCAMS Syntax: DEFINE

GENERATIONDATAGROUP

(NAME(Katalogeintrag) LIMIT(limit) [EMPTY | NOEMPTY] [SCRATCH I NOSCRATCH] [TO(Datum) | FOR(Tage)])

-

-

-

-

-

GENERATIONDATAGROUP kann mit GDG

abgekürzt werden. Mit diesem IDCAMS-Kommando wird nur der Basiseintrag erzeugt. Der Name des Basiseintrages ist mit dem NAME-Parameter zu übergeben. LIMIT gibt die maximale Zahl der Generationen an, die vorgehalten werden sollen. Mehr als 255 Generationen vorzuhalten, ist nicht möglich. Mit EMPTY/NOEMPTY wird angegeben, was passieren soll, wenn die mit LIMIT angegebene maximale Zahl der Generationen erreicht wird: EMPTY bedeutet, daß in diesem Fall alle vorherigen Generationen entkatalogisiert werden. Dies ist eine extrem merkwürdige Option, die nicht verwendet werden sollte. NOEMPTY ist der Default und entkatalogisiert werden soll.

gibt

an, daß

Mit SCRATCH/NOSCRATCH wird angegeben, ob beim auch der VTOC-Eintrag gelöscht werden soll.

nur

die letzte Generation

Entkatalogisieren eines

GDGs

SCRATCH löscht beim Entkatalogisieren auch den VTOC-Eintrag. Da SCRATCH kein Default ist, empfiehlt es sich, immer SCRATCH anzugeben. Ansonsten werden nicht katalogisierte Datasets erzeugt.

NOSCRATCH erzeugt in Nicht-SMS-Umgebungen nicht katalogisierte Datasets, die dann als Leichen auf den Platten herumstehen und sollte daher vermieden werden. Unter SMS verhindert die Angabe von NOSCRATCH das Löschen der alten Generationen. Damit wird der unter LIMIT gesetzte Wert außer Kraft gesetzt. Mit TO bzw. FOR lassen sich Schutzfristen definieren. Dies ist bei Plattendatasets wenig sinnvoll, zumal mit PURGE ein Löschen ohnehin erzwungen werden kann. Im

folgenden Beispiel wird ein GDG-Basiseintrag erzeugt.

205

Utility-Programme EDIT-UW IN.SCHULUNG. IDCAMS(GDG) COMMAND ===>

01.00

******

*****************************

000001 000002 000003 000004

//UWIN217D

******

****************************

JOB

.

-

fop op DATA

COLUMNS 001 072 SCROLL ===> PAGE

*****************************

(998,ABTDG02),'M.WINTER1,CLASS=K,NOT IFY=UWIN,

MSGCLASS=9 // EXEC PGM=IDCAMS //CRGDG //SYSPRINT DD SYSOUT=* DD * 000005 //SYSIN DEFINE GDG (NAME(UUIN.SCHULUNG.GDG) LIMIT(5) SCRATCH) 000006

Im IOF sollte

***************************

folgendes Ergebnis zu sehen sein:

SYSPRINT

BROWSE

BOTTOM OF DATA

CRGDG



1-- LINE

PAGE

1-- COLS

-

COMMAND

********************************

IDCAMS

SCROLL

===>

TOP OF DATA

===>

1 80 SCREEN

**********************************

SYSTEM SERVICES

TIME: 11:45:28

DEFINE GDG (NAME(UWIN.SCHULUNG.GDG)

LIMIT(5) SCRATCH)

IDC0001I FUNCTION COMPLETED, HIGHEST CONDITION CODE WAS 0

IDC0002I IDCAMS PROCESSING COMPLETE. MAXIMUM CONDITION CODE WAS 0 *******************************

BOTTOM OF DATA

********************************

Erzeugen einer neuen Generation Um eine

neue Generation zu erzeugen, wird an den relativen DSN (+1) angehängt. MVS einen absoluten DSN. In Nicht-SMS-Umgebungen muß ein sogenannter dann erzeugt Model DCB verwendet werden. Dieser Modellname kann in jeder Installation frei definiert werden. Im Beispiel wurde der Modellname MODEL genannt. In SMS-Umgebungen kann die Angabe des DCB-Parameters in der Regel entfallen. Erkundigen Sie sich, ob er bei Ihnen eingesetzt werden muß und wie er heißen muß.

MVS/ESA JCL

206 Er wird als Wert des DCB-Parameters

codiert, wie folgendes Beispiel zeigt:

edit-uwin.schulung. idcams(gdg02) command ===>

01.01

.

-

*****************************

******

*****************************

000001 000002 000003 000004 000005 000006 000007 000008 000009 000010 000011 000012 000013 000014 000015

//uwin217g job (998,abtdg02),'m.winter',notify=uwin, // class=c, // msgclass=9, // time=(,10), // msglevel=(1,1) //* msglevel=(1,1),typrun=scan exec pgm=pgm01 //step1 //steplib dd dsn=uwin.schulung.load,disp=shr //sysprint //sysabout //sysout //outfile // // //

******

****************************

In den

columns 001 072 ===> page

scroll top of data

dd sys0ut=* dd sysout=* dd sysout=* dd

dsn=uwin.schulung.gdg(+1),disp=(,catlg), dcb=model,recfm=fb,

space=(trk,(5,1),rlse), un it=dskprm bottom of data

**************************

Messages des Jobs wird gezeigt, welcher absolute DSN erzeugt wurde:

browse

*

messages -

page

1-- line

1-- cols

1

80

--

********************************

jop of data

**********************************

step was executed cond code 0000 ief142i uwin217g step1 cataloged ief285i uwin.schulung.gdg.g0002voo vol ser nos= dsk021. ief285i ief373i step /step1 / start 91191.1145 step ief374i /step1 0min 00.18sec srb / stop 91191.1145 cpu -

-

0min 00.03s

Sofern SMS aktiviert ist, wird aus der Meldung CATALOGED die Meldung ROLLED IN. Der Aussagewert ist der gleiche. Da unter SMS schon beim Step-Anfang katalogisiert wird, werden GDGs, die der Kontrolle von SMS unterliegen, in einen vorläufigen Zustand gebracht. Dieser wird als 'deferred roll-in' Status bezeichnet. Dies ist notwendig, da erst bei Step-Ende die Disposition wirksam wird. Ist sie CATLG, so wird die neue Generation 'eingerollt' und damit aktiv, ist sie DELETE, so wird die neue Generation sofort wieder

gelöscht.

Wird das LIMIT erreicht, so wird die älteste Generation aus dem Katalog gelöscht. Wenn SCRATCH bei der Definition des Basiseintrages angegeben wurde, so wird auch der VTOC-Eintrag gelöscht (Diese Vorgehensweise wird empfohlen). In den Messages wird dies aber nicht dokumentiert.

Utility-Programme

207

Es stehen somit immer

so

viele Generationen

zur

wurden.

Abändern

von

Verfügung,

wie mit LIMIT

festgelegt

Basisparametern

Die Basisparameter EMPTY/NOEMPTY und SCRATCH/NOSCRATCH lassen sich mit dem IDCAMS ALTER-Kommando ändern. Das Limit einer GDG können Sie mit diesem Kommando nur ändern, wenn SMS bei Ihnen installiert ist. Ansonsten müssen Sie auf den weiter unten beschriebenen Weg

zurückgreifen. Im folgenden Beispiel wird eine GDG mit dem Attribut NOSCRATCH versehen, was unter SMS übrigens unsinnig wäre. EDIT-UWIN.SCHULUNG. IDCAMS(GDGALT) COMMAND ===>

01.00

*****************************

000001 000002 000003 000004 000005 000006 000007 000008 000009

//UWIN217D

JOB

// // //

MSGCLASS=9, TIME=(,05), MSGLEVEL=(1,1) MSGLEVEL=(1,1),TYPRUN=SCAN

******

TOP OF DATA

*****************************

(998,ABTDG02),'M.WINTER1,CLASS=C,NOTIFY=UWIN,

EXEC PGM=IDCAMS //CRGDG //SYSPRINT DD SYSOUT=* DD * //SYSIN ALTER UWIN.SCHULUNG.GDG NOSCRATCH **************************** ROTTOM OF DATA

Im SYSPRINT sieht das

COLUMNS 001 072 ===> PAGE

SCROLL

******

//*

.-

-

***************************

Ergebnis folgendermaßen aus:

EDIT-UWIN.SCHULUNG. IDCAMS(GDGALT) 01.00 BROWSE SYSPRINT CRGDG PAGE 1-- LINE COMMAND ===>

COLUMNS 001 072 1-- COLS 1 80 SCROLL ===> SCREEN

-.--

-

--

-

********************************

IDCAMS

ALTER

-pop OF DATA

**********************************

SYSTEM SERVICES

TIME: 11:53:33

UWIN.SCHULUNG.GDG NOSCRATCH

IDC0531I ENTRY UWIN.SCHULUNG.GDG ALTERED IDC0001I FUNCTION

COMPLETED,

HIGHEST CONDITION CODE WAS 0

IDC0002I IDCAMS PROCESSING COMPLETE. MAXIMUM CONDITION CODE WAS 0 *******************************

BOTTOM OF DATA

********************************

MVS/ESA JCL

208

Ändern des LIMITS ohne SMS Will

man

das LIMIT einer GDG herabsetzen,

so

sind, sofern SMS nicht installiert ist,

folgende Schritte erforderlich: 1. Alle Generationen entkatalogisieren. Den GDG-Basiseintrag löschen. 2. 3. Den GDG-Basiseintrag mit dem neuen LIMIT definieren. Die entkatalogisierten Generationen wieder katalogisieren. 4. Die Schritte 1 und 2 lassen sich durch ein IDCAMS-Kommando erledigen.

//SYSIN

DD

*

DELETE UWIN.SCHULUNG.GDG FORCE

Zusatzparameter FORCE ist hier unbedingt erforderlich. Er bewirkt, daß der Basiseintrag gelöscht werden kann, obwohl noch Generationen existieren. Die vorhandenen Generationen werden bei diesem Vorgang entkatalogisiert. Notieren Sie sich die VolumeAngaben der Generationen bevor Sie diesen Schritt ausführen. Ansonsten können Sie in große Schwierigkeiten beim Wiederauffinden kommen. Nach dem Löschen des Basiseintrages definieren Sie die Basis neu, diesmal mit dem neuen Der

LIMIT.

Anschließend müssen Sie die Generationen wieder katalogisieren. Dazu können Sie ISPF oder auch das Programm IEFBR14 verwenden. In beiden Fällen brauchen Sie die Volume-

Angaben.

209

Utility-Programme 01.05

EDIT-UWIN.SCHULUNG. IDCAMS(RECAT)

-.

-

COMMAND ******

SCROLL

===>

*****************************

TOP OF DATA

===>

PAGE

*****************************

000001 //UWIN217C JOB (UWIN,ABTDG02),'M.WINTER',NOTIFY=UWIN, 000002 // CLASS=T,MSGCLASS=9 000003 //*************************************************************** 000004 //* IEFBR14 ZUM KATALOGISIEREN VON GDG DATASETS 000005 //* 000006 000007 000008 000009 000010

//*

//*************************************************************** //BR14

EXEC PGM=IEFBR14

//SYSPRINT DD SYSOUT=* DD DSN=UWIN.SCHULUNG.GDG.G0002V00, //CAT1 000011 // DISP=(OLD,CATLG),

UNIT=3390,VOL=SER=DSK003

000011 // 000010 //CAT2

DD

000011 000011 000010 000011 000011 000010

UNIT=3390,VOL=SER=DSK021 DD DSN=UWIN.SCHULUNG.GDG.G0005V00,

DSN=UWIN.SCHULUNG.GDG.G0003V00, DISP=(OLD,CATLG), UNIT=3390,VOL=SER=DSK011 DD DSN=UWIN.SCHULUNG.GDG.G0004V00, DISP=(OLD,CATLG),

// //

//CAT3 // //

//CAT4

DISP=(OLD,CATLG),

000011 // 000011 // ******

UNIT=3390,VOL=SER=DSK022

****************************

BOTTOM OF DATA

***************************

Andern des LIMITS mit SMS

Mit SMS ist das Ändern des LIMITS eine einfache Sache. Man benutzt einfach das IDCAMS ALTER-Kommando:

//SYSIN

DD

*

ALTER UWIN.SCHULUNG.GDG

LIMIT(4)

Sofern die GDG mit SCRATCH definiert wurde, erscheint folgende

IDC0196I

Meldung:

UWIN.SCHULUNG.GDG.G000IVO0 HAS BEEN ROLLED OFF AND DELETED

War die GDG mit NOSCRATCH definiert, so kann folgendes passieren. Untersteht die GDG der Kontrolle von SMS, so erscheint die gleiche Meldung. Die Generation wird entkatalogisiert und gelöscht. Ist die GDG nicht unter der Kontrolle

von

SMS, so erscheint folgende Meldung:

MVS/ESA JCL

210

IDC0196I

UWIN.SCHULUNG.GDG.GO00IVO0 HAS BEEN ROLLED OFF AND UNCATALOGED

Im letzteren Fall entsteht ein nicht katalogisiertes Dataset.

Ansprechen existierender GDGs Existierende GDGs werden normalerweise über ihren relativen DSN angesprochen. Will man die zuletzt erzeugte Generation ansprechen, so ist die Nummer 0 zu verwenden, wie

folgendes Beispiel zeigt.

//INPUT

DD

DSN=UWIN.SCHULUNG.GDG(0),DISP=SHR

Sollen frühere Generationen Zahl einzutragen. So spricht:

//INPUT

DD

die vorletzte Generation

angesprochen werden,

so

ist in der Klammer eine

negative

DSN=UWIN.SCHULUNG.GDG(-1),DISP=SHR an.

Wird eine nicht existierende Generation

angesprochen, so kommt es zu einem JCL-Fehler. anzusprechen.

Es ist auch möglich, GDGs über ihren absoluten DSN

Löschen einer GDG ohne SMS Will man eine komplette GDG löschen, so kann man dies mit dem Kommando DELETE GDG tun. Sofern die GDG mit SCRATCH definiert wurde, werden beim Löschvorgang auch alle Generationen mit gelöscht. Dazu muß der Zusatzparameter FORCE verwendet werden. War die GDG mit NOSCRATCH definiert worden, so werden zwar alle Katalogeinträge, nicht aber die VTOC-Einträge gelöscht. Deshalb sollte mit dem ALTER-Kommando die Option SCRATCH vor dem Löschen gesetzt werden.

211

Utility-Programme 01.00

edit-uwin.schulung. idcahs(gdgdel)

---.

-

command ******

===>

*****************************

top of data

columns 001 072 scroll ===> page

*****************************

000001 //uwin217d job (998,abtdg02),1m.winter1,class=c,notify=uwin, 000002 // msgclass=9, 000003 // time=(,05), 000004 // msglevel=(1,1) 000005 //* msglevel=(1,1),typrun=scan exec pgm=idcams 000006 //crgdg sysout=* dd 000007 //sysprint * dd 000008 //sysin alter uwin.schulung.gdg scratch 000009 delete uwin.schulung.gdg gdg force 000010 ******

****************************

bottom of data

***************************

Die Benutzung des FORCE-Parameters ohne den Zusatz GDG bewirkt ein sieren ohne Löschen der Generationen.

Entkatalogi-

Löschen einer GDG mit SMS Will man unter SMS eine komplette GDG löschen, so kann man dies ebenfalls mit dem Kommando DELETE GDG tun. Allerdings ist es Ihnen unter SMS nicht möglich, den Zusatzparameter FORCE einzusetzen, es sei denn, Sie besitzen eine entsprechende RACFAutorisation. Um das Löschen vorhandener Generationen sicherzustellen, wird ein normaler DELETE mit einem * im DSN-Teil dem DELETE GDG vorangestellt. Das Zeichen * darf einen

kompletten Qualifier ersetzen.

edit-uwin.schulung. idcams(gdgdel) command ===> ******

*****************************

000001 //uwin217d 000002 // 000003 // 000004 // 000005 //* 000006 //crgdg 000007 //sysprint 000008 //sysin

000009 000010 ******

columns 001 072

01.00 -

.

Top of data

scroll

===>

page

*****************************

(998,abtdg02),1m.winter1,class=c,not ify=uwin, msgclass=9, time=(,05), msglevel=(1,1) msglevel=(1,1),typrun=scan job

exec pgm=idcams dd sys0ut=*

dd

*

delete uwin.schulung.gdg.* delete uwin.schulung.gdg gdg ****************************

bottom of data

***************************

MVS/ESA JCL

212 Der erste DELETE löscht alle vorhandenen

gelöscht.

zur

GDG

usw.

z.B. leere GDG selber

zugehörenden Datasets,

Anschließend wird die Dazu ist der Zusatzparameter GDG zu verwenden.

UWIN.SCHULUNG.GDG.G0003V00

nun

Besonderheiten von GDGs GDGs haben

einige Besonderheiten,

die

man

kennen muß,

Überraschungen zu vermeiden.

um

unangenehme

Die wichtigste ist die, daß beim Anlegen einer neuen Generation der Update auf die Generationsnummern nach Job-Ende erfolgt. Es ist also nicht möglich, mit Hilfe des relativen DSN innerhalb eines Jobs auf gerade angelegte neue Generationen zuzugreifen. Wird als relative Nummer 0 oder eine negative Zahl benutzt, so ist als DISP nur OLD, SHR oder MOD zulässig. MOD darf in diesem Fall nicht den Default NEW annehmen. Ansonsten kommt es zu folgendem JCL-Fehler: IEF286I JOBNAME STEPNAME DDNAME

DISP FIELD -

INCOMPATIBLE

WITH DSNAME

Wird die Generationsnummer 9999 erreicht, so wird als nächstes die Generation G0000V00 angelegt. Nur in diesem Fall kann sie existieren, beim Erzeugen der ersten Generation wird der absolute DSN G0001V00 erzeugt.

4.6

IEBCOPY

Obwohl man aufgrund des Namens vermuten könnte, die wichtigste Funktion IEBCOPY sei das Kopieren von Datasets, ist dem nicht so. Am häufigsten wird er Compress von PO-Datasets, insbesondere von Ladebibliotheken, verwandt.

Bibliotheken

von zum

kompressen mit IEBCOPY

Bei jedem Update eines Members wird dasselbe nicht überschrieben. Statt dessen wird eine neue Version ans Ende des PO-Dataset gestellt. Die alte Version erhält eine Kennzeichnung, so daß auf sie nicht mehr zugegriffen werden kann. Irgendwann einmal wird der Punkt erreicht sein, an dem das PO-Dataset voll ist. In diesem Fall werden Sie versuchen, über die ISPF Option 3.1 die Funktion 'Compress' auszulösen. Wenn Sie hierbei ständig die Meldung 'Data Set in Use' erhalten, so bedeutet dies, daß andere User ebenfalls auf das PO-Dataset zugreifen. Für die Funktion 'Compress Dataset'

brauchen Sie aber einen exklusiven Zugriff. Sie können natürlich ständig neue Versuche starten, in der Hoffnung, irgendwann einmal den gewünschten Zugriff zu bekommen. Einfacher ist es jedoch, in dieser Situation das Programm IEBCOPY einzusetzen, um die gewünschte Funktion durchzuführen.

213

Utility-Programme

Um den Compress ausführen zu können, benötigt MVS Zwischenspeicher-Datasets. Diese werden über die SYSUT3 und SYSUT4 DD-Anweisung angesprochen.

PO-Dataset, das compressed werden soll, muß mit DISP=OLD allokiert werden. Geschieht dies nicht, besteht die Gefahr, daß die Bibliothek inkonsistent und damit unbrauchbar wird. Ist ein solcher Fall eingetreten, so hilft nur noch das Zurückladen einer

Das

Sicherungsversion. Als Kontrollkommando wird COPY angegeben. Die Parameter sind INDD für INput Data Definition und OUTDD für OUTput Data Definition. Ihnen muß ein DD-Name zugeordnet werden. Beim Compress eines PO-Datasets ist er gleich. Im

folgenden Beispiel wird ein PO-Dataset compressed:

edit-uwin. schulung. ut il (iebcopy)

01.00

.-

columns 001 072

-

command

scroll

===>

******

*****************************

000001 000002 000003 000004 000005 000006 000007

//uwin217g job (998,abtdg02),'m.winter1, // notify=uwin, // class=c,

000008 000009 000010 000011 000012

//sysut3 //sysut4

dd un it=sysda,space = (trk,(5,1))

//podat //sysin

dd

dsn=uwin.schulung.load,disp=0ld

dd

*

******

****************************

fop of data

===>

page

*****************************

// msgclass=9, // msglevel=(1,1) //compress exec pgm=iebcopy //sysprint dd sysout=*

copy

dd un it=sysda,space = (trk,(5,1))

outdd=podat,

indd=podat bottom of data

***************************

An dieser Stelle fällt Ihnen möglicherweise auf, daß die DD-Anweisungen für die Arbeitsdatasets SYSUT3 und SYSUT4 weder einen DISP- noch einen DSN-Parameter besitzen. Da er weggelassen wurde, tritt der Default DISP=(NEW,DELETE,DELETE) in Kraft, der bei temporären Datasets in Ordnung ist. Der DSN für eine solches Dataset wird von MVS generiert. Es sei nochmals darauf hingewiesen, daß die Disposition für das unter PODAT angesprochene PO-Dataset niemals auf SHR gesetzt werden darf.

4.7

IEFBR14

Das

Utility-Programm IEFBR14 läßt sich für 'Disposition Processing' verwenden. Das Programm führt lediglich eine Assembler Instruktion aus, es verzweigt (branch) zum Register 14, das die Rücksprungadresse des aufrufenden Programms enthält (in diesem Fall wird die Kontrolle an MVS zurückgegeben). Obwohl das Programm nichts tut, ist es nützlich, weil allokiert und deallokiert wird. Dies heißt, daß die im DISP-Parameter gesetzte Disposition gültig wird.

214

MVS/ESA JCL

Dispositions-Verarbeitung mit IEFBR14 Da die Disposition von Datasets, die beim Lauf von IEFBR14 angesprochen werden, wirksam wird, kann man mit diesem Programm Datasets leer anlegen. Dies gilt aber nur für Datasets auf Platte. Viele Programmierer setzen IEFBR14 gerne ganz am Anfang eines Jobs ein, um alle im Job benötigten Datasets leer anzulegen. In den Folge-Steps werden diese Datasets dann mit DISP=OLD oder DISP=SHR angesprochen. Der Vorteil dieser Vorgehensweise ist, daß es während des Jobs nicht mehr zu einem Problem mit der Allokation von Platz kommen kann. Dennoch wird diese Vorgehensweise nicht empfohlen. Sie hat zwei sehr schwerwiegende Nachteile: 1.

IEFBR14 macht keinen OPEN und braucht daher eine BLKSIZE-Angabe.

2.

Bei IEFBR14 kann nicht mit dem RLSE gearbeitet werden.

Subparameter

des SPACE-Parameters

Sofern bei Ihnen gemischte Plattengruppen bestehend aus 3380er und 3390er Platten installiert sind, ist bei der Benutzung von UNIT=gruppenname nicht sicher, ob das Dataset auf einer 3380er oder 3390er Platte angelegt wird. Es kann daher keine optimale BLKSIZE angegeben werden. Läßt man die BLKSIZE Angabe weg, so kann auch MVS keine optimale BLKSIZE erzeugen, da IEFBR14 ja keinen OPEN absetzt. Stattdessen wird ein Dataset mit BLKSIZE=0 erzeugt, das nachher nicht mehr benutzbar ist. Wird bei IEFBR14 im SPACE-Parameter RLSE eingesetzt, so wird der gesamte Primärplatz freigegeben (IEFBR14 erzeugt schließlich keinen Output). Ohne RLSE läuft man aber Gefahr, viel Platz zu verschwenden. Auch bei dem Versuch, IEFBR14 zum Bereinigen des Katalogs und zum Löschen von Datasets einzusetzen, ergeben sich Probleme: EDIT-UWIN.SCHULUNG.IDCAMS(BR1401 )

01.05

.-.-.

-

COMMAND ******

===> *****************************

SCROLL fop OF DATA

===>

PAGE

*****************************

000001 //UWIN217C JOB (UWIN,ABTDG02),'M.WINTER1,NOTIFY=UWIN, 000002 // CLASS=T,MSGCLASS=9 000003 //*************************************************************** 000004 //*

000005 000006 000007 000008

//* IEFBR14 ZUM LOESCHEN EINES DATASET //* //*************************************************************** EXEC PGM=IEFBR14 //BR14

000009 //SYSPRINT DD SYSOUT=* 000010 //DELDS DD DSN=UWIN.TEST.OUTFILE, 000011 // DISP=(0LD,DELETE) ******

****************************

BOTTOM OF DATA

***************************

Utility-Programme

215

Wenn das unter DELDS angesprochene Dataset bei Step-Beginn schon nicht mehr existiert, kommt es zu einem JCL-Allokationsfehler, weil das Dataset mit DISP=(OLD,DELETE) angefaßt wird. DISP=OLD setzt aber ein existierendes Dataset voraus. Die Folge: der Job stürzt ab. Dies ist jedoch überflüssig, weil ja nur der Katalog bereinigt werden sollte. Die Tatsache, daß das Dataset bei Step-Beginn schon nicht existiert, beeinträchtigt ein späteres Vergeben des DSN nicht.

Wenn man nur den Katalog bereinigen will, so sollte man IDCAMS verwenden. Dort kann auch der Return Code mit SET MAXCC zurückgesetzt werden.

Sinnvoll einsetzen läßt sich IEFBR14 in Nicht-SMS-Umgebungen, wenn vorhandene katalogisiert werden sollen. In SMS-Umgebungen wird sich IEFBR14 kaum noch

Datasets

behaupten können.

VSAM

5

VSAM ist eine der am häufigsten genutzten Zugriffsmethoden. Die Abkürzung VSAM steht für Virtual Storage Access Method. VSAM-Datasets müssen auf Speicherplatten mit Direktzugriff (DASD) residieren.

Arten Es

von

VSAM-Datasets

gibt vier Arten von VSAM-Datasets: (Key Sequenced Data Sets) ESDS (Entry Sequenced Data Sets) RRDS (Relative Record Data Sets) LDS (Linear Data Sets)

1. KSDS

2. 3. 4.

Sie unterscheiden sich im Aufbau und in der Art und Weise, wie auf einen logischen Record zugegriffen wird. In der praktischen Arbeit haben die KSDS-Datasets die größte Bedeutung, da auf die einzelnen Records mit Schlüsseln zugegriffen werden kann. Zusätzlich zum Primärschlüssel lassen sich bis zu 255 Sekundärschlüssel definieren. KSDS-Datasets bieten auch die Möglichkeit einer effizienten sequentiellen Verarbeitung, was für die Batch-Verarbeitung von großer Bedeutung ist.

ESDS-Datasets sind die sequentielle Variante der VSAM-Datasets. Sie besitzen keinen Schlüssel. Neue Records werden wie bei PS-Datasets ans Ende des bestehenden Datasets geschrieben. Auch über ESDS-Datasets lassen sich Alternativschlüssel legen (allerdings nur mit CICS nutzen). In der Praxis werden ESDS häufig eingesetzt, um Transaktionen weg zu schreiben. Bestimmte On-Line Umgebungen (z.B. CICS Customer Information Control System) verlangen VSAM-Datasets. Ein Einsatz von PS-Datasets ist in solchen Umgebungen nicht möglich. RRDS-Datasets besitzen einen relativen Schlüssel, d.h. es muß möglich sein, zwischen der Position des Records im Dataset und dem logischen Schlüssel eine eindeutige Beziehung herzustellen. Da dies in der Praxis nicht einfach ist, besitzen RRDS-Datasets nur eine geringe Bedeutung. Alternativschlüssel werden bei RRDS-Datasets nicht unterstützt. RRDS-Datasets besitzen eine feste Record-Länge. LDS-Datasets sind das jüngste Kind unter den VSAM-Datasets. Sie unterscheiden sich erheblich von den bisher bekannten VSAM-Datasets. Sie können nur dort eingesetzt werden, wo DFP 2.3 installiert ist (entspricht dem jüngsten MVS/XA Release oder -

MVS/ESA).

218

MVS/ESA JCL

VSAM wurde 1972 eingeführt. Die Absicht von IBM, durch VSAM-Datasets die anderen Datasetformen (insbesondere die PS-Datasets) zu ersetzen, ließ sich nicht realisieren. Dies liegt daran, daß die PS-Datasets mit der Zugriffsmethode QSAM eine sehr gute Performance haben, so daß kein Grund bestand und besteht, von QSAM-Datasets abzugehen. VSAM wurde ständig weiterentwickelt und steht heute in der Form von DFP/VSAM V 2.3 zu Verfügung. VSAM ist ein zentraler Bestandteil der Katalogverwaltung in MVS. Master- und UserKatalog sind VSAM-Datasets. VSAM stellt die Integrated Catalog Facility (ICF) zur Verfügung. Sie erlaubt eine effektive Verwaltung der Datasetbestände mit den Komponenten Master-Katalog, User-Katalog, VTOC und VVDS. Im Gegensatz zu PO- oder PS-Datasets werden VSAM-Datasets automatisch katalogisiert. Es kann daher keine Probleme mit nicht-katalogisierten VSAM-Datasets geben, unabhängig davon, ob SMS installiert ist oder nicht. Der interne Aufbau von VSAM-Datasets unterscheidet sich erheblich von nicht-VSAM Datasets. So gibt es beispielsweise keinen Blockungsfaktor. VSAM-Datasets besitzen als interne Organisationselemente Kontrollintervalle (Control Intervals CI). Bei KSDSDatasets werden mehrere CIs zu einer Control Area (CA) zusammengefaßt. =

VSAM-Datasets bestehen meist aus mehreren Komponenten. So besitzt ein KSDS-Dataset eine Daten- und eine Indexkomponente. Diese Komponenten können einzeln angesprochen werden. Will man alle Komponenten in ihrer Gesamtheit ansprechen, so verwendet man dazu den Begriff Cluster. Er umfaßt alle zu einem VSAM-Dataset gehörenden Komponenten. Dies können sein: Datenteil, Indexteil, Alternativindices oder Pfade.

VSAM KSDS-Datasets VSAM KSDS-Datasets sind für den Programmierer die interessanteste und am häufigsten benutzte VSAM-Datasetform. Auf die Sätze eines KSDS-Dataset kann direkt oder

sequentiell zugegriffen werden. KSDS-Datasets besitzen eine Daten- und eine enthält Verweise auf die Records im Datenteil.

Indexkomponente.

Die

Indexkomponente

Die

Datenkomponente Die Datenkomponente eines VSAM-Dataset besteht aus Kontrollintervallen, die ihrerseits die logischen Records beinhalten. Mehrere Kontrollintervalle werden zu einer Control Area (CA) zusammengefaßt. Diese Control Area ist wichtig für das Platzmanagement. So ist es möglich, bei einem KSDS-Dataset einen prozentualen Anteil einer CA beim Laden des

Dataset frei zu halten. Die Größe einer CA läßt sich nur indirekt bestimmen. Wird der Platz für das VSAM-Dataset in Cylindern angefordert, so nimmt eine CA einen Cylinder ein. Diese Größe bringt bestimmte Performancevorteile, die in der technischen Struktur der Platten und Zugriffsanne begründet sind.

219

VSAM Die grundsätzliche Struktur des Datenteils sieht demnach Control Area 2

Control Area 1

CI1

Das Kontrollintervall

folgendermaßen aus:

CI2

CD

CI4

(CI)

In VSAM-Datasets werden die Records in Kontrollintervallen

(Control Intervals CI) Dabei beginnen die Records von links, während auf der rechten Seite Kontrollinformationen gespeichert sind. Die Größe eines Kontrollintervalls liegt zwischen 512 Byte und 32.768 Byte. Bis 8.192 muß die Kontrollintervallgröße ein Mehrfaches von 512 sein, darüber hinaus ist nur ein Mehrfaches von 2.048 erlaubt. Wird von Ihnen eine andere CI-Größe angegeben, so rundet VSAM selbständig auf die nächst größere gültige CI-Größe auf. Die Bestimmung der Größe von Kontrollintervallen kann von VSAM übernommen werden, ist aber selten optimal. Die Errechnung optimaler Größen für die CIs ist jedoch recht kompliziert. Dabei ist zu unterscheiden, ob es sich um CI-Größen für den Daten- oder den Indexteil handelt. Zunächst sollen einige allgemeine Hinweise für die Wahl der CI-Größe des Datenteils eines KSDS-Dataset gegeben werden. Die optimale CI-Größe ist von mehreren Faktoren gespeichert.

-

abhängig: 1. Ausnutzung des Plattenplatzes Da die Platten vom Typ 3380 und 3390 unterschiedliche Spurgrößen haben, ist die CIGröße, die den Platz optimal ausnutzt, unterschiedlich. Sie beträgt 18.432 für eine 3390 (= 3 CIs pro Spur) und 22.528 für eine 3380 (= 2 CIs pro Spur). 2. Art der Verarbeitung Für die sequentielle Verarbeitung sind große CI-Größen geeignet. Für direkte Verarbeitung sind kleine CI-Größen besser geeignet. Bei gemischter Verarbeitung überwiegt der Vorteil kleiner CI-Größen.

MVS/ESA JCL

220 3.

Art des

Zugriffs

Wird auf ein KSDS-Dataset nur lesend zugegriffen, so stellen große CI-Größen keinen Nachteil dar. Wird aber schreibend zugegriffen oder werden Records eingefügt, so sollten unbedingt kleine CI-Größen verwendet werden (nicht größer als 8192 Byte). 4.

Länge der logischen Records Wenn mit großen logischen Records gearbeitet wird, die mehr als 200 Byte lang sind und eine fixe Länge haben, dann sollte darauf geachtet werden, daß durch die Wahl der CI-Größe kein zu großer Anteil unbelegbaren Platzes entsteht. Die gewählte CI-Größe stellt letztlich einen Kompromiß zwischen den verschiedenen Anforderungen dar. Für die On-Line Verarbeitung werden generell kleine CI-Größen

empfohlen, da bei Schreiboperationen immer das betreffende CI für den User reserviert wird. Andere User müssen solange warten, bis der erste User seine UPDATE- oder WRITE-Operation beendet hat. Bei großen CIs wäre der Umfang der gesperrten Daten zu umfangreich und die Performance würde beeinträchtigt. Als praktikabel hat sich 4.096 bei kleinen CI-Größen herausgestellt. Diese CI-Größe liefert neben einer akzeptablen Plattennutzung eine gute On-Line Performance. Beachten Sie die Plattennutzungsrate verschiedener CI-Größen, die im Anhang abgebildet ist. Bei rein sequentieller oder nur lesender Verarbeitung können bedenkenlos große CI-Größen verwendet werden. Die Bestimmung optimaler CI-Größen für den Indexteil einer KSDS ist noch komplizierter als die für den Datenteil. Bei Index CIs hängt die optimale CI-Größe von der Art und Weise ab, wie VSAM die Schlüsseleinträge komprimieren kann. Um dies nachzuvollziehen, benötigt man sehr gute Kenntnisse von VSAM-Interna. In der Mehrzahl der Fälle bewegt sich die optimale Index-CI-Größe im Bereich zwischen 512 und 2048 Byte. Sofern Sie eine kleine Index-CI-Größe wählen, kann es sein, daß sie von VSAM nach oben korrigiert wird, falls VSAM die gewählte Größe als unzureichend erachtet.

Aufbau eines CIs Kontrollintervalle stellen die physische Komponente von VSAM-Datasets dar. Ebenso wie in einem Block eines sequentiellen Dataset sind in ihnen die logischen Records enthalten. Zudem sind in ihnen Kontrollinformationen gespeichert, die zur Verwaltung des CIs notwendig sind. Das CI besteht aus den logischen Datensätzen, die von links beginnend abgespeichert werden. Darauf folgt der Freespace (der freie Platz), der zum Einfügen neuer logischer Records genutzt werden kann. Ihm folgen RDFs (Record Definition Field), die die Länge und Häufigkeit der einzelnen logischen Records beschreiben. Ganz rechts im CI steht das CIDF (Control Interval Definition Field), in dem Informationen über Umfang und Position von freiem Platz im CI gespeichert sind.

VSAM

221

Das Record Definition Field

(RDF)

RDFs sind drei Byte lange Felder, die ein Kontrollbyte und zwei Längenbytes umfassen. Wenn aufeinander folgende logische Records die gleiche Länge besitzen, so stehen zwei RDFs: Einer definiert die Record-Länge, der andere gibt an, wie viele dieser gleich langen Records folgen. Sind die Records variabel lang, so wird für jeden Record ein RDF geschrieben. Die Daten-Records beginnen von rechts. Zwischen Daten-Records und dem ersten RDF liegt der Freespace, der zum Einfügen von weiteren Records verwendet werden kann. Beim Löschen logischer Records kann der freie Platz wiederverwendet werden. Position von logischen Records, RDFs und CIDF in einem CI:

Log.

Log.

Record2

Record 1

Das

Log.

Record3

FREE SPACE

RDF1

RDF2

CIDF

Kontrollbyte eines RDF kann folgenden Inhalt haben:

1. 2. 3.

X'OO' Dieses RDF enthält die Länge eines einzelnen Satzes. X'40' Dieses RDF enthält die Länge mehrerer gleich langer Sätze. X'08' Dieses RDF enthält die Anzahl mehrerer gleich langer Sätze.

Die beiden

Längenbytes enthalten folgende Informationen:

Typ 1 die Länge des logischen Datensatzes. Beim Typ 2 die Länge der gleich langen logischen Datensätze. 3. Beim Typ 3 die Anzahl der gleich langen logischen Datensätze. Da RRDS-Datasets eine fixe Record-Länge besitzen, enthalten die RDFs dieser Datasets andere Informationen. Es gibt für jeden Slot ein RDF, dessen erstes Byte X'OO' ist, wenn der Slot frei und X'04' ist, wenn der Slot belegt ist. Die Längenbytes enthalten immer die Satzlänge. Record-Reihenfolge im CI eines KSDS- oder ESDS-Datasets mit gleich langen logischen 1.

Beim

2.

Records:

REC 52 Byte

1 REC 52 Byte

2 REC 52 Byte

3 FREE SPACE

Es existieren zwei RDFs. Einer beschreibt die

langen Sätze.

RDF1

Länge, der

RDF2

CIDF

andere die Anzahl der

gleich

MVS/ESA JCL

222

Record-Reihenfolge logischen Records: REC 52 Byte

im CI einer KSDS oder ESDS-Dataset mit unterschiedlich

1 REC 2 REC 67 Byte 44 B.

FREE SPACE

RDF1

RDF2

langen

CIDF

Sofern immer unterschiedlich lange Records aufeinander folgen, existiert für jeden logischen Record ein RDF. Gruppen aufeinander folgender, gleich langer logischer Records werden durch zwei aufeinander folgende RDFs beschrieben. Bei variabel langen Records geht durch die große Zahl der RDFs mehr Platz im CI verloren als bei gleich langen Records. Das Control Interval Definition Field

(CIDF)

Beim Laden eines VSAM KSDS-Dataset kann der Benutzer den prozentualen Anteil des Platzes bestimmen, der in einem CI freigehalten werden soll. Im CI wird dieser Platz mit Hilfe des CIDF verwaltet. Das CIDF ist 4 Byte lang und enthält auf den ersten beiden Bytes die Anfangsposition (Displacement) des freien Platzes und auf den beiden letzten Bytes die Länge des freien Platzes.

Logische Record-Länge und Kontrollfelder Die Kontrollinformationen haben unter Umständen sehr große Auswirkungen auf den Nutzungsgrad eines CIs. So könnte man meinen, daß bei einer logischen Record-Länge von 4096 die Kontrollintervallgröße von 8192 günstig wäre, da ja dann zwei logische Records in ein CI passen müßten. Dem ist aber nicht so, da mindestens 10 Byte Kontrollinformationen ebenfalls im CI untergebracht werden müssen. Dabei handelt es sich um zwei RDFs (6 Byte) und ein CIDF (4 Byte). Es stehen daher nur 8182 Byte für die Speicherung logischer Records zur Verfügung. Bei einer logischen Record-Länge von 4096 Byte kann aber nur ein logischer Record im CI untergebracht werden. Die verbleibenden 4086 Byte reichen nicht aus, um einen weiteren logischen Record aufzunehmen. Sie sind unbenutzbarer Platz. Dieser ist nicht mit FREESPACE zu verwechseln, der der Aufnahme weiterer logischer Records dienen soll. Bei einer CI-Größe von 8192 und einer logischen Record-Länge von 4096 können nur etwa 50% des im CI vorhandenen Platzes belegt werden. Wäre die logische Record-Länge mit 4091 nur um 5 Byte kürzer, so würde ein CI mit der Größe 8192 zu 100% genutzt. Denn dann würden zwei logische Records mit 4091 insgesamt 8182 Byte einnehmen, die restlichen 10 Byte werden durch RDF und CIDF verbraucht.

VSAM

223

Achten Sie daher bei großen logischen Record-Längen darauf, daß das CI vernünftig ausgenutzt wird. Sie können damit eine erhebliche Platzersparnis und eine wesentlich bessere Performance erzielen. Die Control Area

Die Kontrollintervalle des Datenteils werden zu Control Areas zusammengefaßt, die ihrerseits freien Platz mit einschließen können. Die Größe einer CA liegt zwischen einem Track und einem Cylinder. Man sollte immer dafür sorgen, daß die CA-Größe bei einem Cylinder liegt. Dies läßt sich durch die Anforderung des Platzes in der Einheit CYLINDER erreichen. Beim Laden eines VSAM KSDS-Dataset kann der Benutzer den prozentualen Anteil des Platzes bestimmen, der in einer CA freigehalten werden soll. Dies bedeutet, daß komplette CIs innerhalb der CA freigehalten werden. Diese freien CIs werden beim Einfügen von Records benötigt. Die

Indexkomponente Auch die Indexkomponente besteht aus CIs. Allerdings ist in jedem CI nur ein Indexrecord gespeichert. Die höchste Ebene des Index besteht aus einem CI. Unter ihm befinden sich Ebenen, die mehrere CIs enthalten können. Diese Ebenen werden als Index Set bezeichnet.

Der Index Set besitzt eine baumartige Struktur. Es kann aus einem oder mehreren CIs bestehen. Die CIs enthalten Schlüssel in komprimierter Form und die zugehörigen Pointer in der Form einer relativen Byte Adresse (RBA). Die Schlüssel enthalten den höchsten abspeicherbaren Schlüssel im adressierten CI der tiefer liegenden Ebene.

Die unterste Ebene der Index Records heißt Sequence Set. Jeder dieser Records ist genau einer Control Area des Datenteils zugeordnet. Die Pointer in einem Sequence Set Record veiweisen auf die Adresse (RBA) eines CI in der Control Area. Im Sequence Set Record ist der höchste in einem CI des Datenteils ablegbare Schlüssel gespeichert. Dieser Schlüssel wird aber nicht in seiner tatsächlichen Form, sondern in einer komprimierten Art und Weise gespeichert. Diese Komprimierung trägt zu einer erheblichen Platzersparnis bei. Unter günstigen Umständen kann ein Schlüssel auf 0 Byte komprimiert werden. Es werden Kontrollinformationen mit geführt, die angeben, wie viele Stellen am Anfang und am Ende des Schlüssels komprimiert wurden. Vor dem Lesen des Schlüssels muß dieser wieder dekomprimiert werden. Bei dieser Dekomprimierung wird aber der Schlüssel nicht in seinen ursprünglichen Zustand zurückversetzt, sondern die rechts redundanten Stellen werden mit Hex 'FF' aufgefüllt. Dies ist für den String-Vergleich, den VSAM ausführt, völlig ausreichend. Auf diese Weise können VSAM KSDS-Datasets sowohl numerische als auch alphabetische Schlüssel verwalten. (Da der gespeicherte Schlüssel ohnehin nicht zu sehen ist, wird in den folgenden Abbildungen des Indexes aus Gründen der Einfachheit der kleinste Schlüssel des folgenden Daten-CIs 1 dargestellt). -

224

MVS/ESA JCL

Die

folgende Abbildung zeigt den Aufbau des Index und des Sequence Set mit den höchstmöglichen Schlüsseln im darunter liegenden Set. Die Zahlen über den CIs geben die relative Byte Adresse (RBA) an (in diesem Beispiel wird davon ausgegangen, daß die CIGröße des Daten- und Indexteils 512 ist, eine in der Praxis eher unwahrscheinliche Voraussetzung. Meist ist die CI-Größe des Datenteils größer als die des Indexteils):

In den Pointern stehen die RBAs der CIs. Bei direkter Verarbeitung werden die vertikalen Pointer benutzt. Für die sequentielle Verarbeitung eines KSDS-Dataset hält der Indexteil neben den vertikalen auch horizontale Pointer bereit, die das Auffinden des folgenden Daten-CIs ermöglichen. Dies ist erforderlich, weil die physische Reihenfolge der CIs nicht der logischen entsprechen muß.

Jeder Record im Sequence Set ist genau einer Control Area zugeordnet. Die Pointer in den Records verweisen auf genau ein CI des Datenteils. Der schraffierte Bereich in den DatenCIs soll den durch RDF und CIDF eingenommenen Platz darstellen.

VSAM Die

225

folgende Abbildung zeigt die Beziehung von Sequence Set Record zum Daten-CI:

Lesen

von

Records

Soll ein Record direkt gelesen werden, so wird der Indexteil durchsucht. Die entsprechenden Pointer verweisen auf das gesuchte CI im Datenteil. Anhand der folgenden Abbildung soll das Auffinden (direktes Lesen) des Records mit dem Schlüssel 130 erläutert werden. Beachten Sie bitte, daß die Darstellung der Schlüssel im Indexteil grob vereinfacht ist (Es wurde einfach 1 vom niedrigsten Schlüssel des Folge-CIs abgezogen). Da die Schlüssel im Indexteil komprimiert abgespeichert sind, ist eine normale Darstellung nicht möglich. Beim Lesen steigt VSAM im höchsten CI des Indexteils ein. Der erste dort abgelegte Schlüssel ist 104, also kleiner als der des gesuchten Records. Der nächste Schlüssel ist 259. Da 259 größer ist als 130, benutzt VSAM diesen Pointer mit der RBA 1024 zum Auffinden des Index-CIs der niedrigeren Ebene. Auf die gleiche wird das Index-CI des Sequence Set mit der RBA 2560 gefunden. Dieses Index-CI verwaltet die dritte Control Area des Datenbereichs. Der zweite Schlüssel dieses Index-CIs ist größer als 130, also muß im zweiten CI

226

MVS/ESA JCL

der CA 3 der gesuchte Record mit dem Schlüssel 130 zu finden sein. VSAM durchsucht dieses CI sequentiell, bis es auf den gesuchten Record stößt. Die folgende Abbildung zeigt den Aufbau des Daten- und Indexteils, die bei der Suche nach dem Record mit dem Schlüssel 130 durchlaufen wird:

Einfügen von Records In ein KSDS-Dataset können Records eingefügt werden. Der einfachste Fall liegt dann vor, das CI, in das der Record eingefügt werden muß, entsprechend viel Platz vorrätig hat. In diesem Fall greift VSAM auf das CI zu, fugt den Record ein und schreibt das CI wieder wenn

VSAM

227

zurück. CIDF und RDFs werden auf den neuesten Stand gebracht. Während des Zugriffs bleibt das CI für andere Benutzer gesperrt. Den Zustand des KSDS-Datasets vor dem Einfügen können Sie der vorangegangenen Abbildung entnehmen. Die folgende Abbildung zeigt das Beispiel eines Einfügens. Der Record mit dem Schlüssel 35 wurde eingefügt. Da im betreffenden CI ausreichend Platz vorhanden war, kam es zu keinerlei Split-Aktivität:

MVS/ESA JCL

228

Der

Cl-Split

Der zweite Fall liegt vor, wenn im betreffenden CI zwar kein Platz mehr vorhanden ist, aber in der CA noch komplett freie CIs existieren. In diesem Fall teilt VSAM das volle CI etwa in der Mitte (nicht notwendigerweise an der Einfügesteile) und schreibt die zweite Hälfte des Ausgangs-CIs in ein freies CI. Anschließend wird der Record in das erste CI eingefügt. Die Pointer im Sequence Set Record müssen jetzt ebenfalls upgedated werden, da ein bisher freies CI belegt wurde. Dies bedeutet einen erhöhten I/O-Aufwand. Im

folgenden Beispiel wurde der Record mit dem Schlüssel entsprechenden CI kein Platz mehr frei war, wurde das CI geteilt:

93

eingefugt.

Da im

VSAM

Der

229

CA-Split

Der dritte Fall

liegt vor, wenn:

1.

im betreffenden CI kein Platz mehr ist und

2.

keine komplett freien CIs in der CA mehr vorhanden sind.

In diesem Fall wird die alte CA etwa in der Mitte geteilt und die Daten-CIs auf die alte und die neue CA verteilt. Danach kann es unter Umständen noch zu einem CI-Split kommen (wie in unserem Beispiel). Bei einem CA-Split müssen die zugehörigen Sequence Set Records auf jeden Fall neu geschrieben werden. Auch die höher liegenden Index Records müssen upgedated werden. Unter Umständen reichen diese Updates bis in hohe Indexebenen hinein. Ein CA-Split ist ein äußerst I/O-intensiver Vorgang, der nach Möglichkeit vermieden werden sollte. Eine große Zahl von CA-Splits senkt die Performance erheblich! Aus diesem Grund sollten VSAM-Datasets beobachtet werden. Bei Datasets, die eine große Zahl von CA-Splits aufweisen, sollte der Anteil des Freespace in der CA erhöht werden. Auch eine Erhöhung des CI Freespace kann sinnvoll sein. Prüfen Sie auch die Zahl der Cl-Splits. Versuchen Sie nach Möglichkeit, sowohl die Zahl der CAwie der Cl-Splits zu senken. Wenn alle diese Maßnahmen keine Verbesserung bringen, so sollte das Dataset häufig reorganisiert (neu geladen) werden. Im folgenden Beispiel wird ein Record mit dem Schlüssel 220 eingefügt. Aufgrund seines Schlüssels müßte dieser Record im CI4 der CA3 eingefügt werden. Dieses CI ist jedoch voll belegt. Ein CI-Split kann nicht durchgeführt werden, da keine freien CIs in der CA3 mehr vorhanden sind. Die Tatsache, daß in den CI1 und CI3 der betreffenden CA noch Platz frei ist, spielt übrigens keine Rolle. Es kommt daher zu einem CA-Split. Beachten Sie, daß bis in die Ebene des Index Set Record hinein Updates vorgenommen werden müssen:

230

MVS/ESA JCL

Löschen von Records Soll ein logischer Record gelöscht werden, so wird er zunächst wie beim Lesen aufgesucht. Anschließend wird der logische Record physisch gelöscht. Der dabei frei werdende Platz kann zum erneuten Einfügen von Records wiederverwendet werden. Ein VSAM-Dataset, das durch Löschungen alle seine Records verliert, gilt nicht als leer. Es unterscheidet sich insofern von einem leeren (definiert, aber nicht geladen) VSAM-Dataset. KSDS-Datasets mit Alternativschlüssel

Neben dem Primärschlüssel kann der Benutzer eines KSDS-Dataset bis zu 255 Alternativschlüssel (Alternate Index) definieren. Diese Schlüssel können eindeutig oder nicht eindeutig sein (Letzteres ist in der Praxis häufig). Man kann jedoch auch nicht eindeutige Schlüssel eindeutig machen, sofern dies beim Design des Datasets vorgesehen

VSAM

231

Eindeutige Alternativschlüssel lassen sich meist einfacher in Anwendungsprogrammen verarbeiten. Für jeden Alternativschlüssel muß ein weiterer VSAM KSDS-Cluster definiert werden (sog. AIX-Cluster). Dieser verwaltet die Sekundärschlüssel und die zugehörigen Primärschlüssel. Wird über den Alternativschlüssel zugegriffen, so wird über den AIXCluster gelesen, der Schlüssel zum Zugriff auf den zugehörigen Primärcluster entnommen und dann im Primärcluster gelesen. Die Zahl der physischen I/Os ist damit um ein Vielfaches größer als beim Lesen mit dem Primärschlüssel. Daher sollten Sie sich unbedingt an die folgenden Empfehlungen halten: wird.

L

Zugriffe

über den Alternativschlüssel sollten

nur

in On-Line

werden.

Umgebungen genutzt

2.

Definieren Sie nur die unbedingt notwendigen Alternativschlüssel.

3.

In

Batch-Umgebungen ist es besser, den Basiscluster umzusortieren und dann sequentiell zu verarbeiten (Im Batch sollte man es sich ohnehin dreimal überlegen, ob aus

4.

VSAM KSDS-Datasets direkt gelesen werden

soll).

Verarbeiten Sie niemals sequentiell über den Alternativschlüssel im Batch. Die Performance ist sehr schlecht, weil jeder Record im Basiscluster direkt gelesen werden muß. Das Verhältnis zwischen physischen und logischen I/Os ist höchst ungünstig.

Zugriff auf den Alternativschlüssel erfolgt über einen sogenannten Pfad, der durch ein bestimmtes AMS-Kommando erstellt wird. Gleiches gilt für das eigentliche Laden des Alternativschlüssels. Der

VSAM ESDS-Datasets ESDS-Datasets besitzen nur eine Datenkomponente. Die Record-Länge ist variabel. Neue Records werden in freie CIs am Ende des Datasets gestellt. Ein Einfügen oder Löschen von Records ist nicht möglich. ein ESDS ist sequentiell. Es besteht jedoch auch die Hilfe RBA anzusprechen. Dieses Verfahren ist jedoch Records mit ihrer Möglichkeit, umständlich und daher wenig gebräuchlich.

Die normale

Verarbeitungsform für

ESDS-Datasets werden

überwiegend in IMS- bzw. CICS- (Customer Information Control System) Umgebungen eingesetzt, um beispielsweise Transaktionen sequentiell weg zu schreiben. In solchen Umgebungen ist der Einsatz von VSAM-Datasets zwingend, da andere Zugriffsformen nicht unterstützt werden. In 'normalen' MVS-Umgebungen behaupten sich die 'alten' QSAM-Datasets weiterhin. Auch über ESDS-Datasets kann ein AIX erzeugt werden. Damit ist es dann möglich, Records direkt anzusprechen. Diese Variante kann aus Gründen der Performance dann interessant sein, wenn: 1. nur lesend zugegriffen werden soll und

MVS/ESA JCL

232 2.

mehrere Alternativschlüssel genutzt werden sollen.

Diese Form der Verarbeitung ist nur unter CICS

möglich.

VSAM RRDS-Datasets PvRDS-Datasets besitzen nur eine Datenkomponente und als einzige VSAM-Datasetart eine fixe Record-Länge. Die CIs sind in Slots unterteilt. Im RDF wird festgehalten, ob der Slot frei oder durch einen Record belegt ist. Die Slots besitzen eine Nummer, die relative Record Nummer (RRN), über die jeder Record direkt angesprochen werden muß. RRDS-Datasets können nur dort eingesetzt werden, wo eine eindeutige Beziehung zwischen der RRN (= Position des Records im Cluster) und dem logischen Schlüssel des Anwendungsprogramms hergestellt werden kann. So könnten z.B. Kontonummern zwischen 100.001 und 999.999 über eine RRN verwaltet werden (RRN Kontonummer 100.000). Da KSDS-Datasets jedoch ökonomischer in der Platzausnutzung sind, werden sie den RRDS-Datasets meist vorgezogen. Der Vorteil der RRDS besteht im vergleichsweise schnellen Zugriff, da es keinen Schlüssel gibt, der gesucht werden müßte. =

Die relative

-

Byte Adresse (RBA)

Zur Adressierung des Datenbestandes benutzt VSAM die relative Byte Adresse (RBA). Es werden sowohl die Kontrollintervalle im Datenteil als auch im Indexteil mit einer RBA adressiert. Theoretisch kann man jedes CI mit Hilfe seiner RBA ansprechen. In der Praxis hat diese Möglichkeit jedoch kaum Bedeutung. Diese Form der Adressierung des Datenbestandes ermöglicht es, die physischen Records unabhängig von ihrer logischen Reihenfolge zu speichern. Die höchste Relative Byte Adresse ist 2^. Der Datenbestand eines VSAM-Dataset kann daher maximal 4.294.967.296 Byte umfassen. Wird versucht, über diese Grenze hinaus zu schreiben, so erhält man einen 'Dataset full'-Fehler. Wenn man in diese Situation unvorbereitet hinein gerät, so ist dies eine Katastrophe, allerdings eine vermeidbare. Wenn ein Datenbestand so groß wird, daß diese Grenze erreicht werden könnte, so muß das VSAM-Dataset gesplittet werden. Dies hat aber erhebliche Auswirkungen auf die Programme. Unter Umständen muß eine ganze Serie von Programmen angepaßt werden. Wenn man mit der Anpassung beim ersten Auftreten des Fehlers beginnt, ist es zu spät. Das Dataset muß beobachtet und neue Programme müssen fertig und ausgetestet sein, will man ein Desaster verhindern. (Stellen Sie sich vor, daß Ihr wichtigstes Dataset für Tage oder Wochen unbenutzbar ist. Die Anwender werden sich bei Ihnen bedanken!)

Übersicht VSAM-Datasets Die folgende Übersicht faßt die ESDS und RRDS zusammen:

wichtigsten

Merkmale der VSAM-Datasetformen KSDS,

233

VSAM

ESDS

RRDS

KSDS

relative RecordNummer

Schlüsselreihenfolge

Zugriff

Reihenfolge der Eingabe sequentiell

durch relative Record-Nummer oder sequentiell

direkt (Schlüssel) oder

Record-Format

fix oder variabel

fix

fix oder variabel

in freien Slots

im

Möglich, freie

möglich, freier Platz kann

Reihenfolge der Records

Hinzufügen

am

Ende des

Datasets

nicht möglich

Löschen

Slots können wiederverwendet werden

möglich, wenn der möglich geänderte Record die gleiche Länge

Ändern

sequentiell

Freespace

wiederverwendet werden

möglich

besitzt

5.1

Linear Data Sets

(LDS) sind die jüngsten Vertreter der VSAM-Datasets. Sie stehen seit der (letzte MVS/XA Version) zur Verfügung. Einführung LDS unterscheiden sich ganz erheblich von den übrigen drei VSAM-Dataset-Formen. Das Einzige, was sie mit ihnen gemein haben, ist die Tatsache, daß sich auch LDS mit IDCAMS definieren lassen. Das Hauptcharakteristikum der VSAM-Datasets, nämlich die Zugriffsmethode VSAM, fehlt den LDS jedoch völlig. LDS werden von keiner Zugriffsmethode unterstützt. Das mag auf den ersten Blick merkwürdig erscheinen, bietet jedoch auch Vorteile. Wo keine Zugriffsmethode im Spiel ist, gibt es auch keinen dadurch erzeugten Overhead. Da es keine Zugriffsmethode gibt, brauchen LDS auch keinerlei Kontrollinformationen. Die CIs eines LDS sind immer 4.096 Byte groß und beinhalten nur Daten. Sie besitzen weder Linear Data Sets von

DFP 2.3

RDFs noch CIDF.

Ein LDS wird nicht durch VSAM verarbeitet, sondern durch DIV. DIV steht für Data-inVirtual und bezeichnet eine Möglichkeit, ein sogenanntes DIV-Objekt im virtuellen Speicher zu verarbeiten. LDS werden in diesem Zusammenhang als ein Linear Data Objekt betrachtet, für das es entsprechende DIV-Makros gibt. Direkt aufrufen kann man diese Makros mit Assembler. Diese Möglichkeit ist jedoch für Anwendungsprogrammierer, die normalerweise nicht über Assemblerkenntnisse verfügen, uninteressant. Es gibt jedoch

234

MVS/ESA JCL

zwischenzeitlich eine Schnittstelle zu höheren Programmiersprachen, die sogenannten Data Windowing Services, die es gestatten, die zum Verarbeiten eines LDS notwendigen Makros aus Sprachen wie C/370, COBOL, PASCAL, PLI oder FORTRAN abzusetzen. Die Verarbeitung eines LDS geschieht in einem sogenannten Window. Das Window ist nichts weiter als eine Oler-Stufe in der LINKAGE SECTION eines COBOL-Programms. Dieses Feld ist 4096 Byte oder ein Mehrfaches von 4096 Byte groß. In dieses Fenster werden dann ein oder mehrere CIs des LDS hineingestellt und durch die entsprechenden CALLs verarbeitet. Sollen logische Records, die es ja in einem LDS nicht gibt, verarbeitet werden, so muß die Struktur des Windows entsprechend aufbereitet werden. Das Auffinden eines bestimmten Records geschieht allein durch die Logik des Anwendungsprogramms. Besondere Bedeutung besitzen LDS bei DB2. Sie werden dort als physische Struktur im Hintergrund eingesetzt, ohne daß es dem DB2-Benutzer bewußt wird.

5.2

IDCAMS für VSAM-Datasets

Die

Endung von IDCAMS steht für 'Access Method Services'. IDCAMS ist die bei weitem wichtigste Utility, die heutzutage im MVS-Umgebungen eingesetzt wird. Sie wurde im Zusammenhang mit der Einführung von VSAM-Datasets entwickelt, enthält aber auch allgemein nutzbare Funktionen für nicht-VSAM-Datasets. Diese wurden bereits im Kapitel über Utilities vorgestellt. Wie bei den bereits erwähnten Utilities, werden die zur Ausführung des IDCAMSProgramms benötigten Kommandos und Parameter über die SYSIN DD * Anweisung gegeben. Syntax:

[label]

Kommando Parameter(wert) Auf jedes Kommando folgen ein oder mehrere Parameter, denen Werte in Klammern zugewiesen werden können. Aus Gründen der Übersichtlichkeit sollte nur ein Kommando/Parameter auf eine Zeile gesetzt werden. Zur Fortsetzung des Kommandos folgt ein Blank und anschließend ein Bindestrich. Es gibt zwei Arten von Kommandos: funktionelle Kommandos, die AMS Befehle ausführen 2. Modal-Kommandos, die die Ausführung von Befehlen überwachen. In der folgenden Übersicht werden nur die AMS-Kommandos aufgelistet, die für einen Anwendungsprogrammierer von praktischer Bedeutung sind. 1.

235

VSAM Funktionelle Kommandos

AMS-Kommando

Bedeutung

BLDINDEX

Lädt einen AIX-Cluster.

DEFINE ALTERNATEINDEX Definiert einen Alternativindex. DEFINE CLUSTER

Definiert ein VSAM-Dataset (KSDS, ESDS, RRDS oder LDS).

DEFINE GDG

Definiert den

Group.

Basiseintrag für eine Generation Data

DEFINE PATH

Definiert einen Pfad, d.h. einen Katalogeintrag für eine logische Verbindung zwischen einem Basiscluster und einem einen Alternativindex.

DELETE

Löscht einen

Katalogeintrag, einen Cluster, einen

Alternativindex, einen Pfad oder eine GDG. LISTCAT

Gibt Informationen über Katalogeinträge

PRINT

Druckt den Inhalt von VSAM-Datasets.

REPRO

Kopiert Records. Input- und Output-Datasets können

aus.

VSAM- oder nicht-VSAM-Datasets sein. Es kann auch zwischen VSAM- und nicht-VSAM-Datasets kopiert werden. Modal Kommandos AMS-Kommando

Bedeutung

IF

Prüft die bei der Ausführung von funktionellen Kommandos zurückgegebenen Return Codes ab.

SET

Ändert Return Codes, die von funktionellen Kommandos

zurückgegebenen werden.

MVS/ESA JCL

236

Anlegen von VSAM-Datasets mit DEFINE CLUSTER Syntax: DEFINE CLUSTER

(NAME(Katalog-Eintrag) CYLINDERS(primär sekundär) TRACKS(primär sekundär) VOLUMES(vol-ser-no) INDEXED NUMBERED

0 °

NONINDEXED

LINEAR

RECORDSIZE(avg max) CONTROLINTERVALSIZE(Wert) UNIQUE

°

SUBALLOCATION

KEYS(Länge Position) FREESPACE(CI CA) SHAREOPTIONS (a b)

ERASE ° NOERASE SPEED ° RECOVERY IMBED • NOIMBED REPLICATE ° NOREPLICATE) ORDERED 0 UNORDERED

KEYRANGES(lowkey highkey) REUSE

°

NOREUSE

BUFFERSPACE(Wert) FOR(Tage) TO(Datum) °

SPANNED DATA



NONSPANNED

)

(

NAME(Katalog-Eintrag) VOLUMES(vol-ser-no) CONTROLINTERVALSIZE(Wert) CYLINDERS(primär sekundär) TRACKS(primär sekundär) ) INDEX ( NAME(Katalog-Eintrag) VOLUMES(vol-ser-no) CONTROLINTERVALSIZE(Wert) TRACKS(primär sekundär) _CYLINDERS(primär sekundär) ) Ein VSAM-Dataset wird mit dem DEFINE CLUSTER-Kommando angelegt. Sofern bei Ihnen SMS installiert ist, können VSAM-Datasets auch mit normaler JCL (ohne IDCAMS) angelegt werden. Die notwendigen Parameter finden Sie im Kapitel über SMS.

237

VSAM

DEFINE CLUSTER ist das bei weitem umfangreichste Kommando mit 36 Parametern. Die wichtigsten Parameter des DEFINE CLUSTER-Kommandos werden in der Übersicht auf Seite 236 vorgestellt. Wie Sie sehen, gibt es 3 verschiedene Ebenen, nämlich CLUSTER-, DATA- und INDEXEbene. Einige Parameter können auf unterschiedlichen Ebenen angegeben werden. Die meisten Definitionen werden auf der CLUSTER-Ebene durchgeführt. Der CLUSTER umfaßt alle zu einem VSAM-Dataset gehörenden Komponenten, z.B. Daten- und Indexteil eines KSDS-Dataset, einen Pfad oder einen Alternativindex. In der DATA- und INDEX-Ebene einer KSDS wird meist Parameter kodiert.

nur

der NAME- und CISZ-

NAME

Syntax:

NAME(Katalogeintrag) NAME gibt den Namen des Clusters oder der Komponente an. Die Regeln folgen denen normaler DSNs. Name kann auf CLUSTER-Ebene oder den anderen Ebenen (DATA und INDEX) angegeben werden. Wird der NAME nur auf CLUSTER-Ebene angegeben, so wird für die DATA- und die bei KSDS-Datasets vorhandene INDEX-Ebene ein Name generiert. Dazu wird .DATA oder .INDEX an den CLUSTER-Namen angehängt. Wenn man den NAME-Parameter im DATA- und/oder INDEX-Teil benutzt, andere DSN-Anhängsel als DATA und INDEX vergeben.

so

kann

man

Platzanforderung für VSAM-Datasets Syntax:

CYLINDERS(primär sekundär) TRACKS(primär sekundär) RECORDS(primär sekundär)

Abkürzung: Abkürzung: Abkürzung:

CYL TRK REC

Einer der drei angeführten Parameter muß für die Allokation von Platz verwendet werden. Der Aufbau ähnelt dem SPACE-Parameter in der DD-Anweisung. Im Unterschied zu einem QSAM-Dataset können bei einem VSAM-Dataset bis zu 122 Sekundärextents angelegt werden. Die Zahl der Extents sollte immer so gering wie möglich sein. Das Optimum ist 1, also keine Sekundärextents vorhanden. Es gibt Installationen, in denen das Anfordern von Sekundärextents in Produktionsumgebebungen verboten ist! Stellt man ein Ansteigen der Zahl der Extents fest, so sollte beim Reorganisieren des Datasets mehr Platz zur Verfügung gestellt werden. Nach dem Laden des Dataset sollten Sekundärextents noch nicht belegt sein.

238

MVS/ESA JCL

Normalerweise wird SPACE auf der CLUSTER-Ebene angefordert. Für KSDS-Datasets kann SPACE auch auf unterschiedlichen Ebenen, entweder nur auf CLUSTER-, nur auf DATA- oder aber auf DATA- und INDEX-Ebene angefordert werden. Da VSAM sich den für die INDEX-Komponente erforderlichen Platz selbst errechnet, ist eine Angabe auf dieser Ebene nicht zu empfehlen. Die Platzanforderung kann in unterschiedlichen Einheiten erfolgen. Die empfehlenswerte Einheit ist CYLINDER. Wird sie benutzt, so wird die Control Area in der Größe eines Cylinders angelegt. Dies ist besonders wichtig für KSDS-Datasets, da der Indexteil relativ gut strukturiert wird, da die Zahl der Control Areas klein gehalten wird. Außerdem sind dann Multi-Track Operations möglich, d.h. mit einer I/O Operation können alle Tracks eines Cylinders gelesen werden. Wird IMBED verwendet, so wird das erste Track des Cylinders verwendet, um den Sequence Set Record (SSR) abzuspeichern. Dann stehen der SSR und die zugehörigen CIs des Datenbereichs in einem Cylinder, was die Performance verbessert. Wird RECORDS als Größeneinheit verwendet, so kalkuliert VSAM die voraussichtliche Größe des Datasets aufgrund der Angabe für den Subparameter avg im RECSZ-Parameter. Wenn mit variabel langen Records gearbeitet wird, ist diese Vorgehensweise nicht zu empfehlen, da es fast unmöglich ist, im Vorhinein eine exakte Angabe zur durchschnittlichen Record-Größe zu machen. Es kann dann schnell zu Platzproblemen kommen. Sofern bei Ihnen SMS installiert ist, kann auch eine Angabe in der Form KILOBYTES(wert) oder MEGABYTES(wert) erfolgen. VOLUMES

Syntax:

VOLUMES(voI-ser-no [vol-ser-no ...])

Abkürzung:

VOL

Mit dem VOLUMES-Parameter wird MVS mitgeteilt, auf welches Volume oder welche Volumes das Dataset zu legen ist. Erfolgt diese Angabe nur auf der CLUSTER-Ebene, so gilt diese Angabe auch auf und INDEX-Ebene. Volume-Angaben können auch auf DATAund INDEX-Ebene erfolgen. Bei sehr großen VSAM KSDS-Datasets kann es vorteilhaft sein, Daten- und Indexbereich auf unterschiedliche Volumes (Platten) zu legen. Die Angabe eines Gruppennamens wie bei dem UNIT-Parameter ist nicht möglich. Sofern SMS aktiviert ist, kann die Angabe mit dem STORAGECLASS-Parameter erfolgen. Als Angabe ist nur vol-ser-no zulässig. Es können mehrere Volumes angegeben werden. In diesem Fall wird das VSAM-Dataset auf das erste angegebene Volume gelegt. Reicht der Platz dort nicht aus, werden Extents auf dem zweiten Volume angelegt.

VSAM

239

Die Datasetorganisationsparameter

Syntax:

Abkürzung: Abkürzung: Abkürzung Abkürzung:

INDEXED NONINDEXED NUMBERED LINEAR

IXD NIXD NUMD LIN

Gibt die Art des VSAM-Datasets an. Mit INDEXED der Default werden KSDS-Datasets angelegt, NONINDEXED steht für ESDS-Datasets und NUMBERED für RRDS-Datasets. Mit LINEAR wird ein lineares VSAM-Dataset angelegt. -

-

RECORDSIZE

Syntax:

Abkürzung:

RECORDSIZEfavg max)

RECSZ

Gibt die durchschnittliche (avg) und maximale (max) logische Record-Länge an. Wird die Größe des Datasets in RECORDS angegeben was nicht empfehlenswert ist so benutzt MVS die unter avg angegebene Länge zur Berechnung des zu allokierenden Platzes. Die gleiche Angabe unter avg und max bewirkt bei KSDS- oder ESDS-Datasets nicht, daß die Records eine fixe Länge haben. Mit Ausnahme von RRDS-Datasets hier müssen die Werte von avg und max gleich sein können die Records bis zur maximalen Länge immer variabel lang sein. Der Default-Wert ist abhängig davon, ob SPANNED oder NONSPANNED angegeben wurde. Wird RECORDSIZE und SPANNED weggelassen, so wird eine Record-Länge von 4089 für avg und max angenommen. Wird nur SPANNED angegeben, so wird der Wert für avg auf 4086 und der für max auf 32600 gesetzt. Bei LDS-Datasets ist die Angabe einer RECSZ verboten! LDS haben immer eine implizite Recordgröße von 4096. -

-

-

-

CONTROLINTERVALSIZE

Syntax:

CONTROLINTERVALSIZE(byte)_Abkürzung: C1SZ

Gibt die Größe des Kontrollintervalls an, die zwischen 512 Byte und 32.768 Byte liegt. Bis 8.192 muß die Kontrollintervallgröße ein Mehrfaches von 512 sein, darüber hinaus ist nur ein Mehrfaches von 2.048 erlaubt. Wird eine CISZ angegeben, die diesen Konventionen nicht entspricht, so wird auf die nächst größere CI-Größe aufgerundet.

240

MVS/ESA JCL

Die CISZ sollte immer für den Daten- und Indexteil den Indexteil zu klein angegeben, so wird diese Größe

angegeben von

VSAM

werden. Ist die CISZ für

korrigiert.

Das Optimieren der CISZ für den Daten- und Indexteil eines KSDS-Clusters ist eine äußerst komplizierte Angelegenheit, die den Rahmen dieses Buches sprengen würde. Als

Faustregel gilt:

Bei direktem Zugriff mit Updates oder Inserts sind kleine Kontrollintervalle für den Datenteil vorteilhaft. Bei sequentieller Verarbeitung oder direktem, nur lesenden Zugriff sind große Kontrollintervalle bis zur halben Tracklänge der Platte vorteilhaft. Bei LDS-Datasets muß entweder eine CI-Größe von 4096 verwendet werden oder es

erfolgt keine Angabe. SUBALLOCATION UNIQUE -

Syntax:

UNIQUE

I

SUBALLOCATION

Abkürzung: UNQ I SUBAL

Dieser Parameter hatte Bedeutung in Vor-MVS/XA Systemen. Heute wird immer UNIQUE verwendet. Mit dem UNIQUE/SUBALLOCATION-Parameter wurde angegeben, ob der zu allokierende Platz aus VSAM Space genommen werden soll dies geht nur, wenn VSAM Space allokiert ist oder eigener Platz allokiert wird, d.h. das VSAM-Dataset kann auf jeder Platte zu liegen kommen, auf der Sie Datasets anlegen dürfen. Da SUBALLOCATION der Default ist, muß UNIQUE angegeben werden. -

-

KEYS

Syntax:

KEYS(Länge Position) Der KEYS-Parameter darf nur bei KSDS-Datasets eingesetzt werden. Gibt Länge und Position des Schlüssels an. Das erste Byte entspricht Position 0. Die Defaults sind 64 für Länge und 0 für Position. Achten Sie besonders auf die Positionsangabe, wenn der Schlüssel nicht auf dem ersten Byte des Records beginnt. Stimmen die Angaben bei der Definition und im Programm nicht überein, so bekommen Sie einen Fehler beim Absetzen der OPEN-Anweisung. Im Listcat finden sie den Beginn der Schlüsselposition im Feld RKP (Relative Key Position).

VSAM

241

FREESPACE

Syntax: r

FREESPACE(CI CA)

Abkürzung: FSPC

Gibt den Prozentsatz von Platz an, der im CI bzw. der CA beim Laden eines KSDS-Dataset freigelassen wird. Der Default ist 0, sowohl für das CI als auch für die CA. Sofern damit zu rechnen ist, daß in das Dataset Records eingefügt werden, muß mit FREESPACE freier Platz vorgesehen werden. Wenn das Dataset eine hohe Splitrate aufweist, so kann hier eingegriffen werden, indem der Anteil freien Platzes erhöht wird. Dies sollte man vor allem beim Auftreten von CA-Splits tun. Die Summe beider Parameter sollte 50 nicht überschreiten, da ansonsten zuviel Platz verschwendet wird. Wenn zu viele Splits auftreten, erhöhen Sie den Freespace und beobachten das Dataset. Wird die Splitrate nicht besser, dann sollte das Dataset häufiger reorganisiert werden. Unter Umständen sollte eine andere CI-Größe in Erwägung gezogen werden. Achten Sie bei der Angabe für FREESPACE darauf, daß soviel Platz freigelassen zumindest ein Record aufgenommen werden kann.

wird, daß

Beispiel (CISZ 4096 Byte, RECSZ 460 Byte): FSPC

(10 10)

Die erste Angabe bewirkt, daß 10% des Cl-Platzes frei gehalten werden. Dies sind 10% von 4096 409,6 Byte, abgerundet 409 Byte. Dieser Platz reicht nicht aus, um auch nur einen logischen Record neu aufzunehmen, da die logische Record-Länge 460 Byte beträgt. Es entsteht unbenutzbarer Platz. =

Wird die FSPC-Angabe auf FSPC (12 10) erhöht, so ist der frei gehaltene Platz ausreichend für die Aufnahme eines weiteren logischen Record. Denn jetzt werden pro CI ca. 480 Byte

freigehalten. Die Angabe

FREESPACE CA gibt den Prozentsatz der komplett freizuhaltenden CIs in einer CA an. Diese komplett freien CIs werden bei Cl-Splits benötigt. Eine ausreichende Zahl freier CIs hilft, CA-Splits zu vermeiden. SHAREOPTIONS

Syntax:

SHAREOPTIONS

(a b)

Abkürzung: SHR

MVS/ESA JCL

242 Der SHAREOPTIONS-Parameter besitzt zwei Subparameter, wobei Shareoption und b für die cross-system Shareoption steht.

a

für die

cross-region

Die cross-region Shareoption regelt, wie zwei oder mehr Jobs in einem System auf ein Dataset zugreifen können. Dies ist insbesondere dann von Bedeutung, wenn ein VSAMDataset in eine On-Line Umgebung (z.B. CICS) eingebunden ist und gleichzeitig im Batch verarbeitet werden soll. Da CICS und Batch-Jobs in unterschiedlichen Regionen laufen, regelt die cross-region Shareoption den Zugriff.

Shareoption regelt den Datasetzugriff von zwei oder mehr Jobs, Systemen laufen. Eine solche Konfiguration ist in einem Prozessor-Komplex möglich. Die folgenden Angaben sind möglich: Cross-region Shareoption: Die cross-system unterschiedlichen

die auf Multi-

1. Das Dataset kann von mehreren Jobs verarbeitet werden, so lange alle Jobs nur lesend auf das Dataset zugreifen. Greift ein Job schreibend auf das Dataset zu, können andere Jobs das Dataset nicht öffnen. 2. Das Dataset kann von mehreren Jobs verarbeitet werden, solange nur ein Job schreibend und alle anderen Jobs nur lesend auf das Dataset zugreifen. 3. Das Dataset kann von mehreren Jobs lesend und schreibend verarbeitet werden. VSAM ergreift keine Maßnahmen, um die Datenintegrität zu gewährleisten. 4. Das Dataset kann von mehreren Jobs lesend und schreibend verarbeitet werden. VSAM überwacht jedoch die Einhaltung folgender Beschränkungen:

bei Direktzugriffen wird immer von der Platte Daten im VSAM-Buffer befinden Daten können nicht

ans

Ende des Datasets

gelesen, auch wenn sich die gewünschten

angehängt werden

ein CA-Split ist nicht erlaubt.

Cross-system Shareoption: 1.

Das Dataset kann von mehreren Jobs mehrerer Systeme lesend und schreibend verarbeitet werden. VSAM ergreift keine Maßnahmen, um die Datenintegrität zu

gewählleisten. 2.

Das Dataset kann

mehreren Jobs mehrerer Systeme lesend und schreibend gelten die gleichen Beschränkungen wie die unter 4 bei den

von

verarbeitet werden. Es

cross-region Shareoption genannten.

größte Maß an Datensicherheit bei größtmöglicher Effizienz gewährt die cross-region Shareoption 2. Für die cross-system Shareoption sollte man 3 angeben. Die Shareoption 4 ist wegen ihrer vielen Einschränkungen wenig sinnvoll. Die Datenintegrität muß durch Reserve-Release-Makros der Anwendungsprogramme sichergestellt werden. Bei LDS-Datasets ist als cross-system Shareoption nur 3 zulässig. Das

243

VSAM ERASE NOERASE -

Syntax:

I

ERASE

Abkürzung:

NOERASE

Wird ein VSAM-Dataset DELETE.

gelöscht,

so

geschieht

I

ERAS

NERAS

dies mit dem IDCAMS-Kommando

Dieser Vorgang löscht nur den Katalogeintrag, falls beim Löschen keine besonderen Parameter gesetzt werden. Der Datenbestand auf der Platte existiert bis zu einem evtl. Überschreiben weiter!

Sollen die Daten auch physisch gelöscht (sofort überschrieben) werden, so ist die Option ERASE zu verwenden. Wird die Option ERASE im DEFINE CLUSTER-Kommando verwendet, so wird das Dataset beim Löschen überschrieben, unabhängig davon welche Parameter beim DELETE-Kommando verwendet werden. Dieser Löschvorgang ist sehr zeitintensiv, weil das ganze Dataset mit binären Nullen überschrieben wird. Von dieser Möglichkeit sollte nur dann Gebrauch gemacht werden, wenn dies unbedingt erforderlich ist, z.B. bei der Löschung eines Dataset, das personenbezogene Daten enthält.

Achtung:

RECOVERY SPEED -

Syntax:

I

SPEED

Abkürzung: SPEED |

RECOVERY

RCVY

Diese Optionen beziehen sich nur auf das Laden von VSAM-Datasets. Mit SPEED kann schneller geladen werden, weil auf ein Vorformatieren verzichtet wird. Wird RECOVERY benutzt, so kann ein abgebrochener Ladevorgang an der Stelle des Abbruchs wieder aufgenommen werden. Dies wird aber meist nicht möglich sein, da ein Abbruch auf ein schwerwiegendes Problem hindeutet, der ein einfaches Nachladen meist unmöglich macht (z.B. zu wenig Platz allokiert). Aus diesem Grund wird SPEED

empfohlen.

IMBED NOIMBED -

Syntax: IMBED

I

NOIMBED

Abkürzung:

IMBD

I

NIMBD

MVS/ESA JCL

244

Wird der IMBED-Parameter benutzt, so wird dadurch bewirkt, daß der Sequence Set Record nicht im Indexbereich, sondern auf dem ersten Track der jeweiligen Control Area gespeichert wird. Da eine CA normalerweise einen Cylinder in Anspruch nimmt, kann VSAM den Sequence Set Record und die von ihm indizierten Datenbereiche ansprechen, ohne den Zugriffsmechanismus bewegen zu müssen. Dies ergibt eine erhebliche bessere Performance, so daß die Benutzung dieses Parameters generell empfohlen werden kann. Bei der Kalkulation des Platzes ist daran zu denken, daß in diesem Fall das erste Track eines Cylinders für die Speicherung von Daten nicht zur Verfügung steht. REPLICATE NOREPLICATE -

Syntax:

REPLICATE

I

NOREPLICATE

Abkürzung:

I

REPL

NREPL

Der REPLICATE-Parameter kann zur Verringerung des sogenannten Rotational Delay' eingesetzt werden. Er bewirkt, daß jeder Index Record auf einer separaten Spur zu schreiben ist und so oft wie möglich wiederholt wird. Dadurch wird nur sehr wenig Plattenumdrehungszeit zum Auffinden eines Index Record benötigt.

Andererseits wird mehr Plattenplatz benötigt. Besteht die Indexkomponente eines KSDSDataset aus 15 Index Records und wird REPLICATE angegeben, so nimmt der Indexteil einen kompletten Cylinder in Anspruch. Sofern sich bei Ihnen Platten-Controller, die mit einem Zwischenspeicher (Cache) ausgerüstet sind, im Einsatz befinden, sollten Sie prüfen, ob Sie auf REPLICATE verzichten können. Der replizierte Index nimmt nämlich im Cache mehr Platz weg als der nicht duplizierte. Sofern eine optimale Pufferung erfolgt, kann auf REPLICATE verzichtet werden. ORDERED UNORDERED -

Syntax:

ORDERED

I

UNORDERED

Abkürzung:

ORD

I

UNORD

Dieser Parameter hat nur in Zusammenhang mit dem KEYRANGES-Parameter Bedeutung. Wird er angegeben, so werden die Schlüsselbereiche in der genauen Reihenfolge auf die angegebenen Volumes gelegt. Beachten Sie, daß UNORDERED der Default-Wert ist.

VSAM

245

KEYRANGES

Syntax:

KEYRANGES((lowkey1 highkeyl) (lowkey2 highkey2)...) Abkürzung.: KRNG Schlüsselbereiche eines KSDS-Datasets können auf unterschiedliche Platten angelegt werden. Mit dem KEYRANGES-Parameter werden die Schlüsselbereiche angegeben, die auf die verschiedenen Platten verteilt werden sollen. Bei KEYRANGES sollten so viele Bereiche angegeben werden, wie Volumes im VOLUME-Parameter angegeben worden sind. Die Verteilung von Schlüsselbereichen auf unterschiedliche Platten kann sinnvoll sein, wenn z.B. bestimmte Bereiche nur selten, andere aber sehr häufig angesprochen werden. Selten angesprochene Bereiche kann man dann z.B. auf eine 3380, häufig angesprochene Bereiche auf eine 3390 legen. Durch das Verteilen auf unterschiedliche Platten kann das Responseverhalten günstig beeinflußt werden, weil sich nicht alle User auf einer Platte tummeln. Wenn Sie KEYRANGES einsetzen, so sollten Sie unbedingt den ORDERED-Parameter setzen. Nur dann ist gewährleistet, daß die Schlüsselbereiche auf die Platten kommen, die Sie angegeben haben. (UNORDERED ist Default!)

Beispiel: VOLUMES(DSKO01 DSK002 DSK003) KEYRANGES((X'00000000001 19999) (50001 X'FFFFFFFFFF'))

-

(20000 50000) -

ORDERED

Die Schlüsselbereiche müssen nicht vollständig sein (Lücken sind erlaubt), sie dürfen sich aber nicht überlappen. Wird versucht, mit einem Schlüssel zu schreiben, der nicht im KEYRANGE-Bereich ist, so kommt es zu einem OUT OF KEYRANGE-Fehler. Im obigen Beispiel wurde der niedrigste und höchste Schlüssel in Hexadezimalform angegeben. Die Angabe eines solchen 'Catch-all'-Bereichs kann unter Umständen den Absturz eines CICS-Systems verhindern. Die Benutzung des ORDERED-Parameters stellt sicher, daß alle Records mit den Schlüsseln bis 19999 auf die Platte DSK001, die mit 20000 bis 50000 auf die Platte DSK002 und alle Records, die einen Schlüssel größer als 50000 haben auf das Volume

DSK003 kommen.

Sind weniger VOLUMES als Schlüsselbereiche angegeben, so werden die letzten Schlüsselbereiche zusammen auf das zuletzt angegebene VOLUME gelegt.

MVS/ESA JCL

246

REUSE -NOREUSE

Syntax:

REUSE

I

NOREUSE

Abkürzung: RUS I NRUS

Mit Hilfe des REUSE-Parameters läßt sich ein VSAM-Dataset wiederverwendbar machen. Dadurch kann man sich das Löschen und Definieren vor einem erneuten Beschreiben des Datasets ersparen. Reusable Datasets werden einmal angelegt. Werden sie später mit der Anweisung OPEN OUTPUT angesprochen, so wird das Dataset behandelt, als ob es leer wäre. Um dies zu erreichen, wird ein bestimmtes Feld im Katalogeintrag, das 'high-used RBA' auf 0 gesetzt. Dieses Feld markiert das letzte verwendete Byte im letzten Record. VSAM-Datasets, die mit REUSE definiert wurden, verhalten sich so wie physischsequentielle Datasets, die beim Schreiben mit der Disposition OLD angesprochen werden. Die Option REUSE ist potentiell gefährlich, weil sie ein Überschreiben eines Dataset mit Hilfe eines Anwendungsprogramms gestattet. Wird versehentlich mit OPEN OUTPUT auf ein mit REUSE definiertes Dataset zugegriffen, so ist das Dataset in seiner ursprünglichen Form nicht mehr wiederherstellbar. BUFFERSPACE

Syntax:

BUFFERSPACE(Wert (Byte))

Abkürzung: BUFSP

VSAM stellt bei der Verarbeitung von KSDS-Datasets zwei Buffer für Daten-CIs und einen Buffer für Index-CIs zur Verfügung. Will man die Zahl der Buffer erhöhen, so kann man dies mit dem BUFFERSPACE-Parameter tun. Die Buffer sind Platz im Hauptspeicher, in die die entsprechenden CIs hineingeladen werden. Daten, die im Buffer stehen, brauchen nicht gelesen werden. Durch eine optimale Pufferung läßt sich die Zahl der physischen I/Os senken.

Wählt man bei der Angabe von BUFFERSPACE den Wert so klein, daß er für die Aufnahme von 2 Daten-CIs und einem Index-CI zu klein ist, so kommt es zu einem Abbruch. Am besten läßt man den BUFFERSPACE-Parameter ganz weg. Eine optimale Angabe ist ohnehin nicht möglich, da je nachdem, wie auf das Dataset zugegriffen wird sequentiell oder direkt -, eine unterschiedliche Pufferung notwendig ist. Soll in einem Programm die Zahl der Puffer erhöht werden, so kann dies mit dem AMP JCL-Parameter gemacht werden. -

247

VSAM FOR TO -

Syntax:

FOR(nnnn) I TO([yy]yyddd) FOR(Tage) oder TO(Datum) gibt eine Schutzfrist in Tagen oder ein Datum an, bis zu dem das Dataset nicht gelöscht werden darf. Das Format für den Parameter FOR ist (nnnn), wobei nnnn eine Zahl zwischen 1 und 9999 ist. Das Format für TO ist ([yyjyyddd). Wird das Jahr zweistellig angegeben, so werden für die beiden ersten Byte 19 angenommen. Der Wert für ddd kann zwischen 001 und 366 liegen. Die Verwendung von FOR oder TO stellt keinen absoluten Schutz gegen vorzeitiges Löschen dar. Denn durch die Angabe des Zusatzparameters PURGE bei einem DELETE mit IDCAMS kann ein Löschen auch dann erzwungen TO gesetzte Frist noch nicht abgelaufen ist.

werden,

wenn

die durch FOR oder

SPANNED NONSPANNED -

Syntax: SPANNED

I

NONSPANNED

Abkürzung: SPND I NSPND

Zeigt an, daß bei variabel langen logischen Records die Record-Länge einzelner Records größer sein kann als die CI-Größe. Diese logischen Records werden auf mehrere CIs

verteilt, wobei das CI, in dem der gespannte Record endet, für die Aufnahme weiterer

Records nicht zur Verfügung steht. Das Arbeiten mit SPANNED macht nur Sinn, wenn man trotz einzeln vorkommender langer logischer Records eine optimale CI-Größe beibehalten will. Dies wird nur selten vorkommen, daher ist NONSPANNED der Default. Record Spanning hat nachteilige Auswirkungen auf die Performance und sollte nach Möglichkeit vermieden werden.

Anlegen eines KSDS-Dataset Das

folgende Beispiel zeigt das Anlegen eines VSAM KSDS-Dataset mit 80 Byte RecordLänge und 5 Byte Schlüssellänge. Der Schlüssel beginnt beim ersten Byte des Records (= Offset 0). Das Dataset soll auf dem Volume PRM001 zu liegen kommen. Für den Fall, daß der Platz auf dem Volume PRM001 nicht ausreichen Erweiterung genutzt werden.

sollte, kann das Volume PRM002 als

248

MVS/ESA JCL

Für das Dataset sollen 5 Cylinder primär und 1 Cylinder sekundär allokiert werden. 10 Prozent des Platzes innerhalb der CIs und 10 Prozent der CIs in einer CA sollen beim Laden des Datasets freigelassen werden.

Die Shareoptions sind so gesetzt, daß sie eine Einbindung des Dataset in eine On-LineUmgebung gestatten. Alle Jobs können lesend auf das Dataset zugreifen, einer darf gleichzeitig mit Update-Absicht zugreifen. Das Setzen der Optionen REPLICATE und IMBED dient der Verbesserung der Performance. Dadurch wird Such- und Rotationszeit eingespart. Der vorangehende DELETE dient dem Bereinigen des Katalogs. Da der gesamte CLUSTER gelöscht werden soll, muß der Zusatzparameter CLUSTER beim DELETE mit angegeben werden. Das Beispiel auf der folgenden Seite zeigt die für das Anlegen eines KSDS-Dataset

erforderliche JCL. Nach der Ausführung des DEFINE CLUSTER ist das Dataset zwar definiert, aber noch leer. In diesem Zustand kann es einmal von einem Anwendungsprogramm mit der Anweisung OPEN OUTPUT angesprochen werden. Dies ist erforderlich, wenn man das Dataset mit Hilfe eines Programmes laden will. Meist wird zum Laden jedoch die REPROFunktion von IDCAMS eingesetzt.

249

VSAM

Anlegen eines VSAM KSDS-Dataset: *****************************

******

*****************************

000001 000002 000003 000004 000005 000006

(UWIN,ABTDG02),'M.WINTER 1,NOTIFY=UWIN, //UWIN217C // CLASS=T,MSGCLASS=Y

TOP OF DATA

JOB

//*************************************************************** //* //* //*

IDCAMS ZUM ANLEGEN EINES VSAM KSDS-DATASET

000007 //*************************************************************** 000008 //DEFINE EXEC PGM=IDCAMS 000009 //SYSPRINT DD SYSOUT=* 000010 //SYSIN DD * 000011 DELETE UWIN.SCHULUNG.VSAM.KSDS 000012 CLUSTER 000013 000014 DEFINE CLUSTER (NAME(UWIN.SCHULUNG.VSAM.KSDS) INDEXE) 000015 RECORDSIZEC80 80) 000016 KEYS(5 0) 000017 FREESPACEC10 10) 000018 000019 VOLUMES(PRM001 PRM002) 000020 CYLINDERSC 5 1) SHAREOPTIONS (2 3) 000021 REPLICATE 000022 IMBED ) 000023 -

-

-

000024 000025 000026 000027 ******

DATA (NAME(UWIN.SCHULUNG.VSAM.KSDS.DATA) CONTROL INTERVALSIZE(4096))

-

-

INDEX (NAME(UWIN.SCHULUNG.VSAM.KSDS.INDEX) CONTROL INTERVALSIZE(1536)) ***************************

BOTTOM OF DATA

-

***************************

Anlegen eines ESDS-Datasets Im folgenden Beispiel wird ein VSAM ESDS-Dataset angelegt. ESDS sind die sequentielle Variante von VSAM-Datasets und kommen dort zum Einsatz, wo normale QSAM-Datasets nicht eingesetzt werden können, z.B. in CICS-Umgebungen. Da ein ESDS-Dataset keine Index-Komponente besitzt, wird der Indexteil beim Definieren weggelassen. Es gibt auch keine Möglichkeit, freien Platz wie auf einem KSDS-Dataset zu definieren. Der FREESPACE-Parameter darf deshalb nicht benutzt werden. Da ein Zugriff mit einem Schlüssel ebenfalls nicht möglich ist, muß der KEYS-Parameter weggelassen

250

MVS/ESA JCL

werden. Die den soll.

Angabe

NONINDEXED teilt AMS

edit-uwin.schulung. idcloes(defesds) command ===> ******

*****************************

mit, daß ein ESDS-Dataset angelegt wer01.02

.

-

columns 001 072 ===> page

scroll

fop op data

*****************************

000001 //uwin217d job (998,abtdg02),'m.winter 1, 000002 // class=c, 000003 // msgclass=y, notify=uwin 000004 // 000005 //deldef exec pgm=idcams 000006 //sysprint dd sysout=* 000007 //sysin dd * 000008 delete 000009 uwin.schulung.vsam.esds 000010 cluster 000011 8 then set maxcc = 0 if maxcc define cluster 000012 000013 (name(uwin.schulung.vsam.esds) 000014 nonindexed cylinders (11) 000015 000016 volumes ( dsk021 ) recordsize ( 80 80 ) 000017 unique 000018 shareoptions (13)) 000019 data 000020 000021 (name(uwin.schulung.vsam.esds.data) 000022 cisz ( 18432) ) -

=

-

-

-

-

-

******

****************************

bottom of data

Die CI-Größe im Datenteil wurde für eine Platte des

****************************

Typs 3390 optimiert.

Anlegen eines RRDS-Datasets RRDS-Datasets können

nur dort sinnvoll eingesetzt werden, wo eine logische Beziehung zwischen dem Schlüssel und der relativen Position des Records im Dataset hergestellt werden kann. Einen KEYS-Parameter gibt es deshalb bei RRDS-Datasets nicht. Da RRDS Daten keine Indexkomponente besitzen, ist der Zugriff auf die Records schneller als bei der

KSDS.

Da RRDS-Datasets nur Records mit fixer Länge verarbeiten können, müssen beim RECORDSIZE-Parameter und avg und max die gleichen Angaben gemacht werden. Mit der Angabe NUMBERED wird das Anlegen eines RRDS-Datasets erreicht.

251

VSAM 01.02

EDIT-UWIN.SCHULUNG. IDCLOES(DEFRRDS)

.

-

COMMAND

COLUMNS 001 072 ===> PAGE

SCROLL

===>

******

*****************************

000001

//UUIN217D

JOB

000002 000003 000004 000005

// // //

CLASS=C, MSGCLASS=Y,

jop op DATA

*****************************

(998,ABTDG02),'M.WINTER',

NOTIFY=UWIN

EXEC PGM=IDCAMS //DELDEF 000006 //SYSPRINT DD SYSOUT=* DD * 000007 //SYSIN

000008 000009

DELETE -

UWIN.SCHULUNG.VSAM.RRDS CLUSTER

000010 000011

IF MAXCC

=

8 THEN SET MAXCC

=

0

DEFINE CLUSTER

000012 000013 000014 000015 000016 000017 000018 000019 000020

-

(NAME(UWIN.SCHULUNG.VSAM.RRDS) NUMBERED CYLINDERS

(11)

VOLUMES

( DSK031 ) )

-

RECORDSIZE ( 80 80 UNIQUE

-

-

SHAREOPTIONS

(13))

.

-

DATA -

(NAME(UWIN.SCHULUNG.VSAM.RRDS.DATA) (18432) )

000021 000022 ******

CISZ

****************************

BOTTOM OF DATA

***************************

Anlegen eines LDS-Datasets Lineare VSAM-Datasets lassen sich mit Hilfe von IDCAMS definieren. Um ein LDS zu definieren, sind nur wenige Angaben erforderlich. Lineare VSAM-Datasets bestehen nur aus einem Datenteil. Sie haben eine einheitliche CI-Größe von 4096 Byte. Diese CIs sind reine Daten-CIs ohne Kontroll-Informationen. Aus diesen Gründen sind

folgende Angaben nicht erlaubt:

1.

RECSZ

LDS kennen keine Recordsize.

2.

FSPC

LDS können keinen Freespace besitzen.

Als CISZ ist ausschließlich 4096

zulässig.

Meist wird der Parameter weggelassen.

MVS/ESA JCL

252 EDIT-UWIN. SCHULUNG. IDCLOES(DEFLDS)

01.02

.

-

COMMAND

===>

******

*****************************

000001 000002 000003 000004

//UUIN217D

JOB

joP OF DATA

COLUMNS 001 072 SCROLL ===> PAGE

*****************************

(998,ABTDG02),1M.WINTER 1,

CLASS=C, // MSGCLASS=Y, // NOTIFY=UWIN // EXEC PGM=IDCAMS 000005 //DELDEF DD SYSOUT=* 000006 //SYSPRINT DD * 000007 //SYSIN DELETE 000008 UWIN.SCHULUNG.VSAM.LINEAR 000009 CLUSTER 000010 = 8 THEN SET MAXCC = 0 IF MAXCC 000011 -

000012 000013

DEFINE CLUSTER

(NAME(UWIN.SCHULUNG.VSAM.LINEAR) LINEAR

000014 000015 000016 000017 000018 000019 ******

-

CYLINDERS

(11)

VOLUMES

( DSK031 ) ( 4096 )

CISZ

-

-

UNIQUE SHAREOPTIONS (1 3) ) ****************************

BOTTOM OF DATA

****************************

Nach dem Definieren können lineare VSAM-Datasets nur mit dem Inhalt anderer linearer VSAM-Datasets oder mit Hilfe eines Anwendungsprogrammes geladen werden.

VSAM-Datasets laden mit dem REPRO-Kommando Mit dem DEFINE CLUSTER-Kommando wird ein VSAM-Dataset angelegt, allerdings befinden sich in ihm noch keine Daten. Geladen werden kann es nun mit einem Anwendungsprogramm oder aber mit dem Inhalt eines anderen Datasets. Für diesen Kopiervorgang steht das REPRO-Kommando zur Verfügung.

Syntax: REPRO

-

INFILE(ddname) | INDATASET(dsname) OUTFILE(ddname) | OUTDATASET(dsname) FROMKEY(lowkey) | FROMNUMBER(lownumber) | FROMADDRESS(lowaddress) | SKIP(zahl) TOKEY(highkey) | TONUMBER(highnumber) | TOADDRESS(highaddress) | COUNT(zahl) -

-

-

253

VSAM

Um die INFILE/OUTFILE-Parameter benutzen zu können, müssen die DD-Namen in der JCL enthalten sein. Wird ein nicht existierendes Dataset angesprochen, bricht der Job mit einem Fehler ab. Bei der Benutzung von INDATASET oder OUTDATASET werden keine DD-Anweisungen benötigt. Werden nicht existierende Datasets angesprochen, so kommt es lediglich zu einer Meldung im SYSPRINT von IDCAMS, der Job bricht nicht ab. Es kann aber auch bei existierenden Datasets zu Allokationsproblemen kommen. Es ist auch möglich, die Kombination einzusetzen und umgekehrt.

Wenn nicht vom Beginn des folgende Weise spezifizieren:

Datasets

INFILE(ddname) OUTDATA-SET(dsname)

kopiert

werden

soll,

so

läßt sich der

Beginn

auf

1.

Bei KSDS-Datasets mit FROMKEY und Angabe des Startschlüssels.

2.

Bei RRDS-Datasets mit FROMNUMBER und Angabe des relativen Schlüssels.

3.

Bei ESDS-Datasets mit FROMADDRESS und Angabe einer relativen Byte-Adresse, die von VSAM auf die nächst größere 512-Byte-Grenze aufgerundet wird.

4.

Bei allen Datasetformen

überspringenden Records.

(außer LDS)

Wenn nicht bis zum Ende des Datasets folgende Weise spezifizieren:

mit SKIP und

kopiert

werden soll,

Angabe so

der Zahl der

läßt sich das Ende auf

1.

Bei KSDS-Datasets mit TOKEY und Angabe des Endeschlüssels.

2.

Bei RRDS-Datasets mit TONUMBER und Angabe des relativen Schlüssels.

3.

Bei ESDS-Datasets mit TOADDRESS und Angabe einer relativen von VSAM auf die nächst größere 512er Grenze aufgerundet wird.

4.

Bei allen Datasetformen kopierenden Records.

(außer LDS)

mit COUNT und

zu

Angabe

Byte-Adresse,

die

der Zahl der

zu

Beim Laden eines VSAM-Dataset mit REPRO wird das Dataset in einen physisch optimalen Zustand gebracht. Das gilt auch dann, wenn von einem anderen VSAM-Dataset kopiert wird, welches sich nicht in einem optimalem Zustand befindet. Der unter FREESPACE angegebene Platz wird beim Kopieren mit REPRO freigehalten.

MVS/ESA JCL

254

folgende Beispiel zeigt sequentiellen Datasets:

Das

das Laden eines KSDS-Dataset mit dem Inhalt eines

edit-uwin.schulung.idcamscrep01)

01.05

.

-

command

scroll

===>

******

*****************************

000001 000002 000003 000004 000005 000006 000007 000008 000009

//uwin217c

===>

page

*****************************

(uwin,abtdg02),'m.winter1,notify=uwin,

job

class=t,msgclass=y //**************************************************** idcams zum kopieren mit infile / outfile //* //*************************************************************** //

//repro //sysprint //ein //aus 000010 //sysin dd repro 000011

******

top of data

exec pgm=idcams dd sysout=* dd dd

dsn=uwin.schulung.vsamload.seq,disp=shr dsn=uwin.schulung.vsam.ksds,disp=old

*

infile(ein) outfile(aus)

****************************

bottom of data

***************************

Voraussetzung für das Funktionieren dieses Beispiels ist, daß die Records des sequentiellen Datasets, das zum Laden verwendet wird, auf dem Schlüsselfeld aufsteigend sortiert sind und keine Records mit identischem Schlüssel vorhanden sind. Sind diese Voraussetzungen nicht erfüllt, kommt es beim REPRO zu einem Abbruch. *************************************

idcams

*****************************

system services

repro infile(seqfil)

idc3302i

top of data

time: 09:45:27

outdataset(uwin.schulung.vsam.ksds)

action error on uwin.schulung.vsam.ksds

idc3314i **record x1f0f0f2f0f11 out of sequence idc0005i number of records processed was 38 idc0001i function completed, highest condition code was 8 idc0002i idcams processing complete. maximum condition code was 8 bottom of data ***************************

************************************

Die Fehlermeldung verweist darauf, daß auf dem Ladedataset der Record mit dem Schlüssel 00201 'Out of Sequence' ist. Meist ist der Fehler auf einen doppelt vorhandenen Schlüssel zurückzuführen. Ein Tip: In Testumgebungen können Sie das sequentielle Dataset mit der SORT-Utility über das Schlüsselfeld sortieren. Wenn Sie zusätzlich SUM FIELDS=NONE angeben, so

VSAM

255

werden Duplikate auf dem Schlüsselfeld unterdrückt. Bei einem es nicht mehr zu dem oben beschriebenen Fehler kommen.

so

erstellten Dataset kann

VSAM- auf VSAM-Dataset wie im folgenden Beispiel funktioniert meist die VSAM-Datasets sind vom gleichen Typ. Ein REPRO zwischen unterschiedlichen VSAM-Datasettypen ist aber ebenfalls zulässig, mit der Ausnahme von LDS-Datasets. Ein REPRO

von

problemlos, vorausgesetzt,

01.05

EDIT-UWIN.SCHULUNG.IDCAMS(REP02)

-.-.-.

-

COMMAND

SCROLL

===>

===>

******

*****************************

000001 000002 000003 000004 000005 000006 000007 000008

//UWIN217C JOB (ULJIN,ABTDG02), 1 M.WINTER 1 ,NOTIFY=UWIN, // CLASS=T,MSGCLASS=Y //*************************************************************** IDCAMS ZUM KOPIEREN MIT INDATASET / OUTDATASET //* //**********************************

000009 000010 ******

fop OF DATA

PAGE

*****************************

//REPRO EXEC PGM=IDCAMS //SYSPRINT DD SYSOUT=* //SYSIN DD * REPRO

INDATASETCUWIN.SCHULUNG.VSAM.KSDS.ALT) OUTDATASETCUWIN.SCHULUNG.VSAM.KSDS.NEU)

****************************

BOTTOM OF DATA

-

***************************

Beachten Sie, daß LDS mit REPRO nur dann geladen werden können, wenn als INFILE oder INDATASET ein anderes LDS spezifiziert wurde. Ein Laden von anderen VSAMDatasetformen ist nicht möglich.

Eine direkte Verarbeitung eines LDS ist mit Hilfe der Data Windowing Services deren komplette Darstellung den Rahmen dieses Buches jedoch sprengen würde.

VSAM KSDS-Datasets

möglich,

reorganisieren

VSAM KSDS-Datasets haben die Besonderheit, daß in das bestehende Dataset Records eingefügt werden können. Durch diese Einfügeaktivitäten kann es zu CI- bzw. CA-Splits kommen. Diese Splits beeinträchtigen die Performance. Die physische Reihenfolge der Records kann nach einiger Zeit von der logischen abweichen. Wenngleich auch dann die Verarbeitung immer gewährleistet ist, so ist die Performance besser, wenn die physische weitgehend der logischen Record-Reihenfolge entspricht. Durch die Einfügeaktivität geht freier Platz immer mehr verloren, bis irgendwann ein

Einfügen gänzlich unmöglich wird. Vorher wird VSAM versuchen, Sekundärextents anzulegen (122 sind möglich). KSDSDatasets mit einer großen Zahl von Sekundärextents haben aber ebenfalls eine sehr schlechte Performance. Über kurz oder lang muß ein KSDS-Dataset reorganisiert werden. Dieses Reorganisieren besteht aus den folgenden Schritten: 1. Sichern des KSDS-Datasets durch

Kopieren.

MVS/ESA JCL

256 2.

Löschen des KSDS-Datasets.

3.

Neudefinieren des KSDS-Datasets.

4.

Laden des KSDS-Datasets mit der unter Schritt 1

angelegten Sicherung.

Beim ersten Schritt hat man die Wahl, ob man das KSDS-Dataset in ein anderes oder auf ein sequentielles Dataset kopieren will. Das folgende Beispiel zeigt einen kompletten REORG-Job: EDIT

01.05

UWIN.SCHULUNG.IDCAMS(REORG) -

COMMAND

.

-

SCROLL

===> *****************************

000001 000002 000003 000004 000005

//UWIN217C JOB (UWIN,ABTDG02),'M.WINTER1,NOTIFY=UWIN, // CLASS=T,MSGCLASS=Y //*************************************^ //* //*

TQp op DATA

===>

REORG EINER VSAM KSDS

000006 //* 000007 //*************************************************************** 000008 //DELETE EXEC PGM=IDCAMS 000009 //SYSPRINT DD SYSOUT=* DD * 000010 //SYSIN DELETE UWIN.SCHULUNG.VSAM.KSDS.BACK 000011 IF MAXCC = 8 THEN SET MAXCC = 0 000012 000013 //*************************************************************** 000014 000015 000016 000017 000018

//* SICHERN DER KSDS //* //* //**************************************^ EXEC PGM=IDCAMS //REPR01

000019 //SYSPRINT DD SYSOUT=* 000020 //INVSAM DD DSN=UWIN.SCHULUNG.VSAM.KSDS,DISP=SHR DD DSN=UWIN.SCHULUNG.VSAM.KSDS.BACK, 000021 //OUTSEQ 000022 // DISP=(,CATLG,DELETE), 000023 // UNIT=SYSDA, 000024 // SPACE=(CYL,(10,1)), 000025 //_RECFM=FB, LRECL=80_

Das

Beispiel wird auf der folgenden Seite fortgesetzt.

PAGE

*****************************

******

257

VSAM 000026 000027 000028 000029 000030 000031 000032 000033 000034 000035 000036 000037

DD

//SYSIN

*

REPRO INFILE page

*****************************

,

notify=uwin

// //deldef //sysprint //sysin

exec pgm=idcams dd sysout=* dd

*

delete -

uwin.schulung.vsam.ksds.aix -

aix if maxcc

=

8 then set maxcc

=

0

define aix

(name(uwin.schulung.vsam.ksds.aix) relate(uwin.schulung.vsam.ksds)

-

-

cyl (11)-

(dsk005)

vol

-

freespace ( 00 00 ) recsz ( 49 84 ) keys ( 29 5 )

-

-

-

imbed repl reuse upgrade nonuniquekey ) data -

-

-

(name(uwin.schulung.vsam.ksds.aix.data)) -

index -

(name(uwin.schulung.vsam.ksds.aix.index )) bottom of data

****************************

Pfade für AIX-Datasets mit DEFINE PATH definieren Mit dem Kommando DEFINE PATH wird eine Basiscluster und dem AIX-Cluster hergestellt.

logische Verbindung

zwischen dem

Der Pfad selbst besteht nur aus einem Eintrag im Katalog. Er sorgt dafür, daß der AIXCluster geöffnet wird, wenn der Basiscluster geöffnet wird, ohne daß dadurch zusätzlicher Codieraufwand in einem Anwendungsprogramm entsteht.

MVS/ESA JCL

264

Syntax:

DEFINE PATH

(NAME(Katalog-Eintrag) PATHENTRY(Katalogeintrag) UPDATE I NOUPDATE)

-

NAME

Syntax:

NAME(Katalogeintrag) NAME gibt den Namen des Pfades daß es sich um einen Pfad handelt.

an.

Wählen Sie den Namen so, daß

man

erkennen

kann,

PATHENTRY

Syntax:

Abkürzung: PENT

PATHENTRY(Katalogeintrag) Im PATHENTRY-Parameter muß der Name des AIX-Clusters dem Kommando DEFINE AIX vergeben wurde.

angegeben werden,

der mit

UPDATE/NOUPDATE

Syntax: UPDATE

|

Abkürzung:

NOUPDATE

Der UPDATE/NOUPDATE-Parameter hat Alternativschlüssel direkt verarbeitet wird Alternativschlüssel gelegt sind.

nur

und

dann über

Bedeutung,

einen

|

UPD

NUPD der mehrere

wenn

Cluster

Beim direkten Verarbeiten des Alternativschlüssels wird der Pfad und nicht der Basiscluster in der DD-Anweisung angesprochen. Wenn UPDATE angegeben wird, so werden alle AIX-Cluster mit geöffnet und, falls erforderlich, upgedated. Wird nur lesend zugegriffen, so kann man mit NOUPDATE das der anderen Alternativschlüssel sparen.

überflüssige Mitschleppen

265

VSAM

Beispiel für Anlegen eines Pfades Im

folgenden Beispiel wird ein Pfad zum Zugriff auf den AIX-Cluster definiert: 01.00

edit-uwin.schulung.cntl(defpath)

.

-

command ******

columns 001 072 ===> page

scroll

===> *****************************

top of data

000001 //uwin217x (998,abtdg02),'m.winter 000002 // class=r, 000003 // msgclass=y, 000004 //* notify=uwin,typrun=scan notify=uwin 000005 // 000006 //defpath exec pgm=idcams 000007 //sysprint dd sysout=* dd * 000008 //sysin 000009 define path job

1

*****************************

,

-

(name(uwin.schulung.vsam.ksds.aix.path) pathentry(uwin.schulung.vsam.ksds.aix) update)

000010 000011 000012 ******

****************************

bottom of data

-

-

***************************

Alternativindex laden mit BLDINDEX

Mit dem BLDINDEX-Kommando wird der AIX-Cluster ähnlich dem REPRO-Kommando.

geladen.

Die

Wirkungsweise

ist

Syntax: BLDINDEX

INFILE(ddname) | INDATASET(Katalog-Eintrag) OUTFILE(ddname) j OUTDATASET(Katalog-Elntrag) -

EXTERNALSORT

-

j INTERNALSORT

Die Benutzung von INFILE/OUTFILE bzw. INDATASET/OUTDATASET ist wie beim REPRO. Bei INFILE bzw. INDATASET ist der Name des Basisclusters anzugeben, bei OUTFILE bzw. OUTDATASET der des AIX-Clusters. EXTERNALSORT INTERNALSORT -

Syntax:

EXTERNALSORT I INTERNALSORT

Abkz.: ESORT I ISORT

MVS/ESA JCL

266

Mit Hilfe dieses Parameters wird angegeben, ob das Sortieren der Alternativindices nur im virtuellen Speicher (ISORT) oder auf Platte (ESORT) geschieht. Wird ESORT verwendet, so sind unbedingt zwei Datasets mit den DD-Namen IDCUT1 und IDCUT2 anzugeben. Diese Datasets werden auch dann benutzt, wenn beim ISORT der virtuelle Speicher nicht ausreicht. Die Zwischenspeicher-Datasets brauchen eine UNIT- und VOLUME-Angabe. Bei VOLUME dürfen maximal 5 Plattenangaben stehen. Beachten Sie auch den Parameter AMP=AMORG', der darauf verweist, daß diese Workdatasets VSAM-Datasets sind. Diese Datasets werden von VSAM angelegt und sofort wieder gelöscht (trotz DISP=OLD und anderslautender Meldungen im Job). Ist bei Ihnen SMS aktiv, so lassen Sie die IDCUT1- und IDCUT2-Angabe weg, da eine explizite Volume-Allokation in der Regel nicht möglich sein wird. Brauchen Sie dennoch eine externes Sort-Workfile, so übernimmt SMS die gesamte Arbeit des Erstellens und Löschens dieses Files.

Beispiel für BLDINDEX Das folgende Beispiel zeigt die JCL für das Laden eines AIX-Clusters: 01.00

EDIT-UWIN.SCHULUNG.CNTL(BLDINDEX)

.-.

-

COMMAND ******

SCROLL

===> *****************************

-pop OF DATA

000001 //UWIN217X 000002 // 000003 // 000004 //* 000005 // 000006 //BLDINDEX 000007 //SYSPRINT 000008 //IDCUT1

(998,ABTDG02),'M.WINTER 1, CLASS=G, MSGCLASS=Y, NOTIFY=UWIN,TYPRUN=SCAN

000009 000010 000011 000012 000013 000014 000015 000016

//

UNIT=3390,VOL=SER=PRM001,AMP='AMORG' DD DSN=UWIN.SORT.TWO,DISP=0LD, UNIT=3390,VOL=SER=PRM001,AMP='AMORG'

******

****************************

//IDCUT2 // //BASECL //ALTCL //SYSIN

===>

PAGE

*****************************

JOB

NOTIFY=UWIN EXEC PGM=IDCAMS DD SYSOUT=* DD DSN=UWIN.SORT.ONE,DISP=OLD,

DD DSN=UWIN DD DD

SCHULUNG.VSAM.KSDS,DISP=SHR DSN=UWIN.SCHULUNG.VSAM.KSDS.AIX,DISP=OLD .

*

BLDINDEX -

INFILE(BASECL) OUTFILE(ALTCL) BOTTOM OF DATA

***************************

267

VSAM Der

folgende SYSPRINT meldet das erfolgreiche Erstellen (Laden) des Alternativindexes:

********************************

IDCAMS

fop OF DATA

**********************************

TIME: 09:43:23

SYSTEM SERVICES

BLDINDEX -

INFILE(BASECL) OUTFILE(ALTCL) IDC0652I UWIN.SCHULUNG.VSAM.KSDS.AIX SUCCESSFULLY BUILT IDC0001I FUNCTION COMPLETED, HIGHEST CONDITION CODE WAS 0 IDC0002I IDCAMS PROCESSING COMPLETE. MAXIMUM CONDITION CODE WAS 0 *******************************

BOTTOM OF DATA

********************************

Überprüfen

Sie unbedingt den SYSPRINT für den BLDINDEX. Auch ein RC 0 nicht, daß das Laden des Alternativindexes erfolgreich war. Der folgende SYSPRINT zeigt eine Fehlerbedingung, die auftreten kann, wenn bei nichteindeutigen Schlüsseln die maximale Record-Länge nicht ausreichend ist. In diesem Fall können nicht alle Sekundärschlüssel, die zum Primärschlüssel gehören, aufgenommen werden. Damit ist ein erfolgreicher Zugriff über den Sekundärschlüssel nicht in allen Fällen bedeutet

gewährleistet.

SYSPRINT

BROWSE

1-- LINE

BLDINDEX-- PAGE

1-- COLS

1

80

-

COMMAND

SCROLL

===>

********************************

IDCAMS

TOP OF DATA

===>

SCREEN

**********************************

TIME: 09:39:16

SYSTEM SERVICES

BLDINDEX -

INFILE(BASECL) OUTFILECALTCL) IDC1646I

3 EXCESS PRIME KEY VALUES FOR AIX KEY D4E4C5D3D3C5D9404040

IDC0652I UWIN.SCHULUNG.VSAM.KSDS.AIX SUCCESSFULLY BUILT IDC0001I FUNCTION COMPLETED, HIGHEST CONDITION CODE WAS 0

IDC0002I IDCAMS PROCESSING COMPLETE. MAXIMUM CONDITION CODE WAS 0 *******************************

Die

Hex-Angabe

BOTTOM OF DATA

********************************

verweist auf den Namen MUELLER. Tritt eine solche

Fehlerbedingung

auf, so redefinieren Sie den AIX-Cluster mit einer ausreichenden Schlüssellänge.

MVS/ESA JCL

268 Erstellen und Laden des AIX Das

der einen AIX

folgende Beispiel zeigt den kompletten Job,

definiert, den Pfad erstellt

und den AIX lädt. ******

*****************************

top 0f data

*****************************

000001 //uwin217x job (998,abtdg02),1m.winter , 000002 // class=r,msgclass=y,notify=uwin exec pgm=idcams 000006 //deldef 000007 //sysprint dd sys0ut=* 000008 //sysin dd * 000009 delete 000010 uwin.schulung.vsam.ksds.aix purge 000011 000012 aix if maxcc = 8 then set maxcc = 0 000013 1

-

-

-

000014 000015 000016

define aix

(name(uwin.schulung.vsam.ksds.aix) relate(uwin.schulung.vsam.ksds) (11)(dsk005)

-

-

000017 000018 000019 000020

-

freespace ( 00 00 ) recsz ( 49 84 )

-

-

000021 000022 000023 000024 000025 000026 000027 000028 000029

( 29 5 )

keys

-

imbed repl

reuse upgrade -

nonuniquekey ) data

-

-

(name(uwin.schulung.vsam.ksds.aix.data)) -

index -

000030 (name(uwin.schulung.vsam.ksds.aix.index )) 000031 /* 000032 //defpath exec pgm=idcams 000033 //sysprint dd sysout=* dd * 000034 //sysin 000035 define path 000036 (name(uwin.schulung.vsam.ksds.aix.path) 000037 pathentry(uwin.schulung.vsam.ksds.aix) -

-

-

000038 000039 /*

Das

update)

Beispiel wird auf der folgenden Seite fortgesetzt.

269

VSAM

000040 000041 000042 000043 000044 000045 000046 000047 000048 000049 000050

//BLDINDEX EXEC PGM=IDCAHS //SYSPRINT DD SYSOUT=*

******

****************************

//IDCUT1

DD

//

UNIT=3390,VOL=SER=PRM001,AMP=lAMORGl

DSN=UWIN.SORT.ONE,DISP=OLD,

//IDCUT2 // //BASECL //ALTCL

DD

DD

DSN=UWIN.SCHULUNG.VSAM.KSDS.AIX,DISP=0LD

//SYSIN

DD

*

DSN=UUIN.SORT.TWO,DISP=OLD,

UNIT=3390,VOL=SER=PRM001,AMP=1AMORG1 DD DSN=UWIN.SCHULUNG.VSAM.KSDS.DISP=SHR

BLDINDEX -

INFILE(BASECL) OUTFILE(ALTCL) BOTTOM OF DATA

***************************

Diesen kompletten Job müssen Sie nur beim ersten Definieren laufen lassen. Da der AIXCluster mit REUSE definiert wurde, reicht für einen eventuell notwendigen Update des AIX ein Job, der nur den BLDINDEX durchführt. Sofern Sie sich dafür entscheiden, den AIX-Cluster ohne UPDATE zu definieren, müssen Sie den Alternativindex täglich mit BLDINDEX auf den neuesten Stand bringen. Achten Sie jedoch darauf, daß es auch im AIX-Cluster zu Splits kommen kann, die die Performance beeinträchtigen. Wenn Sie Splits im AIX-Cluster feststellen, so fahren Sie einen kompletten Job, der den AIX reorganisiert.

Ansprechen über den AIX im Batch Die folgende JCL wird verwendet, um im Dataset über den Alternativschlüssel

zu

Batch einen machen.

Zugriff

auf ein VSAM KSDS-

Es sei an dieser Stelle nochmals darauf hingewiesen, daß die Performance im Batch sehr schlecht ist, so daß Sie auf die Möglichkeit, den Basiscluster umzusortieren und sequentiell zu

verarbeiten, zurückgreifen sollten.

folgende Vorgehensweise ist nur dann angebracht, wenn auf diese Weise eine nur sehr geringe Zahl von Datensätzen gelesen werden soll.

Die

MVS/ESA JCL

270 ******

*****************************

jQp op daTA

*****************************

000001 //UWIN217Z JOB (998,ABTDG02),1M.WINTER 1,CLASS=C,NOT IFY=UWIN, MSGCLASS=Y 000002 // 000003 //********************************** 000004 //* ZUGRIFF AUF RECORDS UEBER DEN ALTERNATIVINDEX 000005 //* 000006 //*

* * *

000007 000008 000009 000010 000011 000012 000013 000014 000015 000016

//*********************************************************************

******

****************************

//STEP1 //STEPLIB //SYSPRINT //SYSABOUT //SYSDBOUT

EXEC PGH=KSDSAIX DD

DSN=UWIN.SCHULUNG.LOAD,DISP=SHR

DD SYSOUT=* DD SYSOUT=* DD SYSOUT=*

DD SYSOUT=* //SYSOUT //VSAMFILE DD DSN=UWIN.SCHULUNG.VSAM.KSDS,DISP=SHR

//VSAMFIL1

DD

//INPFILE

DD

DSN=UWIN.SCHULUNG.VSAM.KSDS.AIX.PATH,DISP=SHR DSN=UWIN.SCHULUNG.KSDSINP.SEQ,DISP=SHR BOTTOM OF DATA

***************************

Beachten Sie die zusätzliche Angabe VSAMFIL1. Sie muß gemacht werden, auch wenn im COBOL-Programm keine SELECT ASSIGN-Anweisung steht. Der DSN unter VSAMFIL1 muß auf den Pfad verweisen, um einen Zugriff über den Alternativschlüssel zu ermöglichen. Sind mehrere AIXe definiert, so müssen sie unter den DD-Namen VSAMFIL2, VSAMFIL3 VSAMFI10 angegeben werden. Das Maximum ist 99. Im COBOL-Programm muß die SELECT ASSIGN-Anweisung um die ALTERNATE KEY IS-Klausel erweitert werden. Beim READ ist ...

READ filename KEY IS

alt-key

anzugeben. VSAM Informationen mit LISTCAT abrufen Alle mit VSAM in Zusammenhang stehenden Einträge stehen im ICF Katalog. Diese Einträge kann man sich mit dem LISTCAT-Kommando ausgeben lassen. LISTCAT funktioniert auch für nicht-VSAM-Datasets, doch sind die Informationen nicht sehr

ergiebig.

271

VSAM

Syntax: LISTCAT

-

ENTRIES(Katalogeintrag) | LEVEL(Ebene) Eintrag-Typ

-

-

NAME

I

HISTORY

|

VOLUME

|

ALLOCATION

|

ALL

Den LISTCAT können Sie als IDCAMS-Job laufen lassen. Sie können aber auch jederzeit mit den gleichen Anweisungen einen LISTCAT als TSO-Kommando absetzen. Der Nachteil dieser Vorgehensweise ist, daß Sie dann keine Möglichkeit zum Blättern haben.

Als

Eintrag-Typ sind zulässig:

EINTRAG-TYP ALTERNATEINDEX CLUSTER DATA GENERATIONDATAGROUP INDEX NONVSAM PATH USERCATALOG

ABKÜRZUNG AIX

GDG

USERCAT

Über die Parameter ENTRIES und LEVEL läßt sich die Auswahl der

zu

listenden

Katalogeinträge steuern. Werden beide Parameter weggelassen, so werden alle Katalogeinträge ausgegeben und das können sehr viele sein. Erfolgt das Suchen über den ENTRIES-Parameter, so erfolgt die Suche gemäß dem dort angegebenen Namen. Eine Ebene läßt sich durch einen Stern ersetzen. Mit dem LEVEL-Parameter wird der Beginn der Datasetnamen angegeben. VSAM listet dann alle Katalogeinträge auf, die diesen Kriterien entsprechen und zwar unabhängig von der Anzahl der Ebenen, die auf den LEVEL Eintrag folgen. Wie dies im einzelnen funktioniert, soll anhand folgender Beispiele verdeutlicht werden: 1.

LISTCAT

ENTRIES(UWIN.TEST.VSAM.KSDS.MASTER)

Listet alle Informationen über das Dataset mit dem

2.

LISTCAT

Listet alle

ENTRIES(UWIN.*)

angegebenen Namen auf.

ALL

Einträge auf, die mit UWIN beginnen und aus zwei Qualifiern bestehen.

ALL

MVS/ESA JCL

272 3.

LISTCAT

LEVEL(UWIN)

ALL

Einträge auf, die mit UWIN beginnen unabhängig von der Zahl der Qualifier. Der Umfang der auszugebenden Information läßt sich durch Auswahlparameter steuern. Der Default ist NAME. Wird er benutzt, so listet VSAM nur den Katalogeintrag, den Eintrag-Typ und, falls vorhanden, den zugeordneten User-Katalog. Wird HISTORY angegeben, so wird zusätzlich die Owner-ID, Erstellungsdatum, Listet alle

Schutzfrist bzw. Ablaufdatum und die Nummer des VSAM Release, unter dem das Dataset erstellt wurde, angegeben. Außerdem werden alle mit dem angegebenen Katalogeintrag zusammenhängenden Einträge angezeigt. Wird z.B. der Name eines Clusters angegeben, so wird auch die Daten- und Index-Komponente mit ausgegeben. Existieren auch Pfade oder Alternativindices, so werden diese auch mit ausgegeben. Wird VOLUMES angegeben, so wird zusätzlich zur HISTORY-Information Angaben über alle Volumes ausgegeben, auf denen Daten- und Indexkomponente liegen. Wird ALLOCATION angegeben erfolgen zusätzliche Information über Anzahl und Lage der Extents. Diese Informationen lassen Rückschlüsse auf den Organisationsgrad des Datasets zu. Bei der

von ALL erfolgt die umfangreichste Informationsausgabe. Sie umfaßt der Records, geänderte und gelöschte Records, Shareoptionen, Anzahl über Zahl Angaben der CI- und CA-Splits.

Der

Angabe

Output des LISTCAT

Nachfolgend ist der Output eines LISTCAT für ein VSAM KSDS-Dataset abgebildet.

273

VSAM

.

TSO COMMAND PROCESSOR .•

ENTER TSO

COMMAND, CLIST,

OR REXX EXEC BELOW:

LISTCAT ENTRIESCUWIN.SCHULUNG.VSAM) ALL UWIN.SCHULUNG.VSAM CLUSTER UCAT.T800 IN-CAT

===>

.

---

HISTORY ***

OWNER-IDENT UWIN CREATION 2 RELEASE EXPIRATION PROTECTION-PSWD (NULL) ASSOCIATIONS UWIN.SCHULUNG.VSAM.DATA DATA INDEX UWIN.SCHULUNG.VSAM.INDEX UWIN.SCHULUNG.VSAM.DATA DATA

1990.240 0000.000 RACF (NO)

.

IN-CAT UCAT.T800 HISTORY OWNER-IDENT (NULL) 2 RELEASE PROTECTION-PSWD (NULL) ASSOCIATIONS CLUSTER--UWIN.SCHULUNG.VSAM ---

1990.240 0000.000

CREATION EXPIRATION RACF

(NO)

ATTRIBUTES KEYLEN 5 RKP 0

AVGLRECL MAXLRECL

SHROPTNSd ,3) NOWRITECHK

30 30

BUFSPACE 45568 EXCPEXIT (NULL)

RECOVERY

NOIMBED

UNIQUE

NOREPLICAT

CISIZE

CI/CA NOERASE

UNORDERED

22528 30 INDEXED NOREUSE

NONSPANNED

STATISTICS

REC-TOTAL REC-INSERTED

10 0 0

REC-UPDATED REC-RETRIEVED

0 0

REC-DELETED

SPLITS-CI SPLITS-CA

FREESPACE-%CI FREESPACE-%CA FREESPC-BYTES

0 0 0

0 653312

EXCPS EXTENTS SYSTEM-TIMESTAMP:

X'A362EF924CB5F300'

16 1

274

MVS/ESA JCL ALLOCATION SPACE-TYPE

CYLINDER

HI-ALLOC-RBA

1 1

SPACE-PRI SPACE-SEC

HI-USED-RBA

675840 675840

VOLUME VOLSER

DSK018 PHYREC-SIZE

22528 2 15

DEVTYPE X'3010200E' PHYRECS/TRK VOLFLAG PRIME TRACKS/CA

HI -ALLOC-RBA

HI-USED-RBA

675840 EXTENT-NUMBER 1 675840 EXTENT-TYPE X1001

EXTENTS: LOW-CCHH

LOW-RBA 0 HIGH-RBA 675839

X'OOAIOOOO1 X'OOAIOOOE1

HIGH-CCHH

TRACKS

15

UWIN.SCHULUNG.VSAM. INDEX

INDEX ---

UCAT.T800

IN-CAT HISTORY

OWNER-IDENT

CREATION

RELEASE

EXPIRATION

(NULL) 2 PROTECTION-PSWD (NULL)

1990.240 0000.000 (NO)

RACF

ASSOCIATIONS CLUSTER--UWIN.SCHULUNG.VSAM ATTRIBUTES

KEYLEN RKP

5 0

AVGLRECL

0 505

MAXLRECL

SHROPTNS(1,3)

RECOVERY

BUFSPACE CI-SIZE 0 512 EXCPEXIT (NULL) 46 CI/CA UNIQUE NOERASE NOWRITECHK

NOREPLI CAT

NOIMBED

UNORDERED

NOREUSE

STATISTICS

REC-TOTAL

SPLITS-CI

REC-DELETED

SPLITS-CA

REC-INSERTED REC-UPDATED

FREESPACE-%CI FREESPACE-7.CA

REC-RETRIEVED 0

FREESPC-BYTES 23040

3 1 SYSTEM-TIMESTAMP : X'A362EF924CB5F300' EXCPS EXTENTS

SPACE-PRI SPACE-SEC

TRACK

1 1

HI-ALLOC-RBA

HI-USED-RBA

1

ENTRIES/SECT SEQ-SET-RBA

0

HI -LEVEL-RBA 0

ALLOCATION SPACE-TYPE

INDEX: LEVELS

23552 512

275

VSAM

IVOLUME VOLSER DEVTYPE VOLFLAG EXTENTS: LOW-CCHH HIGH-CCHH

DSK018 X'3010200E' PRIME

X'0007000E' X'0007000E'

PHYREC-SIZE 512

PHYRECS/TRK TRACKS/CA

46 1

HI-ALLOC-RBA HI-USED-RBA

23552 EXTENT-NUMBER

1 512 EXTENT-TYPE X'OO1

0 TRACKS 23551

LOW-RBA HIGH-RBA

Dies ist der Output eines TSO LISTCAT-Kommandos für ein VSAM KSDS-Dataset. Leider ist er am Bildschirm nicht so schön formatiert wie hier.

History Section Die Angaben unter History sind wenig interessant. Sie letzte Reorganisationsdatum des Datasets.

geben lediglich

Hinweise auf das

Attributes Section In der Attributes Section sind die

physischen Eigenschaften des Dataset niedergelegt.

Keylen und RKP steht für die Länge des Schlüssels, RKP für Relative Key Position, gibt also die Position des Schlüssels an, wobei bei 0 zu zählen begonnen wird. Bei ESDS- und RRDSDatasets ist dieser Wert 0.

Keylen

AVGLRECL und MAXLRECL Im Datenteil ist hier die

Länge der Records, wie sie im DEFINE CLUSTER-Kommando angegeben wurde, abgelegt. Im Indexteil steht die von VSAM ermittelte Länge, wobei MAXLRECL die Größe der CISIZE 7 Byte ist. Der AVGLRECL für den Indexteil steht -

immer auf 0. BUFSPACE

Der BUFSPACE-Wert zeigt entweder den im DEFINE CLUSTER codierten Wert oder den Default, den VSAM benutzt. In unserem Fall ist der Wert 45.568. Dies ist ausreichend, um 2 Kontrollintervalle des Datenteils (2 x 22.528 Byte) und ein Kontrollintervall des Indexteils (512 Byte) aufzunehmen.

MVS/ESA JCL

276 CISIZE

Die Angabe unter CISIZE entspricht entweder dem VSAM korrigierten Wert, wenn: 1. eine

eingegebenen Wert oder aber dem von

ungültige Kontrollintervallgröße angegeben wurde oder

2. die Kontrollintervallgröße des Indexteils Area aufzunehmen.

zu

klein ist,

um

alle Schlüssel einer Control

CI/CA Hier wird die Anzahl der Kontrollintervalle in einer Control Area angegeben. Dieser Wert kann sich bei Benutzung des IMBED-Parameters ändern. Wird der IMBED-Parameter benutzt, so wird auf dem ersten Track des Datenteils der Sequence Set Record gespeichert und so oft wie möglich wiederholt. In diesem Fall steht das erste Track für den Datenteil nicht mehr zur Verfügung. Der CI/CA Wert für den Datenteil wird von VSAM

entsprechend angepaßt. Statistics Section

In der Statistics Section werden Laden des Clusters erfolgt sind.

Angaben über die Aktivitäten geliefert, die seit dem letzten

Records Im Abschnitt Records der Statistics Section werden wichtige Hinweise auf die Art und Weise gegeben, in der auf das Dataset zugegriffen wird. Bei KSDS-Datasets ist besonders darauf zu achten, wie viele Records eingefügt werden. Einfügeaktivität ist immer I/Ointensiv und kann zu Splits von CIs und CAs führen.

Splits Diese Werte sollte man immer genau im Auge behalten. Werden sie hoch, so sollte das Dataset reorganisiert werden. Das gilt besonders bei einem hohen Anteil von CA-Splits, die eine enorme I/O-Aktivität besitzen. Cl-Splits sind ebenfalls unschön, besonders bei sequentieller Verarbeitung, allerdings längst nicht so I/O-intensiv wie CA-Splits. Sind die Split-Raten eines VSAM-Datasets abends wieder hoch, obwohl sie erst am selben Tag reorganisiert wurden, so sollte der Freespace überprüft werden.

Freespace Die Werte für FREESPACE-%CI und FREESPACE-%CA sind DEFINE CLUSTER angegeben wurden.

dieselben, die beim

Mit FREESPC-BYTES wird die Summe des freien Platzes in Bytes in völlig unbelegten Kontrollintervallen der Komponente angegeben. Freier Platz in teilweise belegten CIs ist hierbei nicht enthalten.

VSAM

277

EXCPS Die Abkürzung EXCPS steht für EXecuted Channel Programs und gibt Hinweise auf die Zahl der physischen I/Os. Beim Tunen von VSAM-Datasets ist die Beobachtung dieses Wertes von großer Bedeutung.

EXTENTS Unter EXTENTS ist die Zahl der Primär- und Sekundärextents

zusammengefaßt.

Für den

Fall, daß der zusammenhängende Platz auf der Platte nicht ausreicht, kann jeder Request

für eine Primär- oder Sekundärallokation mit maximal fünf Teilallokationen befriedigt werden. Auf diese Weise kann aber das Dataset sehr stark fragmentiert werden. Insbesondere bei sequentieller Verarbeitung von VSAM-Datasets kann sich dies sehr nachteilig auswirken, da die Zahl der physischen I/Os erhöht wird.

Allocation Section Im Abschnitt Allocation Section finden sich Platten das Dataset liegt.

Informationen, die angeben, auf welchen

SPACE TYPE

Hier wird mitgeteilt, mit welcher Einheit der Platz allokiert wurde. Dies ist meist, aber nicht notwendigerweise, die Einheit, die beim DEFINE CLUSTER verwendet wurde. SPACE-PRI und SPACE-SEC

Hier wird die Zahl der Primär- und Sekundärallokationen wiedergegeben. Wenn bei SPACE-TYPE nicht CYLINDER angegeben wurde, so werden die Angaben unter SPACEPRI und SPACE-SEC von VSAM zur Berechnung der Größe der Control Area herangezogen. Ergibt sich dabei, daß der kleinere der beiden Werte mehr als ein Cylinder auf der Platte einnimmt, so wird ein Cylinder als Größe der CA festgelegt, andernfalls der kleinere Wert in Tracks. In der Regel ist es günstiger, die Allokation in Cylindern durchzuführen. HI-ALLOC-RBA und HI-USED-RBA Dieser Wert

gibt die Highest ALLOCated Relative Byte Address bzw. die HIghest-Used Relative Byte Address an. Für die Datenkomponente eines KSDS oder RRDS-Dataset ist HI-USED-RBA immer an der Grenze einer Control Area. Mit Hilfe dieser Angabe läßt sich die Zahl der benutzten Control Areas Daten gespeichert sind.

ermitteln, in denen

VOLUME Section In der VOLUME Section werden die RBAs der einzelnen Extents wiedergegeben.

MVS/ESA JCL

278

VOLSER, DEVTYPE und VOLFLAG Für jedes VOLUME, auf dem der gesamte oder Teile des Clusters liegen, gibt

es einen VOLUMES Abschnitt. Dort ist die Vol-Ser-Nummer festgehalten ebenso wie der DeviceType. Bei großen Datasets kann es sinnvoll sein, Daten- und Indexkomponente auf unterschiedlichen Volumes anzulegen. DEVTYPE ist eine Codierung für den Plattentyp. X'30T0200E' steht für die IBM 3380 Modelle BE4, AE4, A04, AA4 und B04, X'3010200F' steht für eine 3390.

Bei VOLFLAG sind drei Angaben möglich: PRIME, OVERFLOW und CANDIDATE. Die Angabe PRIME-Volume bedeutet, daß das Volume unter Vol-Ser-Nummer das erste Volume ist, auf dem die Komponente liegt. OVERFLOW ist ein Volume, auf dem Extents liegen und CANDIDATE ist ein Volume, das zwar noch nicht belegt ist, das aber für eine Erweiterung zur Verfügung steht.

PHYREC-SIZE, PHYRECS/TRK und TRACKS/CA PHYREC-SIZE ist die physische Record-Länge, die VSAM beim Schreiben von Daten benutzt. PHYRECS/TRK ist die Anzahl der physischen Records, die auf eine Spur der Platte passen. TRACKS/CA gibt die physische Größe einer CA in Tracks an. In unserem Beispiel ist sie 15 für den Datenteil und 1 für den Indexteil. EXTENT-NUMBER und EXTENT-TYPE

Extent-Number gibt die Zahl der Extents auf dem Volume für die Zahl sollte immer klein sein.

Komponente

an.

Diese

Die Angabe Extent-Type ist nur interessant, wenn EXTENT-TYPE X'00' angegeben ist. Die dort angegebene HI-USED-RBA ist bei der Berechnung der Index Set und Sequence Set Records zu verwenden. HI-ALLOC-RBA und HI-USED-RBA

Diese Angaben beziehen sich auf das Allokation genannten.

VSAM-Datasets

recovern

-

angegebene Volume,

im

Gegensatz

zu

den unter

VERIFY

Besonders in Testumgebungen kann es vorkommen, daß Programme abbrechen und VSAM-Datasets nicht ordnungsgemäß geschlossen werden. Häufiger Grund ist z.B. der Absturz eines CICS-Systems. In diesem Fall kann das Feld High-Used RBA nicht mehr upgedated werden. Bei einem folgenden OPEN sind dann die Records, die vor dem Absturz ans Ende eines VSAM-Datasets geschrieben wurden, nicht mehr verfügbar. Das VERIFY Kommando kann diese Situation beheben.

Syntax:

VERIFY

-

FILE(ddname) | DATASET(Eintrag-Name)

VSAM

279

Wenn Sie bei Datasets, die in On-Line-Umgebungen eingebunden sind, vor dem Beginn der Batch-Verarbeitung keinen expliziten VERIFY durchführen, so kann es passieren, daß MVS einen impliziten VERIFY durchführt. Dabei kann beim OPEN ein File Status von 97 zurückgegeben werden. Dies ist aber kein Zeichen für einen Fehler. Wenn Sie VSAM-Datasets, die in On-Line Systeme eingebunden sind, im Batch verarbeiten wollen, so setzen Sie vor der Verarbeitung einen Step, der einen IDCAMS VERIFY macht. Dies vermeidet die o.a. Situation. Im folgenden Beispiel läuft ein VERIFY über zwei VSAM-Datasets: UWIN.SCHULUNG.IDCAMS(VER01)

EDIT -

COMMAND ******

01.05 -

.

SCROLL

===> *****************************

TOP OF DATA

===>

PAGE

*****************************

000001 //UWIN217C JOB (UWIN.ABTDG02),1M.WINTER 1,NOTIFY=UWIN, 000002 // CLASS=T,MSGCLASS=Y 000003 //*************************************************************** 000004 //* 000005 //* IDCAMS ZUM VERIFY 000006 //* 000007 //*************************************************************** 000008 //PRINT EXEC PGM=IDCAMS 000009 //SYSPRINT DD SYS0UT=* 000010 //V1 DD DSN=UWIN.TEST.VSAM.KSDS.MASTER,DISP=SHR 000011 //V2 DD DSN=UWIN.TEST.VSAM.KSDS.TESTDAT,DISP=SHR DD * 000012 //SYSIN VERFIFY FILE(V1) 000013 VERFIFY FILECV2) 000014 *******************************

BOTTOM OF DATA

*******************************

JCL für existierende VSAM-Datasets Um VSAM-Datasets ansprechen zu können, reicht die Angabe des DSN- und des DISPParameters in der DD-Anweisung aus. Über den Katalogeintrag erhält MVS die Information darüber, daß es sich um ein VSAM-Dataset handelt und welcher Typ von VSAM-Dataset angesprochen wird. Der DlSP-Parameter kann, sofern SMS bei Ihnen nicht aktiviert ist, sinnvollerweise nur auf SHR oder OLD gesetzt werden. Andere Angaben sind zwar zulässig, werden aber ignoriert. Dies gilt aber nicht, wenn SMS aktiv ist.

Der AMP-Parameter in der

DD-Anweisung

Der AMP (Access Method Parameter) ist für VSAM-Datasets das, was der DCB (Data Control Block) für nicht-VSAM-Datasets ist. Im Normalfall braucht er nicht verwendet werden, mit Ausnahme einiger spezieller Situationen, auf die jetzt eingegangen wird.

MVS/ESA JCL

280

Syntax:

AMP='([AMORG][,BUFND=n][,BUFNI=n])' Will man ein VSAM-Dataset auf DUMMY setzen, sein Vorhandensein also nur simulieren, so kann logischerweise kein Katalogeintrag vorhanden sein, dem MVS die notwendigen Informationen entnehmen könnte. Daher muß:

//VSAMFILE

DD

DUMMY,AMP='AMORG'

Der AMP-Parameter teilt MVS

mit, daß es sich bei dem Dataset um ein VSAM-Dataset handelt. Bei einem Lesezugriff wird die End-of-File Bedingung zurückgegeben. Schreibzugriffe werden ignoriert. Mit Hilfe der BUFND (BUFfer Number Data) und des BUFNI (BUFfer Number Index) läßt sich die Performance des Programms beim direkten Lesen beeinflussen. Der DefaultWert für den Datenbuffer ist 2, der für den Indexbuffer ist 1. Erfolgt nun ein Zugriff auf einen Record, dessen Daten nicht im Buffer stehen, so muß dieser erst geladen werden. Steht auch der Indexrecord nicht im Buffer, so muß auch dieser geladen werden. Beide Vorgänge kosten Zeit. Nun könnte man durch eine entsprechend große Zahl von Buffern erreichen, daß Daten- und Indexkomponente fast vollständig in den Buffer geladen werden, doch dazu reicht seine Kapazität nicht aus. Sinnvoll ist in jedem Fall, beim direkten Lesen soviele Indexbuffer zu belegen, wie der Index Levels (Ebenen) hat (Angabe im LISTCAT). Für das

sequentielle Lesen empfiehlt es sich, die Zahl (Standardmäßig werden nur 2 zur Verfügung gestellt).

der Datenbuffer zu erhöhen Die Erhöhung der Zahl der Datenbuffer kann den Nachteil kleiner Daten-CI-Größen bei sequentieller Verarbeitung vermindern. Im folgenden Beispiel werden für das Dataset acht Index- und drei Datenbuffer allokiert:

//VSAMFILE DD DSN=UWIN.VSAM.KSDS.TESTFILE, DISP=SHR, // AMP='(BUFNI=8,BUFND=3)' // VSAM-Datasets drucken mit dem PRINT-Kommando Mit Hilfe des PRINT-Kommandos läßt sich der Inhalt von VSAM- und nicht-VSAMDatasets ausgeben. Dabei kann das Ausgabeformat gewählt werden, ebenso kann Anfang und Ende des Drucks bestimmt werden.

281

VMM

Syntax:

PRINT

-

INFILE(ddname) | INDATASET(Elntrag-Name) CHARACTER

|

HEX

|

DUMP

-

-

FROMKEY(lowkey) | FROMNUMBER(lownumber) | FROMADDRESS(lowaddress) | SKIP(zahl) -

TOKEY(highkey) | TONUMBER(highnumber) | TOADDRESS(highaddress) | COUNT(zahl) Der Name des zu druckenden Dataset kann über INFILE dann ist die Angabe eines DDNamens erforderlich oder über INDATASET hier, muß der Datasetname eingesetzt werden, mitgeteilt werden. Die Ausgabe kann in Schriftform (CHARACTER), HexZeichen (HEX) oder beiden Formen (DUMP) erfolgen. DUMP ist der Default. -

-

-

Bei KSDS-Datasets kann eine Angabe des Start- und/oder Ende-Schlüssels mit den FROMKEY- und TOKEY-Parametern gemacht werden. Bei ESDS-Datasets heißen die entsprechenden Parameter FROMADDRESS und TOADDRESS. Bei RRDS-Datasets müssen diese Angaben mit den Parametern FROMNUMBER und TONUMBER erfolgen. Wenn diese Angaben nicht erfolgen, wird das Dataset von Anfang bis Ende gedruckt. Mit SKIP läßt sich eine bestimmte Zahl von Records am Anfang des Datasets überspringen. Mit COUNT läßt sich eine maximale Zahl der zu druckenden Records definieren. SKIP und COUNT können bei jeder VSAM-Datasetform angegeben werden. Von irgendeiner Form der Begrenzung sollte immer Gebrauch gemacht werden, da der Ausdruck eines kompletten VSAM-Datasets sehr umfangreich sein kann. Im folgenden Beispiel werden die Records 1 3 eines VSAM KSDS-Datasets gedruckt: -

MVS/ESA JCL

282 edit-uwin.schulung.idcams(prt01)

01.05

.

-

command ******

scroll

===>

*****************************

fop of data

===>

page

*****************************

000001 //uwin217c job (uwin,abtdg02),'m.winter', 000002 // class=t, 000003 // msgclass=y, 000004 // time=(,10), 000005 // notify=uwin 000006 //* notify=uwin,typrun=scan 000007 //******************************* 000008 //* 000009 //* idcams zum drucken eines vsam ksds

000010 //* 000011 //* 000012 //*

es werden nur die ersten drei records gedruckt

000013 //******************************** exec pgm=idcams 000014 //print 000015 //sysprint dd sysout=* 000016 //sysin dd * print indataset(uwin.schulung.vsam.ksds) 000017 000018 count(3)

-

000019 /* *******************************

bottom of data

********************************

Der Hexteil des nachfolgend abgebildeten Outputs ist nicht vollständig VSAM-Datasets mit Schlüssel wird der Schlüssel mit angegeben: command idcams

scroll

===>

********************************

top of data

system services

print indataset(uwin.schulung.vsam.ksds)

c0unt(3)

Die

wiedergegeben. Bei

Ausgabe wird auf der Folgeseite fortgesetzt.

===>

screen

**********************************

time: 09:25:43

06/03/92

page

1

VSAM

283

LISTING OF DATA SET -UWIN.SCHULUNG.VSAM.KSDS KEY OF RECORD

F0F0F0F0F1 F0FOF0FO F1D4E4C5 D3D3C5D9 40404040 4040C1D4 40C8C1D5 C740F4F4 40404040 40404040 40404040 40404000 0002076F -

000000 000020 000040

F0F0F0F0F2 KEY OF RECORD F0F0F0F0 F2E2C3C8 D5C5C9C4 C5D94040 000000

*00001MUELLER * AM HANG 44 *

*

SABINE

5000KOELN

* *

_?

-

000020 000040

4040D6C2 C5D9E6C5 C740F740 40404040 C7404040 40404040 40404000 0003801F

*00002SCHNEIDER * OBERWEG 7 *G

WERNER

*00003SIELDER

NORBERT

*

2001 HAMBURG

_

KEY OF RECORD

F0F0F0F0F3 FOF0F0FO F3E2C9C5 D3C4C5D9 40404040 4040E6C1 D3C4C7C1 E2E2C540 F2F14040 40404040 40404040 40404000 0004721F -

000000 000020 000040

*******************************

*

WALDGASSE 21

1000BERLIN*

*

*

.

BOTTOM OF DATA

*

********************************

VSAM-Datasets löschen mit IDCAMS DELETE Mit dem

DELETE-Kommando

lassen

sich

komplette VSAM-Datasets,

VSAM-

Komponenten wie DATA, INDEX, Pfade und Alternativindices löschen. Auch die Basiseinträge von Generation Data Groups (GDGs) lassen sich mit IDCAMS löschen. Die folgende Übersicht listet die wichtigsten Parameter des DELETE-Kommandos auf: Syntax: DELETE

-

Eintrag-Typ Katalogeintrag

-

PURGE I NOPURGE ERASE I NOERASE

-

Als Eintragtyp können die gleichen Parameter verwendet werden, die beim LISTCAT Kommando aufgezählt wurden. Beim Katalogeintrag können einzelne Level durch '*' ersetzt werden. Diese Option ist aber sehr gefährlich, weil man unter Umständen mehr Datasets löscht als beabsichtigt. Das DELETE-Kommando löscht das Dataset nicht bei VSAM-Datasets lediglich den Katalogeintrag.

physisch von der Platte,

sondern löscht

MVS/ESA JCL

284

Wenn der DELETE normal durchläuft, so wird ein Return Code 0 zurückgegeben. Ein Return Code von 8 deutet meist darauf hin, daß der entsprechende Katalogeintrag nicht existierte, das Dataset also schon gelöscht war. RC 8 ist meist harmlos. =

PURGE -NOPURGE Sollen Datasets gelöscht werden, deren Schutzfrist noch nicht durch die Angabe des PURGE-Parameters erzwungen werden.

abgelaufen ist,

so

kann dies

ERASE NOERASE -

Der normale DELETE löscht lediglich den Katalogeintrag des VSAM-Datasets. Der durch das Dataset auf der Platte eingenommene Platz wird wieder zur Benutzung freigegeben. Die Daten werden aber nicht überschrieben. Sie stehen nach wie vor auf der Platte und können zufällig oder aber durch die Benutzung besonderer Utilities wieder zugänglich gemacht werden. Für wichtige, z.B. personenbezogene Daten ist dieser Zustand unbefriedigend. Wenn man sicher gehen will, daß sensible Daten auf jeden Fall gelöscht werden sollen, so kann durch die Angabe des ERASE-Parameter bewirkt werden, daß die Daten mit Low-Values (Hex '00') überschrieben werden. Man sollte jedoch bedenken, daß dies sehr zeitaufwendig sein kann.

Sofern das VSAM-Dataset schon mit ERASE definiert wurde, erfolgt eine Überschreibung auch dann, wenn beim Löschen der ERASE-Parameter nicht gesetzt wird. Wer auf Nummer Sicher gehen will, der sollte die ERASE-Option beim DELETE setzen, sofern der Datenschutz dies verlangt. IDCAMS DELETE Im

-

folgenden Beispiel

ist, gelöscht.

Beispiel wird ein VSAM-Dataset, dessen Schutzfrist noch nicht abgelaufen enthält, werden die Daten mit binären Nullen

Da das Dataset sensitive Daten

überschrieben:

285

VSAM

edit command

-

uwin.schulung.idcamscdel01)

01.05

.

-

scroll

===>

===>

******

*****************************

000001 000002 000003 000004 000005 000006 000007 000008 000009 000010

//uwin217c job (uuin,abtdg02),1m.winter1,notify=uwin, class=t,msgclass=y // //*************************************************************** //* idcams zum loeschen vsam-datasets //* //* //********************************

yep of data

page

*****************************

exec pgm=idcams //delete //sysprint dd sysout=* dd * //sysin 000011 indatasekuwin.schulung.vsam.ksds) -

000012 000013

purge

000014

cluster

erase

*******************************

bottom of data

********************************

Der SYSPRINT eines Löschens einer normalen KSDS

(ohne AIX) sieht folgendermaßen

aus: ********************************

idcams

top of data

**********************************

system services

time: 9:47:16

delete -

uwin.schulung.vsam.ksds purge -

erase -

cluster

idc0550i entry (d) uwin.schulung.vsam.ksds.data deleted idc0550i entry (i) uwin.schulung.vsam.ksds.index deleted idc0550i entry (c) uwin.schulung.vsam.ksds deleted idc0001i function

completed,

highest condition code was 0

idc0002i idcams processing complete. maximum condition code was 0 *******************************

Es erscheinen

bottom of data

********************************

Einzelmeldungen für die Daten-, die Indexkomponente und den Cluster.

MVS/ESA JCL

286

Sollte ein Löschen wider Erwarten nicht erfolgreich sein, dann prüfen Sie mit Hilfe des Kommandos LISTCAT die Komponente, die nicht gelöscht werden konnte. Achten Sie dabei auf mögliche Verknüpfungen, die im Feld ASSOCIATIONS aufgelistet werden. Möglicherweise ist die Komponente mit einem falschen Clustemamen verbunden. Dies kann z.B. dann passieren, wenn man sich beim DEFINE CLUSTER verschreibt. Sofern dieser Fall eingetreten ist, machen Sie einen DELETE auf den falsch angegebenen CLUSTER Namen. Sofern zum Cluster auch ein AIX gehört, wird der AIX und alle zugehörigen Komponenten (auch der Pfad) gelöscht. Die Meldung ist dementsprechend umfangreich. An den in Klammern gesetzten Buchstaben wird erkennbar, welche Komponente gelöscht wurden. ********************************

idcams

tqp Qp data

**********************************

system services

time:09:45:27

delete -

uwin.schulung.vsam.ksds purge -

cluster

idc0550i entry (r) uwin.schulung.vsam.ksds.aix.path deleted idc0550i entry (d) uwin.schulung.vsam.ksds.aix.data deleted idc0550i entry (i) uwin.schulung.vsam.ksds.aix.index deleted

idc0550i entry (g) uwin.schulung.vsam.ksds.aix deleted idc0550i entry (d) uwin.schulung.vsam.ksds.data deleted idc0550i entry (i) uwin.schulung.vsam.ksds.index deleted idc0550i entry (c) uwin.schulung.vsam.ksds deleted

idc0001i function completed, highest condition code was 0 idc0002i idcams processing complete. maximum condition code was 0 *******************************

bottom of data

********************************

287

VSAM

Return Codes verändern mit IDCAMS Modal-Kommandos Mit Modal-Kommandos lassen sich Return Codes, die bei der Ausführung von IDCAMSKommandos zurückgegeben werden, abfragen und ändern. Im Gegensatz zum CONDParameter auf Job- oder Step-Ebene, können einzelne Kommandos innerhalb eines Steps abgefragt werden. Es können zwei verschiedene Felder abgefragt werden: 1. 2.

LASTCC enthält den Return Code, der bei der Ausführung des letzten IDCAMSKommandos zurückgegeben wurde. MAXCC enthält den höchsten bisher zurückgegebenen Return Code.

Beim Vergleich werden: =

A= > < >=

*****************************

jop OF DATA

===>

PAGE

*****************************

000001 //UWIN217C JOB (UWIN,ABTDG02),'M.WINTER 1,NOTIFY=UWIN, 000002 // CLASS=T,MSGCLASS=Y 000003 //CLRCAT EXEC PGM=IDCAMS 000004 //SYSPRINT DD SYS0UT=* DD * 000005 //SYSIN 000006 DELETE UWIN.SCHULUNG.VSAM.KSDS CLUSTER 000007 000008 0 IF MAXCC 8 THEN SET MAXCC ******************************* BOTTOM OF DATA -

=

=

********************************

Durch das Zurücksetzen des Return Codes ist die

sichergestellt.

5.3

Ausführung

der

folgenden Steps

COBOL für VSAM-Datasets

Die folgenden Abschnitte zeigen, wie man VSAM-Datasets mit COBOL verarbeiten kann. Es werden Beispiele für die Datasetarten KSDS, ESDS und RRDS gezeigt. Um VSAMDatasets mit COBOL verarbeiten zu können, werden eine Reihe spezieller Anweisungen

benötigt.

Die SELECT

ASSIGN-Anweisung

Die SELECT ASSIGN-Anweisung für VSAM-Datasets ist wesentlich umfangreicher als die für sequentielle Datasets. Über diese Anweisung wird mitgeteilt, welche VSAMDatasetform verarbeitet werden soll, wie der Zugriff erfolgen soll, wie das Schlüsselfeld heißt (sofern es eines gibt) und wie das Feld heißt, in dem der File Status aufgenommen wird.

SELECT ASSIGN für KSDS-Datasets

SELECT VSAMFILE ASSIGN TO VSAMFILE IS INDEXED ORGANIZATION ACCESS MODE IS DYNAMIC RECORD KEY IS VSAM-KEY FILE STATUS IS FS1 FS2.

289

VSAM

ORGANIZATION IS INDEXED weist darauf hin, daß es sich um ein KSDS-Dataset handelt. Als ACCESS MODE ist bei einem KSDS-Dataset zulässig: 1. SEQUENTIAL (dies ist gleichzeitig Default). SEQUENTIAL erlaubt nur einen sequentiellen Zugriff auf das KSDS-Dataset. In diesem Fall wird nur das Sequence Set gelesen und die dort vorhandenen horizontalen Pointer benutzt. RANDOM. Wird RANDOM angegeben, so kann nur direkt gelesen werden. Sequentielle Zugriffe sind dann nicht möglich. DYNAMIC. DYNAMIC erlaubt sowohl direkte als auch sequentielle Zugriffe. Die 3. Art des Zugriffs wird im Programm gesteuert und kann gewechselt werden. RECORD KEY verweist auf das Schlüsselfeld des KSDS-Dataset. Das Feld muß später im FD-Eintrag der Satzbeschreibung des Datasets definiert werden. FILE STATUS kann aus zwei Feldern bestehen. FS1 ist ein zwei Byte langes Feld in der Working-Storage Section, in dem der normale File Status abgestellt wird. FS2 ist ein 6 Byte langes Feld, das folgendermaßen aufgebaut ist:

2.

Ol

FS2. 05 REG15-FELD 05 AIX-FELD 05 FEEDBACK-FELD

PIC PIC PIC

9(4) COMP. 9(4) COMP. 9(4) COMP.

FS2 darf nur dann abgefragt werden, wenn FS1 ungleich '00' ist. In Feld REG15-Feld von FS2 steht dann der Inhalt des Registers 15 mit den möglichen Werten 0, 8 oder 12. Sofern ein AIX im Spiel ist, wird im Feld AIX-Feld die Werte 0 5 abgestellt. Die Werte '0', '2' und '4' zeigen eine erfolgreiche Operation an, die Werte T, '3' und '5' weisen auf einen Fehler hin. Das Feld FEEDBACK enthält die meisten Informationen. Es kann vor allem dann wichtig sein, wenn der durch FS1 zurückgegebene Status sehr nebulös ist, wie z.B. bei einem FS1 von '90', der schlicht als 'Logic Error' beschrieben ist. -

Leider ist die Bedeutung des FS2 Feldes nicht sonderlich gut dokumentiert. IBM verweist die Benutzer auf das Manual: VSAM Administration: Macro Instruction Reference. Dies ist aber für die VSAM-Programmierung in Assembler gedacht, so daß die Angaben dort sich nicht auf COBOL-Programme beziehen. Vielleicht gibt es aber in Ihrer Installation Systemprogrammierer, die Ihnen eine Übersicht und die Bedeutung der Felder für COBOL erstellen können. Es bleibt zu hoffen, daß IBM diese dokumentarische Lücke so bald wie möglich schließt.

SELECT ASSIGN für ESDS-Datasets Für ESDS-Datasets sieht die SELECT-Anweisung etwas anders aus. Sie darf kein RECORD KEY-Feld enthalten, da ESDS-Datasets keinen Schlüssel besitzen:

MVS/ESA JCL

290

SELECT VSAMFILE ASSIGN TO AS-VSAMFILE IS SEQUENTIAL ORGANIZATION IS SEQUENTIAL MODE ACCESS IS FS1 FS2. FILE STATUS ORGANIZATION IS SEQUENTIAL weist darauf hin, daß es sich um ein ESDS-Dataset handelt. In der SELECT ASSIGN-Anweisung muß dem DD-Namen die Zeichenfolge ASvorangestellt werden. Während dies sonst meist nur als Kommentar betrachtet wird, ist es bei ESDS-Datasets zwingend vorgeschrieben. Bei ESDS-Datasets ist als ACCESS MODE nur SEQUENTIAL zulässig. Für FS1 und FS2

gilt das bei KSDS-Datasets Gesagte.

SELECT ASSIGN für RRDS-Datasets Für RRDS-Datasets muß die

SELECT-Anweisung wie folgt aussehen:

SELECT VSAMFILE ASSIGN TO VSAMFILE ORGANIZATION IS RELATIVE ACCESS IS RANDOM KEY RELATIVE IS VSAM-KEY FILE STATUS IS VSAM-STATUS. ORGANIZATION IS RELATIVE weist darauf handelt.

hin,

daß

es

sich

um

ein RRDS-Dataset

Als ACCESS MODE ist bei RRDS-Datasets: RANDOM, SEQUENTIAL und DYNAMIC zulässig. Die Bedeutung entspricht der bei einem KSDS. Der RELATIVE KEY wird als Feld in der WORKING-STORAGE SECTION definiert. Er ist nicht Teil der Satzbeschreibung des Datasets. Für FS1 und FS2 gilt das bei KSDS-Datasets Gesagte.

Die

FD-Anweisung

Bei der FD-Anweisung sind

folgende Punkte zu beachten:

1.

Die RECORDING MODE IS F Klausel darf nicht verwendet werden.

2.

Die BLOCK CONTAINS Klausel wird als Kommentar betrachtet. Da sie überflüssig ist, sollte man sie weglassen.

VSAM 3.

Die

291 Die LABEL RECORDS ARE Klausel muß auf jeden Fall stehen. Ob dann STANDARD oder OMITTED genommen wird, ist ohne Bedeutung.

OPEN-Anweisung

Die OPEN-Anweisung unterscheidet sich je nach Art der Zugriffe, die vorgenommen werden sollen. Die OPEN-Anweisung fur KSDS- und ESDS-Datasets ist identisch:

OPEN filename INPUT OUTPUT EXTEND 1-0 OPEN INPUT bedeutet, daß nur

Lesezugriffe mit READ erlaubt sind. einem ungeladenen (leeren) Dataset

OPEN OUTPUT muß bei zum erstmaligen Beschreiben (Laden) verwendet werden. Beachten Sie, daß, wenn Sie ein VSAM-Dataset mit REUSE definiert haben, dieses Dataset überschrieben wird. Bei einem REUSEable Dataset wird der Record Pointer auf den Anfang gesetzt und mit dem Schreiben begonnen. Evtl. vorhandene Daten werden einfach überschrieben.

Wird OPEN OUTPUT bei einem nicht-leeren Dataset verwendet, so kommt es zu einem Fehler. Ein Dataset gilt auch dann als nicht-leer, wenn alle Records durch DELETEKommandos gelöscht wurden. OPEN EXTEND bewirkt, daß neue Records an das Ende des Datasets angehängt werden sollen. Sie kann bei KSDS-Datasets nur dann verwendet werden, wenn mit dem Laden fortgefahren werden soll, die zu ladenden Records aufsteigend sortiert sind und nicht kleiner sein dürfen, als der höchste bisher geladene Record. OPEN EXTEND wird meist bei ESDS-Datasets verwendet, um neuen OUTPUT ans Ende des Datasets zuschreiben. Bei RRDS-Datasets gibt es die Option EXTEND nicht. OPEN 1-0 läßt Lese- und Schreibzugriffe zu. Diese Option wird häufig bei KSDS- und RRDS-Datasets verwendet. Bei ESDS-Datasets hat 1-0 nur dann Bedeutung, wenn ein REWRITE gemacht werden soll.

Mögliche FS1 RC

Return Codes bei OPEN:

00

Bedeutung Erfolgreiches Öffnen.

35

Dataset nicht vorhanden. Falsche oder fehlende DD-Anweisung.

37

OPEN wird vom Dataset nicht unterstützt. KSDS zu öffnen versucht.

Möglicherweise

wurde ein ESDS als

MVS/ESA JCL

292

39

File Attribut Problem. Bei KSDS

häufig

falsche

Schlüsselposition

im COBOL-

Programm. 90 91 92 93 95

KSDS wurde für OUTPUT geöffnet und ACCESS MODE ist entweder RANDOM oder DYNAMIC. Passwort-Fehler. Kann auch ein RACF-Fehler sein (keine Zugriffsrechte).

Logischer Fehler. Meist ist das zu öffnende Dataset bereits geöffnet. Ungenügender virtueller Speicher. REGION-Parameter erhöhen. Dataset, das für OUTPUT geöffnet wurde, ist nicht leer. Schlüssellänge oder -position inkonsistent Ein KSDS-Dataset wurde wie ein ESDS-Dataset eröffnet.

96 97

DD-Anweisung fehlt. Impliziter VERIFY durchgefühlt. OPEN erfolgreich.

Lesezugriffe Um ein VSAM-Dataset lesen zu können, muß eröffnet worden sein. Wenn mit FILE STATUS KEY-Bedingung nicht verwendet werden. Sofern ACCESS Ende gelesen:

mit OPEN INPUT oder OPEN 1-0 gearbeitet wird, so sollte die INVALID

es

SEQUENTIAL angegeben wurde, wird das

Dataset mit READs bis

zum

READ filename

[INTO identifier] [AT END imperative Anweisung] Sofern ACCESS MODE ist DYNAMIC angegeben wurde, kann zwischen den Zugriffen hin- und hergeschaltet werden. Um sicher zu gehen, sollte beim sequentiellen Lesen mit NEXT RECORD gearbeitet werden, beim direkten Lesen sollte vorher immer das Schlüsselfeld besetzt werden.

Beispiel für sequentielles Lesen bei ACCESS DYNAMIC: READ

filename NEXT RECORD

[INTO identifier] [AT END imperative Anweisung]

293

VSAM

Schreibzugriffe Voraussetzung für eine Schreib-Operation ist ein erfolgreiches Öffnen mit OPEN I-O oder OPEN OUTPUT.

Auch bei der WRITE-Anweisung sollte man auf die INVALID KEY-Klausel verzichten und mögliche Fehler über den FS1 abfangen. Der WRITE für ein VSAM-Dataset sieht folgendermaßen aus:

WRITE

record-name

[FROM identifier] Die REWRITE-Anweisung

entspricht weitgehend der WRITE-Anweisung:

REWRITE

record-name

[FROM identifier] Ein REWRITE ist bei einem ESDS-Dataset nur nach einem Die Record-Länge darf nicht geändert werden.

Löschen

von

vorherigen

READ

möglich.

Records

Zum Löschen eines Records kann die DELETE-Anweisung verwendet werden. Dies ist nur bei KSDS- und RRDS-Datasets möglich. Records von ESDS-Datasets können nicht

gelöscht werden. DELETE

file-name START und READ NEXT Mit Hilfe der START-Anweisung kann man mitten in einem VSAM-Dataset aufsetzen und von dort aus sequentiell weiterlesen. Zu diesem Zweck wird bei der START-Anweisung ein Schlüssel oder ein Schlüsselfragment übergeben.

START file-name [KEY IS EQUAL TO GREATER THAN NOT LESS THAN

data-name]

>

NOT
*****************************

fop OF DATA

COLUMNS 001 072 SCROLL ===> PAGE

*****************************

ID DIVISION. PROGRAM-ID. KSDSALL. ************************************************************** *

* * *

USE THIS PROGRAM TO READ, RECORDS FROM A VSAMFILE

WRITE,

REWRITE OR DELETE

* *

*

*

**************************************************************

AUTHOR. M.WINTER.

ENVIRONMENT DIVISION. INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT INPFILE ASSIGN TO INPFILE FILE STATUS IS INP-STATUS. SELECT VSAMFILE ASSIGN TO VSAMFILE ORGANIZATION IS INDEXED ACCESS IS DYNAMIC RECORD KEY IS VSAM-KEY FILE STATUS IS FS1 FS2. DATA DIVISION. *_.

FILE SECTION. k_

FD

01

INPFILE RECORDING MODE F BLOCK 0 RECORDS. INP-REC. 05 INP-FLAG 05 INP-DATA.

10 10 10 10

INP-KEY INP-NAME

PIC

X(01).

PIC

9(05).

INP-VORNAME

PIC X(14). PIC X(10).

INP-REST

PIC

X(50).

Beispiel wird auf der folgenden Seite fortgesetzt.

MVS/ESA JCL

296

000035 000036 000037 000038 000039 000040 000041 000042 000043 000044 000045 000046 000047 000048 000049 000050 000051 000052 000053 000054 000055 000056 000057 000058 000059 000060 000061 000062 000063 000064 000065 000066 000067 000068 000069 000070 000071 000072

Das

FD

VSAMFILE

01

VSAM-REC.

LABEL RECORDS OMITTED.

05 05 05 05

9(05). X(15). PIC X(14). PIC X(46).

VSAM-KEY

PIC

VSAM-NAME

PIC

VSAM-VORNAME VSAM-REST

k_

WORKING-STORAGE SECTION.

01 01

01 01 01 01 01 01 01 01

FS1

PIC XX

FS2. 05 VSAM-RETCODE 05 VSAM-AIXCODE 05 VSAM-FEEDBACK INP-STATUS

PIC 9(04) COMP. PIC 9(04) COMP. PIC 9(04) COMP.

ERROR-REASON

PIC

REC-READ

PIC

REC-WRITTEN

PIC

REC-DELETED REC-STARTED REC-REWRITTEN EOF-SWITCHES. 05 END-OF-INP-SW 88 END-OF-INP

PIC

PIC

PIC PIC

VALUE '00'

X(02) X(60). 9(05) COMP-3 9(05) COMP-3 9(05) COMP-3 9(05) COMP-3 9(05) COMP-3

PIC X VALUE 'N'

VALUE

1

Y

VALUE '00' VALUE VALUE VALUE VALUE VALUE

0. 0. 0. 0. 0.

.

.

*_

PROCEDURE DIVISION. OPEN INPUT INPFILE. IF INP-STATUS NOT

=

'00'

DISPLAY 'OPEN ERROR INPFILE STATUS

=

1

INP-STATUS

MOVE 12 TO RETURN-CODE GO TO PROG-STOP. OPEN 1-0 IF FS1 NOT

VSAMFILE. =

'00'

MOVE 'OPEN ERROR VSAMFILE STATUS

PERFORM FATAL-ERROR GO TO PROG-STOP.

Beispiel wird auf der folgenden

Seite

fortgesetzt.

'

TO ERROR-REASON

VSAM

000073 000074 000075 000076 000077 000078 000079 000080 000081 000082 000083 000084 000085 000086 000087 000088 000089 000090 000091 000092 000093 000094 000095 000096 000097 000098 000099 000100 000101

Das

297 MOVE 0

TO REC-READ.

MOVE 0 MOVE 0

TO REC-WRITTEN. TO REC-STARTED.

MOVE 0 MOVE 0

TO REC-REWRITTEN TO REC-DELETED.

READ INPFILE AT END MOVE Y TO END-OF-INP-SW. PERFORM 'READ-INPFILE UNTIL END-OF-INP OR RETURN-CODE PROG-STOP. *. 1

DISPLAY 'RECORD ACTIVITY ON VSAMFILE DISPLAY

'.

DISPLAY 1 '. DISPLAY 'RECORDS READ DISPLAY 'RECORDS STARTED DISPLAY 'RECORDS WRITTEN

=

1

=

1

=

1

DISPLAY 'RECORDS REWRITTEN

=

'

DISPLAY 'RECORDS DELETED CLOSE VSAMFILE.

=

1

CLOSE INPFILE. STOP RUN. *.

READ-INPFILE

.

*.

IF INP-FLAG

=

'W'

PERFORM WRITE-VSAMREC ELSE IF INP-FLAG

=

'R1

PERFORM READ-VSAMREC ELSE

Beispiel wird auf der folgenden Seite fortgesetzt.

1

.

REC-READ. REC-STARTED. REC-WRITTEN. REC-REWRITTEN. REC-DELETED.

>

0.

MVS/ESA JCL

298

000102 000103 000104 000105 000106 000107 000108 000109 000110 000111 000112 000113 000114 000115 000116 000117 000118 000119 000120 000121 000122 000123 000124 000125 000126 000127 000128 000129 000130 000131 000132 000133 000134 000135 000136 000137 000138 000139 000140 000141 000142

Das

IF INP-FLAG

=

'S'

PERFORM START-VSAMREC ELSE

IF INP-FLAG

=

IF INP-FLAG

=

'C PERFORM REWRITE-VSAMREC ELSE 1D1 PERFORM DELETE-VSAMREC ELSE IF INP-FLAG = 'X' MOVE INP-KEY TO RETURN-CODE. READ INPFILE AT END MOVE 'Y' TO END-OF-INP-SW.

READ-INPFILE-EXIT. *. *.

WRITE-VSAMREC. *.-

PERFORM MOVE-FIELDS. WRITE VSAM-REC. = '00' ADD 1 TO REC-WRITTEN ELSE = IF FS1 '22' ' DISPLAY 'DUPLICATE KEY ON WRITE FOR INP-KEY ELSE MOVE 'WRITE ERROR VSAMFILE STATUS ' TO ERROR-REASON PERFORM FATAL-ERROR. WRITE-VSAMREC-EXIT.

IF FS1

*. *.

READ-VSAMREC. *.-

PERFORM MOVE-FIELDS. READ VSAMFILE. = IF FS1 '00' ADD 1 TO REC-READ ELSE = IF FS1 '23' DISPLAY 'READ RECORD NOT FOUND FOR ELSE

Beispiel wird auf der folgenden Seite fortgesetzt.

'

INP-KEY

VSAM

000143 000144 000145 000146 000147 000148 000149 000150 000151 000152 000153 000154 000155 000156 000157 000158 000159 000160 000161 000162 000163 000164 000165 000166 000167 000168 000169 000170 000171 000172 000173 000174 000175 000176 000177 000178 000179 000180 000181 000182 000183 000184

Das

299 HOVE

1

READ ERROR VSAMFILE STATUS

TO ERROR-REASON

1

PERFORM FATAL-ERROR.

READ-VSAMREC-EXIT. *.-. *.

START-VSAMREC. *.

PERFORM MOVE-FIELDS. START VSAMFILE KEY GREATER IF FS1

THAN VSAM-KEY.

'00' ADD 1 TO REC-STARTED PERFORM READ -VSAMFILE-NEXT =

ELSE IF FS1

=

'23'

DISPLAY 'START RECORD NOT FOUND FOR

INP-KEY

1

ELSE

MOVE 'START ERROR VSAMFILE STATUS PERFORM FATAL-ERROR.

1

TO ERROR-REASON

START-VSAMREC-EXIT. *. *--.-.

READ -VSAMFILE-NEXT. *---.-

READ VSAMFILE NEXT RECORD. IF FS1 ADD 1 ELSE

=

'00'

TO REC-READ

= IF FS1 '94' DISPLAY 'NO SEQUENTIAL READ POSSIBLE FOR

'

INP-KEY

ELSE MOVE 'READ

ERROR VSAMFILE STATUS

PERFORM FATAL-ERROR. READ-VSAMFILE-NEXT-EXIT. *. *---.

REWRITE-VSAMREC.

*. PERFORM MOVE-FIELDS. REWRITE VSAM-REC. IF FS1 ADD 1 ELSE

'00' TO REC-REWRITTEN =

Beispiel wird auf der folgenden Seite fortgesetzt.

1

TO ERROR-REASON

MVS/ESA JCL

300 000185 000186 000187 000188 000189 000190 000191 000192 000193 000194 000195 000196 000197 000198 000199 000200 000201 000202 000203 000204 000205 000206 000207 000208 000209 000210 000211 000212 000213 000214 000215 000216 000217 000218 000219 000220 000221 000222 000223 000224 000225

= IF FS1 '23' DISPLAY 'REWRITE RECORD NOT FOUND FOR

INP-KEY

ELSE MOVE 'REWRITE

ERROR VSAMFILE STATUS

'

TO ERROR-REASON

'

INP-KEY

'

TO ERROR-REASON

PERFORM FATAL-ERROR.

REWRITE-VSAMREC-EXIT.

DELETE-VSAMREC. PERFORM MOVE-FIELDS. DELETE VSAMFILE. IF FS1

'00' TO REC-DELETED =

ADD 1 ELSE IF FS1

=

'23'

DISPLAY 'DELETE RECORD NOT FOUND FOR ELSE MOVE 'DELETE ERROR VSAMFILE STATUS

=

PERFORM FATAL-ERROR. DELETE-VSAMREC-EX IT.

MOVE-FIELDS. k_

MOVE INP-KEY

TO VSAM-KEY.

MOVE INP-NAME

TO VSAM-NAME.

MOVE INP-VORNAME TO VSAM-VORNAME. MOVE INP-REST

TO VSAM-REST.

MOVE-FIELDS-EXIT.

FATAL-ERROR. DISPLAY ERROR-REASON

'

'

FS1

DISPLAY 'VSAM-RETCODE

DISPLAY DISPLAY DISPLAY MOVE 12

'VSAM-AIXCODE 'VSAM-FEEDBACK INP-REC. TO RETURN-CODE.

VSAM-RETCODE. VSAM-AIXCODE. VSAM-FEEDBACK.

FATAL-ERROR-EXIT. ****************************

Die

'

BOTTOM OF DATA

****************************

JCL, mit der das Programm läuft, ist auf dieser Seite abgebildet.

VSAM

301

EDIT

01.03

UWIN.SCHULUNG.CNTL(VSAHALL)

COMMAND ******

.

-

-

===> *****************************

yep OF DATA

COLUMNS 001 072 SCROLL ===> PAGE

*****************************

000001 //UWIN217G JOB (998,ABTDG02),1M.WINTER1,CLASS=C,NOTIFY=UWIN, 000002 // MSGCLASS=9, 000003 // TIME=(,05), 000004 // MSGLEVEL=(1,1) EXEC PGM=VSAMALL 000005 //STEP1

000006 000007 000008 000009 000010

//STEPLIB //SYSPRINT //SYSABOUT //SYSOUT //VSAMFILE

DD

DSN=UWIN.SCHULUNG.LOAD,DISP=SHR

DD SYSOUT=* DD SYSOUT=*

DD SYSOUT=* DD DSN=UWIN.SCHULUNG.VSAM.KSDS,DISP=OLD

000011 //********************************* 000012 //* 000013 //* FOLGENDE ZEICHEN SIND IM ERSTEN BYTE VON INPFILE ZULÄSSIG 000014 //* 000015 //* R = READ 000016 //* C = REWRITE 000017 //* W WRITE DELETE 000018 //* D =

=

000019 000020 000021 000022 000023 000024 000025 000026

START //* S //* //*******************************************************

******

*************************

=

//INPFILE DD * W00040BECKER C00039BEHRENDT

WILHELM ANGELIKA

STABGASSE 3 WALMSTRASSE 45

6000 FRANKFURT 5000 KOELN

R00038

D00037 000027 S00403 BOTTOM OF DATA

****************************

Storage Management Subsystem

6

SMS

-

SMS, das gelegentlich auch als System Managed Storage bezeichnet wird, ist ein

Subsystem, das unter MVS/ESA eingesetzt wird. Die Ziele des Einsatzes sich in drei Punkten zusammenfassen:

von

SMS lassen

Anwendungsprogrammierer soll sich beim Anlegen von Platten-Datasets nicht physischen Sicht der Daten befassen müssen. (SMS hat nur sehr eingeschränkte Bedeutung für Datasets auf Kassette oder Band.) Das Anlegen von Datasets soll vereinfacht werden.

1. Der

mehr mit der 2.

3. Die Kontrolle über Plattenspeicherplatz soll vereinfacht werden.

Mit SMS kommen auf die IBM-Welt erstmals seit langer Zeit umfangreiche JCLÄnderungen zu. So gibt es allein 10 neue JCL-Parameter, die im Zusammenhang mit SMS eingeführt werden. SMS kann so eingerichtet werden, daß es entweder den gesamten oder aber einen Teil des Plattenbestandes kontrolliert. Datasets, die auf diesen Platten angelegt werden, fallen ebenfalls unter die Kontrolle von SMS. Darüber hinaus ist es möglich, SMS die Kontrolle bestimmter DSN-Gruppen zu ermöglichen. Versucht der User, ein Dataset anzulegen, deren DSN-Merkmale der Kontrolle von SMS unterstehen, so wird dieses Dataset automatisch auf einer Platte angelegt, die ebenfalls der Kontrolle von SMS untersteht. In einer gemischten Umgebung, die sowohl SMS- als auch Nicht-SMS-Datasets enthält, ist folgender Grundsatz zu beachten: SMS kontrollierte Datasets (SMS-inanaged data sets) können nur auf von SMS kontrollierten Platten (SMS-managed volumes) angelegt werden. SMS arbeitet mit einem Konzept von Speicherklasse (Storage Class), Datenklasse (Data Class) und Managementklasse (Management Class). Die Angabe einer Speicherklasse (STORCLAS) bewirkt, daß ein Dataset der Kontrolle von SMS unterstellt wird (unabhängig vom DSN). Mit der Angabe der Datenklasse (DATACLAS) lassen sich standardisierte Parameter z.B. für Record-Format, logische Record-Länge, Space und einige weitere übernehmen. Die Angabe einer Managementklasse (MGMTCLAS) dient der Übernahme von Defaults für das Migrieren und Sichern von Datasets. In der Praxis wird wahrscheinlich

einer ähnlichen

Weise, wie

es

häufigsten mit STORCLAS gearbeitet und zwar in mit dem Parameter UNIT=groupname geschieht. Die

am

jetzt

MVS/ESA JCL

304

komplette Übernahme einer Datenklasse wird Managementklasse wird man wahrscheinlich explizite Angabe machen zu müssen.

nur

eingeschränkt möglich sein,

mit Standardwerten

bei der

arbeiten, ohne eine

Die verschiedenen Klassen können unter SMS explizit zugewiesen werden. Es ist jedoch auch möglich, sog. Automated Class Selection Routinen (ACS) zu definieren. Sie erkennen ein neu anzulegendes Plattendataset anhand bestimmter DSN-Merkmale und sorgen für eine automatische Zuweisung der jeweiligen Klassen. Erkundigen Sie sich, ob und inwiefern bei Ihnen mit ACS gearbeitet wird. Eine weitere Neuheit, die SMS bietet, ist die Möglichkeit, VSAM-Datasets mit normaler JCL anzulegen. Bisher war dies nur mit IDCAMS möglich. Es ist allerdings die Frage, ob die so angelegten standardisierten VSAM-Datasets den besonderen Anforderungen der verschiedenen Anwendungen gewachsen sind. Unter SMS wird es mit der Version 4 von MVS/ESA eine neue Form des Partitioned Data Set geben, nämlich ein Partitioned Data Set Extended (PDSE). Es unterscheidet sich von den normalen PDS vor allem durch die interne Organisation. PDSE benötigen keinen Compress mehr, d.h. beim Updaten eines Members wird der zur Verfügung stehende Platz neu organisiert. Dies bedeutet aber auch, daß die bisher zur Verfugung stehenden Möglichkeiten, alte Memberversionen wieder verfügbar zu machen, bei einem PDSE nicht mehr existieren. Bei der Installation von SMS sind zwei Zustände zu unterscheiden: 1. SMS installiert und nicht aktiviert. 2. SMS installiert und aktiviert.

Bereits im nicht aktivierten Zustand werden.

6.1

SMS

bringt

SMS Vorteile, die hier zunächst

dargestellt

installiert, aber nicht aktiviert

Sofern bei Ihnen SMS bereits installiert ist, können Sie eine Reihe von Vorteilen nutzen, die SMS bietet. Dies gilt auch dann, wenn Migrationsprodukte wie GO-SMS installiert sind.

Wegfall der Blocksize-Angaben Die Angabe einer Blocksize beim Anlegen eines Datasets ist nicht mehr erforderlich. SMS sucht sich selbständig eine optimale Blockgröße für den jeweiligen Datenträger. Dies gilt sowohl für Datasets auf Platte wie auch auf Kassette oder Band. Voraussetzung dafür ist, daß das Programm, das das Dataset anlegt, einen OPEN absetzt. Geschieht dies nicht, z.B. bei dem Utility-Programm IEFBR14, so wird eine BLOCKSIZE von 0 angelegt und das Dataset wird unbenutzbar. Diese Änderung ist auch unter MVS/XA verfügbar. Sie wurde von IBM 1989 im Zusammenhang mit der Auslieferung der Magnetplatten vom Typ 3390 erstellt. Dadurch ist

SMS -

305

Storage Management Subsystem

möglich, gemischte Plattengruppen von 3380er und 3390er Platten über einen UNITanzusprechen und dennoch für eine optimale Blocksize zu sorgen, obwohl die Spurgröße von 3380 und 3390er Platten unterschiedlich ist. Sofern bei Ihnen SMS installiert ist und noch JCL mit BLKSIZE-Angaben im Einsatz ist, so prüfen Sie nach, ob darauf nicht verzichtet werden sollte. Dies gilt ganz besonders dann, Parametern unter bei Ihnen den wenn UNIT=gruppenname oder STORCLAS=speicherklasse Plattengruppen angesprochen werden, die aus 3380er und es

Namen

3390er Platten bestehen.

In dieser Situation ist es völlig unmöglich, eine optimale BLKSIZE selber anzugeben, da Sie nicht wissen können, auf welchem Typ von Platte Ihr Dataset angelegt wird.

Zwei abschreckende Beispiele sollen zeigen, was versuchen, eine BLKSIZE selber zu spezifizieren. edit-uwin.schulung.sms(blkszi)

01.02

passieren kann,

.

-

command ******

wenn

Sie trotzdem

columns 001 072 ===> page

scroll

===> *****************************

yop op data

****************************

//uwin217c job (uwin,abtdg02),'m.winter1,not ify=uwin, // class=t,msgclass=y //*************************************************************** //* anlegen eines sequentiellen dataset mit fester blksize 000005 //* 000006 //* 000007 //*************************************************************** 000001 000002 000003 000004

000008 //define exec pgm=idcams 000009 //sysprint dd sysout=* 000010 //sysin dd * 000011 delete uwin.schulung.output.seq1 000012 if maxcc = 8 then set maxcc 0 000013 //step1 exec pgm=p808401 =

000014 //steplib 000015 //sysout 000016 //sysabout 000017 //sysdbout 000018 //0ut1 000019 // 000020 // 000021 // 000022 // ******

dd

dsn=p808.loadlib,disp=shr

dd sysout=*

dd sysout=* dd sysout=* dd

dsn=uwin.schulung.output.seq1,

disp=(new,catlg),

dcb=(recfm=fb,lrecl=80,blksize=23440), unit=dskprm, space=(cyl,(80,8),rlse)

***************************

bottom of data

**************************

Dies ist eine JCL mit einer BLKSIZE, die für eine Platte des aber passiert, wenn Ihr Dataset auf einer 3390 angelegt wird:

Typs 3380 optimiert ist.

Was

MVS/ESA JCL

306

zwei Blöcke zu 23440 Lücke der 3390

46880 666 47542

Byte

Byte Byte Byte

ergeben: Spurgröße der 3390 beträgt aber 56664 Byte. Somit bleiben 9118 Byte ungenutzt. Dies entspricht 16% des Spur- und damit Plattenplatzes.

Die

edit-uwin. schulung. sms (blksz2)

01.02

.

-

command

===>

columns 001 072 scroll ===> page

****************************

******

*****************************

000001 000002 000003 000004 000005 000006 000007 000008 000009

//uwin217c job (uwin,abtdg02),'m.winter1,n0tify=uwin, // class=t,msgclass=y //*************************************************************** //* anlegen eines sequentiellen dataset mit fester blksize //* //* //***************************************************************

000010 000011 000012 000013 000014 000015 000016 000017

//define exec pgm=idcams //sysprint dd sysout=* //sysin dd * delete uwin.schulung.output.seq1 if maxcc = 8 then set maxcc = 0 exec pgm=p808401 //step1 dd //steplib dsn=p808.loadlib,disp=shr dd sys0ut=* //sysout //sysabout dd sysout=* //sysdbout dd sysout=*

000018 //out1 000019 // 000020 // 000021 // 000022 // ******

fop of data

dd

dsn=uwin.schulung.output.seq1,

disp=(new,catlg),

dcb=(recfm=fb,lrecl=80,blksize=27920), unit=dskprm, space=(cyl,(80,8),rlse)

***************************

bottom of data

**************************

Dies ist eine JCL mit einer BLKSIZE, die für eine Platte des aber passiert, wenn Ihr Dataset auf einer 3380 angelegt wird: ein Block zu 27920 Byte 27920 Byte auf die

Typs 3390 optimiert ist.

Was

Spur einer 3380 paßt nur ein Block mit der Größe 27920 Byte ! Die Spurgröße der 3380 beträgt aber 47476 Byte. Somit bleiben 19556 Byte ungenutzt. Dies entspricht 41% des Spur- und damit Plattenplatzes. Es ist daher besser, auf die Angabe der BLKSIZE zu verzichten. Durch den Wegfall der BLKSIZE-Angaben wird der Wechsel zwischen verschiedenen Datenträgern erleichtert. Dies wird an folgendem Beispiel demonstriert.

307

Storage Management Subsystem

SMS -

01.02 .-.columns 001 072

edit-uwin schulung .sms (de fseq) command ===> .

******

-

scroll

*****************************

top of data

===>

page

*****************************

000001 //uwin217c job (uwin,abtdg02),'m.winter1,not ify=uwin, 000002 // class=t,msgclass=y 000003

//********************************

000004 //* 000005 //* 000006 //* 000007 //*

anlegen eines dataset auf platte oder kassette mit variabler blksize

000008 000009 000010 000011 000012 000013 000014 000015 000016

//***************************************************************

000019 000020 000021 000022 000023 000024

// // //*

******

***************************

//define exec pgm=idcams //sysprint dd sysout=* //sysin dd * delete uwin.schulung.output.seq1 if maxcc = 8 then set maxcc = 0

//step1

exec pgm=p808401 //steplib dd dsn=p808.loadlib,disp=shr dd sysout=* //sysout 000017 //sysabout dd sysout=* 000018 //out1 dd dsn=uwin.schulung.output.seq1,

disp=(new,catlg),

recfm=fb,lrecl=80, unit=dskprm,

//* // //

space=(cyl,(80,8),rlse) unit=cass, expdt=99000 bottom of data

**************************

Je nachdem, ob die Zeilen 21 und 22 oder 23 und 24 Kommentar sind oder nicht, wird das Dataset entweder auf Platte oder auf Kassette angelegt. Die optimale BLKSIZE wird

automatisch errechnet.

Konkatenieren

von

Kassettendatasets

Beim Konkatenieren von Datasets, die auf Band oder Kassette stehen, braucht jetzt nicht mehr auf die Blocksize geachtet werden. Bisher mußte das Dataset mit der größten Blocksize zuerst genannt werden bzw. die größte vorkommende Blocksize beim ersten Dataset angegeben werden:

//CASSIN // // //

DD

DSN=UWIN.CASS1,DISP=0LD,

DCB=BLKSIZE=32760 DD DD

DSN=UWIN.CASS2,DISP=OLD DSN=UWIN.CASS3,DISP=OLD

MVS/ESA JCL

308

Diese Form der Angabe mußte gemacht werden, wenn die Blocksize von CASS1 kleiner war als die von CASS2 oder CASS3. Mit SMS spielt die Blocksize der einzelnen Datasets und ihre Reihenfolge in der Konkatenation keine Rolle mehr. Bei Plattendatasets mußte seit der Einführung von DFP (Data Facility Product) 2.3 auf die Blocksize von konkatenierten Datasets nicht mehr geachtet werden.

Konkatenieren

von

ungleichen Datenträgern

Bisher konnten Datasets auf ungleichen Datenträgern nicht konkateniert werden (Ausnahme: Datasets, die unter SORTIN beim SYNCSORT oder DFSORT angesprochen werden). Unter SMS gibt es diese Beschränkung nicht mehr.

//INPUT // Ohne SMS käme

DSN=UWIN.CASSl,DISP=OLD DD DSN=UWIN.DISK1,DISP=SHR DD

es zu

einem S637-0C ABEND.

Ändern des LIMITS eines Generationdatasets Mit SMS ist das Ändern eines LIMITs eines Basiseintrags eines Generationdatasets (GDG Generation Data Group) eine einfache Sache geworden. Dazu kann jetzt das ALTERKommando von IDCAMS benutzt. -

EDIT-UWIN.SCHULUNG. IDCLOES(GDGALT) ******

.

SCROLL

===> *****************************

COLUMNS 001 072

01.02 -

COMMAND

fop OF DATA

===>

PAGE

*****************************

000001 //UUIN217A JOB (998,ABTDG02),'M.WINTER',CLASS=C,NOTIFY=UWIN, 000002 // MSGCLASS=9, 000003 // TIME=(,05), 000004 // MSGLEVEL=(1,1) 000005 //* MSGLEVEL=(1,1),TYPRUN=SCAN 000006 //CRGDG EXEC PGM=IDCAMS 000007 //SYSPRINT DD SYS0UT=* 000008 //SYSIN DD * 000009 ALTER UWIN.SCHULUNG.GDG LIMIT(4) ****** **************************** BOTTOM OF DATA ***************************

Im

vorhergehenden Beispiel wurde das LIMIT einer GDG von 5 auf 4 herabgesetzt: Der folgende SYSPRINT liefert das Ergebnis der Ausführung des ALTER-Kommandos. Das älteste zur Generation gehörende Dataset mit dem absoluten DSN UWIN.SCHULUNG.GDG.G0002V00 wurde aus der Generation entfernt und gelöscht. Das Entfernen aus der Generation wird mit der Meldung HAS BEEN ROLLED OFF gemeldet.

309

Storage Management Subsystem

SMS -

********************************

IDCAMS

fop OF DATA

**********************************

TIME: 08:46:28

SYSTEM SERVICES

ALTER UWIN.SCHULUNG.GDG LIMIT(4) IDC0196I UWIN.SCHULUNG.GDG.G0002V00 HAS BEEN ROLLED OFF AND DELETED

IDC0531I ENTRY UWIN.SCHULUNG.GDG ALTERED IDC0001I FUNCTION COMPLETED, HIGHEST CONDITION CODE WAS 0 IDC0002I IDCAMS PROCESSING COMPLETE. MAXIMUM CONDITION CODE WAS 0 BOTTOM OF DATA ********************************

*******************************

Bisher mußten, nämlich: 1.

um

den

gleichen Zweck

zu

erreichen, vier Schritte ausgeführt werden,

Entkatalogisieren aller Generationen. Basiseintrages. Neudefinieren des GDG Basiseintrages mit dem neuen Limit. Rekatalogisieren der Generationen.

2. Löschen des GDG 3.

4.

Kilobytes und Megabytes beim Anlegen eines VSAM-Dataset Mit SMS kann beim Anlegen von VSAM-Datasets mit IDCAMS Platz mit KILOBYTES oder MEGABYTES unabhängig von der Art der Platte angefordert werden. Abgesehen davon, daß es dann egal ist, ob auf einer 3380 oder 3390 angelegt wird, ist diese Angabe besser umsetzbar im Hinblick auf die zu erwartende Datasetgröße (Die Angabe CYLINDER oder TRACKS mußte erst bezogen auf den Datenträger umgerechnet werden).

MVS/ESA JCL

310 01.02

edit-uwin.schulung.idcloes(defksds)

.

-

command

===>

******

*****************************

000001 000002 000003 000004 000005 000006 000007 000008 000009 000010 000011

//uwin217a // // //

//*

*****************************

job (998,abtdg02),1m.winter1,class=c,notify=uwin, msgclass=9, time=(,05), msglevel=(1,1) msglevel=(1,1),typrun=scan

//defksds exec pgm=idcams //sysprint dd sysout=* //sysin dd * delete -

uwin.schulung.vsam.ksds cluster define cluster (name(uwin.schulung.vsam.ksds) indexed

000012 000013 000014

-

recordsize(80 80) keys(5 0) freespaceo0 10)

000015 000016 000017 000018 000019 000020 000021 000022 000023 000024 000025 *******

top of data

columns 001 072 scroll ===> page

volumes(prm001 prm002) megabytes(5 1) shareoptions (2 3)

-

replicate imbed ) data (name(uwin.schulung.vsam.ksds.data) -

cisz(4096)) -

index (name(uwin.schulung.vsam.ksds.index) -

cisz(1536)) ***********************

bottom of data

********************************

Die Angabe KILOBYTES oder MEGABYTES tritt an die Stelle der Angabe CYLINDER oder TRACKS. Intern wird diese Angabe jedoch wieder in Cylinder und Tracks

umgerechnet.

6.2

SMS installiert und aktiviert

Sobald SMS aktiviert ist, ergeben sich einschneidende Änderungen. Zum einen werden JCL-Parameter verfügbar sein, zum anderen sind Auswirkungen auf vorhandene JCL

neue

möglich.

SMS -

Storage Management Subsystem

311

Neue JCL-Anweisungen für SMS Für die Arbeit mit SMS gibt es 10 neue DD-Parameter. Außerdem haben einige bekannte Parameter mit SMS eine neue Bedeutung bekommen. Sie alle werden nunmehr im

einzelnen

vorgestellt.

AVGREC und SPACE

Syntax:

AVGREC=U

I KI

M

SPACE=(reclen,(prim-alloc,sec-alloc),RLSE) AVGREC wird benutzt, um die Platzallokation in Records vorzunehmen. Die Parameter U, K und M werden als Multiplikatoren eingesetzt. U 1, K 1.024 und M 1.048.576. Wenn der SPACE-Parameter zusammen mit dem AVGREC-Parameter eingesetzt wird, so wird diesem Fall die Zahl als logische Record-Länge interpretiert. Wird SPACE ohne AVGREC eingesetzt, so wird die Zahl als physische Record-Länge interpretiert. =

//DDNAME

DD

=

=

AVGREC=U,SPACE= (100, (500,100))

Hier wird Platz für maximal 2.000 Records (500 für den Primary Extent + maximal 15 x 100 für die Secondary Extents) angefordert. U A= 1. Da die logische Record-Länge 100 Byte ist, werden insgesamt 200KB angefordert.

//DDNAME

DD AVGREC

=

K,SPACE=(80, (50,10))

Hier wird Platz für maximal 200.000 Records (50 x 1.000 für den Primary Extent + maximal 15 x 10 x 1.000 für die Secondary Extents) angefordert. K A= 1.000. Da die logische Record-Länge 80 Byte ist, werden insgesamt ca. 16MB angefordert.

Auch bei SMS-kontrollierten Datasets können bis zu 16 Extents erzeugt werden. Die Logik entspricht der der nicht-SMS-Datasets. Bei variabel langen Records ist die durchschnittliche Record-Länge anzugeben. Sie wird dann zur Allokation herangezogen. DATACLAS

Syntax:

DATACLAS=Datenklassenname Der DATACLAS-Parameter wird beim

Anlegen

von

neuen

Datasets verwendet. Er

bewirkt, daß für das neue Dataset die Angaben, die für die Datenklasse spezifiziert wurden,

MVS/ESA JCL

312

übernommen werden. DATACLAS kann auch für Band- bzw. Kassettendatasets

spezifiziert werden. Die Datenklasse beinhaltet folgende Informationen: Record Organization

-

-

-

(RECORG)* (welche Art von VSAM-Dataset). Record-Format (RECFM) *. Record-Länge (LRECL)*.' Schlüssel-Länge (KEYLEN)* (nur für VSAM-Datasets). Schlüssel-Position (KEYOFF)* (nur für VSAM-Datasets). Platzanforderung (AVGREC* und SPACE*) Retention Period oder Expiration Date (RETPD* oder EXPDT*). Volume Count

.

IMBED, REPLICATE, CISIZE, FREESPACE und SHARE-OPTIONS (nur für VSAM-Datasets). Die mit einem * gekennzeichneten Parameter können in der gleichen DD-Anweisung -

überschrieben werden.

Auf die

Angabe von DATACLAS kann verzichtet werden, wenn eine sogenannte Automatic Class Selection Routine installiert ist. Dann wird aufgrund bestimmter Merkmale des DSN eine Zuweisung zu einer Datenklasse erfolgen. Ob und welche Art von ACS bei Ihnen installiert ist, können Sie unter ISMF erfahren. Beispiel: ohne ACS

//OUTFILE // //

DD

DSN=UWIN.SCHULUNG.OUTFILE,

DISP=(,CATLG,DELETE), DATACLAS=SEQ80,STORCLAS=S21PERM

mit ACS

//OUTFILE //

DD

DSN=UWIN.SCHULUNG.COBOL, DISP=(,CATLG,DELETE)

Das zweite

Speicher-

Beispiel funktioniert nur dann, wenn für den DSN eine und Datenklasse mit Hilfe von ACS möglich ist.

KEYLEN

Syntax:

KEYLEN=schlüssellänge

Zuweisung

zu

einer

SMS -

Storage Management Subsystem

313

Dieser Parameter wird bei SMS dazu benutzt, einem VSAM KSDS-Dataset eine Schlüssellänge zuzuweisen. Die Länge kann zwischen 1 und 255 liegen. Wird KEYLEN explizit angegeben, so werden die Angaben der Datenklasse überschrieben. KEYLEN ist nur gültig, wenn RECORG=KS ist. Er wird zusammen mit dem KEYOFFParameter (s.u.) eingesetzt. KEYOFF

Syntax: KEYOFF=offset Mit dem KEYOFF-Parameter wird die Position des Schlüssels in einem VSAM KSDSDataset angegeben. KEYOFF wird nur beim Anlegen einem VSAM KSDS-Dataset benötigt. Der erste Offset ist 0.

Beispiel:

//NEUVSAM // //

DD

DSN=UWIN.VSAM.KSDS.NEU,

DATACLAS=KSDS01,

DISP=(,CATLG,DELETE),KEYLEN=10,KEYOFF=5

Es wird ein VSAM KSDS-Dataset neu angelegt und die Werte aus der Datenklasse KSDS01 übernommen. Die Angaben der Datenklasse für Schlüssellänge und -position weiden überschrieben. In der Datenklasse würde wahrscheinlich als Schlüsselposition der Default 0 angenommen. Der Schlüssel

beginnt auf dem 6. Byte.

LIKE

Syntax:

LIKE=dsname Der LIKE-Parameter kann unter SMS dazu verwendet werden, Datasetattribute eines Modelldatasets zu kopieren. Dies bezieht sich auf folgende Parameter: 1. RECORG

2. 3.

(nur Bedeutung bei VSAM-Datasets),

RECFM, LRECL,

4. KEYLEN (nur Bedeutung bei VSAM-Datasets), 5. KEYOFF (nur Bedeutung bei VSAM-Datasets), 6.

AVGREC,

MVS/ESA JCL

314 7. SPACE

Wird LIKE=dsname Dataset übernommen.

angegeben,

so

werden die Datasetattribute für das

neu

anzulegende

RETPD- und EXPDT-Angaben des Modelldatasets werden nicht übernommen. Das Modelldataset muß katalogisiert sein. Keinesfalls darf es ein temporäres Dataset (DSN=&&dsname) sein. Mit Membem eines PO-Datasets und GDGs funktioniert LIKE ebenfalls nicht. Werden zusätzlich zu LIKE weitere DD-Parameter angegeben, so überschreiben diese Angaben die vom Modelldataset kopierten.

mit REFDD verwendet werden. Im Gegensatz zu den meisten anderen JCL-Parametern, die mit SMS in Verbindung stehen, kann LIKE auch bei Band- bzw- Kassettendatasets eingesetzt werden. LIKE darf in einer DD-Anweisung nicht

zusammen

Beispiel:

//OUTPUT // //

DD

DSN=UWIN.SCHULUNG.OUTPUT2,

DISP=(,CATLG,DELETE), LIKE=UWIN.MODEL.OUTPUT

Die Attribute des Dataset UWIN.MODEL.OUTPUT werden diesem Dataset UWIN.SCHULUNG.OUTPUT2 übernommen.

//OUTPUT // // // //

DD

Beispiel für das neue

DSN=UWIN.SCHULUNG.OUTPUT.VSAM,

DISP=(,CATLG,DELETE), LIKE=UWIN.MODEL.VSAM.KSDS, KEYOFF=5, KEYLEN=15

In diesem

Beispiel wird ein neues VSAM-Dataset angelegt. Als Modell dient UWIN.MODEL.VSAM.KSDS. Die Angaben für Schlüssellänge und -position werden überschrieben. MGMTCLAS

Syntax:

MGMTCLAS=managementklassenname Zuordnung zu einer Managementklasse dient dazu, das Dataset nach bestimmten Gesichtspunkten zu migrieren und Backups zu erstellen. Es können nur gültige Klassen, die von der Systemprogrammierung aufgesetzt werden, verwendet werden. Die Attribute der Managementklasse können mit JCL nicht beeinflußt werden.

Die

SMS -

Storage Management Subsystem

entsprechende ACS-Routinen existieren, greifen sie, Managementklasse gemacht wurden. Sofern

315

falls keine

Angabe

zur

Bedeutung.

Mit

RECORG

Syntax:

RECORG=KS

|

ES

I

RR

I

LS

Der RECORG-Parameter hat nur in Zusammenhang mit VSAM-Datasets ihm wird angeben, welche Art von VSAM-Dataset angelegt werden soll.

Möglich sind: Key Sequenced Data Set (VSAM-Dataset mit Schlüssel). Entry Sequenced Data Set (Sequentielles VSAM-Dataset). 3. RR Relative Record Data Set (VSAM-Dataset mit relativem Schlüssel). Linear Space Data Set (Lineares VSAM-Dataset). 4. LS Wird RECORG nicht angegeben, erwartet SMS, daß eine Bibliothek oder ein sequentielles Dataset angelegt werden soll. 1. KS 2. ES

-

-

-

-

REFDD

Syntax: \ddname

REFDD=

*.stepname.ddname

_*.stepname.procstepname.ddname_ Der REFDD-Parameter erfüllt die

gleiche Funktion wie der LIKE-Parameter. Der Unterschied zwischen beiden besteht darin, daß sich REFDD auf ein im Job neu angelegtes Dataset bezieht, während LIKE sich auf ein bereits katalogisiertes Dataset bezieht. Dies ist der Grund dafür, daß REFDD mit einem Rückbezug arbeitet. Bei LIKE genügt die Angabe des DSN. Es gelten die gleichen Einschränkungen wie bei LIKE. REFDD und LIKE dürfen nicht zusammen in einer DD-Anweisung verwendet werden. Im Gegensatz zu den meisten anderen JCL-Parametem, die mit SMS in Verbindung stehen, kann REFDD wie LIKE auch bei Band- bzw- Kassettendatasets eingesetzt werden.

MVS/ESA JCL

316

Beispiel:

//STEP1 //0UT1 // // // // //OUT2 // // //

EXEC PGM=P808401 DD DSN=UWIN.SCHULUNG.OUTPUT.SEQ1,

DISP=(NEW,CATLG), STORCLAS=S21PERM, DATACLAS=SEQSMALL, LRECL=65 DD

DSN=UWIN.SCHULUNG.OUTPUT.SEQ2,

DISP=(NEW,CATLG), STORCLAS=S21PERM, REFDD=*.OUTl

Beim Anlegen des Dataset unter dem DD-Namen OUTPUT 1 werden die Angaben der Datenklasse SEQSMALL übernommen, wobei die logische Record-Länge mit 65 überschrieben wird. Bei OUTPUT2 werden die Attribute von OUTPUT1 übernommen, also auch die logische Record-Länge von 65 Byte. Die übrigen Attribute entsprechen der Datenklasse SEQSMALL, die ja zum Anlegen unter OUTPUT1 herangezogen wurde. SECMODEL

Syntax:

SECMODEL=(profilname[,GENERIC]) Mit dem SECMODEL-Parameter kann für das neu anzulegende Dataset ein bestimmtes existierendes RACF-Profil übernommen werden. Dies macht aber nur Sinn, wenn der DSN des neu anzulegenden Dataset nicht unter ein existierendes RACF-Profil fällt. Soll ein generisches Profil kopiert werden, so ist der entsprechende Schlüsselname anzugeben.

Änderungen an RACF-Parametera können über JCL nicht eingegeben werden. STORCLAS

Syntax:

STORCLAS=speicherklasse Wird für ein neues Dataset der STORCLAS-Parameter Kontrolle von SMS unterstellt.

verwendet,

so

wird das Dataset der

SMS -

317

Storage Management Subsystem

Mit dem STORCLAS-Parameter wird festgelegt, in welcher Speicherklasse ein Dataset angelegt werden soll. Die Speicherklasse besteht aus einer Gruppe gleichartiger Plattenspeicher. Die Zuweisung einer Speicherklasse kann auch implizit über die Automatic Class Selection erfolgen. Datasets, die einer Speichelklasse zugeordnet werden, werden als SMS-managed bezeichnet. STORCLAS ersetzt die Angabe von UNIT=gruppenname.

der Speicherklassen ist Sache des Storage Administrators. Attribute der über JCL nicht geändert werden. können Speicherklasse Bei der Verwendung von UNIT und VOL=SER ist im Zusammenhang mit SMS Vorsicht geboten. Sie werden nur dann wirksam, wenn die Speicherklasse das Attribut GUARANTEED SPACE=YES besitzt. Ist dies nicht der Fall, so werden UNIT- und Die

Festlegung

VOLUME-Angaben ignoriert. Neue IDCAMS-Parameter für SMS

Syntax:

STORAGECLASS(speicherklasse) DATACLASS(datenklasse) MANAGEMENTCLASS(managementklasse) Die Parameter werden wie andere IDCAMS-Parameter eingesetzt. Ihre Bedeutung entspricht denen der entsprechenden JCL-Parameter. Durch die Angabe von STORAGECLASS wird ein neues VSAM-Dataset der Kontrolle von SMS unterstellt, sofern dies nicht automatisch mit ACS geschieht.

6.3

SMS-managed

vs.

nicht-SMS-managed

Wenn SMS aktiviert wird, so kann theoretisch die gesamte Datasetverwaltung unter seine Kontrolle gestellt werden. Durch die Zuordnung von DATACLAS, STORCLAS und MGMTCLAS werden einem neu zu erstellenden Dataset physische Attribute zugewiesen.

//NEUDAT // // // //

DD

DSN=UWIN.SCHULUNG.COBOL,

DISP=(NEW,CATLG), DATACLAS=PODAT, STORCLAS=PERMDSK, MGMTCLAS=NORM

Diese Form der Definition ist etwas einfacher als die bisher mit JCL übliche. Die Datasetattribute RECFM, LRECL, SPACE usw. werden über die DATACLAS Durch STORCLAS wird das Dataset auf ein permanentes Volume gelegt, dies zugeordnet. -

-

MVS/ESA JCL

318

entspricht in etwa dem bisherigen Parameter UNIT=gruppenname. MGMTCLAS sorgt für die Zuordnung bestimmter Migrations- und Backupattribute. Trotzdem ist diese Form der Definition noch umfangreich. Es gibt aber eine noch weitergehende Möglichkeit, nämlich die Definition der sogenannten Automatic Class Selection (ACS). ACS fußt auf Merkmalen des DSNs eines anzulegenden Dataset. Erfüllt der DSN bestimmte Konventionen, so übernimmt ACS die Zuordnung zu bestimmten Klassen. Im Endstadium sollte mit ACS

//NEUDAT //

DD

folgendes möglich werden:

DSN=UWIN.SCHULUNG.COBOL,

DISP=(NEW,CATLG)

Durch eine entsprechende systemseitige Definition ordnet ACS das so anzulegende Dataset bestimmten Klassen zu, weil hier der dritte Qualifier des DSN COBOL heißt. Die Zuordnung erfolgt zur Datenklasse PODAT, es wird also ein Partitioned Data Set erzeugt, mit einer Record-Länge von 80 Byte und Record Format. Als Speicherklasse wird PERMDSK zugeordnet.

In der Praxis wird es aber schwierig werden, alle DSNs so weit zu standardisieren, daß sie ohne weiteres von ACS erkannt werden können. Aus diesem Grund wird das explizite Zuweisen über STORCLAS erforderlich bleiben.

Anlegen von Datasets unter SMS ohne ACS Sequentielle Datasets Ohne ACS unterscheidet sich das Zustand ohne SMS:

//NEUDAT // // // //

DD

Anlegen

eines Datasets zunächst

nur

unwesentlich

vom

DSN=UWIN.SCHULUNG.DS99,

DISP=(NEW,CATLG), STORCLAS=PERMDSK,

SPACE=(TRK, (10,1) ,RLSE)

,

RECFM=FB,LRECL=80

Durch die Angabe des STORCLAS-Parameters wird das neue Dataset der Kontrolle von SMS unterstellt und auf einem Volume angelegt, das ebenfalls von SMS kontrolliert wird und zur Speicherklasse mit dem Namen PERMDSK gehört. Sofern die entsprechenden ACS-Routinen existieren, kann auf die Angabe von STORCLAS verzichtet werden. ACS weist dann aufgrund des DSN eine bestimmte Storage Class zu. Eine der wichtigsten Auswirkungen der Zuordnung zu SMS besteht darin, daß das Dataset jetzt am Step-Anfang katalogisiert wird und nicht wie bisher, am Step-Ende. Sollte ein Katalogeintrag gleichen Namens bestehen, so kommt es jetzt zu einem JCL-Fehler:

SMS -

319

Storage Management Subsystem

IEF344I

jobname stepname

-

ALLOCATION FAILED DUE TO DATA FACILITY SYSTEM ERROR DATA SET dsname NOT

IGD17101I

DEFINED BECAUSE

DUPLICATE NAME EXISTS IN THE CATALOG Dies stellt einen wesentlichen Fortschritt zur bisherigen Situation dar, in der man ein zweites Dataset gleichen Namens anlegen konnte, dieses Dataset aber dann nicht katalogisiert wurde. Hinzu kam, daß dieser Fehler sich nicht einmal im Return Code ausdrückte, sondern lediglich in den Messages anhand der Meldung NOT CATLGD 2 erkennbar war. Sofern eine entsprechende Datenklasse definiert ist, lassen sich die Angaben beim Anlegen des Datasets weiter vereinfachen:

//NEUDAT // //

DD

DSN=UWIN.SCHULUNG.DS99,

DISP=(NEW,CATLG), STORCLAS

=

PERMDSK,DATACLAS PS 8 0 SMAL =

Im obigen Beispiel werden die gesamten Attribute der Datenklasse PS80SMAL übernommen. Hier werden mehrere Probleme deutlich: 1.

Intransparenz: Der User muß um die Attribute der Datenklasse wissen, die von JCL können erhebliche Probleme entstehen. Neue User müssen mit den Datenklassen vertraut

hohen Dokumentationsaufwand. 2. Flexibilität: Wenn

er

einsetzt. Bei der Wartung

gemacht werden.

Dies erfordert einen

Attribute der Datenklasse überschrieben werden müssen, kann der Kodieraufwand ähnlich hoch wie früher werden. Unter Umständen ist es dann besser, auf die Zuordnung zur Datenklasse zu verzichten. Datasets mit Hilfe des VOL=SER-Parameters auf ganz bestimmte Platten zu legen, wird unter SMS nur dann möglich sein, wenn die Storage Class mit dem Attribut GUARANTEED SPACE=YES versehen ist. Andernfalls werden UNIT und VOLUME-

Angaben ignoriert.

MVS/ESA JCL

320

//NEUDAT // // // //

DD

DSN=UWIN.SCHULUNG.DS99,

DISP=(NEW,CATLG), STORCLAS=S21PERM,VOL=SER=PRM0 0 8,

SPACE=(TRK,(10,1),RLSE), RECFM=FB,LRECL=80

Das Dataset wird nur dann auf die Platte PRM008 gelegt, wenn die Platte zur Storage Class S21PERM gehört und die Storage Class das Attribut GUARANTEED SPACE=YES besitzt. Ist eine dieser Bedingungen nicht erfüllt, so kommt es zu den Problemen, die ab Seite 372 beschrieben sind.

VSAM-Datasets Unter SMS lassen sich jetzt auch VSAM-Datasets im Job anlegen. Ganz ohne IDCAMS kommt man aber auch dann nicht aus, denn der Katalog muß vor dem Anlegen bereinigt werden.

Beim Anlegen von VSAM-Datasets muß eine Datenklasse angegeben werden. Sie enthält neben den überschreibbaren Parametern wie KEYLEN und KEYOFF auch Parameter, die nicht überschrieben werden können. Dazu zählt zum Beispiel die Kontrollintervallgröße. Die Wahl der optimalen CI-Größe ist aber für die Performance eines VSAM Dataset von ausschlaggebender Bedeutung. Entweder muß dann eine große Zahl von Datenklassen für VSAM-Datasets definiert werden oder man greift auf IDCAMS zurück.

SMS

321

Storage Management Subsystem -

edit-uuin.schulung. idcloes(defksds) 01.02 .columns 001 072 scroll ===> page command ===> ****** ***************************** top of data ***************************** 000001 //uwin217c job (uwin.abtdg02),'m.winter',not ify=uwin, 000002 // class=t,msgclass=y 000003 //*************************************************************** 000004 //* 000005 //* idcams zum anlegen eines vsam ksds-dataset mit sms 000006 //* -

000007 000008 000009 000010 000011 000012

//*************************************************************** //define exec pgm=idcams //sysprint dd sysout=* //sysin dd * delete -

uwin.schulung.vsam.ksds

cluster 000013 000014 //define exec pgm=iefbr14 000016 //vsamout dd dsn=uwin.schulung.vsam.output1, 000017 // disp=(new,catlg), 000018 // storclas=s21perm, 000019 // recorg=ks, 000020 // dataclas=ksdstest, 000021 // space=(200,(100,10)),avgrec=k, 000022 // lrecl=80, 000023 // keylen=12 ******

***************************

bottom of data

**************************

So angenehm die Möglichkeit des Anlegens von VSAM-Datasets auf den ersten Blick sein mag, so hat sie doch den Nachteil, daß viele Optionen, die unter IDCAMS zur Verfügung stehen, hier nicht gegeben sind. Hinzu kommt, daß viele Parameter als Teil der Datenklasse übernommen werden, was die Transparenz nicht gerade fördert. Da man unter SMS VSAM-Datasets im Job anlegen kann, kann man sie auch ohne IDCAMS löschen und zwar durch die Angabe (OLD,DELETE) im DISP-Parameter. Von dieser Möglichkeit sollte man keinen Gebrauch machen. Sollte im folgenden Beispiel das VSAM-Dataset zum Zeitpunkt des Step-Beginns bereits gelöscht sein, so kommt es zu einem JCL-Allokationsfehler, da ein DATASET NOT CATALOGED-Fehler auftritt. Die Folge: Der Job stirbt bereits in diesem Step. IDCAMS hätte lediglich einen Return Code von 8 geliefert.

MVS/ESA JCL

322

01.02 .columns 001 072 scroll ===> page top of data *****************************

edit-uwin.schulung. idcloes(delksds)

-

command

===>

******

*****************************

000001 000002 000003 000004 000005 000006 000007 000008 000009 000010

//uwin217c job (uwin,abtdg02),'m.winter1,notify=uwin, // class=t,msgclass=y

******

***************************

//*************************************************************** //* //* //*

iefbr14 zum loeschen eines vsam ksds-dataset mit sms

//*************************************************************** //delete //delvsam //

exec pgm=iefbr14 dd dsn=uwin.schulung.vsam.output1

,

disp=(old,delete) bottom of data

**************************

Aus diesem Grand sollte man für das Löschen nach wie vor nur IDCAMS verwenden.

Anlegen von Datasets unter SMS mit ACS Sequentielle Datasets Mit Hilfe der Automated Class Selection lassen sich die Zuweisungen von Storage Class, Data Class und Management Class automatisieren. Die Zuordnung erfolgt aufgrund von festgelegten DSN-Merkmalen des neuen Dataset. Die Zuordnung kann in zweierlei Form erfolgen. 1.

Ohne Überschreibungsmöglichkeit: Erkennt eine ACS-Routine einen DSN, so erfolgt die Zuordnung zu bestimmten Klassen aufgrund der Angabe in der ACS. Zusätzlich in der JCL kodierte Parameter wie STORCLAS oder DATACLAS werden ignoriert.

2.

Mit Überschreibungsmöglichkeit:

Erkennt eine ACS-Routine einen DSN, so erfolgt die Zuordnung zu bestimmten Klassen aufgrund der Angabe in der ACS. Zusätzlich in der JCL codierte Parameter wie STORCLAS oder DATACLAS ersetzen dabei die Standardangaben der ACS. Sie sich, ob und in welchem Umfang ACS-Routinen bei Ihnen eingesetzt werden. Sie verlangen ein hohes Maß an DSN-Standardisierung, so daß der mögliche Nutzen vom Definitionsaufwand aufgefressen werden kann. Dort, wo es bereits standardisierte DSNs gibt, ist der Nutzen eher gering. So lassen sich DSNs, die COBOL, LOAD oder CNTL als Bestandteil enthalten, natürlich leicht identifizieren, nur werden diese Datasets meist unter ISPF angelegt und nicht im Job. Ein weiteres Problem der ACS ist seine Intransparenz. Dem User müssen die vom ACS erfaßten DSNs geläufig sein. Ansonsten könnte es ihm passieren, daß ACS von sich aus

Erkundigen

SMS -

323

Storage Management Subsystem

gesetzte Parameter in der JCL Klaren ist.

überschreibt, ohne daß sich der User über diese Tatsache im

Anlegen eines sequentiellen Datasets mit ACS: 01.02 .-COLUMNS 001 072

EDIT-UWIN.SCHULUNG.SMS(DEFSEQ) -

COMMAND

SCROLL

===>

******

*****************************

000001 000002 000003 000004

//UWIN217C job (UWIN,ABTDG02),1M.WINTER1, // NOTIFY=UWIN, // CLASS=T,

top OF DATA

===>

PAGE

*****************************

// MSGCLASS=Y 000005 //******************************** 000006 //* 000007 //* IEFBR14 ZUM ANLEGEN EINES SEQUENTIELLEN DATASET MIT ACS 000008 //* 000009 //*************************************************************** 000010 //DELETE EXEC PGM=IDCAMS 000011 //SYSPRINT DD SYSOUT=* ,

000012 //SYSIN DD * 000013 DELETE 000014 UWIN.SCHULUNG.NEUDAT 000015 IF MAXCC = 8 THEN SET MAXCC -

0 000016 //DEFINE EXEC PGM=IEFBR14 000017 //NEUFILE DD DSN=UWIN.SCHULUNG.NEUDAT, 000018 // DISP=(NEW,CATLG) ******

Die

*****************************

=

BOTTOM OF DATA

***************************

Zuweisung von Storage Class und den weiteren Datasetattributen übernimmt ACS.

MVS/ESA JCL

324 VSAM-Datasets

Anlegen eines VSAM-Dataset mit ACS: 01.02

EDIT-UUIN.SCHULUNG.SMS(DEFKSDS)

.

COLUMNS 001 072

-

COMMAND ******

SCROLL

===>

*****************************

TOP OF DATA

===>

PAGE

*****************************

000001 //UWIN217C JOB (UWIN,ABTDG02),'M.WINTER', 000002 // NOTIFY=UWIN, 000003 // CLASS=T, 000004 // MSGCLASS=Y EXEC PGM=IDCAMS 000005 //DELETE 000006 //SYSPRINT DD SYSOUT=* 000007 //SYSIN DD * DELETE 000008 UWIN.SCHULUNG.VSAM.KSDS 000009 000010 CLUSTER EXEC PGM=IEFBR14 000011 //DEFINE 000012 //NEUFILE DD DSN=UWIN.SCHULUNG.VSAM.KSDS, 000013 // DISP=(NEW,CATLG), 000014 // KEYLEN=8, DATACLAS=KSDS01 000015 // -

******

*****************************

BOTTOM OF DATA

***************************

Beim Anlegen von VSAM-Datasets wird man um die Angabe einer Datenklasse in der Praxis nicht herumkommen, da es kaum möglich sein wird, alle Attribute über den DSN zu steuern.

6.4

Mögliche Probleme beim Einsatz von SMS

Probleme beim Einsatz von SMS können überall dort auftreten, wo JCL eingesetzt wird, deren Qualität zweifelhaft ist. So ist es bisher möglich, in einem Step Datasets anzulegen, die bei Step-Ende nicht katalogisiert werden. Diese Katastrophe (!) wird sich unter SMS in einem JCL-Fehler niederschlagen und somit nicht mehr unbemerkt bleiben. Das Problem liegt in diesem Fall nicht im Einsatz von SMS, sondern in der zugrunde liegenden schlechten JCL.

VOL=SER in der JCL Andere Probleme können auftreten,

wenn

JCL

volume-spezifisch ist.

SMS -

Storage Management Subsystem

//DEFINE //NEUFILE // // // //

325

EXEC PGM=IEFBR14, DD DSN=UWIN.SCHULUNG.NEUDAT,

DISP=(NEW,CATLG), UNIT=SYSDA,VOL=SER=PRM0 05,

SPACE=(CYL,(5,1)), DCB=(BLKSIZE=23440,LRECL=80,RECFM=FB)

Dies ist ein Beispiel für eine vielerorts nicht gern gesehene JCL. Durch sie wird ein Dataset auf einer ganz bestimmten Platte angelegt. Probleme können auftreten, wenn der DSN UWIN.SCHULUNG.NEUDAT von einer ACSRoutine erkannt wird und das Dataset somit der Kontrolle von SMS unterliegt. Damit wird automatisch eine Storage Class zugeordnet. Es sind folgende Situationen möglich: 1.

Die Platte PRM005 fällt ebenfalls unter die Kontrolle von SMS. Die durch den DSN zugeordnete Storage Class hat das GUARANTEED SPACE=NO Attribut: Die VOL=SER-Angabe wird ignoriert und SMS sucht sich ein anderes Volume in der durch den DSN zugeordneten Speicherklasse.

2.

Die Platte PRM005 fällt ebenfalls unter die Kontrolle von SMS. Die durch den DSN zugeordnete Storage Class hat das GUARANTEED SPACE=YES Attribut:

VOL=SER-Angabe wird übernommen, sofern die Platte gleichen Speicherklasse hat, wie der DSN. Ansonsten siehe 1. Die 3.

4.

passendes

eine

Zuordnung

zur

Die Platte PRM005 fällt nicht unter die Kontrolle von SMS. Die durch den DSN zugeordnete Storage Class hat das GUARANTEED SPACE=NO Attribut: Die VOL=SER-Angabe wird ignoriert und SMS sucht sich ein anderes passendes Volume in der durch den DSN zugeordneten Speicherklasse. Die Platte PRM005 fällt nicht unter die Kontrolle von SMS. Die durch den DSN zugeordnete Storage Class hat das GUARANTEED SPACE=YES Attribut: Es kommt zu einem JCL-Fehler, weil versucht wird, ein von SMS kontrolliertes Dataset auf einem nicht von SMS kontrollierten Volume anzulegen.

MVS/ESA JCL

326

DISP=(OLD,DELETE) bei VSAM-Datasets Das

folgende Beispiel zeigt einen Produktionsjob nach der Umstellung auf SMS:

******

*****************************

000001 000002 000003 000004 000005 000006

//P124A001

TOP oF DATA

*****************************

JOB (124,HKL23),1H.WINTER 1,NOTIFY=U124002, CLASS=U,MSGCLASS=B,USER=U124002

//

//*******************************

//* //* //* 000007 //* 000008 //*

MONATLICHES ERSTELLEN DER ABRECHNUNGEN

SACHGEBIET 124 -

AUF DER BASIS DER IM SYSTEM24 VERWENDETEN EINGABEDATEIEN

000009 //******************************* 000010 //STEP1 EXEC PGM=P124001 000011 //STEPLIB DD DSN=P124.LOADLIB,DISP=SHR DD DSN=P124.PROD.VSAM.KSDS001, 000012 //VSAMIN

DISP=(0LD,DELETE)

000013 // 000128 000129 000130 000131

//STEP22 //STEPLIB

******

***************************

//VSAMIN //

EXEC PGM=P124004G DD DD

DSN=P124.LOADLIB,DISP=SHR DSN=P124.PROD.VSAM.KSDS001,

DISP=SHR BOTTOM OF DATA

**************************

Wurde diese JCL bisher ohne SMS verwendet, so passierte nichts Aufregendes. Da die Disposition (OLD,DELETE) für VSAM-Datasets ungültig war, wurde sie im STEP1 in (OLD,KEEP) umgeändert. Diese JCL ist natürlich Unfug und vermutlich ein nur übersehener Fehler. Unter SMS

passiert im Stepl folgendes:

Das VSAM-Dataset wird

gelöscht

DELETE ist unter SMS eine für VSAM-Datasets gültige Disposition geworden. Da SMS das Anlegen von VSAM-Datasets mit normaler JCL ermöglicht, können VSAM-Datasets mit normaler JCL auch wieder gelöscht werden. Es ist einleuchtend, daß es jetzt im STEP22 zu einem DATASET NOT CATALOGED-Fehler kommt.

Sollten Ihnen nach der Aktivierung von SMS in einem Job plötzlich VSAM-Datasets abhanden kommen, so prüfen Sie nach, ob die oben beschriebene Fehlerbedingung unter Umständen eingetreten ist.

Datasets auf mehreren Platten Unter SMS ist es nicht mehr möglich, sequentiellen Datasets die Ausdehnung auf mehrere Platten zu erlauben. Alle sekundären Extents müssen auf dem gleichen Volume sein, auf

SMS -

Storage Management Subsystem wurde. Sind sie

327

erschöpft,

dem das Dataset ABEND.

angelegt

Löschen und

entkatalogisieren von Datasets

Bevor Datasets neu angelegt werden, muß der verschiedene Weise geschehen: 1.

Mit IDCAMS

//UNCAT //SYSPRINT //SYSIN

so

kommt

Katalog bereinigt

es zu

einem SB37-04

werden. Dies kann auf

(ohne NSCR)

EXEC PGM=IDCAMS DD SYSOUT=* DD

*

DELETE dsname IF MAXCC

=

8 THEN SET MAXCC

=

0

Diese Form wird unter SMS keinerlei Probleme bereiten. Alle anderen Möglichkeiten, die jetzt vorgestellt werden, sind von zweifelhaftem Wert, obwohl sie zumindest teilweise funktionieren. Unter SMS kann es aber zu massiven Problemen kommen. 2.

Mit IEHPROGM

//UNCAT //SYSPRINT //DDI // //SYSIN SCRATCH

EXEC PGM=IEHPROGM DD SYSOUT=*

UNIT=PRMDSK, VOL=SER=PRM0 01,DISP=OLD DD

DD

*

DSNAME=DSNAME,VOL=PRMDSK=PRM001

UNCATLG DSNAME=DSNAME Diese Methode ist sehr umständlich, da man wissen muß, daß sich das Dataset auf der Platte PRM001 befindet. Unter SMS kann das nur noch funktionieren, wenn die Storage Class das Attribut GUARANTEED SPACE=YES besitzt. In diesem Fall wird bei Ausführung des SCRATCH Kommandos gelöscht und entkatalogisiert. (SMS läßt keine nicht katalogisierten Datasets zu.) Das folgende UNCATLG Kommando liefert einen Return Code von 4. Werden die Kontrollanweisungen getauscht (erst UNCATLG, dann SCRATCH), so wird entkatalogisiert und gelöscht. Das nachfolgende SCRATCH Kommando liefert dann einen Return Code von 8, was unter Umständen die Ausführung folgender Steps verhindern kann. Unter SMS sollte IEHPROGM für Plattendatasets nicht mehr eingesetzt werden.

MVS/ESA JCL

328 3.

Mit IDCAMS

//UNCAT //SYSPRINT //SYSIN

(mit NSCR)

EXEC PGM=IDCAMS DD SYSOUT=* *

DD

DELETE dsname NSCR

IF MAXCC

8 THEN SET MAXCC

m

0

=

Unter SMS ist die Angabe von NSCR fur Plattendatasets nicht mehr generell erlaubt, weil diese Operation zwar den Eintrag im User-Katalog, nicht aber die Einträge auf der Platte (VTOC und den SMS-Kontrolleintrag) löschen würde. Die Folge wäre ein nicht katalogisiertes Dataset, daß es unter SMS nicht geben darf.

Schon in der Vor-SMS-Umgebung war die Benutzung dieses Parameters mehr als zweifelhaft. Er löschte Katalogeinträge für nicht mehr auf der Platte existierende Datasets. Ein Zustand, den es erstens gar nicht geben dürfte und zweitens bei seinem Auftreten Nachforschungen über die Ursache auslösen sollte. Den Katalogeintrag unter SMS wiederherzustellen, berechtigten Personenkreis möglich:

//RECAT //SYSPRINT //SYSIN

ist sehr umständlich

nur

einem

speziell

EXEC PGM=IDCAMS DD SYSOUT=* DD

*

(NAME(dsname) VOLUME(PRM028) DEVICETYPE(33 90) RECATALOG) DEFINE NONVSAM

-

-

Die RECATALOG muß unbedingt angegeben werden. Geschieht dies nicht, so wird im User-Katalog ein Eintrag erzeugt, der auf ein nicht von SMS kontrolliertes Dataset verweist. Unter SMS soll beim Löschen von Datasets auf Platte unter keinen Umständen mit der Option NSCR (NOSCRATCH) gearbeitet werden.

SMS -

Storage Management Subsystem

329

4. IEFBR14 mit DISP=(OLD,UNCATLG)

//UN CAT //DDI // //CAT //DD2 // // //

EXEC PGM=IEFBR14 DD

DSN=UWIN.SCHULUNG.TEST,

DISP=(OLD,UNCATLG) EXEC PGM=IEFBR14 DD

DSN=UWIN.SCHULUNG.TEST,

DISP=(NEW,CATLG), UNIT=PRMDSK,RECFM=FB,LRECL=2 3 3,

SPACE=(TRK, (5,1))

Abgesehen davon, daß diese JCL hanebüchen ist es gibt keinen vernünftigen Grund, das Dataset nur zu entkatalogisieren, da es dann als 'Leiche' auf der Platte zurückbleibt hat sie bisher fast immer funktioniert. (Ausnahme: wenn beim Anlegen zufällig die Platte ausgewählt wird, auf der das Dataset als 'Leiche' zurückblieb.) Unter SMS wird dies auf keinen Fall mehr funktionieren, da die Disposition (OLD,UNCATLG) in (OLD,KEEP) umgewandelt wird. Es wird also nicht entkatalogisiert. Dadurch kann DD2 nicht angelegt werden, es kommt zu einem Katalogisierungsfehler (JCL-Fehler). Folge: Der Job stürzt ab. -

-

Nicht optimierte Blocksize

Benutzung von AVGREC ist zu beachten, daß SMS bei der Berechnung des Platzes, der zur Verfügung gestellt werden soll, von einer optimalen Blockgröße ausgeht, Bei der

die entweder vom User angegeben wurde oder vom

//NEUDAT // // // //

DD

System errechnet wurde.

DSN=UWIN.SCHULUNG.NEUDAT,

DISP=(NEW,CATLG,DELETE), S TORCLAS S 21PERM, =

SPACE=(80,100000),AVGREC=U, DCB=(BLKSIZE=80,RECFM=FB,LRECL=80)

Durch diese Angabe soll Platz für 100.000 Records ä 80 Byte angefordert werden. Da aber die Blockung völlig unzureichend ist, ist der Platzbedarf sechsmal so groß wie bei optimaler Blockung. Diesen erhöhten Platzbedarf deckt SMS aber nicht ab. Deshalb kann es leicht zu einem D37-04 ABEND kommen.

JOBCAT und STEPCAT Die JOBCAT und STEPCAT eingesetzt werden.

DD-Anweisungen

dürfen in

Zusammenhang mit

SMS nicht

MVS/ESA JCL

330

Neue Defaults beim DISP-Parameter Sofern SMS aktiv ist, kann der DISP-Parameter neue Defaults annehmen. Da SMS ausschließlich mit katalogisierten Datasets arbeitet, wird z.B. beim Anlegen eines Datasets die DISP=(NEW,KEEP) umgewandelt in DISP=(NEW,CATLG). Das Gleiche gilt sinngemäß für den Abnormal-Disp-Subparameter. Auf diese Weise verhindert SMS das Anlegen nicht katalogisierter Datasets auf Platte. Dies stellt einen wesentlichen Fortschritt dar. Da SMS mit nicht katalogisierten Datasets nicht arbeiten kann, wird auch die Disposition UNCATLG, sofern sie angegeben wird, umgewandelt in KEEP (mögliche Folgen s.o.). Die

folgende Übersicht zeigt die Defaults für VSAM-Datasets:

Datasetart:

VSAM

Angabe in der JCL

nimmt

DISP=(NEW,KEEP)

DISP=(NEW,CATLG)

DISP=(NEW,PASS)

DISP=(NEW,CATLG)

DISP=(OLD,PASS)

DISP=(OLD,KEEP)

DISP=(SHR,PASS)

DISP=(SHR,KEEP)

DISP=(OLD,UNCATLG)

DISP=(OLD,KEEP)

DISP=(SHR,UNCATLG)

DISP=(SHR,KEEP)

DISP=(OLD,CATLG)

DISP=(OLD,KEEP)

DISP=(SHR,CATLG)

DISP=(SHR,KEEP)

folgenden Default an

SMS

Storage Management Subsystem

331

-

Die

folgende Übersicht zeigt die Defaults für Nicht-VSAM-Datasets.

Datasetart:

nicht-VSAM

Angabe in der JCL

nimmt

DISP=(NEW,KEEP)

DISP=(NEW,CATLG)

DISP=(MOD,KEEP)

DIS P wenn

wird)

folgenden Default an

=

(MOD, CATLG) (gilt nur,

MOD in NEW umgesetzt

DISP=(OLD,UNCATLG)

DISP=(OLD,KEEP)

DISP=(SHR,UNCATLG)

DISP=

DISP=(OLD,CATLG)

DISP=(OLD,KEEP)

DISP=(SHR,CATLG)

DISP=

(SHR,. KEEP)

(SHR, KEEP')

JCL-Schnittstellen

7

Normalerweise werden Jobs als Member eines PO-Dataset erstellt. Um einen Job zu submitten, gibt man auf der Kommandozeile des ISPF den SUBMIT-Befehl ein. Darüber hinaus gibt es jedoch einige andere Möglichkeiten, Jobs zu submitten. Dies ist wichtig vor allem in Hinblick auf eine weitgehende Automatisierung. In diesem

Kapitel soll auf folgende Möglichkeiten eingegangen werden:

1. Jobs

aus

2. Jobs

aus

CLISTen submitten. REXX EXECs submitten.

3. Jobs mit Hilfe der File submitten.

Tailoring Services des ISPF Dialog Managers zu erstellen und zu

(Command List) ist wie REXX (Restructured Extended Executor) eine Interpretersprache, die auf IBM-Systemen eine Verarbeitung im Vordergrund durchfuhren CLIST

kann.

7.1

JCL

aus

CLISTen submitten

Batch Jobs lassen sich aus CLISTen heraus auf zweierlei Art submitten. Entweder werden die JCL-Anweisungen zusammen mit den CLIST-Anweisungen codiert oder die JCLAnweisungen stehen in einem Member einer Bibliothek. Im zweiten Fall wird dieses Member mit dem SUBMIT-Kommando aufgerufen. Anhand des folgenden Jobs soll demonstriert werden, wie Batch Jobs aus CLISTen heraus submitted werden. Der Job führt das Programm IEFBR14 aus. edit-uwin. schulung. cntl(

iefbr14)

01.06

---.

-

command ******

*****************************

000100 000200 000300 000400 000500

//uwin217c //step1

******

****************************

//

//dd 1 //

columns 001 072 ===> page

scroll

===>

jQp op data

******************************

(uwin,abtdg02),n0tify=uwin, class=c,msgclass=9 job

exec pgm=iefbr14 dd dsn=uwin.schulung.test, disp=shr bottom of data

****************************

MVSESA/JCL

334

Um den Job aus der CLIST heraus zu submitten, muß in der CLIST mit dem TSOKommando: SUBMIT gearbeitet werden. Die JCL wird ebenfalls einfach in die CLIST die JCL-Anweisungen auf die SUBMIT-Anweisung eingestellt. Da im folgenden Beispiel folgen, wird dies durch einen * kenntlich gemacht (entspricht SYSIN DD * in normaler JCL). Das END($$) ist eine Delimiter-Anweisung. Sie zeigt an, wo der Job-Stream endet und entspricht dem DLM-Parameter in der DD-Anweisung. Der vorangehende DISPLAY PANEL dient zum Anzeigen eines Panels, auf dem der Benutzer entscheiden kann, ob er den Job submitten will oder nicht. edit-uwin.schulung.clist(cl24)

01.06

.-.

-

command ******

===>

*****************************

000100 /* clist zum submitten eines 000200 ispexec display panel(p0024) 000300 if &lastcc = 8 then + 000400 000500 000600

columns 001 072 ===> page

scroll

tqp of data ****************************** batch jobs */

in_stream

do exit end

000700 submit * end($$) 000800 //uwin217c job (uuin,abtdg02),n0tify=uwin, 000900 // class=c,msgclass=9 exec pgm=iefbr14 001000 //step1 dd dsn=uwin.schulung.ds99, 001100 //dd1 disp=shr 001200 // 001300 $$ ****** **************************** bottom of data

****************************

Bis dahin ist die Sache noch nicht besonders spannend. Interessant wird es erst dann, wenn in der JCL Variable enthalten sind. Diese Variable werden in der CLIST vorbelegt. Verbindet man die CLIST mit einem Panel (Eingabebildschirm), so können die Variablen auch auf diese Weise belegt werden. Die Variablen sind in einer CLIST am vorangestellten & erkennbar. Dies kennen Sie bereits aus JCL-Prozeduren. Um nun Variableninhalte aus dem Panel zu übernehmen, müssen in die JCL Variable eingefügt werden. In unserem Beispiel soll die USERID, die Job-Klasse und der Name des unter DDI angesprochenen Dataset übergeben werden. Dazu muß der JCL-Teil der CLIST folgendermaßen geändert werden. Die

SET-Anweisungen dienen der Vorbelegung der Variablen mit Standardwerten.

335

JCL-Schnittstellen edit-uwin.schulung.clistccl24)

01,06

.

columns 001 072

-

command

scroll

===>

*****************************

000100 000200 000300 000400 000500 000600 000700 000800 000900 001000 001100

/* clist zum submitten eines in-stream batch jobs */

******

****************************

set &acct set &abt

= =

set &klasse

Tgp of data

===>

page

******************************

******

998 abtdg02 =

c

set &neudsn = 1 schulung.test submit * end($$)

1

//&sysuid.xxxx job (&acct.,&abt.),notify=&sysuid, //

//step1

//dd 1 // 001200 $$

class=&klasse,msgclass=9 exec pgm=iefbr14 dd

dsn=&sysuid..&neudsn,

disp=shr bottom of data

****************************

Der Jobname wird mit Hilfe der USERID, die sich in einer Systemvariablen mit der Bezeichnung &SYSUID befindet, und den vier Zeichen XXXX generiert. Für Account und Abteilung werden die vorbelegten Variableninhalte übernommen. Der doppelte Punkt im Parameter DSN kommt dadurch zustande, weil der erste Punkt der Variablenbegrenzer ist, der zweite Punkt trennt die verschiedenen DSN-Bestandteile.

CLISTen, die zum Submitten dienen, sollten nicht in einer Schleife laufen, da der Benutzer

unübersehbare Zahl von Jobs abschicken kann. Wer Dialog Manager Kenntnisse besitzt, kann sich ein Eingabepanel erstellen, in dem die Variablen belegt werden. Im Panel werden alle notwendigen Vorverarbeitungen vorgenommen.

sonst eine

MVSESA/JCL

336 01.05

edit-uwin.schulung.panels(p0024)

.

-

command ******

*****************************

000001 )body 000002 %. 000003 000004 000005 000006 000007 000008 000009 000011 000012 000013 000014 000015 000016 000017 000018

columns 001 072 ===> page

scroll

===>

fop of data

batch jobs submitten

*****************************

.

%command ===>_zcmd % % % job-klasse :_z°/.(nur c oder n) % % aufgabennummer:_nmr% % % abteilung :_abt %(ohne ortsangabe) % % neuer dsn % :_neudsn % % (geben sie den dsn ohne (!) die aufgaben-nummer an) % % %

000019 % 000020 % abbrechen mit pf3 000021 % 000022 )init 000023 .zvars=i(klasse)1 000024 )proc 000025 ver(&klasse,nb) 000026 ver(&klasse,li st,c,n,msg=mpan241) 000027 ver(&nmr,nb,num) 000028 ver(&abt,nb) 000029 ver(&neudsn,nb,dsname,msg=mpan242) 000030 )end ******

****************************

Die VERify-Anweisungen gemacht werden.

bottom of data

im Panel stellen

***************************

sicher, daß die Eingaben des Benutzers korrekt

Um das Panel verarbeiten zu können, wird die CLIST abgeändert. Die DISPLAYAnweisung ruft das Panel auf. Die nachfolgende Abfrage überprüft, ob der Benutzer die PF3-Taste gedrückt hat. Wenn dies nicht der Fall ist, wird der Job submitted.

337

JCL-Schnittstellen 01.06

edit-uwin.schulung.clist

*****************************

TOP of data

columns 001 072 scroll ===> page

******************************

000100 /* clist zum submitten eines in-stream batch jobs */ 000200 ispexec display panel(p0024) 000300 if &lastcc = 8 then +

000400 do 000500 exit 000600 end 000700 submit * end($$) 000800 //&sysuid.xxxx job

000900 // 001000 //step1 001100 //ddi 001200 // 001300 $$ ******

(&acct.,&abt.),notify=&sysuid, class=&klasse,msgclass=9 exec pgm=iefbr14

dd

dsn=&sysuid.-&neudsn,

disp=shr

****************************

bottom of data

****************************

Aus einer CLIST heraus läßt sich auch ein Job abschicken, der als Member eines PODataset gespeichert ist. In diesem Fall werden aber keine Variablen substituiert. Der Membername folgt unmittelbar auf die SUBMIT-Anweisung. Eine END-Anweisung wird hier nicht benötigt: 01.06 .-.columns 001 072

edit-uuin.schulung.clistccl24) -

command

scroll

===>

===>

page

top of data ****************************** in-stream batch jobs */ submitten 000100 /* clist zum eines 000200 ispexec display panel(p0024) ******

*****************************

000300 if &lastcc = 8 then + 000400 do 000500 exit 000600 end 000700 submit uwin.schulung.cntl(cl) ******

7.2

****************************

JCL

aus

bottom of data

****************************

REXX EXECs submitten

Um den Job aus der REXX EXEC heraus zu submitten, muß in der REXX EXEC ebenfalls mit dem TSO-Kommando SUBMIT gearbeitet werden. Die Art und Weise, wie in einer REXX EXEC die JCL-Anweisungen erzeugt werden, unterscheidet sich jedoch deutlich von der CLIST-Syntax. Die JCL wird nicht auf normalem Wege eingegeben, sondern mit Hilfe von QUEUE-Kommandos als String auf einen privaten Datenstapel gestellt. Dieser private Datenstapel wurde vorher mit der

MVSESA/JCL

338

Anweisung NEWSTACK angelegt. Das SUBMIT-Kommando bezieht sich dann auf die im Datenstapel abgelegten JCL-Anweisungen. Die anschließende Anweisung DELSTACK löscht den privaten Datenstapel wieder: edit-uwin.schulung.exec(rexx024)

01.04

.

-

command ******

*****************************

000001 000002 000003 000004 000005 000006 000007 000008

/* rexx */ /* /* keine schleife /* /* /*

000009 000010

top of data

*****************************

.

998 abt 1abtdg021 klasse = 'c neudsn = 'test' address ispexec "display panel(p0024)" = =

000011 000012 000013 if rc = 8 then do 000014 exit 000015 000016 end

*

/

*/ */ */

!!

.-.

nmr

columns 001 072 ===> page

scroll

===>

*

/

/* /* /* /* /* /*

initialisierung initialisierung umgebung auf ispf panel anzeigen

*/ */ */ */ */ */

/* /*

der user hat pf 3 gedrueckt deshalb ende

*/ */

initialisierung initialisierung

000017 address tso /* umgebung auf tso */ 000018 1newstack1 /* neuen stack eröffnen */ 000019 queue '//uwinrexx job (uwin,abtdg02),notify=uwin,1 000020 queue '// class=c,msgclass=9' 000021 queue '//create exec pgm=iefbr14' 000022 queue '//sysprint dd sysout=*' dd dsn=uwin.schulung.test, ' 000023 queue '//ddi queue disp=shr' 000024 '// 000025 queue '$$' 000026 "submit * end($$)" /* stack submitten */ 000027 delstack /* stack wieder löschen */ ****** **************************** bottom of data ***************************

Wenn Variablen benutzt werden sollen, so macht sich eine Besonderheit von REXX bemerkbar. Im Gegensatz zu CLIST haben REXX-Variable keinen führenden & und sind damit in der JCL nicht leicht auszumachen. Eine REXX-Variable beginnt dort, wo ein String explizit endet. Sie endet mit dem Beginn eines neuen Strings. Dies soll am Beispiel der ersten Zeile der JOB-Anweisung erläutert werden: Auf den String "//" folgt die Variable mit dem Namen user, darauf der String mit den Zeichen "XXXX JOB (". Es folgt die Variable mit der Bezeichnung NMR, darauf der String "," und dann die Variable ABT. Auf sie folgt ein weiterer String, der einen String enthält: "),'M.Winter',CLASS=". Aus diesem Grund wurde als Stringbegrenzer das Zeichen

JCL-Schnittstellen "

verwendet. Danach

String

339

folgt

die Variable KLASSE. Beendet wird die erste Zeile mit dem

Wie man sieht, muß man bei JCL-Anweisungen innerhalb einer REXX EXEC genau hinschauen. Mit einiger Übung macht es dann jedoch kaum noch Schwierigkeiten. EDIT-UWIN.SCHULUNG.EXEC(REXX024)

01.04

--.

-

COMMAND ******

COLUMNS 001 072 ===> PAGE

SCROLL

===> *****************************

jop OF DATA

*****************************

000001 /* REXX */ 000002 /*

.

KEINE SCHLEIFE !! 000003/* 000004 /*.-.-. 000005 NMR 998 /* INITIALISIERUNG 000006 AßT 'ABTDG021 /* INITIALISIERUNG 'C 000007 KLASSE /* INITIALISIERUNG 'TEST' 000008 NEUDSN /* INITIALISIERUNG 000009 ADDRESS ISPEXEC /* UMGEBUNG AUF ISPF 000010 "DISPLAY PANEL(P0024)"

*

/

*/ /

*/ */

=

=

*/ */

= =

*/

000011 IF RC = 8 THEN DO 000012 EXIT 000013 /* UND RAUS V END 000014 000015 ADDRESS TSO /* UMGEBUNG AUF TSO 000016 'NEWSTACK' /* NEUEN STACK ERÖFFNEN 000017 USER = USERIDO /* USERID REINHOLEN 000018 QUEUE "//"USER"XXXX JOB ("NMR","ABT"),1 M.WINTER 1,CLASS="KLASSE"," 000019 QUEUE "// MSGCLASS=9," 000020 QUEUE "// MSGLEVEL=(1,1)" 000021 QUEUE "//CREATE EXEC PGM=IEFBR14" 000022 QUEUE "//SYSPRINT DD SYS0UT=*" 000023 QUEUE "//DD1 DD DSN="USER". "NEUDSN"," DISP=SHR" 000024 QUEUE "// 000025 QUEUE "$$" 000026 DELSTACK /* STACK WIEDER LÖSCHEN */ ****** **************************** BOTTOM OF DATA ***************************

7.3

JCL mit File Tailoring Services generieren

Mit Hilfe der sogenannten Dateierstellungs-Services (engl. File Tailoring Services FTS) lassen sich mit dem Dialog Manager Batch Jobs zusammenstellen. Die JCL wird als Member in der als ISPSLIB allokierten Bibliothek abgelegt. Für eine bestimmte Funktion gibt es ein Member, das als Gerüst (Skeleton) für die zu generierende JCL dient. -

MVSESA/JCL

340

Mit FTS kann dann ein oder mehrere Member dazu benutzt werden, einen kompletten Job zu erstellen. Als Steuersprache wird in den folgenden Beispielen REXX verwendet. Der Job kann in einer temporären oder einer permanenten Datei oder als Member einer bereits existierenden Bibliothek abgelegt werden. Wird der Job temporär erzeugt, so geht die JCL nach dem SUBMIT verloren. Eine der größten Vorteile des Dateierstellungsservice ist die Tatsache, daß alle Elemente der JCL, auch SYSIN Daten, mit Variablen versehen werden können. Dies ergibt eine sehr große Flexibilität.

Erzeugen eines temporären Jobs Der Job wird aus den

folgenden zwei Skeletons erstellt.

edit-uwin.schulung.skels(job) -

command ******

===> *****************************

01.03 .-columns 001 072 scroll ===> page fop of data *****************************

000001 //uwin217c job (998,abtdg02),'m.winter1,class=&jobclass,notify=uwin, 000002 // msgclass=&meldung ******

****************************

bottom of data

edit-uwin.schulung.skels(iefbr14)

01.03

.

-

command ******

===> *****************************

***************************

columns 001 072 ===> page

scroll top of data

*****************************

exec pgm=iefbr14 000001 //create 000002 //sysprint dd sys0ut=* dd dsn=&sysuid..&neudsn,disp=shr 000003 //dd1 ****** **************************** bottom of data

***************************

Die Variablen JOBCLASS, MELDUNG und NEUDSN können in einem Panel eingegeben werden. Die REXX EXEC verarbeitet das Panel und erstellt aus dem Skeleton einen Job, der anschließend submitted wird.

341

JCL-Schnittstellen EDIT-UWIN. SCHULUNG .EXEC (REXX025)

01 .01 .COLUMNS 001 072 SCROLL ===> PAGE ***************************** jop OF DATA -

COMMAND ******

===> *****************************

/* REXX */ /* TRACE R */ * /* / */ /* REXX ZUM AUFRUF VON SKELETON-JCL */ /* ERSTELLT WIRD EIN TEMPORAERES FILE */ /* */ /* * /* / ADDRESS ISPEXEC /* UMGEBUNG SETZEN ,* "DISPLAY PANEL(P0025)' I* PANEL ANZEIGEN 000011 IF RC 8 THEN /* BEI RC 8 HAT USER PF3 GEDRUECKT DO /* 000012 /* ALSO ENDE 000013 EXIT

000001 000002 000003 000004 000005 000006 000007 000008 000009 000010

=

END 000014 000015 "FTOPEN TEMP"

/* /*

TEMPORAERE SKELETON DATEI OEFFNEN

000016 IF RC 000017 DO

>
< 0 THEN 000026 DO "FTCLOSE"

000027 000028 000029 000030 000031 000032 000033 000034 000035

ADDRESS TSO "FREE

FI(ISPFILE),

EXIT END



V */ *t "/ V V */ */ */

/*

WIEDER ZUMACHEN

*/

I* I*

UMGEBUNG AUF TSO

*/

DATEI FREIGEBEN

*/

I* I*

UND RAUS

*/

/* /* /*

SKELETON MEMBER JOB ANZIEHEN

/*

*/ SKELETON MEMBER IEFBR14 ANZIEHEN

*/

RC NE 0 ==> MEMBER EXISTIERT NICHT V ALSO FEHLER */

/*

WIEDER ZUMACHEN

*/

/* /* /* /*

UMGEBUNG AUF TSO

V */ */

DATEI FREIGEBEN UND RAUS

*/

"FTCLOSE"

,* DATEI,

"VGET (ZTEMPF)" ADDRESS TSO "SUBMIT "'ZTEMPF.

t*

DIESER VGET INITIALISIERT ZTEMPF

t*

UMGEBUNG AUF TSO SETZEN UND

DIE JCL

I* JOB SUBMITTEN

ENTHAELT,

ZUMACHEN

*/ V */

*/

Der File Tailoring Service benutzt die Anweisungen FTOPEN, FTINCL(ude) und FTCLOSE. Der Job wird in einer temporären Datei mit dem DD-Namen ISPFILE abgestellt. Der VGET ist notwendig, um eine evtl. bestehende Allokation zu überschreiben. Der Job wird nur temporär erzeugt. Nach dem SUBMIT-Kommando werden die JCL-

Anweisungen gelöscht.

342

MVSESA/JCL

Erzeugen des Jobs als Member einer Bibliothek Das Skeleton ist das Gleiche wie im vorhergehenden Beispiel. In der REXX EXEC wird mit der ALLOCATE-Anweisung gearbeitet. Mit ihr wird die Bibliothek, auf die der Job gestellt werden soll, allokiert.

Die Variablen fur den Bibliotheksnamen werden vorbesetzt oder können über ein Panel eingegeben werden. Den Namen wird jeweils die USERID als erster DSN Qualifier

vorangestellt.

EDIT-UUIN.SCHULUNG.EXEC(REXX026)

01.04 -

COMMAND ******

.

===>

COLUMNS 001 072 ===> PAGE

SCROLL

*****************************

fop OF DATA

*****************************

/* REXX */ /* /* REXX ZUM AUFRUF VON SKELETON-JCL /* DATEI WIRD IN MEMBER ABGESPEICHERT /* /* /* 000008 ADDRESS ISPEXEC /* UMGEBUNG SETZEN 000001 000002 000003 000004 000005 000006 000007

*

I

*/ */ */ */ *

I

--.

000009 CLASS 000010 MSGCLASS 000011 000012 000013 000014 000015 000016 000017 000018 000019 000020 000021 000022 000023 000024 000025 000026 000027 000028 000029 000030

Das

=

'C

/* VORBELEGUNG

*/ */

JOBKLASSE

/* VORBELEGUNG MSGKLASSE /* VORBELEGUNG BIBLIOTHEK MEMNAME 'TEST1 /* VORBELEGUNG MEMBERNAME MSGID f* MSGID INITIALISIEREN Y USERIDO /* USERID IN Y STELLEN /* DO FOREVER WIRD DURCHLAUFEN, BIS ENDE ODER PROBLEM DISPLAY DO FOREVER /* ERST WENN EINGABE O.K. KOMMT ES "DISPLAY PANEL(P0026) MSGC'MSGID")" /* ZUM JOB SUBMIT DATNAME

IF RC

=

'9'

=

1

>=

8 THEN

/*

/*

DO

EXIT

/*

PF3 GEDRUECKT ODER PROBLEM WENN JA DANN ENDE

ELSE

/*

/*

DO CALL SUCHE BIB

/* /*

*/ */ */ */ V

*/ •V */ */ */

/*

Beispiel wird auf der folgenden Seite fortgesetzt.

*/

*/

ANSONSTEN WEITERMACHEN UND PRUEFEN

JETZT IST ALLES O.K. ADDRESS TSO /* UMGEBUNG AUF TSO SETZEN "ALLOC FILECISPFILE) DA("NEUDAT") SHR REUSE" /* BIBLIOTHEK ADDRESS ISPEXEC /* UMGEBUNG WIEDER AUF ISPF "FTOPEN" /* SKELETON DATEI OEFFNEN END

*/

*/

/*

END

END

*/

SCHULUNG.CNTL'

ALLOK

*/ */ */ */ */ */

JCL-Schnittstellen 0 THEN 000031 IF RC >< DO 000032 "FTCLOSE" 000033 ADDRESS TSO 000034 "FREE FI(ISPFILE)" 000035 EXIT 000036 END 000037 000038 "FTINCL" JOB 000038 "FTINCL" IEFBR14 000039 IF RC >< 0 THEN 000040 DO 000041 "FTCLOSE"

343 /* RC NE 0 ==> FEHLER BEIM SERVICE /* ALSO FEHLER /* WIEDER ZUMACHEN /* UMGEBUNG AUF TSO /* DATEI FREIGEBEN /* UND RAUS

*/ */ */ */ */ */

/* SKELETON MEMBER ANZIEHEN */ /* SKELETON MEMBER ANZIEHEN */ /* RC NE 0 ==> MEMBER EXISTIERT NICHT */ /* ALSO FEHLER */ /* DATEI, DIE JCL ENTHAELT, ZUMACHEN */ /* UMGEBUNG AUF TSO */ /* DATEI FREIGEBEN */ /* UND RAUS */

ADDRESS TSO 000042 "FREE FI(ISPFILE)" 000043 EXIT 000044 000045 END 000046 "FTCLOSE NAMEC'MEMNAME") LIBRARY(I SP FILE)" /* NEUES MEMBER ERSTEL 000047 "VGET (ISPFILE)" /* ISPFILE INITIALISIEREN 000048 ADDRESS TSO /* UMGEBUNG AUF TSO SETZEN UND 000049 "SUBMIT"("NEUDAT")" /* JOB SUBMITTEN 000050 EXIT

000051 /* 000052 /* 000053 /* 000054 /* 000055 /* 000056 /* 000057 /* 000058 000059 000060 000061 000062 000063 000064 000065 000066

/* /* /* /* /* /* /* /* /*

.-.---.-.-.

*/ */ */ */ *

UNTERROUTINE ZUM ZUSAMMENSETZEN VON

1. BIBLIOTHEKSNAME IN LIBNAME 2. BIBLIOTHEKS- UND MEMBERNAME IN NEUDAT ANSCHLIEßEND WIRD DER STATUS GEPRUEFT. DER USER MUß EINE EXISTIERNDE BIBLIOTHEK ANGEBEN. ER KANN KEINE NEUE ANLEGEN. DER USER MUß EIN MEMBER NEU ANLEGEN. ER DARF EIN EXISTIERENDES MEMBER NICHT UEBERSCHREIBEN. -.

Das Beispiel wird auf der folgenden Seite

fortgesetzt.

*

/

*/ */ */ */ */ */ */ */ */ */ */ */ */ */ /

MVSESA/JCL

344

000067 000068 000069 000070 000071 000072 000073 000074 000075 000076 000077 000078 000079 000080 000081 000082

000083 000084 000085 000086 000087 000088 000089 000090 000091 000092 000093 000094 000095 ******

*/

/* ZUSAMMEN SETZEN BIBNNAME UND MEMNAME '.' !! DATNAME !! '(' !! MEMNAME !! ')' = Y !! '.' !! DATNAME = X /* STATUS ERMITTELN */ SYSDSN(NEUDAT) = MSGID /* MELDUNG AUF FEHLER SETZEN */ 1MP2611

SUCHE_BIB:

NEUDAT LIBNAME

=

Y !!

/* JE NACH STATUS WIRD MELDUNG GESETZT

SELECT WHEN X

=

'DATASET NOT FOUND'

DO

MSGID

'MP264'

=

*/

THEN

/* USER HAT EINE NICHT EXISTIERENDE DATEI */ */ /* EINGEGEBEN

END WHEN X

=

'MEMBER

SPECIFIED,

BUT DATASET IS NOT PARTITIONED' THEN

DO MSGID

=

'MP265' /*

/*

END WHEN X

=

'OK'

BIBLIOTHEK ANGEGEBEN

*/ */

THEN

/*

DO MSGID

USER HAT EINE SEQUENTIELLE STATT EINER

=

'MP266' /*

STATUS O.K.

==>

MEMBER EXISTIERT UND

DIES IST EINE FEHLERBEDINGUNG

*/ */

END WHEN X = 'MEMBER NOT FOUND' THEN DO /* NUR BEI MEMBER NOT FOUND IST ALLES */ MSGID = " /* O.K. */ = 'YES' OK END OTHERWISE DO /* UNGEWOEHNLICHE FEHLERBEDINGUNG, DER ALS */ MSGID = 'MP261' /* SYSTEMFEHLER AUSGEGEBEN WIRD */ END END RETURN **************************** BOTTOM OF DATA ***************************

Der FTCLOSE stellt den Job auf die unter ISPFILE allokierte Datei. Die Routine setzt den DSN und den DSN(memname) zusammen und prüft den Status ab. Dieser muß 'MEMBER NOT FOUND' sein, da der User keine Überschreibung eines existierenden Members machen soll.

Erzeugen des Jobs aus mehreren SKEL Membern Aus den

folgenden drei Skeletons wird durch die REXX EXEC ein Job erzeugt:

345

JCL-Schnittstellen EDIT-UWIN.SCHULUNG.SKELS(JOB) COMMAND ******

-

01.00

.

COLUMNS 001 072 ===> PAGE

SCROLL

===> *****************************

yep OF DATA

*****************************

000001 //UWIN217C JOB (998,ABTDG02),'M.WINTER 1,CLASS=&CLASS,NOTIFY=UWIN, 000002 // MSGCLASS=&MSGCLASS ******

****************************

BOTTOM OF DATA

01.00

edit-uwin.schulung.skels(del)

***************************

.

-

command ******

===> *****************************

top of data

columns 001 072 scroll ===> page

*****************************

exec pgm=idcams

000001 //delete 000002 //sysprint dd sys0ut=* 000003 //sysin dd * delete &neudsn 000004 ******

****************************

bottom of data

***************************

Beachten Sie, daß es selbst bei der Benutzung von Prozeduren unmöglich wäre, in der SYSIN DD * Anweisung eine Variable aufzunehmen. In der REXX EXEC ist dies möglich, weil Zeile fur Zeile interpretiert wird. 01.00

edit-uwin.schulung.skels(alloc) -

command

.

===>

******

*****************************

000001 000002 000003 000004

//alloc

exec pgm=iefbr14

//neu1

dd

******

****************************

// //

top of data

columns 001 072 scroll ===> page

*****************************

dsn=&neudsn,disp=(,catlg,delete), space=(trk,(5,1)), unit=&unit,recfm=fb,lrecl=&laenge bottom of data

***************************

Die folgende REXX EXEC verarbeitet ein Panel, setzt den DSN neu zusammen die USERID muß vorangestellt werden und ruft den Dateierstellungsservice auf. Dort werden alle drei Skeletons nacheinander aufgerufen und zu einem Job zusammen gebunden: -

-

346

MVSESA/JCL

edit-uwin.schulung.exec(rexx027)

01.00

.

-

command

columns 001 072 ===> page

scroll

===>

******

*****************************

000001 000002 000003 000004 000005

/* /* /* /* /*

000006 000007 000008 000009 000010 000011 000012 000013 000014 000015 000016 000017 000018 000019 000020

address ispexec = class 'c = msgclass '9'

rexx

top of data

*****************************

*/ *

/ */ */ */

rexx zum aufruf von skeleton-jcl erstellt wird ein temporaeres file .

000021 000022 000023

= unit 1sysda 1 "display panel(p0027)" if rc = 8 then

do exit

umgebung setzen

I* r t*

jobklasse initialisieren msgclass initialisieren panel anzeigen

t*

bei rc 8 hat user pf3 gedrueckt

i* i*

also ende

i* /* /* /*

x

= userido neudsn = x ! ! 1 "ftopen temp" if rc >< 0 then


< 0 then 000029 do

******

/*

*/ */ *l */ */

*/ */ userid reinholen */ dsn zusammensetzen */ temporaere skeleton datei oeffnen */ rc ne 0 */ */ wieder zumachen */ umgebung auf tso */ datei freigeben V und raus */

I* /* /* /* /* /*

*/ */

skeleton member für jobkarte skeleton member für delete skeleton member für neue datei

*/ V

==>

*/ */ member existiert nicht */

also fehler

*/

/* wieder zumachen /* umgebung auf tso I* datei freigeben

*/ V

****************************

r:' /* I* /* /* /*

rc ne 0

und raus

datei, die jcl enthaelt, zumachen dieser vget initialisiert ztempf umgebung auf tso setzen und job submitten

bottom of data

*/

*/ */ */ */ */ */

***************************

JCL-Schnittstellen

7.4

347

TSO-Kommandos mit JCL absetzen

Jedes TSO-Kommando läßt sich auch mit JCL absetzen. Dazu bedarf es des Aufrufs des Programmes IKJEFT01, welches TSO im Hintergrund aufruft. Dieses Programm benötigt einige spezielle DD-Anweisungen mit besonderen DD-Namen. Es handelt sich dabei um die SYSTSPRINT-Anweisung. Sie entspricht der SYSPRINT-Anweisung bei Utilities und der SYSTSIN-Anweisung, die'der SYSIN DD-Anweisung entspricht. Auf die Anweisung SYSTSIN DD * folgen die TSO-Kommandos. Das folgende Beispiel zeigt das Absetzen eines HLIST-Kommandos. Dies ist ein HSM-Kommando, das die vorhandenen Backups für ein Dataset anzeigt. 01.06

edit-uwin.schulung.cntl(hlist)

.

-

command

===>

*****************************

******

top of data

columns 001 072 scroll ===> page

*****************************

000100 //uwinlist job (uwin,abtdg02),notify=uwin, 000200 // class=c,msgclass=9 000300 //step1 exec pgm=ikjeft01 000400 //systsprt dd sysout=* 000500 //systsin dd * 000600 hlist dataset('uwin.schulung.test 1 ) bcds sys0ut(9) ******

****************************

Im Job

Summary erscheinen die Felder SYSTSPRT und SYS00001:

.-.-.

command

bottom of data

iof job summary

****************************

.-.-.

===>

scroll

===>

screen

--jobname--jobid--status---ran/received-day.de st.copies. uwin217h j29514 output 14:01 5/29/92 today fra21 1 -rc- -step.procstep--proc.comments.---.-

recover

0

.ddname-step.stat-act-grp-cls--records--dest.forms-copies 1

log

*

held

2 3 4 5

jcl

*

held

messages

*

held

systsprt recover

held

sys00001 recover

held

9 9 9 9 9

15 6

30 4 13

SYSTSPRT enthält das erzeugte TSO-Kommando. SYS00001 ist ein generierter DDName, der den Output des TSO-Kommandos enthält. Durch die Angabe SYSOUT(9) wurde ein Umleiten des Outputs in das Job Menü erzwungen. Ansonsten wäre der am Bildschirm zu sehen gewesen:

Output

348

MVSESA/JCL

BROWSE COMMAND

PAGE

RECOVER

SYS00001 -

1-- LINE

--

===>

********************************

DFHSM CONTROL DATASET

-pop OF DATA

**********************************

BACKUP DATASET-- LISTING

-

1- COLS 1 80 SCROLL ===> SCREEN

-

AT 14:00:12 ON

92/05

-

DSNAME

=

BACKUP FREQ

UWIN.SCHULUNG.DS99

BACKUP VERSION DATA SET NAME

BACKUP

HSM.BACK.T005001.UWIN.SCHULUNG.12101 HSM.BACK.T451802.UWIN.SCHULUNG.12100

BACKUP

SYS

GEN

VERS

BACKUP

CAT

NMBR

NMBR

RET VERS

RACF

DATE

IND

PROF

92/04/10 92/04/09

YES

000 001

022

NO

NO

NO

021

NO

NO

NO

YES

END OF .

BACKUP DATASET -

********************************

LISTING

VOLUME

FROM VOLUME

729882 708771

DSK029 DSK029

=

000,

MAX BA

.

-

BOTTOM OF DATA

*******************************

8

JCL-Fehler und ABENDs

Die Interpretation von JCL-Fehlern ist manchmal tückisch. In diesem Kapitel sollen einige häufig vorkommende JCL-Fehler vorgestellt und die Meldungen erläutert werden.

Fehler in der JOB-Anweisung Fehler in der Job-Anweisung können dazu führen, daß der SUBMIT mißlingt. Wenn Sie nach dem SUBMIT einen Prompt mit der Aufforderung: ENTER JOBNAME CHARACTERS erhalten, dann geben Sie irgend etwas ein und drücken die Datenfreigabetaste. Der danach submittete Job wird sofort abstürzen.

Häufigste Ursache für dieses Vorkommnis sind Fortsetzungsfehler: ***************************** tqp of data 000001 //uwin217c job (uwin,abtdg02),'m.winter1, 000002 // class=b, 000003 // msgclass=y, 000004 // notify=uuin, 000005 //define exec pgm=idcams dd 000006 //sysprint sys0ut=* ******

*****************************

000007 //sysin dd * 000008 delete uwin.schulung.output.seq1 000009 if maxcc = 8 then set maxcc = 0 ******

***************************

bottom of data

***************************

Da nach dem NOTIFY=UWIN ein Komma

steht, wird die Zeile 5 als zur Job-Anweisung betrachtet. Dies führt daß die dazu, gehörend Job-Anweisung korrumpiert wird und nicht mehr als solche interpretiert werden kann. Sofern Sie Schlüsselwörter der JOB-Anweisung fehlerhaft geschrieben haben, erhalten Sie eine entsprechende Meldung, die leicht zu interpretieren ist.

Fortsetzungsfehler Um

Fortsetzungsfehler interpretieren zu können, müssen Sie unbedingt in die JCL des Jobs schauen, denn dort sehen Sie die Numerierung, auf die sich die Messages beziehen. Hier ein Job, wie er in der Bibliothek steht.

MVSESA/JCL

350 000001 //UWIN217B JOB (998,ABTDG02),'M.WINTER',NOTIFY=UWIN, 000002 // CLASS=B, 000003 000004 000005 000006 000007 000008 000009 000010 000011 000012

MSGCLASS=Y,

// // //

TIME=(,10), MSGLEVEL=(1,1)

MSGLEVEL=(1,1),TYPRUN=SCAN

//* //STEP1

EXEC PGM=PGM01 //STEPLIB DD DSN=UWIN.SCHULUNG.LOAD,DISP=SHR //SYSPRINT DD SYSOUT=* //SYSABOUT DD SYSOUT=* DD SYSOUT=* //SYSOUT //OUTFILE DD DSN=UWIN.SCHULUNG.DS91, 000013 // DISP=(,CATLG,DELETE) 000014 // UNIT=3380, 000015 // SPACE=(TRK,(15,10),RLSE), 000016 //_RECFM=FB, LRECL=80_

Der gleiche Job, diesmal mit der erzeugten Numerierung: 1 //UWIN217B JOB

(998,ABTDG02),'M.WINTER1,NOTIFY=UWIN,CLASS=B,MSGCLASS=Y TIME=(,10),MSGLEVEL=(1,1),USER=UWIN MSGLEVEL=(1,1),TYPRUN=SCAN

// ***

2 //STEP1 3 //STEPLIB 4 //SYSPRINT 5 //SYSABOUT 6 //SYSOUT 7 //OUTFILE

// 8 // 9 //

EXEC PGM=PGM01 DD

DSN=UWIN.SCHULUNG.LOAD,DISP=SHR,

DD SYSOUT=* DD SYSOUT=* DD SYSOUT=* DD DSN=UWIN.SCHULUNG.DS91,

DISP=(,CATLG,DELETE)

UNIT=3380, SPACE=(TRK,(15,10),RLSE),

_10 //_RECFM=FB, LRECL=80_ Die

folgenden Fehlermeldungen beziehen sich auf die vorangehende Numerierung: MESSAGES

BROWSE

*

-

COMMAND

PAGE

1-- LINE

1-- COLS

1

80

--

===>

SCROLL

********************************

fop OF DATA

===>

SCREEN

**********************************

STMT NO. MESSAGE

3 8 9 10

IEF621I IEF605I IEF605I IEF605I

EXPECTED CONTINUATION NOT RECEIVED UNIDENTIFIED OPERATION FIELD UNIDENTIFIED OPERATION FIELD UNIDENTIFIED OPERATION FIELD

*******************************

BOTTOM OF DATA

********************************

JCL-Fehler und ABENDs

351

Die erste Meldung ist leicht zu interpretieren. Man findet schnell heraus, daß hinter dem DISP=SHR kein Komma stehen darf, weil die Anweisung an dieser Stelle beendet werden muß. Die Meldungen fur die Anweisungen 8-10 sind ebenfalls Fortsetzungsfehler. Sie sind Folgefehler der Anweisung 7 DISP=(,CATLG,DELETE), bei der am Ende das Komma vergessen wurde. Aus diesem Grund wird Anweisung 8 als neue Anweisung interpretiert. Sie besitzt keinen Feldnamen (das ist zulässig), aber das erste auftauchende Wort UNIT=3380 wird als Operationsfeld interpretiert. Da es nicht JOB, EXEC, DD, PROC, PEND oder OUTPUT heißt, wird es als fehlerhaft gemeldet. Danach wird versucht, Zeile 9 als JCL-Anweisung zu interpretieren. Das Ergebnis ist das Gleiche.

Häufige Laufzeitfehler gibt eine Reihe von Laufzeitfehlem, die schwierig wichtigsten von ihnen werden jetzt vorgestellt. Es

//STEP1 //STEPLIB //SYSABOUT //INFILE //OUTFILE // // // //

zu

interpretieren

sind. Die

EXEC PGM=PGM01 DD DSN=UWIN.SCHULUNG.LOAD,DISP=SHR DD SYSOUT=* DD DSN=UWIN.SCHULUNG.DS99 DD

DSN=UWIN.SCHULUNG.DS91,

DISP=(,CATLG,DELETE), UNIT=DSKPRM,

SPACE=(TRK,(15,2),RLSE), RECFM=FB,LRECL=80

Wie Sie sehen, fehlt bei dem unter INFILE angesprochenen Dataset der DISP-Parameter. Beim Job-Lauf dieser JCL tritt folgender Laufzeitfehler auf: UNIT FIELD SPECIFIES INCORRECT DEVICE NAME IEF210I UWIN217B STEP1 INFILE STEP WAS NOT EXECUTED. IEF272I UWIN217B STEP1 -

-

Um diese Meldung zu verstehen, muß man fast schon die Ursache kennen. Da der DISP-Parameter fehlt (was die Ursache des Fehlers ist ), tritt der Default DISP=(NEW,DELETE,DELETE) an seine Stelle. MVS geht davon aus, daß das Dataset neu angelegt werden soll. Beim Anlegen eines Dataset muß aber immer der UNITParameter angegeben werden. Da dieser in der oben angegebene JCL logischerweise fehlt, wird dies als Fehler moniert. Leider nicht in der Form: MISSING UNIT PARAMETER, sondern in der Form, wie sie die Meldung zeigt. Wenn Sie den Parameter VOL=SER= verwenden, können folgende Situationen auftreten: IEF245I UWIN217B STEP1 OUTFILE INCONSISTENT UNIT NAME AND VOLUME SERIAL STEP WAS NOT EXECUTED. IEF272I UWIN217B STEP1 -

-

MVSESA/JCL

352

Diese

Meldung wurde beim folgenden Job erzeugt: 1 //UWIN217B JOB

// ***

(998,ABTDG02),'H.WINTER1,NOTIFY=UWIN,CLASS=R,MSGCLASS=Y TIME=(,10),MSGLEVEL=(1,1),USER=UWIN MSGLEVEL=(1,1),TYPRUN=SCAN

EXEC PGM=PGM01 //STEP1 DD //STEPLIB DSN=UWIN.SCHULUNG.LOAD,DISP=SHR //SYSPRINT DD SYSOUT=*

2 3 4 5 6

//SYSABOUT //SYSOUT 7 //OUTFILE // // // //

DD SYSOUT=* DD SYSOUT=*

DD

DSN=UWIN.SCHULUNG.DS91,

DISP=(,CATLG,DELETE),

UNIT=3380,VOL=SER=DSK021, SPACE=(TRK,(15,10),RLSE), RECFM=FB,BLKSIZE=23440,LRECL=80

*******************************

BOTTOM OF DATA

********************************

versucht, ein Dataset auf der Platte DSK021 anzulegen. Diese Platte ist aber vom im UNIT-Parameter steht UNIT=3380. Wenn Sie UNIT und VOL=SER 3390, Typ gleichzeitig benutzen, so stellen Sie sicher, daß Typ und Platte zusammenpassen. Es wurde

Auf ein ähnliches Problem weist die

folgende Meldung hin:

UNABLE TO ALLOCATE IEF702I UWIN217B STEP1 OUTFILE IEF272I UWIN217B STEP1 STEP WAS NOT EXECUTED. -

-

In diesem Fall gehört die Platte DSK021 nicht zur Gruppe SYSDA. Daher kann MVS das Volume nicht allokieren, was sich in der Fehlermeldung niederschlägt. 7 //OUTFILE // // // //

DD

DSN=UWIN.SCHULUNG.DS91,

DISP=(,CATLG,DELETE),

UNIT=SYSDA,VOL=SER=DSK021, SPACE=(TRK,(15,10),RLSE), RECFM=FB,BLKSIZE=23440,LRECL=80

*******************************

BOTTOM OF DATA

********************************

Unsichtbare Fehler Es gibt Fehler, die sich weder in einem Fehler niederschlagen:

syntaktischen

noch in einem Allokations-JCL-

353

JCL-Fehler und ABENDs

EXEC PGM=PGM01 //STEP1 //STEPLIB DD DSN=UWIN.SCHULUNG.LOAD,DISP=SHR //SYSABOUT DD SYSOUT=* DD DSN=UWIN.SCHULUNG.DS99,DISP=SHR //INFILE //OUTFILE DD DSN=UWIN.TEST, DISP=(,CATLG,DELETE), UNIT=DSKPRM, // SPACE=(TRK, (15,2) ,RLSE) // RECFM=FB,LRECL=80 // ,

Durch den Blank zwischen dem DSN- und dem DISP-Parameter wird die DISP-Angabe als Kommentar interpretiert. Daher greift der Default DISP=(NEW,DELETE,DELETE). Das Dataset UwTN.TEST wird also bei Step-Ende immer gelöscht, und dies ist mit Sicherheit nicht die Absicht des Users gewesen. Dieser logische Fehler macht sich nicht bemerkbar.

8.1

ABEND Codes

Hier werden

eingegangen.

einige häufig vorkommenden ABENDs

erläutert und auf mögliche Ursachen

ABEND Codes 001 bis 04F Die ABEND Codes ABEND Code

001

von

001 bis 04F sind sogenannte Data

Management ABENDs.

Bedeutung I/O Problem. Prüfen Sie ob BLKSIZE ein mehrfaches der LRECL ist. fehlt eine DD-Anweisung oder man hat sich verschrieben (Der DD-Name im Programm entspricht nicht dem in der JCL).

Möglicherweise

002

siehe 001

0C1

Operation Exception Häufigste Ursache: Falsche oder fehlende DD-Anweisungen.

354

MVSESA/JCL

ABEND Code

Bedeutung

0C4

Protection

Exception

Ein Zugriff auf eine Adresse des virtuellen Speichers, die nicht im Bereich des Programms liegt, wurde versucht. Häufige Ursache sind überlaufende Tabellen. Aber auch der Lesezugriff auf ein noch nicht geöffnetes Dataset kommt in Frage. Während dieser ABEND in Batch-Umgebungen noch harmlos ist, sieht die Sache bei IMS oder CICS ganz anders aus. Da diese Anwendungen in einer eigenen Region laufen, kann ein 0C4 eine komplette IMS-Region oder ein komplettes CICS 'abschießen'.

0C5

Addressing Exception Die Adresse im virtuellen

Speicher ist nicht zugänglich.

Mögliche Subskripte,

Ursachen:

die über dem Maximum liegen oder überlappende Tabellenbereiche. Falsche Daten-Definition in der LINKAGE SECTION, falsche Reihenfolge von Parametern, die übergeben werden, falsche

zugewiesene Parameterlänge. Arithmetische Operationen auf nicht initialisierten Feldern. 0C6

Specification Exception Gültige Instruktion aber ungültige Parameter. Mögliche Ursachen: Falsche Ausführung eines PERFORM. I/O-Bereiche wurden angesprochen, bevor es

zu

einem OPEN oder

READ kam.

Falsche LINKAGE SECTION.

Falsche Angabe

von

Recordlängen bei variabel langen Records.

Versuch auf eine Datei zu

0C7

Data Exception

schreiben, die mit INPUT eröffnet wurde.

355

JCL-Fehler undABENDs ABEND Code

Bedeutung Der bei weitem häufigste ABEND. Instruktionen und Parameter sind in Ordnung, aber das Format der Daten stimmt nicht (Meist steht auf numerisch definierten Feldern Unfug):

Mögliche Ursachen: Falsche oder fehlende Initialisierung eines numerischen Feldes. Falsche oder fehlende USAGE-Klausel. Falsche LINKAGE SECTION.

Felder, die Zahlen enthalten sollten, sind 'blank'. Literale im Literal Pool wurden zerstört.

Falsche REDEFINES-Klausel. Absichtlich, wenn man einen ABEND erzwingen will, verhindern, daß ein Folgeprogramm angestoßen wird.

um

z.B.

zu

ABEND Codes 100 bis EFF Die ABEND Codes von 100 bis EFF weisen auf Probleme bei der Ausführung von Supervisor Calls (SVC) hin. Die letzten beiden Zeichen geben den jeweiligen SVC (in Hex) an.

ABEND Code

Bedeutung

x00

Probleme beim Ausführen eines Kanalprogramms schwerwiegendes I/O-Problem aufgetreten.

x04, x05, xOA

Probleme beim Anfordern oder Freigeben von virtuellem Speicher (dürfte bei MVS/ESA kaum passieren, Ausnahme sind 24-Bit Programme). Kann auch passieren, wenn man mit dem REGIONParameter mehr an virtuellem Speicherplatz anfordert, als man benutzen darf.

806

Modul Lade-Probleme. Sie versuchen ein Programm auszuführen, daß sich nicht auf einer Ladebibliothek befindet. Möglicherweise ist ein falscher Programmname angegeben worden.

xOB

Timer Problem, das z.B. bei einem

xl3

Probleme beim Öffnen eines Dataset. Die

(SVC 0).

Es ist ein

Checkpoint Restart auftreten kann.

Endung

13 weist auf den

MVS ESA/JCL

356

ABEND Code

Bedeutung 19. SVC hin

(Hex

13

=

19). Häufig kommen vor:

013

Fehler beim Ausführen eines OPEN-Makros. Diese ausführlicher in Messages und Codes IEC143I erläutert.

213

Fehler beim Ausführen eines OPEN-Makros für ein Dataset, das auf Platte steht.

413

Fehler beim Ausführen eines OPEN-Makros für ein Dataset, das auf Platte oder auf Band steht. Diese Meldung ist ausführlicher in Messages und Codes IEC145I erläutert.

813

Falsche Angabe für eine Band- oder Kassettendatei, die geöffnet werden soll. Diese Meldung ist ausführlicher in Messages und Codes IEC149I erläutert.

xl4

Probleme beim Schließen von Dateien. Möglicherweise wurde ein CLOSE vergessen. Wirkt sich im Step meist nicht mehr aus, kann aber Folge-Steps beeinflussen.

x37

Fehler beim Ausführen eines End-of-Volume-Makros. Dies weist auf Platzprobleme hin. D37 weist darauf hin, daß der Platz für die Primärallokation erschöpft ist und keine Sekundärallokation gemacht wurde. B37 weist darauf hin, daß die Secondary Extents erschöpft sind.

222

Job wurde gecancelt. Entweder von Ihnen, vom automatisch. Ursache: Häufige Loop

Meldung

Operator in

ist

oder einem

Anwendungsprogramm. 322

Zulässige

522

ISPF-Sitzung wurde automatisch beendet. Dieser Fall tritt ein, Sie längere Zeit keinerlei Aktion am Terminal ausführen. Das ist installationsspezifisch.

722

CPU-Zeit wurde überschritten. Dies bezieht sich entweder auf die Job-Klasse oder einen TIME-Parameter in der JCL. Diese Situation kann ebenfalls auf einen Loop hinweisen. wenn

Limit

Anzahl von Output-Zeilen für SYSOUT wurde überschritten. Bezieht sich auf den OUTLIM-Parameter oder das

Zulässige

JCL-Fehler und ABENDs ABEND Code

357

Bedeutung Limit, das für die MSGCLASS gilt. Auch hier kann die Ursache ein Loop sein.

ABEND Codes xFO bis xFF Die ABEND Codes

von

xFO bis xFF weisen auf System- bzw. JES2/JES3-Fehler hin.

ABEND Codes Fxx bis FFF Die ABEND Codes von Fxx bis FFF stehen in Nummer des User-SVCs.

Zusammenhang mit User-SVCs.

xx

ist die

Anhang

9 Im

folgenden Anhang

werden

beschrieben.

9.1

wichtige physische Kenngrößen

MVS-Systemen

Aufbau von Volume und Header Records

Wenn Sie ein unbekanntes Band/Kassette lesen

wollen,

so

können Sie den Header Records

wichtige Informationen entnehmen. Aufbau des Volume Record Name des Feldes

Länge

Inhalt VOL

Identifikationsfeld Labelnummer

Volume Serial Nummer

000000 999999 -

Reserviert

Aufzeichnungstechnik

24

Reserviert Owner Identification

blank

in

29

Pb oder bb

MVSESA/JCL

360

Aufbau der Header Records 1 Name des Feldes

Länge

Inhalt

Identifikationsfeld

HDR, EOF, EOV

Labelnummer

1

Data Set Identifier

17

die 17 rechten Stellen des DSN

Data Set Serial Number

000001 -999999

Volume

0001 -9999

Sequence Number Data Set Sequence Number Generation Data Set Sequence Number

0001

Generation Version Number

00-99

Creation Date

&

cyyddd cyyddd 0, 1 oder 3

Block Count

blank

9999

0001 -9999

Expiration Date Data Set Security Indicator reserviert

-

13

Anhang

361

Aufbau der Header Records 2

Bytes

Name des Feldes

Mögliche Werte HDR, EOF, EOV

Identifikationsfeld Label-Nummer

F, V oder U

Record-Format Block-Size oder Block-Faktor

00000 32760

Logische Record-Länge

-

Schreibdichte Data Set Position Number

0 oder 1 17

Job-Name/Step-Name

Aufzeichnungstechnik Kontrollbyte

Pb oder bb

A, M oder b

blank

B, S, R oder b

Block-Attribut 41

Reserviert

Die Werte im Feld:

Pb -

bb -

Aufzeichnungstechnik haben folgende Bedeutung:

kompaktes Format (bis 750 MB) normales 3480-Format (250 MB)

Das Format der Felder: Creation Date und aufzulösen: c

=

blank

>

Expiration

19

>20 0=1

yy kann von 00 bis 99

>21

reichen, ddd von 000 bis 366.

Date

cyyddd

ist wie

folgt

MVSESA/JCL

362

Die Werte im Feld: Data Set

Security haben folgende Bedeutung:

kein Passwortschutz

Passwortschutz für Lesen, Schreiben und Löschen Passwortschutz für Schreiben und Löschen Die

Optionen

1 und 3 haben unter RACF keine

Bedeutung.

Die Werte im Feld: Record-Format bedeuten: F Undefinierte Länge.

-

fixe

Länge,

V

-

variable

Länge und U -

Die Werte im Feld: Block-Attribut bedeuten: S

geblockte Records Spannrecords, wenn das Feld Record-Format 'V ist

S

Standardrecords, wenn das Feld Record-Format 'F' ist

R

geblockte Spannrecords, wenn das Feld Record-Format 'V ist geblockte Standardrecords, wenn das Feld Record-Format 'F' ist.

B

R

Um die Volume und Header Records lesen zu können, müssen Sie mit arbeiten. Sie erhalten dann beim Lesen diese drei Records.

LABEL=(1,BLP)

Steht mehr als ein Dataset auf dem Band/der Kassette, so lesen Sie die Informationen für das zweite Dataset mit LABEL=(4,BLP), für das dritte mit LABEL=(7,BLP) usw.

363

Anhang

Nutzungsraten unterschiedlicher BLKSIZEs

9.2

Nutzungsraten verschiedener Plattenträger für ausgewählte Blocksizes Modell

3375

3380

3390

19069

47476

56664

Nutzung

Nutzung

Nutzung

13,99% 64,14% 91,63% 79,20% 96,89% 78,99% 73,72% 77,70% 98,96% 58,98% 75,02% 100,00% 0,00%

10,73% 56,81% 92,12% 82,95% 81,18% 88,24% 92,65% 97,65% 82,92% 98,82% 62,85% 83,79% 100,00%

3350

Kapazität/Spur BLKSIZE 80 870 8700

9400 11500 12500 17500 18444

23492 27999 35616 47476 56664'

30,21% 82,12% 91,25% 98,59% 60,31% 65,55% 91,77% 96,72% 0,00% 0,00% 0,00% 0,00% 0,00%

16,17% 68,40% 73,28% 79,18% 96,87% 70,19% 98,27% 51,79% 65,96% 78,61% 100,00% 0,00% 0,00%

'Diese Blocksizes sind mit normalen

Zugriffsmethoden nicht erreichbar I

!

364

9.3

MVSESA/JCL

CI-Größe und Plattennutzung Spurgröße: 47476 Byte CIs pro Physische

3380

Record-Größe 512 1024

Spur

46 31

1536 2048 2560 3072

23

3584 4096 4608

11

5120

8

5632 6144 6656

7

6

7168

6

7680 8192 10240 6144 14336 8192

5

18 15 13

10 9

7

5 4

7 3 5

6144

7

20480 22528 6144 6656 14336 6144 8192

2

2 7

6 3 7 5

Lücke: 492

Byte

Nutzung in% 49.61%

66,86% 74,41% 77,65% 80,88% 84,12% 83,04% 86,28% 87,35% 86,28% 83,04% 90,59% 84,12% 90,59% 80,88% 86,28% 86,28% 90,59% 90,59% 86,28% 90,59% 86,28% 94,90% 90,59% 84,12% 90,59% 90,59% 86,28%

365

Anhang Plattentyp: 3390 Spurgröße: 56664 Byte Lücke: 666 Byte

Physische RecordGröße

CIs pro

Spur Nutzung in%

512

49

44,28%

1024 1536

33 26

2048

21

2560

17

3072

15

3584

13

59,64% 70,48% 75,90% 76,80% 81,32% 82,23%

4096

12

4608

10

5120

9

5632

9

6144

8

6656

7

7168

7

7680

6

8192

6

10240

5

12288

4

7168

7

16384 18432 10240

3 3

5632

9

24576

2

26624

2

7168

7

10240

5

16384

3

5

86,74% 81,32% 81,32% 89,45% 86,74% 82,23% 88,55% 81,32% 86,74% 90,36% 86,74% 88,55% 86,74% 97,59% 90,36% 89,45% 86,74% 93,97% 88,55% 90,36% 86,74%

366

9.4

MVSESA/JCL

Glossar

3380

Plattenspeicher.

3880

Storage Control Unit für Magnetplatten des Typs 3380.

3390

Plattenspeicher.

3990

Storage Control Unit für Magnetplatten des Typs 3380 und

3390.

3480

Magnetkassette.

3745

Communication Controller

-

bindet Terminals

an

das

System

an.

9000

Neueste Prozessorreihe für IBM-Mainframes.

ABEND

ABnormal END. Abbruch eines Programms nicht-ausführbaren Instruktion.

ACB

Access Control Block. Ist für VSAM-Datasets DCB für sequentielle Datasets ist.

Access Method

Zugriffsmethode. Für die verschiedenen Datasetformen gibt es unterschiedliche Methoden, die den Zugriff unterstützen. Am

aufgrund

das,

einer

was

der

bekanntesten sind QSAM und VSAM. ACS

Automatic Class Selection. Automatische Klassen-Selektion. Routine, die unter SMS Datasets aufgrund bestimmter DSNMerkmale zu Speicher-, Daten- und Managementklassen zuordnet.

367

Anhang AIX

Altemate IndeX. Einrichtung für Altemativschlüssel bei VSAM KSDS- und ESDS-Datasets.

Wird auch als benutzt.

Allokation

Bezeichnung für die UNIX-Variante

Phase des Step-Ablaufs. Vor der dem Programm die benötigten

von

IBM

Programmausführung werden physischen Ressourcen zur

Verfügung gestellt. AMP

Access Method Parameter.

VSAM-Dataset-Verarbeitung AMS

Access Method Services.

Utility-Programm

Spezieller

DD-Parameter für

im Batch.

Zugriffsunterstützung,

IDCAMS

die durch das

geboten wird.

ASCII

American Standard Zeichensatz für PCs.

ASP

Asynchronous Spooling Program. Vorgänger des JES3.

Auxiliary Storage

Hilfsspeicher auf Platte als Erweiterung des Hauptspeichers.

BETA-92

Vielerorts

Bibliothek

Form der Datasetorganisation, bei der das Dataset in viele kleine Teile (Member) aufgegliedert ist. Editiert wird immer das Member. JCL wird fast ausschließlich als Member einer Bibliothek vorgehalten.

BLP

Bypass Label Processing. Label-Verarbeitung umgehen.

Code

of Information

Interchange.

eingesetztes Output-Management-System.

Wenn die Volume- und Header-Records eines Bandes/einer Kassette gelesen werden sollen, ist diese Angaben im LABEL-

MVSESA/JCL

368 Parameter erforderlich. Die unter Umständen

Benutzung dieses

Parameters kann

eingeschränkt sein.

Buffer

Platz im Speicher zur Aufnahme von Records. Records die im Buffer stehen, brauchen nicht von der Platte gelesen zu werden. Dies ergibt einen erheblichen Zeitgewinn. Beim Schreiben von Records wird erst in die Buffer geschrieben, anschließend auf Platte.

Cache

Zwischenspeicher, den es in den IBM-Systemen auf fast allen Ebenen gibt. So gibt es zum Beispiel einen CPU-Cache, in dem

Instruktionen äufbewahrt werden. Die Plattencontroller (SCUs) besitzen ebenfalls einen Cache. Er speichert vor und hilft somit, physische I/Os zu reduzieren. CA

Control Area. Zusammenfassung mehrerer CIs in einem VSAM KSDS-Dataset.

canceln

Neudeutscher Ausdruck für das Abbrechen eines Jobs. Ein Job kann automatisch, durch den Operator oder durch den User gecancelt werden.

CA-Split

Teilen einer CA. Kann beim Einfügen von Records in ein VSAM KSDS-Dataset auftreten und ist ein sehr I/O-intensiver

Vorgang. Channel

CI

Subsystem

Subsystem, das für die Abwicklung aller I/Os zuständig ist. I/Os werden von der CPU nur initiiert und wieder entgegengenommen. Die Durchführung des I/Os ist Sache des Channel Subsystem, das sich selbständig den Weg zum Datenträger und zurück zur CPU sucht. Control Interval. Physischer Record eines VSAM-Datasets. Enthält die logischen Records und Kontrollinformationen.

Anhang

369

CI-Split

Teilung eines CI. Kann beim Einfügen von logischen Records auftreten. Ist weniger I/O-intensiv als ein CA-Split.

CICS

Customer Information Control System. On-Line-System, in dem nur VSAM-Datasets als Organisationsform zulässig sind. Wird auch als Trägersystem für DB2 genutzt.

CIDF

Control Interval Definition Field. Enthält Informationen über Position und Umfang von freiem Platz in einem CI.

CLIST

Command LIST.

Interpretersprache, Vordergrund ermöglicht.

Cluster

Bezeichnung für ein VSAM-Dataset und alle zugehörigen Komponenten (Pfade, AIX, usw.).

CPU

Central Processing Unit.

Cylinder

Summe

der

übereinander Bei Platten des

Magnetplatte. Cylinder 15 Spuren.

die eine

Verarbeitung

im

liegenden Spuren auf einer Typs 3380 und 3390 umfaßt ein

DASD

Direct Access

Data

Nur-Daten Raum. Bezeichnung für einen maximal 2 GB großen Bereich des virtuellen Speichers, der unter MVS/ESA verfügbar wurde. Ein Data Space ist byte-adressierbar und vom normalen Adreßraum völlig getrennt.

Space

Storage Device. Plattenspeicher.

DB2

Data Base 2.

DCB

Data Control Block. Kontrollblock, der die physischen Eigenschaften von PO- und PS-Datasets beschreibt. Dies umfaßt z.B. Record-Länge, Record-Format, Blocksize usw.

Datenbanksystem.

MVSESA/JCL

370 DD

Data Definition.

Deallokation

Nach der Programmbeendigung werden die vom Programm benutzten physischen Ressourcen wieder freigegeben.

DFHSM

Data Facility Hierarchical Storage Manager. Softwarepaket, das der Archivierung (Migration) und Sicherung (Backup) von Datasets dient. -

DFP

Data Facility Product.

Directory

Verzeichnis einer Bibliothek.

Directory Blocks

Kontrollblöcke, die das Verzeichnis einer Bibliothek

Displacement

Abstand in

DMS

Dialog Management Services.

EBCDIC

Extended

ESDS

Entry Sequenced Data Set. Sequentielles VSAM-Dataset.

EXCPS

EXexecuted Channel Programs. Ausgeführte Kanalprogramme. Feld im LISTCAT eines VSAM-Dataset, das Auskunft über die Zahl der physischen I/Os gibt.

Expanded Storage

Halbleiterspeicher,

aufnehmen.

Byte von einer definierten Adresse.

Binary Coded Decimal Interchange Großsystemen verwendeter Zeichensatz.

Code. Auf

der als Erweiterung des Hauptspeichers dient und einen sehr schnellen Austausch mit demselben

ermöglicht.

Anhang Extent

371

Teil eines Dataset. Sequentielle Datasets können bis zu 16, VSAM-Datasets aus bis zu 123 Extents bestehen.

Physischer aus

Frame

4K großer Block im

Freespace

Freier Platz in einem CI eines KSDS-Dataset, der Aufnahme weiterer logischer Records zur Verfügung steht.

FTS

File

Tailoring

Hauptspeicher.

Services.

Dialog Managers. HASP

Houston Automatic JES2.

Header Record

Kontroll-Record, der

HI-ALLOC-RBA

Dateierstellungsservice

Spooling Program.

zur

des ISPF

Vorläufer des

heutigen

vor den Daten eines Dataset auf Band oder Kassette steht und Informationen über das Dataset enthält. Es gibt zwei Header Records mit den Nummern 1 und 2.

HIgh-ALLOCated-Relative-Byte-Address.

Höchste allokierte

Adresse eines VSAM-Dataset.

Hiper Space

High Performance Space. Nur-Daten Raum. Bezeichnung für einen maximal 2 GB großen Bereich des virtuellen Speichers, der unter MVS/ESA verfügbar wurde. Ein Hiper Space ist blockweise adressierbar und vom normalen Adreßraum völlig getrennt. Er kann als Hauptspeichererweiterung genutzt werden.

HI-USED-RBA

Hlgh-USED-Relative-Byte-Address. in einem KSDS-Dataset.

HOS

Höchste

belegte

Adresse

Head-of-String. Magnetplatten werden immer als Plattenstring

installiert, d.h. mehrere Platten werden in einem Gehäuse hintereinander gestellt. Der HOS kontrolliert die Platten des

Strings.

MVSESA/JCL

372

Storage Manager, siehe DFHSM.

HSM

Hierarchical

ICF

Integrated Catalog Facility. Katalogsystem, das Datasetverwaltung in einem MVS-System kontrolliert.

IMS

Information der IBM.

Index Set

Ebene eines Indexes eines VSAM KSDS-Dataset.

Input-Output-Facility

Output Management System, das häufig in Testumgebungen eingesetzt wird.

In-Stream

im

In-Stream-Daten

Daten im Eingabestrom, die zusammen mit der JCL submitted werden. Diese Daten sind meist Kontrollanweisungen für

die

Management System. Älteres Datenbanksystem

Eingabestrom.

Utilityprogramme. In-Stream-Prozeduren

Prozeduren im Eingabestrom. Ist zur Entwicklung von Prozeduren erforderlich. Dabei befindet sich die JCL der Prozedur und die aufrufende JCL im gleichen Member.

IOF

siehe Input-Output-Facility.

IPL

Initial Program Load. Bezeichnet den Gesamtvorgang des Startens eines MVS-Großrechnersystems. Ein IPL kann warm oder kalt durchgeführt werden. Das Hochfahren des Betriebssystems inklusive aller Subsysteme kann bis zu 30 Minuten dauern.

ISMF

Interactive

System Management Facility.

373

Anhang ISPF

System Productivity Facility. Interaktives System Benutzung von TSO.

Interactive zur

Ausgabedataset des Dialog Managers.

ISPFILE

DD-Name des

ISPPLIB

ISP Panel LIB. DD-Name der Bibliothek, die Bildschirme aufnimmt.

ISPSLIB

LIB. DD-Name der Bibliothek, die Kann zum Generieren von JCL aufnimmt. Datasetgerüste verwendet werden.

JES2

Job Entry Subsystem 2. Jobverarbeitungssystem. Ursprünglich für Einprozessorsysteme konzipiert, wird es heute in der Mehrzahl der MVS-Installationen eingesetzt.

JES3

Job

Entry Subsystem 3. Jobverarbeitungssystem, Anfang an auf Mehrprozessorsysteme ausgelegt war.

Katalog

Bezeichnung für das Katalogsystem, das aus Master- und UserKatalog besteht.

Katalogisierte

Mißverständlicher Name für Prozeduren, die als Member auf einer Prozedurbibliothek stehen. Im Gegensatz zu In-StreamProzeduren ist die JCL der Prozedur nicht in der aufrufenden JCL enthalten.

KSDS

Key Sequenced

Prozeduren

ISP

Skeleton

Data Set.

das

von

VSAM-Datasetform, die einen

index-sequentiellen Zugriff unterstützt.

LDS

Linear Data Set. Lineares VSAM-Dataset. Ist in 4K-Blöcken organisiert und wird nicht von einer Zugriffsmethode unterstützt. Die CIs von LDS enthalten nur Daten!

MVSESA/JCL

374 Linken

Bezeichnet den Vorgang des Einbindens von Systemroutinen in Anwendungsprogramme. Ohne diese Routinen wäre es dem Programm z.B. unmöglich, einen I/O durchzuführen.

LISTCAT

CATalog. AMS-Kommando zum Auflisten von Kataloginformationen. Wird häufig für die Analyse von VSAM KSDS-Datasets eingesetzt.

LTM

Leading Tape

LIST

Mark. Führende

Tape

Marke.

Angabe

im

LABEL-Parameter, die bei Bändern erforderlich ist, die nicht den IBM-Standards

Main

Storage

entsprechen.

Hauptspeicher.

Master-Katalog

Teil der Katalogstruktur. Der Master-Katalog hat als Einträge nur den ersten Teil eines DSN (High-Level-Qualifier) und einen Verweis auf den zu benutzenden User-Katalog.

Member

Teil (Mitglied) einer Bibliothek. Bibliotheken bestehen aus einem oder mehreren Membern, die ihrerseits editiert werden können. Die Bibliothek selbst kann nicht editiert werden.

MVS/370

Multiple Virtual Storage. Bezeichnet die ursprüngliche Form des MVS-Betriebssystems mit einer 24-Bit-Adressierung und einem virtuellen Speicher von 16 MB.

MVS/ESA

Multiple Virtual Storage / Enterprise System Architecture. Bezeichnet die jüngste Erweiterung von MVS, die 1988 eingeführt wurde. Durch die Möglichkeit, Data und Hiper Spaces zu benutzen, bietet MVS/ESA bei einer 31-BitAdressierung einen virtuellen Speicher von 16 TB (Tera-Byte).

MVS/XA

Multiple Virtual Storage / Extended Architecture. Bezeichnet die Erweiterung von MVS/370, die 1981 eingeführt wurde. Diese Form des MVS-Betriebssystems bietet bei einer 31-BitAdressierung einen virtuellen Speicher von 2 GB.

375

Anhang NL

No Label. Kein Label, Daten eines Bandes stehen unmittelbar am

non-volatile Cache

Bandanfang.

Zwischenspeicher

einer SCU, der bei einem Systemabsturz Netzausfall seinen Inhalt behält. Nach dem Wiederhochfahren des Systems kann der Inhalt des Cache auf Platte geschrieben werden. oder

OPTCD

OPTional CoDe. DCB-Parameter für spezielle z.B. Übersetzung EBCDIC -> ASCII.

Page

4K-Block des virtuellen

Panel

Bildschirm im ISPF.

PDSQ

Passed Data Set

Verarbeitungen,

Speichers.

Queue. Tabelle, in der Einträge über Datasets die mit DISP=(,PASS) übergeben werden, festgehalten

wurden.

Pointer

Verweis auf die RBA eines VSAM-Dataset.

PO-Dataset

Partitioned bezeichnet.

Organized Dataset. Wird auch als Bibliothek Untergliedertes Dataset, das aus vielen Membern (Mitgliedern) besteht. Wird sehr häufig für die Editierarbeit

verwendet. Auch JCL wird fast ausschließlich als Member eines PO-Dataset abgelegt. PR/SM

Partitioned Resource System Manager. Einrichtung, die es erlaubt, einen Prozessor in mehrere logische Systeme zu splitten. Diese Funktion ist beim Hersteller Amdahl unter der Bezeichnung MDF (Multiple Domain Feature) bekannt. -

PS-Dataset

Physisch-Sequentielles Dataset.

MVSESA/JCL

376

QSAM

Queued Storage

Access Method.

Zugriffsmethode

fur PS-

Datasets.

RACF

Resource Access Control Facility. Softwarepaket, das und Zugriffsschutz auf MVS-Systemen regelt.

RBA

Relative Byte Address. Relative Datasets adressiert werden.

RDF

Record Definition Field. Kontrollfeld im CI eines VSAMDatasets, das Länge oder Häufigkeit des Auftretens einer Länge eines logischen Records beschreibt.

REXX

Restructured Extended EXexutor. Interpretersprache, die eine Verarbeitung im Vordergrund ermöglicht. Ist Nachfolger des älteren CLIST.

RKP

Relative Key Position. Gibt das Displacement eines Schlüssel eines VSAM KSDS-Dataset an (Das erste Byte entspricht der relativen Position 0).

RRDS

Relative Record Data Set. VSAM-Datasetform mit einem relativen Schlüssel.

scu

Storage Control Unit. Kontrolleinheit, über die die Magnetplatten mit dem Hauptspeicher verbunden sind. SCUs verfügen über einen Zwischenspeicher (Cache), der die Zahl der physischen I/Os reduzieren hilft.

Sequence Set

Die unterste Index-Ebene eines VSAM KSDS-Dataset.

Skeleton

Zugang

Byte-Adresse, mit der VSAM-

Gerüst, das der Dateierstellungsservice benutzt. Kann auch Generieren von JCL genutzt werden.

zum

311

Anhang

logischen

Slot (RRDS)

Vorformatierter Platz zur Aufnahme eines in einem VSAM RRDS-Dataset.

Slot (VS)

4K-Block auf dem Hilfsspeicher.

SMS

Storage Management Subsystem oder System Managed Storage.

Spanning

Die Möglichkeit, logische Records zu benutzen, die größer sind als die physische Record-Länge. Höhere Programmiersprachen unterstützen solche Zugriffe meist nicht.

SUBMIT

TSO-Befehl,

jeweiligen submitten

Records

der einen Job aktiviert und ihn der Kontrolle des JES übergibt.

bezeichnet

auf Neudeutsch

den

vorher

beschriebenen

Übergabeprozeß. SVC

Supervisor Call. Aufruf von Systemroutinen, die bestimmte, privilegierte Operationen ausfuhrt. Anwendungsprogramme machen einen SVC, um Operationen wie z.B. einen OPEN oder WRITE auszuführen.

SYSIN

SYSOUT

Festgelegter

DD-Feldname. Abkürzung für SYStem INput. Unter SYSIN können Daten zusammen mit den JCLAnweisungen Ubergeben werden. Die Daten sind entweder Teil des JCL-Stroms, dann erfolgt die Angabe SYSIN DD * oder sie stehen getrennt in einem Dataset, dann ist die Anweisung SYSIN DD DSN=dsname zu benutzen.

DD-Parameter. Abkürzung für SYStem OUTput. SYSOUTwerden in das Spool-Volume geschrieben im Unterschied zu Ausgaben in normale Datasets. Wird immer bei Ausgaben auf den Drucker benötigt. Bei der Angabe SYSOUT erfolgt fast immer die Zuweisung einer Outputklasse oder aber

Ausgaben

MVSESA/JCL

378

die

Übernahme der

unter

MSGCLASS

Outputklasse mit SYSOUT=*.

angegebenen

SYSPRINT

Festgelegter DD-Feldname. Eine SYSPRINT DD-Anweisung muß bei allen Utility-Programmen stehen, da diese zusätzlichen Output erzeugen.

Tape Mark

Tape Marke. Magnetmarken auf der Band/Kassettenoberfläche, die dazu dienen, die Daten von den KontrollRecords

zu

trennen.

Track

Spur einer Magnetplatte.

Trailer Record

Identisch mit dem Header Record, befindet sich aber am Ende eines auf Band oder Kassette gespeicherten Datasets. Ist notwendig, um ein Rückwärtslesen zu ermöglichen.

TSO

Time-Sharing Option. Trägersystem des MVS, das vielen Benutzern wahlweise eine Verarbeitung im Vorder- oder Hintergrund ermöglicht (daher die Option). Das reine TSO ist für den User heutzutage fast nicht mehr zu sehen, da es durch das als Benutzeroberfläche fungierende ISPF überdeckt wird.

USERID

bis

User-Katalog

Teil der Katalogstruktur. Der User-Katalog hat als Einträge den DSN und den Verweis auf den Datenträger, auf dem das Dataset steht.

Utility-Programme

Hilfsprogramme, die Funktionen wie Kopieren oder Katalog bereinigen durchführen. Das am weitesten verbreitete Utility-

acht Zeichen langer System kennzeichnet. zu

String,

der einen User im MVS-

Programm ist IDCAMS. IEBGENER und ebenfalls häufig eingesetzt.

IEFBR14 werden

Anhang Virtual

379

Storage

Virtueller

Speicher.

Volume Record

Record am Anfang eines Bandes/einer Kassette, der unter anderem die Vol-Ser-No des Bandes/der Kassette enthält.

Volume Serial Number

Bezeichnung eines Datenträgers. Wird häufig als Vol-Ser-No bezeichnet. Als Konvention hat sich durchgesetzt, daß Platten am Anfang zumindest einen Buchstaben stehen haben, während die Vol-Ser-No von Bändern und Kassetten rein numerisch ist.

VSAM

Virtual Storage Access gleichnamigen Datasets.

VTAM

Virtual Telecommunication Access Method. für Terminals.

VTOC

Volume Table of Contents. Verzeichnis, das die Position aller auf einer Platte residierender Datasets angibt und Informationen über freien Platz auf der Platte enthält.

VVDS

VSAM

Method.

Zugriffsmethode

für die

Zugriffsmethode

Data Set. Kontrolldataset, das alle für auf der gleichen Platte residierenden VSAM-Datasets enthält.

Volume

Statistikeinträge

Work-Platten

Inoffizielle Bezeichnung für eine Gruppe vom Magnetplatten, deren Bestand in regelmäßigen Abständen gelöscht werden.

MVSESA/JCL

380

Literatur

9.5

In den vergangenen Jahren ist verstärkt auch deutschsprachige Literatur dem IBM-Großsystembereich erschienen. Einige der in der vorherigen Buches vorgestellten Veröffentlichungen sind zwischenzeitlich in erschienen. SMS wird nunmehr in fast allen Werken berücksichtigt.

Themen aus Auflage dieses

zu

neuer

Auflage

JCL D.

Lowe, MVS JCL, Mike Murach & Associates, Fresno, California, 21994

Neben dem eigentlichen JCL-Teil bietet dieses Buch einen über 100 Seiten großen Überblick über MVS/ESA und die Art und Weise, wie in einem MVS-System Jobs verarbeitet werden. Auch das Arbeiten mit VSAM-Datasets wird vorgestellt. Das Gleiche gilt für die wichtigsten Utilities. Es wird auch das heutzutage kaum noch eingesetzte ISAM behandelt. In der neuen Auflage von 1994 ist auch das Arbeiten unter SMS berücksichtigt. Die Schnittstellen zum Anwendungsprogramm werden nicht erläutert. M. Carathanassis, Expert MVS/ESA JCL, McGraw Hill, New York 1991 Dieses Buch hält, was es verspricht. Es ist in der Tat ein Buch für den JCL-Experten, und deshalb sollten Anfänger von diesem Buch die Finger lassen. Das soll beileibe nicht heißen, dieses Buch wäre schlecht. Nur ist es für einen Anfänger kaum möglich, Standard- und Ausnahmesituationen voneinander zu trennen. Deshalb sollte man schon einiges an JCLErfahrung besitzen, bevor man zu diesem Buch greift. Dann allerdings kann man ungemein davon profitieren. SMS ist in diesem Buch bereits berücksichtigt, die Version 4 von MVS/ESA (leider) noch nicht.

Gary DeWard Brown, MVS/JCL, Oldenbourg, München 21997 In diesem Buch über JCL wird die Version 4 von MVS/ESA und einige neue Parameter bereits berücksichtigt. SMS, VSAM und REXX werden in knappen Kapiteln vorgestellt.

COBOL-Programmierung für VSAM-Datasets R. Habib, VS COBOL II Band 2, Dateiorganisationsformen Vaterstetten bei München 1990

In diesem Buch werden die IDCAMS-Parameter in Aspekte der Performance wird nicht eingegangen.

und

VSAM-Zugriffe, iwt,

handbuchartiger Form vorgestellt.

Auf

Im zweiten Teil des Buches werden dann die für die VSAM-Programmierung unter COBOL notwendigen Anweisungen gezeigt. Die vorgestellte JCL ist größtenteils unkommentiert. MVS N.S.

allgemein Prasad, IBM Mainframes

21994

-

Architecture and

Design,

McGraw

Hill, New York

Wer das Innenleben eines IBM-Großsystems verstehen will, der sollte sich dieses Buch nicht entgehen lassen. Es bietet einen großzügigen Überblick über die verschiedenen IBM-

381

Anhang

von der /360-Architektur bis zu der von MVS/XA (MVS/ESA konnte in dem Buch noch nicht berücksichtigt werden), wobei die Unterschiede zwischen den Architekturen erläutert werden. Die Funktionsweise der Prozessortypen 3033, 308x, 3090, 4381 und 9370 wird ebenfalls erläutert. Obwohl man durch das Lesen dieses Buches nicht zum besseren Programmierer wird (dazu ist der Inhalt zu sehr an der technischen Ebene orientiert), ist es sehr lesenswert.

Architekturen, angefangen

TSO/ISPF M. Teuffei, TSO München 61999

Time -

Sharing Option

im

Betriebssystem MVS, Oldenbourg,

Ein hervorragendes Buch, das dem Leser das Tor zur MVS-Welt erschließt. Thema des Buches ist TSO und vor allem ISPF. Die Benutzeroberfläche und der Editor von ISPF werden ausführlich vorgestellt. Dazu gibt es Kapitel über RACF, den HSM und die Interpretersprachen CLIST und REXX. Informationen über TSO-Kommandos und eine kurze Einführung in JCL runden das Buch ab. Wer es noch nicht hat, der sollte sich dieses Buch unbedingt zulegen. Viele ISPF-Benutzer stellen beim Lesen dieses Buches zum ersten Mal fest, welche Möglichkeiten ISPF und sein Editor eigentlich bieten. REXX P.

Kees, REXX in der Praxis, Oldenbourg, München 1993

Endlich gibt es auch ein auf den Erfahrungen der Praxis basierendes Buch über REXX. Diese Programmiersprache, die hauptsächlich zur Steuerung von ISPF-Dialogen eingesetzt wird, bietet auch eine Reihe interessanter Schnittstellen zu JCL. Der Autor gibt einen großzügigen Überblick über alle relevanten Sprachelemente. Auch wurde nicht vergessen, die Entwicklung von Panels unter ISPF und die Möglichkeit zum Submitten von Jobs mit REXX EXECs vorzustellen. Alles in allem ein sehr informatives Buch zu einer sehr interessanten Programmiersprache.

382

9.6

MVSESA/JCL

Installationsspezifische Daten

Auf dieser und der

folgenden

Seite können Sie Ihre

installationsspezifischen

eintragen. Betriebssystem JES2 oder JES3?

MVS/XA oder MVS/ESA?

Zugang zum System TSO USERID:

Abrechnungsangaben in der JOB-Anweisung: Angaben zum Zugang über Großsystem-Netzwerk:

Angaben beim Anlegen von Datasets Zulässige(r) High-Level-Qualifier: Zulässige generische oder Gruppennamen für den UNIT-Parameter: Installierte und zugängliche DASDs

(Typ und Vol-Ser-No)

Name des Modell-DCBs für Generationsdatasets

Eingerichtete Klassen Job-Klassen:

SYSOUT-Klassen:

Default

Default(MSGCLASS)

SMS-abhängige Informationen Zugängliche STORAGE-Klassen Installierte Datenklassen Installierte

Managementklassen

Daten

Anhang

Sonstige installationsspezifischen Daten

383

384

9.7

MVSESA/JCL

COBOL Return Codes fur das FS 1 -Feld

Return Codes bei OPEN RC

Bedeutung

00

Erfolgreiches Öffnen.

35

Dataset nicht vorhanden. Falsche oder fehlende

37

DD-Anweisung. OPEN wird vom Dataset nicht unterstützt. Möglicherweise wurde versucht, ein

ESDS-Dataset wie ein KSDS-Dataset zu öffnen. 39

Inkonsistente Angaben bei den Datasetattributen. Die Angaben im Programm und in der JCL widersprechen sich. Bei KSDS-Dataset häufig falsche Schlüsselposition im COBOL-Programm.

90

KSDS wurde für OUTPUT geöffnet und ACCESS MODE ist entweder RANDOM oder DYNAMIC.

91

Passwort-Fehler. Kann auch ein RACF-Fehler sein (keine

92 93

95

Zugriffsrechte). Logischer Fehler. Meist ist das zu öffnende Dataset bereits geöffnet. Ungenügender virtueller Speicher. REGION-Parameter erhöhen. Dataset, das für OUTPUT geöffnet wurde, ist nicht leer. Schlüssellänge oder -position inkonsistent. Ein KSDS-Dataset wurde wie ein ESDS-Dataset eröffnet.

96 97

DD-Anweisung fehlt. Impliziter VERIFY durchgeführt. OPEN erfolgreich.

Return Codes bei Lese-/Schreibzugriffen RC

Bedeutung

00

Erfolgreiche Ausführung. Doppelter Schlüssel. Kann

02

nur beim Lesen eines KSDS-Dataset mit dem Alternativschlüssel auftreten und stellt keine Fehlerbedingung dar.

21

Reihenfolgefehler beim sequentiellen Laden eines KSDS-Dataset.

22

Record mit diesem Schlüssel existiert bereits.

23

Record mit gesuchtem Schlüssel nicht vorhanden bei READ oder REWRITE.

24

Ungenügender Platz beim WRITE bei RRDS und KSDS-Datasets.

Anhang 34 94

385

Ungenügender Platz beim WRITE für ein ESDS-Dataset. Kein Pointer für einen sequentiellen READ. Passiert, wenn nach dem START Endof-File erreicht wird. Ist meist keine Fehlerbedingung.

MVSESA/JCL

386

9.8

Index

&& 108 &SYSUID 335 //SYSOUT 63, 69, 70 /360 3 /360 Architektur Ursprünge 3 /370 3 /370 Architektur Ursprünge 3 ++ 139 3330 4 3350 4 3380 367, 4, 5, 6, 10, 51, 52, 55, 57, 58,

59, 105,214, 219, 245, 278, 305, 306, 309 3390 367, 4, 5, 6, 52, 53, 57,214,219, 245, 250, 304, 305, 306, 309 3480 367, 6 3745 367 3880 5 3880 Storage Control Unit für Magnetplatten des Typs 3380. 367 3990 367,5 9000 367 ABEND 367, 16,20,21,28,31,38,64, 353,354,355, 357 ABEND Codes 001 353 001 bis 04F 353 002 353 013 356 0C1 353 0C4 354 0C7 355 lOObisEFF 355 213 356 222 356 322 356 413 356 522 356 722 357

-

-

-

-

-

-

-

-

-

-

-

-

-

-

-

-

-

-

806 355 813 356 Fxx bis FFF 357 x37 356 xFO bis xFF 357

abnormal-disp 46, 49, 50, 51, Abrechnungsinformation 27

-

116

ACB 367 ACCESS 295 Access Method 367 ACCESS MODE 389,

288, 289, 290, 291,292 ACS 367, 304, 312, 315, 317, 318, 322, 323, 324, 325 ADDRESS 118, 119 AIX 368

AIX-Cluster 235, 258, 260, 261, 262, 263,264, 265, 268, 269 Allocation 277 Allokation 368 Allokationsroutinen 105 ALTER 308, 309 Alternativindex 235,237, 258, 260, 261, 269 Alternativschlüssel 217, 230, 231, 260,

261,262, 264, 269,270 AMORG 266,269,280 AMP 368, 246,266, 269, 279, 280 AMS 368 anweisung 27, 29 ASCII 368, 98, 103 ASP 368 Automatic Class Selection 312, 317, 318 Auxiliary Storage 368 AVGLRECL 273,274, 275 AVgrec 321 AVGREC 54,311,312,313,329 Band- und Kassettenverarbeitung 83 Arbeiten mit nicht katalogisierten Beständen 99 ASCII Daten verarbeiten 103 -

Anhang Bänder exportieren 100 Bänder ohne Standardlabel verarbeiten 100, 101 Datasets anlegen 85 ein Dataset auf ein Band- bzw. Kassette 86 EXPDT 86 Katalogeintrag 88 LABEL 91 Mehrere Datasets hintereinander 90 Multi-File Technik 94 Multi-Volume Datasets 97 undDISP=MOD 98 und UNIT=(„DEFER) 98 RETPD 87 SPACE 88 VOLUME 91 Standardbänder importieren 100 und Lese- Schreibstationen 84 BETA-92 368 Bibliothek 368 Datenorganisation 13 Bibliotheken compressen mit JCL s. IEBCOPY 212 BLDINDEX 235, 259, 261, 262, 265, 266,267, 269 BLKSIZE 5, 55, 57, 58, 59, 64, 66, 67, 102,214,305,306, 307 BLOCK 0 RECORDS 58 BLOCK CONTAINS 290 Blockgröße 6, 13, 56, 57, 58, 59, 101 Blocksize 308 BLP 362, 369, 102, 103 Buffer 369 BUFFERSPACE 236, 246 BUFND 280 BUFNI 280 BUFSPACE 273,274,275 BUILDING 119 CA 369,218,223,226,228,229,236,

387 CATLG

46,47, 48,49, 50, 51, 53, 78, 100, 104, 111

Channel Subsystem 369 CHARACTER 168,281 CI 369,218, 219, 220, 221, 222, 223,

224, 225,226, 227, 228,229, 232, 236, 239, 240, 241,246, 247, 250, 251, 255,259, 272,273,274, 276,280 CICS 370,3 CIDF 370,220,221,222,224,227,233 CISIZE 273,275, 276 Cl-Split 370 CLASS 27,28,31,33,34,43,44,119 CLIST 370, 377, 136, 333, 334, 335,

336,337,338 CLOSE 66, 70, 85 Cluster 370 CLUSTER 285

Compress 212,213 Compress von Bibliotheken

s. IEBCOPY 212 COND 27, 31, 32, 33, 34, 36, 37, 38, 80, 108 COND-Parameters 74 Control Area 218, 223, 224, 225, 238,

-

244, 276,277

-

241, 242, 244, 248, 255, 259, 272, 273,274, 275, 276, 277, 278

Cache 369 canceln 369 CA-Split 369

CONTROLINTERVALSIZE 236, 239, 249, 257, 259 COPIES 68, 119 COUNT

164, 165, 166, 167, 168, 169, 170, 252, 253,281,282

CPU 370 CPU-Zeit 356 CYL 54,55 in IDCAMS 268

Cylinder 4, 5, 54, 55, 218,223, 238,

-

244,248,277

Cylinder

370 CYLINDER 277,309,310 CYLINDERS 236,237,249,250,251,

252, 257, 259 DASD 370,217 DATA 167, 169,

170, 195, 200,236, 237, 238, 249, 250,251, 254, 255, 256, 257, 259, 263, 268, 270, 271, 273, 283, 288

MVSESA/JCL

388 DATA- 238 Data Space 370,3 DATACLAS 303,311,312,313,317,

321,322 DATACLASS 317 Data-in-Virtual 233

Data-in-Virtual (DIV) 233

DATASET NOT CATALOGED 42 DATASET NOT FOUND 53 Datasets

anlegen

-

-

-

BLKSIZE 57 DCB 55 DISP 46

abnormale DISPosition, 49

Beispiele

und UNIT 112 verketten 307 auf ungleichen Datenträgern 308 Verketten 66 zwischen Steps übergeben mit DISP=(,PASS) 104 Datasets drucken mit IDCAMS PRINT 167 Datasets entkatalogisieren mit IEHPROGM 178 Datasets kopieren mit IDCAMS REPRO 164 mit IEBGENER 171 mit SORT OPTION COPY 197 Datasets leer anlegen mit IEFBR14 213 Datasets löschen mit IDCAMS DELETE 157 mit IEFBR14 213 Datasets mischen 196 Datasets umformatieren mit IEBGENER 175 mit SORT Parameter INREC 190 Datasets umsortieren 180,181 Duplikate unterdrücken 195 Performance 187 Records auswählen 187 Records verkürzen 190 Reihenfolge der Records erhalten 185 Summieren 192 über ein Feld 184

50

Defaults 49 normale DISPosition, 47 status 46

DSNAME 44 LRECL 57 RECFM 56 SPACE 54 und Katalogeintrag 61 UNIT 51 unter SMS mit ACS 322 VOLUME 52 VSAM

mit KILOBYTES und MEGYBYTES 309 auf Platten neu anlegen 44 auffinden mit Hilfe des Katalogs 9, 10 mögliche Fehler 10 nicht katalogisierteg 7 temporäre 108 DSN 108 mögliche Probleme 113 nicht-eindeutige DSNs 113 Rückbezüge 109 symbolischer DSN 108 und DISP=(,PASS) 111 und Job RESTART 114 und RESTART 113

-

-

-

-

-

-

-

-

262,272 303,304,311,312,313, 316,318,319, 320, 321,324

Daten

Datenklasse

Datenmanagement SMS 11

Datenorganisation

-

PS und PO 13

Datenstapel 337,338 Datenverwaltung

-

-

-

-

DFHSM 11 ICF 7 Katalog 7 Master Katalog 7 User-Katalog 7

389

Anhang RACF 11 VTOC 6 VVDS 10 DB2 370,3 DCB 370, 55, 56, 59, 65, 67, 103, 104, 109, 110, 113 in SYSOUT 67 DD 371,2, 13, 14 DD DATA 152 DD SYSOUT 62, 63, 69, 70, 117, 118, 119 DD-Anweisung 279

-

-

-

-

-

-

-

-

-

-

allgemein 41 AVGREC 311 besondere 62 JOBCAT und STEPCAT 329 JOBLIB 64 STEPLIB 63 SYSOUT 63 SYSPRINT 62 BLKSIZE 57,304 und SMS 329 DATACLAS 311 DCB 55 OPTCD 103 DDNAME 146 DISP 46 Defaults und SMS 330

DISP=(,PASS)

104

DSN -

-

-

-

-

-

-

-

-

-

-

-

-

-

DSN=&&dsname 108 nicht-eindeutige DSNs 113 DSNAME 44 DUMMY 65 EXPDT 86 KEYLEN 312 KEYOFF 313 LABEL 91 LIKE 313 LRECL 57 MGMTCLAS 314 RECFM 56 RECORG 315 REFDD 315 RETPD 87

SECMODEL 316 SPACE 54,311 STORCLAS 316 SYSIN 70 SYSOUT 63, 67 COPIES 68 DEST 68 FREE 70 OUTLIM 68 SEGMENT (ESA/4) 69 SPIN (ESA/4) 69 und DCB 67 UNIT 51 UNIT=(„DEFER) 98 UNIT=AFF 84 VOLUME 52, 91 PRIVATE 92 RETAIN 92 VOL=REF 93 VOL=SER 93 Volume-Anzahl 92 Volume-Sequenz 92 ddname 41,84,91,94, 109, 110 DDNAME 146 Deallokation 371 Deallokationsmeldung 82 DEFAULT 117, 118, 119, 120 DEFER 98, 99 DEFINE ALTERNATEINDEX 235, 258, 259 DEFINE CLUSTER 235, 236,243, 248, -

-

-

-

-

-

-

249, 250,251,252, 257, 259, 260, 262, 275,276,277, 286

DEFINE GDG 235 DEFINE PATH 235,

259,263,264,

265,268 DELETE 47,48, 49, 50, 51, 61, 88, 90, 104, 112, 117, 157,158, 162, 183, 206, 213, 235, 243, 247,248, 256, 257, 262, 283, 284, 285,286, 287,

288,291,293

IDCAMS-ANWEISUNG 285 DELETE (IDCAMS-Kommando) Beispiele 159 NSCR 158 PURGE 158

-

-

-

390

MVSESA/JCL

DELETE GDG 210,211 DELETE NSCR 162, 163 Delimiter-Anweisung 124 DELSTACK 338,339 DEPT 120 DEST 68, 69, 74, 120 DEVTYPE 274, 275, 278 DFHSM 371, 11 DFP 371,217,218,233 Dialog Manager 335, 339 Die OUTPUT JCL-Anweisung ADDRESS (ESA/4) 118 allgemein 117 BUILDING (ESA/4) 119 CLASS 119 COPIES 119 DEFAULT 119 DEPT (ESA/4) 120 DEST 120 NAME (ESA/4) 120 ROOM (ESA/4) 120 TITLE (ESA/4) 121 dir-blocks 54 Directory 371 Directory Blocks 371 DISP 41, 43, 44,46,47,48, 49,

-

-

-

108 und COND oder IF/ELSE 108 und Eindeutigekeit 108

symbolischer

DUMMY 65, 171,280 DUMP 168, 169,281 EBCDIC 371, 103 END($$) 334, 335, 337 ENTRIES 271,274 ERASE 236, 243, 259,283, 284, 285 ESDS 371,389,390,217,221,222,

231,232, 235, 239, 249, 250, 253, 257,260,275, 281,288, 289, 290, 291,292, 293,294 EXCPS 371,273,274,277 EXEC 2, 13, 14

EXEC-Anweisung

-

-

-

-

-

-

-

-

-

-

-

50, 51, 53, 54, 57, 63, 64, 67, 70, 78, 83, 85, 98,99, 104, 105, 111, 112, 156, 169, 170, 173, 183, 212, 213,215, 254, 256,257, 266, 270, 279, 280

Displacement

371 DISPLAY PANEL 334, 337, 338, 339, 341,342, 346 Disposition Processing s. IEFBR14 213 DIV 233 DLM 72 DMS 371 DSN 7, 10, 14, 19,20,25,41,42,43, -

44, 45, 48, 50, 51, 52, 53, 61, 63, 64, 67, 70, 82, 83, 99, 100, 101, 102, 103, 104,105, 108, 109, 111, 129, 130, 132, 133, 134, 135, 136, 139, 140, 144,145, 147, 149, 150, 152 für temporäre Datasets 108 mit &&

beginnend

108

Ausführen mit IF/ELSE unter ESA V. 4 38 COND 36 PARM 35 PGM 34

PROC 35 Syntax 34 TIME und REGION 38 Existierende Datasets auf Platte ansprechen 41

-

-

Expanded Storage

371

EXPDT 86, 87, 90, 100, 158, 179 EXPDT=99000 158, 173, 179 Extent 372, 54, 278 EXTENT-NUMBER 274,275 EXTENTS 273,274,275,277 EXTENT-TYPE 274,275, 278 EXTERNALSORT 265 FASTSRT 180 FB 58 FBS 56,57 FD 289, 290, 295, 296

Fehlermeldungen

ABEND 20 JCL Error 20 als Allokationsfehler 20 als syntaktischer Fehler 20 FIELD 175, 176, 177 FIELD 184 FIELDS 181, 184, 191

-

-

391

Anhang FIELDS 196 FILE 278, 279, 289, 290, 292 FILE STATUS 288, 295 File Tailoring Services 333, 339 FOR 204, 236, 247 FORCE 210,211

Fortsetzungsfehler 349,351 Frame 372

Freespace 372, 220, 221, 229, 233, 241, 251,276 FREESPACE 222,236,241,249,253, 257, 259, 263, 268, 273, 274, 276 FROMADDRESS 252,253,281 FROMKEY 252,253,281 FROMNUMBER 252, 253,281 FTCLOSE 341,343,344,346 FTINCL 341,343,346 FTOPEN 341, 342, 346 FTS 372 GDG 308,309 GENERATE 175, 176 Generation Data Groups LIMIT ändern mit SMS 308 GENERATIONDATAGROUP 271 Generationsdatasets allgemein 203 Basiseintrag erzeugen 204 Basiseintrag löschen 210, 211 Besonderheiten 212 existierende Generationen ansprechen 210 LIMIT ändern mit SMS 209 ohne SMS 208 neue Generation erzeugen 205 Parameter ändern 207 genetischer name 51

HiPer Space 3 HISTORY 271,272,273,274 HI-USED-.i.RBA 274,275, 278

HI-USED-RBA 277 HI-USED-RBA 372 HLIST 347 HOS 372 HSM 373 ICF 373,7,

7 IDCAMS 11, 14,48, 55, 61, 63, 67, 70,

88, 89, 90, 96, 146, 148, 155, 156, 157, 163, 164, 167, 169, 170, 171, 173, 180, 184, 186, 196, 204, 207, 208, 209, 215, 233,234, 236, 248, 249, 250, 251, 252,253, 254, 255, 256, 257, 261, 263, 265, 266, 267, 268, 269, 271, 279, 282, 283, 285, 286, 287, 288, 304, 307, 308, 309, 310, 317, 320, 321, 322, 327, 328 ALTER 209,210,211 -

-

-

gruppenname 51,53,98

HASP 372 Header Record 372 Header Records Aufbau 359 HEX 168,281 HI-ALLOC-.i.RBA 274,275 HI-ALLOC-RBA 372 Hiper Space 372

-

107, 108,218,270

ICF-Katalog

BLDINDEX 265 Beispiel 266, 267 EXTERNALSORT INTERNALSORT 265 DEFINE AIX 259 Beispiel 262 KEYS 260 NAME 260 RECORDSIZE 260 RELATE 260 REUSE NOREUSE 262 -

-

UNIQUEKEY NONUNIQUEKEY 261 -

-

UPGRADE NOUPGRADE 261 DEFINE CLUSTER 236 Allocation Unit 237 CONTROLINTERVALSIZE 239 DATACLASS 317 ERASE NOERASE 243 IMBED NOIMBED 243 KEYRANGES 245 KEYS 240 KILOBYTES und MEGABYTES 309 MANAGEMENTCLASS 317 -

-

-

-

MVSESA/JCL

392 NAME 237

Organisation des Dataset 239 RECORDSIZE 239 REPLICATE NOREPLICATE 244 SHAREOPTIONS 241 Syntax 236 VOLUMES 238 DEFINE PATH 263 Beispiel 264 NAME 264 PATHENTRY 264 UPDATE NOUPDATE 264 DELETE 157 Beispiele 159 für VSAM-Datasets 283 Beispiel 284 ERASE NOERASE 284 PURGE 284 NOPURGE 158 NOSCRATCH 158 NSCR 158 PURGE 158 DELETE* 212 DELETE GDG 210,211 FORCE 211 DELETE NSCR 328 für VSAM-Datasets 234 Kontrollkommandos funktionale 234 modale 234 Syntax 234 LISTCAT 270, 272 Modal-Kommandos 287 -

-

-

-

-

-

-

-

-

-

-

-

-

-

PRINT 167,280 REPRO 164,252 SET Return Codes ändern 287 SYSPRINT 80 VERIFY 278

IDCAMS REPRO 85 IDCUT1 266,269 IDCUT2 266,269 Identifikationsfeld 23, 24 IEBCOPY 155,212 IEBGENER 155, 167, 171, 175, 184

-

IEF142I 78, 80, 88 IEF210I 351 IEF212I 114 IEF237I 78,88 IEF245I 351 IEF285I 78, 79, 80 IEF286I 212 IEF605I 350 IEF611I 131 IEF621I 350 IEF702I 352 IEFBR14 155,208,213,214,215,322, 323 IEHPROGM 155, 157, 178, 179,327 und SMS 327 IKJEFT01 347 IMBED 236, 238, 243, 244, 248, 249, 257, 259, 263, 268, 276 IMS 373 INCLUDE 152, 181, 187, 188, 189, 190 IN-CLUDE 152 INDATASET 164, 168, 252, 253, 255, 265,281,282, 285 Index 272 INDEX 236,237, 238, 249, 257,259,

-

263,268, 271,273,274,283 Index Set 373,223, 229, 278 INDEXED 236, 239, 249, 257, 273,

288,289 164, 166, 167, 168, 169, 170, 252, 253, 254, 255, 257, 265, 266, 267, 269,281

INFILE

Initial Volume Record 101 Initiator 16, 17,47,76 allgemein 17 Job-Ende 20 Job-Initiation 17

-

Programm-Ausführung

19 17 Initiation Step Step Termination 19 Step-Allokation 18 Input-Output-Facility 373 INREC 181, 190, 191, 194, 195, 196, 199, 200 In-Stream 373 In-Stream-Daten 373

-

393

Anhang In-Stream-Prozeduren 373 allgemein 136 Identifikationsfelder 139 *** 138 +/ 138 138 ++* 138

++

PEND-Anweisung 138 PROC-Anweisung 138 Symbolische Parameter

139 INTERNALSORT 265 IOF 373, 17,28,74, 125, 145 IOF JOB SUMMARY 74 IPL 373 ISAM 12 Zugriffsmethode 12 ISMF 373 ISPF 374, 1,2,7, 13, 14,333 ISPFILE 374, 341, 342, 343, 344, 346 ISPPLIB 374 ISPSLIB 374 JCL Aufbau der Anweisungen 23 Default-Werte 26 Parameter 26 und Performance 1 und SMS 2 Ursprünge 1 JCL ERROR 16 JCL-Fehler 349 Fortsetzungsfehler 349 IEF210I 351 IEF245I 351 IEF605I 351 IEF621I 351 IEF702I 352 in JOB-Anweisung 349 Laufzeitfehler 351,352 Probleme beim SUBMIT 349 unsichtbare Fehler 352 JCLLIB 39, 129, 152 JCL-Prozeduren allgemein 123 Arten 124 symbolische Parameter nicht besetzen 149 -

-

-

-

-

-

-

-

-

-

-

symbolische Parameter vorbesetzen 148 und SYSIN DD DDNAMEAn Weisung 146 und SYSIN DD DSN=-Anweisung 147 und SYSIN DD-Anweisung 146 Variablenersetzung 145 JCL-Prozeduren unter ESA V. 4 Die INCLUDE-Anweisung 152 Die JCLLIB ORDER Anweisung 129 Die SET-Anweisung 151 Schachteln von Prozeduren 151 JES2 374, 68, 69, 76, 79, 109, 111, 124, 128, 138, 152 JES3 374 JOB 2, 13, 14, 18 Job Summary JCL 75 LOG 75 MESSAGES 75 PROC 75 PROCSTEP 75 RC 75 STEP 75 SYSABOUT 75 SYSOUT 75 SYSPRINT 75 Job Termination 20, 106, 107, 111, 115 Job Termination-Routine 105 Jobablauf allgemein 13 Jobphasen 14 Ausgabe-Verarbeitung 16 Jobausführung 16 Kovertierung und Syntax-Prüfung 15 Purge Processing 16 SUBMIT 14 JOB-Anweisung 349 allgemein 26 Beginn 27 CLASS 28 COND 31 MSGCLASS 28 -

-

-

-

-

-

-

-

-

-

-

-

-

-

-

-

-

-

-

394

MVSESA/JCL

MSGLEVEL 29 NOTIFY 30 REGION 30 RESTART 33, 114 Syntax 27 TIME 31 TYPRUN 31 Job-Ausführung 17 JOBCAT 39, 124, 329 Job-Initiation 17 jobklasse 28 Job-Klasse 28, 38, 76 JOBLIB 39, 64, 65, 66, 123, 124 Job-Name 26,27 Job-Termination 20

keylen 321 Keylen 275

-

KEYLEN 312,313,314,320 KEYOFF 312,313,314,320 KEYRANGES 236, 244,245 KEYS 236, 240,249,250, 257, 259, 260,263, 268 KILOBYTES 309,310 kommentar 156, 175 Kommentar 25 Kommentare 25 Konkatenieren 307 Konkatenieren von Datasets 307 auf ungleichen Datenträgern 308 Kontrollintervall 275

-

-

-

-

-

-

2, 4, 6, 11, 12, 19, 41, 42, 44, 45, 58, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 97, 98, 99, 100, 101,

Kassette

102

213

Kontrollkommandos 171

Konvertierung 15 KSDS 374,389,390,217,218,219,

374 Auffinden eines Datasets 9 ICF 7 Master Katalog 7

Katalog -

Kontrollkommando 156, 175, 176, 190,

220, 221, 222, 223, 224, 226, 227, 230, 231, 232, 235, 237, 238, 239, 240, 241, 244, 246, 247, 249, 250, 253,254, 255, 256, 257,269, 270, 272,275, 276, 277, 280, 281, 285, 288,289, 290, 291,292,293, 294

Master-Katalog Aufbau 8

High-Level Qualifier User-Katalog 7

10

Aufbau 8

Katalogeintrag 82 Katalogisierte Prozeduren Anweisungen ungültig machen auf privater Bibliothek 128

134

label 156 LABEL 67, 87, 91, 95, 99, 101, 102, 103 LABEL RECORDS 290,296 Laden 389,218,222,223,231,237,

241,243, 248, 253, 254,255, 262, 266, 267, 291, 294

Aufruf 124

-

124 DD-An Weisungen ändern 131

LASTCC 287 Laufzeitfehler 351 LDS 374, 217, 233, 234, 235, 239, 240,

gesamte Prozedur beeinflussen 135

LEVEL 271,274 LIKE 313,314,315 LIMIT 308, 309 LINEAR 236, 239, 252 Linear Data Sets Aufbau 233 Einführung 233 undDB2 234 undDIV 233

Benutzung

DD-Anweisungen hinzufügen 132 EXEC-Anweisungen ändern 130

Identifikationsfelder 128 *** 128 XI 128 XX 128 Parameter Ändern und Einfügen gleichzeitig 133 und verkettete Datasets 134 KEEP 47, 48, 49, 50, 78, 105, 111,116

242,251,253,255

-

-

-

395

Anhang und Window 234 Linken 374 LISTCAT 375,235,270, 271, 272, 275, 280, 283, 286 logische Records 6, 12, 13 LRECL 55, 57, 58, 59, 66, 67, 102, 256 LTM 375, 102, 103, 104 Main Storage 375

-

Managementklasse 303,304,314,315

Master Katalog 7

Master-Katalog 375, 7, 10 MAXCC 215, 250, 251, 252, 256, 263, 268, 287, 288 MAXFLDS 175, 176 MAXLITS 175, 176 MAXLRECL 273,274,275 MEGABYTES 310 Member 375

Messages 48, 63, 74, 75, 77, Messages and Codes 78

80

MGMTCLAS 303,314,317,318 MOD 41,42, 43, 44, 46,47, 48, 50, 51, 54, 57, 85, 98, 99, 104 MSGCLASS 27, 28, 29, 33, 34, 43, 44,

63,119 MSGLEVEL 27, 29, 30, 34, 63 Multi-Volume Dataset 85 MVD 85,92,97,98,99 MVS Betriebssysteme 3 Geschichte 3 MVS/370 375, 3

MVS/ESA 375,217 Merkmale 3 MVS/XA 375, 2, 3, 57, 217, 233, 240 Merkmale 3 nachricht 29

120, 204, 236, 237, 249, 250, 251, 252, 257, 258, 259, 260, 263, 264, 265,268, 271,272 Namefeld 24, 25 NEW 42, 44, 46, 47,48,49, 50, 51, 53,, 78, 112 NAME

NEWSTACK 338, 339 NL 375, 102 NOERASE 236, 243, 259, 273, 274, 283

NOIMBED 236, 243, 259, 273, 274 NONINDEXED 236, 239, 250 NONSPANNED 236, 239, 247, 273

NONUNIQUEKEY 259,261,263,268 non-volatile Cache 376 NOPURGE 157,283 NOREPLICATE 236, 244,259 NOREUSE 236,246,259, 262,273,274 normal-disp 46,47, 48, 49, 50, 51 NOT CATLGD 2 82, 146 NOTIFY 27, 30, 34 NOUPDATE 264 NOUPGRADE 261 NSCR 327, 328 NUMBERED 236,239,250,251 OCCURS DEPENDING ON 60 OLD 41, 42, 43, 46, 47, 48, 50, 51, 53, 83, 105, 112, 117 OMIT 181, 187, 188, 189, 190 OPEN 389, 53, 57, 66, 85, 98, 99, 240, 246, 248, 278, 279, 291, 292, 296 operation 156, 175 Operation Exception 353 Operationsfeld 24 OPTCD 376, 103, 104 OPTION COPY 181, 198 ORDER 129, 152 ORDERED 236,244,245 ORGANIZATION 288, 289, 290, 295 OUTDATASET 164, 252, 253,254, 255, 265 OUTDATA-SET 253 OUTFILE 164, 166, 167, 252,253, 254,

257, 265, 266, 267,269 68, 357

OUTLIM

Output Management allgeimein 73 -

-

-

-

-

BETA92 16 Gefahren von RC IOF 16 JCL 77 Job LOG 76 Job Summary 74 Messages 77

outputklasse 27,28 OUTREC 181

=

0 80

MVSESA/JCL

396 376 Panel 376, 334, 335, 336, 340, 342, 345 parameter 156, 175 PARameter 36 Parameterfeld 24,25 PARM 34, 35, 130, 133, 135, 136 PASS 33,47,48, 104, 105, 108, 111, 112 Passed Data Set Queue 104,105,106, 107 PASSen von Datasets 104 die Passed Data Set Queue (PDSQ) 105 PATHENTRY 264, 265,268 PDSQ 376, 104, 105, 107, 108 PEND 138, 139, 152 PGM 34, 35, 37, 38, 40, 41, 43,44, 109 PHYRECS/TRK 274, 275, 278 PHYREC-SIZE 274, 275,278

Page

-

physische

Daten 1

PO 12, 13, 14,45,54,66 PO-Dataset 376 Pointer 376 positioneile Parameter 26 Positionelle Parameter 25 PR/SM 376 primär 54 Primärschlüssel 217, 230,

231, 257, 258, 261,267 PRINT 157, 167, 168, 169, 170,235, 279,280, 281,282 PRIVATE 91,92 PROC 24,34,35, 124, 151 PROC 144 PROC-und PEND- 137 Prozeduren schachteln 151 PS 13 PS-Dataset 376 PURGE 157, 158, 204, 247, 268, 283, 284, 285, 286 QSAM 376, 12, 59, 218, 231, 237, 249 Zugriffsmethode 12 QUEUE 337, 338, 339 RACF 377, 10, 11,45

RBA

377, 223, 224, 225, 232, 246, 274, 275,278 RDF 377,221,222,224,232 READ 390,270,291,292,293,294, 297, 298, 299 READ NEXT 293 RECFM 55, 56, 58, 59, 60, RECORD 175, 176 RECORD 169, 170, 175 Record Formate allgemein 12 Blockung 13 fixe 13

67, 100, 102

maximale Blockgröße 13 undefinerte 13 variable 13 RECORD KEY 288, 289, 295 Record-Format 13,43,56,58,60,64,

-

101 Record-Formate 12 RECORDING MODE 290,295 RECORDS 259 RECORDS 238, 239, 254, 270 RECORDSIZE 236,239,249,250,251, 257, 259, 260 RECORG 312,313,315,321 RECOVERY 236,243, 259, 273,274 RECSZ 268 REFDD 314,315 REGION 389, 27, 30, 34, 38, 182, 183, 292 RELATE 259, 260,263, 268 Relative Byte Adresse 232 relative Byte-Adresse 232 REPL 268 REPLICATE 236, 244, 248, 249,257, 259 REPRO 157, 164, 166, 167, 235, 248, 252, 253, 254, 255, 257, 265 RESTART 27,33, 113 und temporäre Datasets 113 und temporäre Datasets 114 RETAIN 91,92,94,95 RETPD 86, 87, 90, 158, 179 Return Code 32, 36, 37, 38, 39, 40, 61,

74, 75,78, 80,81,82, 106, 113

Anhang

397

nicht gelaufener

Step

75

Steps

74

Return Codes ändern mitlDCAMS 287 REUSE 236, 246, 259, 260, 262, 263, 268, 269, 291 REWRITE 390,291,293,294,299,300 REXX 377, 2, 136, 333, 337, 338, 339,

-

-

340, 341,342, 344, 345,346 RKP 377, 240, 273, 274, 275 RLSE 54, 55 ROOM 120 RRDS 377,390,217,221,232,235,

239,250,253, 260, 275, 277, 281, 288,290, 291,293,294 Rückbezug 107, 108, 110, 111, 117 auf vorhergehenden Step 110, 111 auf vorhergehenden Step einer Prozedur 110 im Step 109, 110

111 S322 31,38 S637-0C 308 S722 28, 68 S806 64 SCAN 27,31,34 Schlüsselwörter 349 Schutzfrist 158,247,272,284 SCRATCH 157, 180, 204, 206, 209, 210 SCU 377,5 SECMODEL 316 SEGMENT 69, 70 sekundär 54, 55

Rückbezüge 94,95, 109, 110,

-

Sekundärschlüssel 217, 231, 257, 258,

261,267 SELECT ASSIGN Sequence Set 377,

42, 43, 270, 288, 290 223, 224, 225, 228, 229, 238,244, 276,278,289

Sequentielle Datasets Datenorganisation

13 SET 148, 151, 152 SHAREOPTIONS 236,241,242,249,

250,251,252, 257,259 41,43,44,46,47,48, 50,51,53, 63, 64, 70, 78 Skeleton 377,340,342 SHR

Skeletons 340,344,345 SKIP 164, 165, 166, 167, 168,252,253, 281 Slot (RRDS) 377 Slot(VS) 378 SMS 378, 2, 11, 18, 19, 20,48, 52, 53, 54, 66, 83, 146 aktiviert 310 Datasets anlegen mit ACS 322 Mögliche Probleme 324 DISP=(OLD,DELETE) und VSAM Datasets 326 Löschen und Entkatalogisieren von Datasets 327 mit Datasets auf mehreren Platten 326 mit DISP Defaults 330 mit DISP=(OLD,DELETE) 326 mit IDCAMS DELETE NSCR 328 mit IEHPROGM 327 mit JOBCAT und STEPCAT 329 mit nicht optimaler BLOCKSIZE 329 mit UNCATLG 329 mitVOL=SER 324 neue IDCAMS-Parameter DATACLASS 317 MANAGEMENTCLASS 317 neue JCL-Anweisungen 311 AVGREC und SPACE 311 DATACLAS 311 KEYLEN 312 KEYOFF 313 LIKE 313 MGMTCLAS 314 RECORG 315 REFDD 315 SECMODEL 316 STORCLAS 316 sequentielle Datasets anlegen mit ACS 323 SMS vs. nicht SMS-managed 317 VSAM Datasets anlegen

-

MVSESA/JCL

398

mit ACS 324 ohne ACS 321 11

allgemein

installiert 304 -

KILOBYTES und MEGABYTES beim Anlegen von VSAMDatasets 309 Konkatenieren von Datasets auf ungleichen Datenträgern 308

Konkatenieren von Kassettendatasets 307 LIMIT einer GDG ändern 308

Wegfall BLKSIZE 304 VSAM Datasets löschen 322 Ziele 303 SMS-managed data sets 303 SORT 155, 171, 180, 181, 183, 184,

-

-

185, 186, 187, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201,255

Duplikate unterdrücken

SUM FIELDS=NONE 195 EQUALS NOEQUALS 185 JCL-Anweisungen 181 Kopieren von Datasets OPTION COPY 197 Mischen von Datasets MERGE FIELDS 196 Performance 187 INCLUDE COND und OMIT COND 187 Feld-Feld Vergleich 189 Feld-Konstante Vergleich 189 INREC 190 SORT FIELDS 184 Summieren SUM FIELDS 192 SORTIN 182, 183, 187, 198 SORTOUT 182, 183, 187, 198, 201, 202 SORTWKnn 182, 183 SPACE 54,55,67, 88, 311,312,314,

-

-

-

317,318,319, 320, 325,327, 329 SPACE-PRI 274, 277 SPACE-SEC 274,277 SPANNED 236, 239, 247 Spanning 378

Specific Volume Request

92

SPEED

236, 243, 259 Speicherklasse 303,317,318,325

Speichermedien

Bänder und Kassetten physische Merkmale 5 Kassetten und Bänder 4 logische und physische Records 6 Lücken 6 Plattenspeicher 4 3390 4 Cylinder 4 physische Merkmale 5 Spur 4 Spurkapazität 5 Storage Control Units 5 SPIN=UNALLOC 69,70

Spur 4, 6 Spurkapazität

5 SRTMSG 183, 186, 193 START 390, 258, 293, 294, 299 status

46,48,49,50

Step

nicht ausgeführt Return Code 74 Return Code 75 Step-Allokation 19 STEPCAT 329

Step-Initiation 17,20

STEPLIB

35, 63, 64, 66, 78

Step-Termination 19,20 STORAGECLASS 317 store las 321

STORCLAS 52,303,316,317,318,322 SUBALLOCATION 236, 240, 259 SUBMIT 378, 2, 14, 16, 333, 334, 335, 337, 338, 340, 341, 343, 346, 349 submitten 378 SUM FIELDS 181, 192, 193, 194, 195, 196, 199, 200, 255 SVC 378,20 symbolische Parameter 125, 140, 143,

144, 145,146

nicht besetzen 149

Symbolische Parameter 140, SYNCGENR 171

145

Anhang

399

SYNCSORT 4, 171, 181 Syntax Check 16,20

UNCATLG 47,48,49 UNCATLG DSNAME 179

Syntax-Prüfung 15,77

UNIQUE 236,240,250,251,252,259, 273, 274 UNIQUEKEY 259,261 unit 51, 54, 99, 100, 102, 103, 104 UNIT 42,48, 51, 52, 53, 67, 78, 83, 84, 86, 93,98, 99, 105, 107,112

SYS1.PROCLIB 123,124,129,136 SYS1.SORTLIB 181 SYSABOUT 75 SYSDA 51, 52, 112 SYSIN 378, 15, 61, 70, 77, 128, 130, 132, 133, 134, 135, 136, 146, 147 SYSIN DD 167,171,175,184,234,

254,255,287 147 DDNAME 146 DSN 147 SYSIN DD* 71,72 und Variable 147 SYSIN DD DATA 72 SYSIN DD DDNAME SYSIN-Daten 71,72 SYSOUT 378, 67, 357

UNIT=groupname

303 UNIT=TAPE 86 UPDATE 264, 265,268, 269 UPGRADE 261,263,268 USERID 379

*

-

-

-

User-Katalog 379, 7, 8, 10, 11, 19, 20, 80

71, 146

SYSPRINT 378, 61, 62, 63, 69, 74, 75, 77, 78,79, 80, 90, 117, 118, 119 SYSTSIN 347 SYSTSPRT 347 SYSUT1 155, 171, 172, 174 SYSUT2 155, 171 SYSUT3 213 SYSUT4 213 TAPE 51,52, 83 Tape Mark 379 TIME 27,31,34,38,90,356 TITLE 121 TO 236,247,290,293 TO 204 TOADDRESS 252,253,281 TOKEY 252,253,281 TONUMBER 252,253,281

Track 379, 4, 59, 223, 238, 244, 276 TRACKS 236, 237, 259, 274, 275, 278,

309,310

Trailer Record 379 TRK 54,55 TSO 379, 11,30,45 TSO/ISPF 155 TSO-Kommando 347 TYPRUN 27,31,34

UNIT=AFF 84 UNIT=CASS 86

Utility-Programme 379, 2, 19, 63, 70, 155

allgemeine Merkmale

155

Kontrollkommandos 156 V 56

Variable 334, 338, 339, 345

VB 56,58 VBS 58 VERIFY 389,278,279,292 Verketten von Datasets 66 Virtual Storage 379 VOL in IDCAMS 268 VOL=REF 93,94,95, 107 VOL=SER 52, 53, 99, 100, 317,

-

319,

325 VOLFLAG 274,275,278 VOLSER 274,275 Volume 4, 5, 6, 10, 11, 16, 52, 53, 63, 79, 82,92, 97, 98, 101, 105 VOLUME 42, 48, 52, 53, 91, 93, 105, 107 Volume Anzahl 92 Volume Record 379, 100, 101 Volume-Anzahl 91,92,97 VOLUMES 236, 238, 245, 249, 250,

251,252, 257, 259,272,278

Volume-Sequenz 91,92

400

MVSESA/JCL

380,2, 7, 10, 11, 12, 47, 65, 304,309,312,313,314,315,317, 320, 321, 322, 324, 326, 330, 331

VSAM

-

Alternativschlüssel 257 Anlegen eines AIX für ein KSDSDataset 262 Art des Schlüssels festlegen 261 Arten 258 Beispiel für Pfad anlegen 264 Bezug herstellen 264 Bezug zum Basis-Cluster festelegen 260 Cluster wiederverwendbar machen 262 definieren mit DEFINE AIX 259 definieren und laden 268 eindeutige Sekundärschlüssel erzeugen 258 im Batch mit COBOL verarbeiten 269 laden Beispiel 266 mögliche Probleme 267 laden mit BLDINDEX 265 Name des AIX-Clusters festlegen 260 Name des Pfads festlegen 264 Pfad definieren 263 Record-Länge festlegen 260 Schlüssel festlegen 260 UPDATE Optionen festlegen 264 Update-Optionen festlegen 261 COBOL Programmierung 288 Aufsetzen mit START 293 Beispiel 294 FD-Anweisung 290 FSl-Feld 289 FS2-Feld 289

Schreib-Zugriffe

-

Record-Länge festlegen 239 Schlüssel festlegen 240 Share Optionen festlegen 241

-

-

-

-

Lese/Schreibzugriffe

Return Codes 294

Lese-Zugriffe READ 292 READ NEXT 293 Löschen von Records DELETE 293 OPEN-Anweisung 291

REWRITE 292 WRITE 292 SELECT ASSIGN-Anweisung 288 fürESDS 289 fürKSDS 288 START und READ NEXT 293 Datasetarten 217 Datasets anlegen auf Platte plazieren 238 CI-Größe festlegen 239 DEFINE CLUSTER 236 Syntax 236 Löschoptionen festlegen 243 Name vergeben 237 Performance Optionen 243, 244, 245 Platz anfordern 237

-

-

Typ auswählen 239 Datasets drucken mit IDCAMS PRINT 280 Datasets laden mit IDCAMS REPRO 252 mögliche Probleme 254 Datasets löschen mit IDCAMS DELETE 283 Datasets recovern mit VERIFY 278 Einführung 218 ESDS Datasets anlegen 249 ESDS-Datasets Eigenschaften 231 Grundlagen 217 IDCAMS 234 Informationen über Datasets abrufen der LISTCAT-Output 272 mit LISTCAT 270 JCL für VSAM Datasets 279 AMP 279 AMP-AMORG' bei DUMMY 279 KSDS Datasets anlegen 247 KSDS Datasets reorganisieren

401

Anhang

Beispiel eines REORG-Jobs Notwendigkeit 255

-

-

KSDS-Datasets 218 Alternativschlüssel 230 CA-Splits 229 CI-Splits 228 Datenkomponente 218 Indexkomponente 223 Records einfügen 226 Records lesen 225 Records löschen 230 LDS Datasets anlegen 251 LISTCAT Attribute 275 AVGLRECL 275 BUFSPACE 275 CI/CA 276 CISIZE 276 DEVTYPE 278 EXCPS 277 EXTENT-NUMBER 278 Extents 277 EXTENT-TYPE 278 Freespace 276 Hi-Alloc-RBA 277,278 Hi-Used-RBA 277, 278

Keylen

275 MAXLRECL 275 PHYRECS/TRK 278 PHYREC-SIZE 278 Records 276 RKP 275 Space-Pri 277 Space-See 277 Space-Type 277

256

Splits 276 TRACKS/CA 278 VOLFLAG 278 VOLSER 278 Pufferung

BUFND für Datenpuffer 279 BUFNI für Indexpuffer 279 RRDS Datasets anlegen 250 RRDS-Datasets Eigenschaften 232 Struktur Control Areas 223 Kontrollintervalle 219 Aufbau eines Daten-CIS 220 und Kontrollinformationen 222 Relative Byte Adresse 232 undICF 218 Zugriffsmethode 12 VSAM Datasets

-

-

-

anlegen

unter SMS 321,324 löschen unter SMS 322

VTAM 380 VTOC 380,

6, 7, 10, 19, 42, 48, 52, 61, 80, 82, 83, 88, 107 VVDS 380, 10, 11,218 Window 234 Work-Platten 380 WRITE 390, 220, 293,294, 298 X/ 132 XX 128

Zugriffsmethoden QSAM 12 -

-

VSAM 12