236 14 127MB
German Pages 602 [600] Year 2010
ISPF professionell nutzen Das praxisorientierte Lehr- und Handbuch für den professionellen ISPF Benutzer Von Franz Lanz
Oldenbourg Verlag München Wien
Der Autor Franz Lanz ist Diplom Ingenieur und geschäftsführender Gesellschafter der Firma LANZ GmbH, DV (Datenverarbeitung) Beratung. Er ist seit vielen Jahren im Bereich des IBM Host Systems z/OS MVS und dessen Vorgängersystemen als Berater, Dozent und Programmierer tätig. Er hat jahrelang als Dozent in den IBM Ausbildungszentren gearbeitet und dabei viel Erfahrung bezüglich der Vermittlung von komplexen Zusammenhängen und Verfahren des Betriebssystems z/OS MVS der IBM Großrechner erworben. In den letzten Jahren hat Herr Lanz in einem großen DV Betrieb im Bankensektor eine umfangreiche ISPF Anwendung mit entwickelt, eingeführt und betreut. Dabei wurden fast alle Elemente des ISPF auf hohem Niveau benutzt. Diese Anwendung besteht jeweils aus mehreren hundert REXX Prozeduren, Panels und Skeletons. Herr Lanz hat während seiner langjährigen Tätigkeit in den verschiedenen DV Betrieben seiner Kunden eine umfangreiche Sammlung von Tools für die optimale Nutzung des ISPF entwickelt. Diese Werkzeuge sind alle in REXX programmiert und liegen dem Buch auf einer CD im Quellkode bei. Haftungsausschluss Für die in den Beispielen und den LANZ Utilities enthaltenen Programme sowie die im Buch angegebenen Quellkodes wird keinerlei Haftung von Seiten des Autors oder des Verlages übernommen. Weiterhin wird keinerlei Haftung für Schäden übernommen, die durch die Verwendung irgendeines Programms oder Programmteils entstehen, die dem Buch entnommen oder auf Grund der Angaben in diesem Buch entwickelt wurden. Alle in den Beispielen genannten Datei- und Systemnamen sind frei erfunden und entsprechen nicht den tatsächlichen Namen, die während der Erstellung der Programme benutzt wurden. Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie; detaillierte bibliografische Daten sind im Internet über abrufbar. © 2005 Oldenbourg Wissenschaftsverlag GmbH Rosenheimer Straße 145, D-81671 München Telefon: (089) 45051-0 www.oldenbourg.de Das Werk außerhalb lässig und filmungen
einschließlich aller Abbildungen ist urheberrechtlich geschützt. Jede Verwertung der Grenzen des Urheberrechtsgesetzes ist ohne Zustimmung des Verlages unzustrafbar. Das gilt insbesondere für Vervielfältigungen, Übersetzungen, Mikroverund die Einspeicherung und Bearbeitung in elektronischen Systemen.
Lektorat: Margit Roth Herstellung: Anna Grosser Umschlagkonzeption: Kraxenberger Kommunikationshaus, München Gedruckt auf säure- und chlorfreiem Papier Druck: R. Oldenbourg Graphische Betriebe Druckerei GmbH ISBN 3-486-57642-9
Vorwort Wozu soll dieses Buch dienen? Um dies zu verdeutlichen, mache ich einen kleinen Ausflug in eine ganz andere Welt als die unseres z/OS MVS und möchte dazu eine Frage aufwerfen: Warum gibt es bei den Formel-1 Rennfahrern immer wieder solche, die ihren Kollegen über einen langen Zeitraum überlegen sind, und zwar auch dann, wenn sie den Rennstall wechseln? Diese Fahrer verstehen es offenbar, sich die optimale Funktionalität ihres Fahrzeugs im wahrsten Sinne dieses Begriffs „selbst zu erarbeiten". Dies geschieht dadurch, dass der Fahrer sich beim Drehen seiner Test- und Rennrunden ständig fragt: „Was kann ich an diesem Fahrzeug noch verbessern, damit ich noch schneller werde?" Um Verbesserungen zu erreichen hat er zwei Möglichkeiten: • •
Er kann seinen Fahrstil optimieren. Er kann Vorschläge machen, wie man das Fahrzeug noch schneller machen könnte, und zwar unter Berücksichtigung seines Fahrstils. Diese Vorschläge muss dann sein Team umsetzen, indem es das Fahrzeug entsprechend modifiziert.
Nur wenn ein Formel-1 Rennfahrer diese Methoden perfekt beherrscht, hat er die Chance, Weltmeister zu werden. Was hat das Thema Formel-1 mit dem ISPF zu tun? Das ISPF ist wie ein Rennwagen. Sie benutzen dieses „Fahrzeug", um Ihre tägliche Arbeit im z/OS MVS zu tun. Machen Sie es also wie ein Formel-1 Rennfahrer: • •
Verbessern Sie Ihren persönlichen Arbeitsstil im ISPF. Optimieren Sie Ihr ISPF so, dass Sie bei Ihrer Arbeit immer schneller werden. Und was das Schönste ist: Sie brauchen gar kein Team von Mechanikern. Sie können alle Optimierungen selbst durchfuhren!
Das Ziel dieses Buches: Dieses Buch soll Sie dabei unterstützen, Ihr Potential als Anwendungsentwickler, Systemprogrammierer oder sonstiger Benutzer des z/OS MVS voll auszuschöpfen. Sie werden lernen, wie man die Möglichkeiten des ISPF mithilfe professioneller Bedienung, eigener Programmierung und der auf der CD enthaltenen Programme optimal nutzt, um im ISPF als echter Power User zu arbeiten.
Inhaltsverzeichnis Vorwort
V
Inhaltsverzeichnis
VII
1
Einleitung
1
1.1
Mein Weg zum ISPF
1
1.2
Vorkenntnisse des Lesers
2
1.3
Organisation des Inhalts
2
1.4
Benutzung des Buches
2
1.5
Navigationshilfen in diesem Buch
3
1.6
Darstellung von Panels und Programmkode
4
1.7
Program Function Keys
4
1.8
Englische Fachbegriffe
5
1.9 1.9.1 1.9.2 1.9.3 1.9.4 1.9.5 1.9.6
Die ISPF Literatur Literaturquellen Beschaffung der Literatur IBM Terminology im Internet Die z/OS MVS Literatur der Firma IBM im Internet Die ISPF Literatur der Firma IBM im Internet Book Manager online im ISPF
5 6 7 7 8 9 10
1.10
Die ISPF Services
14
1.11 1.11.1 1.11.2 1.11.3 1.11.4
Die Verarbeitungsstruktur des ISPF Bedienungshinweise und Oberflächen Die ISPF Interaction Der 3270 Mode Der GUI Mode
14 15 15 16 16
1.12 1.12.1
Das ISPF Online Help Facility Übersicht über alle Befehle und Funktionen im ISPF
16 17
1.13
Fehlersuche mittels LookAt im Internet
19
VIII
Inhaltsverzeichnis
1.14 1.14.1 1.14.2
ISPF Subsysteme SDSF - System Display and Search Facility MVS/QuickRef
21 21 22
1.15 1.15.1 1.15.2 1.15.3 1.15.4
Informationsquellen Das MVS/QuickRef Informationssystem Das Internet Die Handlungsanleitungen und Programmbeispiele Die Original System Literatur der IBM
22 23 23 23 24
1.16
Die LANZ MVS Utilities
24
2
Technische Grundlagen
25
2.1 2.1.1 2.1.2
Namenskonventionen der Dateien Der High Level Qualifier (HLQ) Der Last Level Qualifier (LLQ)
25 26 26
2.2 2.2.1 2.2.2 2.2.3 2.2.4 2.2.5
Dateitypen im ISPF Die Partitioned Data Sets (PDS und PDSE) Die normalen PDS Die Partitioned Data Set Extended (PDSE) Sonstige Dateien Größe von Plattendateien im MVS
26 26 27 29 31 32
2.3 2.3.1 2.3.2
Concatenated Data Sets Definition von Sequential Concatenated Data Sets Definition von Partitioned Concatenated Data Sets
32 33 33
2.4
Abkürzungen
34
2.5
IBMs Terminlogy
34
3
Das TSO/ISPF Logon Verfahren
35
3.1 3.1.1
Die 3270-Emulations-Software Aufruf der IBM 3270-Emulations-Software
35 35
3.2 3.2.1 3.2.2 3.2.3 3.2.4
Logon unter Verwendung von TPX Wozu wird TPX benutzt Die Steuerung innerhalb von TPX TPX Befehle Automatisches Logon fur ausgewählte TPX Anwendungen
38 38 40 42 43
3.3 3.3.1 3.3.2
Das TSO starten Das TSO Logon Panel Die TSO Logon Prozedur
44 44 45
3.4 3.4.1 3.4.2 3.4.3
Das ISPF starten Erforderliche ISPF Dateien Die Dateien für den ISPF Tabellen Service Die User Profile Library
47 47 48 49
Inhaltsverzeichnis
IX
3.4.4 3.4.5 3.4.6 3.4.7 3.4.8
Inhalt der User Profile Library ISPF Start Befehle Die Initialprozedur ISPFLOGO Die private Logon Prozedur LOGON Logon in einer Multi-LPAR Umgebung
50 50 51 52 53
3.5 3.5.1
Die LOGON Prozedur der LANZ Utilities Die Steuerdatei LOGONDSN
54 55
4
ISPF einrichten
57
4.1
Bildschirm Anzeige Formate im ISPF
57
4.2
Setzen der ISPF Optionen
60
4.2.1
Das Panel ISPF Settings (Auswahl 0)
60
4.3
Die Panels und ihre Handhabung
62
4.4
Die Struktur der ISPF Panels
62
4.4.1
Panels, POP UP Windows, HELP Panels
63
4.5
Das Primary Option Menu
64
4.6 4.6.1 4.6.2
Screen Splitting Direkte Ansteuerung eines Split Screen Beispiel mit acht ISPF Ebenen
66 67 67
4.7 4.7.1 4.7.2 4.7.3 4.7.4 4.7.5 4.7.6
Die Funktionstasten im ISPF PF Tastenbelegung optimieren Einschalten der PF Tasten Anzeige PF Tastenbenutzung mithilfe von KEYLISTs PF Tasten Belegung einer Keylist anzeigen PF Tastenbenutzung ohne Verwendung von Keylist PF Taste für den Aufruf von MVS/QuickRef
69 69 70 72 72 74 76
5
ISPF Command Tables
79
5.1 5.1.1 5.1.2
Einfuhrung in die ISPF Command Technik Das Member ISPCONF Dateien für Command Tables
79 80 81
5.2
Erstellen von eigenen ISPF Befehlen
83
5.3 5.3.1 5.3.2 5.3.3 5.3.4
Die Prozedur CMDSMOD ISPF Befehle mithilfe von CMDSMOD bearbeiten Beschreibung der Eingabefelder Den Aufruf von CMDSMOD als Befehl definieren Erzeugen einer Liste der Befehle
86 87 87 88 88
X
Inhaltsverzeichnis
6
DSLIST - Data Set Lists
91
6.1 6.1.1
Das DSLIST Panel Die Möglichkeiten der Action Bar
92 92
6.2 6.2.1
Die DSLIST Panel Fields Der DSNAME Level
94 94
6.3 6.3.1 6.3.2 6.3.3 6.3.4 6.3.5
Die Verarbeitung im DSLIST Panel Die DSLIST Primary Commands Die Befehle MEMBER und SRCHFOR Die DSLIST Line Commands Die DSLIST Settings Beispiele fur die Data Set List Settings
98 98 99 102 105 107
6.4 6.4.1 6.4.2 6.4.3
Personal Data Set Lists Erstellen von „Personal Data Set Lists" DSLISTen aufrufen Benutzung des Volume Serial Feldes
111 112 114 117
6.5 6.5.1 6.5.2
DSLIST mit Command Tables optimal nutzen Organisation und Namenskonventionen DSLISTen mit der ISPF Command Table aufrufen
118 119 119
7
Der Object/Action Workplace
123
7.1 7.1.1 7.1.2 7.1.3
Das ISPF Workplace Panel Aufruf des Workplace über die Command Table Bedienung des Workplace Panels Action Commands im Workplace Panel
124 125 125 126
7.2
Beispiele zur Workplace Bedienung
128
8
Der ISPF Editor
133
8.1
Tabelle der EDIT Primary Commands
134
8.1.1
Operanden der Edit Befehle
139
8.2
Tabelle der EDIT Line Commands
139
8.3 8.3.1 8.3.2
Die Profile des Editors EDIT Optionen mit EDSET/EDITSET setzen EDIT Profile einstellen und nutzen
141 141 143
8.4 8.4.1 8.4.2 8.4.3
Colored Code - Farbige EDIT/VIEW Anzeigen Colored Code - Was ist das? Einrichten von Colored Code Einheitliche Last Level Qualifier
147 147 148 150
8.5
Edit Recovery
151
8.6 8.6.1
Die UNDO Funktion Einschalten der UNDO Funktion
152 153
Inhaltsverzeichnis
XI
8.6.2
Grenzen des UNDO Befehls
155
8.7 8.7.1
FIND und CHANGE Eingabe der Suchoperanden
155 155
8.8
EXCLUDE
160
8.9 8.9.1 8.9.2
SHIFT und OVERLAY Beispiel 1 für Overlay Beispiel 2 für Overlay
162 162 166
8.10 8.10.1 8.10.2
CUT und PASTE Datentransport über die Zwischenablage des PC Systems Datentransport über die Zwischenablage des ISPF
176 176 179
9
ISRDDN - Utility für zugeordnete Dateien
185
9.1
ISRDDN - Beschreibung und Aufruf
185
9.2
ISRDDN - Bedienung des Programms
186
9.3
Suchen eines Members in den Online Dateien
187
9.4
Freigeben einer Dateizuordnung
189
9.5
Warnung bei inkonsistenten Datei Strukturen
191
9.6
Die Anzeige Optionen „SHORT" und „LONG"
192
9.7 9.7.1
Das Parmlib Member ALLOCxx anzeigen Anzeige der LINKLIST Kette
194 196
10
„Geheime" Programme
197
10.1
Der TSO Befehl CONCATD
198
10.2
Das Programm ISRDSLST
201
10.3
Das Programm TASID
202
11
Einführung in die Programmiersprache REXX
205
11.1
Meine erste Begegnung mit REXX
205
11.2 11.2.1
Was ist REXX? Object REXX
205 206
11.2.2
Net REXX
206
11.3
Überblick über REXX unter TSO
207
11.4 11.4.1 11.4.2
REXX Prozeduren im TSO Erkennen einer REXX Prozedur durch den TSO Command Processor Ausführen von REXX Prozeduren im TSO
207 208 208
11.5
REXX Prozeduren kompilieren
209
11.6
Performance von REXX Prozeduren
210
XII
Inhaltsverzeichnis
11.7
Syntax der REXX Sprache
210
11.7.1
Beispiele für korrekte REXX Statements
211
11.8
Variablen im REXX
212
11.9
Datentypen von REXX Variablen
212
11.10 11.10.1 11.10.2 11.10.3 11.10.4 11.11 11.11.1 11.11.2 11.11.3
Operatoren der REXX Sprache String Operatoren Arithmetische Operatoren Vergleichsoperatoren Logische Operatoren Stems im REXX STEMS mit Nullstring initialisieren Stems bei der Dateiverarbeitung Mehrgliedrige Stems
213 213 214 215 216 216 218 219 219
12
Die REXX Befehle
221
12.1 12.1.1 12.1.2 12.1.3 12.1.4 12.1.5
ADDRESS - Die Verbindung zu den Subsystemen Host Command Environments Active Host Command Environment Die temporäre Adressierung externer Befehle Sonderfall ISPEXEC und ISREDIT Die wichtigsten Host Command Environments:
221 222 223 223 225 226
12.2
ARG - Die Übernahme von Parametern
227
12.3 12.3.1
CALL - Aufruf anderer Programme Funktionen
233 234
12.4 12.4.1 12.4.2
DO - Gruppen und Schleifen Die DO Gruppe: Die DO Schleife
234 234 235
12.5
EXIT und RETURN - Verlassen der REXX Prozedur
237
12.5.1
Return Codes bei Programmaufrufen unter ISPF Batch
238
12.6
IF und WHEN - Bedingungen abfragen
238
12.7
INTERPRET - Befehle generieren
239
12.8
NUMERIC - Rechenoptionen setzen
244
12.9
PARSE - Texte zerlegen
246
12.10 12.10.1 12.10.2
PROCEDURE - Interne Unterprogramme Interne Unterprogramme mit PROCEDURE Anweisung Interne Unterprogramme ohne PROCEDURE Anweisung
253 253 254
12.11 12.11.1 12.11.2
QUEUE - Mit dem TSO Stack arbeiten Der TSO/E Data Stack Benutzungsmöglichkeiten für den TSO/E Data Stack
254 255 256
Inhaltsverzeichnis
XIII
12.12
SAY - Texte ausgeben
260
12.13
SELECT - Bedingte Befehlssequenzen
260
12.14
NOP - No Operation
263
12.15
PULL - Eingabe am Bildschirm
263
12.16
TRACE - Die starke Testhilfe
263
12.17
SIGNAL - Springen bei Fehlern
265
13
Die REXX Funktionen
267
13.1 13.1.1 13.1.2 13.1.3 13.1.4 13.1.5 13.1.6 13.1.7 13.1.8
Allgemeine Funktionen ADDRESS - Active Host Command Environment ARG - Eingabeparameter testen oder übernehmen DATE - Datumsfunktionen TIME - Zeitfunktionen QUEUED - Sätze im Data Stack SOURCELINE - Rückgabe einer Programmzeile USERID - TSO User ID ermitteln VALUE - Variablen ersetzen
267 268 268 269 275 276 276 277 277
13.2 13.2.1 13.2.2 13.2.3 13.2.4 13.2.5
Arithmetische Funktionen ABS - Absolutwert einer Zahl DIGITS, FORM, FUZZ - Optionen für Rechenoperationen abfragen MIN, MAX - Minimal- und Maximalwert RANDOM - Zufallszahl generieren SIGN - Rückgabe des Vorzeichens
279 279 279 280 280 281
13.3 13.3.1 13.3.2
Vergleichsfunktionen COMPARE - Texte vergleichen DATATYPE - Datentyp ermitteln
281 281 282
13.4 13.4.1 13.4.2 13.4.3 13.4.4 13.4.5 13.4.6 13.4.7
Konvertierungsfunktionen C2D - Character to Decimal C2X - Character to Hexadecimal D2C - Decimal to Character D2X - Decimal to Hexadecimal X2B - Hexadecimal to Binary X2C - Hexadecimal to Character X2D - Hexadecimal to Decimal
284 285 286 286 287 288 288 288
13.5 13.5.1 13.5.2 13.5.3 13.5.4 13.5.5 13.5.6
Formatierungsfunktionen CENTER - Zentrieren einer Zeichenkette COPIES - Texte vervielfältigen FORMAT - Zahlen formatieren JUSTIFY - Formatieren einer Zeichenkette LEFT - Text linksbündig anordnen RIGHT - Text rechtsbündig anordnen
290 290 290 291 292 292 293
XIV
Inhaltsverzeichnis
13.6 13.6.1 13.6.2 13.6.3 13.6.4 13.6.5 13.6.6 13.6.7 13.6.8 13.6.9 13.6.10
Stringfunktionen DELSTR - Löschen von Teilstrings INSERT - Text einfügen CHANGE - Ändern von Texten LENGTH - Länge eines Textes OVERLAY - Text überlagern POS - Suchen von Texten STRIP - Randzeichen entfernen SUBSTR - Teil aus einem Text extrahieren TRANSLATE - Zeichen übersetzen VERIFY - Text prüfen
293 294 294 295 297 297 298 299 300 300 301
13.7 13.7.1 13.7.2 13.7.3 13.7.4 13.7.5
Wortfunktionen WORD - Rückgabe eines Wortes WORDINDEX - Rückgabe der Startposition eines Wortes WORDLENGTH - Rückgabe der Länge eines Wortes WORDPOS - Suchen nach einem Wort WORDS - Anzahl der Worte eines Strings
304 304 305 305 305 306
13.8 13.8.1 13.8.2 13.8.3 13.8.4 13.8.5 13.8.6 13.8.7
Systemfunktionen LISTDSI - Data Set Information MSG - Steuerung der TSO Messages MVSVAR - Informationen zum System OUTTRAP - TSO Meldungen übernehmen SYSDSN - Dateistatus prüfen SYSVAR - Systeminformationen STORAGE - Speicherinhalte lesen und schreiben
306 307 307 308 308 309 310 311
14
Die TSO/E REXX Befehle
313
14.1
EXECIO - Dateien bearbeiten
313
14.2
DELSTACK - Inhalt von Data Stacks löschen
316
14.3
DROPBUF - Löschen von Data Stack Buffers
316
14.4
EXECUTIL - EXEC Ausführung beeinflussen
316
14.5
TSO Befehle
317
15
TSO und ISPF in Batch Jobs ausführen
319
15.1
TSO in Batch Jobs verwenden
319
15.2 15.2.1 15.2.2 15.2.3
ISPF in Batch Jobs verwenden ISPF Dateien in einem Batch Job Struktur eines ISPF Batch Jobs Der Skeleton SISPFDD
320 321 322 323
Inhaltsverzeichnis
XV
16
Einleitung zum Programmieren im ISPF
325
16.1
Programmiersprachen im ISPF
325
16.2
Programmierobjekte im ISPF
326
16.3 16.3.1 16.3.2 16.3.3 16.3.4 16.3.5 16.3.6
Einige typische Beispiele Beispiel für die Benutzung eines ISPF Panels Beispiel für die Verwendung von Skeletons Beispiel für die Benutzung von Tables Beispiel für die Verwendung von ISPF Variablen Beispiel für die Dateiverarbeitung mit ISPF Beispiel für die Ausgabe von Messages mit ISPF
328 328 330 332 334 335 337
16.4
LIBDEF - Dynamische Verkettung von ISPF Bibliotheken
339
16.5 16.5.1 16.5.2 16.5.3 16.5.4
ALTLIB - Dynamische Verkettung von EXEC Bibliotheken Suchreihenfolge in den Prozedurenbibliotheken Der ALTLIB Befehl unter ISPF Stapelung der APPLICATION Level ALTLIBs Der QUIET Operand des ALTLIB DISPLAY Befehls
342 343 344 345 346
17
Dateiverarbeitung mit ISPF
349
17.1 17.1.1 17.1.2 17.1.3 17.1.4 17.1.5 17.1.6 17.1.7 17.1.8 17.1.9 17.1.10 17.1.11 17.1.12 17.1.13 17.1.14 17.1.15 17.1.16 17.1.17 17.1.18 17.1.19 17.1.20 17.1.21 17.1.22 17.1.23
Die LM Services Gruppierung der LM Services LMINIT - Beginnen der Dateiverarbeitung LMFREE - Datei freigeben LMOPEN-Datei öffnen LMCLOSE-Datei schließen LMMFIND - Member lokalisieren LMMREP - Member ersetzen LMMADD - Member hinzufügen LMGET - Datensatz lesen LMPUT - Datensatz ausgeben LMCOPY - Daten kopieren LMMOVE - Daten verschieben LMMDEL - Member löschen LMMREN - Member umbenennen LMMSTATS - Statistics eines Members anzeigen und ändern LMCOMP - Compress eines PDS LMMLIST - Ausgeben einer Member Liste LMMDISP - Anzeige und bearbeiten einer Memberliste LMDINIT - Initialisieren des LMDDISP Service LMDDISP - Data Set List Service LMDLIST-List Data Sets LMDFREE - Freigeben eines LMDINIT MEMLIST - Member List Dialog Service
349 349 352 353 354 355 355 358 359 359 361 364 366 366 366 367 370 370 373 376 376 378 379 380
XVI
Inhaltsverzeichnis
17.2 17.2.1 17.2.2 17.2.3 17.2.4 17.2.5 17.2.6 17.2.7
Data Set Query Services LMDLIST - Data Set List Service DSINFO - Data Set Information Interessantes Problem im REXX LISTDSI - List Data Set Information QBASELIB - Query DSN Information QLIBDEF - Query LIBDEF Information QUERYENQ - ENQs ermitteln
382 383 383 386 388 393 396 397
18
Messages - Definition, Rückgabe, Ausgabe
401
18.1 18.1.1 18.1.2 18.1.3 18.1.4 18.1.5 18.1.6 18.1.7 18.1.8
Fehlerbehandlung im ISPF Rückgabe von Fehlermeldungen Ausgabe von Fehlermeldungen SETMSG-Set Next Message Definition von ISPF Messages Namenskonvention der ISPF Message IDs Definition der Messages Das Standard Message Member ISRZ00 Generelle ISPF Error Prozedur
401 402 403 403 404 404 405 407 410
19
Panels - Erstellen und nutzen
413
19.1
Die Dynamic Tag Language (DTL)
413
19.2
Panel Typen im ISPF
415
19.3 19.3.1 19.3.2 19.3.3 19.3.4 19.3.5 19.3.6 19.3.7
Panels definieren Die Struktur eines Panels Erstellung von Panels und deren Aufruf Die Panel Definition Sections Variablen in der Panel Definition Panel Verarbeitung Help Panels Table Display Panels
415 415 416 417 425 427 429 430
20
Skeletons - Aufbau und Einsatz
433
20.1
Die Erstellung von Skeletons
433
20.2
Schritte bei der Skeleton Benutzung
436
20.3
Erstellung von JCL mithilfe von Skeletons
437
21
Tables - Erstellen und bearbeiten
439
21.1
Speicherorte für Tabellen
439
21.2
Lesen von ISPF Tabellen
439
21.3
Schreiben von ISPF Tabellen
440
Inhaltsverzeichnis
XVII
21.4
Befehle der Table Services
441
21.5
Beispiel für die Tabellenverarbeitung
442
21.6 21.6.1 21.6.2 21.6.3 21.6.4 21.6.5
Tabellenverarbeitung am Beispiel des Programms LASTED Die Paneldefinition des Panels LASTED Panelanzeige der Funktion LASTED Die Hilfetexte der Anwendung LASTED Der Quellkode des Programms LASTED Die Beschreibung des Programms LASTED
443 444 445 445 446 450
22
Variables - Definieren und nutzen
453
22.1 22.1.1 22.1.2 22.1.3
Variablen Pools Function Pool Shared Pool Profile Pool
453 454 454 454
22.2
Sicherung der Profile Members
455
22.3
Die Erstellung eines Profile Members
456
22.4
SWAP LIST - Anzeige der aktiven Anwendungen
456
22.5 22.5.1 22.5.2
Der System Profile Pool Häufig benötigte ISPF Variable ISPF Variable verarbeiten
458 458 460
23
Edit Makros - Einführung
463
23.1 23.1.1 23.1.2
Was ist ein Edit Makro? Namenskonventionen fur Edit Makros Beispiel eines Edit Makros
463 464 464
23.2 23.2.1
Tabelle der Edit Makro Befehle Abkürzungen in den Edit Makro Befehlen
469 475
23.3 23.3.1 23.3.2 23.3.3
Testhilfen bei der Makro Erstellung Makro-Simulation durch Prototyping online im Editor Der REXX TRACE Befehl als Makro Testhilfe Das Programm ISREMSPY
476 476 476 477
23.4
System Variable des Editors
479
23.5
Parameterübergabe an Makros
480
23.6 23.6.1
Beispiel fur den SUBMIT eines Batch Jobs Die Prozedur #DPR
481 481
24
Die LANZ ISPF Utilities
485
24.1
Utilities im Internet
485
24.2
Inhalt der CD Rom
486
XVIII
Inhaltsverzeichnis
24.3
Installation der Utility Programmelemente
487
24.4 24.4.1 24.4.2 24.4.3
Beschreibung der REXX Prozeduren Programmtypen der LANZ Utilities Tabelle der Beispielprogramme Tabelle der Utility Programme
489 489 489 494
24.5
Die Programme DOC und LASTED
499
24.5.1
Beschreibung der Komponenten
501
24.6
Das Member Save- und Restore System
508
24.7
LOGON - Die eigene Logon Prozedur
513
24.8
Eigene Variable in den Profile stellen
516
24.9 24.9.1 24.9.2 24.9.3 24.9.4 24.9.5 24.9.6 24.9.7 24.9.8 24.9.9 24.9.10 24.9.11 24.9.12 24.9.13 24.9.14 24.9.15 24.9.16 24.9.17 24.10 24.10.1 24.10.2 24.10.3 24.10.4 24.10.5 24.10.6 24.10.7 24.10.8 24.10.9 24.10.10 24.10.11 24.10.12 24.10.13
Die Makros ## - REXX Prozedur direkt im Edit ausführen #PAN - Panels direkt im Editor testen #RO - REXX Prozeduren direkt im Editor umwandeln #RC - REXX Programm im Batch kompilieren #RCLOAD - Aus REXX Programm Lademodul erzeugen #ALTXT - Text neu ausrichten #CM - Kommentarbox im Edit einfügen #SPLJ - Zeilen aufsplittern und zusammensetzen #EDMEM - Members direkt aus Listen editieren #DISP - DISP Parameter im DD Statement an erste Stelle setzen #PROF - Anzeigen der ISPF Edit Profile Values als NOTELINES #R3390 - Optimale Blocksize berechnen #SS - Super Search Liste bereinigen #SU - Jobs submitten #TSOB - REXX Programm im TSO Batch ausführen #ISPFB - REXX Programm im ISPF Batch ausfuhren #ASM - Assembler Compile, Link und Test Die Programme CR - Universelles Datei Utility CMDSMOD - Bearbeiten von ISPF Command Tables EXABGL - Abgleich zwischen REXX und CEXEC Datei LI - Listcat einer Datei in Browse anzeigen MACROALL - Ausfuhren eines Makros für alle Members eines PDS MEMAB - PDS Member abgleichen MEMVERJ - PDS Directories mittels Batch Job vergleichen REXXLIBC - Feststellen, ob die REXX Library vorhanden ist SS - Super Search in einer Datei TASID - Systeminformationen anzeigen JD - Wochentag und Datum zu einem julianischen Datum anzeigen VOLINF - Plattenbelegungen anzeigen XCURSOR - Dateien von überall im Bildschirm aufrufen
518 519 519 520 521 523 524 525 525 526 526 526 527 528 529 529 531 532 533 533 535 535 536 536 537 537 538 539 539 539 540 541
Inhaltsverzeichnis
XIX
24.11 24.11.1 24.11.2 24.11.3 24.11.4 24.11.5 24.11.6 24.11.7 24.11.8 24.11.9
Die Unterprogramme CHANGE - Change Funktion im REXX JOBSUFF - Job Suffix Buchstaben holen MEMSLIST - Memberliste mehrerer DSNs STRUKTR - Zahlen strukturieren DATEALL - Datumsberechnungen aller Art DATUMOK - Plausibilitätsprüfung für ein Datum SCHALTJ - Schaltjahr ermitteln JULDATE - Julian Date Berechnungen XEXTRACT - Text vom ISPF Bildschirm extrahieren
543 543 543 544 544 545 547 547 547 547
24.12 24.12.1 24.12.2
REXX Copy Member ISPERROR - ISPF Fehlermeldungen ausgeben EXNAME - Programm Start Member
548 549 549
24.12.3
LMGREAD - Copy Member zum Lesen von Datensätzen mittels LMGET
550
Abbildungsverzeichnis
553
Tabellenverzeichnis
557
Programmverzeichnis
559
Index
561
1
Einleitung
Wie ich im Vorwort bereits erwähnte, soll Sie dieses Buch dabei unterstützen, ein Profi im Umgang mit dem ISPF zu werden. Da die Kenntnisse im ISPF, mit denen Sie als Leserin oder Leser an dieses Buch herangehen aber sicherlich sehr unterschiedlich sind, habe ich das Buch modular aufgebaut. Dadurch können Sie das Buch sowohl als reines Lehrbuch als auch als Handbuch bei der täglichen Arbeit nutzen. Viele Querverweise sowie ein umfangreicher Index unterstützen Sie bei der Navigation im Buch. Einige Teile des Stoffes habe ich schon lange bevor ich mit dem Schreiben des Buches begonnen habe als kleine Nachschlagewerke für meine tägliche Arbeit niedergeschrieben und benutzt. Das bedeutet für Sie, dass die hier beschriebenen Verfahren langjährig in der Praxis erprobt sind.
1.1
Mein Weg zum ISPF
Seit Anfang der achtziger Jahre arbeite ich bei meiner Tätigkeit als externer Berater, Programmierer und Dozent im IBM Host Umfeld immer wieder mit dem Interactive System Productivity Facility (ISPF), einem Subsystem des z/OS TSO. Wie der Name schon sagt, soll dieses Subsystem dem Anwender zu einer höheren Produktivität bei seiner Arbeit im IBM MVS z/OS Host Umfeld verhelfen. Ich kann Ihnen versichern, dazu ist es hervorragend geeignet. Sobald ich mich etwas intensiver mit dem ISPF vertraut gemacht hatte und damit dem Anfängerstadium entwachsen war, tauchte in mir der Wunsch auf, einige immer wiederkehrende Abläufe möglichst zu automatisieren und damit zu beschleunigen. Ich habe mich daraufhin auf dem Buchmarkt umgesehen, aber bisher kein Buch gefunden, das geeignet wäre, mich bei der Realisierung des oben genannten Wunsches auf hohem Niveau zu unterstützen. Da ich während meiner Dozenten-, Berater- und Programmiertätigkeit in verschiedenen Unternehmen im In- und Ausland eine Reihe von Verfahren und Programmen entwickelt habe, die mir oft eine erhebliche Beschleunigung meiner Arbeit im z/OS ermöglichten, entschloss ich mich, meine Erfahrungen im Umgang mit dem ISPF zusammen mit den Programmen in diesem Buch zu veröffentlichen. Die Verfahren und Programme werden in diesem Buch beschrieben. Die Programme befinden sich auf der beiliegenden CD.
2
1 Einleitung
1.2
Vorkenntnisse des Lesers
Da es sich bei diesem Buch nicht um ein Lehrbuch im herkömmlichen Sinn handelt, in dem Schritt für Schritt sowohl für den Anfänger als auch für den Fortgeschrittenen der Stoff vermittelt wird, möchte ich zunächst einmal darlegen, welche Vorkenntnisse Sie mitbringen sollten, um den optimalen Nutzen aus diesem Buch zu ziehen: Anfanger Sie sollten im Wesentlichen über Kenntnisse bzgl. z/OS, TSO, ISPF, JCL, Dateien usw. verfügen, die in dem Buch von Michael Teuffei mit dem Titel „TSO - Time Sharing Option im Betriebssystem z/OS MVS" beschrieben sind. Dieses Buch ist ebenfalls im Oldenbourg Verlag erschienen (ISBN 3-486-25560-6). Praktiker Falls Sie bereits jahrelang mit dem z/OS MVS und seinen Vorgängersystemen arbeiten, haben Sie die nötigen Vorkenntnisse. Sollten Sie bereits in der Script Sprache REXX programmiert haben, ist dies von Vorteil, denn dann können Sie sofort den optimalen Nutzen aus diesem Buch ziehen. Falls Sie REXX noch nicht kennen, bietet Ihnen dieses Buch die Möglichkeit, REXX schnell und effizient zu lernen.
1.3
Organisation des Inhalts
Das Buch ist in drei große Segmente unterteilt: 1. Das erste Segment zeigt Ihnen, wie Sie Ihr ISPF optimal einrichten und damit arbeiten. 2. Das zweite Segment gibt Ihnen zunächst eine Einfuhrung in die Prozedurensprache REXX, um Ihnen anschließend zu zeigen, wie Sie mithilfe von REXX die Funktionen und Services des ISPF zur Beschleunigung Ihrer Arbeit im z/OS MVS einsetzen können. 3. Das dritte Segment beschreibt die dem Buch beiliegenden LANZ Utilities. Sie erfahren, wie sie diese Utilities in Ihrem ISPF installieren und verwenden. Alle Beschreibungen von Verfahren, Befehlen und Funktionen werden von Beispielen begleitet, die allesamt ausgetestet sind und deren Quellkode sich auch auf der CD befindet. Sie können sich diese Beispiele bei Bedarf in Ihr z/OS MVS System laden und als Vorlagen für eigene Anwendungen benutzen.
1.4 •
Benutzung des Buches
Sie können das Buch als Lehrbuch für die Einarbeitung in die Arbeit mit dem ISPF verwenden. In diesem Fall werden Sie das Buch von vorne her systematisch durcharbeiten
1.5 Navigationshilfen in diesem Buch
•
3
und die gezeigten Beispiele an Ihrem System nachvollziehen wollen. Falls Sie das z/OS MVS und das TSO noch nicht so gut kennen, sollten Sie sich die Grundlagen zum TSO erarbeiten, wie sie im Buch von Herrn Teuffei beschrieben sind. Siehe hierzu das Kapitel „Vorkenntnisse des Lesers" ab Seite 2. Sie können das Buch aber auch als Nachschlagewerk einsetzen, um bei Ihrer täglichen Arbeit mit dem ISPF Verfahren, Befehle und Funktionen nachzuschlagen. Hier möchte ich Ihnen vor allem die Beispiele ans Herz legen. Sie finden darin für fast alle Fälle der täglichen Arbeit im ISPF genügend Vorlagen, die Sie direkt in Ihre Programme übertragen können. Ich selbst benutze das Buch genau zu diesem Zweck, denn ich habe auch nicht immer jede Option zu einem Befehl im Kopf parat.
Damit Sie sich bei der Suche nach Funktionen, Services und Beispielen gut orientieren können, habe ich eine Menge Querverweise eingebaut. Werfen Sie auch einmal einen Blick in den Index am Ende des Buches. Mit dessen Hilfe finden Sie schnell Befehle, Funktionen und Services sowie die dazugehörigen Beispiele. Fachbegriffe und Abkürzungen Da ich davon ausgehe, dass Sie bei der Benutzung des Buches die weiter oben genannten Voraussetzungen erfüllen, werde ich die Fachbegriffe und Abkürzungen, wie sie im Buch benutzt werden nicht mehr ausführlich erläutern. Solche Erläuterungen würden den Inhalt nur unnötig aufblähen und die sachkundigen Leser stören.
1.5
Navigationshilfen in diesem Buch
Sie werden in diesem Buch viele so genannte „TO DO" Strecken finden. Dabei handelt es sich um die schrittweise Beschreibung eines Bearbeitungsvorgangs. Ich habe versucht, diese Strecken so aufzubereiten, dass Sie sich leicht zurechtfinden. Das sieht dann wie folgt aus: Die Zeichen, die Sie eintippen müssen und die Tasten, die Sie drücken sollen, sind grau hinterlegt. Beispiel • •
Bewegen Sie den Cursor in die COMMAND Zeile, geben dort hilfe ein und drücken ENTER. In dem dann erscheinenden Panel wählen Sie 10 aus und drücken wieder ENTER.
Diese Hilfestellung habe ich aus eigener leidvoller Erfahrung bei der Benutzung von Lehrbüchern während der Abarbeitung von „TO DO" Strecken entwickelt. Denn sehr oft habe ich mich gefragt: „Was war hier einzugeben oder wo steht das Wesentliche?" Ich denke mit dieser Hilfestellung finden Sie sich schneller zurecht.
4
1 Einleitung
Tipp Immer, wenn ich Ihnen einen Tipp aus der Praxis verraten möchte, der ein nicht ganz einfaches Verfahren beschreibt, Ihnen aus einer Klemme helfen kann oder Sie vor Überraschungen bewahren soll, finden Sie diesen Balken an der linken Seite mit der Überschrift „Tipp". Genau so werde ich auch alle „Hinweise" und manche wichtige „Regel(n)" sowie „Merksätze", die oft am Ende eines Kapitels eingefügt sind, kennzeichnen. Eine Zusammenfassung aller Tipps, Hinweise und Regeln finden Sie im Index am Ende des Buches unter den jeweiligen Stichworten.
1.6
Darstellung von Panels und Programmkode
In diesem Buch werden sehr viele Ausdrucke von Panels und Programmkodes erscheinen. Dabei werde ich versuchen folgende Regeln einzuhalten: • • •
•
Panels und Programmkode werden immer in der Schriftart „Courier New" dargestellt. 3270-Panel Screen Shots in Textform werden immer in einem Rahmen erscheinen. Manchmal werde ich überflüssige Zeilen aus den Panels entfernen, um eine optimale Aufteilung des Layouts zu erreichen. Dies ist dann an einer gepunkteten Zeile zu erkennen. Programmkode beginnt immer mit einer durchgezogenen Linie oberhalb der ersten Zeile und endet mit einer durchgezogenen Linie unterhalb der letzten Zeile.
1.7
Program Function Keys
Die PF Tasten (Program Function Keys) sind diejenigen Tasten, die auf einer Computer Tastatur die oberste Tastenreihe bilden. Bei einer PC Tastatur sind diese Tasten mit Fl bis F12 bezeichnet. Die Bezeichnung PF Tasten wurde im IBM Host Bereich schon vor vielen Jahren festgelegt. Es gab sogar einmal eine Zeit, da wurden von der Firma IBM Tastaturen mit 24 PF Tasten ausgeliefert. Es wäre schön, wenn es die 24 PF Tasten auf den Tastaturen heute noch gäbe. Wenn Sie am PC mit einer 3270-Emulationssoftware arbeiten, können sie diese Software so einstellen, dass Ihnen 24 PF Tasten zur Verfugung stehen. Die Tasten 13 bis 24 erreichen Sie dann durch gleichzeitiges Drücken der Tastenkombination Großschreibung+Fl bis F12. In der neuesten IBM Literatur wird jetzt zunehmend nur noch von den F Tasten gesprochen. Man will hier wohl eine Vereinheitlichung der Bezeichnungen herbeifuhren. Da aber bisher in allen mir bekannten Texten innerhalb des Online ISPF immer noch von PF Tasten die Rede ist, bleibe ich im Buch bei dieser Bezeichnung.
1.8 Englische Fachbegriffe
1.8
5
Englische Fachbegriffe
Dieses Buch ist in Deutsch geschrieben. Die Materie, die es behandelt, wird aber von der englischen Sprache dominiert. Deshalb ergibt sich für mich das Problem, immer wieder englische Fachbegriffe benutzen zu müssen. Daraus entsteht dann zwangsläufig das berühmte „DENGLISCH". Ein ganz schlimmes Beispiel ist der Begriff „CANCELN", den es im Englischen ja gar nicht gibt. Hier kann man also wirklich „abbrechen" benutzen. Ich werde mich bemühen, möglichst bei der deutschen Sprache zu bleiben. Aber manchmal sind die entsprechenden englischen Fachbegriffe einfach kürzer, prägnanter und Ihnen als in der EDV „Schaffende" wahrscheinlich auch geläufiger als ein mühsam eingedeutschter Begriff. Deshalb habe ich mir ein Konzept ausgedacht, das vielleicht ganz praktikabel ist. Das sieht dann so aus: Wenn ich einen englischen Ausdruck an einer bestimmten Stelle für besser halte als den entsprechenden deutschen, benutze ich den englischen Ausdruck. Dabei werde ich versuchen, einen Ausdruck oder einen typischen Fachbegriff entweder komplett in englischer oder komplett in deutscher Sprache zu bringen. Beispiele • •
Data Set Characteristic oder Dateicharakteristik und nicht Data Set Charakteristik. Data Set Names oder Dateinamen und nicht Data Set Namen.
Damit die Verwendung des Plural im Zusammenhang mit gängigen Begriffen nicht allzu grausam ausfällt, werde ich den Begriffen manchmal deutsche Plural Endungen anhängen. Beispiele • •
Bei der Verwendung von DSLISTen müssen Sie ... Hier können Sie mehrere DSNs eintragen.
1.9
Die ISPF Literatur
Wie Sie sich leicht denken können, gibt es für ein Subsystem, wie es das ISPF darstellt, eine umfangreiche Literatursammlung von der Firma IBM. Im folgenden Abschnitt stelle ich die Literatur und die Quellen, von denen Sie die Literatur beziehen können, zusammen. Grundsätzlich benötigen Sie für die Anwendung der in diesem Buch beschriebenen Verfahren und Programme aber keine weitere Literatur in Form von gedruckten Broschüren. Alle benutzten Funktionen und die wesentlichen in der Praxis benötigten Parameter und Optionen sind jeweils an der entsprechenden Stelle ausführlich beschrieben.
6
1 Einleitung
Wozu benötigen Sie die Originalliteratur? Einer der Hauptgründe, warum dieses Buch geschrieben wurde ist, dass Sie für viele Aufgabenstellungen, die Ihnen während der Arbeit mit dem ISPF begegnen können, hier eine fertige Lösung vorfinden. Erst wenn Sie eine Lösung hier nicht finden und Ihre Aufgabestellung aus den hier vorgestellten Lösungen nicht ableiten können, benötigen Sie eventuell den Zugriff auf die Originalliteratur.
1.9.1
Literaturquellen
Es gibt folgende Möglichkeiten, Informationen über das ISPF, seine einzelnen Komponenten oder seine Funktionen zu bekommen: •
•
•
•
•
•
Die Literatur der Firma IBM in Papierform. Diese Art der Literatur wird heutzutage nur noch selten benutzt. Dies liegt vor allem an der Alterung der Informationen. Aber es gibt immer noch Liebhaber von Broschüren in Papierform, denn „Was Du schwarz auf weiß besitzt, kannst Du getrost nach Hause tragen". Die Literatur der Firma IBM, die Sie direkt im Internet ansehen und auch ausdrucken können, finden Sie unter der Adresse: http://www.software.ibm.comyad/ispf. Diese Broschüren können Sie entweder als PDF Datei direkt herunterladen oder als HTML Text im Book Manager Layout anschauen. Ich gehe meistens so vor, dass ich mir eine Broschüre als PDF Datei anzeigen lasse und diese Datei dann auf meinem PC abspeichere, um sie später schneller verfugbar zu haben. In der Liste der Broschüren können Sie auch das Datum der letzten Änderung einzelner Broschüren sehen. Dadurch ist es Ihnen leicht möglich, stets die neuesten Broschüren vorzuhalten. Die Literatur der Firma IBM auf CD, die unter Windows und unabhängig vom ISPF benutzt werden kann. Für einige Systeme gibt es diese CDs als „Collections", welche die Broschüren für ein ganzes System mit allen wichtigen Subsystemen enthalten. Es gibt z.B.: die „z/OS Collection", die „VM Collection", die „VSE Collection" usw. Die gesamte TSO/ISPF Literatur ist in der z/OS Collection enthalten. Die Literatur der Firma IBM, die unter ISPF durch den Book Manager Online zur Verfügung steht. Inhaltlich handelt sich hierbei um die gleichen Broschüren, wie sie auf den CDs und im Internet zur Verfügung gestellt werden. Die Online Hilfe des ISPF. Dort sollten Sie sich in regelmäßigen Abständen über Neuerungen im Leistungsumfang des ISPF informieren. Diese finden Sie, indem Sie in der CUA Zeile des „ISPF Primary Option Menu" das Pull Down Menü unter HELP aufklappen und dort die Auswahl „Changes for this Release" auswählen. Weitere unterstützende Informationen, die von anderen Firmen als der IBM zur Verfugung gestellt werden. Siehe hierzu das Kapitel „Das MVS/QuickRef Informationssystem" ab Seite 23.
Aus dieser Aufstellung ergibt sich, dass es wahrscheinlich am sinnvollsten ist, sich die Literatur direkt im Internet anzusehen, denn dort sind sicherlich die aktuellsten Broschüren zu finden. Leider bieten alle diese Quellen die Literatur nur in englischer Sprache an. Es gab in früheren Jahren einige Broschüren auch in deutscher Sprache. Aber die Bemühungen, die
1.9 Die ISPF Literatur
7
ISPF Literatur auch in deutscher Sprache zur Verfügung zu stellen, wurden meines Wissens inzwischen von IBM eingestellt. Hinweis Neben den „normalen" Funktionen und Anwendungen gibt es im ISPF noch den Software Conflguration and Library Manager (SCLM). Dieses Subsystem werde ich in diesem Buch nicht behandeln. Alle Broschüren zum SCLM werden deshalb bei den folgenden Betrachtungen nicht berücksichtigt, auch wenn sie in den Bildschirmanzeigen zu sehen sind.
1.9.2
Beschaffung der Literatur
Wenn Sie Literatur entweder in Papierform oder auf CD beschaffen wollen, rufen Sie in Deutschland die Service Nummer 01805 5090 der IBM an und verlangen dort den „Literaturservice". Ich habe Ihnen weiter oben schon die verschiedenen Literaturquellen genannt. Ich zeige Ihnen jetzt auf den folgenden Seiten, wie Sie diese Literaturquellen anzapfen können. Für diejenigen, die auch an der Literatur zum z/OS interessiert sind, habe ich auch deren Quelle im Internet angegeben. Für das z/OS MVS finden Sie die Literatur unter der Adresse: http://www.ibm.com/servers/eserver/zseries/zos/bkserv Unter 1.9.4 sehen Sie das Einstiegsmenü nach dem Aufruf der obigen Internetadresse. Auf den danach folgenden Seiten finden Sie dann die Internet Seiten zur ISPF Literatur.
1.9.3
IBM Terminology im Internet
Falls Sie allgemeine Informationen zur Terminologie des z/OS und seiner Subsysteme benötigen, können Sie diese unter der folgenden Internet-Adresse finden: http://www.ibm.com/terminology
8
1
1.9.4
E i n l e i t u n g
Die z/OS M V S Literatur der Firma IBM im Internet
a l
' Ü 2 / O S I n t e r n e t Library - Technical documentation for t h e z/OS platform - M i c r o » Datei
Bearbeiten
i
'
....)
Ansicht '
Favoriten
*]
\
Extras /
Suchen
•';
Favoriten
(^Medien
/p>
-
^
3
*
Adresse j g ] http://www-l.ibm.com/servers/eserver/2series/zos/bkserv/
Home Select a country
zOS
-Jol.xl i
l
Products & services
Support & downloads
*
, ¡ 0 Wechseln zu : U r t a
My account
Serveis > Mainframe servers > z/OS
z/OS Internet Library
About Z/OS Software H o w to Buy
> z/OS e Internet Library z/OS I n t e r n e t L i b i a i y t e r m s a n d c o n d i t i o n s Plea se r e a d a n d accept our t e r m s and c o n d i t i o n s before u s i n g the z/OS Internet library.
M i g r a t i o n s Installati on
• O S / 3 9 0 Internet Library
News Support Downloads • Education Library E a s e of Use Contact z/OS
BookManaaerbook
•
Product b o o k s h e l f
•
z/OS Library C e n t e r IV1R5IV1R4I
•
z/OS e l e m e n t s a n d f e a t u r e s m e s s a g e s a n d c o d e s IV1R6 IV1R5 IV1R4 IV1R3 IV1R2 IV1R11
•
z/OS e l e m e n t s a n d features A d o b e ® A c r o b a t ® P D F s { V I R 6 IV1R5 IV1R4 IV1R3 IV1R2 IV1 Rt I
• •
• fiB : • : . : lulls 'J : t & m b a t P D F s Other available A d o b e Acrobat P D F s I Hardware I V M I V S E 1
• z/OS m i g r a t i o n m a n i i a l s available t o i Z0SV1.6. ZÛSV1.5. a n d Z/OS V 1 . 4
Hot T o p i c s n e w s l e t t e i August 2004 IEEE)
z/OS e l e m e n t s . l i i ' l featu >.-s p u b l i c a t i o n s
•
IV1R6 i V1R5 IV1R4 I V I R 3 IV1R2 I V 1 R I 1
Z/OS p l . i t f o i i n p u b l i c a t i o n s
•
z/OS P a r a l l e l Svsnlex
•
z/OS s o f t w a r e p r o d u c t s
zSeiies Reilbooks Collection. M a r c h 2004
M
O t i i e i a v a i l a b l e CD C o l l e c t i o n k i t s ¡ ¡ g j http://www-1 -ibm. com/servers/eserver/zseries/zos/education .html
Abbildung 1 Literatur fir z/OS MVS im Internet
•35 Internet
9
1.9 Die ISPF Literatur
1.9.5
Die ISPF Literatur der Firma IBM im Internet
Literatur zu ISPF finden Sie im Internet Portal der IBM unter: http://www.software.ibm.com/ad/ispf Beim Aufruf der oben genannten Internet-Adresse erscheint das folgende Panel:
3
ISPF f o r z/OS • P r o d u c t O v e r v i e w - IBM S o f t w a r e - M i c r o s o f t I n t e r n e t Explorer Datei
Bearbeiten
Ansicht
Favoriten
.*] ßdhssi-e
j $
Extras l
/
? Favoriten
Suchen
Medien
SIP
http://www-306.ibm,com/software/awdtools/ispf/
| v j Flugwetter
Pontresina
Home Select a c o u n t r y Ml software products
Software
e ] Sils
ig] Wallis
Products & services > Software D e v e l o p m e n t
S u p p o r t 8c d o w n l o a d s
My a c c o u n t
>
IBM ISPF for z/OS
ISPFfoi z OS Features and benefits System requirements Library News Howtobuy
• ISPF is a software library management tool for versloning, auditing and promoting source code. • Includes configuration management to track all application components.
Events Services Support
• Supports management of data sets > Includes library access services. > Supports simplified data management services.
I8M Cloud 9 fòt sop Seivers > Mainframe seivers > z/OS
Locarci-
Messages
Overview Software
1. Enter Message ID:
2. Select an area to LookAt! Note: Platform selections below also include any IBM application software messages enabled for LookAt.
Littest News and Aleits Mill ell 19. 2004 Click heie foi details!
z/OS™ and z/OS.e™
How to Buy Migration & Installation News Support Downloads Education
LookAt Mobile Edition Click here!
Library Ease of Use
O
V1R5
O
V1 R4
O
V1 R3
OS,390™ ©
V2R10
ZVM™ O
V4R4
O
V4R3
O
V4R2
O
V4R1
VSEiSA™
mm
G
V2R7
O
V2R8
O
V2R5
z;OS™ only O
V1R2
O
V1R1
Contact ziOS Ousters for: Related links:
O
AlX?"
O unux"
Resources for business partners
. .•../.
Or, to view messages in IBM books that have not been enabled for LookAt, select an area to search using BookM.mayet ^ APAR and » H O L D Docs Z/OS™ OS380™
Resources for developers
O All releases
O All releases
For more information about LookAt...! L>o you want to Know WHICH hooks ate enabled tot LookAt...? I o display a list or tne books that are currently enabled for LookAt, please click List Books • Host LookAt users - do you need to download LookAt code for T S O € and Windows...? To download LookAt code that will run on either platform, please click Download • Do yon have a comment, suggestion, or complaint about LookAt...? Your feedback is important to us. To report a problem with LookAt, ask a question, or share an idea, please click Feedback. You can also tell us what you like or dislike about LookAt. • Do you need help using LookAt...? To get instructions to help you enter messages correctly and a list of known problems, please click Help •
OS/390, z/OS, z/VM, VSE/ESA, AIX, and BookManager are trademarks or registered trademarks of the IBM Corporation in the United States and other countries or both.
Internet
Abbildung 10 Eingangsmenü zum LOOKAT im Internet Wenn Sie jetzt im Feld „Message I D " die erhaltene Fehlermeldung eingeben, dann das zugehörige System auswählen und mit „ G O " weitermachen erhalten Sie Hinweise zu dem vorliegenden Fehler.
21
1.14 ISPF Subsysteme
1.14
ISPF Subsysteme
Für das ISPF gibt es einige sehr hilfreiche Subsysteme, die ich Ihnen hier in einer Zusammenfassung vorstellen möchte. Wir werden uns in den danach folgenden Kapiteln des Buches noch mit diesen Subsystemen beschäftigen. Möglicherweise gibt es in dem ISPF, in dem Sie arbeiten, noch weitere Subsysteme, die hier nicht genannt werden. Ich werde nur solche Subsysteme im Buch behandeln, die ich immer wieder bei meinen Kunden vorgefunden habe und die ich auch gut genug kenne, um darüber schreiben zu können. Weiterhin weise ich darauf hin, dass ich nur auf das Job Entry Subsystem 2 (JES2) der IBM eingehen werde. Dieses System ist in der Mehrzahl der Rechenzentren meiner Kunden installiert.
1.14.1
SDSF - System Display and Search Facility
Hersteller:
IBM
Das SDSF ist die Brücke zwischen JES2 und ISPF. Mit SDSF können Sie viele Funktionen, die Ihre Jobs und das MVS System LOG betreffen, ausfuhren. Das SDSF wurde in den letzten Jahren erheblich erweitert. Sie können die Anzeige-Panels des SDSF Ihren eigenen Bedürfnissen anpassen. Dazu stehen in der CUA Leiste eine ganze Reihe von Einstellmöglichkeiten bereit. Die Grundfunktionen kann man an dem folgenden „Primary Option Menu" des SDSF erkennen. Display
Filter
View
HQX7707 COMMAND INPUT = = >
Print
Options
Help
SDSF PRIMARY OPTION MENU
OH 1 0 H ST
ICtlTI D I M « Input qu*ua Output B«ld output n m PR PUN RDR LINE NODE SO SP
Initiators Printers Punches Readers Lines Nodes Spool offload Spool volumes
ULOG
User session log
Abbildung 11 SDSF Primary Option Menu
Die am häufigsten benutzten Funktionen habe ich grau hinterlegt.
CSR
22
1 Einleitung
1.14.2
MVS/QuickRef
Hersteller: © 2002 Chicago-Soft Distributor: ORWI EDV-Vertriebs GmbH. Aus deren Internetseite http://www.orwi.com/products/qr_develop.htm habe ich folgende Definition zu MVS/QuickRef entnommen: MVS/QuickRefdas Online Referenz Tool für MVS, bietet schnellen und komfortablen Zugriff auf Referenz-Informationen, die von Anwendungsentwicklern, Systemprogrammierern und Operatoren täglich benötigt werden. Die Informationen sind in einer, im Produkt enthaltenen, Datenbank hinterlegt und umfassen nicht nur IBM Produkte, sondern auch zahlreiche Produkte unabhängiger Software-Anbieter. Mit jedem neuen Release von MVS/QuickRef™ wird diese Datenbank, und damit der Nutzen von MVS/QuickRef™, erheblich erweitert. Waren im Release 4.3 Ende 1996 noch rund 4 Millionen Zeilen an Informationen enthalten, so enthält das aktuelle MVS/QuickRef ™ Release 5.9 bereits über 6 Millionen Zeilen. Neben der Erweiterung der Datenbank werden von Release zu Release die vorhandenen Funktionen weiterentwickelt sowie neue hinzugefügt. Wir werden auch dieses Tool noch in einem späteren Kapitel ausführlich behandeln. Ich kann Ihnen hier schon versprechen, das wird sich lohnen!!
1.15
Informationsquellen
Ich verzichte in diesem Buch bewusst darauf, allgemeine Beschreibungen für alle verfugbaren Befehle und Funktionen zu bringen. Das hat folgende Gründe: Die gesamte Literatur für die im Buch behandelten Systeme und Funktionen ergibt einen Stapel von ca. einem halben Meter Papier. Daraus einen Extrakt zu bilden, wäre sehr schwierig und müsste zwangläufig lückenhaft bleiben. Deshalb verzichte ganz auf eine komplette Befehlssammlung. Stattdessen gebe ich Ihnen Hinweise, wie Sie an die ausfuhrlichen Beschreibungen für ein bestimmtes Teilgebiet, das wir im Buch behandeln, kommen. Die wichtigen Befehle und Funktionen werde ich allerdings in aller Ausführlichkeit beschreiben. Auf den folgenden Seiten nenne ich Ihnen die wichtigsten Informationsquellen, die Sie bei der täglichen Arbeit nutzen können:
1.15 Informationsquellen
1.15.1
23
Das MVS/QuickRef Informationssystem
Siehe hierzu die Beschreibung im Kapitel „MVS/QuickRef' auf Seite 22. Mit diesem Hilfsmittel kommen Sie durch einen PF Tastendruck an folgende Informationen: • •
Erklärungen von Fehlerkodes für alle MVS Systeme und dessen Subsysteme wie z.B.: MVS, JES2/3, ISPF, SDSF, DB2 usw. Beschreibung von Befehlen wie z.B. für: COBOL, PL1, REXX, ISPF, JCL, TSO, DB2, SQL usw.
Für mich ist QuickRef zurzeit das wichtigste Hilfsmittel bei der Arbeit unter MVS. Außerdem stehen darin immer die neuesten Informationen zur Verfugung. In MVS QuickRef werden die originalen Texte aus den Broschüren der Hersteller angezeigt. Wie Sie dieses System effizient nutzen können, sehen Sie in dem Kapitel „PF Taste für den Aufruf von MVS/QuickRef ab Seite 76.
1.15.2
Das Internet
Die Hersteller gehen mehr und mehr dazu über, ihre gesamte Literatur kostenlos im Internet anzubieten. Haben sie doch ein elementares Interesse daran, dass ihre Systeme möglichst optimal genutzt werden. Zu diesem Thema habe ich ja schon weiter oben etwas gesagt. Da heute jeder, der am MVS arbeitet, auch gleichzeitig am selben Terminal ins Internet gehen kann, ist dies eine schnelle und effiziente Informationsquelle auch für Systemliteratur. Häufig finden Sie in „User Groups" und Diskussionsforen eine Fülle von Beispielen und Anregungen. Allerdings muss ich zugeben, dass es dort auch manche etwas fragwürdige Beispiele und Tipps gibt. Bisher habe ich noch sehr wenige dieser Programme ohne Änderungen auf meinen Systemen ausfuhren können. Manche Programme musste ich noch erheblich anpassen und von Fehlern befreien, bevor ich sie tatsächlich nutzen konnte. Tipp Bevor Sie ein Programm einsetzen, das Sie aus dem Internet bezogen haben, sollten Sie es gründlich testen.
1.15.3
Die Handlungsanleitungen und Programmbeispiele
Wie heißt es so schön? „Ein Bild sagt mehr als tausend Worte." In unsere Welt der Programmierung und Bedienung des ISPF übertragen, könnte man dann sagen: „Wo habe ich das schon einmal gemacht?" Dieses Buch soll Ihnen an Hand von beispielhaften Handlungsanleitungen und Programmbeispielen Unterstützung bei Ihrer täglichen Arbeit bieten. Einzelne Befehle nachschlagen können Sie dann schon selbst, wenn Sie wissen, wo Sie diese finden und welche Befehle Sie einsetzen können, um ein bestimmtes Ergebnis zu erzielen. Da in den meisten Beschreibungen zu einzelnen Befehlen in den offiziellen Broschüren oft nur Beispiele zu genau diesem Befehl zu finden sind, war es mir wichtig, die Beispiele so zu gestalten, dass die Befehle im Verbund mit anderen Befehlen innerhalb eines kompletten
24
1 Einleitung
Programms zu sehen sind. Damit können Sie diese Beispiele direkt als Vorlagen zur Entwicklung eigener Programme benutzen.
1.15.4
Die Original System Literatur der IBM
Diese Literatur habe ich Ihnen bereits im Kapitel „Die ISPF Literatur der Firma IBM im Internet" auf Seite 9 vorgestellt. Tipp Wenn Sie einen Befehl nachschlagen müssen, lesen Sie immer in der neuesten Originalliteratur nach! Dort sind nicht nur alle Optionen eines Befehls beschrieben, sondern auch die aktuellen. In der Regel finden Sie da auch noch Beispiele, die dort allerdings manchmal etwas dürftig ausfallen. Aber Sie haben ja dieses Buch. Wenn ich hier etwas beschreibe, dann ausfuhrlich und mit kompletten Beispielen!
1.16
Die LANZ MVS Utilities
Während meiner Tätigkeit als Dozent, System Integrator und Programmierer sind eine Reihe von Verfahren und Programmen im MVS Umfeld entstanden, die meine Arbeit wesentlich erleichtert und beschleunigt haben. Es handelt sich dabei zum einen um Programme, die völlig alleine stehen und einzelne Funktionen ausführen, zum anderen aber auch um ganze Anwendungen. Die Programme sind alle in REXX geschrieben und sie nutzen Elemente aus dem ISPF Funktionsvorrat, wie z.B. Panels, Tables, Messages. Diese Programme liegen auf einer CD diesem Buch bei. Sie können die Files auf Ihr MVS System übertragen und dort dann nutzen. Wie Sie das bewerkstelligen, werden wir in einem späteren Kapitel behandeln. Da alle Programme im Quellkode vorliegen, können Sie diese auch Ihren Bedürfnissen anpassen.
2
Technische Grandlagen
Obwohl ich weiter oben darauf hingewiesen habe, dass der Benutzer dieses Buches einige technische Grundlagen zum z/OS MVS und zum ISPF bereits kennen sollte, möchte ich hier doch noch einige wichtige Dinge behandeln.
2.1
Namenskonventionen der Dateien
Bevor wir uns in einem späteren Kapitel mit dem DSLIST Utility (Data Set LIST Utility) beschäftigen können, müssen wir die Namenkonventionen, die im z/OS MVS gelten, genauer anschauen, denn das DSLIST Utility ist das zentrale Utility zur Anzeige von Dateinamen zum Zweck der weiteren Bearbeitung der dahinter liegenden physischen Dateien. Ich gehe davon aus, dass Ihnen dieses Thema vertraut ist und Sie die Namenskonventionen für Dateinamen im z/OS MVS kennen. Hier nochmals das Wichtigste zu den DSN (Date Set Names): Ein DSN • ist ein durch Punkte und Qualifiers, die maximal je acht Stellen lang sein können, unterteilter Name für eine Datei. • kann maximal 44 Zeichen lang sein, einschließlich der Trennpunkte zwischen den Qualifiers, aber ohne die eventuell benutzten Hochkommata und ohne einen eventuell vorhandenen Membernamen. • besteht aus mindestens zwei Qualifiers, die maximal je acht alphanumerische Zeichen enthalten können, wobei das erste Zeichen vom Typ Alpha sein muss. Die Gesamtanzahl der Qualifiers kann zwar beliebig sein, ist aber durch die maximale Länge eines DSN begrenzt. Somit kann die maximale Anzahl von 22 Qualifiers nicht überschritten werden, da ja zu jedem Qualifier (bis auf den ersten) immer ein Trennpunkt und mindestens ein Zeichen gehört. •
kann am Schluss einen durch Klammern eingeschlossenen Membernamen enthalten.
Beispiele von Dateinamen LANZT.LOGON.CLIST PROX. LOGON. PANEL (HUGO) PXXO.S030908.WHA59.NSDWH1.D0908.T143510.$$$$ A.B.C.D.E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.T.Ü.V 5...10...15...20...25...30...35...40...45
= 44 Zeichen = 22 Qualifiers
Die Qualifiers werden dazu benutzt, um den DSN zu strukturieren. Dabei spielen zwei der Qualifiers eine wichtige Rolle für die Behandlung der Dateien im z/OS MVS:
26
2.1.1
2 Technische Grundlagen
Der High Level Qualifier (HLQ)
Der erste Qualifier wird als „High Level Qualifier" (HLQ) bezeichnet. Dieser Qualifier ist als Alias im Master Catalog des z/OS MVS eingetragen. Der Alias Eintrag im Master Catalog zeigt als eine Art Pointer auf einen User Catalog. Alle Dateien mit demselben HLQ werden in diesem User Catalog katalogisiert. Normalerweise kann ein TSO User nur Dateien anlegen, deren HLQ durch einen Alias Eintrag im Master Catalog auf einen User Catalog zeigt und fur deren HLQ er im RACF (Resource Access Control Facility) die ALTER Berechtigung besitzt. Möchte ein normaler TSO User eine Datei anlegen, deren HLQ nicht als Alias im Master Catalog gefunden wird, dann versucht das MVS diese Datei direkt im Master Catalog zu katalogisieren. Da ein normaler TSO User in der Regel keine UPDATE Berechtigung für den Master Catalog besitzt, wird dieser Versuch vom RACF zurückgewiesen. An diesem Verhalten des Systems können Sie leicht erkennen, dass Sie versucht haben, eine Datei mit einem nicht gültigen HLQ anzulegen.
2.1.2
Der Last Level Qualifier (LLQ)
Der letzte Qualifier hat eine ganz besondere Bedeutung im ISPF. Vor allem dann, wenn es sich bei der Datei um einen PDS (Partitioned Data Set) handelt, in dem Quellkode Members stehen. Diesem Last Level Qualifier kann man nämlich Darstellungseigenschaften für den ISPF Editor zuweisen, die allen Dateien eigen sind, die diesen LLQ benutzen (z.B.: besondere Eigenschaften für REXX, JCL, COBOL usw.). Der LLQ spielt auch in der Behandlung von Dateien im SMS (Storage Management Service) gelegentlich eine Rolle. Den LLQs kann man im SMS Dateieigenschaften zuweisen, die beim Anlegen von Dateien als Standardwerte benutzt werden.
2.2
Dateitypen im ISPF
Bevor wir uns in den folgenden Kapiteln mit der Verarbeitung von Dateien im ISPF genauer auseinandersetzen werden, möchte ich hier kurz die Dateitypen besprechen. Ausführliche Informationen über Dateitypen finden Sie in der IBM Broschüre: z/OS DFSMS: Using Data Sets, Form Nr. SC26 -7410
2.2.1
Die Partitioned Data Sets (PDS und PDSE)
Dies ist der Dateityp, den wir bei unserer Arbeit im ISPF am häufigsten benutzen. PDS ist die Abkürzung für: Partitioned Data Set. PDS Dateien sind, wie es der Name schon sagt, unterteilte Dateien, die nur auf Platten gespeichert werden können. Die Unterteilung geschieht dadurch, dass in einem PDS Datenteile angelegt werden können, denen ein Name zugewiesen wird. Diese Datenteile nennt man Members. Die Daten der Members stehen im Datenbe-
2.2 Dateitypen im ISPF
27
reich der Datei, die Membernamen befinden sich in einer Directory, die ebenfalls im Datenbereich der Datei angesiedelt ist. In der Directory stehen die bis zu acht Stellen langen alphanumerischen Membernamen und dazu die Informationen, wo sich der Datenbereich, der zu diesem Member gehört, befindet. Optional können auch noch weitere Informationen über das Member in der Directory enthalten sein, nämlich die Member Statistics oder spezielle Informationen über Members in Load Libraries. Es gibt zwei Typen von Partitioned Data Sets, nämlich PDS und PDSE. PDSE steht für: Partitioned Data Set Extended. Die beiden Typen unterscheiden sich in der Art der physischen Speicherung auf der Platte und vor allem darin, wie die Daten der Members in den Datenbereich geschrieben werden, wie die Directory abgelegt und gehandhabt wird und wie viele Erweiterungsbereiche (EXTENTS) angelegt werden können. Members von PDS und PDSE können wie sequentielle Dateien verarbeitet werden. Bei der Zuordnung muss lediglich der Membername in den DSN aufgenommen werden. Dies wollen wir uns einmal für die Definition im TSO mittels ALLOC und für die Definition in einem Batch Job mittels DD Statement ansehen: TSO Job
2.2.2
ALLOC DD(IN) DSN('PROX.USER.REXX(HUGO)') SHR REUSE //IN DD DISP=SHR,DSN=PROX.USER.REXX(HUGO)
Die normalen PDS
Diese Art der PDS ist schon seit vielen Jahren im MVS in Betrieb. Die Directory eines normalen PDS befindet sich am Beginn des ersten Extents (Datenabschnitt der Datei auf der Platte) in Form von 256 Byte langen physischen Datensätzen, deren Anzahl beim erstmaligen Anlegen des PDS durch die Angabe einer Anzahl von Directory Blocks festgelegt wird. In jedem dieser Directory Blocks werden Members eingetragen, bis der Block voll ist. Die Einträge sind unterschiedlich lang, je nachdem, ob es sich um ein Member mit Statistics, um ein Member ohne Statistics oder um die Einträge für die Members einer Ladebibliothek handelt. Sortierreihenfolge der Membernamen in der Directory Die Membernamen werden in der Directory in aufsteigender Sortierreihenfolge ihres Namens eingetragen. Wenn man ein Member Verzeichnis mit dem ISPF, einem Utility oder einem Programm einliest, sind die Membernamen immer in aufsteigender Sortierreihenfolge ihres Namens angeordnet. Eine Directory kann nicht erweitert werden. Wenn sie voll ist, können keine weiteren Members mehr in den PDS gespeichert werden. Es gibt aber Utilities am Markt, die ein Member Verzeichnis dynamisch erweitern können, wie z.B. das Utility PDSFAST von der Firma „Software Engineering of Amerika" (SEA). Beim Speichern eines neuen Members und beim Zurückschreiben eines schon vorhandenen Members werden die Daten immer an das Ende des Datenbereichs angefügt. Dadurch erwei-
28
2 Technische Grundlagen
tert sich der Datenbereich, und zwar solange, bis 16 Extents erreicht sind oder die Platte, auf der sich der PDS befindet, voll ist. Wenn eine dieser Grenzen erreicht ist, können weder Members neu gespeichert werden, noch können vorhandene Members nach einer Änderung durch den Editor zurückgeschrieben werden. Die durch diese Technik entstehenden Lücken im Datenbereich des PDS kann man mit einem COMPRESS, der auch online im ISPF durchgeführt werden kann, wieder beseitigen. Das heißt beim Compress wird der Datenbereich eines PDS wieder zusammen geschoben, so dass im Datenbereich keine Lücken mehr vorhanden sind. Die Directory bleibt beim Compress in ihrer Größe bestehen. In den Member Entries, die zu den beim Compress verschobenen Datenbereichen gehören, werden lediglich die neuen Positionen der Daten nachgetragen. Diese Technik des Anhängens der Daten eines neuen oder geänderten Members an den Datenbereich hat zwei ganz wichtige Vorteile: 1. Ein PDS kann von mehreren LPARS gleichzeitig konkurrierend benutzt werden. 2. In die Ladebibliotheken von Transaktionssystemen wie CICS oder IMS kann man neue Versionen von Programmen installieren, ohne dass diese sofort aktiv werden. Da ja der alte Lademodul immer noch an seiner, beim Hochfahren des Transaktionssystems bekannten und von diesem erfassten Position verbleibt und auch nicht verändert wird, nutzt das Transaktionssystem diesen alten Modul so lange, bis durch einen Eingriff im Transaktionssystem selbst, von diesem auf den neuen Modul umgeschaltet wird. Im CICS nennt man diesen Vorgang der Aktivierung eines neuen Lademoduls „NEWCOPY". Natürlich kann ein PDS, der an Transaktionssystemen hängt, nur compressed werden, wenn vorher alle Systeme herunter gefahren sind, in denen der PDS zugeordnet (allocated) ist. Für das Anlegen und die Verarbeitung von PDS/PDSE gelten folgende Regeln für die Dateistruktur: LRECL:
0 bis 32760 Bytes
RECFM:
F, FB, FBA, V, VB, VBA, U
DSORG:
immer PO
Und die folgenden Regeln für die Dateigröße: Cy linders:
1 bis 4369
Tracks:
1 bis 65535
Falls Sie einige der obigen Fachbegriffe und Abkürzungen noch nicht kennen, schauen Sie in der IBM Broschüre z/OS DFSMS: Using Data Sets, Form Nr. SC26 -7410 nach.
29
2.2 Dateitypen im ISPF Beispiel: Data Set Information eines PDS Data Set Information Command = > Data Set Name
. . . .
General Data Management class . . Storage class . . . Volume serial . . . Device type . . . . Data class Organization . . . Record format . . . Record length . . . Block size . . . . 1st extent cylinders Secondary cylinders Data set name type Creation date . . . Expiration date . .
SMQP.USER. REXX.PDS
**None** DPPOOL D1D15D 3390 **None** PO FB 80 27920 100 50 PDS 2004/03/12 ***None***
Current Allocation Allocated cylinders Allocated extents . Maximum dir. blocks
Current Utilization Used cylinders . . Used extents . . . Used dir. blocks Number of members .
Referenced date . .
M
i 100
p f 72 (427
2004/03/12
Abbildung 12 Anzeige der Data Sei Information eines PDS
2.2.3
Die Partitioned Data Set Extended (PDSE)
Die Zugriffsmethode DATA IN VIRTUAL Mitte der 80er Jahre des vorigen Jahrhunderts wurde von der IBM im MVS eine ganz neue Dateitechnik eingeführt, genannt „DATA IN VIRTUAL". Diese Technik unterscheidet sich von allen bis zu diesem Zeitpunkt bekannten Speichertechniken ganz entscheidend: Die Daten sind nicht mehr in physische und logische Sätze aufgeteilt, sondern existieren nur noch in Form von Tabellen. Diese Tabellen werden auf der Platte physisch in 4-KB Blöcken gespeichert, und sie stellen nichts anderes dar als einen speziellen Page Data Set. Bei der Verarbeitung im Programm werden die Daten einer DATA IN VIRTUAL Datei wie eine im Speicher vorhandene Tabelle „gesehen" und auch so verarbeitet. Das MVS sorgt dafür, dass beim Zugriff auf eine bestimmte Adresse der Tabelle die zugehörige 4-KB Page im Speicher vorhanden ist. Ich habe damals schon sehr frühzeitig mit dieser Zugriffstechnik gearbeitet und ich muss sagen: Das ist eine tolle Sache! Diese neue Technik der Dateiorganisation wird z.B. für die folgenden Dateitypen benutzt: • •
VSAM Linear Data Sets zur Speicherung von DB2 Tabellen. Partitioned Data Set Extended (PDSE).
Wenn Sie aber jetzt glauben, dass sich die Verarbeitung von PDSE wesentlich von derjenigen der PDS unterscheidet, dann kann ich Sie beruhigen:
30
2 Technische Grundlagen
Verarbeitung von PDS versus PDSE Die Firma IBM hat die Verarbeitung von PDSE so elegant im MVS verankert, dass Sie bei der Benutzung der PDSE keinen Unterschied gegenüber den PDS merken, außer natürlich beim Anlegen der PDSE. Diese Integration geht sogar so weit, dass man, genau wie beim PDS, die Directory mit ihrem 256 Byte langen Datensätzen auch aus einem PDSE lesen und verarbeiten kann. Vorteile eines PDSE: • • •
Die Directory ist physisch im Datenbereich integriert. Dadurch gibt es für die Anzahl der Member Einträge keine Beschränkung. Es können bis zu 123 Extents auf einer Platte für einen PDSE angelegt werden. Ein PDSE kann und braucht nicht compressed zu werden.
Nachteile eines PDSE: •
•
Ein PDSE darf niemals von mehreren LP ARS konkurrierend beschrieben werden. Dies würde den Aufbau der Daten im Datenbereich zerstören, so dass er nicht weiter benutzbar ist. Solche Fälle habe ich schon erlebt! Die Verarbeitungsgeschwindigkeit eines sehr großen PDSE mit vielen tausender Members ist erheblich langsamer als bei einem PDS mit gleichem Inhalt.
Beispiel: Data Set Information eines PDSE Ich habe den oben bereits behandelten PDS in einen PDSE umgespeichert. Dessen Charakteristiken sehen Sie jetzt hier: Data Set Information Command ===> Data Set Name General Data Management class . . Storage class . . . Volume serial . . . Device type . . . . Data class Organization . . . Record format . . . Record length . . . Block size . . . . 1st extent cylinders Secondary cylinders Data set name type Creation date . . .
SMQP. USER. REXX PDSE **None** DPPOOL D1D110 3390 **None** PO FB 80 27920 100 50 LIBRARY 2002/09/16
Current Allocation Allocated cylinders Allocated extents . Maximum dir. blocks Current Utilization Used pages . . . . % Utilized . . . . Number of members .
Referenced date . .
Abbildung 13 Anzeige der Data Set Information eines PDSE
r
100 NOLIMIT
9,279 51 427
2004/03/12
2.2 Dateitypen im ISPF
31
Wenn Sie die beiden Ausdrucke vom PDS und dem PDSE vergleichen, sehen Sie, dass der PDS für die gleichen Daten etwas weniger Platz benötigt, als der PDSE. Da aber die Vorteile bei einer solchen Dateigröße auf der Seite des PDSE liegen, benutze ich den Dateityp PDSE wo immer es geht. Merksätze zu der Benutzung von PDS versus PDSE •
• •
•
Für Ladebibliotheken in Transaktionssystemen wie z.B. CICS oder IMS muss man immer PDS benutzen, damit während der Online Zeit auch Programme ersetzt werden können. Für Bibliotheken, die von mehreren LPARS aus beschrieben werden, muss man PDS benutzen. Für Bibliotheken im ISPF, die nur in einer LPAR benutzt werden, bietet sich die Verwendung von PDSE an, da diese nicht compressed werden müssen und so lange Members eingefugt werden können, bis der Gesamtdatenbereich voll ist. Die Verarbeitungsgeschwindigkeit ist bei PDSE merklich langsamer, wenn sehr viele Members enthalten sind (mehrere tausend).
Tipp Falls Sie mit den Unterschieden zwischen Partitioned Data Sets (PDS) und den Partitioned Data Sets Extended (PDSE) noch nicht so vertraut sind und Ihnen meine dazu gemachten Aussagen nicht genügen, empfehle ich Ihnen, in der IBM Broschüre DFSMS/MVS Using Data Sets im Kapitel „Processing a Partitioned Data Set Extended (PDSE)" nachzulesen.
2.2.4
Sonstige Dateien
Sequential Data Sets Dieser Dateityp spielt im ISPF keine große Rolle. Dateien dieses Typs können natürlich vorkommen und auch mit ISPF direkt verarbeitet werden. Wenn Sie mehr darüber wissen wollen, empfehle ich Ihnen die oben genannte Broschüre. Die LOG- und LIST Data Sets des ISPF sind vom Typ Sequential. VSAM Dateien Dieser Dateityp kann im ISPF von keiner Standardfunktion, wie z.B. EDIT oder BROWSE verarbeitet werden. VSAM Dateien können nur durch entsprechend geschriebene Programme verarbeitet werden. DB2 Datenbanken Hierfür gilt im Prinzip das Gleiche, wie für VSAM Dateien. Für beide Dateisysteme gibt es aber im MVS verschiedene, auch unter ISPF aufrufbare, Utilities. Extended Format Data Sets Dies ist der zurzeit neueste Dateityp. Wenn Sie mehr darüber wissen wollen, empfehle ich Ihnen die oben genannte Broschüre.
32
2 Technische Grundlagen
2.2.5
Größe von Plattendateien im MVS
Sie haben sich vielleicht schon einmal die Frage gestellt: „Wie groß kann eine Plattendatei im MVS denn werden?" Eine Plattendatei im z/OS MVS kann niemals größer werden als 65.535 Tracks, es sei denn es handelt sich um einen Extended Format Data Set. Der kann beliebig groß werden und sich über beliebig viele Platten erstrecken. Diesen Dateityp werden wir hier nicht besprechen. Ob man auf einer Platte eine Datei mit 65.535 Tracks anlegen kann, hängt auch vom verwendeten Plattentyp ab. Nachdem es bis vor einigen Jahren als größte Platte nur die Platte vom Typ 3390-3 gab, die lediglich 50.085 Tracks Gesamtkapazität hat, sind inzwischen Platten mit einem weitaus größeren Fassungsvermögen vorhanden, wie z.B. der Typ 3390-9. Diese Platte hat eine Gesamtkapazität von 150.255 Tracks. Auf Grund der Beschränkung, dass sich ein PDS/PDSE niemals auf mehr als einer Platte ausdehnen kann, ist bei der Verwendung des Plattenmodells 3390-3 dort auch keine größere PDS/PDSE Datei als eine solche mit 50.085 Tracks möglich. Bei der Berechnung der Gesamtgröße einer PDS/PDSE Datei spielt es keine Rolle, aus wie vielen Extents die Datei besteht. Die Summe der Tracks aus Primary Space und allen Secondary Extents darf die Grenze von 65.535 Tracks nicht übersteigen
2.3
Concatenated Data Sets
Das z/OS MVS bietet die Möglichkeit mehrere physische Dateien zu einer logischen Datei zu verknüpfen, die dann über einen DD Namen bei der Verarbeitung angesprochen werden können. Eine ausfuhrliche Beschreibung über Concatenated Data Sets finden Sie in der Broschüre: DFSMS/MVS Using Data Sets Folgende Typen von Dateien können verknüpft werden: • •
Sequential Data Sets Partitioned Data Sets
Auf Grund ihrer völlig unterschiedlichen Dateicharakteristiken ist es natürlich klar, dass diese beiden Typen innerhalb einer Verknüpfung keinesfalls gemischt werden können. Regel Alle Concatenated Data Sets können nur im Lesezugriff geöffnet werden. Sie können niemals für die Ausgabe benutzt werden.
2.3 Concatenateci Data Sets
2.3.1
33
Definition von Sequential Concatenated Data Sets
Zwei oder mehr Sequential Data Sets können zu einer Gruppe von Concatenated Data Sets zusammengefasst werden. Diese Technik nennt man „Sequential Concatenation". Ein Programm kann eine Gruppe von Dateien einer Sequential Concatenation wie eine einzige Datei einlesen und verarbeiten. Bei der Nutzung einer Sequential Concatenation sind folgende Regeln zu beachten: • • •
Das Satzformat muss bei allen Dateien vom gleichen Typ sein. Beim Satzformat FB muss die Satzlänge aller Dateien gleich sein. Die maximal zulässige Anzahl von Dateien in einer Concatenation darf nicht überschritten werden. Diese maximale Anzahl ist in dem Parmlib Member ALLOCxx fur jede LPAR definiert. Siehe hierzu das Kapitel „Das Parmlib Member ALLOCxx anzeigen" ab Seite 194.
2.3.2
Definition von Partitioned Concatenated Data Sets
Auch die PDS/PDSE können zu Concatenated Data Sets zusammengefasst werden. Dabei können PDS und PDSE gemischt vorkommen. In diesem Buch werde ich nur die Verknüpfung von PDS/PDSE behandeln. Hier einige Beispiele für typische Concatenated Data Sets, wie Sie im ISPF vorkommen: //SYSPROC II II* //ISPLLIB II II //
DD DISP=SHR,DSN—TESTO.TSO.USERPROC DD DISP=SHR,DSN=ISP.SISPCLIB.VB DD DD DD DD
DISP=SHR,DSN=TEST1.PANVA1ET.CAILIB DISP=SHR,DSN=SYS1.DGTLLIB DISP=SHR,DSN=SYSPT.CAI.CAIISPL DISP=SHR, DSN=PLI. V2R3M0 . SIBMLINK
Abbildung 14 Definition von Concatenated Data Sets mittels JCL
Ich möchte hier nochmals darauf hinweisen, dass Concatenated Data Sets nur als Eingabedateien benutzt werden können. Würde man sie auch zur Ausgabe von Daten benutzen wollen, entstünde das Problem, in welche physische Datei der Kette denn geschrieben werden soll. Deshalb können Concatenated Data Sets nur als Eingabedateien geöffnet werden. Wozu sind Concatenated Data Sets zu gebrauchen? Sequential Concatenated Data Sets benutzt man, um eine Reihe einzelner, physischer Dateien „am Stück" einzulesen. Für das Programm stellt sich die Kette einzelner Dateien dann als eine Datei dar. Beim Lesen im Programm werden die einzelnen Dateien von vorne nach hinten entsprechend ihrer Position in der Verkettung der Dateien verarbeitet. Eine DateiendeBedingung wird vom System erst gemeldet, wenn das Ende der letzten Datei in der Dateikette erreicht ist.
34
2 Technische Grundlagen
Partitioned Concatenated Data Sets werden benutzt, um Members in der Kette der physischen Dateien von vorne beginnend zu suchen und zu verarbeiten, sei es als auszuführende Prozeduren oder als Eingabedaten. Beim Suchen der Members werden die einzelnen Dateien von vorne nach hinten durchsucht. Das zuerst gefundene Member wird benutzt. Gleichnamige, weiter hinten in der Dateikette stehende Member, werden nicht erreicht. Tipp In einer Kette von Concatenated Data Sets dürfen Sequential Data Sets und Partitioned Data Sets niemals gemischt vorkommen.
2.4
Abkürzungen
Die folgende Tabelle enthält die wichtigsten Abkürzungen, die im Zusammenhang mit Dateien im MVS gebräuchlich sind. Abk. DSN PDS PDSE HLQ LLQ VOLSER ENQ DEQ DSLIST
Voller Name Data Set Name Partitioned Data Set Partitioned Data Set Extended High Level Qualifier Last Level Qualifier Volume Serial Number enqueue dequeue Data Set List
Beschreibung Name einer Datei Unterteilte Datei Erweiterte unterteilte Datei 1. Teil eines DSN Letzter Teil eines DSN Plattenname Fachwort für das Festhalten einer Ressource Fachwort für das Freigeben einer Ressource Zusammenfassung mehrerer DSN in einer Liste
Tabelle 2 Abkürzungen englischer Begriffe
2.5
IBMs Terminlogy
Falls Sie einmal einen englischen Begriff aus der Welt der z/OS Systeme oder auch anderer Systeme suchen, schauen Sie doch mal in der folgenden Internet-Adresse nach: http://ibm.com/ibm/terminology Dort finden Sie bestimmt alles, was Sie jemals zum Thema englische Fachbegriffe interessieren könnte.
3
Das TSO/ISPF Logon Verfahren
Bevor man mit dem ISPF arbeiten kann, muss man erst einmal an das System „ran" kommen. Dazu dient das Logon Verfahren. Wenn man dann glücklich im ISPF angekommen ist, hat man folgende Schritte durchlaufen: 1. Die 3270-Emulationssoftware hatte bei ihrem Aufruf unter dem PC-System eine Verbindung zum VTAM der MVS Welt hergestellt. 2. Das TPX stellte uns den Zugriff zu den einzelnen TSO Subsystemen in den MVS LPARs zur Verfügung und startete auf Wunsch in jeder MVS LP AR das TSO Logon fur unseren User. 3. Das LOGON im TSO stellte uns einen MVS Adressraum bereit. 4. Der Aufruf von ISPF innerhalb unseres TSO Adressraumes brachte uns in das „Primary Option Menu" des ISPF.
3.1
Die 3270-Emulations-Software
Wenn man von einem PC aus auf einen MVS Host zugreifen will, benötigt man eine Emulations-Software für die 3270-Protokolle. Diese Software gibt es von verschiedenen Herstellern. Ich möchte mich in diesem Buch auf die von der IBM stammende „eNetwork Personal Communications" Software beschränken. Im folgenden Text werde ich für diese Software die Abkürzung PCS verwenden. Die hier beschriebenen Verfahren und Möglichkeiten der PCS können sicherlich auch mit anderen 3270-Emulations-Softwaresystemen realisiert werden. Eine ausführliche Beschreibung des gesamten Komplexes der 3270-Emulations-Software finden Sie im Internet unter: http://www-306.ibm.com/software/network/commserver/ library/publications/csnt_60/csqkb/quick02.htm#ToC_157
3.1.1
Aufruf der IBM 3270-Emulations-Software
Wenn Sie die IBM PCS starten, dann bekommen Sie zunächst vier oder auch mehr 3270Sitzungen geliefert, die sich blitzartig auf Ihrem PC Desktop breit machen. Das überrascht zunächst etwas, denn Sie sehen buchstäblich den Wald vor lauter Bäumen nicht mehr und sind verunsichert, in welchem Fenster sie nun weiter machen sollen. Diese vielen Fenster
36
3 Das TSO/ISPF Logon Verfahren
werden mit den Buchstaben A, B , usw. gekennzeichnet. Wo kommen diese Fenster alle her und wozu sind sie erforderlich? Um dies zu ergründen, müssen wir uns den Aufruf der PCS vergegenwärtigen: Auf meinem PC Desktop Menü befindet sich ein Button mit der Bezeichnung TN3270A. Über diesen Button rufe ich die 3270-Emulation auf. Wir wollen uns das zugehörige Kontext Menü einmal genauer ansehen:
Eigenschaften von TN3270-A Allgemein
Verknüpfung
Sicherheit j
TN3270-A
Zieltyp:
BCH-Datei
Zielort:
private
Ziel:
jme\Personal Communications\private\tn3270a.bch"
Arbeits Verzeichnis:
|C: \Programme\Personal Communications\private' 1
Tastenkombination: jKein Ausführen:
Normales Fenster
Ziel suchen...
OK
~3
Anderes Symbol...
Abbrechen
Abbildung 15 Eigenschaften von einem 3270-Emulationsbildschirm
In dem Kasten „Ziel:" ist die Datei ...\tn3270a.bch angegeben. Der Inhalt dieser Datei bestimmt, wie viele und welche 3270-Emulationssitzungen gestartet werden.
3.1 Die 3270-Emulations-Soflware
37
Und jetzt schauen wir uns den Inhalt der Datei tn3270a.bch an: [Profile] id=BCH Description= [Batch] Runl=; Wenn eine vorhandene Stapeldatei geändert werden Run2=; soll, [Datei] - [Öffnen] auswählen. Run3=; Run4=; Wenn Datenstationsprofile oder andere Run5=; Programme in die Stapeldatei aufgenommen Run6=; werden sollen, müssen diese im Editierbereich Run7=; eingegeben werden. Hierzu auf den Dateinamen Run8=; im Listenfenster doppelklicken oder ihn auswählen Run9=; RunlO=; und 'Hinzufügen' auswählen. Zum Unterdrücken des Runll=; IBM Logos im Befehl für die erste Sitzung /Q hinzuRunl2=; fügen. Diese Anmerkungen NICHT löschen, sie werden Runl3=; Runl4=; beim Ausführen der Stapeldatei ignoriert. Runl5=; Runl6=; C:\prograiratie\personal coramunications\pcsws.exe "C:\programme\personal communications\private\tn3270a.ws" Runl7=; C:\programme\personal communications\pcsws.exe "C:\progranime\personal communications\private\tn32 7 Ob.ws" Runl8=C:\Programme\Personal Communications\pcsws.exe "C:\Programme\Personal Conimunications\PRIVATE\tn3270a. ws " Runl9=; C:\programme\personal communications\pcsws.exe "C:\programme\personal communications\private\tn3270d.ws" Run20=; c:\prograiiime\personal communications\pcsws.exe "C:\programme\personal communications\private\tn32 70p.ws"
Wenn man den Button mit dem Aufruf von tn3270a.bch startet, dann wird die obige Datei von der PCS gelesen und die darin enthaltenen Definitionen werden umgesetzt. Mit den Zeilen Runl=... bis Run20=... könnten insgesamt zwanzig 3270-Sitzungen gestartet werden. Da ich aber nur eine Sitzung starten will, habe ich alle anderen Startanweisungen auf Kommentar gesetzt. Dies geschieht dadurch, dass man hinter „Run=" ein Semikolon setzt. Das Semikolon sagt dem Befehlesinterpreter, dass hier ein Kommentar beginnt. In meinem Fall wird also nur die Sitzung mit dem Buchstaben A gestartet. Wie Sie erkennen können, steht am Schluss des grau unterlegten Aufrufs die Datei tn3270a.ws. Diese Datei enthält alle Optionen für die 3270-Sitzung. Da diese Steuerdatei ziemlich umfangreich und sehr kryptisch aufgebaut ist, möchte ich hier nicht weiter darauf eingehen. Hinweis Wann brauchen Sie mehrere PCS Bildschirme und wann nur einen? 1. Wenn auf Ihrem Host Systemen kein TPX (siehe hierzu das Kapitel „Logon unter Verwendung von TPX" ab Seite 38) oder ein ähnliches System installiert ist, dann können Sie mithilfe der verschiedenen 3270-Bildschirme zu mehreren Host Anwendungen eine Verbindung herstellen. 2. Wenn auf Ihren Host Systemen aber TPX oder ein ähnliches System installiert ist, dann können Sie darüber die Verbindung zu den verschiedenen Online Systemen in mehreren LPARs herstellen. Sie benötigen in diesem Fall nur einen 3270-Bildschirm in der PCS.
38
3 Das TSO/ISPF Logon Verfahren
Wenn die 3270-Emulation die Verbindung zu einem Host gefunden hat, dann erscheint das folgende Menü: fj m p m a p a i i ^ ^ Datei
Bearbeiten
Übertragung
Darstellung
Kommunikation
Funktionen
Fenster
Hie
SIE SIND MIT DEM RECHNER VERBUNDEN. BITTE IHRE EINGABE :
Verbindung zum feinen ¿eivw/Hoü TN3270a s TPX08 Schutzwort: PASSWORD Neues Schutzwort: 15:44:30 04/04/04 Abrechnungsnummer: Sitzungsuebernahme: Terminalname: IPC10024 Modell: 3278-4A PFl=Hilfe PF3=Ende Abbildung 17 VTAM-
TPX
Eingabemenü
Wir geben jetzt unsere User ID und das zugehörige Password ein und drücken ENTER. Danach erhalten wir das folgende oder ein ähnliches Bild:
40
3 Das TSO/ISPF Logon Verfahren
TPX MENUE FUER
LANZT
Befehlstaste=PF12/24 Menue tas te=NONE Befehlspraefix=# Sitzung T04 T02 T05 T08 T10 T91 S T03 _ TSOT2 TSOIl
PF-Taste PF 1 PF 2 PF 3 PF 4 PF 5 PF 6 PF 10 PF 13 PF 11
Abbildung 18 TPX
Auswahlmenü
Panelid
- TGE0041
Sprungtaste=NONE Drucktaste=NONE
Beschreibung TSO-XYZ1 TSO-XYZ2 TSO-XYZ3 TSO-XYZ4 TSO Prod: 5 TSO Prod: 6 TSO-LPRT TSO-LPRX DYNAMICALLY ADDED SESSION
Terminal - IPC20077 Model - 3278-4AG System - TPX08
Status
Wir können jetzt mit s eines der Systeme auswählen und ENTER drücken. Wenn es sich bei der Auswahl um ein TSO System handelt, wird jetzt in der ausgewählten LPAR das TSO Logon Verfahren angestoßen. Bereits bei der Anmeldung im TPX müssen Sie Ihr Schutzwort eingeben. Dieses wird beim Logon für die verschiedenen TSO Sitzungen automatisch an das jeweilige TSO Logon Verfahren weitergegeben. Dadurch bekommen Sie das eigentliche TSO Logon Panel während des Logon Prozesses erst gar nicht zu sehen.
3.2.2
Die Steuerung innerhalb von TPX
Dieses Buch soll kein Lehrbuch für das TPX System werden. Trotzdem müssen wir uns jetzt einige grundlegende Dinge, die für die Handhabung von TPX wichtig sind, anschauen. Es sollte ja möglich sein, von einem 3270-Schirm aus mit irgendeiner Eingabe direkt zum TPX Bildschirm zu gelangen, um dort TPX Befehle einzugeben. Zunächst müssen wir uns einmal verdeutlichen, wo das TPX im Datenstrom zwischen Terminal und MVS/TSO/ISPF angesiedelt ist. Wenn wir am 3270-Bildschirm eine Taste drücken, z.B. einen Buchstaben oder eine PF Taste dann soll diese Information letztlich im ISPF landen. Und zwar genau so, wie wir sie eingegeben haben. Auf ihrem Weg zum ISPF muss diese Eingabe aber immer folgende Systeme durchlaufen: 1. 2. 3. 4.
Das PC Betriebssystem Das Netz VT AM TPX
Für jedes dieser Systeme kann man sich eine Methode überlegen, eine bestimmte Eingabe abzufangen und diese als Steuerungsinformation für dieses System zu nutzen. Dass es sich hierbei nicht um ein einziges Zeichen handeln kann, versteht sich von selbst, denn dann könnte man dieses Zeichen ja niemals in das ISPF eingeben, da es ja immer vorher abgefan-
41
3.2 Logon unter Verwendung von TPX
gen würde. Die Lösung für dieses Problem sieht beim TPX so aus, dass man die Kombination von einem Zeichen und einer PF Taste benutzt, wobei die Taste für das Zeichen und die PF Taste jeweils hintereinander gedrückt werden müssen. Bei der Installation von TPX wird diese Tastenkombination für alle Benutzer festgelegt. In unserem Fall handelt es sich um das Nummernzeichen (#) und die Taste PF12. Diese Kombination zeichnet sich dadurch aus, dass sie bei der normalen Bedienung des ISPF nie in der Reihenfolge vorkommen kann. Das Ganze funktioniert dann so: Immer, wenn der Datenstrom zum MVS eine frisch eingetippte Zeichenkette, die mit # beginnt und danach das Drücken der PF 12 Taste enthält, wird diese Information von TPX abgefangen und als ein an TPX gerichteter Befehl interpretiert. Z.B. gelangt man mit #w und anschließendem Drücken der PF 12 Taste immer in das TPX Hauptmenü. Da die Zeichenfolge #w unterwegs abgefangen wird, gelangt sie nie ins ISPF. Man kann sie also überall auf einem ISPF Schirm eingeben, wo eine Eingabe möglich ist. Sie wird bei der Rückkehr aus dem TPX zu diesem Panel aber dort nicht mehr zu sehen sein. Wie können Sie feststellen, welche TPX Steuerzeichen bei Ihnen gelten? Wenn sie bei der Anmeldung im TPX Hauptmenü sind, blättern Sie mit der PF8 Taste so lange nach unten, bis Sie eine Zeile sehen, die unter der Spalte „Beschreibung" den Text „TPX Administration" aufweist. Dort gehen Sie mit dem Cursor an den Anfang der Zeile, geben ein s ein und drücken ENTER. Sie erhalten dann folgendes Eingabemenü: TPX Benutzer-Selbstverwaltung Panelid Userid Terminal Date Time
Auswahl: ===> 1 Userid: LANZT 1 2
TPX Benutzerdefinitionen TPX Sitzungsdefinitionen
3 STX Benutzerdefinitionen 4 STX Sitzungsdefinitionen Sie koennen nur die hervorgehobenen Definitionen aendern. Die Hilfen sind Cursor gesteuert. Bewegen Sie den Cursor in das Feld, fuer das Sie Hilfe benoetigen, und druecken Sie dann PF1. Zunaechst wird ein kurz gehaltener Hilfstext angezeigt. Durch nochmaliges Druecken von PF1 bekommen Sie eine detaillierte Hilfe. Geaenderte Werte werden bei der naechsten Anmeldung in TPX oder STX wirksam. PFl=Hilfe Abbildung 19 TPX
PF3=Ende
PF4=Zurueck
"CANCEL"—Abbruch
Benutzerverwallung
Geben Sie jetzt, wie oben zu sehen, eine 1 ein und drücken Sie ENTER. Sie erhalten danach folgende Anzeige am Bildschirm:
-
TGE0128 LANZT IPC20077 28/01/04 16:50:57
42
3 Das TSO/ISPF Logon Verfahren
Wartung von individuellen TPX Benutzern
Panelid Userid Termid Date Time
Befehl = = > Benutzer: LANZT Telefon:
Name : Ort: Profil Def.
Befehlspraefix: Befehlstaste: Sprungtaste: Menuetaste: Drucktaste:
-
TGE0165 LANZT IPC20077 28/01/04 16:57:22
System Def.
#
PF12/24 NONE NONE NONE
Abbildung 20 TPXBefehlspräfix und Befehlstaste
In den Zeilen Befehlspräfix: und Befehlstaste: finden sie die gesuchten Informationen.
3.2.3
TPX Befehle
Wenn Sie die TPX Befehle anzeigen wollen, geben Sie im TPX Hauptmenü in der Zeile BEFEHL ===> ein h ein und drücken ENTER. Es erscheint dann folgendes Panel mit den TPX Befehlen: HILFE
TPX Befehle
HGEHELPD
Umschalten/Aktivieren von Sitzungen Aktivieren aller Sitzungen Aufruf des TPX Briefkastens Loeschen einer "Dynamischen Sitzung" Temporaere Aenderungen der Definitionen Zurueck zum Anmeldebild - Aktivieren der Sitzung(en) ohne ACL Hilfe Inaktivieren der Sitzung(en) Sprung zur naechsten aktiven Sitzung Zurueck zum VTAM #K Sperren des Sichtgeraets #L Sitzung ausserhalb TPX starten #N Sitzung Drucken eines Bildschirms #P Sitzung Drucker Klasse Senden eines Bildschirms zum Benutzer #Q Sitzung Benutzer Bildschirm nochmals senden #R Start des ACL Programms fuer Sitzung #S Sitzung ACLPGM Stop des ACL Programms fuer Sitzung #V Sitzung Zurueck zum TPX Hauptmenue #W ein. Fuer detaillierte Hilfe geben Sie #H Befehl Um weiterzumachen, bitte ENTER druecken ===> ISitzung #A #B #D Sitzung #E CMD=/CHR==/etc #F #G «H #1
Abbildung 21 TPX Befehle
-
3.2 Logon unter Verwendung von TPX
3.2.4
43
Automatisches Logon für ausgewählte TPX Anwendungen
Man kann sich sein TPX System so einrichten, dass das Logon Verfahren automatisch soweit durchgeführt wird, dass in jeder gewünschten LPAR ein TSO Logon abläuft und ein ISPF Primary Option Menu auf Ihrem Bildschirm steht. Um dieses Ziel zu erreichen, muss man das TPX anweisen, ausgewählte Sitzungen automatisch hochzufahren. Wie das geht, wollen wir uns jetzt anschauen. Wählen Sie in dem bereits weiter oben zu sehenden Panel „Abbildung 19 TPX Benutzerverwaltung" auf der Seite 41 mit der Eingabe einer 2 und ENTER die Selbstverwaltung aus. Es erscheint dann folgende Anzeige am Bildschirm: Wartung von individuellen TPX Benutzern Befehl
= >
Benutzer: LANZT Profil Definitionen Befehlstaste : Sprungtaste Menuetaste Drucktaste Sitzung T02 T03 • T04 T05
System Definitionen
Panelid Userid Termid Date Time
-
TGE0122 LANZT IPC20077 28/01/04 17:12:52
PF12/24 NONE NONE NONE Anwendung
Profil Default TS005 TSOOl TS002 TS003
PF-Taste PF 2 PF 10 PF 1 PF 3
Profil Default PF 2 PF 3 PF 4 PF 5
Menue zeile 002 007 001 003
Profil Default 002 003 004 005
Abbildung 22 Wartung von individuellen TPX Benutzern
Positionieren Sie den Cursor vor diejenige TPX Sitzung, die Sie immer automatisch gestartet haben wollen, geben ein s ein und drücken Sie ENTER wie es in dem Panel oben zu sehen ist.
44
3 Das TSO/ISPF Logon Verfahren
Es erscheint dann folgende Anzeige am Bildschirm: Wartung von individuellen TPX Benutzern Befehl ===> Benutzer: LANZT Sitzung : T04 Anwendung Sitz, ausserh. TPX : Zeitsperre (min) Logmode PF-Taste Start Start ACL Programm ACL Benutzerkennung ACL Schutzwort Stop ACL Programm ACB Maske ACB zugeordnet lassen Unsichtbar PFl=Hilfe
PF3=Ende
Profil Definitionen TS002
PF 1 *
PF 4
Panelid - TGE0167 Userid - LANZT - IPC20077 Termid Date - 28/01/04 Time - 17:17:42 System Anwendungs Definitionen Definitionen MULTIPLE 000480 PF TSOLOG1 TSOOFFT N
—
PF4=Zurueck
—
PF8=Vorwaerts
"CANCEL"=Abbruch
Abbildung 23 Autostart fiir einzelne TPXBenutzer einstellen
Wenn Sie jetzt hinter Start ein Y eingeben und ENTER drücken, dann wird beim nächsten Logon diese Sitzung automatisch gestartet.
3.3
Das TSO starten
Hier erfahren Sie, wie das TSO Logon abläuft und welche Möglichkeiten Sie haben, diesen Ablauf zu gestalten.
3.3.1
Das TSO Logon Panel
Wenn man im TPX eine VTAM Anwendung für eine TSO Sitzung ausgewählt hat, dann wird das automatische Logon für diese TSO Sitzung durchgeführt, wobei die Anzeige des TSO Logon Panels unterdrückt wird. Tipp Sie bekommen das Logon Panel aber zu sehen, wenn Sie im „Primary Option Menü' des ISPF durch Eingabe von x und ENTER das ISPF verlassen und in dem dann erscheinenden TSO Bildschirm LOGON eingeben und ENTER drücken. Dies ist auch der Weg, um ein Logon mit anderen als den Standardparametern durchzuführen.
45
3.3 Das TSO starten Das folgende Bild zeigt das TSO Logon Panel: TSO/E LOGON
Enter LOGON parameters below: Userid
= >
Password
===> *********
RACF LOGON parameters:
USERID
Procedure ===> LOGONXX
New Password ===> Group Ident
===>
Acct Nmbr ===> 09806462 Size
===> 6000
Perform
==>
Command
= >
Enter an 'S' before each option desired below: -Nomail -Nonotice -Reconnect
-OIDcard
PF1/PF13 ==> Help PF3/PF15 ==> Logoff PAI ==> Attention PA2 ==> Reshow You may request specific help information by entering a '?' in any entry field Abbildung 24 TSO Logon Panel
Die grau unterlegten Felder müssen richtig eingegeben werden. Eine weitere Erklärung ist hier nicht notwendig, denn die Bezeichnungen sagen klar, was gemeint ist. Hinter „Procedure" steht der Name der Logon Prozedur. Dies ist der Name eines Members in der Bibliothek für TSO Logon Prozeduren. In der Regel ist das die Datei SYS1.PROCLIB, die es in jedem MVS geben muss. Welche Logon Prozedur Sie nutzen können, erfahren Sie von Ihrer Systemtechnik. Die Zulassung für eine bestimmte Logon Prozedur wird über das RACF kontrolliert. Alle Parameter (außer dem Password) bleiben auch für die zukünftigen Anmeldungen erhalten.
3.3.2
Die TSO Logon Prozedur
Das System stellt nun einen Job zusammen, der in dem TSO Adressraum gestartet wird und der die im Logon Panel genannte Prozedur ausfuhrt. Dieser Job kann wie folgt aussehen: //USERID //LOGONXX
JOB '09806462',REGION=6000K EXEC LOGONXX
Abbildung 25 TSO LOGON Job
Wie Sie sehen, tauchen hier drei, der im Logon Panel eingetragenen Werte wieder auf. Ich habe diese grau unterlegt. Wir wollen uns nun die JCL der im Logon Panel eingetragenen Prozedur LOGONXX ansehen:
46 /LOGONXX PROC /LOGONXX EXEC /* /SYSEXEC DD / DD /* /SYSPROC DD / DD /* DD /ISPLLIB /* /ISPMLIB DD DD / DD / /* /ISPPLIB DD DD / DD / /* DD /ISPSLIB DD / DD / /* /ISPTLIB DD DD / DD / /* DD /SYSTERM /SYSPRINT DD /SYSIN DD /*
3 Das TSO/ISPF Logon Verfahren
PGM=IKJEFT01,PARM='%ISPFLOGO',DYNAMNBR=150,TIME=1440 DISP=SHR,DSN=TEST1.TSO.EXEC DISP=SHR,DSN=ISP.SISPEXEC DISP=SHR,DSN=TESTO .TSO.USERPROC DISP=SHR,DSN=ISP.SISPCLIB.VB DISP=SHR,DSN=SYS1.DGTLLIB DISP=SHR,DSN=TEST1.TSO.ISPMLIB DISP=SHR,DSN=ISF.SISEMLIB DISP=SHR,DSN=ISP.SISPMENU DISP=SHR,DSN=TEST1.TSO.PANELS DISP=SHR,DSN=ISP.SISPPENU DISP=SHR,DSN=ISF.SISFPLIB DISP=SHR,DSN=TEST1.TSO.ISPSLIB DISP=SHR,DSN=ISP.SISPSLIB DISP=SHR,DSN=ISP.SISPSENU DISP=SHR,DSN=TEST1.TSO.ISPTLIB DISP=SHR,DSN=ISP.SISPTENU DISP=SHR,DSN=ISF.SISFTLIB TERM=TS,SYSOUT=* TERM=TS, SYSOUT=* TERM=TS
Programm 1 Die TSO Logon Prozedur LOGONXX
Wenn die obige Prozedur abläuft geschieht Folgendes: 1. Es werden die in den DD Statements angegebenen Dateien zugeordnet. 2. Der TSO Command Processor IKJEFT01 wird gestartet 3. Im „Job File Control Block" (JFCB) des MVS wird soviel Platz reserviert, dass während der TSO Sitzung dynamisch bis zu 150 Dateien zugeordnet werden können. DYNAMNBR= 15 0 4. Die Grenze, bis zu der in der TSO Sitzung CPU Zeit verbraucht werden kann, bevor ein Abbruch durch das System erfolgt (System Abend Code 322) wird auf 1440 Minuten festgelegt. Die Angabe von 1440 Minuten ist ein spezieller Wert, der bedeutet, dass niemals ein Abbruch wegen Überschreitung der CPU Zeit erfolgt. Das heißt, der TSO User kann unbegrenzt CPU Zeit verbrauchen. -> TIME=1440 5. Nachdem das TSO gestartet ist, wird die Prozedur ISPFLOGO ausgeführt, die am Ende, falls keine benutzereigene LOGON Prozedur gefunden wird, das ISPF Subsystem startet. ^ PARM='%ISPFLOGO'
3.4 Das ISPF starten
3.4
47
Das ISPF starten
Hier erfahren Sie, welche Voraussetzungen erfüllt sein müssen, damit das ISPF in einem TSO Adressraum gestartet werden kann. Darüber hinaus erkläre ich Ihnen, welche verschiedenen Möglichkeiten es gibt, das ISPF online zu starten.
3.4.1
Erforderliche ISPF Dateien
Zunächst einmal hat jeder TSO User nach dem Logon (genau wie jeder Batch Job) automatisch Zugriff auf alle Programme, die in der LINKLIST Kette des MVS vorhanden sind. Siehe hierzu auch das Kapitel „Anzeige der LINKLIST Kette" ab Seite 196. Das genügt aber weder für das TSO und schon gar nicht für das ISPF. Das TSO kann schon vernünftig arbeiten, wenn eine SYSPROC bzw. SYSEXEC Zuordnung besteht. Denn es kann dann die Prozeduren, die in den unter diesen DD Namen zugeordneten Dateien stehen sowie die Programme aus der LINKLIST Kette ausführen. Das ISPF benötigt aber noch einige weitere Dateien, damit es überhaupt starten kann. Bevor man das ISPF starten kann, müssen alle spezifischen Dateien, die das ISPF braucht, zugeordnet sein. Dies ist aus folgenden Gründen notwendig: •
• • • • •
Das ISPF schreibt bei jeder Beendigung einer ISPF Anwendung und bei seinem eigenen Ende die Profile Pool Variables weg. Dazu muss eine Zuordnung für die Profildatei vorhanden sein. ISPPROF Da das ISPF im Gegensatz zum TSO durch Panels gesteuert wird, benötigt es eine Datei, in der die Standard Panels des ISPF stehen. ISPPLIB Die Anwendungen und Panels können bei ihrer Verarbeitung Messages ausgeben. Deshalb ist eine Datei notwendig, welche die Message Definitionen enthält. ISPMLIB Viele ISPF Anwendungen arbeiten mit ISPF Tabellen, damit diese gefunden werden können, ist eine Datei erforderlich, in der diese Tabellen stehen. ISPTLIB Damit die mögliche Anforderung, Skeletons zu verarbeiten, erfüllt werden kann, ist eine Datei erforderlich, in der die Skeletons stehen. ISPSLIB Damit Prozeduren ausgeführt werden können, ist eine Prozedurendatei nötig. -> SYSEXEC oder SYSPROC oder beide.
Sobald das ISPF startet, öffnet es seine Dateien, die in der Regel als „Concatenated Data Sets" zugeordnet wurden. Hinweis Während das ISPF läuft, können den schon vorhandenen ISPF Dateien weitere Dateien dynamisch mit speziellen ISPF Befehlen hinzugefügt und wieder weggenommen werden (LIBDEF, ALTLIB). Diese Technik besprechen wir später noch ausführlich. Die folgende Tabelle zeigt, welche Dateien unter welchen DD Namen unbedingt zugeordnet sein müssen, bevor das ISPF gestartet werden kann.
48
3 Das TSO/ISPF Logon Verfahren
DDNAME ISPPROF ISPPLIB ISPMLIB ISPSLIB ISPTLIB SYSPROC, SYSEXEC
Inhalt und Bedeutung User Profile Library Panel Definitionen Messages Skeletons zur automatischen JCL Generierung. Table Input Library Ausführbare Prozeduren
Tabelle 3 Die erforderlichen ISPF DD Namen
Wenn auch nur einer der DD Namen, die mit ISP beginnen, beim Start des ISPF nicht zugeordnet ist, kann das ISPF nicht gestartet werden. Einige dieser Dateien können auch leer sein, aber sie müssen zugeordnet sein.
3.4.2
Die Dateien für den ISPF Tabellen Service
In der obigen Tabelle ist der DD Name ISPTLIB enthalten. Über diesen DD Namen werden standardmäßig ISPF Tabellen gelesen. Hinter diesem DD Namen befindet sich normalerweise eine Kette von PDS Dateien, welche die eventuell benötigten ISPF Tabellen Members enthalten. Wenn nun aber während der Arbeit mit dem ISPF Tabellen geschrieben werden sollen, können diese nicht nach ISPTLIB geschrieben werden, da ein Concatenated Data Set nicht für Output Verarbeitung geöffnet werden kann. Für die Ausgabe von ISPF Tabellen ist deshalb der DD Name ISPTABL vorgesehen. Wenn man also ISPF Tabellen schreiben und lesen will, dann muss der Aufbau der dafür notwendigen Zuordnungen wie folgt gestaltet werden: • •
Die eine Ausgabedatei wird unter dem DD Namen ISPTABL zugeordnet. Diese Datei steht in der ISPTLIB Kette an erster Stelle.
In der Praxis sieht dann die Allocation dieser Dateien, dargestellt durch das Utility ISRDDN (siehe hierzu das Kapitel „ISRDDN - Utility für zugeordnete Dateien" ab Seite 185), wie folgt aus: 27920
80 FB
27920 8800 8800
80 FB 80 FB 80 FB
LIB > > LIB > PO > PO >
ISPTABL ISPTLIB
LANZT . USER. TABL LANZT . USER. TABL ISP. SISPTENU ISF.SISFTLIB
Abbildung 26 Zuordnung von ISPTLIB und ISPTABL
49
3.4 Das ISPF starten Hinweis
Für das Hochfahren des ISPF wird die Zuordnung einer ISPTABL nicht benötigt, wohl aber eine ISPTLIB Zuordnung. Wir werden in späteren Kapiteln noch ausfuhrlich über die Verarbeitung von ISPF Tabellen sprechen. Grundsätzlich können für alle ISPF Dateien zusätzlich zu den vorhandenen Dateien der Systemebene noch solche auf der Benutzerebene und den Anwendungsebenen definiert werden. Wie dies geschieht, werden wir in einem späteren Kapitel sehen.
3.4.3
Die User Profile Library
Die User Profile Library ist für den Start von ISPF unbedingt erforderlich. Sie kann leer sein, muss aber vor dem Start des ISPF mit dem DD Namen ISPPROF zugeordnet sein. In dieser Datei speichert das ISPF alle Informationen ab, die von Sitzung zu Sitzung erhalten bleiben sollen. Die User Profile Library muss ein Partitioned Data Set (PDS oder PDSE) mit folgenden Dateidefinitionen sein: RECFM=FB, LRECL=80, BLKSIZE=3120. Die User Profile Library wird unter dem DD Namen ISPPROF zugeordnet und vom ISPF von Sitzung zu Sitzung immer wieder mit ihrem letzten Inhalt benutzt. Sie wird während der Arbeit mit dem ISPF automatisch fortgeschrieben. Falls die Datei ISPPROF beim ISPF Start leer ist, werden durch die einzelnen ISPF Anwendungen wie z.B. den Editor, das SDSF usw. Member mit Standardwerten angelegt, deren Inhalt in den nachfolgenden ISPF Sitzungen nach und nach erweitert wird. Die Dateicharakteristik einer typischen ISPF Profile Datei sehen Sie hier: Data Set Information Command ===> Data Set Name General Data Management class . . Storage class . . . Volume serial . . . Device type . . . . Data class Organization . . . Record format . . . Record length . . . Block size . . . . 1st extent cylinders Secondary cylinders Data set name type Creation date . . . Expiration date . .
USERID.ISPF PROFILE **None** ISPFPOOL TNN011 3390 **None** PO FB 80 3120 2 5 LIBRARY 2002/10/08 ***Perm***
Abbildung 27 Dateiattribute der ISPF Profile Datei
Current Allocation Allocated cylinders Allocated extents . Maximum dir. blocks
2 1 NOLIMIT
Current Utilization Used pages . . . . % Utilized . . . . Number of members .
177 49 70
Referenced date . .
2004/02/24
50
3 Das TSO/ISPF Logon Verfahren
Die wichtigen Werte für die Definition der Profile Datei sind grau unterlegt. Tipp Benutzen Sie für die ISPPROF Datei niemals eine BLKSIZE, die größer als 3210 Bytes ist. Das wäre zwar praktisch möglich, es kann aber zu unerklärlichen und abstrusen Fehlern im ISPF fuhren. Ich habe in der entsprechenden IBM Literatur keinen Hinweis auf dieses Phänomen gefunden, aber schon eine Menge Ärger damit gehabt! Ich empfehle Ihnen, diese Datei immer als PDSE (Partitioned Data Set Extended) anzulegen. Damit ersparen Sie sich die Schwierigkeiten mit der Kompression dieser Datei. Legen Sie die Datei nicht zu klein an. Vor allem der Secondary Space sollte mindestens fünf Zylinder betragen.
3.4.4
Inhalt der User Profile Library
In der ISPPROF Datei stehen folgende Inhalte: • • •
Die Systemvariablen des ISPF. Die speziellen Variablen der einzelnen Anwendungen. Die Benutzervariablen des ISPF, die der Benutzer von Sitzung zu Sitzung beibehalten möchte.
Die Variablen werden in Members in der Datei ISPPROF abgelegt. Die Membernamen werden vom ISPF automatisch gebildet, wobei die ISPF Application ID als Präfix benutzt wird. Die einzelnen Variablen sind vom Typ „Character String". Jede Variable hat einen bis zu achtstelligen Namen. Der Inhalt jeder Variablen kann maximal 32767 Byte lang sein. Tipp Die Member der Datei ISPPROF werden jedes Mal, wenn eine ISPF Anwendung startet, in den Hauptspeicher gelesen. Sie bleiben dort stehen, so lange die Anwendung geöffnet ist. Wird ein Wert geändert oder eine neue Variable generiert, dann geschieht dies nur im virtuellen Speicher. Wenn die Anwendung ohne Abbruch endet, werden die Member dieser Anwendung immer in die Datei ISPPROF zurückgeschrieben. Wenn die Anwendung abbricht oder abgebrochen wird, behalten die Member in der Datei ISPPROF ihren alten Inhalt. Wenn Sie also Anwendungen im ISPF „offen" haben und Ihr TSO User wird hart beendet (z.B. durch einen Operator Befehl), dann sind alle Änderungen in den ISPF Variablen unwiederbringlich verloren.
3.4.5
ISPF Start Befehle
Es gibt drei verschiedene TSO Befehle, um das ISPF zu starten. • • •
ISPSTART ISPF PDF
3.4 Das ISPF starten
51
Alle drei Befehle starten das ISPF. Falls keine Parameter mitgegeben werden, gelten die jeweiligen Standardoptionen. Die folgende Tabelle zeigt die Standardoptionen der einzelnen Befehle zum ISPF Start: Befehl ISPSTART ISPF PDF
Angenommene Standardoption PANEL(ISP@MSTR) PANEL(ISP@PRIM) NEWAPPL(ISR) PANEL(ISP@PRIM) NEWAPPL(ISR)
Applid ISP ISR ISR
Tabelle 4 ISPF Start Befehle
Zu diesen drei Befehlen gibt es eine ganze Reihe von Optionen, die Sie nutzen können. Falls Sie sich dafür interessieren, empfehle ich Ihnen die Broschüre ISPF Dialog Developer'« Guide and Reference und darin das Kapitel 2: „Controlling ISPF Sessions".
3.4.6
Die Initialprozedur ISPFLOGO
Nachdem wir das Prinzip des ISPF Starts kennen gelernt haben, können wir uns nun die allgemeine Logon Prozedur ISPFLOGO anschauen. Bei der Ausfuhrung dieser Prozedur wird am Ende, wenn keine private Logon Prozedur existiert, das ISPF mit dem TSO Befehl "ISPF" gestartet. Da die ISPPROF Datei für jeden TSO/ISPF User getrennt angelegt werden muss (sie enthält im DSN die User ID des TSO Users), kann deren Zuordnung natürlich nicht in der Form von DD Statements in der JCL der Logon Prozedur LOGONXX des Systems enthalten sein. Siehe hierzu „Programm 1 Die TSO Logon Prozedur LOGONXX" auf Seite 46. Deshalb wird bei der Ausfuhrung des Logon Batch Jobs in der System Logon Prozedur die Initialprozedur ISPFLOGO ausgeführt. Die Prozedur ISPFLOGO wird aber beim Logon für jeden TSO User ausgeführt. Das heißt, es dürfen in ISPFLOGO keine userspezifischen Inhalte vorkommen, die nicht über die User-ID adressiert werden können. Die Prozedur ISPFLOGO ist in der Script Sprache REXX geschrieben. Für diejenigen Leser, die REXX noch nicht kennen, ist es aber nicht schwierig die Prozedur zu verstehen. Ich habe nach der Liste der Prozedur eine Erklärung der Statements angefügt. Die Liste ist ein Bildschirmausdruck aus dem Editor. Mit den darin enthaltenen Zeilennummern kann ich die einzelnen Punkte der Beschreibung adressieren. Hier nun das Listing der Prozedur ISPFLOGO: 01 02 03 04 05 06 07 08 09 10
/ * DOC: REXX ISPFLOGO */ / * DOC: Generelle TSO/ISPF Logon Prozedur */ /*******************************************************************/ / * Basiswerte e r m i t t e l n */ /*******************************************************************/ l p a r = mvsvar ("SYSNAME") / * LPAR Namen e r m i t t e l n */ user = u s e r i d ( ) / * TSO üser-ID e r m i t t e l n */ pdsn = "'"user".ISPF.PROFILE."lpar"'" / * S e t z t e DSN f ü r ISPPROF */ /*******************************************************************/ / * ISPPROF a l l o k i e r e n */
52
3 Das TSO/ISPF Logon Verfahren
12 if sysdsn(pdsn) = "OK" then "alloc dd(ispprof) dsn("pdsn") shr reuse" 13 else "alloc dd(ispprof) dsn("pdsn") new catalog unit(sysda)", 14 "storclas(ispfpool) space(5,5) cylinders dsntype(library)", 15 "recfm(f b) lrecl(80) blksize(3120) dir(10)" 16
/*******************************************************************/
17 /* Fragen, ob private Logon Prozedur existiert. 18 /* Wenn ja, dann diese aufrufen. 19 /* Wenn nein, dann ISPF direkt aufrufen.
*/ */ */
21 logo = "'"user".LOGON.CLIST(LOGON) "' 22 if sysdsn(logo) = "OK" then "exec "logo /* Private Logon Prozedur 23 else " I 8 W " /* ISPF aufrufen 24 exit
*/ */
20 /*******************************************************************/
Programm 2ISPFLOGO: Allgemeine TSO/ISPF Logon Prozedur
Die folgende Tabelle enthält eine Beschreibung der einzelnen Schritte beim Ablauf der Prozedur ISPFLOGO: Zeilen 6-8 12 13-15 22 23
Beschreibung Zuweisen von Werten in die Variablen lpar, user, pdsn. Feststellen, ob die ISPPROF Datei schon vorhanden ist. Wenn ja, dann diese nur zuordnen. Wenn die ISPPROF Datei noch nicht vorhanden ist, dann diese neu anlegen. Festellen, ob es eine private Logon Prozedur gibt. Wenn ja, dann diese ausführen. Wenn es keine private Logon Prozedur gibt, dann ISPF direkt hier aufrufen.
Wie Sie in der Prozedur ISPFLOGO sehen, wird das ISPF dadurch gestartet, dass man im TSO einfach den Befehl ISPF eingibt. Sie können stattdessen, wie oben beschrieben, auch PDF oder ISPSTART eingeben. Wenn die private Logon Prozedur benutzt wird, muss natürlich diese Prozedur am Ende ihres Ablaufs das ISPF mit einem der Befehle aufrufen.
3.4.7
Die private Logon Prozedur LOGON
Sie benötigen eine private Logon Prozedur, wenn Sie bei Ihrer Arbeit im ISPF • • •
eigene ISPF Anwendungen entwickeln wollen. vorhandene ISPF Anwendungen nutzen wollen, die nicht in den allgemeinen ISPF Bibliotheken abgelegt sind. vorhandene Anwendungen modifizieren wollen.
Um eine private Logon Prozedur benutzen zu können, muss diese aus einem PDS geladen werden können, der genau den Namen hat, wie er in der Prozedur ISPFLOGO im Statement 22 abgefragt wird. Fragen Sie Ihre Systemtechnik, ob es bei Ihnen eine solche Datei gibt und wie sie heißt. Darin müssen Sie ein Member mit dem Namen LOGON anlegen. Dieses Member muss eine ausfuhrbare Prozedur in der CLIST oder REXX Sprache enthalten.
53
3.4 Das ISPF starten
Diese Prozedur können Sie frei gestalten. Sie muss lediglich eine Bedingung erfüllen: Am Ende der LOGON Prozedur müssen Sie das ISPF selbst starten. Welche Möglichkeiten Sie dabei haben, entnehmen Sie bitte dem Kapitel „ISPF Start Befehle" ab Seite 50. Wenn Sie eigene ISPF Anwendungen entwickeln oder vorhandene Anwendungen modifizieren wollen, ist es zweckmäßig, für jeden Dateityp zwei Ebenen anzulegen, nämlich eine Test- und eine Produktionsebene. Dies ist vor allem dann sehr wichtig, wenn Sie nicht die einzige Person sind, die diese Anwendungen nutzt, Sie aber einzelne Elemente ändern wollen, ohne die übrigen Benutzer mit Ihren Testversionen zu beglücken. Dabei wird die Testebene vor der Produktionsebene angeordnet. In der Testebene befinden sich nur solche Programmelemente, an denen Sie gerade arbeiten. Wir wollen uns jetzt einmal eine private LOGON Prozedur anschauen: /* DOC: REXX LOGON /* DOC: Private LOGON Prozedur für d e n User LANZT "CONCATD DDN(SYSEXEC) DSN('LANZT..TEST.REXX' " , CONCAT " 1 LANZT, PROD.REXX') "CONCATD DDN(ISPPLIB) DSN( 1 LANZT..TEST.PANEL'" r "'LANZT,.PROD.PANEL') CONCAT "CONCATD DDN(ISPMLIB) D S N ( ' LANZT. TEST .MSGS ' " , "'LANZT. PROD. MSGS') CONCAT .TEST.SKEL'", "CONCATD D D N (ISPSLIB) D S N ( ' LANZT. "'LANZT..PROD.SKEL') CONCAT "CONCATD DDN(ISPTLIB) DSN( 1 LANZT..TEST.TABL') CONCAT "CONCATD D D N (ISPTABL) D S N ( ' LANZT. ,TEST.TABL') CONCAT "XSHF" /* Aufruf des ISPF */ exit
*/ */ BEFORE SHR LIST' BEFORE SHR LIST' BEFORE SHR LIST' BEFORE SHR LIST' BEFORE SHR LIST' BEFORE SHR LIST'
Programm 3 LOGON: Standard Logon Prozedur
Für die Gestaltung einer solchen Logon Prozedur ist das TSO Command CONCATD sehr nützlich. Eine ausfuhrliche Beschreibung dieses Befehls finden Sie in dem Kapitel „Der TSO Befehl CONCATD" ab Seite 198 .
3.4.8
Logon in einer Multi-LPAR Umgebung
In einem Rechenzentrum, in dem sich die TSO User mit Hilfe von TPX (oder einem ähnlichen System) auf mehreren LPARs mit der gleichen TSO User-ID anmelden können, muss darauf geachtet werden, dass eine physische ISPPROF Datei nicht aus Versehen von mehreren LPARs aus gleichzeitig benutzt wird. Solange dabei normale PDS Dateien benutzt werden, kann das höchstens dazu fuhren, dass sich die verschiedenen Instanzen des gleichen TSO Users, die auf unterschiedlichen LPARs laufen, gegenseitig die Inhalte der ISPF Variablen überschreiben. Sobald aber die ISPPROF Datei vom Typ PDSE ist, kommt es unweigerlich zur logischen Zerstörung der ISPPROF Datei. Ein weiterer Effekt kann sein, dass die TSO User abstürzen und auch mit einem erneuten Logon nicht mehr weiter arbeiten können, da die ISPPROF Datei logisch zerstört ist. Sie
54
3 Das TSO/ISPF Logon Verfahren
können sich dann glücklich schätzen, wenn von der ISPPROF Datei noch eine Sicherung existiert. Ansonsten kommen Sie nur weiter, wenn Sie eine neue ISPPROF Datei anlegen. Möglicherweise genügt es auch, das „defekte" Member von der TSO Ebene aus zu löschen. Das hat aber die Konsequenz, dass alle mühsam erarbeiteten ISPF-Profile-Definitionen verloren sind und Sie auf die Standard-Definitionen zurückfallen. Aus diesem Grund ist in der im Kapitel „Die Initialprozedur ISPFLOGO" auf Seite 51 gezeigten Prozedur im Statement 000008 der DSN die ISPPROF Datei am Schluss mit dem LP AR Namen versehen. Bei Anwendung dieser Methode kann es zu keiner konkurrierenden gleichzeitigen Benutzung kommen.
3.5
Die LOGON Prozedur der LANZ Utilities
Sie haben jetzt schon so viel über die einzelnen Schritte des Logon Prozesses gelernt, dass Sie erkennen können, wie wichtig eine zuverlässig arbeitende Logon Prozedur ist. Bei dem bisher gezeigten Ablauf des Logon Verfahrens gibt es eine kleine Schwachstelle: Wenn auch nur eine der Dateien, die in den CONCATD Statements angegeben sind, nicht vorhanden ist, wird die ganze Kette der dort genannten Dateien nicht zugeordnet. Die vorher bestehenden Zuordnungen bleiben aber erhalten. Ein weiteres Problem ergibt sich, wenn der Befehl CONCATD in Ihrer MVS Installation nicht vorhanden ist. Welche Anforderungen muss man also an eine optimale Logon Prozedur stellen? • • •
•
Es muss auch für Personen, die keine REXX Kenntnisse besitzen, leicht möglich sein, ihre eigenen Dateistrukturen für das TSO/ISPF beim Logon zuzuordnen. Die bereits bestehenden DSN Ketten müssen nach dem Ablauf der Logon Prozedur immer noch vorhanden sein und jeweils hinter den „Neuankömmlingen" stehen. Wenn eine zusätzlich zuzuordnende Datei physisch nicht vorhanden ist, muss das die Logon Prozedur erkennen, den Fehler melden, aber die restlichen, vorhandenen Dateien richtig zuordnen. Sie darf nicht den TSO Befehl CONCATD benutzen, um auch in solchen Installationen, in denen dieser Befehl nicht zur Verfugung steht, lauffähig zu sein.
Alle diese Bedingung werden von der REXX Prozedur LOGON der LANZ Utilities erfiillt. Wie müssen Sie vorgehen, um diese Prozedur für Ihr Logon Verfahren einsetzen zu können? 1. Stellen Sie fest, wie in Ihrer Installation die Datei heißt, in der beim Logon Verfahren nach einer privaten Logon Prozedur gesucht wird. Normalerweise ist der Name dieser Datei userid.LOGON.CLIST. 2. Kopieren Sie die LOGON Prozedur und das Member LOGONDSN aus dem Verzeichnis der LANZ Utilities in diese Datei. 3. Erstellen Sie im Member LOGONDSN alle Einträge, die Sie dort benötigen. 4. Führen Sie dann ein neues Logon durch.
3.5 Die LOGON Prozedur der LANZ Utilities
3.5.1
55
Die Steuerdatei LOGONDSN
Diese Datei wird von der LOGON Prozedur der LANZ Utilities gelesen. Sie enthält Informationen für zusätzliche DSNs, die vor die jeweiligen, bereits vorhandenen DSNs zugeordnet werden sollen. Beispiel * * * *
DOC: DOC: DOC: DOC:
REXX LOGONDSN *******************************************; Steuerdatei für das LOGON Verfahren. Die hier genannten Dateien werden jeweils vor die bereits vorhandenen Dateien oder zusätzlich zugeordnet.
* * * *
Bern: Bern: Bern: Bern:
Diese Datei wird von der LOGON Prozedur benutzt. Wenn sie fehlt, ist keine Allocation von privaten Libraries möglich. Zeilen mit einem Stern auf Spalte 1 werden von der Prozedur LOGON überlesen.
*
* Diese Tabelle hat folgenden Aufbau: * DDNAMEN1 DSN1 [ONLY] * DSN2 * DDNAMEN2 DSN1 [ONLY] * DSN2 * * * *
Wenn in der gleichen Zeile, in der der DDNAME steht als 3. Wort der Text ONLY steht, dann werden alle bisherigen Verkettungen unter diesem DDNAMEN bei der Neuzuordnung weggelassen und nur die hier stehenden DSNs werden zugeordnet.
SYSEXEC ISPPLIB ISPMLIB ISPTLIB ISPLLIB ISPTABL
ONLY PROX.LANZ.CEXEC PROX. LOGON. CEXEC PROX. LANZ. PANEL PROX.LOGON.PANEL PROX. LOGON. MSGS LANZT. USER. TABL PROX. LANZ. LOAD PROX. LOGON. LOAD LANZT. USER. TABL
Abbildung 28 Die Logon Steuerdatei LOGONDSN Die Datenzeilen dieser Datei sind selbsterklärend. Wenn diese Datei von der LOGON Prozedur verarbeitet worden ist, werden die ISPF Dateiketten vom Programm ISRDDN (Siehe Kapitel „ISRDDN - Utility für zugeordnete Dateien" ab Seite 185) wie in der folgenden Abbildung zu sehen, angezeigt:
56
3 Das TSO/ISPF Logon Verfahren
Blksz Lrecl RCFM Org
Data Set Name
32760 32760
**
PROX.LANZ.LOAD PROX.LOGON. LOAD
27920 8800 8800
80 FB 80 FB 80 FB
27920 27920 8800 8800 27920
80 80 80 80 80
27920 8800 8800
80 FB 80 FB 80 FB
27998 27998 8800
255 VB 255 VB 80 FB
**
U U
FB FB FB FB FB
Act DDname > ISPLLIB LIB > PO > > ISPMLIB LIB > PO > PO > > ISPPLIB LIB > LIB > PO > PO > LIB > ISPTABL > ISPTLIB LIB > PO > PO > > SYSEXEC LIB > PO > PO >
Actions:
B E V M F C I Q
PROX.LOGON. MSGS ISF.SISFMLIB ISP. SISPMENU PROX.LANZ.PANEL PROX.LOGON.PANEL ISP.SISPPENU ISF.SISFPLIB LANZT.USER.TABL LANZT.USER.TABL ISP.SISPTENU ISF.SISFTLIB PROX.LANZ.CEXEC PROX. LOGON. CEXEC ISP.SISPEXEC
Abbildung 29 Anzeige der ISPF Dateiketten
Die von der Prozedur zusätzlich verknüpften DSNs sind grau unterlegt. Erläuterungen • •
Die Ebene mit den Qualifiers PROX.LANZ.* ist meine Entwicklungsebene. Diese Dateien sind nur in meinem TSO User zugeordnet. Die Ebene mit den Qualifiers PROX.LOGON.* ist die produktive Ebene meiner eigenen ISPF Anwendungen. Diese Ebene kann auch von anderen TSO Usern zugeordnet werden.
4
ISPF einrichten
In diesem Kapitel lernen Sie, wie Sie Ihr ISPF so einrichten, dass Sie optimal damit arbeiten können. Ich stelle Ihnen die Einstellungsmöglichkeiten im ISPF vor, die für die praktische Arbeit mit diesem System relevant sind. Wir gehen die einzelnen Menüs durch und ich mache Sie auf wichtige und praktikable Einstellungen aufmerksam.
4.1
Bildschirm Anzeige Formate im ISPF
Sie können die Anzeige der 3270-Bildschirme mithilfe der PCS Ihren Bedürfnissen anpassen. Für die Anzeige hat man folgende Wahlmöglichkeiten der Darstellung auf den 3270Bildschirmen: Zeilen pro Panel 24 32 43 27
Zeichen pro Zeile 80 80 80 132
Tabelle 5 Darstellungsmöglichkeiten
Bemerkung Standardeinstellung 1. Erweiterungsstufe 2. Erweiterungsstufe Anzeige von Drucklisten im SDSF
am 3270-Bildschirm
Um diese Einstellungen wählen zu können, müssen diese in dem System, an dem Sie arbeiten auch konfiguriert sein. Wenn Sie eine der obigen Einstellungen benutzen möchten, die von Ihrer Standardeinstellung abweicht, wenden Sie sich an Ihre MVS Systemtechnik. Die Festlegung einer Darstellungsart muss an folgenden Stellen erfolgen: 1. Bereits beim LOGON muss der richtige VTAM Anmeldename verwendet werden, der die von Ihnen gewünschte Einstellung auch zulässt. Den kann Ihnen die MVS Systemtechnik nennen. 2. Sie müssen in Ihrer Anzeige Software der IBM Personal Communication die entsprechende Auswahl treffen. Wie Sie den 2. Punkt ausfuhren können, wollen wir jetzt anschauen. Sie verlassen das ISPF, das TSO und das TPX. Dadurch gelangen Sie zur Anzeige des VT AM Bildschirms wie er in der Abbildung auf Seite 38 zu sehen ist.
58
4 I S P F einrichten
Sie wählen in der Menü Leiste der IBM Personal Communication den Punkt Kommunikati-
In dem erscheinenden Pull Down Menü klicken Sie auf Konfigurieren. Sie erhalten damit folgendes Menü:
El
Kommunikation anpassen Verbindung zum Host auswählen Host-Typ:
•
S/390
• i j
Schnittstelle:
¡LAN
Anschluß:
¡Telnet3270
.
j j
Sitzungsparameter..
Verbindungsparameter.
Verbindungsübersicht Host-Typ
Schnittstelle
I Telnet3270
LAN
S/390
• 0iese Verbindung ermöglicht über ein TCP/IP-NetzZugriff auf einen Host IBM System/390 über eine TN3270- oder TN3270E-Schnittstelle. SLP (Service Location Protocol), SSL V 3 (Secure Sockets Layer), Lastausgleich und Ausweich-Host werden unterstützt. - Diese Auswahl wird normalerweise in Netzen mit TCP/IP-Protokollen verwendet. - Diese Konnektivität kann auch für Verbindungen zu einem Host-Netz mit einer Firewall, das
Abbrechen
OK
Abbildung 30 Einstellungsanzeige
— •»• |
Hilfe
der VTAM Verbindung zum Host
Hier klicken Sie auf Sitzungsparameter. In dem jetzt erscheinenden Menü sehen Sie bereits in der Zeile Anzeigegröße: die jetzige Einstellung und beim Herunterklappen des Menüs die Auswahlmöglichkeiten, die Sie haben.
59
4.1 Bildschirm Anzeige Formate im ISPF
Sitzungsparameter - 3270-Host Sitzungspararneter Anzeigegröße:
43x80
Sitzungsart:
(*
Host-Umsetztabelle:
273 Deutschland
*j
Anzeige
Drucker
H
Grafikparameter Host-Grafik aktivieren:
C' Ja
./ ¡ M M ß j & i
OK
Abbrechen
(•
Nein
M M M
Hilfe
Abbildung 31 Sitzungsparameter - 3270-Host
Wenn Sie die neue Auswahl getroffen haben und dann das Menü mit OK schließen, wird die Verbindung zum Host automatisch gelöst und mit den neuen Werten wieder hergestellt. Um dies anzuzeigen, erscheint dann folgende Meldung, die Sie mit OK bestätigen.
Emulator (Kommunikationsanpassung] - F1 für Hilfe drücken )
PCSCC041 - Durch die Konfigutationsänderung wird die Kommunikation beendet, wenn fortgefahren wird. Dennoch fortfahren? OK
Abbildung 32 Kommunikationsanpassung
Abbrechen
bestätigen
Tipp Meine Lieblingseinstellung ist diejenige mit 43 Zeilen und 80 Spalten. Damit habe ich immer den größtmöglichen Überblick über die angezeigten Daten. Ich möchte nämlich so viele Zeilen wie irgend möglich gleichzeitig am Bildschirm sehen.
60
4 ISPF einrichten
4.2
Setzen der ISPF Optionen
Leider gibt es keine einzelne, zentrale Stelle, an der man alle ISPF Optionen definieren könnte. Vielmehr gibt es einige Stellen, welche die Definition von ISPF Optionen zulassen. Wahrscheinlich kommt diese „Verzettelung" einfach daher, dass sich das ISPF im Laufe der Jahre immer weiter entwickelt hat und man mit dem Hinzufugen neuer Funktionen auch deren Einstellungen innerhalb der neuen Programme und Panels abwickeln wollte. Hier wollen wir uns einmal die grundlegenden Optionen anschauen:
4.2.1
Das Panel ISPF Settings (Auswahl 0)
Wenn Sie zum ersten Mal in einem frisch eingerichteten TSO User das ISPF aufrufen, dann sieht schon das „Primary Option Menu" nicht gerade benutzerfreundlich aus: • •
Die Command Line befindet sich am unteren Rand des Bildschirms. Dort kann man sie mit der POS 1-Taste nicht erreichen. Wenn Sie die Taste POS1 der Tastatur betätigen, springt der Cursor in die CUA Zeile. Meistens möchte man mit der POS 1-Taste aber in die Command Line gelangen.
Erfreulicherweise kann man diese Einstellungen aber ändern. Wie das geht, zeige ich Ihnen jetzt hier: Um diese beiden unpraktikablen Effekte zu verbessern und auch noch einige andere wichtige Optionen zu setzen, wählen wir im „Primary Option Menu" die Auswahl 0 Settings und drücken ENTER. In dem dann erscheinenden Panel nehmen wir die im folgenden Bild grau unterlegten Änderungen und Eintragungen vor: Log/List
Function keys
Colors
Environ
Workstation
Identifier
ISPF Settings Command ---> Options Enter "/" to select option Command line at bottom / Panel display CUA mode / Long message in pop-up Tab to action bar choices Tab to point-and-shoot fields 7 Restore TEST/TRACE options / Session Manager mode / Jump from leader dots Edit PRINTDS Command / Always show split line / Enable EURO sign Terminal Characteristics Screen format 1 1. Data
2. Std
Abbildung 33 Praktikable Einstellungen der ISPF Settings
Print Graphics Family printer type 2 Device name . . . . Aspect ratio . . . 0 General Input field pad . . N Command delimiter . 1
3. Max
4. Part
Help
4.2 Setzen der ISPF Optionen
61
Hinweis Wenn vor einer der Zeilen unter „Options" ein Slash (/) steht, ist die entsprechende Option EIN. Wenn dort ein BLANK steht, ist sie AUS. Mit diesen Einstellungen können Sie folgende ISPF Optionen festgelegen: Command line at bottom Die Command oder Option Zeile erscheint standardmäßig unten. Um sie oben zu positionieren, muss diese Option auf aus gesetzt sein. Durch diese Einstellung wird auch erreicht, dass Sie mit der Taste Posl in die Command oder Option Zeile springen können. Damit dies auch klappt, muss auch die Einstellung für „Tab to action bar choices" auf aus gesetzt sein. Panel display CUA mode Damit die CUA Zeile als oberste Zeile auf dem Bildschirm erscheint, muss diese Option auf ein gesetzt sein. Long message in pop-up Wie wir später noch sehen, werden ISPF Messages so ausgegeben, dass normalerweise bei der Ausgabe einer Message sowohl ein „Short Message Text" als auch ein „Long Message Text" erscheinen kann. Hier kann man einstellen, dass der Long Message Text immer in einem Rahmen angezeigt wird und nicht in der Long Message Line, die sich im oberen Bereich des Bildschirms befindet. Tab to action bar choices Wenn diese Option auf ein gesetzt ist, dann springt der Cursor beim Drücken der Posl Taste in die CUA Zeile ganz oben. Falls Sie aber möchten, dass der Cursor beim Drücken der Posl Taste in die Command oder Option Zeile springt, dann müssen Sie diese Option ausschalten. Tab to point-and-shoot fields Es gibt Panels, in denen Felder als so genannte "point and shoot fields" definiert sind. Dort ist meist eine Aktion benannt (z.B. UPDATE oder CANCEL), die bei positionieren des Cursors in diesem Feld und anschließendem ENTER ausgeführt wird. Um diese Felder mit den TAB Tasten erreichen zu können, muss diese Option eingeschaltet sein. Always show split line Wie Sie vielleicht schon wissen, kann man im ISPF mehrere Ebenen gleichzeitig "offen" haben. Damit dieser Zustand auch in jeder Anzeige sichtbar ist, kann eine so genannte „Split Line" in die Anzeige eingefügt werden. Diese Zeile besteht aus Punkten in jeder dritten Spalte mit dazwischen liegenden Blanks.
62
4 ISPF einrichten
Der „ISPF Command Delimiter Der „ISPF Command Delimiter" dient dazu, mehrere ISPF Befehle in einem Stück einzugeben, wobei die einzelnen Befehle durch diesen Delimiter getrennt werden. Das ISPF fuhrt die Befehle dann „am Stück" nacheinander aus. Von Haus aus ist dieser Delimiter auf das Zeichen (;) (Semikolon) gesetzt. Es gibt aber Programme, die bei der ParameterEingabe ebenfalls mit dem Semikolon als Delimiter arbeiten. Wenn Sie das Semikolon als Command Delimiter stehen lassen, wundern Sie sich eventuell später, dass bei einem Programmaufruf mit mehreren Parametern in den Programmen immer nur der Inhalt des ersten Parameters ankommt und dazu das ISPF auch noch unverständliche Fehlermeldungen ausgibt. Tipp Deshalb ist es sinnvoll, den „ISPF Command Delimiter" auf ein Zeichen zu setzen, das normalerweise kein Programmierer für die Trennung von Eingabeparametern benutzt. Dazu ist das ß-Zeichen gut geeignet. Außerdem hat das ß-Zeichen auch noch den Vorteil, dass es ohne die Shift-Taste eingegeben werden kann.
4.3
Die Panels und ihre Handhabung
Die Panels kann man in drei Gruppen aufteilen: 1. Panels des Basis ISPF Systems. Das sind mehrere tausend. Sie stehen normalerweise in der Bibliothek ISP.SISPPxxU, wobei xx die Sprache bezeichnet, mit der Sie gerade arbeiten. xx = EN -> englisch, xx = DE -> deutsch. 2. Panels der ISPF Subsysteme. Das können auch sehr viele sein. Sie stehen meist in Bibliotheken, die den ISPF Subsystemen zugeordnet sind. Z.B. für das SDSF ist es die Bibliothek ISF.SISFPLIB 3. Private Panels. Sie sind vom ISPF User selbst entwickelt und stehen in den entsprechenden User Bibliotheken. Die Panels werden vom ISPF über den DD Namen ISPPLIB gesucht und geladen.
4.4
Die Struktur der ISPF Panels
Anders als das TSO, arbeitet des ISPF vollständig mit Bildschirmmenüs, die man auch Panels nennt. Diese Panels sind grundsätzlich frei definierbar. Man kann auch eigene Panels erstellen, um damit Anwendungen in das ISPF einzubinden. Diese Technik werden wir in einem späteren Kapitel behandeln. Das ISPF lädt Panels aus der Dateiverkettung, die dem DD Namen ISPPLIB zugeordnet sind.
63
4.4 Die Struktur der ISPF Panels
4.4.1
Panels, POP UP Windows, HELP Panels
Es gibt drei verschiedene Typen von Panels: 1. Die normalen Panels Diese ersetzen bei ihrem Aufruf das gerade angezeigte Panel vollständig. Und zwar unabhängig davon, wie groß das vorher angezeigte Panel war. 2. Die Window Panels (POP Up Windows oder POP Up Panels) Diese legen sich bei Ihrem Aufruf über das gerade angezeigte Panel. Je nach ihrer Größe lassen sie mehr oder weniger vom ursprünglichen Panel auf dem Bildschirm „übrig". Die folgende Anzeige soll dies anschaulich machen: Ich habe eine Datei mit VIEW zur Anzeige gebracht, eine Zeile gelöscht und dann versucht, die Datei mit END (PF3) zurück zu schreiben. VIEW c*
SQMT.JCL(TT) - 01.01 View Warning
Columns 00001 oil == ********
567890 567890 567890 You are currently in View mode : 567890 567890 Press Enter to confirm exit from View. No changes 567890 will be saved. 567890 567890 Enter the END or EXIT command to return to View, 567890 where you can use the CREATE or REPLACE primary 567890 commands to save your changes. 567890 0 L_ 000014 ZEILE 15 1234567890 1234567890 1234567890 12345678901234567890 ****** **************************** Bottom of Data ********************* o 0 0 0 0 0 0 0 0 0
Command
==>
Abbildung 34 POP UP Panel mit View Warning
Der grau unterlegte Teil wurde als „POP Up Panel" über die vorige Anzeige gelegt. Diese Windows können natürlich auch Eingabefelder enthalten. POP Up Panels sind sehr nützlich, wenn man Warnungen und Hinweise ausgeben will, oder vom Bediener nochmals eine Bestätigung für eine bevorstehende Verarbeitung (z.B. löschen einer Datei) benötigt. Die Programmierung von POP Up Panels, werden wir in einem späteren Kapitel kennen lernen. 3. Die Hilfe Panels (HELP Panels) Diese Panels müssen auf eine besondere Art definiert werden. Sie werden bei der Definition eines „normalen" Panels als HELP Panel angegeben. Man kann HELP Panels sowohl für ganze Panels als auch für einzelne Felder in einem Panel definieren.
64
4.5
4 ISPF einrichten
Das Primary Option Menu
Das „Primary Option Menu" ist das erste Panel, das nach dem Start von ISPF in einer Online Umgebung auf Ihrem Bildschirm erscheint. Dieses Panel wird in der Regel von der ISPF System Technik für bestimmte Benutzergruppen angepasst. Je nachdem, wie das ISPF gestartet wird, kann der Panel Name anders lauten. Siehe hierzu das Kapitel „ISPF Start Befehle" auf Seite 50. Hier sehen Sie ein typisches „ISPF Primary Option Menu" mit eingeschalteter CUA Zeile: Mtou
utilities
Coapilars
Options
Status
Halp
ISPF Primary Option Menu Option = = > Settings View Edit Utilities Foreground Batch Command Dialog Test 8 SDSF 9 IBM Products 10 SCLM 11 Workplace L LM Facility P Panvalet U Util
Terminal and user parameters Display source data or listings Create or change source data Perform utility functions Interactive language processing Submit job for language processing Enter TSO or Workstation commands Perform dialog testing System Display and Search Facility IBM program development products SW Configuration Library Manager ISPF Object/Action Workplace Library administrator functions Browse, Edit and Utilities XYZ interne Utilities
User ID . Time. . . Terminal. Screen. . Language. Appi ID . TSO logon TSO prefix System ID MVS acct. Release .
LANZT 08:12 3278A 1 ENGLISH I SR LOGONXX LPRT 09806462 ISPF 5.2
Enter X to Terminate using log/list defaults Abbildung 35 Primary Option Menu mit CUA Zeile
Die erste Zeile (CUA Zeile) enthält die einzelnen Auswahlmöglichkeiten für Pull Down MeWir wollen jetzt einmal schauen, welche Optionen uns das Status Menü der CUA Zeile anbietet. Dazu positionieren wir den Cursor irgendwo in dem Wort Status und drücken ENTER. Es erscheint nun die folgende Anzeige, wobei der Cursor in der ersten Zeile des Pull Down Menüs positioniert wird. Die Stelle, wo der Cursor steht, habe ich in dem grauen Fenster weiß gelassen. Auf der folgenden Seite sehen Sie das ISPF Primary Option Menu mit ausgeklapptem Status Pull Down Menu:
65
4.5 Das Primary Option Menu
Menu
Utilities
Compilers
Options
Status Help 1 1 *. Session ISPF Prim ¡ 3 2 Option ===> 1 - Function keys 3 1 - Calendar 4 Terminal and user p 1 0 Settings - User status 5 Display source data 1 1 View - User point and shoot 6 Create or change so 1 2 Edit - None 1 i Perform utility fun 3 Utilities Interactive language processing Language. 4 Foreground Submit job for language processing Appl ID . 5 Batch Enter TSO or Workstation commands TSO logon 6 Command Perform dialog testing TSO prefix 7 Dialog Test System Display and Search Facility System ID 8 SDSF MVS acct. 9 IBM Products IBM program development products SW Configuration Library Manager Release . 10 SCLM ISPF Object/Action Workplace 11 Workplace Library administrator functions L LM Facility Enter X to Terminate using log/list defaults
Abbildung 36 Status Pull Down Menu des ISPFPrimary
LANZT 08:12 3278A 1 ENGLISH I SR LOGONXX LPRT 09806462 ISPF 5.2
Option Menüs
Wir können jetzt eine der nicht abgedunkelten Options auswählen. Wir entscheiden uns für 3 . C a l e n d a r und drücken dann ENTER, Dadurch erhalten wir eine neu gestaltete Anzeige unseres Primary Option Menüs: Menu
Utilities
Compilers
Options
Status
Help
ISPF Primary Option Menu Option ===> 0 Settings Terminal and user parameters 1 View Display source data or listings 2 Edit Create or change source data Perform utility functions 3 Utilities 4 Foreground Interactive language processing 5 Batch Submit job for language processing Enter TSO or Workstation commands 6 Command 7 Dialog Test Perform dialog testing 8 SDSF System Display and Search Facility 9 IBM Products IBM program development products SW Configuration Library Manager 10 SCLM 11 Workplace ISPF Object/Action Workplace L LM Facility Library administrator functions Enter X to Terminate using log/list defaults
< Su 4 11 18 25
Calendar January 2004 Mo Tu We Th Fr 1 2 5 6 7 8 9 12 13 14 15 16 19 20 21 22 23 26 27 28 29 30
Time . . . Day of year
Sa 3 10 17 24 31
09 09 023
Abbildung 37 Calendar Anzeige im Primary Option Menu
Wie Sie sehen, haben wir jetzt auf der rechten Seite den aktuellen Kalender stehen. Diese Status Anzeige kann für jedes durch SPLIT NEW oder START erzeugte Panel anders aussehen. Das ISPF merkt sich diese Einstellung auch für jede einzelne SPLIT Ebene extra in den Profile Optionen. Diese Einstellungen sind nach einem erneuten LOGON immer wieder vorhanden. Das kleine Beispiel fuhrt uns auch gleich zu unserem nächsten Thema, nämlich dem „Screen Splitting".
66
4 ISPF einrichten
4.6
Screen Splitting
Stellen Sie sich vor, Sie editieren gerade eine Datei und brauchen aber gleichzeitig eine Information aus einer anderen Datei, die Sie vielleicht sogar in die gerade editierte Datei übernehmen wollen. Am PC ist dieses Verfahren leicht zu bewerkstelligen. Aber auch im ISPF müssen wir nicht verzweifeln, denn es gibt hier den „SPLIT SCREEN" Modus. Wie geht das? • •
Sie belegen die PF2 Taste mit dem Text START (dies ist besser als SPLIT NEW). Siehe hierzu die Hinweise im Kapitel „Die Funktionstasten im ISPF" ab Seite 69 . Immer, wenn Sie eine neue ISPF Ebene benötigen, drücken Sie die Taste PF2.
Daraufhin wird ein neues „ISPF Primary Option Menu" geöffnet. Von hier aus können Sie dann weiter arbeiten. Dass ab jetzt mindestens eine weitere Ebene im Split Screen Modus vorhanden ist, können Sie daran erkennen, dass die oberste oder unterste Zeile aus jeweils durch zwei Blanks unterbrochenen Punkten besteht. Diese Zeile ist die „Split Screen Indication Line". Falls diese „Split Screen Indication Line" auf Ihrem Bildschirm nicht erscheint, können Sie diese im Menu 0 des ISPF durch das Einschalten der Option Always show split line einschalten. Am Vorhandensein der „Split Screen Indication Line" können Sie erkennen, ob sich Ihre Anzeige überhaupt im Split Screen Mode befindet oder ob Sie gerade nur eine ISPF Ebene nutzen. Regel Je nachdem, wie das ISPF in Ihrem MVS System installiert ist, können Sie mit bis zu acht oder mehr Ebenen arbeiten. Die Information, wie viele Ebenen Sie „aufmachen" können steht in der ISPF Systemvariablen ZSCRMAX. Deren Inhalt können Sie über das Menü 7.3 abfragen. Hinweis Von Haus aus ist die Taste PF9 mit dem Text SWAP belegt. Ich rate Ihnen, diese Taste mit SWAP NEXT zu belegen. Denn mit SWAP alleine können Sie immer nur zwischen zwei Split Ebenen hin- und herschalten. Haben Sie aber die Taste PF9 mit SWAP NEXT belegt, können Sie sich durch wiederholtes Drücken der PF9 Taste durch alle Ebenen bewegen. Eine weitere Möglichkeit wäre, auf die PF 15 Taste den Text SWAP LIST zu legen, diese zu drücken und die Zielebene in dem erscheinenden Panel direkt auszuwählen. Tipp Wenn Sie entweder bewusst oder aus Versehen den Screen mit SPLIT irgendwo mittendrin aufgeteilt haben und Sie wollen wieder auf eine Anzeige kommen, die Ihnen einen ganzen Bildschirm mit der Split Screen Indication Line ganz oben oder unten zeigt, können Sie folgenden Trick anwenden:
4.6 Screen Splitting
67
Falls Sie die PF2 Taste mit SPLIT NEW belegt haben, positionieren Sie den Cursor in der obersten Zeile und drücken dann die PF2 Taste. Falls Sie die PF2 Taste mit START belegt haben, geben Sie in der Command Line des aktiven Panels den Text SPLIT NEW ein ohne ENTER zu drücken, positionieren den Cursor in der obersten Zeile des Bildschirms und drücken dann erst ENTER. Durch jede der beiden Operationen bekommen Sie ein neues Primary Option Menu angezeigt. Wenn Sie dieses neue Primary Option Menu jetzt mit der PF3 Taste (END) verlassen, erhalten sie wieder eine Anzeige, welche die „Split Screen Indication Line" ganz oben oder ganz unten hat. Dieser Trick hat sich bei mir schon sehr oft bewährt!
4.6.1
Direkte Ansteuerung eines Split Screen
Gehen wir einmal davon aus, dass wir mehr als zwei ISPF Ebenen geöffnet haben. Es ergibt sich dann das Problem, dass wir eine Ebene, die wir gezielt ansteuern wollen, mithilfe der PF9 Taste nur durch wiederholtes Drücken dieser Taste erreichen können.
Tipp Um mit der PF9 Taste durch die einzelnen Ebenen blättern zu können muss in allen ISPF Anwendungen auf der gesamten Strecke die Taste PF9 mit SWAP NEXT belegt sein und nicht nur mit SWAP. Wenn dies auch nur in einer Anwendung nicht der Fall ist, dann kann es vorkommen, dass Sie beim Durchblättern einige Ebenen nicht erreichen. Die PF Tasten-Belegung ist APPLID bezogen. Wenn Sie also eine Anwendung im ISPF starten, die eine neue APPLID „aufmacht", dann müssen Sie dort auch die PF Tastenbelegung anpassen. Beispielhaft genannt sei hier das SDSF mit seiner APPLID „ISF". Wir wollen uns im folgenden Kapitel einmal einen Fall anschauen, bei dem insgesamt acht Ebenen geöffnet sind.
4.6.2
Beispiel mit acht ISPF Ebenen
Mit dem Aufruf von SWAP LIST in der Command Line (oder durch Drücken der PF Taste, die mit SWAP LIST belegt ist) erscheint die „ISPF Task List", die alle zurzeit geöffneten Ebenen anzeigt. Wenn man eine bestimmte Ebene ansteuern will, dann braucht man nur den Cursor vor der entsprechenden Ebene zu positionieren und ENTER zu drücken. Den gleichen Effekt erreicht man, indem man mit der Maus an der entsprechenden Position doppelt klickt. In dem folgenden Beispiel sind acht Ebenen angelegt und in allen Ebenen ist jeweils eine Anwendung gestartet:
68 Display - f—— S
4 ISPF einrichten
Filter —
View
Print Options Help ISPF Task List Active ISPF Logical Sessions
Start a new screen Start a new application Application Name ID 6* 7 8 3 4 5 12
Name SDSF LASTED XYZPROD #COMMBOX #IMACROA VOLINFO JULDATE REXX
Panelid ISFPCU41 ISREDDE4 XYZMMENU ISREDDE4 ISREDDE4 VOLINF1 ISREDDE4 ISRUDSM
Applid ISF ISR XYZP ISR ISR ISR ISR ISR
1-3 (3) SCROLL ===> CSR TST* CPU-Time C Pos DP 7.37 A IN EB 1452.60 7 LO F F 1557.70 7 LO FF
Session Type 3270 3270 3270 3270 3270 3270 3270 3270
Abbildung 38 ISPF Task List mit insgesamt acht ISPF Ebenen
In den einzelnen Spalten sind folgende Einträge zu sehen: ID
Die fortlaufende Nummer der Ebene. Hinter der Nummer kann ein Stern (*) oder ein Bindestrich (-) stehen. Diese haben folgende Bedeutung: * -> In dieser Ebene befinden wir uns gerade. Diese Ebene haben wir mit dem letzten SWAP Befehl verlassen. Wenn wir in diesen beiden Ebenen nur einen SWAP ausführen, kommen wir immer nur in die jeweils andere Ebene. Nur mit SWAP NEXT können wir diesen FLIP-FLOP Zyklus verlassen. Dass die Ebenennummern nicht von oben nach unten fortlaufend erscheinen, kommt daher, dass ich bei diesem Beispiel im Laufe der Zeit einige Ebenen geschlossen und wieder geöffnet hatte. Name Der Name der Anwendung. Dieser Name ist, wenn er denn vorhanden ist, ganz hilfreich, denn man kann hiermit ganz gezielt z.B. in das SDSF springen. Die Namen werden vom ISPF nicht automatisch in diese Spalte eingetragen. Das muss vielmehr durch die in dieser Ebene aufgerufene Anwendung geschehen. Wie man dies erreicht, werden wir in einem späteren Kapitel bei der Programmierung von ISPF Anwendungen besprechen. Panelid Hier wird der Name des ISPF Panels angegeben, das in dieser Ebene gerade aktiv ist. Wenn man mit den Panel-IDs vertraut ist, kann man auch hiermit eine Anwendung gezielt anspringen. Applid Hier wird die ISPF Applid angegeben, mit der diese Anwendung gestartet wurde. Beachten Sie bitte, dass jede Applid ihre eigenen PF Tastenbelegung besitzt. Session Type Hier steht normalerweise 3270.
4.7 Die Funktionstasten im ISPF
69
Tipp Falls Sie die Absicht haben, mehr als zwei Ebenen im ISPF zu nutzen, empfehle ich Ihnen dringend, folgende zwei Maßnahmen: Belegen Sie grundsätzlich in allen Anwendungen mit einer eigenen ISPF Application ID die PF9 Taste mit dem Text S WAP NEXT. Belegen Sie analog dazu die PF15 Taste mit dem Text SWAP LIST.
4.7
Die Funktionstasten im ISPF
Nachdem wir uns ein in der Praxis funktionsfähiges TSO/ISPF System eingerichtet haben, können wir jetzt daran gehen, dieses System für unsere tägliche Benutzung so zu optimieren, dass unsere Arbeit viel flotter als bisher von statten gehen kann. Was können und sollten wir tun, um dieses Ziel zu erreichen? • • •
Wir sollten unsere PF Tastenbelegung weiter optimieren. Wir sollten die ISPF Command Table so einrichten, dass wir mit deren Hilfe immer wiederkehrende Aufgaben optimieren und beschleunigen können. Wir sollten lernen, wie man mit Hilfe der „ISPF Personal Data Set Lists" die von uns immer wieder benötigten Dateigruppen mit möglichst geringem Aufwand zur Anzeige bringen.
4.7.1
PF Tastenbelegung optimieren
Wenn man sich im ISPF mit der PF Tastenbelegung beschäftigt, muss man zunächst eine Grundsatzentscheidung treffen: Will man KEYLISTs benutzen oder will man lieber mit der althergebrachten KEY Funktionalität arbeiten? Nachdem vor einigen Jahren die KEYLISTs (siehe hierzu das Kapitel „PF Tastenbenutzung mithilfe von KEYLISTs" ab Seite 72) im ISPF aufkamen, habe ich einige Zeit mit dieser neuen Einrichtung herum experimentiert. Ich konnte aber keinen wesentlichen Vorteil gegenüber der herkömmlichen KEYs Einrichtung feststellen und bin deshalb bei der alten Form der Benutzung der PF Tasten geblieben. Worin die Unterschiede zwischen KEYLISTs und KEYs liegt, wollen wir uns jetzt ansehen, indem ich Ihnen beide Methoden vorstelle. Bevor wir uns aber mit dem Thema KEYLIST versus KEYS beschäftigen, wollen wir uns anschauen, wie man die Belegung der PF Tasten am Bildschirm sichtbar macht und diese Anzeige auch wieder verschwinden lässt. Diese Technik ist nämlich fiir beide Methoden der PF Tasten Belegung gleich. Gerade die Anfänger im ISPF begrüßen es, wenn die PF Tasten Belegung zumindest für einige Zeit immer auf dem Bildschirm steht. Umfangreiche Informationen zum Thema PF Tasten Belegung finden Sie in der Broschüre ISPF User's Guide Volume II im Kapitel „Settings Option(O)".
70
4 ISPF einrichten
4.7.2
Einschalten der PF Tasten Anzeige
Um sich die PF Tasten Belegung auf dem Bildschirm anzeigen zu lassen, geben wir den Befehl PFSHOW ON ein und drücken ENTER. Dieser Befehl schaltet die Anzeige der PF Tasten für unser gesamtes ISPF ein. Mit PFSHOW OFF und ENTER kann die Anzeige wieder ausgeschaltet werden. Die Anzeige, die man durch die Eingabe des Befehls PFSHOW ON bekommt, hängt allerdings von mehreren Einstellungen ab, die man in einem speziellen Panel vornehmen kann. Um diesen Einstellungsbildschirm aufzurufen, gehen Sie wie folgt vor: 1. Geben Sie in irgendeinem ISPF Panel in der Command Line den Befehl PFSHOW TAILOR ein und drücken ENTER. 2. Daraufhin erscheint folgendes POP Up Panel, in welchem Sie die weiß unterlegten Einstellungen vornehmen und ENTER drücken. Menu
Utilities
Compilers
Options Status Help ISPF Settings Tailor Function Key Definition Display
Command ===>
1 2 5 7 8 1
For all terminals : Number of keys
. 2
Top of data
X. 2. 1. 2.
12 24 Keys per line . . 2 Six Maximum possible Primary range . . 1 1. Lower - 1 to 12 2. Upper - 13 to 24 For terminals with 24 PF keys : Display set 1. Primary - display keys 1 to 12 2. Alternate - display keys 13 to 24 3. All - display all keys Press ENTER key to save changes. Enter END to save changes and exit. Fl=Help F3=Exit F8=Forward F12=Cancel F13=Help F15=End F16=Return F17=Rfind F18=Rchange F22=Left F23=Right F24=Cretriev
Fl=Help F15=End
F3=Exit F16=Return
Abbildung 39 Function Key Definition
F8=Down F17=Rfind
F10=Actions F12=Cretriev F13=Help F18=Rchange F22=Left F23=Right
Panel
Wie Sie in der Anzeige sehen können, sind sowohl in dem POP UP Panel als auch in dem Basic Panel die PF Tasten Belegungen sichtbar. Gleichzeitig sehen Sie, dass die PF Tasten Belegung zwischen den beiden Panels unterschiedlich ist. Wenn wir jetzt das POP Up Panel durch Drücken der PF3 Taste verlassen, sehen wir zu unserer Überraschung, dass in dem Basic Panel immer noch keine PF Tasten Belegung zu sehen ist. Dies kommt daher, dass mit dem Befehl PFSHOW TAILOR ja nur die Optionen der Darstellung geändert wurden, aber keineswegs die Anzeige der PF Tasten damit auch eingeschaltet wurde.
4.7 Die Funktionstasten im ISPF
71
Die Anzeige der PF Tasten Belegung schalten wir ein, indem wir in der Command Line den Befehl PFSHOW ON eingeben und ENTER drücken. Menu
Utilities
Compilers
Options
Status
Help
ISPF Primary Option Menu Option = = > pfahow on 0 1 2 3 4 5 6 7 8 9 10 11 L
Settings View Edit Utilities Foreground Batch Command Dialog Test SDSF IBM Products SCLM Workplace LM Facility
Terminal and user parameters Display source data or listings Create or change source data Perform utility functions Interactive language processing Submit job for language processing Enter TSO or Workstation commands Perform dialog testing System Display and Search Facility IBM program development products SW Configuration Library Manager ISPF Object/Action Workplace Library administrator functions
< Su 7 14 21 28
Calendar March 2004 Mo Tu We Th Fr 1 2 3 4 5 8 9 10 11 12 15 16 17 18 19 22 23 24 25 26 29 30 31
Time Day of year.
> Sa 6 13 20 27
03 : 54 063
Enter X to Terminate using log/list defaults
Damit erhalten wir dann folgende Anzeige der PF Tasten Belegung: Menu
Utilities
Compilers
Options
Status
Help
ISPF Primary Option Menu Option ===> 0 1 2 3 4 5 6 7 8 9 10 11 L
Settings View Edit Utilities Foreground Batch Command Dialog Test SDSF IBM Products SCLM Workplace LM Facility
Terminal and user parameters Display source data or listings Create or change source data Perform utility functions Interactive language processing Submit job for language processing Enter TSO or Workstation commands Perform dialog testing System Display and Search Facility IBM program development products SW Configuration Library Manager ISPF Object/Action Workplace Library administrator functions
< Su 7 14 21 28
Calendar March 2004 Mo Tu We Th Fr 1 2 3 4 5 8 9 10 11 12 15 16 17 18 19 22 23 24 25 26 29 30 31
Time Day of year
F2= Split F3=Exit F12=Cretriev F13=Help Fl8=Rchange F19=Up F24 =Cretriev
F7=Backward F14=Split F20=Down
Abbildung 40 Bildschirm mit Anzeige der PF Tasten Belegung
F8=Down F15=End F21=Swap
Sa 6 13 20 27
• 03 54 063
Enter X to Terminate using log/list defaults Fl=Help F10=Actions F17=Rfind F23=Right
>
F9=Swap Fl 6==Return F22==Left
4 ISPF einrichten
72
4.7.3
PF Tastenbenutzung mithilfe von KEYLISTs
Bei dieser Art der Tastenbelegung werden die Inhalte der PF Tasten in speziellen Keylist Members gespeichert. Der Name eines solchen Members kann in einer Panel Definition angegeben werden, damit beim Starten dieses Panels die PF Tasten mit den in dem Keylist Member gespeicherten Informationen geladen werden. Das heißt, dass die PF Tasten Belegungen von Panel zu Panel wechseln können. Das hat aber auch zur Folge, dass man nie weiß, welche PF Tasten Belegung man gerade vor sich hat. Deshalb ist man gezwungen, permanent die PF Tasten Anzeige auf dem Bildschirm zu belassen. Diese Maßnahme nimmt einem dann immer vier Zeilen von dem verfügbaren Bildschirm „weg". Wir wollen uns einmal anschauen, wie man die Verwendung von Keylist einschaltet und wie dann die Panels aussehen: Man aktiviert die KEYLISTs in einem Panel, indem man in der Command Line Keylist on eingibt und ENTER drückt. Damit ist dann für diese ISPF Application die Verwendung von KEYLISTs eingeschaltet. Man sorgt mit pfehow on dafür, dass die PF Tasten Belegung angezeigt wird.
Tipp Will man immer und überall mit KEYLISTs arbeiten, dann sollte man im ISPF Primary Option Menu den Befehl Keylist on ausführen. Will man dagegen immer ohne Keylist arbeiten, dann sollte man dort Keylist off eingeben.
4.7.4
PF Tasten Belegung einer Keylist anzeigen
Wir wollen nun sehen, wie die Keylist heißt, welche uns die gerade vorliegende PF Tasten Belegung beschert hat. Dazu geben wir in der Command Line keylist ein und drücken EN-
TER. Daraufhin erscheint ein POP-UP Panel, in dem wir so lange nach unten blättern, bis eine Zei-
le erscheint, die den Text *** Currantly activa kaylist *** enthält. Der in dieser Zeile ganz vorne stehende Keylist Name bezeichnet die aktuelle Keylist. Dieses Bild sehen wir in der nachfolgenden Anzeige:
73
4.7 Die Funktionstasten im ISPF
Menu 1
Utilities
Compilers
Options
Status
iT \f oe i yr l x -ii cs ft
File
Help
TT4u t -ix 1x 4x fu t yr
1
View
0 Keylist Utility for ISR
Row 1 to 10 of 15 | > Scroll = = > CSR
0 ! Command ===>
1 X
I
2
|
N =New
Actions:
E=Edit
V=View
D=Delete
/=None
1
j \ 5 6 1 8 9 1 1 L P u
| i ! ! 1
1
E 1
\
Keylist ISRHELP ISRHLP2 ISRNAB ISRNSAB ISRREFL ISRREFO ISRSAB ISRSLAPP ISRSNAB ISRSPBC Fl=Help F9=Swap F15=End F20=Down
Fl =Help FIO =Actions F17 =Rfind
Type SHARED SHARED SHARED SHARED SHARED SHARED PRIVATE *** Currently active keylist *** SHARED PRIVATE PRIVATE F2=Split F3—Exit F7=Backward F8=Down F10=Actions F12=Cretriev F13=Help F14=Split F16=Return F17=Rfind F18=Rchange F19=Up F21=Swap F22=Left F23=Right F24=Cretriev
F2==Split F3=Exit F12==Cretriev F13=Help Fl 8==Rchange F19=Up
Abbildung 41 Anzeige der aktuellen
F7=Backward F8=Down F14=Split F15=End F20=Down F21=Swap
1 1
!
a
c® 3 0
7
4
3
F9=Swap F16=Return F22=Left
Keylist
Man sieht jetzt, dass die KEYLIST ISRSAB aktiv ist, d.h., die in dieser Keylist festgelegten PF Key Befehle werden ausgeführt, wenn wir eine der durch diese KEYLIST belegten Tasten drücken. Wir wollen uns nun noch das Panel für die Definition der Keylist ISRSAB anschauen, indem wir den Cursor vor diesem Namen positionieren, dort ein e eingeben und ENTER drücken. Daraufhin erscheint das auf der nächsten Seite zu sehende Keylist Edit Panel: Die einzelnen Spalten haben folgende Bedeutung: Definition Hier wird derjenige Befehl definiert, welcher beim Drücken der entsprechenden PF Taste ausgeführt werden soll. Format Diese Angabe hat in der Praxis keine große Bedeutung. Deshalb gehe ich hier nicht näher darauf ein. Label Diese Bezeichnung wird bei der Anzeige der PF Tastenbelegung angezeigt.
74
4 ISPF einrichten
ivc^
j . Ö
Row 1 to 12 of 24 Scroll ===> CSR
Make changes and then select File action bar. Keylist Help Panel Name . . . ISRSABH Key Fl . F2 . F3 . F4 . F5 . F6 . F7 . F8 . F9 . FIO Fil Fl 2 F13 Fl 4 Fl 5 Fl 6 Fl 7 F18 F19 F20 F21 F22 F23 F24
. . . . . . . . .
Definition HELP SPLIT EXIT
Format SHORT LONG SHORT
Label Help Split Exit
BACKWARD down SWAP ACTIONS
LONG SHORT LONG SHORT
Backward Down Swap Actions
CRETRIEV HELP SPLIT END RETURN RFIND RCHANGE UP DOWN SWAP LEFT RIGHT CRETRIEV
SHORT SHORT LONG SHORT SHORT SHORT SHORT LONG LONG LONG SHORT SHORT SHORT
Cretriev Help Split End Return Rfind Rchange Up Down Swap Left Right Cretriev
Abbildung 42 Keylist Edit Panel
Hier könnten wir nun Änderungen der PF Tastenbelegung vornehmen und diese Belegung dann speichern.
4.7.5
PF Tastenbenutzung ohne Verwendung von Keylist
Wenn man mit der „alten" Methode seine PF Tasten belegen will, dann muss man die Keylist Verwendung ausschalten, indem man in der Command Line eines ISPF Panels der betreffenden ISPF Application den Befehl Keylist off eingibt und ENTER drückt. Durch Eingabe von KEYS und ENTER wird jetzt die aktuelle Belegung der PF Tasten angezeigt. Man kann dann die PF Tastenbelegung hier direkt ändern und durch Drücken der PF3 Taste sogleich bleibend neu setzen. Die nächste Abbildung zeigt die PF Tastenbelegung für meine ISPF Application ISF, also für das SDSF:
75
4.7 Die Funktionstasten im ISPF
ISPOPT3E Command = >
PF Key Definitions and Labels - Primary Keys
Number of PF Keys . . . 24 Enter "/" to select . . / PF1 PF2 PF3 PF4 PF5 PF6 PF7 PF8 PF9 PF10 PF11 PF12 PF13 PF14 PF15 PF16 PF17 PF18 PF19 PF20 PF21 PF22 PF23 PF24 PF1 PF4 PF7 PF10 PF13 PF16 PF19 PF22
. . . . . . . . . . .
. . . . . . . . . . .
HELP START end return ifind tso %xcursor UP DOWN SWAP NEXT LEFT RIGHT
. . . . . . . . . . . .
. . . . . . . . . . . .
HELP pre lanzt*ßowner SWAP LIST tso %qwsdsf pre SQMTp*ßowner pre archi*ßowner pre pOpev*ßowner DOWN SWAP tso %jd tso %xcursor cretriev
Terminal type (Enable EURO sign)
.
3278A
. . ?
label label label label label label label label
. . . . . . . .
. . . . . . SQMTE* . .
* * * *
PF2 PF5 PF8 PF11 PF14 PF17 PF20 PF23
label label label label label label label label
Press ENTER key to display alternate keys
SQMTP*
PF3 PF6 PF9 PF12 PF15 PF18 PF21 PF24
label label label label label label label label
. . . . . . . .
. . . . . LÄNZT* . . . QWSDSF
Enter END command to exit.
Abbildung 43 PF Tastenbelegung für das SDSF
Merksätze zur PF Tastenbenutzung •
• • •
Das Ein- und Ausschalten der PF Tasten Anzeige am Bildschirm mithilfe von PFSHOW ON/OFF gilt immer für das gesamte ISPF. Schön wäre es gewesen, wenn die Programmierer im IBM Labor das auch an die Application gebunden hätte wie bei der KEYLIST. Das ist aber leider nicht der Fall! Das Ein- und Ausschalten der Verwendung von KEYLISTs mithilfe von keylist on/off gilt immer nur für die aktuelle ISPF Application (ISP, ISF, ISR usw.). KEYLISTs können für einzelne Panels definiert werden. Wenn ein Panel in einer Application, in der KEYLIST ON aktiv ist, aufgerufen wird und selbst keine KEYLIST benennt, gilt die ursprüngliche Tastenbelegung, und zwar so als
76
•
•
4 ISPF einrichten würde mit KEYLIST OFF gearbeitet. In diesem Fall werden die PF Key Definitionen aus den ZPF Variablen der Application übernommen. Werden keine KEYLISTS in einer ISPF Application benutzt, d.h. KEYLIST OFF ist aktiviert, dann werden die ZPFxx Variablen aus dem Profile des ISPF Users dieser Application benutzt. Diese können im laufenden Betrieb von Programmen verändert werden. So setzt z.B. das SDSF immer seine eigene PF Tasten Belegung. Eine ausfuhrliche Beschreibung der PF Tastenbelegungstechnik finden Sie in der Broschüre ISPF User's Guide Volume II im Kapitel „Settings (Option 0)".
4.7.6
PF Taste für den Aufruf von MVS/QuickRef
In der Einleitung habe ich Ihnen schon das Hilfesystem MVS/QuickRef vorgestellt. Damit Sie dieses System immer aufrufen können, egal in welcher ISPF Anwendung Sie sich gerade befinden, sollten Sie in jeder ISPF Anwendung die PF16 Taste mit dem folgenden Befehl belegen: TSO %QWSDSF Siehe hierzu die Abbildung „PF Tastenbelegung für das SDSF" auf Seite 75. Wenn Sie jetzt den Cursor unter eine Fehlermeldung oder einen Befehl stellen und dann die PF 16 Taste drücken, erhalten Sie die Beschreibung zu diesem Element. Selbstverständlich können Sie auch eine andere PF Taste mit diesem Befehl belegen. Sie sollten aber unbedingt darauf achten, dass Sie in jeder ISPF Anwendung dieselbe Taste wählen, denn das MVS/QuickRef System hält Informationen zu fast allen gängigen Subsystemen des MVS bereit. Hinweis Es gibt viele Befehle, die in mehreren Systemen verwendet werden. Deshalb erscheint in einem solchen Fall zunächst eine Anzeige, in der Sie das System auswählen müssen, zu dem Sie die Beschreibung des Befehls sehen möchten. Betrachten Sie dazu das folgende Beispiel. Ich habe den REXX Befehl SELECT während einer Edit Sitzung zur Erstellung eines REXX Programms eingegeben, den Cursor unter das Wort SELECT gestellt und dann die PF 16 Taste gedrückt. Daraufhin bekam ich folgende Anzeige:
77
4.7 Die Funktionstasten im ISPF
* MVS/QuickRef 5.8 *
Item ==>
Col 1 Line 1 of 16
Command ==> Scroll ==> CSR Select desired item for display or enter desired item at top left V=* P=* R=* I=SELECT Item Vendor Product Release SELECT ALLEN SYSTM ASG ASG-STRATEGIC SERVCS VARIOUS PRODS. SELECT IBM C/C++ LIBRARY FNCTNS V3R2 SELECT IBM COBOL MVSSVM SYNTAX V1R2 SELECT IBM COBOL OS/390 SYNTAX V2R1 SELECT IBM COBOL OS/390 SYNTAX V2R2 SELECT IBM COBOL Z/OS SYNTAX V3R1 SELECT IBM COBOL370/VSCOBOL II V1R1/V4 & PRIOR SELECT IBM DFSORT UTILITY V1R14 SELECT IBM PL/1 SYNTAX V2R3 & PRIOR SELECT IBM PL/1 SYNTAX V3R1 SELECT IBM SQL SYNTAX V7 SELECT IBM Z/OS CLIST SYNTAX V1R4 SELECT IBM V1R4 Z/OS IPCS COMMANDS SELECT IBM V1R4 Z/OS ISPF SERVICES s SELECT IBM Z/OS REXX SYNTAX V1R4 SELECT WORLD WIDE WEB HTML R4.0 S PRIOR ****************************** BOTTOM OF LIST ******************************** Type HELP on the command line to access MVS/QuickRef help information. Abbildung 44 MVS QuickRef Auswahl Anzeige
Da ich bei der Edit Sitzung gerade dabei war ein REXX Programm zu entwickeln, wollte ich mir natürlich die Beschreibung des SELECT Befehls für REXX ansehen. Deshalb habe ich hier den Cursor in die grau unterlegte Zeile gebracht, ein S eingegeben und dann ENTER gedrückt. Daraufhin erschien die Beschreibung für den SELECT Befehl, wie er in der REXX Sprache benutzt werden kann. Den Anfang dieser Beschreibung sehen Sie anschließend: Item ==> Command = > .000041.select
* MVS/QuickRef 5.8 *
Col 1 Line 1 of 62 Scroll ==> CSR
V=IBM P=Z/OS REXX SYNTAX R=V1R4 I=SELECT ********************* T e x t Below Copyright (c) 2004, IBM ********************* SELECT + + ö ö ö »—SELECT; > ö ö < ¿jö ö
ö > ö ö ö > ö ö ö ö
+
WHEN—expression
THEN
instruction
+-;-+
+-;-+ END—;
+-OTHERWISE
+ +-;-+
ö +
ö ö ö X ö ö ö ö ö +
5
ISPF Command Tables
Selbstdefinierte ISPF Befehle sind der beste Weg, um sich die tägliche Arbeit unter ISPF erheblich zu erleichtern. Leider sind die meisten ISPF Nutzer nicht in der Lage, solche Definitionen vorzunehmen, denn gerade für die Anwendungsebenen, in denen Sie am ehesten eigene Befehle benötigen würden, sind diese nur sehr umständlich zu definieren. Sie sollten aber jetzt nicht verzweifeln, denn ich werde Ihnen in den folgenden Kapiteln einen Königsweg zur Definition Ihrer eigenen ISPF Befehle aufzeigen. Und Sie werden dann hoffentlich sagen: „Es ist ja ganz einfach".
5.1
Einführung in die ISPF Command Technik
Hinweis Wenn Sie mit der ISPF Tabellentechnik noch nicht vertraut sind, empfehle ich Ihnen, sich zunächst das Kapitel „Tables - Erstellen und bearbeiten" ab Seite 439 anzuschauen. Wie Sie sicherlich schon bemerkt haben, hat fast jeder ISPF Bildschirm oben links eine Zeile, die mit Command ==> oder Option ==> beginnt. Die Zeile, in der diese Eingabemöglichkeit vorhanden ist, bezeichne ich im folgenden Text als „Command Line". In dieser Command Line können Sie immer ein oder mehrere ISPF Befehle eingeben. Wenn Sie mehrere ISPF Befehle zugleich ausgeführt haben wollen, dann müssen Sie die einzelnen Befehle bei der Eingabe durch den ISPF Command Delimiter Character trennen. Hinter Command ==> können Sie grundsätzlich zwei verschiedene Typen von Befehlen eingeben: • •
ISPF Primary Commands: Das sind Befehle wie z.B. TSO, Keylist, KEYS, DSLIST, =3.4, ISPFWORK usw. User Commands: Das sind Befehle, die vom ISPF User erstellt wurden.
Eine Beschreibung der ISPF Primary Commands finden Sie in der Broschüre: z/OS ISPF User's Guide Volume I. Welche User Commands stehen Ihnen aber nun zur Verfügung? Das können Sie ganz einfach ermitteln: Rufen Sie das ISPF Menü 3.9 auf, dann erhalten Sie das folgende POP UP Panel:
80
5 ISPF Command Tables Commands Command Table Utility Command = = > Specifications Application ID . . ISR Enter "/" to select option Show description field
Command search order Application table : ISR User table . . . . : Site table . . . . : System table . . . : ISP
If no application ID is specified, the current application ID will be used. The name of the command table to be processed is formed by prefixing the application id to the string 1CMDS'. For example: Application ID . . TST results in a command table name of 'TSTCMDS'.
| | | | I
Abbildung 45 Command Table Utility
Dieses Panel erfüllt zwei Aufgaben gleichzeitig: 1. Es dient als Einstiegsbildschirm, um zur Anzeige oder Modifikation von einzelnen Command Tables zu gelangen. Wobei hinter Application ID . . der Name einer Application ID einzugeben ist, deren Command Table zur Anzeige kommen soll. Wenn wir also bei dem obigen Panel jetzt ENTER drücken, wird die Command Table ISRCMDS angezeigt. Wie man diese Funktion benutzt, sehen Sie im Kapitel „Erstellen von eigenen ISPF Befehlen" ab Seite 83. 2. Es zeigt in der Spalte Command Search Order, welche Command Table Ebenen benutzt werden können und die Reihenfolge, in der die Command Tables (von oben nach unten) durchsucht werden. Wir sehen, dass man User Commands in vier verschiedenen Ebenen (und damit in vier verschiedenen Command Tables) definieren kann. Diese Ebenen sind: 1. 2. 3. 4.
Application User Site System
benutzt nicht benutzt nicht benutzt benutzt
Gleichzeitig sehen wir, dass nur die Application Ebene und die System Ebene einen Eintrag für einen Table Präfix haben und somit nur diese beiden Ebenen benutzt werden können. Wie aus der ebenfalls in der Bildschirmanzeige zu sehenden Erklärung hervorgeht, sind jetzt die Commands in den beiden Tables ISRCMDS und ISPCMDS wirksam.
5.1.1
Das M e m b e r I S P C O N F
Ich habe schon öfters im Verlauf meiner Darlegungen davon gesprochen, dass manche Definitionen und Optionen innerhalb Ihres ISPF durch die ISPF Systemtechnik vorgenommen werden.
81
5.1 Einführung in die ISPF Command Technik
Diese Optionen müssen natürlich irgendwo definiert und gespeichert werden. Dazu wird das Member ISPCONF benutzt. Ich empfehle Ihnen, sich bei Ihrer ISPF Systemtechnik nach diesem Member zu erkundigen und es sich einmal anzuschauen. Die meisten Eintragungen sind so aussagefähig, dass sich Ihnen deren Bedeutung leicht erschließt. Die Festlegung, welche der vier Ebenen, die in der Abbildung 45 auf Seite 80 zu sehen sind, für ISPF Command Tables benutzt werden können, wird bei der Einrichtung des ISPF durch die Systemtechnik getroffen. Hier ein Ausschnitt aus dem Member ISPCONF, der einige für uns interessante Werte enthält: MAXIMUM_NUMBER_OF_SPLIT_SCREENS APPLID_F0R_USER_C0MMAND_TABLE APPLID_FOR_SITE_COMMAND_TABLE SITE COMMAND TABLE SEARCH ORDER
= = = =
8 NONE NONE BEFORE
Abbildung 46 ISPCONF: ISPF Customization Member (Ausschnitt)
In unserem obigen Beispiel sehen wir, dass nur die Application- und die Systemebene benutzt werden können. Das bedeutet aber auch, dass immer nur zwei Command Tables gleichzeitig aktiv sein können. Die Reihenfolge, in der sie durchsucht werden, bestimmt die Definition von: SI TE_COMMAND_TABLE_SEARCH_ORDER
Hinweis Wenn hier BEFORE definiert ist, dann werden die Application-, die User- und die Site Table (soweit vorhanden) vor der System Table Ebene nach eingegebenen Befehlen durchsucht. Wenn hier AFTER definiert ist, dann wird die System Command Table ISPCMDS immer zuerst durchsucht. Wenn also ein bestimmter Befehl in beiden Tabellen definiert ist, dann wird in diesem Fall, wenn nämlich BEFORE gesetzt ist, nur der in der Application Ebene definierte Befehl ausgeführt, da diese Command Table zuerst durchsucht wird. Ich möchte an dieser Stelle die Erklärungen zum Member ISPCONF beenden. Es ging mir hier nur darum, Ihnen einen Hinweis auf dieses Member zu geben. Wenn Sie sich intensiver mit dem Thema ISPF Customization beschäftigen wollen, dann empfehle ich Ihnen die Broschüre ISPF Planning and Customizing.
5.1.2
Dateien für Command Tables
Wo stehen diese Command Tables? Wir haben bei der Einrichtung des ISPF schon gesehen, dass es dort einige Dateien gibt, die beim Starten des ISPF vorhanden sein müssen. Eine dieser Dateien ist die Datei mit dem DD Namen ISPTLIB. In dieser Datei sucht das ISPF beim Starten einer Anwendung nach dem Command Table Member, das zu dieser Anwendung gehört.
82
5 ISPF Command Tables
Wie wird der Name des Command Table Members gebildet? Der Name des Command Table Members wird, wie weiter oben schon erklärt, aus der Bezeichnung der Application ID mit dem dahinter gehängten String C M D S gebildet. Wenn wir uns in dem oben dargestellten Panel des Command T a b l e U t i l i t y die Eintragungen in der Spalte Command s e a r c h o r d e r noch einmal anschauen, dann sehen wir, dass es wahrscheinlich in der ISPTLIB Kette zwei Member mit den Namen ISRCMDS und ISPCMDS gibt. Ob diese Members existieren, wollen wir jetzt überprüfen: Dazu benutzen wir natürlich das Programm ISRDDN und suchen nacheinander nach den Members ISRCMDS und ISPCMDS. Ich habe diese Suche an meinem ISPF einmal durchgeführt. Nachdem die beiden Such Vorgänge beendet waren, sah ich die folgende Anzeige: Current Data Set Allocation Command = = = > Message Member ISPCMDS Member Member
ISPCMDS ISRCMDS
Member
ISPCMDS
> > > > > > > >
Act DDname ISPTABL ISPTLIB
Member was found Scroll ===> CSR Data Set Name Actions: B E V M F C I Q LANZT.USER.TABL.LPRT DBT1.DSQTLIBE LANZT . USER. TABL . LPRT SYST1.TSO.ISPTLIB SYST1.JCLPLUS.ISPTLIB ISP.SISPTENU ISF.SISFTLIB
Abbildung 47 Suchergebnis für die Members ISRCMDS und ISPCMDS
Tatsächlich sehen wir, dass das Member ISRCMDS in der Datei S Y S f 1 . TSO. I S P T L I B steht und das Member ISPCMDS in den Dateien LANZT. USER. TABL. LPRT und ISP.S1SPTENU. Daraus ergibt sich folgende Situation: •
Da das Member ISRCMDS nur in der ISPTLIB Kette steht, bedeutet das, dass die Befehle, die in diesem Member definiert sind, zwar von diesem ISPF User benutzt werden, er diese Command Table aber noch nicht geändert und wieder zurückgeschrieben hat. Denn dann müsste sie auch in jener Datei stehen, die unter ISPTABL zugeordnet ist. Denn wir haben bei der Besprechung der Concatenated Data Sets bereits gelernt, dass in eine Kette von Dateien nicht geschrieben werden kann.
•
Da das Member ISPCMDS sowohl unter dem DD Namen ISPTABL als auch unter dem DD Namen ISPTLIB zu finden ist, steht fest, dass der TSO User dieses Member schon einmal verändert und wieder zurückgeschrieben hat.
Aber warum hat er gerade in das Member ISPCMDS seine eigenen Befehle gestellt und nicht in das Member ISRCMDS? Diese Frage lässt sich wie folgt beantworten:
5.2 Erstellen von eigenen ISPF Befehlen
83
Hinweis Die Befehle in ISRCMDS sind nur so lange verfugbar, wie die Application ISR aktiv ist, da diese Command Table eine Application Command Table ist. Sobald eine neue Anwendung wie z.B. SDSF mit der Application ID ISF geöffnet wird, sind deren Befehle verfügbar und nicht mehr diejenigen aus der Table ISRCMDS. Die Table ISPCMDS ist aber, wie weiter oben zu sehen, in der ISPF System Ebene angelegt. Das heißt, dass deren Befehle immer verfügbar bleiben, gleichgültig, welche Anwendung geöffnet wird. Natürlich kann man auch die Table ISRCMDS mit eigenen Befehlen belegen. Man muss dabei aber immer bedenken, dass diese Befehle „verschwinden", sobald man eine neue ISPF Application aktiviert. Wir wollen uns jetzt einmal die Member Liste der Datei ISPTABL anschauen: Menu
Functions
LIBRARY Command = >
Confirm
Name $DOC $IMLPRT $SICHREC COMPS2 DGT1VIEW DGT2VIEW ISPCMDS ISPERROR ISRPLIST QWRFCMDS **End**
Utilities
Help
Size 13
Created 2000/04/14
Vol T1T106 Row 00001 of 00010 Scroll ===> CSR ID Changed 2000/04/14 14:: 41:;56 LANZT
7 8 3 2 165 5 128 12
2000/04/14 2003/01/29 2003/01/29 2003/01/29 2004/03/04 2003/01/29 2003/01/29 2003/01/29
2000/04/14 2003/01/29 2003/01/29 2003/01/29 2004/03/04 2003/01/29 2003/01/29 2003/01/29
LANZT . USER. TABL. LPRT Prompt
14 : 43: 29 13:: 57::06 13:: 57::07 13:: 57::07 11: 02:: 52 13 57:: 07 13:: 57;;07 13:: 57::07
LANZT LANZT LANZT LANZT LANZT LANZT LANZT LANZT
Abbildung 48 Member List des ISPTABL Dateien
Wie Sie sehen, hat dieser ISPF User nur zwei Command Tables geändert und wieder zurückgeschrieben. Diese sind grau unterlegt. Wir erinnern uns: Membernamen der ISPF Command Table Member werden gebildet, indem an die Application ID der Text CMDS angehängt wird. Wenn Sie also einmal nachsehen wollen, zu welchen Anwendungen bereits Command Tables existieren, dann suchen Sie in den Dateien, die unter ISPTLIB zugeordnet sind, nach Members mit dem Suffix CMDS.
5.2
Erstellen von eigenen ISPF Befehlen
Wir wollen uns jetzt nochmals dem Panel Command Table Utility der ISPF Auswahl 3.9 zuwenden.
84
5 ISPF Command Tables
Command Table Utility Command ===> Specifications Application ID . . ISP Enter "/" to select option Show description field
Command search order Application table I SR User table . . . Site table . . . System table . . ISP
If no application ID is specified, the current application ID will be used. The name of the command table to be processed is formed by prefixing the application id to the string 'CMDS'. For example: Application ID . . TST results in a command table name of 'TSTCMDS'.
Wenn wir die Anzeige, so wie sie oben zu sehen ist, vor uns haben, drücken wir einfach einmal ENTER, um zu sehen, was dann passiert: Wir erhalten dann folgende Anzeige, welche die Eintragungen zu meiner gegenwärtigen ISP Command Table enthält: Menu
Utilities
Help Display ISPCMDS
Row 1 to 34 of 116 Scroll ===> CSR
Command = = >
The command table is currently open, it cannot be modified. Use the view(V) row command to see an entire entry. Verb +A +AV +CATT +CA72 +CEXEC +COB +COMP
T 0 0 0 0 2 0 0
Action SELECT SELECT SELECT SELECT SELECT SELECT SELECT
PGM(ISRDSLST) PARM (DSL PGM ( ISRDSLST) PARM(DSL PGM(ISRDSLST) PARM(DSL PGM (ISRDSLST) PARM (DSL PGM (ISRDSLST) PARM (DSL PGM (ISRDSLST) PARM (DSL POI (ISRDSLST) PARM (DSL
ADMIN) AVLIBS) CATT) CA72) CEXEC) COB) COMPJOBS)
SUSPEND SUSPEND SUSPEND SUSPEND SUSPEND SUSPEND SUSPEND
SCRNAME ( $ A) SCRNAME ( $AV) SCRNAME ($CAT SCRNAME ($CA7 SCRNAME($CEX SCRNAME ($COB SCRNAME($COM
A bbildung 49 Anzeige der ISPF Command Table ISPCMDS im Menü 3.9
Wenn wir uns dieses Panel anschauen, dann fallt der grau unterlegte Text auf. Wenn wir uns den so richtig auf der Zunge zergehen lassen, dann beschleicht uns eine Ahnung, dass das mit dem Erstellen eigener ISPF Befehle wahrscheinlich nicht so einfach werden wird, denn hier können wir unsere Table ISPCMDS nicht unmittelbar ändern. Wir versuchen es jetzt einmal mit der Table für die Application ISF (SDSF), wobei wir darauf geachtet haben, dass zu diesem Zeitpunkt in keiner Ebene unseres ISPF das SDSF geöffnet ist.
85
5.2 Erstellen von eigenen ISPF Befehlen
File
Menu
Utilities
Help Update ISFCMDS
Command
= >
Row 1 to 16 of 59 Scroll = > CSR
Insert (I), delete (D), repeat (R) and edit (E) command entries. Enter END command to save changes or CANCEL to end without saving. Verb
T
ABEND
0
ACPBRL
0
ACFEDI
0
ACPEDO
0
ACPPRO
0
ACREDI
0
ACREDP
0
Action Description PASSTHRU Abnormally terminate SDSF PASSTHRU ISFACP browse listing PASSTHRU ISFACP edit input PASSTHRU ISFACP edit output PASSTHRU ISFACP profile PASSTHRU ISFACR edit source PASSTHRU ISFACR edit profile descriptions
Abbildung 50 Anzeige der ISPF Command Table ISFCMDS im Menü 3.9
Hier bekommen wir jetzt ein ganz anderes Bild als bei der Table ISPCMDS. Das kommt daher, dass wir zurzeit in diesem ISPF die Anwendung SDSF nirgends geöffnet haben. Deshalb ist die Table ISFCMDS zum Update verfügbar. Wir könnten also jetzt hier eigene Befehle eintragen oder die vorhandenen ändern. Diese wären aber nur unter der Anwendung SDSF verfügbar und das nützt uns für unser eigentliches Ziel, nämlich eigene Befehle unter der Application ID ISP (und damit für alle Ebenen des ISPF) zur Verfügung zu haben, leider nichts. Wie kann man die ISP Command Table ändern? Wenn Sie nur die Standardeinrichtungen des ISPF dazu benutzen können, müssen Sie wie folgt vorgehen: 1. Zuerst schauen Sie nach, ob in Ihrer Datei, die unter ISPTABL zugeordnet ist, das Member ISPCMDS schon vorhanden ist. Wenn nein, dann suchen Sie es mittels ISRDDN in der Datei Kette von ISPTLIB und kopieren es dann in die Datei, die unter ISPTABL zugeordnet ist. Falls Sie ISPTABL bisher nicht zugeordnet haben, können Sie keine Command Table ändern!!! 2. Danach erstellen Sie im Menü 3.4/M der Datei ISPTABL (das können Sie direkt in der ISRDDN Anzeige mit der Eingabe m aufrufen) eine Kopie von ISPCMDS mit dem Namen XXXCMDS. 3. Dann gehen Sie in das Menü 3.9, geben als Application ID XXX ein und drücken ENTER.
86
5 ISPF Command Tables
4. Jetzt erscheint der Inhalt der aktuellen ISPCMDS Table (den Sie ja gerade nach XXXCMDS kopiert haben) mit der Möglichkeit, Updates vorzunehmen. 5. Führen Sie Ihre beabsichtigten Updates durch und verlassen Sie das Panel mit der PF3 Taste. Jetzt enthält das Member XXXCMDS in Ihrer Datei ISPTABL den Inhalt, den Sie gerne im Member ISPCMDS hätten. 6. Kopieren Sie das Member XXXCMDS in das Member ISPCMDS. Vergessen Sie dabei nicht die REPLACE Option anzuschalten. 7. Verlassen Sie jetzt das ISPF und starten sie es mit der Eingabe ISPF auf der TSO Ebene neu. Ihre ursprünglich im Member XXXCMDS erstellten Befehle stehen Ihnen jetzt auch unter der Application ID ISP und damit im ganzen ISPF zur Verfugung. Das ist zwar eine Menge Arbeit, aber es funktioniert! Es wäre aber schön, wenn es ein Werkzeug gäbe, mit dem das Erstellen von ISPF Befehlen immer durchgeführt werden könnte, und zwar unabhängig davon, ob die betreffende Anwendung gerade aktiv ist oder nicht. Ein solches Werkzeug habe ich schon vor langer Zeit für meinen eigenen Bedarf entwickelt. Es ist unter dem Namen CMDSMOD in den LANZ Utilities als REXX Prozedur verfügbar. Siehe hierzu die Beschreibung des Programms CMDSMOD ab Seite 535.
5.3
Die Prozedur CMDSMOD
Um das Programm CMDSMOD nutzen zu können, müssen Sie es wie folgt installieren: 1. Kopieren Sie das REXX Programm CMDSMOD von der LANZ Utility CD in Ihre Datei für ausfuhrbare Prozeduren. 2. Kopieren Sie die Panel Definition des Panels CMDSMOD in Ihre Panel Datei. Sie können die Prozedur jetzt mit TSO %CMDSMOD I S P aufrufen. Es erscheint dann folgendes Panel, das den Beginn der Command Table ISPCMDS zeigt. Der Inhalt ist bei Ihrer Anzeige möglicherweise anders! Alter ISPF Command Tables CMDSMOD Command — ISPF Command Table Member = ISPCMDS Found in DSN = ISP.SISPTENU is saved to = LANZT.USER.TABL.LPRT Cmd »
Row 17 to 32 of 117 Scroll = CSR Active APPLID = ISR
R=Repeat, I=Insert, D=Delete
Cmd
Description
CUAATTR_ 0
SELECT PGM(ISPOPT) PARM(ISPOPT11) SCRNAME(SETTINGS) INVOKE CUA ATTRIBUTE CHANGE UTILITY SELECT PGM(ISRDDN) NEWAPPL(ISR) SUSPEND SCRNAME(DDLIST) PARM ( & Z PARM WORK WITH DDNAMES AND BROWSE ENQS AND STORAGE
DDLIST
Abbildung
0
51 Bearbeitungsmenü
des Programms
CMDSMOD
5.3 Die Prozedur CMDSMOD
5.3.1
87
ISPF Befehle mithilfe von CMDSMOD bearbeiten
Im Panel CMDSMOD können Sie: • •
•
Die vorhandenen Befehle ändern, indem Sie die Felder eines Eintrags einfach überschreiben und dann ENTER drücken. Befehle neu erstellen, indem Sie einen vorhandenen Eintrag mit r doppeln, um ihn dann zu ändern oder sich mit i einen neuen leeren Eintrag erzeugen lassen und dann den Befehl komplett neu eintragen. Einträge löschen, indem Sie ein d eingeben und ENTER drücken.
Regel Immer wenn Sie vorne in der Spalte Cmd eines der Zeichen r, i oder d eingetippt haben, müssen Sie mindestens einmal die Leertaste drücken bevor Sie ENTER eingeben. Sonst wird nämlich Ihre Eingabe nicht als Befehl erkannt, sondern Sie haben lediglich dem vorhandenen Befehl einen anderen Namen gegeben. Wenn Sie Änderungen innerhalb eines Eintrags vorgenommen haben, drücken Sie immer zuerst die ENTER Taste bevor Sie Änderungen in einem anderen Eintrag vornehmen. Das Programm CMDSMOD kann nämlich immer nur einen Eintrag pro ENTER verarbeiten.
5.3.2
Beschreibung der Eingabefelder
Jeder Eintrag für einen ISPF Befehl besteht aus vier Elementen: • • • •
Dem bis zu acht Zeichen langen Aufruftext, also dem ISPF Befehl. Dieser Name muss von Ihnen festgelegt werden. Einer Angabe, wie viele Zeichen des Aufruftextes beim Aufruf des Befehls mindestens eingegeben werden müssen. Dem eigentlichen Statement, das vom ISPF ausgeführt werden soll (max. 240 Zeichen). Einem Beschreibungstext (max. 80 Zeichen).
Beispiel +CEXEC
2
SELECT PGM(ISRDSLST) PARM (DSL CEXEC) SUSPEND SCRNAME ($CEXEC) DSLIST CEXEC COMPILED REXX PROCEDURES
Mit diesem Eintrag bewirkt man Folgendes: • •
Mit dem Aufruf von +C wird die DSLIST CEXEC angezeigt. Da wir als Mindestabkürzung zwei Zeichen angegeben haben, genügt +c. Im SWAP LIST Panel erscheint der Screen Name $EXEC.
88
5 ISPF Command Tables
Hinweis Sie müssen unbedingt darauf achten, dass Sie als Aufruftext nicht aus Versehen einen originalen ISPF Befehl definieren. Falls Sie das tun, dann wird der originale ISPF Befehl nie wieder ausgeführt, denn die Command Tables werden nach der Eingabe eines Befehls immer zuerst durchsucht.
5.3.3
Den Aufruf von CMDSMOD als Befehl definieren
Natürliche können wir den Aufruf für die REXX Prozedur CMDSMOD auch als ISPF Befehl definieren. Dieser Eintrag muss so aussehen: CMDSMOD_ 3
SELECT CMD(%CMDSMOD &ZPARM) SUSPEND SCRNAME (CMDSMOD) REXX CMDSMOD ISPF COMMAND TABLE EDITIEREN
Wie Sie an dem Aufruf der Prozedur CMDSMOD sehen, erwartet diese beim Aufruf einen Parameter. Diesen Parameter können Sie benutzen, um die Command Table einer beliebigen Anwendung aufzurufen. Wenn kein Parameter mitgegeben wird, dann setzt das Programm automatisch die APPLID ISP ein. Beispiele • • •
Für den Aufruf von ISPCMDS geben Sie einfach CMD ISP ein und drücken ENTER. Für den Aufruf von ISFCMDS (das ist die Command Table des SDSF) geben Sie CMD ISF ein und drücken ENTER. Für den Aufruf der Command Table der Anwendung ISR (das ist die Application Ebene, die normalerweise innerhalb der Panels des ISPF aktiv ist) geben Sie CMD ISR ein und drücken ENTER.
5.3.4
Erzeugen einer Liste der Befehle
Mit dem Programm CMDSMOD können Sie eine Liste der Befehle aus der gerade im Aufruf stehenden ISPF Command Table erzeugen. Dazu geben Sie in der Command Line den Befehl SAVELIST ein und drücken ENTER. Durch diesen Befehl wird eine Datei erstellt, die jeweils in einem Datensatz die Befehle der im Aufruf befindlichen Command Table enthält. Diese Datei können Sie dann auf den PC übertragen, mit einem Textverarbeitungssystem aufbereiten und ausdrucken. Der Dateiname der Ausgabedatei setzt sich wie folgt zusammen: userid.tablename.LIST Zwei Beispiele der erzeugten Dateien: LANZT.ISFCMDS.LIST LANZT.ISPCMDS.LIST
Liste der Befehle der Application ISF (SDSF) Liste der allgemeinen ISPF Befehle
89
5.3 Die Prozedur CMDSMOD Beispiel für einen Aufruf von SAVELIST Hier ein Ausschnitt au der Datei LANZT.ISPCMDS.LIST: Line 00000000 Col 001 080 Scroll = = > CSR ********************************* Top of Data ********************************* SUSPEND SCRNAME (DSLISTEN) ++ SELECT PGM(ISRDSLST) PARM(PL2) 0 ALIAS APPEND +++ 0 SUSPEND SCRNAME ($A) +A SELECT PGM(ISRDSLST) PARM (DSL ADMIN) 0 SELECT PGM(ISRDSLST) PARM (DSL AVLIBS) SUSPEND SCRNAME ($AV) +AV 0 SUSPEND SCRNAME ($CATT) +CATT 0 SELECT PGM(ISRDSLST) PARM (DSL CATT) SUSPEND SCRNAME ($CA7 2) +CA72 SELECT PGM(ISRDSLST) PARM (DSL CA72) 0 SUSPEND SCRNAME ($CEXEC) +CEXEC 2 SELECT PGM(ISRDSLST) PARM (DSL CEXEC) SUSPEND SCRNAME ($COB) +COB 0 SELECT PGM(ISRDSLST) PARM (DSL COB) SELECT PGM(ISRDSLST) PARM (DSL COMP JOBS) SUSPEND SCRNAME ($COMP) +COMP 0 SUSPEND SCRNAME ($IMS) +IMS 0 SELECT PGM(ISRDSLST) PARM (DSL IMSDAT) +INF SELECT PGM(ISRDSLST) PARM (DSL INFO) SUSPEND SCRNAME ($INF) 0 SUSPEND SCRNAME ($LANZ) +LANZ 3 SELECT PGM (ISRDSLST) PARM (DSL LANZ) ISRBROBA Command
LANZT. ISPCMDS. LIST ==>
Die weiter rechts stehenden Teile der Zeilen sind hier leider nicht zu sehen. Wenn man SAVELIST eingibt und ENTER drückt, wird die Ausgabedatei erstellt und deren Name in einem kleinen Rahmen am unteren Bildschirmrand angegeben. CMDSMOD Alter ISPF Command Tables Command = ISPF Command Table Member = ISPCMDS Found in DSN = LANZT.USER.TABL.LPRT is saved to = LANZT.USER.TABL.LPRT Cmd »
Row 1 to 8 of 123 Scroll = CSR Active APPLID = ISR
R=Repeat, I=Insert, D=Delete
Cmd
Description
++
SELECT PGM(ISRDSLST) PARM(PL2) SUSPEND SCKNAME (DSLISTEN) DSLIST STANDARD PERSONNAL DATA SET OPEN ALIAS APPEND DSLIST ADMIN APPEND PANEL FUER DSLIST AUFRUFEN SUSPEND SCRNAME ($A) SELECT PGM(ISRDSLST) PARM (DSL ADMIN) DSLIST ADMIN ADMIN DATEIEN SUSPEND SCRNAME ($AV) SELECT PGM(ISRDSLST) PARM (DSL AVLIBS) DSLIST AVLIBS ALLE DATEIEN DER AV SELECT PGM(ISRDSLST) PARM(DSL CATT) SUSPEND SCRNAME ($CATT) DSLIST CATT VINT JOB DATEIEN FUER TEST SELECT PGM(ISRDSLST) PARM (DSL CA72) SUSPEND SCRNAME ($CA72) DSLIST CA72 VINT JOB DATEIEN FUER PROD SELECT PGM (ISRDSLST) PARM (DSL CEXEC) SUSPEND SCRNAME ($CEXEC) DSLIST CEXEC COMPILED REXX PROCEDURES
+A +AV +CATT +CA72 +CEXEC
The ISPF command table ISPCMDS is written to file
'LANZT.ISPCMDS.LIST'
Abbildung 52 Beispiel fiir die Erzeugung einer Liste der Command Table ISPCMDS
6
DSLIST - Data Set Lists
Hier beginnen jetzt einige Kapitel, die sich mit der Behandlung von Dateien im ISPF beschäftigen. Vor allem handeln diese Kapitel auch davon, welche Vorteile man sich durch geschicktes Nutzen der Möglichkeiten, die im ISPF stecken, verschaffen kann. Nutzen Sie unbedingt die Möglichkeit mit DSLISTen zu arbeiten. Die DSLISTen sind eines der stärksten Hilfsmittel, um Ihre Arbeit im ISPF zu beschleunigen und zu optimieren. Grundsätzliches zu den DSLISTen: Die Hauptarbeit im ISPF erstreckt sich auf die Arbeit mit Dateien. Deshalb ist meist der erste Befehl, den ein ISPF Benutzer eingibt, wenn er das Logon Verfahren beendet hat und der dieses Buch noch nicht kennt, der Befehl 3.4. Das heißt nichts anderes, als dass er sich nach dem Logon schnurstracks in das DSLIST Utility begibt, um sich die DSNs der Dateien anzeigen zu lassen, mit denen er seine Arbeit beginnen möchte. Denn das, was im ISPF Bildschirm 3.4 angezeigt wird, ist genau das „DSLIST Utility Panel". Ich habe von Leuten gehört, die nicht sehr viel im ISPF machen müssen, dass diese außer dem Menü 3.4 nichts vom ISPF kennen. Auch daran mögen Sie erkennen, dass hinter diesem Teil des ISPF eine Menge Power stecken muss. Wie Sie im Verlauf dieses Kapitels sehen werden, kann man DSLISTen • • •
auf verschiedenen Wegen erstellen. dazu benutzen, um die unterschiedlichsten Kombinationen von Dateinamen zusammenzufassen und zur Verarbeitung anzuzeigen. von allen Panels im ISPF aus aufrufen.
Den maximalen Nutzen aus den DSLISTen zieht man aber erst dann, wenn man die einzelnen DSLISTen mit ISPF Befehlen direkt aufrufen kann. Wie man diese ISPF Befehle einrichtet, haben wir im Kapitel „ISPF Command Tables" ab Seite 79 gelernt. Zum Beispiel rufe ich die DSLIST zur Anzeige aller meiner REXX Dateien einfach mit dem ISPF Befehl +r auf.
92
6 DSLIST - Data Set Lists
6.1
Das DSLIST Panel
Nachdem wir im „Primary Option Menu" des ISPF den Befehl 3.4 eingegeben und ENTER gedrückt haben, erscheint das folgende Panel: Menu
RefList
RefMode
Utilities
Help
Data Set List UtilityOption -==> blank Display data set list V Display VTOC information
P Print data set list PV Print VTOC information
Enter one or both of the parameters below: Dsname Level . . . PROX.*.REXX Volume serial . . Data set list options Initial View . . . 1
1. 2. 3. 4.
Volume Space Attrib Total
Enter "/" to select option / Confirm Data Set Delete / Confirm Member Delete / Include Additional Qualifiers
When the data set list is displayed, enter either: "/" on the data set list command field for the command prompt pop-up, an ISPF line command, the name of a TSO command, CLIST, or REXX exec, or "=" to execute the previous command. Abbildung 33 Das Dataset List Utility Panel (Option 3.4)
Dieses Panel bietet einige wichtige Eingabemöglichkeiten und Optionen an, die wir uns jetzt der Reihe nach von oben nach unten anschauen wollen.
6.1.1
Die Möglichkeiten der Action Bar
Daraus betrachten wir nur den Punkt RefList genauer: Hinter RefList versteckt sich eines der wichtigsten Werkzeuge des gesamten DSLIST Systems bzw. sogar des gesamten ISPF. Diese Option stellt eine der Möglichkeiten dar, „Personal Data Set Lists" anzulegen und zu verwalten. Eine weitere Möglichkeit, DSLISTen zu verwalten, werden wir im Laufe dieses Kapitels kennen lernen. Wir bewegen den Cursor in den Text RefList und drücken ENTER. Dann erscheint die folgende Anzeige, mit der man die Editierfunktion für DSLISTen aufruft:
6.1 Das DSLIST Panel
93
RefList RefMode Utilities Help 1 1 | | 2 1. Current Personal Data Set List (CEXEC) 1 2. List of Personal Data Set Lists Optio | 1 1 P Print data set list blank Display data set list PV Print VTOC information V Display VTOC information Menu
Enter one or both of the parameters below: Dsname Level . . . LANZT.** Volume serial . . Data set list options Initial View . . . 1
1. 2. 3. 4.
Volume Space Attrib Total
Enter "/" to select option / Confirm Data Set Delete / Confirm Member Delete / Include Additional Qualifiers
When the data set list is displayed enter either: "/" on the data set list command field for the command prompt pop-up, an ISPF line command, the name of a TS0 command, CLIST, or REXX exec, or "=" to execute the previous command. Abbildung 54 Das Reflist Pull Down Menu
Wenn man jetzt in dem Rahmen eine 2 eingibt und ENTER drückt, dann gelangt man in das Panel zur Definition von „Personal Data Set Lists": File
View
Options
Help
Active: CEXEC Command ===> Action: 0=0pen
_
Personal Data Set Lists A=Save As
Name CEXEC PRTT. CEXEC PROX. CEXEC PROX. * . CEXEC
D=Delete
E=Edit
L=DSLIST
Description Compiled REXX Procedures
REFLIST Last 30 referenced data sets 1 LANZT.LOGON.CLIST1 'LANZT.PCSICH.DSNS' ' PROX. LANZ . REXX ' ' PROX. LANZ . REXX. REXX ' PROX.LANZ.REXX.LISTE.$REXP ' PROX. LANZ . REXX. LISTE . $REXP' ADMIN Admin Datasets QMS*.MAS* PRTT . * . JCL SMQP . PAN. JCL Abbildung 55 Das Personal Data Set Lists Panel
List 1 of 2 Scroll ===> PAG
Created 03/08/06
Referenced 04/03/10 09:47
99/10/05
04/03/09 16:52
94
6 DSLIST - Data Set Lists
Die grau unterlegten Zeilen zeigen einige meiner ca. 20 „Personal Data Set Lists". Die Liste mit dem Namen REFLIST wird vom ISPF automatisch geführt. In ihr sind die Namen der 30 zuletzt benutzten Dateien enthalten. Wir werden uns mit diesem Panel später noch ausführlicher beschäftigen, wenn wir die Erstellung und Bearbeitung von „Personal Data Set Lists" behandeln.
6.2
Die DSLIST Panel Fields
Zunächst werde ich Ihnen die einzelnen Eingabefelder des Standard DSLIST Panels, das wir über die Auswahl 3.4 erreichen, erläutern. Teilweise haben die Eintragungen, die wir hier vornehmen, Auswirkungen auf die Anzeige von DSLISTen ganz allgemein. Manche dieser Optionen können auch noch von anderen Panels aus geändert werden.
6.2.1
Der DSNAME Level
Hier können wir eine Maske eintragen, die festlegt, nach welchen Dateien das DSLIST Utility sucht, nachdem wir ENTER gedrückt haben. Die durch diese Suche gefundenen DSNs werden als DSLISTe angezeigt. Für die Gestaltung der DSN Maske hat man viele Möglichkeiten. Ich möchte Ihnen einige dieser Möglichkeiten zeigen:
Aber halt, da müssen wir vorher noch etwas sehr wichtiges besprechen! Da das Ergebnis der Anzeige sehr stark von einer anderen Option, die auch im DSLIST Panel gesetzt werden kann, abhängt, müssen wir deren Bedeutung zuerst einmal besprechen. Es handelt sich dabei um die Option Include Additional Qualifiers, die in der rechts unten liegenden Spalte E n t e r " / " t o s t t l e c t o p t i o n als letzte Zeile zu finden ist.
•
Wenn wir hier den Schrägstrich (/) vor I n c l u d e A d d i t i o n a l Q u a l i f i e r s set-
•
zen, kommen alle DSNs, die sich aus der Maske ergeben mit allen Namenserweiterungen zur Anzeige. Wenn wir den Schrägstrich weglassen, dann werden bei der Auswahl der anzuzeigenden Dateinamen diejenigen weggelassen, die hinter der Maske noch Erweiterungen aufweisen.
Gerade weil sich diese Option auf alle Anzeigen von DSLISTen auswirkt, muss sie von vorne herein für Ihre Bedürfnisse richtig „sitzen". Denn: Je nachdem, wie diese Option gesetzt ist, müssen Sie die Auswahlmasken in Ihren DSLISTen entsprechend anders gestalten. Ich persönlich habe mich dafür entschieden, die Option Include Additional Qualifiers ausgeschaltet zu lassen. Welche Einstellung Ihnen besser gefällt, müssen Sie selbst entscheiden, nachdem Sie die folgenden Ausführungen zu den DSLISTen, deren Erstellung und Nutzung gelesen haben.
95
6.2 Die DSLIST Panel Fields
Die folgenden zwei Beispiele sollen Ihnen den Effekt der Option Include Additional Qualifiers zeigen: Bildschirmanzeige einer DSLISTe bei ausgeschaltetem Include Additional Qualifiers mit der Maske PROXAREXX: Menu
Options
View
Utilities
Compilers
Help Row 1 of 2 Scroll ===> CSR
DSLIST - Data Sets Matching PROX.*.REXX Command = > Message
Command - Enter "/" to select action PROX. LANZ . REXX PROX.LOGON.REXX ***************************** End of Data Set list
Volume D1D119 D1D135
* * * * * * * * * * * * * * * * * * * * * * * * * * * *
Wie Sie sehen, werden hierbei nur die tatsächlich gewünschten DSNs angezeigt! Bildschirmanzeige der DSLISTe bei eingeschaltetem Include Additional Qualifiers mit der Maske PROXAREXX: Menu
Options
View
Utilities
Compilers
Help
DSLIST - Data Sets Matching PROX.*.REXX Command ===> Command - Enter "/" to select action PROX. LANZ . REXX PROX. LANZ . REXX. LISTE . $REXP PROX. LANZ. REXX. REXX PROX. LOGON. REXX PROX. LOGON. REXX. LISTE. #IMACROA PROX. LOGON. REXX. REXX ***************************** End of Data Set list
Row 1 of 6 Scroll = = > CSR Message
Volume D1D119 T1T101 D1D116 D1D135 T1W121 D1D104
* * * * * * * * * * * * * * * * * * * * * * * * * * * *
Die grau unterlegten Namen werden jetzt noch zusätzlich angezeigt. Manchmal ist diese erweiterte Anzeige ziemlich lästig und überflüssig, deshalb ist bei mir diese Option ausgeschaltet. Bei diesem Beispiel können Sie sehen, dass alle Dateien angezeigt werden, die den Bedingungen der Maske von vorne her genügen. Zudem werden noch alle Dateien mit allen möglichen Qualifiers, die zu der Maske passen, angezeigt. Den gleichen Effekt, den man mit dem Setzen der Option Include Additional Qualifiers auf ON erreichen .kann, erzielt man, wenn man die Auswahlmaske mit dem generischen Doppelstern enden lässt. Beispiel: LANZT.** zeigt alle DSN an, die mit LANZT beginnen.
96
6 DSLIST - Data Set Lists
Tipp Das Setzen der Option Include Additional Qualifiers bestimmt auch die Anzeigen in den Personal Data Set Lists, die von der ISPF Ebene aus gestartet werden, in der diese Option gesetzt ist. Allerdings ist dabei ein kleiner Trick anzuwenden: Wenn Sie in einem 3.4 Panel diese Option verändert haben, dann müssen Sie EINMAL dieses Panel mit ENTER zur Anzeige bringen. Danach wirkt diese Option auch für die in dieser ISPF Ebene aufgerufenen Personal Data Set Lists. Ich empfehle Ihnen, mit dieser Option selbst einige Tests durchzufuhren, um Erfahrung im Umgang mit ihr zu sammeln. Das lohnt sich bestimmt! Bei allen weiteren Betrachtungen gehen wir davon aus, dass die Option Include Additional Qualifiers auf AUS gesetzt ist. So, nun aber weiter mit den Möglichkeiten der Definition von Masken hinter Dsname L e v e l im DSLIST Panel. Sie können die beiden Sonderzeichen Stern (*) und Prozent (%) zur Steuerung der Auswahl einsetzen. • •
Ein Sternzeichen wirkt als generisches Zeichen. Das heißt, dass ab dieser Stelle ein oder mehrere Zeichen innerhalb eines Qualifiers vorkommen können. Zwei Sternzeichen hintereinander bewirken, dass ab hier ALLE Qualifier und Zeichen angezeigt werden.
Einige Beispiele sollen diesen Effekt verdeutlichen: Ich gebe nur meine Benutzer ID LANZT ein und erhalte folgende Anzeige: DSLIST - Data Sets Matching LANZT Command = = > Command - Enter "/" to select action LANZT ***************************** End of Data Set list
Row 1 of 1 Scroll = > CSR Message
Volume *ALIAS
* * * * * * * * * * * * * * * * * * * * * * * * * * * *
Wie Sie sehen, bekomme ich nur den Alias Eintrag angezeigt. Als Nächstes gebe ich Folgendes ein: LANZT.* DSLIST - Data Sets Matching LANZT.* Command ===> Command - Enter "/" to select action LANZT.SPILL ***************************** End of Data Set list
Row 1 of 1 Scroll ===> CSR Message
Volume T1W111
* * * * * * * * * * * * * * * * * * * * * * * * * * * *
Jetzt erhalte ich zumindest eine Datei angezeigt. Aber warum nur eine? Das kommt daher, dass mit der Erweiterung (.*) in meiner Maske nur nach Dateien gesucht wird, die hinter dem HLQ genau einen weiteren Qualifier haben. Und da gibt es halt nur die eine! Nun versuchen
6.2 Die DSLIST Panel Fields
97
wir es mit: LANZT.** Und bekommen alle Dateien, die mit dem HLQ LANZT beginnen zu sehen. Row 1 of 25 Scroll = = > CSR
DSLIST - Data Sets Matching LANZT.** Command = > Command - Enter "/" to select action LANZT LANZT LANZT LANZT LANZT LANZT LANZT LANZT
LANZT.STROBE.SQMTPTST BTXI.SESSION.LOESCH ISPCMDS. LIST TEST. TABL LPRT. SPFLOG1. LIST USER. TABL. LPRT USER.TABL.LPRX
Message
Volume «ALIAS P0XYZ5 ?????? D1D104 D1D128 T1W125 T1T106 T1T102
Beispiele für DSLIST Masken (bei ausgeschaltetem Include Additional Qualifiers im DSLIST Panel): Maske SYS*
SYS*.* *.*.REXX **.*.REXX SYS* **
LANZT.%%.* PROX.**.REXX Tabelle 6 Definitionsbeispiele
Ergebnis Dateien, die mit SYS beginnen und nur einen Qualifier haben. Das sind in der Regel nur Alias Einträge. Diese Auswahl eignet sich sehr gut dazu, nach Alias Einträgen zu suchen. Dateien, die mit SYS beginnen und zwei Qualifier haben. Alle Dateien im gesamten System, die genau drei Qualifier haben und deren letzter Qualifier REXX ist. Alle Dateien im gesamten System, die als letzten Qualifier REXX haben. Alle Dateien, die mit SYS beginnen. Vorsicht beim Ausprobieren. Das können zigtausende sein! Bei meinem Test waren es über 12 Tausend. Dateien, die den HLQ LANZT haben, deren 2. Qualifier genau 2 Zeichen lang ist und die noch einen dritten Qualifier haben. Alle Dateien, die als HLQ PROX haben und deren LLQ REXX ist. von DSLIST
Masken
Volume Serial Die Benutzung dieses Feldes besprechen wir in dem Kapitel „Benutzung des Volume Serial Feldes" auf Seite 117. In dem Abschnitt Data set list options können wir folgende Optionen setzen:
98
6 DSLIST - Data Set Lists
Initial View. Hier sollten wir die Option 1 wählen, weil damit die Anzeige, vor allem bei besonders großen DSLISTen, sehr schnell vor sich geht. Wenn die Liste dann angezeigt wird und man benötigt die zusätzlichen Dateiinformationen doch noch, kann man diese mithilfe der Tasten PF 10/11 zur Anzeige bringen. Wenn eine der Optionen 2 bis 4 gesetzt ist, muss das System nämlich zu jeder Datei die zugehörigen Attribute auch aus den Katalogen und VTOCs zusammensuchen. Das kann ganz schön lange dauern. Enter "/" to select option Die Eintragungen in den ersten beiden Zeilen sind besonders wichtig, denn sie bestimmen darüber, ob wir bei DELETE Operationen nochmals eine Sicherheitsabfrage erhalten oder nicht. Lassen Sie diese beiden Options immer eingeschaltet!
6.3
Die Verarbeitung im DSLIST Panel
Die Verarbeitungsmöglichkeiten ftir die im DSLIST Panel angezeigten Dateien sind sehr umfangreich. Fast könnte man sagen, es handelt sich bei der Anzeige um eine Edit Anzeige. Eine ausfuhrliche Beschreibung der Möglichkeiten, die das DSLIST Panel bietet, finden Sie in der IBM Broschüre ISPF User's Guide Volume II im Hauptkapitel „Utilities" und dort im Unterkapitel „Data Set List Utility (Option 3.4)". In den folgenden Unterkapiteln möchte ich nur die, nach meiner Meinung fur die tägliche Arbeit wichtigen Möglichkeiten und Befehle besprechen. Tipp Diese in den folgenden Unterkapiteln beschriebenen Verfahren gelten fur ALLE DSLIST Panels, und zwar unabhängig davon, ob diese durch eine schlichte Auswahl über das Panel 3.4 oder durch eine „Personal Data Set List" erstellt wurden.
6.3.1
Die DSLIST Primary Commands
Wie Sie gleich sehen werden, gibt es eine Fülle von zum Teil sehr nützlichen Primary Commands. Ich habe für Sie hier anschließend die Liste der Primary Commands aus dem Hilfe Panel zum DSLIST Panel einmal eingefugt:
99
6.3 Die Verarbeitung im DSLIST Panel
You can use the following commands from the COMMAND line after the data set list is displayed: APPEND - Appends a personal list or data set level to a DSLIST. CONFIRM - Confirms data set delete requests (by confirmation panel). DSLSET - Displays the data set list settings panel. EXCLUDE - Excludes a line containing a string within the data set name. FIND Finds a string within the data set name. LOCATE - Locates an entry in the list based upon sorted order. MEMBER - Searches all partitioned data sets in the list for a member name or pattern. REFRESH - Refreshes the displayed list with any changes that have occurred. RESET Redisplays excluded data sets and removes line commands. - Writes the data set list to the ISPF list data set SAVE or to a sequential data set. SHOWCMD - Shows the line command before it is invoked. SORT Sorts the list of data sets by the specified field. SRCHFOR - Search for strings in data sets. LC VA VS VT W
-
-
Displays Displays Displays Displays Displays
data data data data data
set set set set set
list list list list list
color change utility. attribute view. space view. total view. volume view.
Abbildung 56 Die DSLIST Primary Commands
Hinweise Die grau unterlegten Befehle sind interessant. Ich empfehle Ihnen, sich durch praktische Übungen damit intensiv zu beschäftigen. Die Funktion LC ist nützlich, wenn Ihnen die angezeigten Farben nicht gefallen und Sie diese Ihrem Geschmack anpassen wollen. Die am Schluss aufgeführten Befehle VA, VS, VT und VV können Sie ignorieren, denn diese Funktionen werden durch die Tasten PF 10/11 (LEFT/RIGHT) besser abgedeckt. Auf zwei relativ neue Befehle möchte ich noch eingehen. Und zwar auf die Befehle MEMBER und SRCHFOR:
6.3.2
Die Befehle MEMBER und SRCHFOR
Wenn eine DSLISTe angezeigt wird, und nur dann, können Sie diese Befehle nutzen. Und zwar auf folgende Weise: MEMBER ist ein reines Primary Command. Das heißt, sie geben einfach hinter dem Command MEMBER, MEM oder M einen Membernamen oder eine Maske für die Suche nach Members in allen in dieser DSLISTe angezeigten PDS ein. Das Ergebnis wird Ihnen direkt in der DSLISTe angezeigt.
6 DSLIST - Data Set Lists
100
Beispiel für Member Suche mit MEMBER Ich habe nach dem Member HUGO gesucht, indem ich M hin habe ich folgende Anzeige bekommen:
HUGO eingegeben habe. Darauf-
ISRUDSLO Data Sets Matched in list REXX Command = = = >
Member(s) found Scroll ===> CSR
Command - Enter "/" to select action
Message
Volume
PROX.LOGON.REXX Member: HUGO D1D135 SMQP . PROD . REXX D1D104 SMQP. USER. REXX D1D110 SQMT.USER.REXX D1D131 ***************************** End of Data Set list **************************** ! , '1 | Member HUGO found in 1 data sets. | i Abbildung 57 Suchen eines Members in einer DSLIST
Anzeige
Aus dieser Anzeige kann man entnehmen, dass das Member HUGO in der Datei PROX.LOGON.REXX gefunden wurde. Beispiel für eine Textsuche mit SRCHFOR: Bei der Erstellung einer REXX Prozedur, die unter ISPF laufen soll, möchte ich den Befehl QBASELIB benutzen. Weil ich nicht mehr genau weiß, wie dieser Befehl programmiert wird, mich aber erinnere, ihn schon einmal verwendet zu haben, suche ich nach ihm in meinen REXX Dateien, indem ich zuerst einmal die DSLIST für REXX Prozeduren aufrufe und dann dort SRCHFOR eingebe. Im Gegensatz zu der Suche nach Members, müssen bei der Textsuche natürlich mehr Informationen eingegeben werden. Aus diesem Grund erscheint nach der Eingabe von SRCHFOR zunächst das folgende Panel: (In welchem ich die Such- und Anzeigeoptionen bereits ausgefüllt habe, um Platz zu sparen). Command ===> You are about to search multiple data sets. Specify search string(s) and options and press ENTER to run the search. Enter the END or the CANCEL command to cancel the search. More: ==> QBASELIB
+
Listing DSN: LANZT. SRCHFOR. LIST Select Process Options with / Mixed Mode jf Any case Totals only
Search Migrated 1 1. None 2. First level 3. All
Search Excluded 3 1. Excluded 2. Non-excluded 3. Both
Abbildung 58 Beispiel fiir eine Suche nach Text Strings mit SRCHFOR
Select Display Options with / / View output Exclude not found
6.3 Die Verarbeitung im DSLIST Panel
101
Die grau unterlegten Stellen habe ich eingegeben. Ganz wichtig ist hierbei, dass man vor dem ENTER in diesem Panel hinter L i s t i n g DSN: einen DSN angibt, den das System auch anlegen kann. Denn zunächst steht hier beim ersten Aufruf nur der DSN SRCHDSL.LIST. Eine Datei dieses Namens kann man aber normalerweise nicht anlegen, da man für den HLQ SRCHDSL keine RACF Berechtigung besitzt. Am besten wählt man als DSN den Namen u s e r i d . SRCHFOR.LIST. Wenn die Datei noch nicht existiert, wird sie von der Anwendung automatisch angelegt. Ab dem nächsten Aufruf steht sie dann immer zur Verfügung. Wenn man vor das Feld V i e w o u t p u t einen Schrägstrich gesetzt hat, dann wird die Datei mit den Suchergebnissen praktischerweise sofort nach dem Ende des Suchvorgangs im View Mode angezeigt. Diese Anzeige sehen Sie hier: VIEW LANZT. SRCHFOR.LIST Columns 00001 00072 Command = > Scroll ===> CSR ****** ***************************** Top of Data ****************************** 000001 ISRSUPC MVS/PDF FILE/LINE/WORD/BYTE/S FOR COMPARE UTILITY- ISPF F 000002 LINE-# SOURCE SECTION SRCH DSN :PROX.REXX 000003 000004 STRING(S) FOUND 000005 PACKANZ2 000006 000007 134 "QBASELIB BINDPACK ID(QDSNS)" /* DSNs der Bind Package Mems */ 000008 135 if rc > 0 then call ispf error rc " aus QBASELIB bei BINDPACK " 314 000009 "QBASELIB ISPFILE ID(QDSNS)" /* DSN des ISPFILE 000010 315 if rc > 0 then call ispf_error rc " aus QBASELIB bei ISPFILE 000011 STRING(S) FOUND 000012 VINTBEDT 000013 000014 79 "ISPEXEC QBASELIB BGIN ID(QDSNS)" 000015 88 "ISPEXEC QBASELIB SYSUT2 ID(QDSNS)" 000016 Abbildung 59 Ergebnisanzeige
nach einer Textsuche mit SRCHFOR
Aus jeder Datei und jedem Member, in welchen der Text gefunden wurde, werden die entsprechenden Informationen im List Data Set abgelegt. In der Liste kann man genau sehen, was der Suchvorgang erbracht hat. Es wird auch angezeigt, in wie vielen Members und Zeilen der Suchvorgang erfolgreich war. Wenn der Suchtext in einer der beteiligten Dateien nicht gefunden wurde, wird auch dies in der Liste protokolliert. Ich denke, mit diesen beiden Suchwerkzeugen hat man gute Hilfsmittel zur Verfugung, wenn man nach Members oder Texten suchen möchte. Das Beste daran ist, dass man die Suche über mehrere Dateien laufen lassen kann. Wenn man einige Dateien von der Suche ausschließen will, kann man diese mit X oder gar dem Block Command XX excluden. Mit REFRESH können die ausgeschlossenen DSNs, nachdem die Suche abgeschlossen ist, wieder zur Anzeige gebracht werden.
102
6 DSLIST - Data Set Lists
Tipp Wenn man sich jetzt noch ein Edit Makro schreibt, das einem durch Positionieren des Cursors in einem Membernamen der obigen View Anzeige und anschließendem Aufruf des Edit Makros mittels einer PF Taste dieses Member im Edit anzeigt, kann man sofort die benötigten Programmzeilen mit CUT und PASTE in die Prozedur übernehmen, die man gerade entwickelt. Natürlich gibt es dieses Makro schon. Es heißt #EDSS und befindet sich in der Sammlung der Lanz Utilities. Ich habe bei meinem User den Aufruf dieses Makros auf die PF19 Taste gelegt, da ich es sehr häufig brauche. Siehe hierzu auch das Kapitel „SS - Super Search in einer Datei" auf Seite 539.
6.3.3
Die DSLIST Line Commands
Schauen wir uns einmal an, was in dem Hilfe Panel zum DSLIST Panel bezüglich der Verarbeitungsmöglichkeiten angegeben ist: After the list displays, you can select data sets for processing by entering any of the following line commands to the left of the data set name. A "/" may also be entered to prompt for the following commands: V - View data set RÄ B - Browse data set C - Edit data set Ü D - Delete data set P R - Rename data set PX I - Data set information M S - Information (short) X TSO commands, CLIST, or REXX Abbildung 60 Die DSLISTLine
Refadd to Reflist Catalog data set Uncatalog data set Print data set Print index listing Display member list Exclude data set exec
Z F = CO MO RS NX
Compress data set Free unused space Repeat last command Copy data set Move data set Reset statistics Unexclude data set
Commands
Wenn man diesen Text „übersetzt", ergeben sich folgende Eingabemöglichkeiten vor einem Data Set Name: 1. Man kann einen Schrägstrich (/) eingeben. Dann erhält man folgende Anzeige am Bildschirm:
103
6.3 Die Verarbeitung im DSLIST Panel Menu
Options
D C
View
Utilities
Compilers
Help
Data Set List Actions
i 1 Row 1 of 2 = = > CSR
Data Set: PROX.LANZ REXX C -
/ *
1
DSLIST Action _ 1. Edit 2. View 3. Browse 4. Member List 5. Delete 6. Rename 7. Info 8. Short Info 9. Print 10 Catalog 11 Uncatalog
12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22.
Compress Free Print Index Reset Move Copy Refadd Exclude Unexclude 'NX1 Unexclude first 'NXF' Unexclude last 'NXL'
Select a choice and press ENTER to process data set action.
Volume
D1D119 D1D135 I ***********
I 1
1 1
Abbildung 61 Das DSLIST Action Panel
Wie Sie sehen, können Sie hier eine ganze Menge Aktionen mit der ausgewählten Datei durchfuhren. Ich möchte Sie aber besonders auf die Actions 18 bis 22 hinweisen. Diese ermöglichen es Ihnen, die angezeigte Liste zu manipulieren. Vor allem die Action 18 ist interessant. Kann man doch damit den ausgewählten Dateinamen zu einer bereits bestehenden DSLISTe hinzufugen. Dieser DSN bleibt in der angegebenen DSLISTe aber auf Dauer eingetragen. Sie sollten es sich gut überlegen, ob Sie das auch wollen. Die Actions 1 bis 17 sind soweit selbsterklärend, dass ich darauf nicht weiter eingehen möchte. Auch hier empfehle ich Ihnen, einfach alles einmal auszuprobieren! 2. Man kann vor dem DSN eines PDS einen Action Buchstaben eingeben. Die folgende Tabelle zeigt die wichtigsten dieser Möglichkeiten: Zeichen e
Ausgeführte Aktion Edit Aufruf
b
Browse Aufruf View Aufruf Member List Rename Info Catalog Uncatalog
V
m r i c u
Bemerkungen Bei sequentieller Datei erscheint sofort das Edit Panel. Bei einem PDS erscheint die Member Liste. Dito wie bei Edit. Dito wie bei Edit. Bei sequentieller Datei erscheint eine Fehlermeldung. Umbenennen des DSN. Anzeigen der Datei Attribute. Datei katalogisieren. Datei entkatalogisieren.
Tabelle 7 Action Line Commands im DSLIST Panel
104
6 DSLIST - Data Set Lists
3. Man kann den Namen einer Prozedur eingeben. In diesem Fall wird die genannte Prozedur aufgerufen, wobei der DSN an die Prozedur übergeben wird. Allerdings muss die gerufene Prozedur mit dem DSN auch etwas anfangen können. Das heißt, die Prozedur muss den DSN als Argument übernehmen und entsprechend verwenden. Dabei ist eine Besonderheit zu beachten: Sie müssen beim Aufruf der Prozedur wissen, an welcher Position der Parameterliste die Prozedur den DSN erwartet und ob noch weitere Parameter übergeben werden müssen. Nehmen wir einmal an, die Prozedur erwartet den DSN an erster Stelle und es ist noch ein weiterer Parameter anzugeben. Dann müssen sie den Aufruf wie folgt absetzen: PROC1 / PARM Hierbei repräsentiert der Schrägstrich den DSN. Sollte die Prozedur den DSN als 2. Parameter erwarten, dann geben Sie Folgendes ein: PROC1 PARM / Um bei solchen Aufrufen auch etwas längere Parameterlisten übergeben zu können, haben die Entwickler dieses DSLIST Panels das Namensfeld der angezeigten DSNs als überschreibbar definiert. Bei diesen Aufrufen können Sie den DSN also ruhig überschreiben. Der DSN wird intern trotzdem richtig an die Prozedur weiter gereicht. Ein solcher Aufruf mit Überschreiben des DSN ist im folgenden Panel zu sehen: Menu
Options
View
Utilities
Compilers
Help
DSLIST - Data Sets MatchingPROX.PACKTIME.* Command ===> Command - Enter "/" to select action PROX. PACKT IME . DB2P auslesen / april KTIME.DGPl PROX. PACKT IME . DGP2 PROX. PACKT IME . DGP3 PROX.PACKTIME.DGP5 PROX.PACKTIME.DGP6 ***************************** End of Data Set list
Row 1 of 6 Scroll = = > CSR Message
Volume P0XYZ6 P0XYZ6 P0XYZ6 P0XYZ6 P0XYZ6 P0XYZ6
* * * * * * * * * * * * * * * * * * * * * * * * * * * *
Abbildung 62 Aufruf einer Prozedur im DSLIST Panel
Was geschieht hier? • •
Es wird die Prozedur AUSLESEN aufgerufen. Es werden ihr die Parameter 'PROX.PACKTIME.DGP1' und april übergeben.
Ich habe in der obigen Abbildung einen zweiten grauen Balken eingefügt, der anzeigt, wie weit der Eingabebereich für Prozeduraufrufe reicht. Man hat hier insgesamt 54 Stellea zur Verfugung. Sie werden sich jetzt vielleicht fragen: „Wie kann ich denn solche Aufrufe täti-
6.3 Die Verarbeitung im DSLIST Panel
105
gen, wenn die Eingabe mehr als 54 Stellen benötigt? Dazu sehen Sie sich bitte die Option „Do not show expanded command" im nächsten Kapitel an.
6.3.4
Die DSLIST Settings
Schon im DSLIST Grundmenü (Auswahl 3.4) können Sie einige Optionen bestimmen, die das Erscheinungsbild und die Arbeit mit den DSLIST Panels beeinflussen. Es gibt aber noch eine weitere Einstellungsmöglichkeit für die DSLIST Display Panels und die aus den DSLIST Display Panels aufrufbaren Member List Panels sowie Optionen für die in den oben genannten Panels ausführbaren Commands und Actions. Das Panel zur Einstellung dieser Optionen erreichen wir nur, wenn eine DSLIST angezeigt wird. Um dieses Panel aufzurufen gehen wir wie folgt vor: Wir positionieren den Cursor in der Action Bar im Feld Options und drücken ENTER. Daraufhin erscheint folgendes Pull Down Menu: Menu
Options
DSLIS 1 1 Comma t 1 Comma 1 1 1
1. 3. 4 5 -
2
View
Utilities
Compilers t DSLIST Settings... | RE XX Refresh List | Append to List... | Save List | Reset |
Help Row 1 of 7 Scroll ===> CSR Message
Volume
D1D148 PRTT.REXX D1D115 ***************************** End of Data Set list **************************** Abbildung 63 Das Pull Down Menu „ Options " im DSLIST Panel
In diesem Pull Down Menu wählen wir die Option 1 für DSLIST Settings aus und drücken ENTER. Mit dieser Eingabe erhalten wir dann das Einstellungsmenü für die DSLIST Optio-
File
Colors
Workstation
Help
Data Set List Settings Main General Options Enter "/" to select option Display Edit/View entry panel (*) / Automatically update reference lists / List pattern for MO, CO, and RS actions / Show status for MO, CO, and RS actions / Confirm Member delete / Confirm Data Set delete / Do not show expanded command Enhanced member list for Edit, View, and Browse (*) Requires enhanced member list option to be selected Press EXIT to save, CANCEL to cancel changes. Abbildung 64 Bildschirm zur Einstellung der DSLIST
Optionen
106
6 DSLIST - Data Set Lists
Die hier zu sehenden Optionen werden mit einem (/) vor ihrem Text eingeschaltet. Ist dort ein Blank eingetragen, dann ist diese Option ausgeschaltet. Die Wirkungen und Bedeutungen der Optionen wollen wir uns jetzt anschauen: Display Edit/View entry panel (*) Wenn diese Option eingeschaltet ist, dann wird bei einem direkten Aufruf eines Sequential Data Set oder eines Members das „Edit/View entry panel" angezeigt, mit dem man dann zusätzliche Optionen für diese Sitzung definieren kann. Wir werden dieses Panel in dem Kapitel besprechen, in dem wir den Editor besprechen. Diese Einstellung ist bei einem Aufruf eines Members aus einer Member List wirkungslos. Automatically update reference lists Diese Option steuert das automatische Update Verhalten des ISPF für die DSLIST REFLIST. Wenn diese Option eingeschaltet ist, dann wird jedes Mal, wenn im ISPF eine Datei bearbeitet wurde deren DSN in die Standard DSLIST Namens REFLIST geschrieben. List pattern for MO, CO, and RS actions Wenn diese Option aktiviert ist, wird bei den oben genannten Operationen an einem PDS die Member List angezeigt, so dass man einzelne Member für die geplante Operation auswählen kann. Show status for MO, CO, and RS actions Wenn diese Option aktiviert ist, wird während der Durchfuhrung der oben genannten Operationen an einem PDS ein POP UP Panel angezeigt, welches die einzelnen Member während ihrer Bearbeitung „durchlaufen". Mit dieser Anzeige kann man den Fortgang der Operation verfolgen. Confirm Member delete Diese Option hat die gleiche Wirkung wie die gleichnamige Option im DSLIST Basis Menü. Das Ändern dieser Option wird an beiden Stellen jeweils automatisch nachgezogen. Diese Option kann mit dem Befehl CONFIRM explizit gesetzt werden. Confirm Data Set delete Diese Option hat die gleiche Wirkung wie die gleichnamige Option im DSLIST Basis Menü. Das Ändern dieser Option wird an beiden Stellen jeweils automatisch nachgezogen. Diese Option kann mit dem Befehl CONFIRM explizit gesetzt werden. Do not show expanded command Wenn diese Option ausgeschaltet ist, dann erscheint bei einem Aufruf eines Commands vor einem DSN einer DSLIST ein zusätzliches Panel, in dem man den durchzuführenden Befehl nochmals vor der Ausfuhrung modifizieren kann. Diese Einrichtung bietet die Möglichkeit, bei einem Programm- oder Prozeduraufruf eine längere Parameterliste mitzugeben, als es im DSLIST Menü mit seinen maximal 54 Stellen möglich ist. Enhanced member list for Edit, View, and Browse Wenn diese Option eingeschaltet ist, erscheinen alle Anzeigen von Member Lists, die mit e für Edit, v für View und b für Browse vor einem DSN eines PDS aufgerufen wurden mit einem acht Stellen langen Aufruffeld vor dem Membernamen. Und zwar genau so,
6.3 Die Verarbeitung im DSLIST Panel
107
als hätte man vor dem DSN des PDS ein m (fur Member List) eingegeben. Wenn diese Option ausgeschaltet ist, erscheinen die Member Lists nur mit einem einstelligen Aufruffeld. Bei den Enhanced Member Lists gibt es meiner Meinung nach einen Vorteil und zwei Nachteile: •
•
Der Vorteil dieser ENHANCED MEMBER LIST ist, dass man nach der Rückkehr aus einem Member direkt eine andere Funktion in der gleichen Member List durchfuhren kann. Der Nachteil ist, dass nach einem Create eines neuen Members aus einer Edit/View Session die Member List nach der Rückkehr aus der Session nicht automatisch erneuert wird. Wenn man also das neue Member sofort benutzen will, muss man die Member List erst einmal durch das Command REFRESH neu aufbauen.
Ich habe in meinem ISPF diese Optionen so gesetzt, wie sie in dem obigen Panel zu sehen sind. Aber das ist Geschmacksache. Finden Sie Ihre Lieblingseinstellung selbst heraus!
6.3.5
Beispiele fur die Data Set List Settings
Auf den folgenden Seiten möchte ich Ihnen einige Beispiele für die Wirkungsweise der oben besprochenen Optionen zeigen. Ich empfehle Ihnen, diese Beispiele an Ihrem System nachzuvollziehen. Möglicherweise haben Sie irgendwann einmal Verwendung dafür! Das Edit/View Entry Panel Wenn man diese Option eingeschaltet hat, erscheint beim Edit/View Aufruf eines Sequential Data Set immer das folgende Panel, bevor der Inhalt der Datei angezeigt wird: EDIT Entry Panel Object Name: 'LANZT.ISFCMDS.LIST' * No workstation connection Initial Macro . . Profile Name . . . Format Name . . . Panel Name . . . .
(Blank defaults to Type) (Leave blank for default)
Options / Confirm Cancel/Move/Replace EDIT Mixed Mode EDIT host file on Workstation Preserve VB record length / Warn on First Data Change Press ENTER to continue. Press CANCEL to cancel action. Abbildung 65 Das Edit/View Entry Panel
Wie Sie an dem Panel sehen, können Sie jetzt noch einige Optionen setzen, bevor es mit dem Edit losgeht. Wenn Sie die Optionen eingetragen haben, geht es mit ENTER direkt zum Editor.
108
6 DSLIST - Data Set Lists
List Pattern for MO, CO and RS actions Diese Option ist vor allem für die Anwendung RS zum Erneuern der Member Statistics in einem PDS wichtig. Möglicherweise möchten Sie bei einer dieser Aktionen alle Member bearbeiten, dann sollten Sie diese Option ausschalten, oder aber Sie wollen die Member Statistics nur fur einige Member gezielt erneuern, dann sollten Sie diese Option einschalten. Wenn die Option eingeschaltet ist, erscheint beim Aufruf von RS vor einem PDS das folgende Panel, das ich bereits für den nächsten Schritt ausgefüllt habe: Menu
Functions
Confirm
Utilities
RESET LANZT.LOGON.TRANS Command ===> Name Prompt Size AEPQMS 116 S CEPQMS s HEPQMS XXXX 116 **End**
Help
Created 2003/09/11
Vol D1D139 Row 00001 of 00004 Scroll ===> CSR Changed ID 2004/03/25 15:14:37 LANZT
2004/03/25
2004/03/25 15:14:36
LANZT
Abbildung 66 Auswahl der Members für eine RS Aktion
Wie Sie sehen, haben zwei der Member noch keine Member Statistics. Wir wollen die Member Statistics jetzt für beide Member erstellen, indem wir diese Member mit s auswählen und ENTER drücken. Danach erscheint dann das folgende Panel, in dem wir die benötigten Angaben zur Erneuerung der Member Statistics machen müssen: Reset Member Statistics Data Set Name : ' LANZT . LOGON. TRANS ( CEPQMS ) * Multiple Reset actions will be processed Options H 1. Reset ISPF statistics 2. Delete ISPF statistics New Userid . . . LANZT New Version . . . 02 New Mod 55
(If userid is to be changed) (If version number is to be changed) (If mod number is to be changed)
Press ENTER to process action. Press CANCEL to cancel reset.
Abbildung 67 Definition der Member
Statistics
Dieses Panel füllen wir jetzt an den grau unterlegten Stellen aus und drücken ENTER. Nach kurzer Zeit erscheint das folgende Panel. Dort sehen wir, dass die Member Statistics richtig ausgefüllt wurden. Ich habe die Anzeige mithilfe der PF11 Taste nach rechts verschoben, damit wir die Angaben VV.MM zu sehen bekommen:
109
6.3 Die Verarbeitung im DSLIST Panel Menu
Functions
RESET Command === Name AEPQMS CEPQMS HEPQMS XXXX **End**
Confirm
Utilities
Help
LANZT.LOGON.TRANS Prompt
Size 116
Init 113
Mod
69 44
0 0 0
116
116
0
69 44
•Reset *Reset
Abbildung 68 Anzeige der neuen Member
Vol D1D139 Row 00001 of 00004 Scroll = = > CSR ID w MM LANZT 01 .02 02..55 LANZT 02 .55 LANZT LANZT 01..00
Statistics
Tipp Wenn Sie mit RS sehr viele Member Statistics erneuern wollen, empfehle ich Ihnen, die Option „Show status for MO, CO, and RS actions" einzuschalten. Damit können Sie dann den Arbeitsfortschritt am Bildschirm verfolgen, indem die Namen der behandelten Member in einem POP UP Menu „durchsausen". Enhanced member list for Edit, View, and Browse Ich möchte Ihnen mit den folgenden beiden Bildern veranschaulichen, wie sich diese Option auf die Anzeige der Member List auswirkt. Sie können dann selbst entscheiden, womit Sie am liebsten arbeiten. Die Vor- und Nachteile beider Anzeigearten habe ich Ihnen schon weiter oben erläutert. Zunächst die Member List eines PDS bei eingeschalteter Enhanced Option: Menu
Functions
Confirm
Utilities
LANZT . LOGON. TRANS EDIT Command ===> Name Prompt Size 116 AEPQMS CEPQMS 69 HEPQMS 44 116 XXXX **End** Abbildung 69 Member List mit eingeschalteter
Help
Created 2003/09/11 2004/03/25 2004/03/25 2004/03/25
Vol D1D139 Row 00001 of 00004 Scroll ===> CSR Changed ID 2004/03/25 15:14:37 LANZT 2004/03/25 16:18:44 LANZT 2004/03/25 16:18:44 LANZT 2004/03/25 15:14:36 LANZT
„ Enhanced Display Option "
Und jetzt die Anzeige der Member List des gleichen PDS mit ausgeschalteter Enhanced Option:
110
6 DSLIST - Data Set Lists
Menu
Functions
Utilities
EDIT LANZT.LOGON.TRANS Command ===> Name Prompt AEPQMS CEPQMS HEPQMS xxxx **End** Abbildung
Help
Created 2003/09/11 2004/03/25 2004/03/25 2004/03/25
Size 116 69 44 116
70 Member List mit ausgeschalteter
„EnhancedDisplay
Vol D1D139 Row 00001 of 00004 Scroll = > CSR ID Changed LANZT 2 0 0 4 / 0 3 / 2 5 1 5 : 14 : 3 7 LANZT 2 0 0 4 / 0 3 / 2 5 1 6 : 1 8 : : 44 LANZT 2 0 0 4 / 0 3 / 2 5 1 6 :: 18 : 44 LANZT 2 0 0 4 / 0 3 / 2 5 1 5 : 14 : 3 6
Option "
Einer der Vorteile dieses Panels ist, dass es genügt, den Cursor vor einem Membernamen zu positionieren und ENTER zu drücken, um dieses Member zu editieren. Diese Art der Anzeige hat zudem noch einen kleinen Vorteil bei der Sicherheit. Hier können Sie nicht aus Versehen ein d für Delete eingeben und ENTER drücken, im „Enhanced" Panel aber sehr wohl. Dies ist auch ein Grund, warum ich für Edit/View und Browse lieber mit dem einfachen Panel arbeite. Ein weiterer großer Vorteil dieses Panels liegt darin, dass nach einem CREATE eines neuen Members in diesem PDS die Anzeige sofort „refreshed" wird und somit nach dem Verlassen der aktuellen Edit Sitzung das neue Member sofort in der Member List erscheint. Confirm member delete Normalerweise sollten Sie diese Option immer eingeschaltet haben. Dies bedeutet, wenn Sie in einer „Enhanced" Member List vor einem Member oder auch mehreren Members ein d für delete eingeben und ENTER drücken, erscheint zunächst das folgende POP UP Menu: ISPF Utilities Confirm Member Delete Data Set Name: LANZT.LOGON.TRANS Member to be Deleted: AEPQMS Set member delete confirmation off Press ENTER to confirm delete. Press CANCEL or EXIT to cancel delete. Abbildung
71 Das Confirm Member Delete
Panel
Das Löschen der Members können Sie durch ENTER bestätigen. Tipp Hier können Sie jetzt einen verhängnisvollen Fehler machen! Wenn Sie nämlich der Meinung sind, dass ein s vor der Zeile Set member delete confirmation off nur den gegenwärtig anhängigen Delete betrifft, dann täuschen
6.4 Personal Data Set Lists
111
Sie sich. Wenn Sie nämlich jetzt an dieser Stelle ein s eingeben und ENTER drücken, dann werden zwar die ausgewählten Member gelöscht, aber die Option „Confirm Member Delete" wird auch auf NEIN gesetzt. Diese Einstellung bleibt ab jetzt sowohl für den gerade in Arbeit befindlichen PDS, als auch für alle Dateien der eventuell dahinter liegenden DSLIST bestehen. Solange Sie also mit der gegenwärtigen DSLIST arbeiten, ist die Sicherung gegen versehentliches Löschen von Members für ALLE darin enthaltenen Dateien ausgeschaltet. Erst wenn Sie diese DSLIST verlassen haben und sie dann erneut aufrufen, wird die Sicherung automatisch vom System wieder eingeschaltet. Sie können zum Einschalten des „Confirm Mode" auch den ISPF Befehl CONFIRM benutzen. CONFIRM steht nur während der Anzeige einer DSLIST zur Verfügung und kennt lediglich die beiden Operanden ON und OFF.
6.4
Personal Data Set Lists
In diesem Kapitel werden wir uns mit einem der effizientesten Werkzeuge im gesamten ISPF beschäftigen. Wir wollen uns einmal die Grundlagen zu diesen „Personal Data Set Lists" anschauen: Bei der Arbeit im ISPF benötigen wir immer wieder Dateien, die wir meistens nach irgendeiner Regel gruppieren können. Zum Beispiel bietet es sich an, die Dateien nach ihrer Benutzung wie folgt zu gruppieren: • • • •
Dateien Dateien Dateien Dateien
der der der der
Prozeduren. Panels. Skeletons. Messages.
Darüber hinaus gibt es noch folgende Gruppen von Dateien: • • • •
Quellkode Dateien. JCL Dateien. Dateien für die Pflege von IMS, CICS, DB2 usw. Dateien für Testdaten.
Im Laufe der Arbeit mit dem ISPF fallen einem immer wieder neue Gruppierungen ein. Dabei sollte man beachten, dass eine Datei durchaus in mehreren DSLISTen auftauchen kann. Man stellt sich die Listen einfach so zusammen, wie man sie für eine bestimmte Tätigkeit braucht. Welche Vorteile ergeben sich bei der Verwendung von „Personal Data Set Lists"? • •
Sie brauchen sich nur einen Befehl zu merken, um sich eine ganze Gruppe durchaus unterschiedlicher DSNs anzeigen zu lassen. Sie können einer bereits in der Anzeige stehenden DSLIST weitere DSLISTen durch APPEND hinzufügen und mit REFRESH wieder entfernen.
112 • •
6 DSLIST - Data Set Lists
Sie können den Aufruf von DSLISTen in Ihre private ISPF Command Table einbauen und den Aufruf so „blitzschnell" ausführen. Sie können sich die DSLISTen über die Auswahl 11 des „Primary Option Menu" direkt und dauerhaft als „ISPF Workplace" in einer ISPF Ebene verfugbar halten, um von dort aus die DSLISTen sowohl direkt aufzurufen als auch zu pflegen.
6.4.1
Erstellen von „Personal Data Set Lists"
Für die Erstellung einer eigenen „Personal Data Set List" gehen Sie wie folgt vor: Sie bewegen im DSLIST Panel (3.4) den Cursor in den Text RefList und drücken ENTER. Dann erscheint die folgende Anzeige: Menu
RefList RefMode Utilities Help I I 2 1. Current Personal Data Set List (CEXEC) 2. List of Personal Data Set Lists Optio I blank Display data set list V Display VTOC information
P Print data set list PV Print VTOC information
Enter one or both of the parameters below: Dsname Level . . . LANZT.** Volume serial . . Data set list options Initial View . . . 1
1. 2. 3. 4.
Volume Space Attrib Total
Enter "/" to select option / Confirm Data Set Delete / Confirm Member Delete / Include Additional Qualifiers
When the data set list is displayed, enter either: "/" on the data set list command field for the command prompt pop-up, an ISPF line command, the name of a TSO command, CLIST, or REXX exec, or "=" to execute the previous command. Abbildung 72 Erstellen und Ändern von DSLISTen
Wenn Sie jetzt die 2 eingeben und ENTER drücken, dann gelangen Sie in das Menü zur Wartung der eigenen „Personal Data Set Lists". Da es die vom ISPF halten sie auf jeden wird, dann können DSLISTen erzeugen
automatisch geführte Liste mit dem Namen „REFLIST" immer gibt, erFall mindestens diese Liste angezeigt. Wenn nur diese Liste angezeigt Sie daraus mithilfe der Funktion „Save As" Ihre weiteren, privaten und danach Ihren Vorstellungen anpassen.
Das folgende Bild zeigt den Zustand, wenn außer der standardmäßig immer vorhandenen DSLISTe mit dem Namen REFLIST noch keine weiteren DSLISTen für den ISPF User vorhanden sind:
113
6.4 Personal Data Set Lists
List 3 of 25 Scroll = = > PAGE
Personal Data Set Lists
Active: CEXEC Command ===> Action : 0=0pen
A=Save As
D=Delete
E=Edit
L=DSLIST
Name Description REFLIST Last 30 referenced data sets 'LANZT.ISPF. PROFILE. LPRT ' 'SMQP.COMPILES.D040308.NOT' 'SMQP.COMPILES.D040303.PIL.QBMERVES.$1' 'SMQP.COMPILES.D040303.PIL.QBMERVAI.$2' 'SMQP.COMPILES.DO40126.NOT' ' LANZT. LOGON.CLIST' Abbildung 73 Anzeige der DSLIST
Created
Referenced
„REFLIST"
Wenn Sie dann den Cursor in der Zeile mit dem Namen REFLIST positionieren und ein a für Save As eingeben und ENTER drücken, dann erhalten Sie die folgende Anzeige: File _
View
!
A |
CI
Options ?
Help
j
Personal Data Set List Save As
List 3 of 25 Scroll = > PAGE
| List NEUREXX A | | Description . . Meine REXX Dateien eated
Referenced
/10/05
04/03/09 16:52
A | I Enter a new list name and optionally a I description. I Press ENTER to save, EXIT to cancel Sa
L
Abbildung 74 Erstellen einer neuen DSLIST
Sie müssen jetzt hinter „List" einen bis zu acht Stellen langen Namen für Ihre neue DSLIST und hinter „Description" eine Bezeichnung eingeben. Danach drücken Sie
ENTER. Danach wird Ihnen wieder das Panel zur Bearbeitung von DSLISTen angezeigt, wobei in der rechten oberen Ecke die Meldung erscheint, dass die neue Liste erstellt wurde. Wenn Sie nun mit den Tasten PF7 und PF8 durch die Anzeige blättern, finden Sie Ihre neue DSLISTe. Diesen Zustand zeigt unser nächstes Panel:
114
6 DSLIST - Data Set Lists
Active : CEXEC Command ===> Action: 0=0pen
Personal Data Set Lists A=Save As
D=Delete
E=Edit
List 1 of 26 Scroll = = > PAGE
L=DSLIST
Name Description NEUREXX Meine REXX Dateien 'LANZT.ISPF.PROFILE.LPRT' 'SMQP.COMPILES.D040308.NOT' 'SMQP.COMPILES.D040303.PIL.QBMERVES.$1 « ' SMQP. COMPILES .D040303 . PIL. QBMERVAI. $2 ' ' SMQP. COMPILES . D040126 . NOT ' 'LANZT.LOGON.CLIST'
Created 04/03/10
Referenced 04/03/10 14:02
Abbildung 75 Anzeige der neuen DSLISTe
Die grau unterlegten Namen sind noch aus der Operation mit „Save As" übrig. Diese müssen Sie jetzt nur noch durch geeignete DSN Masken ersetzen und die nicht benötigten Zeilen löschen. Das Ergebnis dieser Aktionen könnte dann wie folgt aussehen: Personal Data Set Lists
Active: NEUREXX Command ===> Action : 0=0pen Name NEUREXX PROX. * . REXX
A=Save As
D=Delete
E=Edit
List 1 of 26 Scroll = = > PAGE
L=DSLIST
Description Meine REXX Dateien
Created 04/03/10
Referenced 04/03/10 14:18
Wenn Sie jetzt vor dem Namen der DSLIST NEUREXX ein L eingeben und ENTER drücken, dann bekommen Sie Ihre neue DSLIST im 3.4 Modus angezeigt. Row 1 of 2 Scroll ===> CSR
DSLIST - Data Sets Matched in list NEUREXX Command = = > Command - Enter "/" to select action
Message
D1D119 D1D135
PROX . LANZ . REXX PROX. LOGON. REXX * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
6.4.2
Volume
End of Data Set list
* * * * * * * * * * * * * * * * * * * * * * * * * * * *
DSLISTen aufrufen
DSLISTen kann man auf verschiedenen grundsätzlich unterscheiden:
zur Anzeige bringen. Dabei müssen wir
Aufrufe zum Zweck der Benutzung einer DSLIST. Aufrufe zum Zweck der Wartung aller DSLISTen.
115
6.4 Personal D a t a Set Lists
Aufrufe von D S L I S T e n mithilfe des D S L I S T Befehls Hier die Beschreibung des D S L I S T Befehls aus d e m zugehörigen Tutorial Panel. TUTORIAL ISPF COMMAND - DSLIST TUTORIAL OPTION ===> You can use the DSLIST command to display a DSLIST based on a personal data set list or a data set level. Command ===> DSLIST Displays a list of personal lists for Selection Command = = > DSLIST BOB Builds a DSLIST based on entries contained in personal data set list "BOB" Command ===> DSLIST 'BOB.*' Builds a DSLIST based on data sets matching data set level BOB.* If you enter a parameter, the DSLIST command first looks for a personal data set list with that name. If it does not find the list, it uses the parameter as a DSNAME LEVEL using TSO naming conventions. For example, if you enter DSLIST CLIST and there is no personal data set list named CLIST, then if you have the TSO prefix set to your user id, the DSLIST command will look for data sets matching the name 'LANZT.CLIST' The DSLIST view can be set by the ISPF Workplace Settings panel or the ISPF Referral List Settings panel. Abbildung 76 Aufrufmöglichkeiten für DSLISTen
E n t s p r e c h e n d d e n o b e n a n g e g e b e n e n I n f o r m a t i o n e n k a n n m a n e i n z e l n e D S L I S T e n a u f drei A r t e n a u f r u f e n . D a b e i m u s s m a n w i s s e n , d a s s es n o c h w e i t e r e M ö g l i c h k e i t e n g i b t m i t D S L I S T e n z u a r b e i t e n . Ich v e r w e i s e in d i e s e m Z u s a m m e n h a n g a u f d a s K a p i t e l „ I S P F C o m m a n d T a b l e s " a b S e i t e 79. 1. D u r c h E i n g a b e d e s D S L I S T B e f e h l s m i t d e m N a m e n d e r g e w ü n s c h t e n D S L I S T als Parameter. Data Set List Utility Option ===> dslist neurexx blank Display data set list V Display VTOC information
P Print data set list PV Print VTOC information
Enter one or both of the parameters below: Dsname Level . . . AV* Vollme serial . . Data set list options Initial View . . .
1. 2. 3. 4.
Volume Space Attrib Total
Enter "/" to select option / Confirm Data Set Delete / Confirm Member Delete Include Additional Qualifiers
When the data set list is displayed, enter either: "/" on the data set list command field for the command prompt pop-up, an ISPF line command, the name of a TSO command, CLIST, or REXX exec, or "=" to execute the previous command. Abbildung 77 Aufruf einer DSLIST in der Command Line des ISPF
116
6 DSLIST - Data Set Lists
Wenn Sie nach der oben graa unterlegten Eingabe ENTER drücken, wird Ihnen die DSLIST NEUREXX sofort angezeigt. 2. Durch Eingabe des DSLIST Befehls ohne Parameter. Dann erscheint das folgende Panel. Menu
RefList
I Command = = >
RefMode
Utilities
Help
Personal Data Set Lists for Append
List 1 of 2 Scroll ===> PAGE
1
Select a personal data set list as a filter for DSLIST: s
Name NEUREXX REFLIST
Description Nur zum Test Last 30 referenced data sets
Created 04/03/10 »
Referenced 04/03/10 15:07 ---—
Abbildung 78 Aufruf von DSLISTen durch den Befehl DSLIST
Wenn man in diesem Panel vor dem Namen einer DSLISTe ein s eingibt und ENTER drückt, dann wird diese Liste angezeigt. 3. Durch Eintragung eines entsprechenden Befehls in der Command Table ISPCMDS. Man sollte sich hierfür einen möglichst kurzen und prägnanten Namen, wie z.B. +R, einfallen lassen. Diese Eintragung könnte wie folgt aussehen: +R
0
SELECT PGM (ISRDSLST) PARM(DSL NEUREXX) DSLIST REXX REXX DATEIEN
SUSPEND SCRNAME ($NEUREXX)
Siehe hierzu die Beschreibung der Bearbeitung von Command Tables weiter oben! Wenn Sie die Eintragung in der Command Table wie gezeigt vorgenommen haben, dann können Sie die DSLIST NEUREXX überall im ISPF einfach durch die Eingabe von +r in der Command Line mit anschließendem ENTER aufrufen. Durch den Eintrag von SCRNAME ($NEUREXX) wird erreicht, dass bei einem Aufruf von SWAP LIST der Name SNEUREXX in der dort erscheinenden Anzeige als ISPF Ebenen Name erscheint. Diesen Effekt zeigt das folgende Bild:
117
6.4 Personal Data Set Lists
Menu
Options
D | C
View
Utilities Compilers Help ISPP Task List Active ISPF Logical Sessions
entries not used Scroll = = > CSR
Start a new screen Start a new application Application Name XD 1 2 3 4 5 6 78*
Name $NEUREXX $SKELS $P $REFLIST $A $PROG DSLISTEN $IMS
Panelid ISRUDSLO ISRUDSLO ISRUDSLO ISRUDSLO ISRUDSLO ISRUDSLO ISRFVTAB ISRUDSLO
Volume
Appiid I SR ISR ISR ISR ISR ISR ISR ISR
Session Type 3270 3270 3270 3270 3270 3270 3270 3270
D1D117 D1D127 D1D128 D1D111 D1D144 D1D133 D1D118 D1D150 D1S007 I MD 1A0 D1D152 T1S107 D1S008 *****************
Abbildung 79 Anzeige der offenen ISPF Ebenen durch den Befehl SWAP LIST
6.4.3
Benutzung des Volume Serial Feldes
Schauen wir uns nochmals das DSLIST Basis Panel an Data Set List Utility Option = = > blank Display data set list V Display VTOC information
P Print data set list PV Print VTOC information
Enter one or both of the parameters below: Dsname Level . . . Volume serial . . Data set list options Initial View . . . 1
1. 2. 3. 4.
Volume Space Attrib Total
Enter "/" to select option / Confirm Data Set Delete / Confirm Member Delete Include Additional Qualifiers
When the data set list is displayed, enter either: "/" on the data set list command field for the command prompt pop-up, an ISPF line command, the name of a TSO command, CLIST, or REXX exec, or "=" to execute the previous command. Abbildung 80 Benutzung des „ Volume Serial" Feldes im DSLIST Panel
Bezüglich der Eintragungen in den Feldern O p t i o n ===>, D s n a m e L e v e l und V o l u m e s e r i a l ergeben sich folgende Kombinationsmöglichkeiten:
118
6 DSLIST - Data Set Lists
1. Wenn Sie in Dsname Level eine Maske eintragen und Volume Serial leer lassen, dann wird in den Katalogen des Systems nach den DSNs gesucht, die der Auswahlmaske entsprechen und diese DSNs werden dann angezeigt. Hierbei kann es vorkommen, dass auch DSNs angezeigt werden, zu denen, zumindest in dieser LP AR, gar keine physische Datei existiert. Diesen Sonderfall können Sie daran erkennen, dass die Dateiattribute für diesen DSN leer bleiben. 2. Wenn Sie ein v hinter Option ===> setzen, um sich die Belegung einer Platte anzeigen zu lassen, dann müssen Sie in Volume serial auch eine komplette gültige Volume Serial Number (also einen Plattennamen) angeben. 3. Wenn Sie nur eine Volume Serial Number eingeben und das Feld Dsname Level leer lassen, dann werden alle DSNs dieser Platte aus dem VTOC (Volume Table of Contents) angezeigt. Wenn Sie dabei als Volume Serial Number einen generischen Begriff, wie z.B.: HUGO*, angeben, dann werden alle DSNs aller Platten, die dieser Auswahl genügen, angezeigt. Vorsicht, das kann dauern! Wenn Sie in dieser Anzeige Dateien finden, die Sie über die Anzeige des Dsname Level nicht angezeigt bekommen, dann heißt das, dass diese Dateien nicht katalogisiert sind. Sie können diese Dateien bei dieser Gelegenheit katalogisieren, indem Sie vor dem DSN eine c eingeben und ENTER drücken. 4. Wenn Sie eine Volume Serial Number eintragen und gleichzeitig in das Feld Dsname Level eine DSN Maske eingeben, dann werden alle DSNs dieser Platte aus dem VTOC (Volume Table of Contents) angezeigt, die der DSN Maske entsprechen. Tipp Das Setting der Option „Include Additional Qualifiers" bestimmt auch hier die Anzeigen in den „Data Set Lists". Das müssen Sie immer bedenken, sobald Sie eine DSN Maske benutzen. Ich möchte hier nochmals daraufhinweisen, dass Sie die I n i t i a l V i e w immer auf 1 eingestellt lassen sollten. Dies kann sich vor allem dann bezahlt machen, wenn Sie aus Versehen eine DSN Liste mit mehreren tausend Einträgen erhalten.
6.5
DSLIST mit Command Tables optimal nutzen
Wenn wir nun alles, was wir über DSLISTen und ISPF Command Tables gelernt haben, intelligent einsetzen, ergeben sich damit Möglichkeiten, unsere Arbeit im ISPF erheblich zu vereinfachen und zu beschleunigen. Es ist wohl am Einfachsten, wenn ich Ihnen hier mein System vorstelle, das ich bei der Arbeit mit ISPF täglich im Rahmen einer sehr komplexen ISPF Anwendung bei einem Kunden benutze. Der Level dieser Nutzung der ISPF Werkzeuge ist meiner Meinung nach sehr hoch und er ist natürlich nicht gleich am Anfang so gewesen, sondern ich habe ihn im Laufe von ca. 15 Jahren nach und nach auf dieses Niveau gebracht. Wenn Sie sich also bei der Einrichtung Ihrer ISPF Umgebung an diesen Vorschlag halten, können Sie den optimalen Nutzen sofort ausschöpfen.
119
6.5 DSLIST mit Command Tables optimal nutzen
6.5.1
Organisation und Namenskonventionen
Bevor wir an die Eintragungen in unseren ISPF Command Table zum Aufruf von DSLISTen gehen, sollten wir uns Gedanken darüber machen, mit welchen Eingabetexten wir denn unsere einzelnen DSLISTen aufrufen wollen. Dazu ist Folgendes zu sagen: Wir sollten alle Aufrufe von DSLISTen von den anderen Befehlen, die ja auch noch in der ISPF Command Table stehen, durch ein vorangestelltes. Sonderzeichen unterscheiden. Damit diese Aufrufe möglichst einfach und schnell einzugeben sind, sollte dieses Sonderzeichen nicht die Umschalttaste erfordern und auch möglichst nahe an der ENTER Taste liegen. Diese Bedingungen werden von zwei Tasten erfüllt, die wir auch für die Namensdefinition in der Command Table benutzen können (das geht nämlich nicht mit allen Sonderzeichen). Diese Zeichen sind das Pluszeichen (+) und das Minuszeichen (-). Ich habe bei mir die folgende Regelung getroffen: •
Das Pluszeichen (+) wird allen Aufrufen von DSLISTen vorangestellt. Der Rest des Aufrufnamens besteht aus einem oder mehreren Buchstaben, die einen Hinweis auf die Art der Dateizusammenstellung geben. Zum Beispiel steht +r für alle REXX Dateien, +p für alle Panel Dateien, +s für alle Skeleton Dateien usw. Das Minuszeichen (-) wird zum Zurücksetzen benutzt. Zum Beispiel benutze ich die drei Zeichen —, um den Befehl REFRESH abzusetzen.
•
6.5.2
DSLISTen mit der ISPF Command Table aufrufen
Der Aufruf von DSLISTen in einer ISPF Command Table geschieht mit dem „geheimen" Programm ISRDSLST. Siehe hierzu das Kapitel „Das Programm ISRDSLST" ab Seite 201. Zunächst schauen wir uns die Anzeige an, wenn noch keine eigenen DSLISTen definiert sind. In diesem Fall gibt es zumindest die DSLIST „REFLIST": ISRPDSLB Command = = >
Personal Data Set Lists for Append
List 1 of 26 Scroll ===> PAGE
Select a personal data set list as a filter for DSLIST:
.
Name REFLIST
Description Last 30 referenced data sets
Created
Referenced
**End**
Und hier jetzt ein Ausschnitt meiner eigenen ISPF Command Table, wie sie vom LANZ Utility CMDSMOD dargestellt wird. Darin finden Sie einige DSLISTen, die den oben besprochenen Namenskonventionen entsprechen:
120
6 DSLIST - Data Set Lists
Alter ISPF Command Tables Command = ISPF Command Table Member = ISPCMDS Found in DSN = LANZT.USER.TABL.LPRT is saved to = LANZT.USER.TABL.LPRT Cmd »
R=Repeat, I=Insert, D=Delete
Cmd ++
Row 1 to 16 of 122 Scroll = CSR Active APPLID = ISR
Description 0
SELECT PGM(ISRDSLST) PARM{PL2) SUSPEND SCRNAME (DSLISTEN) DSLIST STANDARD PERSONNAL DATA SET OPEN HHpl 0 ALIAS APPEND DSLIST ADMIN APPEND PANEL FUER DSLIST AUFRUFEN +LU 0 SELECT PGM(ISRDSLST) PARM(DSL REFLIST) SUSPEND SCRNAME($REFLIST) DSLIST REFLIST LETZTE 30 DATEIEN SUSPEND SCRNAME ($M) +M 0 SELECT PGM (ISRDSLST) PARM (DSL MSGS) DSLIST MSGS ISPF MESSAGE DATEIEN SUSPEND SCRNAME ($P) +P 0 SELECT PGM (ISRDSLST) PARM (DSL PANEL) DSLIST PANEL ISPF PANEL DATEIEN SUSPEND SCRNAME ($REXX) +R 0 SELECT PGM (ISRDSLST) PARM (DSL REXX) DSLIST REXX REXX DATEIEN SUSPEND SCRNAME($SKELS) +S 0 SELECT PGM (ISRDSLST) PARM (DSL SKEL) DSLIST SKEL SKELETON DATEIEN 0 ALIAS REFRESH COMMND REFRESH MIT APPEND HINZUGEFÜGTE LISTEN WIEDER ENTFERNEN Hier folgen noch weitere Einträge'. Abbildung 81 DSLIST Beispiel meines TSO Users LANZT
Die grau unterlegten Eintragungen haben eine besondere Bedeutung, die in der nachfolgenden Tabelle erklärt werden: Aufruf ++ +++ —
+LU
Bedeutung Ruft das Panel zur Bearbeitung von DSLISTen auf. Ruft mit APPEND die Anzeige der vorhandenen DSLISTen zum Zweck des Hinzufugens zur aktuellen DSLIST auf. Setzt einen REFRESH Befehl ab, um die durch APPEND zusätzlich hinzugefügten DSN wieder zu entfernen. Ruft die allgemeine REFLIST mit den 30 zuletzt benutzten DSNs auf.
Tabelle 8 Empfohlene Präfixe für Aufrufe von DSLISTen
Die Funktionen, die jeweils mit den drei gleichen Zeichen +++ und — aufgerufen werden, könnte man auch einfacher dadurch mit einem Tastendruck auslösen, indem man die Befehle APPEND und REFRESH jeweils auf eine PF Taste legt. Da ich aber immer knapp an PF Tasten bin, habe ich diese Befehle eben so eingerichtet, wie sie hier zu sehen sind. Merksätze zum Thema DSLISTen Wenn Sie die Möglichkeiten der DSLISTen in Zusammenarbeit mit den ISPF Command Tables optimal nutzen, können Sie folgende Vorteile gewinnen:
6.5 DSLIST mit Command Tables optimal nutzen • •
• • •
121
Sie haben mit wenigen Tastendrücken immer sofort die benötigten Dateien zur Verfugung. Wenn Sie Ihre DSLISTen intelligent zusammenstellen, müssen Sie sich nicht unendlich viele DSN merken. Nutzen Sie dabei auch die Möglichkeit, sich einen DSN in mehrere DSLISTen anzeigen zu lassen. Sie ersparen sich viel Sucharbeit. Dies ist vor allem dann sehr wichtig, wenn man unter Zeitdruck agieren muss. Mit dem ISPF Workplace besitzen Sie ein mächtiges Werkzeug zur optimalen Nutzung von DSLISTen. Siehe hierzu das Kapitel „Der Objekt/Action Workplace" auf Seite 123. Die Befehle SRCHFOR und MEMBER bieten weitere interessante Möglichkeiten DSLISTen zu nutzen. Siehe hierzu das Kapitel „Die Befehle MEMBER und SRCHFOR" auf Seite 99.
Tipp Nutzen Sie die Möglichkeiten, die in der Verwendung von „Personal Data Set Lists" liegen. Damit können Sie Ihre tägliche Arbeit erheblich beschleunigen. Gruppieren Sie Ihre DSLISTen nach verschiedenen Kriterien als Working Sets, die Sie dann bei bestimmten Tätigkeiten optimal nutzen können. In einem DSLIST Working Set fassen Sie alle Dateien zusammen, die Sie für eine bestimmte Tätigkeit gemeinsam benötigen.
7
Der Object/Action Workplace
Hier lernen Sie eines der neuesten Werkzeuge des ISPF kennen. Es bietet eine standardisierte Oberfläche für die Arbeit mit DSLISTen. Ich kann Ihnen dieses Werkzeug nur wärmstens ans Herz legen, denn es erleichtert die Arbeit mit DSLISTen ungemein. Es ist ein echtes Power User Tool! Nachdem ich Sie in dem vorhergehenden Kapitel mit den DSLISTen vertraut gemacht habe, können wir jetzt ein Werkzeug besprechen, das die Nutzung von DSLISTen erst so richtig elegant ermöglicht. Durch die Workplace Einrichtung erhalten wir Zugriff auf den sehr umfangreich ausgestatteten „ISPF Object/Action Workplace". Dies ist eine relativ neue Einrichtung im ISPF. Es handelt sich hierbei um eine objektorientierte Verarbeitung im ISPF. Objekte in diesem Kontext sind Dateien, Members, Volsers und DSLISTen. Der „ISPF Object/Action Workplace" kann auf dreierlei Art aufgerufen werden: • • •
Über die Auswahl 11 im „Primary Option Menu". Durch den ISPF Befehl ISPFWORK in jedem ISPF Panel. Durch einen entsprechenden Eintrag in der ISPF Command Table, den Sie allerdings selbst vornehmen müssen. Siehe hierzu das Kapitel „Aufruf des Workplace über die Command Table" ab Seite 125.
Nachdem Sie das Werkzeug auf eine der oben genannten Arten ausgewählt haben, gelangen Sie in ein Menü, das eine Kombination darstellt zwischen dem herkömmlichen DSLIST Menü, das Sie über die Auswahl 3.4 erreichen, und dem Befehl DSLIST, der Ihnen die DSLISTen anzeigt. Durch diese Kombination ist dieses Panel zu meinem absoluten Lieblingsmenü geworden. Von hier aus kann ich fast alles machen, was mit Dateien zu tun hat. Wie zum Beispiel: • • • •
Aufruf einer DSLIST durch Eingabe einer geeigneten Maske hinter O b j e c t N a m e . Auswahl einer DSLIST aus dem Vorrat meiner DSLISTen durch Eingabe des Line Commands DL in der Action Spalte der angezeigten DSLISTen. Verwalten einer DSLIST durch Eingabe eines Schrägstrichs (/) als Line Command in einer der angezeigten DSLIST Zeilen. Herausholen einer bestimmten DSLIST Maske oder eines DSN aus der Menge der vorhandenen DSLISTen und Einfügen als O b j e c t Name durch Eingabe eines Schräg-
124
7 Der Object/Action Workplace
strichs (/) als Line Command und auswählen eines Objekts aus dem angezeigten DSLIST Inhalt. Anzeigen des Inhalts eines VTOC durch Eingabe einer VOLSER hinter Volume Serial bei gleichzeitigem Löschen des Feldes hinter Ob ject Name. Anzeigen von bestimmten, durch eine Maske ausgewählten Dateien aus einem VTOC, durch Eingabe einer VOLSER hinter Volume Serial bei gleichzeitigem Setzen der Maske hinter Ob ject Name.
• •
7.1
Das ISPF Workplace Panel
Das folgende Bild zeigt mein eigenes Workplace Panel: File
View
Options
Space
SuperC
Smart Action Action ===>
Test
Help
ISPF Workplace
DSLIST processed Scroll = = > CSR
Data Set, DSLIST Level, or Workstation File Object Name . . . lanzt.** Volume Serial . . (For actions that require a volume serial) I ! ! ! ! ! ! • ! ! ! ! ! ! ! ! ! ! ! ! ! ! !
Data Set LANZT CEXEC COB COMPJOBS DB2BG DB2P DB2T INFO LANZ LINK LOAD LOGON MSGS NEUREXX PANEL PCSICH PROCLIB PROGRAMM REFLIST REXX SKEL
View . .. . .. . .. . .. . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . .. . .. . . . . .. . .. . .. . ..
ISPF Referral lists for object selection 1 Action #l-30=Retrieve Entry DL=DSLIST /=Open List ! DSNs des Users LANZT 04/03/24 11 00 ! Compiled REXX Procedures 04/03/15 15 07 ! Dateien fuer Cobol Test 04/03/09 13 10 ! Dateien der Compile Jobs 04/03/17 15 27 ! DB2 Package, Plan, Grant 04/03/15 15 44 ! DB2 Dateien fuer Produktion 04/03/24 10 18 ! DB2 Dateien fuer Test 04/03/15 15 45 ! Informationsdateien 04/03/15 15 47 ! Dateien mit PROX.LANZ.** 04/03/24 09 58 ! EPQMS Compile Link Libs 04/03/11 09 56 ! 04/01/29 08 15 ! Alle LOAD Libs PROX. LOGON/LANZ DSNs 04/03/24 10 04 ! ISPF Panel Messages 04/03/15 15 49 ! Nur zum Test 04/03/16 13 18 ! ISPF Panels Datasets 04/03/23 09 48 ! Dateien der PC Sicherung 04/03/23 12 34 ! Alle PEV*.PROCLIB.JCL 04/03/24 10 38 ! Programm Dateien 04/03/16 10 08 ! Last 30 referenced data sets — ! REXX Datasets 04/03/23 17 59 ! ISPF Sekeleton Datasets 04/03/24 08 29 ! End of ISPF Referral lists *************************
Abbildung 82 Das ISPF Workplace Panel
Tipp Gegenüber dem DSLIST Befehl hat der Workplace einen gewichtigen Vorteil: Wenn man aus einer über den Workplace ausgewählten DSLIST durch Drücken der PF3 Taste zu-
7.1 Das ISPF Workplace Panel
125
rückkommt, landet man wieder im Workplace mit der Anzeige aller DSLISTen. Man kann von hier aus dann die nächste Aktion starten, ohne vorher erneut den Workplace aufrufen zu müssen.
7.1.1
Aufruf des Workplace über die Command Table
Wenn Sie sich einen möglichst kurzen Befehl zum Aufruf des Workplace einrichten wollen, können Sie dies durch den folgenden Eintrag in der ISPF Command Table erreichen: MP
0
SELECT PGM(ISRUDA) PARM(ISRWORK) SUSPEND SCRNAME (ISPFWORK) NATIVE AUFRUF DES ISPF WORKPLACE PANELS
Damit können Sie den Workplace durch den Befehl WP überall im ISPF aufrufen.
7.1.2
Bedienung des Workplace Panels
Bei der Bedienung dieses Panels sind zwei Begriffe sehr wichtig. Deshalb werde ich diese zunächst einmal erläutern: Objekte: Im Workplace dreht sich - wenn keine DSLIST ausgewählt wurde - alles um das Objekt, das hinter O b j e c t Name eingetragen ist. Das bedeutet, dass Operationen, die sich auf eine vorhandene Datei beziehen, wie z.B. das Anzeigen der „Data Set Characteristic", nur gestartet werden können, wenn die dort eingetragene Datei auch tatsächlich existiert. Andererseits müssen Sie unbedingt den Namen einer noch nicht existierenden Datei als Objekt eintragen, wenn Sie diese mit einem Action Command anlegen wollen. Actions: Actions können Sie auf zweierlei Art starten: • •
Über die Pull Down Menüs der Action Bar. Durch Eingabe eines Action Commands in der Zeile Action ===>.
Es gibt etwa 85 Action Commands. Da Sie diese aber immer auch menügefuhrt über die Action Bar aktivieren können, ist es nicht notwendig, diese Action Commands auswendig zu lernen. Genau genommen gibt es nur vier verschiedene Bedienungsmöglichkeiten innerhalb des Workplace Panels: 1. Wenn Sie etwas in der Action ===>.Zeile eingegeben haben und ENTER drücken, wird diese Eingabe als Action ausgeführt, wobei sich die meisten Actions auf das eingetragene Objekt beziehen. 2. Wenn Sie ENTER drücken und es gibt außer den Eintragungen hinter Object Name und Volume Serial keine weiteren Eintragungen im Panel, dann geschieht Folgendes: - Wenn der Objektname eine DSN Maske ist, wird die daraus resultierende DSLIST genau wie im Menü 3.4 angezeigt.
126
7 Der Object/Action Workplace
-
Wenn der Objektname der DSN eines PDS ist, wird die Member List dieses PDS sofort angezeigt. Hierbei arbeitet der Workplace anders als das Menü 3.4. - Wenn der Objektname der DSN eines Sequential Data Set ist, wird dessen Inhalt direkt im View Mode angezeigt. Wenn Sie aber als Action e für Edit eingeben, wird natürlich die Datei im Edit aufgerufen. Das Gleiche gilt für Browse und View. 3. Wenn Sie ENTER drücken und in einer der DSLIST Zeilen ist das Line Command DL angegeben, wird diese DSLIST angezeigt. 4. Wenn Sie ENTER drücken und in einer der DSLIST Zeilen ist das Line Command (/) angegeben, wird das Wartungsmenü für diese DSLIST angezeigt. Hier haben Sie wieder zwei Möglichkeiten der weiteren Benutzung: - Sie können die DSLIST Einträge ändern. Wenn Sie dann das Panel mit der PF3 Taste verlassen, werden die neuen Einträge aktiv. - Sie können einen der DSLIST Einträge mit s auswählen und ENTER drücken. Dann wird dieser Eintrag als Objekt in das Workplace Panel übernommen und dieses wird sofort automatisch ausgeführt. Was danach angezeigt wird, hängt davon ab, ob Sie eine Maske oder einen DSN ausgewählt haben. Siehe hierzu Punkt 2.
7.1.3
Action Commands im Workplace Panel
Wie ich oben schon erwähnt habe, gibt es ca. 85 Action Commands. Eine vollständige Beschreibung dieser Befehle finden Sie in der Broschüre ISPF User's Guide Volume II im Kapitel „Workplace (Option 11)". Ich möchte für Sie hier einige dieser Befehle besprechen, indem ich diese Befehle zunächst in Kategorien einteile und dann die, meiner Meinung nach, wichtigsten Befehle erläutere. Der Vollständigkeit halber möchte ich auch noch darauf hinweisen, dass jeder originale ISPF Befehl natürlich auch als Action Command eingegeben werden kann. Kategorie A: Action Commands zur Steuerung der Anzeige. Befehl ACTBAR NOACTBAR LV oder LISTVIEW
COLOR
Funktion Damit können Sie die Anzeige der Action Bar im Workplace Panel ein- und ausschalten. Damit schalten Sie das Workplace Panel zwischen der Data Set Anzeige und der Library Anzeige hin und her. Sie benötigen in der Regel nur die Data Set Anzeige. Bietet die Möglichkeit, die Farben der Bildschirmanzeige zu verändern.
Tabelle 9 Action Commands zur Steuerung der Anzeige im Workplace Panel
Kategorie B: Action Commands des Workplace Einige dieser Befehle gibt es in zwei Versionen, und zwar einmal als Aufruf mit einem Zeichen und auch noch als Aufruf mit zwei Zeichen. Bei den Aufrufen mit zwei Zeichen ist das zweite Zeichen immer ein p. Das p steht für „prompt" und bedeutet, dass vor der Ausführung
7.1 Das ISPF Workplace Panel
127
des Befehls noch ein POP Up Panel angezeigt wird, in dem man mehrere Auswahlmöglichkeiten für die eigentliche Ausfuhrung des Befehls angeboten bekommt. Ich werde Ihnen diesen Effekt in den folgenden Beispielen zeigen.
Befehl
Funktion
A, AP B C, CP D, DP DL DVT E, EP G I ICS ICT IP J LP M ML N 0 P,PP PVT R, RP S SC, SCE SETTINGS SF, SFE T U V, VP
A steht für „allocate" und dient zum Anlegen einer neuen Datei. Browse Copy Delete Das herkömmliche DSLIST Panel aufrufen. VTOC Anzeige einer Platte. V o l u m e S e r i a l muss benannt werden.
z
Edit Reset Member Statistics Datei Informationen anzeigen. Schaltet die TSO Command shell ein (wie Menü 6). Führt zur Anzeige von ISPF Command Tables. Zeigt ein POP UP Panel zur Auswahl der Anzeige von Datei Informationen. Zeigt die Member list des eingetragenen Objekts zum Zweck von Submit. Zeigt ein POP UP Menü, das verschiedene Anzeigen von Dateien ermöglicht. Move Member List Rename einer Datei. Open (zeigt Member List) Print Print VTOC Inhalt Rename Members und sequentielle Dateien. Short Data Set Information SuperC Aufruf Aufruf des Panels zur Einstellung der ISPF Settings. SearchFor Aufruf TSO Command Aufruf, wenn eine Member list angezeigt wird. Uncatalog einer Datei. View Compress
Tabelle 10 Action Befehle des Workplace
Viele dieser Befehle sind eigentlich überflüssig, denn man kann die Funktionen, wie RENAME, EDIT, BROWSE usw. direkt aufrufen, wenn eine DSLIST angezeigt wird.
128
7 Der Object/Action Workplace
7.2
Beispiele zur Workplace Bedienung
Die folgenden vier Beispiele sollen Ihnen einen Eindruck vermitteln, welche Arbeiten man mithilfe des Workplace schnell und elegant durchfuhren kann: 1. Aufruf einer DSLIST. Wir bewegen den Cursor in die Zeile der gewünschten DSLIST, geben dort DL ein und drücken ENTER. File
View
Options
Space
SuperC
Smart Action Ex Action ===>
Test
Help
ISPF Workplace
Scroll ===> CSR
Data Set, DSLIST Level, or Workstation File Object Name . . . pevx.lanz.rexx Volume Serial . . (For actions that require a volume serial) ISPF Referral lists for object selection 1 I ! Data Set View Action #l-30=Retrieve Entry DL=DSLIST /=Open List ! ! REFLIST . . . dl Last 30 referenced data sets ! ! REXX . . . REXX Datasets 04/03/24 12:57 ! ! SKEL . . . ISPF Sekeleton Datasets 04/03/24 16:15 ! ! UMS . . . Umstellungs JCL 04/03/24 16:15 ! ********************** End of ISPF Referral lists ************************* Abbildung SS Aufruf einer DSLIST vom ISPF Workplace aus
Damit erhalten wir dann folgendes Ergebnis, von dem hier nur die letzten Zeilen angezeigt werden: Menu
Options
DSLIST Command
View
Utilities
Compilers
Help Row 24 of 29 Scroll ===> CSR
Data Sets Matched in list REFLIST ===>
Command - Enter "/" to select action PEV6.CA72.JCL PEV6 . UMS . JCL SMQP.DOKU SMQP. JCL SMQP. MASENTN UCAT.PEV *************************** End of Data Set list
Message
Volume P0XYZ1 P0XYZ1 D1D121 D1D118 D1D144 P0S003
* * * * * * * * * * * * * * * * * * * * * * * * * * *
2. Aufruf des Wartungsmenüs einer DSLIST, Auswahl eines DSN und Anzeigen der Member List dieses PDS. Wir bewegen den Cursor in die Zeile der gewünschten DSLIST, geben dort / ein und drücken ENTER.
129
7.2 Beispiele zur Workplace Bedienung
DSLIST processed Scroll ===> CSR
ISPF Workplace
Smart Action Ex Action = = >
Data Set, DSLIST Level, or Workstation File Object Name . . . pevx.lanz.rexx Volume Serial . . (For actions that require a volume serial) ISPF Referral lists for object selection Action #l-30=Retrieve Entry DL=DSLIST /=Open List Data Set View REFLIST . . Last 30 referenced data sets REXX .. REXX Datasets 04/03/24 12:57 / ISPF Sekeleton Datasets 04/03/24 16:15 SKEL .. Umstellungs JCL 04/03/24 16:15 UMS .. ************************ End of ISPF Referral lists *********************** Abbildung 84 Aufruf des DSLIST Editors fur eine DSLIST vom Workplace Panel aus
In dem daraufhin erscheinenden Wartungsmenü der DSLIST „REXX" bewegen wir den Cursor vor den Namen PROX.REXX, geben dort ein s ein und drücken ENTER. File
View
Options
Help Personal Data Set List
Command ===> Enter a list action to perform or select a data set entry to retrieve. Action: S=Save A=Save As D=Delete this list E=Extended Edit L=DSLIST Action
Name REXX
Description REXX Datasets
Created 99/10/05
Select Partitioned, Sequential Data Set or DSLIST Level SMQP. * . REXX* SQMT . * . REXX* PRTT. REXX S PROX.REXX pevx.*.rexx
Referenced 04/03/24 17:59 More : + Volume
Abbildung 85 Auswahl eines DSN aus dem DSLIST Editor Panel
Da es sich bei der Auswahl von PROX.REXX um einen vollständigen DSN handelt und nicht um eine generische DSN-Maske, und die Datei PROX.REXX ein PDS ist, erhalten wir jetzt die Member List dieses PDS angezeigt. Diese Bildschirmanzeige sieht dann so aus:
130
7 Der Object/Action Workplace
Menu LIST Command
Confirm
Functions
Utilities
Help
PROX.REXX ===>
Name ÇCONREXX $CONSKEL $DOC $PDSHIST $PDSSICH $ README 5SICHDAT $SICHNOT $SICHREC $TESTDSN #BUILDD SGETDB2S
Prompt
Size 12 11 200 123 50 17 51 12 26 12 35 19
Created 2002/07/04 2002/07/04 2003/09/10 2004/03/17 2004/03/17 2000/03/15 2003/09/10 2003/09/11 2003/09/10 2002/01/23 2000/04/13 2003/04/02
D1D148 Row 00001 of 00051 Scroll = ==> CSR Changed ID 2004/03/09 09:37:09 LANZT 2003/04/01 10:16:42 LANZT 2003/09/10 17:58:41 LANZT 2004/03/17 23:56:08 SQMTP 2004/03/17 23:56:08 SQMTP 2003/12/04 10:18:05 LANZT 2003/09/10 17:58:43 LANZT 2003/09/11 10:55:36 LANZT 2003/09/10 17:58:43 LANZT 2002/09/12 17:28:04 LANZT 2000/10/10 17:06:17 LANZT 2003/04/02 09:36:37 LANZT
Abbildung 86 Anzeige der Member List eines PDS aus dem Workptace heraus
3. Anzeigen der Data Set Information. Wenn wir jetzt das obige Member Selection Panel mit der PF3 Taste verlassen, dann steht der vorher im DSLIST Wartungsfenster ausgewählte DSN im Objekt Namensfeld. Wir können jetzt für diese Datei eine Aktion hinter Action ===> eingeben. Wir wählen den Action Code i zur Anzeige der Data Set Information und drücken ENTER. Daraufhin erscheint die Anzeige der Data Set Information: Data Set Information Command
= >
Data Set Name . . . ¡PROX.REXX General Data **None** Management class . . DPPOOL Storage class . . . D1D148 Volume serial . . . Device type . . . . 3390 Data class **None** Organization . . . PO FB Record format . . . Record length . . . 80 Block size . . . . 27920 1st extent cylinders 5 Secondary cylinders 5 LIBRARY Data set name type 2002/09/12 Creation date . . . ** *Perm** * Expiration date . .
Current Allocation Allocated cylinders Allocated extents . Maximum dir. blocks
5 1 NOLIMIT
Current Utilization Used pages . . . . % Utilized . . . . Number of members .
182 20 51
Referenced date . .
2004/03/25
Abbildung 87 Anzeige der Data Set Information eines DSN aus der Workplace heraus
4. Anzeigen der DSLIST bei Auswahl einer Maske im DSLISTen Wartungsfenster. Wenn wir im Wartungsfenster statt der obigen Auswahl PROX.REXX eine Maske auswählen, wie z.B. PROXAREXX, dann bekommen wir die folgende Anzeige:
131
7.2 Beispiele zur Workplace Bedienung
Menu
Options
View
Utilities
Compilers
Help
DSLXST - D a t a Sets Matching PROX.*.REXX Command = > C o m m a n d - Enter "/" to select action PROX. LANZ . REXX PROX.LOGON.REXX ************************** E n d of Data Set list
Row 1 of 2 Scroll ===> C S R Volume Message D1D119 D1D135 ****************************
Merksätze zum Workplace Panel • • •
•
Dieses Panel vereint die Vorteile des DSLIST Panels, das wir über die Auswahl 3.4 erreichen mit denjenigen des DSLIST Befehls. Zusätzlich bietet es auch die Möglichkeit, DSLISTen direkt zu warten, indem man in einer DSLIST Zeile die Auswahl (/) eingibt. Man kann es über mehrere Wege erreichen. Dabei sind die Möglichkeiten des Aufrufs mit den Befehlen ISPFWORK und WP im Gegensatz zur Auswahl über das ISPF Option Menu Command = 11 besonders interessant, weil man dabei die aktuelle ISPF Oberfläche nicht verlassen muss und zudem wieder zu dieser zurückkehrt, sobald man das Workplace Panel verlässt. Gegenüber dem DSLIST Befehl zur Anzeige der DSLISTen hat das Workplace Panel den weiteren Vorteil, dass sich das Workplace Panel nicht nur zur Auswahl der DSLISTen öffnet, sondern auch noch da ist, wenn man aus der gewählten DSLIST zurückkommt, was bei der Benutzung des DSLIST Befehls nicht der Fall ist. Das Workplace Panel ist nämlich ein Dialog Panel, während das DSLIST Panel ein reines Anzeige- und Auswahl Panel ist.
8
Der ISPF Editor
Der Editor des ISPF ist nach meiner Meinung der leistungsstärkste Editor für zeilenorientierte Dateien, den es gibt. Er ist deshalb hervorragend geeignet Programmquellkodes, Testdaten, JCL usw. optimal zu bearbeiten. In den folgenden Unterkapiteln werde ich Ihnen an verschiedenen Beispielen die Leistungsfähigkeit des ISPF Editors zeigen. Bei diesen Beispielen wird verschiedentlich die Windows Zwischenablage als Übergabespeicher benutzt. Wir arbeiten hierbei mit dem „IBM Personal Communications System" unter Windows NT 4.0 Workstation. Wir wollen uns nun in den folgenden Kapiteln den Editor mit seinen umfangreichen Möglichkeiten näher ansehen. Dass Sie den Editor über die Menüauswahl 2 aus dem „Primary Option Menu" erreichen, möchte ich der Vollständigkeit halber noch erwähnen. Meistens wird der Editor aber direkt durch Eingabe eines e vor dem Namen einer Datei aus einer DSLIST heraus gestartet. Bei dieser Gelegenheit können wir auch gleich zwei Verwandte des Editors hinzunehmen, so dass wir also gleich drei Werkzeuge zu betrachten haben: EDIT Der Editor selbst. VIEW VIEW arbeitet wie der Editor. Die Datei kann zwar verändert, aber nicht in die Originaldatei zurückgeschrieben werden. Die Anzeigestruktur ist, bis auf die in einer anderen Farbe dargestellte linke Nummerierungsspalte, die gleiche, wie im Editor. Alle Funktionen des Editors können benutzt werden. BROWSE Hier können die Daten nur angesehen werden. Die Anzeigestruktur ist völlig anders als im Editor, wie z.B. die Farben, Zeilennummerierung usw. Im Gegensatz zu Editor und View lädt das Browse Programm nicht die gesamte Datei vor der Anzeige in den Hauptspeicher, sondern nur den jeweils zur Anzeige benötigten Teil. Deshalb ist der Browse unbedingt vorzuziehen, wenn man große Dateien nur ansehen will. Hinweis Wenn man bestimmte Dateien, die mit dem Editor nicht bearbeitet werden können, wie z.B. Ladebibliotheken, mit dem Editor aufruft, dann schaltet das ISPF automatisch auf BROWSE um.
134
8 Der ISPF Editor
Bevor wir uns mit den Möglichkeiten des Editors an Hand von Beispielen beschäftigen, wollen wir die Primary und Line Commands des Editors in der Form von zwei Tabellen betrachten.
8.1
Tabelle der EDIT Primary Commands
Wie Sie im Einfuhrungskapitel schon erfahren haben, gibt es im ISPF die Unterscheidung zwischen Primary Commands, die in der Command Line eingegeben werden und den Line Commands, die in die innerhalb des Datenbereichs eines Panels angezeigten Zeilen (Lines) eingegeben werden. Wir wollen uns hier nun den Primary Commands zuwenden, indem ich Ihnen diese zunächst in Form einer Tabelle vorstelle. Die ausführliche Beschreibung der Primary Commands finden Sie in der IBM Broschüre: ISPF Edit and Edit Macros, „Chapter 10: Edit Primary Commands". Erklärungen zur Syntax der Befehle, die in den folgenden Tabellen der Primary Commands und der Line Commands aufgeführt sind: Großbuchstaben: Diese Texte sind genau so einzugeben, wie sie aufgeführt sind. Allerdings können sie auch in Kleinbuchstaben eingegeben werden. Kleinbuchstaben: Diese Variablen sind durch die aktuellen Werte zu ersetzen. Dabei kann Kleinschreibung verwendet werden. Grau unterlegt: Dies sind die Default Values (Standardoptionen). In eckigen Klammern []: Diese Operanden sind optional. In geschweiften Klammern {}: Diese Operanden sind alternativ zu verwenden. Untereinander stehende Operanden: Diese Operanden können wahlweise benutzt werden. Wird keiner dieser Operanden ausgewählt, gilt der Default Operand. Das ODER Symbol (|): Hier muss einer der angegebenen Operanden eingegeben werden.
8.1 Tabelle der EDIT Primary Commands
135
Anschließend finden Sie die Tabelle der wichtigsten Primary Commands. Die kürzestmögliche Abkürzung für die Befehle und die Default Operanden habe ich grau unterlegt Befehl AUTONUM
[ON ] [OFF] .
AUTOSAVE [ON] [OFF PROMPT] [OFF NOPROMPT] BOUNDS [left-col right-col] BROWSE
[member]
CANCEL CAPS [ON ] [OFF] CHANGE txtl txt2 [range] [NEXT] [CHARS] [X] [col-1 [col-2]] [ALL] [PREFIX] [NX] [FIRST] [SUFFIX] [LAST] [WORD] [PREV] COPY [member] [AFTER label ] [(member)][BEFORE label] [data set name (member)] [data set name ] [linenum range] CREATE [member] [range] [data_set(member)] [data set name] CUT [lptr-range] [DEFAULT | clipboardname] [REPLACE] [DISPLAY] DELETE {ALL X | NX} {range X | NX} {ALL range} Tabelle 11 Edit Primary Commands - Teil 1
Bedeutung Bestimmt, ob die Zeilen beim SAVE durchnummeriert werden. Bestimmt, ob die geänderten Daten bei der Eingabe von END (PF3) gesichert werden. Legt die Spalten fest, innerhalb derer die entsprechenden Befehle wirken. Ruft das „MEMBER" aus dem gleichen PDS im Browse Mode auf. Wird kein MEMBER angegeben, erscheint ein Auswahlmenü. Beendet eine Edit Sitzung, ohne dass die Daten gesichert werden. Bestimmt, ob eingegebene Zeichen nach dem ENTER in Großbuchstaben umgesetzt werden. Führt einen Change durch. Die ausfuhrliche Beschreibung steht weiter unten.
Kopiert aus einem Datenbestand (Member oder Sequential Data Set) Daten in die editierte Datei.
Erstellt aus den editierten Daten ein Member oder eine sequentielle Datei. Kopiert oder verschiebt einen ausgewählten Bereich aus den editierten Daten in die ISPF Zwischenablage. Siehe hierzu die ausfuhrliche Beschreibung weiter unten. Löscht die in den Operanden angegebenen Zeilen aus der editierten Datei.
136 Befehl EDIT [member]
EDITSET / EDSET END EXCLUDE string [range][NEXT ] [CHARS ] [col-1 [col-2]] [ALL ] [PREFIX] [FIRST] [SUFFIX] [LAST ] [WORD ] [PREV ] FIND string [range] [NEXT ] [CHARS ] [X ] [col-1 [col-2] [ALL ] [PREFIX] [NX] [FIRST] [SUFFIX] [LAST ] [WORD ] [PREV ] FLIP [label-range]
HEX [ON DATA] [ON VERT] [OFF ] HILITE IMACRO {name | NONE} LOCATE {label | line-number} LOCATE[FIRST] {CHANGE}[range] [LAST ] {COMMAND } [NEXT ] {ERROR } [PREV ] {EXCLUDED} {LABEL } {SPECIAL } Tabelle 12 Edit Primary Commands - Teil 2
8 Der ISPF Editor Bedeutung Editiert das angegebene MEMBER aus dem gleichen PDS. Wird kein MEMBER angegeben, erscheint ein Auswahlmenü. Ruft das Panel zur Eingabe der Edit Optionen auf. Beendet die Edit Session. Diese Command liegt normalerweise auf der PF3 Taste. Schließt die ausgewählten Zeilen von der Anzeige im Edit Panel aus. Siehe hierzu die Beschreibung weiter unten.
Sucht nach Texten. Siehe die Beschreibung der Suchtechnik weiter unten.
Schaltet als FLIP-FLOP die Anzeige zwischen den Excluded Lines und den Non Excluded Lines hin und her. Schaltet die Anzeige der Daten auf hexadezimale Anzeige um und wieder zurück. Ruft das Panel zur Einstellung des „Colored Code" auf. Aktiviert ein Initial Makro oder schaltet es aus. Lokalisiert eine bestimmte Zeile über die Zeilennummer oder über den Line Label.
137
8.1 Tabelle der EDIT Primary Commands Befehl MODEL [model-name [qualifier...] ] {AFTER label} [NOTES ] {BEFORE label} [NONOTES] MODEL [CLASS [class-name]] MOVE [member] [AFTER label ] (member) [BEFORE label ] [data set name (member)] [data set name] NONUMBER NOTES [ON ] [OFF] NULLS [ON STD] [ON ALL] [OFF ] NUMBER [ON] [STD] [DISPLAY] [OFF] [COBOL ] [STD COBOL] [NOSTD] [NOCOBOL] [NOSTD NOCOBOL] PACK [ON ] [OFF] PASTE [clipboardname] [AFTER label ] [BEFORE label ] [KEEP] PRESERVE [ON ] [OFF] PROFILE [name] [number] PROFILE {LOCK | UNLOCK} RCHANGE RECOVERY [ON | OFF] [WARN | NOWARN | SUSP] Tabelle 13 Edil Primary Commands - Teil 3
Bedeutung Kopiert ein vorbereitetes Modell eines Befehls in den Edit File.
Verschiebt ein Member oder eine sequentielle Datei in den Edit File.
Schaltet die Zeilennummerierung aus. Bestimmt, ob beim Einfügen eines Models die Zeilen als Notes Zeilen oder direkt als Programmzeilen eingefügt werden. Setzt den Nulls Mode.
Setzt den Zeilennummerierungsmode.
Legt fest, ob die Daten beim Speichern gepackt werden. Kopiert die zuvor mit CUT erstellten Daten in den Edit File. Legt fest, ob nachfolgende Blanks beim Sichern beibehalten werden. Ruft den Edit Profile zur Anzeige auf. Setzt den LOCK/UNLOCK Modus. Wiederholt das letzte Change Command. Liegt normalerweise auf der PF6 Taste. Setzt den Recovery Mode zur Datenwiederherstellung.
8 Der ISPF Editor
138 Befehl RENUM [ON [STD]
[DISPLAY] [COBOL ] [STD COBOL] REPLACE [member] [range] REPLACE [data set name (member)] [range] REPLACE[data set (member)] [range] REPLACE [data set] [range] RESET
[CHANGE ] [range] [COMMAND ] [ERROR ] [EXCLUDED] [FIND ] [LABEL ] [SPECIAL ]
RFIND
SAVE SETUNDO
[STORAGE | RECOVER ] [OFF] SORT [range] [X ] [sort-fieldl ... sort-field5] [NX] STATS [ON ] [OFF] SUBMIT [range]
TABS [ON] [STD] [OFF] [ALL] [tab-character] UNDO UNNUMBER
VIEW
[member]
Tabelle 14 Edit Primary Commands - Teil 4
Bedeutung Nummeriert die Edit Lines neu.
Überschreibt ein Member oder eine sequentielle Datei mit Daten aus dem Edit File. Wirkt gleich wie CREATE. Der empfangende Datenbestand wird aber überschrieben. Setzt verschiedene Anzeige-Zustände im Edit File zurück. Mit RES ohne Operanden wird alles zurückgesetzt.
Wiederholt einen FIND mit den letzten Angaben aus FIND, CHANGE, EXCLUDE und SEEK. Sichert den Edit File. Die UNDO Informationen werden zurückgesetzt. Setzt die UNDO Optionen. Sortiert den Edit File.
Legt fest, ob die ISPF Statistics gesichert werden, wenn der Edit File gesichert wird. Submitted eine Bereich oder den ganzen Edit File zur Ausführung als Batch Job. Definiert Tab Positionen im Edit File für die Eingabe neuer Zeilen. Nimmt Änderungen im Edit File zurück. Entfernt Sequence Numbers im Edit File. Wirkt aber nur, wenn vorher NUM ON gesetzt war. Ruft ein Member aus dem Edit PDS im View Mode auf.
8.2 Tabelle der EDIT Line Commands
8.1.1
139
Operanden der Edit Befehle
Damit Sie mit der oben aufgeführten Tabelle der Edit Makro in der Praxis effizienter arbeiten können, fuge ich hier eine kurze Beschreibung der wichtigsten Operanden ein: Operanden [member] [first] [last] [next] [prev] [PREFIX] [SUFFIX1 [x] [nx] all col-1 col-2 data set label label-range
linenum-range lptr col lptr-range string
Bedeutung Hier muss der Name eines Members angegeben werden. Dieser Namen darf nicht länger als 8 Zeichen sein. Es wird nach dem ersten bzw. letzten Auftreten eines Textes gesucht. Diese Operation soll nur bis zum nächsten bzw. bis zum vorigen Auftreten der Bedingung durchgeführt werden. Der angegebene Text wird bei der Suche als PREFIX oder als SUFFIX betrachtet. Die betreffende Operation wird nur für EXCLUDED Zeilen (x) oder für die NOT EXCLUDED Zeilen (nx) ausgeführt. Diese Operation soll alle Zeilen der Datei betreffen. Zwei ganze Zahlen, die eine Operation auf die bezeichneten Spalten beschränken. Dateiname. Name einer bezeichneten Zeile. Besteht aus zwei Edit Labels von der Form .LA und .LB. Dies können entweder Standard Labels sein, wie z.B. .ZF und .ZL oder selbst definierte Edit Labels. Nach dem Punkt dürfen nur Buchstaben kommen! Zwei ganzzahlige Variable oder Konstante, die eine Anfangs- und eine Endzeile für eine Operation bezeichnen. Ganze Zahlen, die eine Zeilennummer und eine Spaltennummer enthalten. Zwei ganze Zahlen, welche die erste und letzte Zeile für eine Operation angeben. Text, der nicht in Hochkommata eingeschlossen sein muss.
Tabelle 15 Edit: Abkürzungen der Operanden
8.2
Tabelle der EDIT Line Commands
Die Line Commands werden jeweils in die im Editor angezeigten Zeilen in die ersten sechs Spalten, die sich vor den Datenzeilen befinden, eingegeben. Diese Befehle treten einzeln oder paarweise auf. Wenn sie paarweise zur Anwendung kommen, spricht man von Block Befehlen (Block Commands). In diesem Fall sind jeweils die Zeilen beginnend mit der Zeile des ersten Block Commands bis zur Zeile mit dem letzten Block Command betroffen. Block Commands erkennt man daran, dass das einzelne Command zweimal hintereinander auftritt. Bei allen Verschiebevorgängen werden nur die Spalten innerhalb der BOUNDS Grenzen
140
8 Der ISPF Editor
bewegt! Die Beschreibung der Befehlssyntax ist hier die gleiche, wie bei den Primary Commands. Hier nun die Tabelle der Edit Line Commands. Auch hier sind die Standardannahmen grau unterlegt: Command ([n] [2] (([n] [2]
Bedeutung Linksverschiebung der Spalten um 2 Positionen oder um die angegebene Anzahl Positionen.
) [n] [|]
Rechtsverschiebung der Spalten um 2 Positionen oder um die angegebene Anzahl Positionen.
)) [n] [2] [n] [2] »[n] [2] A[n] B[n] BOUNDS C[n] CC COLS D[n] DD F[n] I[n] L[n] LC[n] LCC LCLC M[n] MM
Linksverschiebung der Daten um 2 Positionen oder um die angegebene Anzahl Positionen. Datenverschiebung heißt hier, dass keine Zeichen ungleich Blank verloren gehen. Rechtsverschiebung der Daten um 2 Positionen oder um die angegebene Anzahl Positionen. Datenverschiebung heißt hier, dass keine Zeichen ungleich Blank verloren gehen. Bezeichnet diejenige Zeile hinter der (A) oder vor der (B) eine Einfügung erfolgt. Zeigt die Definitionszeile für die Spaltenbegrenzungen an. Kopiert (Copy) eine oder mehrere Zeilen zu einer anderen Stelle, die mit A oder B vorher adressiert sein muss. Zeigt die Spaltennummerierungszeile an. Löscht (D=Delete) eine oder mehrere Zeilen. Zeigt eine oder mehrere Zeilen am Beginn (F=First) eines Blocks von EXCLUDED Lines wieder an. Fügt eine oder mehrere Leerzeilen zum Zeck der Dateneingabe ein (I=Insert). Zeigt eine oder mehrere Zeilen am Ende (L=Last) eines Blocks von EXCLUDED Lines wieder an. Setzt eine oder mehrere Zeilen von Großbuchstaben in Kleinbuchstaben um. (LC=Lower Case) Verschiebt (Move) eine oder mehrere Zeilen zu einer anderen Stelle, die mit A oder B vorher adressiert sein muss.
Tabelle 16 Edit Line Commands - Teil 1
8.3 Die Profile des Editors
Command MASK MD [ n ] MDD MDMD 0[n] 00 R[n] RR[n] TABS TE[n] UC [ n ] UCC UCUC X[n] XX
141
Bedeutung Zeigt die Mask Line an. Konvertiert (MD=Make Data) eine oder mehrere ==MSG>, =NOTE=, -COLS>, und Zeilen in Datenzeilen. Definiert eine oder eine Gruppe von Zeilen zum Ziel einer Überlagerung (0=0verlay) durch andere Zeilen, die mit C, CC oder M, MM auszuwählen sind. Doppelt (R=Repeat) eine oder mehrere Zeilen. Zeigt die Tab Definitionszeile an. Fügt Leerzeilen zum Zweck der Schnelleingabe ein (TE=Text Entry). Setzt eine oder mehrere Zeilen von Kleinbuchstaben in Großbuchstaben um. (UC=Upper Case) Excluded eine oder mehrere Zeilen. Alle EXCLUDED Lines werden mit RES wieder zur Anzeige gebracht.
Tabelle 17 Edit Line Commands - Teil 2
8.3
Die Profile des Editors
Wie alle komplexen Systeme arbeitet der Editor unter gewissen Rahmenbedingungen, die man ändern kann. Diese Rahmenbedingungen werden in Profilen gespeichert. Diese Profile kann man sich natürlich ansehen und die darin enthaltenen Optionen können den eigenen Bedürfnissen angepasst werden. Es gibt zwei verschiedene Befehle, mit denen man Optionen für den Editor festlegen kann. Beide Befehle können nur aufgerufen werden, wenn eine EDIT oder VIEW Sitzung aktiv ist. 1. Befehl: EDSET/EDITSET 2. Befehl: PR/PROFILE
8.3.1
EDIT Optionen mit EDSET/EDITSET setzen
Mit EDSET werden die globalen Einstellungen für die Arbeit mit dem Editor innerhalb einer ISPF Benutzerumgebung gesetzt. Diese Einstellungen gelten dann für alle Edit Sitzungen eines ISPF Benutzers. Der Aufruf dieser Funktion erfolgt durch Eingabe der Befehle EDSET oder EDITSET in der Command Line einer Edit Sitzung und anschließendem Drücken der ENTER Taste.
8 Der ISPF Editor
142 Daraufhin erscheint das folgende POP UP Panel: Edit and View Settings Command ===>
More:
+
Settings for current and future Edit and View sessions: User session initial macro #IMACROA Maximum initial storage allowed for Edit and View . . 0 Target line for Find/Change/Exclude string 5 Enter "/" to select option Always position Find/Change/Exclude string to target line / Remove action bars in ISPF edit and view panels Force ISRE776 if RCHANGE passed arguments CUT default . . |
1. Append 2. Replace
PASTE default . . 1
1. Delete 2 . Keep
Settings for future sessions. Select Apply Setting Immediately for the setting to affect the current session as well. Enter "/" to select option / Confirm Cancel/Move/Replace Preserve VB record length
/ /
Apply Setting Immediately Apply Setting Immediately
Abbildung 88 Edit and View Settings
In diesem Panel können Sie folgende Optionen setzen, die für alle EDIT/VIEW Sitzungen in Ihrem ISPF Benutzer gelten: User session initial macro #IMACROA Hier können Sie den Namen eines Edit Makros eintragen. Dieses Makro wird beim Start jeder EDIT/VIEW Sitzung aufgerufen, bevor ein eventuell für diesen DSN auch noch definiertes IMACRO aufgerufen wird und bevor die Daten am Bildschirm erscheinen. Maximum initial storage allowed for Edit and View . . 0 Diese Zahl bezeichnet das Maximum an Hauptspeicher in Kilobyte, den das System für EDIT/VIEW Aufrufe zur Verfügung stellt. Erfolgt ein EDIT/VIEW Aufruf für eine Datei, welche fur die angegebene Hauptspeichergröße zu groß ist, dann wechselt das System selbständig in einen BROWSE Aufruf. Ist diese Zahl mit Null angegeben, dann nutzt das System den gesamten verfugbaren Speicher. Reicht dieser nicht aus, dann endet der Aufrufversuch mit einem Fehler. Ich empfehle Ihnen, diese Option immer auf Null stehen zu lassen. Target line for Find/Change/Exclude string Diese Angabe wirkt nur, wenn Sie auch die Option
5
Always position Find/Change/Exclude string to target line aktiviert haben. Ist dies der Fall, dann positioniert der Editor automatisch die erste aus den oben genannten Operationen gefundene Zeile, als z.B. fünfte Zeile von oben, in der Anzeige. Diese Option ist etwas für Liebhaber dieser Funktion. Testen Sie die Funktion und entscheiden Sie selbst, ob Sie damit arbeiten wollen.
8.3 Die Profile des Editors
143
Always position Find/Change/Exclude string to target line Durch setzen dieser Option wird die oben bereits beschriebene Funktion mit der Target Line aktiviert. Remove action bars in ISPF edit and view panels Durch diese Option können Sie festlegen, dass in den EDIT/VIEW Panels die „Action Bars" ausgeblendet werden. Dadurch haben Sie eine Zeile mehr in der EDIT/VIEW Anzeige zur Verfugung. Ich nutze diese Option gerne. CUT default / PASTE default Diese Eintragungen verstehen Sie besser, wenn Sie sich hierzu die Kapitel „CUT und PASTE" ab Seite 176 anschauen. Setzen Sie dann diese Option nach Ihrem Belieben. Confirm Cancel/Move/Replace Diese Option legt fest, dass, wenn bei der Ausfuhrung einer der oben genannten Operationen Daten überschrieben würden, sie mit einem Panel zur Bestätigung aufgefordert werden. Lassen Sie diese Option immer auf EIN Stehen. Apply Setting Immediately Mit diesen beiden Optionen können Sie bestimmen, dass Änderungen, die Sie in diesem Panel vorgenommen haben, sofort nach dem Drücken der PF3 Taste wirksam werden, oder erst bei der nächsten EDIT Session. Ich lasse diese Option immer auf EIN stehen.
8.3.2
EDIT Profile einstellen und nutzen
Die EDIT Profile legen bestimmte Verarbeitungsregeln für die EDIT Sitzungen fest. Man kann den EDIT Profilen Namen geben und sie für bestimmte Dateitypen anlegen. Den Namen kann man dann beim Aufruf dieser Dateitypen im Edit Panel (Option 2 im ISPF) verwenden. Dies ist aber in der Regel nicht notwendig, denn die verschiedenen Profile werden vom ISPF automatisch den Dateitypen zugeordnet, in denen man sie benutzt. Voraussetzung für diese Automatik ist allerdings, dass Sie ein schlüssiges Dateinamenskonzept verwenden. Wir wollen uns einmal ein solches Profil anschauen. Dazu gehen wir wie folgt vor: Wir editieren ein Member in einer JCL Datei. Danach geben wir in der Command Line im EDIT den Befehl PROFILE 9 ein und drücken ENTER. Mit der 9 hinter dem Befehl PROFILE fordern wir den Edit auf, uns alle Zeilen des Profils anzuzeigen. Er würde sonst nämlich nur die ersten fünf Zeilen anzeigen. Und erhalten damit folgende Anzeige am Bildschirm:
144
8 Der ISPF Editor
EDIT SQMT.JCL(IDCAMS) - 01.02 Columns 00001 00072 Command ===> Scroll ===> CSR ****** ***************************** fop of Data ****************************** =PROF> JCL (FIXED - 80) . . . .RECOVERY ON. . . .NUMBER OFF SETUNDO STG =PROF> CAPS ON HEX OFF. . . .NULLS ON STD . . . .TABS OFF =PROF> . . . .AUTOSAVE ON. . . .AUTONUM OFF. . . .AUTOLIST OFF. . . .STATS ON. =PROF> . . . .PROFILE LOCK IMACRO #IMACR01. . . .PACK OFF. . . .NOTE ON. =PROF> ....HILITE JCL PAREN CURSOR FIND =TABS> =MASK> =BNDS> < =COLS> + 1 + 2 + 3 + 4 + 5 + 6 + 7— 000001 //* DOC: JCL IDCAMS ************************************************* 000002 //* DOC: DURCHFUEHRUNG VON IDCAMS COMMANDS * AM: 7 MAY 2002 * 000003 //* (C) LANZT 000004 //********************************************************************* 000005 //IDCAMS EXEC PGM=IDCAMS 000006 //SYSPRINT DD SYSOUT=* 000007 //IN DD DISP=SHR,DSN=SQMT.LOAD(ENRDB200) 000008 //SYSIN DD * 000009 PRINT INFILE(IN) DUMP ****** **************************** Bottom of Data **************************** Abbildung 89 Edit Profile Anzeige Panel
Im Edit Profile sind zwei Gruppen von Einträgen vorhanden: • •
Die hinter =PROF> stehenden Profile Optionen. Die temporären Zeilen.
Die wichtigsten =PROF>: Optionen: JCL (FIXED - 80)... . Der „Data Set Name Type" dieser Datei ist JCL. Dies wird vom letzten Qualifier des DSN SQMT J C L abgeleitet. Die Datensätze sind vom Typ FIXED und die LRECL ist 80 Byte. Ausgehend von diesem Datentyp werden in Zusammenarbeit mit der mittels HILITE definierten Option JCL die Edit Daten entsprechend dem Typ JCL als „Colored Code" dargestellt. RECOVERY ON RECOVERY ON bedeutet, dass alle Änderungen während des Editierens der Datei protokolliert werden. Dies bringt zwei Vorteile: • •
Man kann während des Editierens alle Änderungen schrittweise mit UNDO zurücknehmen. Falls während einer Edit Sitzung ein Systemabbruch erfolgt, kann man, wenn das System wieder läuft, diese Edit Sitzung „RECOVERN" und die Arbeit an der unterbrochenen Stelle fortsetzen. Diese RECOVERY Aktion wird vom System automatisch angeboten.
Ich empfehle Ihnen, immer mit RECOVERY ON zu arbeiten.
8.3 Die Profile des Editors
145
NUMBER OFF Die einzelnen Zeilen der JCL Datei werden nicht durchnummeriert. Mit NUMBER ON STD würden diese auf den Spalten 73 bis 80 nummeriert. CAPS ON Bei der Eingabe von Zeichen während des Editierens werden bei jedem ENTER die eingegebenen Zeichen in Großbuchstaben überführt. Dies bietet sich bei einer JCL Datei natürlich an, denn JCL muss immer in Großbuchstaben erstellt werden. Dieser Modus wird vom Editor beim Aufruf einer Edit Sitzung eventuell automatisch gesetzt. Das funktioniert so: Wenn man eine Datei editiert, in welcher bisher CAPS OFF gesetzt war und der Editor stellt fest, dass in dieser Datei nur Texte mit Großbuchstaben vorhanden sind, dann setzt er von sich aus CAPS ON ein. Umgekehrt funktioniert das genauso mit CAPS OFF. Dieser Vorgang wird mit einer Warnung angekündigt. NULLS ON STD NULLS ON bedeutet, dass Blanks am Ende eines Textes einer der Zeile mit NULLS gefüllt werden. In NULLS Zeilen kann man einfügen, ohne vorher die entsprechende Anzahl Zeichen von rechts her gelöscht zu haben. PROFILE LOCK Mit dieser Option kann man das Profil vor Überschreibung schützen. Wenn diese Option auf LOCK steht, wird das Profil beim Verlassen einer Edit Sitzung nicht durch die während einer Edit Sitzung durchgeführten Änderungen der Profiloptionen überschrieben. Man kann das Profil während der Sitzung trotzdem ändern und diese Änderungen bleiben während der Sitzung auch aktiv. Durch diese Option wird vermieden, dass Änderungen des Profils bei späteren Sitzungen zu Überraschungen fuhren. Hier sei vor allem die =BNDS> Zeile erwähnt, die wir weiter unten besprechen. Beim Eingeben des Befehls PROFILE LOCK wird der gegenwärtige Inhalt des Profils gesichert. IMACRO #IMACROI IMACRO steht für „Initial Macro" und heißt, dass das Edit Makro #IMACR01 ausgeführt wird bevor die Datei im Edit erscheint. Dieses Makro behandeln wir ganz ausführlich in unseren Kapiteln über die Makro Programmierung. HILITE JCL Dies bedeutet, dass die Zeilen in dieser Datei nach dem Muster JCL farblich gestaltet werden. Siehe hierzu das Kapitel „Colored Code - " auf Seite 147. SETUNDO STG Die Informationen für das Zurücknehmen von durchgeführten Änderungen werden im Hauptspeicher (STG=Storage) gespeichert. Die temporären Zeilen Die temporären Zeilen können als Eingabe- und Strukturierungshilfe benutzt werden. Sie können so oft wie benötigt in den Edit Text eingefugt werden. Sie werden beim Sichern der Datei nicht mit gesichert und sind somit bei einem erneuten Aufruf der Datei im Editor nicht mehr vorhanden.
146
8 Der ISPF Editor
Die temporären Zeilen werden in drei Gruppen aufgeteilt: 1. Changed Lines: ==CHG> Hiermit werden Zeilen markiert, die durch eine Change oder RChange Operation geändert wurden. 2. Error Lines ==ERR> Diese Anzeige in einer Zeile erscheint, wenn ein Change Command in dieser Zeile nicht ordnungsgemäß durchgeführt werden konnte, weil z.B. die Zeile an ihrem Ende nicht genügend Platz hat, um den Change auszuführen. 3. Special Lines Die Special Lines werden in zwei Kategorien unterteilt: 1. Kategorie: Edit Profile Lines. Deren Inhalte werden im Profil gespeichert. =PROF> Sie enthalten die Profile Mode Settings. =TABS> Sie enthalten Tab Positionen, die bei der Eingabe neuer Zeilen angesprungen werden. =MASK> Diese Zeile enthält ein Eingabemuster, das bei der Eingabe mit I (Insert) in den eingefügten Zeilen vorgegeben wird. =BNDS> Diese Zeile definiert die linke und rechte Grenze innerhalb derer die Edit Befehle wirken. =COLS> Mit dieser Zeile wird eine Maske eingefügt, die einen Spaltenzähler enthält. 2. Kategorie: Message und Note Zeilen. ==MSG> Sie enthalten Informationen vom Editor. =NOTE> Sie enthalten Eingabedaten, die man dann mit dem Line Command MD zu „echten" Daten machen kann. Merksätze zum Edit Profile •
Die Anzeige der Profilzeilen kann man mit dem Befehl RESET oder RES wieder abschalten.
8.4 Colored Code - Farbige EDIT/VIEW Anzeigen • •
• •
147
Der Inhalt des Profils wird beim Verlassen der Edit Sitzung in den Profile Pool des ISPF gesichert. Aber nur dann, wenn PROFILE LOCK nicht gesetzt ist. Die Profildefinitionen gelten automatisch für alle Dateien mit dem gleichen Dateityp, also dem gleiche LLQ (Last Level Qualifier) innerhalb unserer ISPF Sitzungen. Wenn ein anderer TSO Benutzer die gleiche Datei aufruft kann er ganz andere Profiloptionen für diesen Dateityp gesetzt haben. Sie sollten die Option PROFILE LOCK benutzen, damit Sie nicht durch eine noch „übrig gebliebene" falsch eingestellte =BNDS> Zeile unangenehme Überraschungen erleben. Die CAPS, NUMBER, STATS und PACK Modi werden durch PROFILE LOCK nicht gesichert. Sie werden nach dem Inhalt der Daten vom Editor automatisch eingestellt.
8.4
Colored Code - Farbige EDIT/VIEW Anzeigen
Nachdem wir in dem Kapitel über die Profile des Editors schon das Thema der farblichen Ausgestaltung der Zeilen bestimmter Dateitypen durch den Editor kurz behandelt haben, wollen wir uns diesem Thema jetzt gründlicher widmen. Leider kann ich Ihnen diese wunderschönen Farben nicht zeigen, weil ein Farbdruck den Preis dieses Buches erheblich nach oben getrieben hätte. Ich werde aber versuchen, Ihnen die Vorteile dieser Einrichtung durch entsprechende Hinweise vor Augen zu führen.
8.4.1
Colored Code - Was ist das?
Vielleicht haben Sie schon in einem anderen System einen Editor kennen gelernt, der Ihnen die „Colored Code" Darstellung für Programme in C oder Java angeboten hat. Falls dies nicht der Fall ist, möchte ich jetzt einmal darüber nachdenken, worin der Vorteil liegen könnte, wenn der Editor die Zeilen eines Programms in unterschiedlichen Farben darstellt. • • • • •
Die Paarigkeit von Klammern könnte überprüft werden. Die Befehle der verwendeten Programmiersprache könnten in einer anderen Farbe als die übrigen Texte dargestellt werden. Kommentare könnten eine andere Farbe erhalten. Anfang und Ende der Kommentare wären dadurch sofort erkennbar. Die Paarigkeit von DO-END Gruppen könnte kontrolliert werden. Nicht korrekte Fortsetzungszeilen könnten markiert werden.
All dies und noch einiges mehr bietet die „Colored Code" Einrichtung des ISPF Editors! Eine umfangreiche Beschreibung zu diesem Thema finden Sie in der Broschüre ISPF Edit and Edit Makros und dort im Kapitel: „Enhanced and Language-sensitive Edit Coloring" Auf den folgenden Seiten gebe ich Ihnen eine kurze Einführung in diese Technik, wobei ich auch einige Tipps und Tricks verrate.
148
8 Der ISPF Editor
8.4.2
Einrichten von Colored Code
Für die Einrichtung des „Colored Code" wird der Edit Befehl HILITE benutzt. Diesen Befehl kann man auf zweierlei Art anwenden: 1. Als Befehl, um einzelne Optionen zu setzen. Hierbei geben Sie den Befehl begleitet von einem oder auch mehreren Operanden in der Command Line ein. 2. Als Befehl, um den HILITE Dialog aufzurufen. Hierzu geben Sie in der Command Line einfach nur den Befehl HILITE ohne Operanden ein. Achtung: Dieser Aufruf ist unter der GUI Oberfläche nicht möglich. Tipp Ich empfehle Ihnen, immer den HILITE Dialog zu benutzen, da Ihnen HILITE die möglichen Optionen zur Auswahl anbietet. Damit sind Sie in der Lage, Ihre Wunscheinstellungen gezielt in einem Panel vorzunehmen. Wir wollen uns nun diesen Dialog ansehen. Zu diesem Zweck habe ich eine REXX Prozedur im Editor aufgerufen und als Befehl dann HILITE eingegeben. Darauf erscheint das folgende POP Up Panel: EDIT 1 i i
PROX LANZ REXX (BENP) - 01.03 File
Languages
Colors
Columns 00001 00072 I
Help
1
Edit Color Settings
| Command ===> 1 | Language: 13
i
1. Automatic 2. Assembler 3. BookMaster 4. c 5. COBOL 6. IDL 7. ISPF DTL 8. ISPF Panel 9. ISPF Skeleton 10. JCL 11. Pascal 12. PL/1 13. REXX 14 . Other 15. Default
Coloring: §
1. 2. 3. 4. 5.
Do not color program Color program Both IF and DO logic DO logic only IF logic only
Enter "/" to select option / Parentheses matching / Highlight FIND strings / Highlight cursor phrase Note: Information from this panel is saved in the edit profile.
1
1 1 11
Abbildung 90 Das Einstellungspanel flir Colored Code
Die wichtigen Stellen in diesem Panel habe ich grau unterlegt: REXX Dies ist der LLQ (Last Level Qualifier) der Datei PROX.LANZ.REXX, aus der ich das Member BENP in den Editor aufgerufen habe. Wenn ich in diesem HILITE Dialog Ein-
8.4 Colored Code - Farbige EDIT/VIEW Anzeigen
149
Stellungen vornehme und den Dialog dann mithilfe der PF3 Taste verlasse, dann werden diese HILITE Einstellungen in den ISPF Profildateien gesichert. Fortan gelten für alle Dateien mit dem LLQ REXX diese HILITE Einstellungen. Sie werden auch auf Member angewandt, die zwar in der gleichen Datei stehen, aber gar keinen REXX Programmkode enthalten.
Language: Hier müssen wir angeben, für welche Sprache der „Colored Code" definiert werden soll. Wir wählen in diesem Fall die 13 für REXX.
Coloring: Mit dieser Auswahl legen wir fest, welche Art von Überwachung mit der entsprechenden farblichen Ausgestaltung wir angezeigt haben möchten. Man wählt hier am besten immer die 3 aus, denn wir möchten ja den optimalen Nutzen aus der Einrichtung des „Colored Code" ziehen. Beispiel: Ich habe in dem folgenden Programmteil ein END zuviel eingefügt. Dieses END wird deshalb invers markiert: do i = 1 to 20 if xxx — yyy then do end end i end
I
Tipp Diese Prüfung entdeckt zwar, wenn zu viele END Statements existieren, aber leider nicht, wenn es zu wenige sind! Allerdings wird bei geschachtelten DO Anordnungen jedes neue DO mit einer anderen Farbe markiert und das entsprechende paarig dazugehörige END mit der gleichen Farbe. Damit kann man relativ leicht die Paarigkeit von DO Anweisungen mit dem zugehörigen END abgleichen.
Parentheses matching Wenn wir diese Option auswählen, dann wird die Paarigkeit von Klammern im Quellkode überwacht. Dabei werden den zusammengehörigen Klammerpaaren jeweils die gleichen Farben zugewiesen. Ist die Paarigkeit gestört, dann wird an der Stelle, an der die Unpaarigkeit beginnt, die Klammer invers dargestellt. Beispiel: Ich habe am Ende der zweiten Zeile des folgenden JCL Statements ganz hinten eine Klammer zuviel eingefügt und in der dritten Zeile hinter (5,5,10 die Klammer weggelassen. Dadurch werden die letzte Klammer der zweiten Zeile und die erste Klammer der dritten Zeile jeweils invers dargestellt, so wie es hier grau unterlegt ist. //ISPPROF // //
DD DISP=(NEW,PASS), DCB=(RECFM=FB,LRECL=80,BLKSIZE—3120)), SPACE=(TRK,(5,5,10,RLSE),UNIT=VIODA
Highlight FIND strings Ist diese Option aktiv, dann werden nach Eingabe eines FIND Befehls im Editor alle gefundenen Texte mit Highlight invers dargestellt.
150
8 Der ISPF Editor
Beispiel Ich habe beim Edit einer JCL Datei den Befehl find iefrder eingegeben. Die gefundenen Stellen werden dann als Highlight invers dargestellt. Hier sind sie grau unterlegt: //SYSIN //IEFRDER
DD DD
DDNAME=IEFRDER DUMMY,DCB=BLKSIZE=80
Highlight Cursor phrase Diese Option bewirkt, dass der Textteil, in dem sich der Cursor nach einem ENTER befindet, mit Highlight invers dargestellt wird. Merksätze zum „Colored Code" und HILITE •
•
•
•
•
•
Die Einstellungen, die Sie mit dem Werkzeug HILITE treffen, gelten immer für alle Dateien, die den gleichen LLQ haben, wie diejenige, bei deren Edit Sie diese HILITE Optionen zuletzt gesetzt haben. Wenn Sie Sicherungen oder Klone von Dateien anlegen, für die ein „Colored Code" eingerichtet ist, dann achten Sie darauf, dass der LLQ im neuen Dateinamen erhalten bleibt. Beispiel: Wenn Sie eine Kopie der Datei USERID.JCL erstellen, dann nennen Sie die neue Datei USERID.SAVE.JCL und nicht etwa USERID.JCL.SAVE. Wenn ich Sicherungsdateien erstelle, dann nenne ich diese manchmal so, dass ich an den Namen der Originaldatei einfach den LLQ ein weiteres Mal hänge. Z.B. heißt die Sicherung von USERID.JCL dann einfach USERID.JCL.JCL. Sie können verschiedenen LLQs die gleichen HILITE Optionen zuordnen. Zum Beispiel sind bei mir in der Datei LANZT.LOGON.CLIST im Wesentlichen nur REXX Prozeduren enthalten. Deshalb sind hier die HILITE Optionen die gleichen, wie für die Dateien mit dem LLQ REXX. Sie sollten ein Namenskonzept für die LLQs der Dateien festlegen, für die Sie „Colored Code" benutzen wollen. Wählen Sie möglichst kurze DSN. Das erleichtert die Übersicht und spart oft viel Tipparbeit. Sie sollten auf keinen Fall Ihre JCL Member in der gleichen Datei abspeichern, in der die REXX Quellkodes stehen. Wenn Sie das tun, müssen Sie entweder permanent Ihre Colored Code Einstellungen ändern oder aber für eine der beiden Kode Typen eine etwas seltsame Colored Code Darstellung in Kauf nehmen. Auf der folgenden Seite finden Sie Empfehlungen, wie Sie die LLQs für Ihre Programmdateien wählen sollten
8.4.3
Einheitliche Last Level Qualifier
Wie Sie den obigen Ausführungen entnehmen können, ist es sehr wichtig, von vorne herein die richtigen LLQs beim Anlegen von Dateien, die für Programmbibliotheken und JCL benutzt werden sollen, zu wählen.
151
8.5 Edit Recovery Die Vorschläge in der folgenden Tabelle können Ihnen als Hilfestellung dienen: HILITE Auswahl Assembler C COBOL ISPF Panel ISPF Skeleton JCL PL/I REXX
LLQ ASM C COBOL, COB PANEL SKEL JCL, CNTL, PROCLIB PLI, PLI REXX, CLIST
Inhalte der Dateien Assembler Programme C Programme COBOL Programme Dateien der ISPF Panels Dateien der ISPF Skeletons Dateien mit JCL Members PLI Programme REXX Programme
Abbildung 91 Vorschläge fiir Last Level Qualifiers
8.5
Edit Recovery
Nachdem wir bei der Behandlung der Profiloptionen schon die Option RECOVERY ON/OFF kennen gelernt haben, wollen wir uns jetzt das Thema des Edit Recovery etwas genauer anschauen. Sie haben wahrscheinlich schon mit Textsystemen im PC Bereich gearbeitet, welche die Funktion des „Bearbeiten/Rückgängig" anbieten. Genau die gleiche Funktion finden wir auch im ISPF mit der Einrichtung des „Edit Recovery". Die Edit Recovery Einrichtung des ISPF bietet folgende Möglichkeiten: • •
Man kann Änderungen im laufenden Edit Betrieb schrittweise zurücknehmen. Man kann die Edit Sitzung nach einem Systemabbruch „recovern" und an der Stelle fortsetzen, an der man unterbrochen wurde.
Voraussetzung für die Verfügbarkeit dieser Funktion ist, dass man im Edit Profile die Option RECOVERY ON gesetzt hat. Die Recovery Funktion kann auch indirekt durch SETUNDO RECOVERY eingeschaltet werden. Siehe hierzu das nächste Kapitel. Was geschieht, wenn RECOVERY ON gesetzt wird oder beim Aufruf einer Datei durch den Editor bereits gesetzt war? Sobald die erste Änderung in der Datei vorgenommen ist und diese Änderung durch ein ENTER oder eine PF Taste aktiviert wurde, wird ein Recovery Data Set angelegt. In dieser Datei werden fortan alle Änderungen während der Edit Sitzung protokolliert. Sie dient als Datenquelle fur den UNDO Befehl (bei gesetztem SETUNDO RECOVERY) und als Sicherungsdatei für das RECOVERY Verfahren nach einem harten Abbruch der Editor Sitzung.
152
8 Der ISPF Editor
Beispiele für Recovery Data Sets: Ich habe in meinem TSO User insgesamt vier Edit Sitzungen geöffnet und in jeder eine Änderung durchgeführt. Danach konnte ich die folgenden Recovery Data Sets finden: LANZT.ISR8195.BACKUP LANZT.ISR8203.BACKUP LANZT.ISR8211.BACKUP LANZT.ISR8217.BACKUP
PS PS PS PS
U U U U
0 0 0 0
13680 13680 13680 13680
Wenn jetzt mein TSO User durch einen Operator oder durch einen Systemabbruch „abgeschossen" würde, könnte ich, wenn das ISPF wieder verfügbar ist, meine vier Edit Sessions fortführen. Aber da stellen Sie natürlich die Frage: Woher weiß das System bei einem Wiederanlauf, dass Edit Recovery Files da sind? Um diese Frage zu beantworten, muss ich Ihnen den Recovery Mechanismus erklären und der funktioniert so: Sobald die erste Änderung in einer Edit Session erfolgt ist wird: • •
der Edit Recovery File angelegt. im Member ISREDRT der User PROFILE Datei durch einen entsprechenden Eintrag vermerkt, dass ein Recovery Data Set mit dem entsprechenden Namen vorliegt. Danach wird das Member ISREDRT sofort in der Profildatei ISPPROF gesichert.
Wenn die Edit Session beendet wird, geschieht Folgendes: • •
Der Eintrag im Member ISREDRT wird gelöscht und das Member wird sofort in die Profildatei ISPPROF zurückgeschrieben. Der Edit Recovery File wird gelöscht.
Tipp Aus diesem Recovery Mechanismus kann sich eine schwierige Situation ergeben: Wenn Ihr TSO User „abgeschossen" wurde und einer der Recovery Files ist nach dem Neustart Ihres ISPF nicht mehr vorhanden, dann versucht Ihr ISPF bei jedem Aufruf einer Edit Session das Recovery für die abgebrochene Edit Session zu starten, findet aber den zugehörigen File nicht. In diesem Fall bleibt Ihnen nur die Möglichkeit, den Recovery Prozess mit CANCEL abzubrechen.
8.6
Die UNDO Funktion
Vermutlich kennen Sie die UNDO Funktion aus Systemen im PC Bereich. Die nahezu gleiche Funktionalität steht im Editor des ISPF zur Verfügung. Genau wie in PC Systemen, können Sie im ISPF Editor mit UNDO Ihre zuletzt gemachten Änderungen an dem editierten Datenbestand schrittweise und in umgekehrter Reihenfolge zurücknehmen. Der wesentliche Unterschied besteht darin, dass die einmal mit UNDO zurückgenommenen Änderungen
8.6 Die UNDO Funktion
153
nicht mehr rückgängig gemacht werden können, was bei den meisten PC Systemen möglich ist. Aber anders als bei den Systemen im PC Bereich, muss diese Funktion durch explizites Einschalten aktiviert werden. Wenn die UNDO Funktion aber einmal aktiviert wurde, bleibt sie für das Edit Profil, das beim Einschalten gerade benutzt wurde, dauerhaft aktiv, da dieser Status im Edit Profil gesichert wird. Die UNDO Funktion kann die Daten zum Zurücknehmen der Änderungen aus zwei verschiedenen Quellen holen: • •
aus der RECOVERY Datei. aus dem Hauptspeicher.
Unter welchen Umständen diese beiden möglichen Quellen angezapft werden, hängt von dem Status ab, der mit dem SETUNDO Befehl zuletzt gesetzt wurde.
8.6.1
Einschalten der UNDO Funktion
Der UNDO Status wird mit dem Edit Primary Command SETUNDO verändert. Dieser Befehl kennt folgende Operanden: SETUNDO [STORAGE | RECOVER | ON | OFF] STORAGE ON Aktiviert die UNDO Funktion und schaltet den Hauptspeicher für das Speichern der UNDO Daten ein. Im Profil erscheint der Eintrag SETUNDO STG. Ab sofort werden die Änderungen der Edit Sitzung unabhängig vom RECOVERY Status auch im Hauptspeicher gespeichert und bei der Eingabe des UNDO Befehls von dort geholt. STORAGE OFF Deaktiviert den Hauptspeicher als Speicher für die UNDO Daten und schaltet den Plattenspeicher als Speicher für die UNDO Informationen ein. Je nach aktuellem RECOVERY Status gibt es zwei Möglichkeiten: • •
Der RECOVERY Status ist OFF. Dann wird auch SETUNDO auf OFF geschaltet und es ist kein UNDO Befehl mehr möglich. Der RECOVERY Status ist ON. Dann wird automatisch SETUNDO RECOVER eingeschaltet und die UNDO Informationen werden ab sofort in der RECOVERY Datei gespeichert.
RECOVER Schaltet den Recovery File als Speicherort für die UNDO Daten ein. Wenn RECOVERY vorher auf OFF gestanden hat, wird RECOVERY automatisch auf ON gesetzt. Ihnen ist beim Lesen des Befehls SETUNDO sicherlich aufgefallen, dass der Operand STORA GE kursiv gedruckt ist.
154
8 Der ISPF Editor
Das hat folgenden Grund: Die Möglichkeit, den Hauptspeicher als Zwischenspeicher fur die UNDO Daten benutzen zu können, muss durch die Systemgenerierung für das ISPF in dieser MVS LPAR aktiviert werden, indem im Member ISPCONF die Option UNDO STORAGE SIZE auf einen Wert ungleich Null gesetzt wird. Wenn dies nicht geschehen ist, dann kann man nur SETUNDO RECOVERY nutzen. Falls diese Funktion in Ihrem System nicht zugelassen ist, müssen Sie keineswegs auf UNDO verzichten. Sie können immer SETUNDO RECOVERY nutzen. Informationen zum Member ISPCONF finden Sie im Kapitel „Das Member ISPCONF" ab Seite 80. Ich möchte Ihnen in den folgenden Beispielen die Inhalte einiger Edit Profile zeigen und dazu erläutern, welche Situation bezüglich RECOVERY und UNDO dort jeweils vorliegen: . . . .REXX (FIXED - 80) . . . .RECOVERY ON. . . .NUMBER OFF .... CAPS OFF.... HEX OFF.... NULLS ON STD.... TABS OFF....SETUNDO REC ....AUTOSAVE ON....AUTONUM OFF....AUTOLIST OFF....STATS ON. . . . .PROFILE UNLOCK. . . . IMACRO #IMACR01. . . .PACK OFF. . . .NOTE ON . . . . HILITE REXX LOGIC PAREN CURSOR FIND
Recovery wird durchgeführt, UNDO Datei ist der Recovery Data Set. ....REXX (FIXED - 80)....RECOVERY ON....NUMBER OFF ....CAPS OFF....HEX OFF....NULLS ON STD....TABS OFF....SETUNDO STG. . . . .AUTOSAVE ON. . . .AUTONUM OFF. . . .AUTOLIST OFF. . . .STATS ON ....PROFILE UNLOCK....IMACRO #IMACRO1....PACK OFF....NOTE ON HILITE REXX LOGIC PAREN CURSOR FIND
Recovery wird durchgeführt, UNDO Datei ist der Hauptspeicher. . . . .REXX (FIXED - 80) . . . .RECOVERY OFF. . . .NUMBER OFF . . . .CAPS OFF. . . .HEX OFF. . . .NULLS ON STD. . . .TABS OFF. . . .SETUNDO STG. ....AUTOSAVE ON....AUTONUM OFF....AUTOLIST OFF....STATS ON . . . .PROFILE UNLOCK. . . .IMACRO #IMACRO 1. . . .PACK OFF. . . .NOTE ON ....HILITE REXX LOGIC PAREN CURSOR FIND
Recovery wird nicht durchgeführt, UNDO Datei ist der Hauptspeicher. . . .REXX (FIXED - 80) . . . .RECOVERY OFF. . . .NUMBER OFF . . . CAPS OFF .... HEX OFF.... NULLS ON STD .... TABS OFF .... SETUNDO OFF. ...AUTOSAVE ON....AUTONUM OFF....AUTOLIST OFF....STATS ON ...PROFILE UNLOCK....IMACRO #IMACRO1....PACK OFF....NOTE ON ...HILITE REXX LOGIC PAREN CURSOR FIND
Recovery wird nicht durchgeführt, UNDO ist nicht möglich.
155
8.7 FIND und CHANGE
8.6.2
Grenzen des UNDO Befehls
Die folgende Aufstellung fuhrt alle Bedingungen auf, unter denen UNDO nicht oder nach deren Auftreten nicht mehr möglich ist: • • • •
•
•
Änderungen, die durch ein „Initial Edit Macro" oder durch ein „Recovery Edit Macro" durchgeführt werden. Alle Aktionen, die vor irgendeiner Änderung im Datenbereich der editierten Datei erfolgen. Edit Aktionen, die in vorhergehenden Edit Sitzungen mit der gleichen Datei durchgeführt wurden. Änderungen in der Anzeige nach einem RESET. Zum Beispiel können Sie die Anzeige der Changed Lines (==CHG> Zeilen Anzeige) nicht mehr zurückholen, nachdem Sie einmal RESET eingegeben haben. Alle Änderungen, die während der Edit Sitzung in anderen Dateien durch CREATE, REPLACE oder MOVE durchgeführt wurden, da sich das UNDO immer nur auf die gerade im Edit befindliche Datei bezieht. Wenn Sie allerdings Zeilen aus Ihrer gerade im Edit befindlichen Datei mit MOVE entfernt haben (z.B. mit CUT oder CREATE), können Sie diese wieder zurückholen. Die Zielinhalte in den anderen Dateien bleiben aber auch dann erhalten, wenn Sie verschobene Daten wieder zurückholen. Wird durch Handeingabe oder durch ein Edit Makro der Befehl SAVE abgesetzt, dann werden alle UNDO Informationen gelöscht. Somit kann man keine Änderungen zurücknehmen, die vor der Ausfuhrung von SAVE lagen.
8.7
FIND und CHANGE
Die Befehle FIND und CHANGE unterscheiden sich nur dadurch, dass beim CHANGE hinter dem Suchtext noch der Ersetzungstext angegeben wird. Deshalb können wir diese beiden Primary Commands gemeinsam besprechen.
8.7.1
Eingabe der Suchoperanden
Die Struktur der Operanden für die folgenden Befehle ist nahezu gleich und kann deshalb vorab allgemein besprochen werden. Es sind dies die Befehle: FIND, CHANGE, EXCLUDE mit ihren Abkürzungen F, C, X Die Befehlsstruktur sieht so aus: string
[range]
[NEXT ] [ALL ] [FIRST] [LAST ] [PREV ]
[CHARS ] [PREFIX] [SUFFIX] [WORD ]
[X ] [NX]
[col-1]
[col-2]]
156
8 Der ISPF Editor
string Bei einem Change Befehl besteht STRING aus zwei Texten, nämlich dem Suchtext und dem Ersetzungstext. Bei allen anderen Befehlen, für die diese Struktur gilt, besteht STRING nur aus einem Text.
[ränge] Wenn dieser Operand angegeben ist, mtiss er aus einem Paar von Line Labels bestehen (.a, .b). Der Befehl wirkt dann nur innerhalb der durch die Range angegebenen Zeilen. Die Reihenfolge der Labels ist beliebig. Die Operation läuft immer von der Zeile mit der kleineren Zeilennummer bis zur Zeile mir der höheren Zeilennummer, die durch die Labels definiert sind.
[NEXT]
Default
Gibt die Laufrichtung nach unten an. Bei wiederholten Ausführungen durch RFIND bzw. RCHANGE erfolgt mit einem Befehl immer nur eine Ausfuhrung.
[ALL] Gibt an, dass der gesamte Datenbestand durch den Befehl bearbeitet werden soll. Also auch die EXCLUDED Lines.
[FIRST] Gibt an, dass nur die Zeile mit dem ersten Auftreten des Suchtextes durch den Befehl bearbeitet werden soll.
[LAST] Gibt an, dass nur die Zeile mit dem letzten Auftreten des Suchtextes durch den Befehl bearbeitet werden soll.
[PREV] Gibt die Laufrichtung nach oben an. Bei wiederholten Ausfuhrungen durch RFIND bzw. RCHANGE erfolgt mit einem Befehl immer nur eine Ausfuhrung.
[CHARS]
Default
Alle Zeichen des Suchtextes werden gefunden.
[PREFIX] Es werden nur solche Texte gefunden, in denen der Suchtext in einem Wort zu Beginn vorkommt.
[SUFFIX] Es werden nur solche Texte gefunden, in denen der Suchtext in einem Wort am Ende vorkommt.
[WORD] Es werden nur solche Texte gefunden, in denen der Suchtext als komplettes Wort vorkommt. [X]
Es wird nur in excluded Lines gesucht.
[NX]
Es wird nur in not excluded Lines gesucht.
157
8.7 FIND und CHANGE
[col-1] [col-2] Es wird nur innerhalb der angegebenen Spalten gesucht. Wenn nur COL-1 angegeben ist, werden nur solche Zeilen gefunden, in denen der Suchtext genau in der Spalte vorkommt. Wenn COL-2 größer ist als die LRECL der Datei, wird COL-2 automatisch auf LRECL eingesetzt. Definition einfacher Suchtexte Bei einem einfachen Text genügt es, diesen sowohl im Suchtext als auch im Ersetzungstext anzugeben. Beispiel: c h u g o w i l l i
all
In der gesamten Datei wird hugo durch willi ersetzt, wobei willi immer in Kleinbuchstaben eingesetzt wird, und zwar auch dann, wenn HUGO oder Hugo gefunden wurde. Texte, die Blanks oder Sonderzeichen enthalten, sollte man immer in Hochkommata angeben. Dabei kann man jeweils paarweise sowohl das Zeichen • als auch das Zeichen " benutzen. Dies eröffnet die Möglichkeit, diese Zeichen auch zu ersetzen, indem man das jeweils andere Zeichen als Begrenzungszeichen nutzt. Beispiel: c " ' C A F O P E N ' "
'"CAFOPEN"'
all
In der gesamten Datei wird 'CAFOPEN 1 durch "CAFOPEN" ersetzt. Definition spezieller Suchtexte Wie Sie bei den folgenden Ausfuhrungen sehen werden, kann man die Suchtexte so ausgeklügelt aufbauen, dass wirklich kein Wunsch unerfüllt bleiben muss. Diese speziellen Definitionen teilen sich in insgesamt fünf Kategorien auf. Ich habe hier die original englischen Begriffe verwendet, da sie sehr aussagefahig sind: 1. Delimited Strings Ein Delimited String beginnt und endet jeweils mit Hochkommata (') oder Gänsefußchen ("). Es gibt einige Spezialfälle, in denen als Suchtext ein Delimited String benutzt werden muss. Nutzen Sie im Zweifelsfall „Delimited Strings", dann sind Sie immer auf der sicheren Seite. In den folgenden Fällen müssen Sie Delimited Strings benutzen: •
Wenn der Suchtext folgende Zeichen enthält: Blanks, Kommata, Hochkommata oder Gänsefüßchen. Wenn der Suchtext als Schlüsselwortparameter oder als Spaltenangabe interpretiert werden kann. Wenn der Suchtext ein Sternzeichen (*) ist.
• •
Beispiele :
=> f i n d " d o i t " => f i n d '*' => f i n d ' a l l ' first
Suchtext enthält ein Blank. Suche nach einem Sternzeichen. Suche das erste Auftreten des Textes "all".
158
8 Der ISPF Editor
===> f i n d a l l ' f i r s t ' ===> f i n d " W i l l i e ' s " ===> f i n d 1 T e i l "A" '
Suche alle Zeilen, die den Text "first" enthalten. Suche einen Text, der ein Hochkomma enthält. Suche einen Text, der Gänsefußchen enthält.
2. Hex strings Zum Suchen von Hexadezimalzeichen benutzt man Hex Strings. Ein Hex String ist eine durch Hochkommata eingeschlossene Zeichenfolge, die vorne oder hinten ein X enthält. Die Zeichenfolge eines Hex Strings muss aus einer geraden Anzahl Zeichen bestehen und darf nur die Zeichen 0 - 9 und A - F enthalten. Beispiele ===> f i n d x 1 00 ===>f x " f l f 2 "
1
oder oder
===> f ' f f f f ' x ===> f i n d " a l a 4 " x
3. Picture strings Ein „Picture String" wird benutzt, um nach einem bestimmten Zeichentyp zu suchen und nicht nach einem bestimmten Zeichen. Ein „Picture String" ist eine durch Hochkommata eingeschlossene Zeichenfolge, die vorne oder hinten ein P enthält. Der „Picture String" kann Blanks und andere Zeichen enthalten, die dann für sich selbst stehen, sowie einen oder mehrere Picture Spezialzeichen, welche die folgende Tabelle zeigt: String P' = ' P'V P' . '
Bedeutung Irgendein Zeichen. Jedes Zeichen außer Blank. Nicht darstellbare Sonderzeichen. Numerische Zeichen. Nichtnumerische Zeichen. Jedes Alphazeichen. Kleinbuchstaben Großbuchstaben Spezialzeichen
P'#'
p._. P'@' P'ii C S R ****************************** 11 D e c 2001 13:49:43 MVS REXX & q ii 6 k u « q aOOaiOadaOO i d|Ci0a6a
Man kann „Picture Strings" auch, in eingeschränkter Form, im Ersetzungstext eines Change Befehls einsetzen. Dabei müssen folgende Regeln eingehalten werden: Regeln Der Ersetzungstext muss genau so lang sein wie der Suchtext. Es können nur die Zeichen =, verwendet werden. Beispiel Der Befehl c a l l p 1 < ' p 1 > 1 setzt alle Kleinbuchstaben einer Datei in Großbuchstaben um. Das geht mit diesem Befehl auf jeden Fall schneller als mit dem CC Block Line Command in der ersten und letzten Zeile. 4. Text strings Ein „Text String" ist eine durch Hochkommata eingeschlossene Zeichenfolge, die vorne oder hinten ein T enthält. Beim Suchen werden sowohl die Zeichen des Suchstrings als auch die Vergleichszeichen in den Datenzeilen zuerst in Großbuchstaben versetzt und danach wird der Vergleich durchgeführt.
160
8 Der ISPF Editor
5. Character strings „Character Strings" dienen dazu, Suchtexte so zu definieren, dass exakt nach dem eingegebenen Text unter Berücksichtigung der Groß- Kleinschreibung gesucht wird. Beispiel Wenn der Befehl c h a n g e c ' B a r 1 K n e i p e auf den Text „Der Mann in der Bar wollte bar bezahlen." angewendet wird, dann wird nur das Hauptwort „Bar" in „Kneipe" umgesetzt, was in diesem Fall gewünscht ist.
8.8
EXCLUDE
Eine der besten Einrichtungen des Editors ist die Möglichkeit, ausgewählte Zeilen von der Anzeige auszuschließen oder aber nur bestimmte Zeilen anzuzeigen. Das Gute daran ist, dass man verschiedene Befehle, und hier sei vor allem der CHANGE Befehl genannt, sowohl auf die EXCLUDED LINES als auch auf die NOT EXCLUDED LINES „ansetzen" kann. Dabei müssen die Zeilen, die ausgeschlossen sind, nicht in einem zusammenhängenden Bereich hintereinander liegen. Vielmehr kann man beliebige Zeilengruppen oder einzelne Zeilen aus der Anzeige ausschließen und auch wieder sukzessive in die Anzeige einfügen. Der Befehl EXCLUDE kann mit X abgekürzt werden. Den EXCLUDE Befehl gibt es als Primary- und als Line Command. Wir wollen uns einige Beispiele ansehen: Ich habe eine Edit Sitzung mit einem JCL Member begonnen und alle Zeilen mit dem Primary Command x a l l EXCLUDED. Danach ergibt sich die folgende Anzeige im Edit: EDIT SMQP.JCL(BNDUMSPP) - 01.03 All lines excluded Command ===> Scroll ===> CSR ****** ***************************** Top of Data ****************************** - - - - - - - - - - - - - - - - - 121 Lin*(s) not Displayed ****** **************************** Bottom of Data ****************************
Jetzt möchte ich wissen, wie viele Steps der Job hat und welche Programme aufgerufen werden. Um dies zu erreichen, mache ich alle Zeilen sichtbar, die den Suchstring PGM= enthalDazu gebe ich f pgm= all ein. Dadurch erhalte ich jetzt folgende Anzeige:
161
8.8 EXCLUDE
EDIT SMQP. JCL(BNDUMSPP) - 01.03 2 CHARS 'PGM=' Command = > Scroll ===> CSR ****** ***************************** ip0p 0 f Data ****************************** - - - - - - - - - - - - - - - - - - - 1 4 Line(s) not Displayed 000015 //IEBCOPY EXEC PGM=IEBCOPY,REGION=20M,PARM='COPY,LIST=NO' L3- - - - - - - - - - - - - - - - - - 8 Line(s) not Displayed 000024 //PRODUMS EXEC PGM=IKJEFT01, REGION=20M,DYNAMNBR=99 - - - - - - - - - - - - - - - - - - - 4 8 Line(s) not Displayed ****** **************************** Bottom of Data ****************************
Wenn man eine solche Anzeige mit EXCLUDED Bereichen vor sich hat, entsteht oft der Wunsch, einige der EXCLUDED Lines, die entweder unmittelbar vor oder unmittelbar nach einer sichtbaren Zeile liegen, wieder sichtbar zu machen. Dazu gibt es die Zeilenbefehle: Ln Fn
Macht nZeilen VC)Reiner sichtbaren Zeile zusätzlich sichtbar. Macht n Zeilen NACH einer sichtbaren Zeile zusätzlich sichtbar.
Diese Zeilenbefehle müssen in die jeweils vor oder nach der sichtbaren Zeile liegenden not Displayed Zeilen eingegeben werden. Sie beziehen sich immer auf die not Displayed Zeilen. Deshalb ist es richtig zu sagen, dass man mit l 5 die letzten 5 unsichtbaren Zeilen einer Gruppe wieder sichtbar machen will. Und mit dem Befehl F5 ist es umgekehrt. Ich will jetzt die drei Zeilen, die unmittelbar vor der Zeile mit der Nummer 24 liegen, sichtbar machen. Dazu gebe ich in der not Displayed Zeile vor der Zeile 24 L3 ein und drücke ENTER. Danach erhalte ich folgende Anzeige: EDIT SMQP.JCL(BNDUMSPP) - 01.03 Command ===>
Columns 00001 00072 Scroll ===> CSR
****** ***************************** »p0p 0f D a ta ******************************
- - - - - - - - - - - - - - - - - - - 1 4 Line(s) not Displayed 000015 //IEBCOPY EXEC PGM=IEBCOPY,REGION=20M,PARM='COPY,LIST=NO' ~ - - - - - - - - - - - - - - 5 Line(s) not Displayed
000021 //********************************************************************* 000022 000023 000024 - - ******
//* ERZEUGUNG DER NEUEN MEMBERS DURCHFUEHREN //********************************************************************* //PRODUMS EXEC PGM=IKJEFT01 ,REGION=20M,DYNAMNBR=99 - - - - - - - - - - - - - - - - 4 8 Line(s) not Displayed **************************** Bottom of Data ****************************
Tipp Wenn Sie alle EXCLUDED Lines zwischen zwei sichtbaren Zeilen zur Anzeige bringen wollen, schauen Sie zuerst nach, wie viele Zeilen EXCLUDED sind und geben dann einen der beiden Befehle mit einer Zahl ein, die gleich oder größer der Anzahl der EXCLUDED Lines ist. Damit schließen Sie die Lücke in der Anzeige vollständig. Merksätze zu EXCLUDED Zeilen •
Wenn Sie alle Zeilen wieder sichtbar machen wollen, dann geben Sie das Primary Command RES oder RESET ein und drücken ENTER.
162 •
8 Der ISPF Editor
Wenn Sie alle EXCLUDED Lines zwischen zwei sichtbaren Zeile löschen wollen, dann brauchen Sie nur in der not Displayed Zeile ein D einzugeben und ENTER zu drücken. Aber Vorsicht, das kann auch schon mal ins Auge gehen, indem Sie mit dieser Methode viel mehr löschen, als Sie wollten.
8.9
SHIFT und OVERLAY
Sehr oft kommt es vor, dass man mehrere oder sogar sehr viele Dateien oder Members umbenennen muss. Man kann dies natürlich auch von Hand erledigen. So ein Vorgehen ist aber mühsam und fehleranfallig. Schon wenn es mehr als ein oder zwei Namen sind, die geändert werden müssen, lohnt es sich, eine Prozedur zu bauen und diese dann laufen zu lassen. Eine Prozedur für eine RENAME Aktion bietet folgende Vorteile: •
• •
Man ist vor Schreibfehlern relativ sicher, da die neuen Namen mithilfe eines CHANGE Befehls in der Prozedur erzeugt wurden. Die Richtigkeit der neuen Namen kann VOR dem Ablauf der Prozedur kontrolliert werden. Denn stellen Sie sich vor, Sie haben bei einem Rename von Hand ein Zeichen falsch eingegeben und ENTER gedrückt ohne den Fehler zu bemerken. Dies kann dazu fuhren, dass Sie diese umbenannte Datei nie mehr wieder finden. Die Prozedur steht auch nach dem Ablauf noch zur Verfügung. Das heißt, wenn etwas schief gelaufen ist, kann man die Ursache noch erkennen und den Fehler beheben. Wenn es sich um eine große Anzahl von Namen handelt, bleibt nur der Weg über eine Prozedur.
Ich möchte Ihnen an zwei Beispielen aus der Praxis zeigen, wie elegant man mithilfe des Editors schnell eine Prozedur zum RENAME von Dateien erzeugen kann.
8.9.1
Beispiel 1 für Overlay
Im Zuge einer Reorganisation eines Bestandes von Dateien sollen die Dateinamen dahingehend geändert werden, dass hinter dem ersten Qualifier ein weiterer Qualifier eingefügt werden soll. Nehmen wir an, es sollen alle Dateien mit den Qualifiers TEST.LOGON.* in TEST.HUGO.LOGON.* umbenannt werden. Die Dateinamen der umzubenennenden Dateien erhalten wir, indem wir im Menü 3.4 eine geeignete Maske für die Anzeige der betroffenen Dateien eingeben. Damit erhalten wir die folgende Anzeige:
8.9 S H I F T u n d O V E R L A Y
163
Row 1 of 16 Scroll ===> CSR
DSLIST - Data Sets Matching TEST.LOGON Command ===> Message
Command - Enter "/" to select action TEST.LOGON.ASM TEST. LOGON. ASM. ASM TEST. LOGON. CEXEC TEST.LOGON.CEXEC.CEXEC ***************************** End of Data Set list
Volume D1D156 DID120 P0XYZ1 D1D139
* * * * * * * * * * * * * * * * * * * * * * * * * * * *
D i e D a t e i n a m e n b r i n g e n w i r j e t z t m i t h i l f e d e r M a u s in d i e W i n d o w s Z w i s c h e n a b l a g e . D a n a c h r u f e n w i r in u n s e r e r D a t e i f ü r a u s f u h r b a r e R E X X P r o z e d u r e n d a s v o r b e r e i t e t e M e m ber zur D u r c h f u h r u n g v o n R E N A M E Aktionen im Editor auf: EDIT TE ST. LANZ. REXX (RENAME) - 01.09 Columns 00001 00072 Command ===> Scroll ===> CSR ****** ***************************** Top of Data ****************************** 000001 /* DOC: REXX RENAME ************************************************/ 000002 /* DOC: Durchfuehren von Dataset RENAME */ 000003 /* (c) LANZ am: 7 May 2002 */ 000004 /*********************************************************************/ 000005 trace i 000006 "PROFILE NOPREFIX" 000007 "RENAME ****** **************************** Bottom of Data ****************************
D a n a c h R E P E A T E N w i r die Zeile 0 0 0 0 0 7 mindestens so oft, w i e wir D a t e i n a m e n zu bearbeiten haben. Jetzt setzen wir durch Einfügen aus der W i n d o w s Zwischenablage die D S N mit einem Blank Abstand rechts neben den ersten R E N A M E und sehen dann folgendes Bild: EDIT TEST.LANZ.REXX(RENAME) - 01.09 Columns 00001 00072 Command ===> Scroll ===> CSR ****** ***************************** Top of Data ****************************** xxOOOl /* DOC: REXX RENAME ************************************************/ 000002 /* DOC: Durchfuehren von Dataset RENAME */ 000003 /* (c) LANZ am: 7 May 2002 */ 000004 /*********************************************************************/ 000005 trace i xx0006 "PROFILE NOPREFIX" 000007 "RENAME TEST . LOGON . ASM 000008 "RENAME TEST.LOGON.ASM.ASM 000009 "RENAME TEST.LOGON.CEXEC 000010 "RENAME TEST.LOGON.CEXEC.CEXEC ddOOll "RENAME 000012 "RENAME §¡§0013 "RENAME ****** **************************** Bottom of Data ****************************
D a n a c h löschen w i r die nicht benötigten R E N A M E Zeilen u n d E X C L U D E N alle nicht R E N A M E Zeilen.
164
8 Der ISPF Editor
Im nächsten Schritt holen wir dann die Dateinamen nochmals aus der Zwischenablage und setzen sie so weit rechts neben die bereits vorhandenen Namen, dass beim längsten Namen mindestens ein BLANK Zwischenraum bleibt. Hinweis
I
Damit der Editor beim anschließenden ENTER die Blanks vor den zweiten Namen nicht nach links aufrückt, muss vorher unbedingt NULLS OFF im Profile gesetzt werden.
Wir erhalten dadurch folgende Bildschirmausgabe: EDIT TEST.LANZ.REXX(RENAME) - 01.09 Columns 00001 00072 Command ===> Scroll ===> CSR ****** ***************************** Top of Data ****************************** - - - - - - - - - - - - - - - - - - - 6 Line(s) not Displayed bnds07 "RENAME TEST . LOGON. ASM TEST. LOGON .ASM 000008 "RENAME TEST . LOGON .ASM. ASM TEST. LOGON. ASM. ASM 000009 "RENAME TEST.LOGON.CEXEC TEST.LOGON.CEXEC 000010 "RENAME TEST.LOGON.CEXEC.CEXEC TEST.LOGON.CEXEC.CEXEC ****** **************************** Bottom of Data ****************************
Nun müssen wir dafür sorgen, dass in der zweiten Namensspalte die neuen Namen auftauchen. Dazu geben wir in der Zeile 000007 das Line Command BNDS ein. Danach erscheint die BNDS Line als Datenzeile, wobei die erste Spalte ein ' -Zeichen enthält. Dieses --Zeichen verschieben wir soweit nach rechts, bis es genau in der Spalte steht, in der die zweite Gruppe der DSN beginnt. Jetzt können wir in der rechten Gruppe der DSN in den RENAME Anweisungen die neuen Namen erzeugen, indem wir in der Kommandozeile folgendes eingeben: c TEST.logon
TEST.hugo.logon
nx
all
Nachdem wir ENTER gedrückt haben, erhalten wir folgendes Bild: EDIT TEST.LANZ.REXX(RENAME) - 01.09 CHARS 'LANZ.LOGON' chang Command ===> Scroll ===> CSR ****** ***************************** Top of Data ****************************** - - - - - - - - - - - - - - - - - - - 6 Line(s) not Displayed =BNDS> < =CHG> "RENAME TEST . LOGON. ASM TEST. hugo. logon. ASM =CHG> "RENAME TEST. LOGON. ASM. ASM TEST.hugo. logon. ASM. ASM ==CHG> "RENAME TEST.LOGON.CEXEC TEST.hugo.logon.CEXEC ==CHG> "RENAME TEST.LOGON.CEXEC.CEXEC TEST.hugo.logon.CEXEC.CEXEC ****** **************************** Bottom of Data ****************************
In den mit ==CHG> markierten Zeilen kann man jetzt schön erkennen, welche Zeilen durch den Change geändert wurden. Bei der Ausfuhrung der Prozedur können die DSN ruhig in Kleinbuchstaben stehen bleiben. TSO akzeptiert das bei der Ausführung des RENAME Befehls.
165
8.9 SHIFT und OVERLAY
Da die Prozedur als REXX Prozedur ausgeführt wird und die RENAME Anweisungen TSO Befehle sind, müssen wir jetzt noch dafür sorgen, dass jede RENAME Anweisung mit einem " abgeschlossen wird. Dazu gehen wir wie folgt vor: 1. Wir geben in die Zeile, in der BNDS steht, ein i (für insert) ein und drücken ENTER. 2. Dann positionieren wir den Cursor in der eingefügten Zeile soweit rechts, bis er hinter dem längsten Namen der RENAME Anweisungen steht und geben dort ein Gänsefüßchen (|) ein. 3. In der gleichen Zeile gehen wir an den Anfang und geben dort ein m (für move) ein. 4. Danach setzen wir das Block Command oo vor die erste und die letzte Zeile der RENAME Anweisungen. Unser Bildschirm sieht jetzt so aus: EDIT TEST.LANZ.REXX(RENAME) - 01.09 Command ===> ****** ***************************** Top of D a t a - - - - - - - - - - - - - - - - - =BNDS>
CSR ****************************** - 6 Line(s) n o t Displayed
"RENAME TEST. LOGON. ASM. A S M TEST. hugo . logon. ASM. A S M ==CHG> "RENAME TEST.LOGON.CEXEC TEST.hugo.logon.CEXEC OOCHG> "RENAME TEST . LOGON . CEXEC . CEXEC TEST . hugo . logon . CEXEC . CEXEC ****** **************************** B o t t o m of D a t a ****************************
Zugegeben: Das wäre mit dem Change Command c a l l ' ' ' " ' 60 n x schneller gegangen. Aber ich wollte Ihnen hier die Technik des OVERLAY im Edit vorführen. Wir schließen nun die Erstellung unserer Rename Prozedur ab, indem wir zunächst einmal ENTER drücken. Dadurch wird der OVERLAY ausgeführt und unsere RENAME Befehle sind fertig erstellt. Wenn wir jetzt noch in der Command Line RES eingeben und ENTER drücken, erhalten wir dann folgendes Bild: EDIT TEST. LANZ. REXX (RENAME) - 01.09 Columns 00001 00072 Command ===> Scroll ===> CSR ****** ***************************** Top of D a t a ****************************** 000001 /* DOC: REXX RENAME ************************************************/ 000002 /* DOC: Durchfuehren v o n D a t a s e t RENAME */ 000003 /* (c) LANZ am: 7 M a y 2002 */ 000004 /*********************************************************************/ 000005 trace ?i 000006 "PROFILE NOPREFIX" 000007 "RENAME TEST.LOGON.ASM TEST.hugo.logon.ASM 000008 "RENAME TEST.LOGON.ASM.ASM TEST.hugo.logon.ASM.ASM 000009 "RENAME TEST.LOGON.CEXEC TEST.hugo.logon.CEXEC 000010 "RENAME TEST.LOGON.CEXEC.CEXEC TEST.hugo.logon.CEXEC.CEXEC " ****** **************************** B o t t o m of D a t a ****************************
166
8 Der ISPF Editor
Diese Prozedur kann jetzt mithilfe des Edit Makros #TSOB aus den LANZ Utilities als Batch Job ausgeführt werden.
8.9.2
Beispiel 2 für Overlay
Unser erstes RENAME Beispiel eignet sich gut, wenn es sich nur um einige wenige Dateien handelt, die umbenannt werden sollen und deren Namen man über KOPIEREN und EINFÜGEN über die Windows Zwischenablage übertragen kann. Haben wir aber gar einige hundert Dateien umzubenennen, dann muss man bei der Erstellung der Prozedur etwas anders vorgeEs sind dies folgende Schritte: 1. Erzeugen einer Datei, die alle Namen, welche RENAMED werden sollen, enthält. 2. Die endgültigen RENAME Anweisungen durch OVERLAY erzeugen. Wir werden dieses Beispiel mit nur vier Namen durchfuhren. Es funktioniert aber auch bei 4000 oder mehr Namen. Schritt 1: Erstellen der Datei mit den Dateinamen. Um die Dateinamen, die wir beim Aufruf des Menüs 3.4 mit einer geeigneten Maske erhalten haben, in einer Datei verfügbar zu machen, nutzen wir den LIST Service des ISPF. Wir positionieren den Cursor in der obersten Zeile des ISPF Schirms innerhalb des Wortes Options und drücken ENTER. Daraufhin öffnet sich ein Pull Down Menu, in dem wir 4 S a v e L i s t wählen und ENTER drücken. Menu
Options
DSLIS ! 4 Comma Comma
X. 2. 3. 4.
View
Utilities
DSLIST Settings.. Refresh List Append to List... Save List
Compilers
Help
! CEXEC ! n
+ -
TEST LANZ.CEXEC.CEXEC TEST LOGON.CEXEC TEST LOGON.CEXEC.CEXEC ***************************** End of Data Set list
Row 1 of 4 Scroll = = > CSR Dsorg PO-E PO-E PO PO-E
Recfm VB VB VB VB
Lrecl
Blksz
255 255 255 255
27998 27998 27998 27998
* * * * * * * * * * * * * * * * * * * * * * * * * * * *
Abbildung 92 Beispiel für die Erzeugung einer Dateiliste aus einem DSLIST Panel
Oben rechts erscheint jetzt die Meldung: Data set list saved. Da wir aber wissen wollen, wohin die Data Set List geschrieben wurde, und wir auch diese Data Set List weiter bearbeiten wollen, geben wir in der Command Line den Befehl LIST ein. Dadurch erhalten wir folgende Bildschirmanzeige:
167
8.9 SHIFT und OVERLAY
Specify Disposition of List Data Set Command ===> List Data Set (LANZT LPRT.SPFO LIST) Disposition: Process Option . . . . 3 1 . Print data set and delete 2. Delete data set without printing 3. Keep existing data set and continue with new data set Batch SYSOUT class . . V Local printer ID or writer-name . . . Local SYSOUT class Press ENTER key to process the list data set. Enter END command to exit without processing the list data set.
Wir wählen die Process Option 3 aus und drücken ENTER. Dadurch wird die bisherige ISPF List Datei geschlossen und eine neue ISPF List Datei wird geöffnet. Am oberen rechten Rand des Bildes erscheint die Meldung LIST data set kept. Um nun auch noch den Namen der geschlossenen Datei, in der ja unsere Dateinamen stehen, zu bekommen, drücken wir die PF1 Taste und erhalten die unten stehende Anzeige. Menu
Options
View
Utilities
Compilers
Help
DSLIST - Data Sets Matching TEST.*.CEXEC Command Command - Enter "/" to select action TEST.LANZ.CEXEC TEST.LANZ.CEXEC.CEXEC TEST.LOGON.CEXEC TEST.LOGON.CEXEC.CEXEC ***************************** End of Data Set list
Dsorg PO-E PO-E PO PO-E
LIST data set kept Scroll ===> CSR Recfm Lrecl Blksz VB VB VB VB
255 255 255 255
27998 27998 27998 27998
* * * * * * * * * * * * * * * * * * * * * * * * * * * *
1 1 1 LANZT.LPRT.SPFO.LIST has been kept. 1 1
Hinweis Der Name der List Datei stand auch schon in dem ersten Bildschirm in der Zeile: List Data Set (LANZT.LPRT.SPFO.LIST) Disposition: In einem Rahmen am unteren Ende des Bildschirms erscheint nun der DSN, den wir benötigen. Diesen Namen kopieren wir in die Windows Zwischenablage. Damit haben wir jetzt eine Datei, in der alle DSNs stehen, die wir für unsere weitere Arbeit benötigen. Zunächst müssen wir jetzt schauen, ob die Datei aus dem LIST Data Set des ISPF für unsere weitere Arbeit geeignet ist. Falls Sie während Ihrer ISPF Sitzung bereits vor dieser Aktion etwas in den List Data Set geschrieben haben, sollten Sie vor Beginn der Aktion auf einen neuen List Data Set umschalten. Das ISPF nummeriert die List Data Sets automatisch durch.
168
8 Der ISPF Editor
Und so geht es dann weiter: Wir rufen das Menü 3.4 auf, fügen dort den Namen aus der Windows Zwischenablage ein und drücken ENTER. Die jetzt erscheinende Datei editieren wir. Dadurch erhalten wir dann folgendes Bild: EDIT LANZT. LPRT. SPFO. LIST Columns 00001 00072 Command ===> Scroll ===> CSR ****** ***************************** Top of Data ****************************** 000001 1 Listing of Data Sets Beginning with TEST.*.CEXEC 000002 000003 000004 000005 RECFM 000006 DATA SET NAME VOLUME ORG 000007 000008 TEST. LANZ . CEXEC P0XYZ1 PO-E VB PO-E VB 000009 TEST.LANZ.CEXEC.CEXEC D1D104 PO VB 000010 TEST. LOGON. CEXEC P0XYZ1 PO-E VB 000011 TEST.LOGON.CEXEC.CEXEC D1D139 **************************** Bottom of Data **************************** * * * * * *
Dieses Erscheinungsbild kommt daher, dass es sich hier um einen LIST Data Set handelt. Wir benötigen aus dieser Datei nur die Zeilen, die unsere DSN enthalten. Wie man sieht, enthalten die Zeilen mit den DSNs auch noch weitere Angaben, die wir entfernen müssen. Es stellen sich uns jetzt also zwei Aufgaben, die wir mit Hilfe des Editors lösen müssen. Dazu wollen wir uns der Editor Funktionen • EXCLUDE • FIND • DELETE • BLOCK SHIFT LEFT bedienen. Und das geht dann so: In der Command Line geben wir x all ein und drücken ENTER. Dadurch werden alle Zeilen EXCLUDED. EDIT LANZT . LPRT . SPFO . LIST All lines excluded Command ===> Scroll ===> CSR ****** ***************************** Top of Data ****************************** - - - - - - - - - - - - - - - - - - XI Line(s) not Displayed ****** **************************** Bottom of Data ****************************
Dann nutzen wir die Tatsache, dass alle von uns gewünschten Zeilen den Text „TEST." ab Spalte 3 enthalten und machen diese mit f test. all 3 und ENTER wieder sichtbar.
8.9 SHIFT und OVERLAY
LANZT.LPRT.SPF0.LIST EDIT Command ===> f test, all 3 * * * * * *
000008 000009 000010 000011 * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * *
TEST.LANZ.CEXEC TEST.LANZ.CEXEC.CEXEC TEST.LOGON.CEXEC TEST.LOGON.CEXEC.CEXEC * * * * * * * * * * * * * * * * * * * * * * * * * * * *
169
Columns 00001 00072 Scroll ===> CSR Top of Data ****************************** - - - - - 7 Line(s) not Displayed P0XYZ1 PO-E VB D1D104 PO-E VB P0XYZ1 PO VB D1D139 PO-E VB Bottom of Data ****************************
Jetzt löschen wir mit delete x all und ENTER alle Zeilen, die nicht sichtbar sind, denn diese benötigen wir nicht. EDIT LANZT.LPRT.SPFO.LIST Columns 00001 00072 Command ===> delete x all Scroll ===> CSR ****** ***************************** Top of Data ****************************** 000001 TEST.LANZ.CEXEC POXiZl PO-E VB 000002 TEST.LANZ.CEXEC.CEXEC D1D104 PO-E VB 000003 TEST.LOGON.CEXEC P0XYZ1 PO VB 000004 TEST.LOGON.CEXEC.CEXEC D1D139 PO-E VB ****** **************************** Bottom of Data ****************************
Zum Schluss müssen wir jetzt noch die Zeilen von dem überflüssigen Text rechts befreien. Das geht ganz leicht, indem wir diesen Text wie folgt ins Leere verschieben: Wir setzen den linken BNDS Pfeil genau auf die erste Spalte, wo der zu entfernende Text beginnt. EDIT LANZT.LPRT.SPF0.LIST Command ===> * * * * * *
=BNDS> 000001 000002 000003 000004 * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * *
TEST.LANZ.CEXEC TEST.LANZ.CEXEC.CEXEC TEST.LOGON.CEXEC TEST.LOGON.CEXEC.CEXEC * * * * * * * * * * * * * * * * * * * * * * * * * * * *
Columns 00001 00072 Scroll ===> CSR Top of Data ****************************** < P0XYZ1 PO-E VB D1D104 PO-E VB P0XYZ1 PO VB PO-E VB D1D139 Bottom of Data * * * * * * * * * * * * * * * * * * * * * * * * * * * *
Wir schieben dazu mit BLOCK SHIFT LEFT den überflüssigen Text um 100 Stellen nach links. EDIT LANZT.LPRT.SPFO.LIST Command ' " "> * * * * * *
=BNDS> ((100 000002 000003
((
* * * * * *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * *
TEST.LANZ.CEXEC TEST.LANZ.CEXEC.CEXEC TEST . LOGON. CEXEC TEST.LOGON.CEXEC.CEXEC * * * * * * * * * * * * * * * * * * * * * * * * * * * *
Columns 00001 00072 Scroll ===> CSR Top of Data ****************************** < P0XYZ1 PO-E VB D1D104 PO-E VB P0XYZ1 VB PO D1D139 PO-E VB Bottom of Data * * * * * * * * * * * * * * * * * * * * * * * * * * * *
Und erhalten so das gewünschte Ergebnis:
170
8 Der ISPF Editor
Columns 00001 00072 EDIT LANZT . LPRT . SPF0 . LIST Command ===> Scroll = > CSR ****** ***************************** Top of D a t a ****************************** =BNDS> % 000001 TEST.LANZ.CEXEC 000002 TEST.LANZ.CEXEC.CEXEC 000003 TEST.LOGON.CEXEC 000004 TEST.LOGON.CEXEC.CEXEC ****** **************************** Bottom of D a t a ****************************
Auch hier könnte man mit einem passenden Change Command die überflüssigen Zeichen entfernen: c a l l p ' = ' ' ' 30 120. Ich wollte hier aber die die Funktionalität von BNDS und SHIFT zeigen. Jetzt haben wir eine Datei geschaffen, die wir für die Erstellung einer Rename Prozedur bestens gebrauchen können. Tipp Man sollte den linken BNDS Pfeil unbedingt wieder auf die Spalte eins zurücksetzen, denn der Pfeil bleibt sonst für ALLE Dateien, die als Last Qualifier LIST haben, als linke Begrenzung für alle Edit Befehle so stehen. Das kann zu Irritationen beim nächsten Edit einer solchen Datei führen! Der ISPF Editor „kennt" nämlich nur solchen Text, der innerhalb der BNDS Grenzen steht. Das Bild sollte also vor dem Verlassen des Editors so aussehen: EDIT LANZT.LPRT.SPF0.LIST Columns 00001 00072 Command ===> Scroll ===> C S R ****** ***************************** Top of D a t a ****************************** =BNDS> < 000001 TEST.LANZ.CEXEC 000002 TEST.LANZ.CEXEC.CEXEC 000003 TEST.LOGON.CEXEC 000004 TEST.LOGON.CEXEC.CEXEC ****** **************************** B o t t o m of D a t a ****************************
8.9 SHIFT und OVERLAY
171
Schritt 2: Erstellen der Prozedur mit den RENAME Anweisungen Wir editieren nun unser Standard Member der Rename Befehle. Und kopieren die im Schritt 1 erzeugte Datei hinter die letzte Zeile. EDIT TEST.LANZ. REXX(RENAME) - 01.10 Columns 00001 00072 Command ===> copy LANZT . LPRT. SPF0 . LIST Scroll — = > CSR ****** ***************************** Top of Data ****************************** 000001 /* DOC: REXX RENAME ************************************************/ 000002 /* DOC: Durchfuehren von Dataset RENAME */ 000003 /* (c) LANZ am: 7 May 2002 */ 000004 /*********************************************************************/ 000005 trace i 000006 "PROFILE NOPREFIX" »00007 "RENAME ****** **************************** Bottom of Data ****************************
Da der List Data Set eine andere Dateicharakteristik hat als unsere Datei für REXX Prozeduren, müssen wir den folgenden Bildschirm mit ENTER bestätigen: EDIT - Confirm Copy Command ===> Data set attributes are inconsistent. Truncation may result in the right-most portions of some "from" records if copy is performed. "From" data set attributes: Data set name. : LANZT.LPRT.SPF0.LIST Record format. : FIXED Record Length. : 121 "Current" data set Data set name. Record format. Record Length.
attributes: : TEST.LANZ.REXX(RENAME) : FIXED : 80
Press ENTER key to allow copy with truncation. Enter END command to cancel copy. Abbildung 93 Confirm Panel beim Kopieren inkonsistenter Dateien
172
8 Der ISPF Editor
Danach erhalten wir dann folgendes Bild: EDIT TEST.LANZ.REXX(RENAME) - 01.10 Data set copied Command ===> Scroll ===> CSR ****** ***************************** Top of Data ****************************** 000001 /* DOC: REXX RENAME ************************************************/ 000002 /* DOC: Durchfuehren von Dataset RENAME */ 000003 /* (c) LANZ am: 7 May 2002 */ 000004 /*********************************************************************/ 000005 trace i 000006 "PROFILE NOPREFIX" 000007 "RENAME =BNDS> < ))8 TEST . LANZ . CEXEC 000009 TEST.LANZ.CEXEC.CEXEC 000010 TEST.LOGON.CEXEC )) TEST.LOGON.CEXEC.CEXEC ****** **************************** Bottom of Data ****************************
Unsere eingefügte Datei steht jetzt in den Zeilen 000008 bis 000011. Zunächst sollten wir die BNDS Zeile sichtbar machen, um zu sehen, ob der linke Pfeil auch aufspalte 1 steht. Ist dies nicht der Fall, bringen wir den Pfeil dort hin. Wir schieben nun diese Zeilen mit BLOCK SHIFT RIGHT soweit nach rechts, bis sie mit einem Blank Abstand hinter dem RENAME der Zeile 000007 stehen. EDIT TEST. LANZ. REXX (RENAME) - 01.10 Columns 00001 00072 Command ===> Scroll ===> CSR ****** ***************************** Top of Data ****************************** 000001 /* DOC: REXX RENAME ************************************************/ 000002 /* DOC: Durchfuehren von Dataset RENAME */ 000003 /* (c) LANZ am: 7 May 2002 */ 000004 /*********************************************************************/ 000005 trace i 000006 "PROFILE NOPREFIX" m "RENAME =BNDS> < OO TEST.LANZ.CEXEC 000009 TEST.LANZ.CEXEC.CEXEC 000010 TEST.LOGON.CEXEC OO TEST.LOGON.CEXEC.CEXEC ****** **************************** Bottom of Data ****************************
Jetzt moven wir die Zeile mit dem RENAME Statement mit block overlay über alle Zeilen mit den DSN.
8.9 SHIFT und OVERLAY
173
Unsere Prozedur sieht jetzt so aus: EDIT TEST.LANZ.REXX(RENAME) - 01.10 Columns 00001 00072 Command ===> x all Scroll ===> CSR ****** ***************************** Top of Data ****************************** 000001 /* DOC: REXX RENAME ************************************************/ 000002 /* DOC: Durchfuehren von Dataset RENAME */ 000003 /* (c) LANZ am: 7 May 2002 */ 000004 /*********************************************************************/ 000005 trace i 000006 "PROFILE NOPREFIX" 000007 "RENAME TEST.LANZ.CEXEC 000008 "RENAME TEST.LANZ.CEXEC.CEXEC 000009 "RENAME TEST.LOGON.CEXEC 000010 "RENAME TEST.LOGON.CEXEC.CEXEC ****** **************************** Bottom of Data ****************************
Jetzt excluden wir alle sichtbaren Zeilen mit dem Command x all. Danach holen wir den List Data Set nochmals mit copy hinter die excluded Lines herein. Das Copy Command mitsamt dem DSN steht ja noch im RETRIEVE Speicher des ISPF. Deshalb brauchen wir nur solange die PF 12 Taste zu drücken, bis das Copy Command erscheint. EDIT TEST.LANZ.REXX(RENAME) - 01.10 Columns 00001 00072 Command ===> copy LANZT.LPRT.SPF0.LIST Scroll = = > CSR ****** ***************************** Top of Data ****************************** » - - - - - - - - - - - - - - - - - - 1 0 Line(s) not Displayed ****** **************************** Bottom of Data ****************************
Damit erhalten wir folgendes Bild: EDIT TEST.LANZ.REXX(RENAME) - 01.10 Data set copied Command ===> c TEST. TEST.hugo. nx all Scroll ===> CSR ****** ***************************** Top of Data ****************************** - - - - - - - - - - - - - - - - - - - 1 0 Line(s) not Displayed 000011 TEST.LANZ.CEXEC 000012 TEST.LANZ.CEXEC.CEXEC 000013 TEST.LOGON.CEXEC 000014 TEST.LOGON.CEXEC.CEXEC ****** **************************** Bottom of Data ****************************
Jetzt fuhren wir das Change Command c TEST. TEST.hugo. nx all für alle not excluded lines aus. Und erhalten folgendes Ergebnis: EDIT TEST. LANZ. REXX (RENAME) - 01.10 Columns 00001 00072 Command = > Scroll --—> CSR ****** ***************************** Top of Data ****************************** - - - - - - - - - - - - - - - - - - - 1 0 Line(s) not Displayed =CHG> TEST.hugo. LANZ. CEXEC =CHG> TEST.hugo. LANZ. CEXEC. CEXEC =CHG> TEST.hugo. LOGON. CEXEC =CHG> TEST.hugo. LOGON. CEXEC. CEXEC ****** **************************** Bottom of Data ****************************
174
8 Der ISPF Editor
Zur Fertigstellung einer lauffähigen Rename Prozedur sind noch folgende Schritte zu tun: 1. Der Zeilenblock mit den umbenannten DSN muss hinter die Originalnamen verschoben werden. 2. Jede RENAME Zeile muss mit einem " enden. Mit RES in der Command Line werden alle Zeilen wieder sichtbar gemacht. Mit BLOCK SHIFT RIGHT werden die Zeilen mit den neuen DSN soweit nach rechts verschoben, dass hinter dem längsten Original Namen ein Blank bleibt. EDIT TEST.LANZ.REXX(RENAME) - 01.10 Columns 00001 00072 Command ===> Scroll ===> CSR ****** ***************************** Top of Data ****************************** 000001 /* DOC: REXX RENAME ************************************************/ 000002 /* DOC: Durchfuehren von Dataset RENAME */ 000003 /* (c) LANZ am: 7 May 2002 */ 000004 /*********************************************************************/ 000005 trace i 000006 "PROFILE NOPREFIX" 000007 "RENAME TEST.LANZ.CEXEC 000008 "RENAME TEST.LANZ.CEXEC.CEXEC 000009 "RENAME TEST.LOGON.CEXEC 000010 "RENAME TEST.LOGON.CEXEC.CEXEC ))31 TEST.hugo.LANZ.CEXEC =CHG> TEST. hugo. LANZ. CEXEC. CEXEC ==CHG> TEST.hugo.LOGON.CEXEC )) TEST.hugo.LOGON.CEXEC.CEXEC ****** **************************** Bottom of Data ****************************
Jetzt werden mit BLOCK OVERLAY MOVE die neuen Namen hinter die alten in den RENAME Zeilen gebracht. EDIT TEST.LANZ.REXX(RENAME) - 01.10 Columns 00001 00072 Command ===> Scroll ===> CSR ****** ***************************** xop of Data ****************************** 000001 /* DOC: REXX RENAME ************************************************/ 000002 /* DOC: Durchfuehren von Dataset RENAME */ 000003 /* (c) LANZ am: 7 May 2002 */ 000004 /*********************************************************************/ 000005 trace i 000006 "PROFILE NOPREFIX" OO "RENAME TEST . LANZ . CEXEC 000008 "RENAME TEST.LANZ.CEXEC.CEXEC 000009 "RENAME TEST.LOGON.CEXEC OO "RENAME TEST.LOGON.CEXEC.CEXEC mm TEST.hugo.LANZ.CEXEC ==CHG> TEST.hugo.LANZ.CEXEC.CEXEC ==CHG> TEST. hugo. LOGON. CEXEC mm TEST.hugo.LOGON.CEXEC.CEXEC ****** **************************** Bottom of Data ****************************
8.9 SHIFT und OVERLAY
175
Hinweis Bei dieser Aktion muss man unbedingt darauf achten, dass sowohl der oo als auch der mm Block exakt die gleiche Anzahl Zeilen (und auch die richtigen) enthält. Wenn man hier einen Fehler macht, kann das eine Menge Ärger nach sich ziehen! Damit erhalten wir dann folgenden Inhalt unserer RENAME Prozedur: Columns 00001 00072 TEST. LANZ. REXX (RENAME) - 01.10 EDIT Command ===> Scroll ===> CSR ****** ***************************** Top of Data ****************************** 000001 /* DOC: REXX RENAME ************************************************/ 000002 /* DOC: Durchfuehren von Dataset RENAME */ 000003 /* (c) LANZ am: 7 May 2002 */ 000004 /*********************************************************************/ 000005 trace i 000006 "PROFILE NOPREFIX" 000007 "RENAME TEST.LANZ.CEXEC TEST.hugo.LANZ.CEXEC 000008 "RENAME TEST.LANZ.CEXEC.CEXEC TEST.hugo.LANZ.CEXEC.CEXEC 000009 "RENAME TEST.LOGON.CEXEC TEST.hugo.LOGON.CEXEC 000010 "RENAME TEST.LOGON.CEXEC.CEXEC TEST.hugo.LOGON.CEXEC.CEXEC ****** **************************** Bottom of Data **************************** Jetzt müssen wir nur noch dafür sorgen, dass jede RENAME Zeile mit einem " abgeschlossen wird. Dies geschieht auf die gleiche Weise, wie unter Beispiel 1 beschrieben. Die fertige Prozedur sieht dann wie folgt aus: EDIT TEST. LANZ. REXX (RENAME) - 01.10 CHARS ' yyyyy ' changed Command ===> Scroll ===> CSR ****** ***************************** Top of Data ****************************** 000001 /* DOC: REXX RENAME ************************************************/ 000002 /* DOC: Durchfuehren von Dataset RENAME */ 000003 /* (c) LANZ am: 7 May 2002 */ 000004 /*********************************************************************/ 000005 • • • • • • M M H 000006 "RENAME TEST.LANZ.CEXEC TEST.hugo.LANZ.CEXEC 000007 "RENAME TEST.LANZ.CEXEC.CEXEC TEST.hugo.LANZ.CEXEC.CEXEC " 000008 "RENAME TEST.LOGON.CEXEC TEST.hugo.LOGON.CEXEC 000009 "RENAME TEST.LOGON.CEXEC.CEXEC TEST.hugo.LOGON.CEXEC.CEXEC" ****** **************************** Bottom of Data **************************** Anmerkungen zu diesem Beispiel •
•
Die Anweisung "PROFILE NOPREFIX" ist hier dringend notwendig, denn sonst würde das TSO die DSN mit dem User Prefix versehen (falls dieser gesetzt ist). Man kann dem TSO PREFIX Problem am Einfachsten aus dem Weg zu gehen, indem man die DSN in einfache Hochkommata setzt ('). Bei diesem Beispiel sind wir ja davon ausgegangen, dass wir eine große Anzahl von RENAME durchfuhren müssen. Deshalb sollte man diese Prozedur unbedingt in einem Batch Job ausfuhren. Sie können dazu das LANZ Utility #TSOB als Edit Makro benutzen. Ein weiterer Vorteil dieser Vorgehensweise ist, dass man eine Protokollliste der Job Ausfuhrung erhält, in der man den Ablauf der Prozedur in aller Ruhe kontrollieren kann.
176
8 Der ISPF Editor
8.10
CUT und PASTE
Es kommt während der Arbeit im ISPF Editor des Öfteren vor, dass man einzelne Zeilen oder ganze Teile aus einem Datenbestand in einen anderen übertragen möchte. Dabei kann man zweierlei Verfahren benutzen: • •
Kopieren und Einfügen über die Zwischenablage des PC Systems. Benutzung der Primary Commands CUT und PASTE des ISPF Editors.
Beide Methoden haben ihre Vor- und Nachteile. Deshalb wollen wir uns die Arbeitsweise dieser beiden Verfahren einmal näher ansehen:
8.10.1
Datentransport über die Zwischenablage des PC Systems
Vorteile • •
•
Es können Daten aus allen möglichen PC Komponenten ausgeschnitten und in unseren Edit Bildschirm eingefugt werden. Das Ausschneiden muss nicht zeilenweise erfolgen, sondern man kann beliebige Blöcke aus der Anzeige ausschneiden und diese auch als Block an einer beliebigen Cursor Position im Edit Bildschirm einfügen. Es können Daten aus den ISPF Systemen anderer LPARs, die über den gleichen PC erreichbar sind, übertragen werden.
Nachteile • •
Es können bei 3270-Sitzungen mit einem Übertragungsvorgang nur so viele Daten eingefügt werden, wie der 3270-Bildschirm aufnehmen kann. Bei der Übertragung können Zeichen, je nach den verwendeten Code Pages, falsch im Zielsystem ankommen.
Beispiel: Übertragen von Befehlen aus dem Internet Das folgende Beispiel zeigt in drei Schritten, wie man eine Programmstrecke aus dem Internet in eine Datei im ISPF Editor überträgt. 1. In der Internet Seite habe ich Editor übertragen will. 2. Ich kopiere diese Zeilen dann 3. Als nächstes eröffne ich mit Command i l 4 mindestens so benötige.
diejenigen Zeilen markiert, die ich in meine Datei im ISPF im Internet Browser in die PC Zwischenablage. dem ISPF Editor eine neue Datei und lege mit dem Line viele Leerzeilen an, wie ich für die einzufügenden Befehle
Diese beiden Bilder sehen Sie auf der nächsten Seite:
177
8.10 CUT und PASTE
LMxj
9901 Sate - Netscape Datei
Bearbeiten
4 Zurück f
Ansicht
§ 1 p c . m e t Internet
Communicator
#
.4
Vor
Lesezeichen
Gehe
.¿fr
^
Anfang
Neu laden
yìlfe
-öl.,
Suchen
rf
s Drucken
Netscape
Sicherheit
M
•2
-
:
Adresse:] 1 http: //www. rexxla. org/Newsletter/9901 safe. html
§ 1 Live-Cans: Saas
S ) Verkehr
3 ) www.slmotfach
~3 Pontresina
2p Panotamabfck,
g l A few 1
3 F i g u r e 11: P a r s e e x a m p l e s parse
source
system
invocation
origin
select when s y s t e m
=
'OS/2'
when s y s t e m
=
'TSO'
otherwise say
then
then
d
J
d
do
system
1
is
not
s u p p o r t e d by'
origin
zi •
Dokument: Ubermittelt
= # =
Abbildung
94 Kopieren
von REXX
Quellkode
m
aus einem
EDIT PROX.LANZ.REXX(INTTEST) Command = = > ****** ***************************** 000001 000002 000003 000004
PC
of
3
Fenster
01.00 xop
m
Data
Columns 00001 00072 S c r o l l = = = > CSR ******************************
/ * DOC: REXX I N T T E S T / * DOC: B e i s p i e l f ü r d i e Ü b e r t r a g u n g v o n T e x t e n a u s dem I n t e r n e t /* (c) LÄNZT am: 5 A p r 2 0 0 4 / * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
****************************
Bottom of
Data
* * * *
/ / / /
****************************
Danach positioniere ich den Cursor in meiner Edit Datei an der Stelle, wo die einzufugenden Zeilen platziert werden sollen. In diesem Fall in der Spalte 5 in der ersten Insert Line.
178
8 Der ISPF Editor
Jetzt muss ich nur noch die Zeilen aus der PC Zwischenablage hereinholen, indem ich in der Menü Zeile der 3270-Emulation Edit und Einfügen auswähle oder den entsprechenden Button der 3270-Emulation benutze. Daraufhin werden die Zeilen aus der PC Zwischenablage an der Stelle eingefügt, in welcher der Cursor steht, wobei genau die Positionen im 3270-Panel überschrieben werden, die der ausgeschnittene Bereich benötigt. Tipp Wenn die Schriftgröße im Internet File sehr klein ist, kann es leicht vorkommen, dass die einzufugenden Zeilen den vorbereiteten Bereich in der 3270-Bildschirmanzeige überschreiten. In diesem Fall wird nur ein Teil der Zeilen eingefügt und Sie müssen diese Operation eventuell mehrfach blockweise durchfuhren. Den Zustand nach dem Einfügen der Internet Zeilen zeigt das folgende Bild: EDIT PROX.LANZ.REXX(INTTEST) - 01.00 Columns 00001 00072 Command ===> Scroll ===> CSR * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Top of Data ****************************** 000001 /* DOC: REXX INTTEST */ */ 000002 /* DOC: Beispiel für die Übertragung von Texten aus dem Internet 000003 /* (c) LANZT am: 5 Apr 2004 */ 000004 / * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * / parse source system invocation origin filili 1 i 1 1 1 1 select i 1 1 1 1 1 when system = 'OS/2' then do 1 1 i i 1 1 1 i i i 1 1 HW|H||BHBBMBI i i 1 1 i i when system = 'TSO' then do 1 i t 1 1 1 1 1 • i i i i 1 1 1 1 1 i i 1 i 1 1 * * * * * *
* * * * * * * * * * * * * * *
end otherwise do say system 'is not supported by' origin exit end end * * * * * * * * * * * * * Bottom of Data ****************************
Wenn ich jetzt ENTER drücke, werden alle überflüssigen Insert Lines entfernt und ich erhalte das gewünschte Ergebnis, wie es das folgende Bild zeigt:
8.10 CUT und PASTE
179
EDIT PROX.LANZ.REXX(INTTEST) - 01.01 Command ===> * * * * * * ***************************** »pop 0 f Data
Columns 00001 00072 Scroll ===> CSR ******************************
000001 /* DOC: REXX INTTEST */ 000002 /* DOC: Beispiel für die Übertragung von Texten aus dem Internet */ am: 5 Apr 2004 */ 000003 /* (c) LANZT 000004 / * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * / 000005 parse source system invocation origin 000006 select 000007 when system = 'OS/2' then do 000008 end 000009 000010 when system = 'TSO' then do 000011 000012 end otherwise do 000013 000014 say system 'is not supported by' origin 000015 exit 000016 end 000017 end * * * * * * **************************** Bottom of Data ****************************
Auf diesem Wege können Sie beliebige Texte in Ihren Edit File übernehmen. Sie müssen den Vorgang nur oft genug wiederholen.
8.10.2
Datentransport über die Zwischenablage des ISPF
Vorteile •
•
Sie können aus einer editierten Datei große Datenmengen kopieren oder ausschneiden und in einer Empfangsdatei, in der gleichen oder einer anderen Edit Session, einmal und auch wiederholt einfügen. Sie können mehrere Datensammlungen aus verschiedenen Quellen zusammenstellen, editieren und dann an mehreren Stellen in verschiedenen Edit Sessions einfügen.
Nachteile • •
Daten können nur zeilenweise erstellt und eingefügt werden. Daten zwischen LPARs können nicht direkt ausgetauscht werden. Dies ginge nur mit einer CREATE Aktion in eine Datei auf einer Shared Disk, die in allen beteiligten LPARs bekannt ist.
Die Befehle CUT und PASTE Hier die Beschreibung der beiden Befehle mit ausführlichen Erläuterungen: CUT
[lptr-range] [DEFAULT I clipboardname] [REPLACE] [APPEND] [DISPLAY]
Kopiert oder verschiebt einen ausgewählten Block von Zeilen aus den editierten Daten in die ISPF Zwischenablage.
180
8 Der ISPF Editor
lptr-ränge Hier können ein paar Line Pointer Labels vom Format .a und .b angegeben werden, die natürlich vorher definiert sein müssen. In der Regel wird die Zeilenauswahl aber mit den Block Line Commands cc oder mm durchgeführt. Wenn weder eine Range angegeben wurde, noch eine Auswahl durch cc oder mm erfolgt ist, dann wird der ganze Edit File in die ISPF Zwischenablage gebracht. clipboardname Sie können bis zu neun eigene Clip Board Names vergeben. Zu diesen können Sie dann weitere Teile mittels der Option APPEND hinzufügen, sie editieren und einzeln mit PASTE hereinholen. RE PLACE Dies heißt, dass der vorhandene Default oder benannte Clip Board Content durch die jetzige CUT Operation überschrieben wird. DISPLAY Durch diese Option wird das Clipboard Manager Panel angezeigt. PASTE
[clipboardname] [AFTER label ] [BEFORE label ] [DELETE] [KEEP]
Kopiert oder verschiebt die zuvor mit CUT erstellten Daten in den Edit File.
clipboardname Name des Clipboard Files, der kopiert wird. Ist nichts angegeben, wird der DEFAULT Clipboard genommen. [AFTER label ] [BEFORE label ] Diese beiden Optionen geben an, ob die Daten vor oder nach einer Zeile mit einem vorher definierten Label kopiert werden. [DELETE] [KEEP] Diese Optionen bestimmen, ob die Daten in der ISPF Zwischenablage nach dem Kopieren gelöscht werden oder dort stehen bleiben. Die CUT und PASTE Standard Einstellungen mittels EDSET Die hier genannten Default Optionen können durch die entsprechenden Eintragungen im EDSET Panel überschrieben worden sein. Es gelten die Default Werte, die im EDSET Panel gesetzt wurden. Deshalb wollen wir uns dieses Panel hier nochmals anschauen:
8.10 CUT und PASTE
181
Edit and View Settings Command ===> More:
+
Settings for current and future Edit and View sessions: User session initial macro #IMACROA Maximum initial storage allowed for Edit and View . . 0 Target line for Find/Change/Exclude string 5 Enter "/" to select option Always position Find/Change/Exclude string to target line / Remove action bars in ISPF edit and view panels Force ISRE776 if RCHANGE passed arguments CUT default . . 1
1. Append 2. Replace
PASTE default . . 1
1. Delete 2. Keep
Settings for future sessions. Select Apply Setting Immediately for the setting to affect the current session as well. Enter "/" to select option / Confirm Cancel/Move/Replace Preserve VB record length Abbildung 95 Die CUT and PASTE Standardeinstellungen
/ /
Apply Setting Immediately Apply Setting Immediately
mittels EDSET
setzen
Beispiel für CUT und PASTE Aufgabe: Ich möchte einen Batch Job mit folgenden Steps erstellen: 1. Aufruf von IEBCOPY, um verschiedene PDS zu kopieren. 2. Aufruf von IKJEFT01, um die Prozedur HUGO aufzurufen. Ich weiß, dass ich bereits an anderen Stellen in meinen ISPF Dateien Beispiele für die benötigten Steps habe. Diese suche ich jetzt und lege die benötigten Statements in der Zwischenablage ab. Damit ich Ihnen die Arbeitsweise der ISPF Zwischenablage gut veranschaulichen kann, lege ich für jeden der benötigten Steps eine benannte Zwischenablagedatei an, die jeweils genau so heißt, wie die auszuführenden Programme. Um mit der Arbeit zu beginnen, lege ich eine Zwischenablagedatei mit dem Job Statement an, das ich aus einem Job in der SDSF Hold Queue hole: Dazu gehe ich in die Hold Queue des SDSF und gebe vor einem der angezeigten Jobs das Line Command SJ ein. Dieser Befehl zeigt mir jetzt den Job in der Form, wie er ursprünglich submitted wurde. Wie Sie an dem folgenden Bild sehen, bekomme ich aus diesem Job auch noch meinen Step für den Aufruf von IKJEFT01 geliefert. Diesen Umstand mache ich mir natürlich zunutze, indem ich in einer zweiten CUT Aktion auch diesen Step in die ISPF Zwischenablage unter dem Namen IKJEFT01 bringe. Um zunächst einmal das Job Statement in die Zwischenablage zu bekommen, nehme ich in der Anzeige jetzt folgende Eingaben vor: In die Command Line gebe ich CUT JOBCARD ein.
182
8 Der ISPF Editor
Dann gebe ich vor der ersten und der letzten Zeile, die ich benötige, jeweils CC ein. Bevor ich jetzt ENTER drücke sehe ich folgendes Bild: SDSF EDIT LANZTB (JOB05338) JCLEDIT Columns 00001 00072 Command ===> cut jobcard Scroll ===> CSR ****** ***************************** Top of Data ****************************** CC0001 //LANZTB JOB (09101999,00000000,46100000)#TSOB: COMPLOG',CLASS=A, 000002 // NOTIFY=LANZT,MSGLEVEL=(0,0),MSGCLASS=H, 000003 // COND=(0,LT) ,TIME=100,USER=SQMTP CC0004 /*JOBPARM S=LPRT 000005 //******************************************************************** 000006 //* TSO-BATCH AUS : LANZT. LOGON. CLIST (COMPLOG) 000007 //******************************************************************** 000008 //TSOBATCH EXEC PGM=IKJEFT01,REGION=80M,DYNAMNBR=99 000009 //STEPLIB DD DISP=SHR,DSN=PROX.LOGON.LOAD 000010 //SYSEXEC DD DISP=SHR,DSN=LANZT.LOGON.CLIST 000011 //SYSPRINT DD SYSOUT=* 000012 //SYSTSPRT DD SYSOUT=* 000013 //DUMP DD DUMMY 000014 //SYSUDUMP DD DUMMY 000015 //SYSOUT DD SYSOUT=* 000016 //SYSTSIN DD * 000017 PROFILE NOPREFIX 000018 EXECUTIL SEARCHDD(YES) 000019 %COMPLOG 000020 END ****** **************************** Bottom of Data ****************************
Wenn ich jetzt ENTER drücke, werden die Zeilen 1 bis 4 unter dem Namen JOBCARD in die ISPF Zwischenablage geschrieben. Um nun den Step IKJEFT01 zu bekommen, führe ich die gleiche Aktion mit den Zeilen 8 bis 20 durch. Nur der Name hinter dem CUT Befehl heißt jetzt IKJEFT01. Den IEBCOPY Step hole ich mir auf die gleiche Weise aus einem Member meiner JCL Datei. Zur Überprüfung meiner bisherigen CUTs rufe ich jetzt das „Clipboard manager" Panel auf, indem ich als Primary Command CUT DISPLAY eingebe und ENTER drücke. Damit erhalte ich folgende Anzeige: Clipboard manager B - Browse E - Edit Name DEFAULT IEBCOPY IKJEFT01 JOBCARD
C R
Clear Rename
0 - Toggle Read-only D - Delete
Lines User Comment 0 ISPF Default Clipboard 6 13 4
Abbildung 96 Clipboard Manager Panel
183
8.10 CUT und PASTE Wie Sie sehen, sind jetzt alle Bestände, die ich brauche, im Clipboard angekommen.
Um nun meinen gewünschten Job zu bekommen, beginne ich eine neue Edit Datei und hole mir die im Clipboard stehenden Zeilen nacheinander mit PASTE name herein. Wenn alles fertig ist, sieht meine Datei im Edit wie folgt aus: EDIT SMQP.JCL(TT) - 01.00 Columns 00001 00072 Command ===> Scroll ===> CSR ****** ***************************** Top of Data ****************************** 000001 //LANZTB JOB (09101999,00000000,46100000),'BEISPIEL',CLASS=A, NOTIFY—LANZT, MSGLEVEL= (0,0), MSGCLASS=H, 000002 / / COND=(0,LT),TIME=100,USER=SQMTP 000003 // 000004 /* JOBPARM S=LPRT 000005 //* BIS HIERHER GING DAS CLIPBOARD MEMBER JOBCARD 0 0 0 0 0 6 // IEBCOPY EXEC PGM=IEBCOPY, REGION=20M, PARM=' COPY, LIST=NO' DD DISP=SHR,DSN=PXX0 . DB2BIND . PROD . SQL < 000007 //SYSUT1 PROD EBENE DD DISP=(NEW,PASS),DSN=SSQLDAT, 0 0 0 0 0 8 //SYSUT2 UNIT=VIODA,SPACE=(CYL,(100,300,2000)), 000009 // DCB=(RECFM=FB,LRECL=80,BLKSIZE=27920,DSORG=PO) 000010 II 000011 IISYSPRINT DD SYSOUT=* 000012 //* BIS HIERHER GING DAS CLIPBOARD MEMBER IEBCOPY 000013 //TSOBATCH EXEC PGM=IKJEFT01,REGION=80M,DYNAMNBR=99 000014 //STEPLIB DD DISP=SHR,DSN=PROX.LOGON.LOAD 000015 //SYSEXEC DD DISP=SHR, DSN=LANZT . LOGON. CLIST 000016 //SYSPRINT DD SYSOUT=* 000017 //SYSTSPRT DD SYSOUT=* DD DUMMY 000018 //DUMP 000019 // SYSUDUMP DD DUMMY 0 0 0 0 2 0 //SYSOUT DD SYSOUT=* 000021 //SYSTSIN DD * 000022 PROFILE NOPREFIX EXECUTIL SEARCHDD(YES) 000023 %COMPLOG 000024 END 000025 0* 0* 0* 0* 2* *6 //* BIS HIERHER GING DAS CLIPBOARD MEMBER IKJEFT01 **************************** Bottom of Data ****************************
Zur Kennzeichnung der einzelnen Stücke aus dem Clipboard habe ich die grau unterlegten Zeilen von Hand eingefügt. Da ich beim Aufruf von PASTE jeweils keine Option KEEP gesetzt hatte, ist mein Clipboard jetzt leer, wie das folgende Bild zeigt: Clipboard manager B - Browse E - Edit Name DEFAULT IEBCOPY IKJEFT01 JOBCARD
c R
Clear Rename
O - Toggle Read-only D - Delete
Lines User Comment 0 ISPF Default Clipboard 0 0 0
Wie man sieht, sind die benannten Clipboard Namen noch vorhanden. Ich könnte diese für weitere Aktionen benutzen.
9
ISRDDN - Utility fur zugeordnete Dateien
In diesem Kapitel lernen Sie, wie man mithilfe des Programms ISRDDN die in ihrer TSO/ISPF Umgebung zugeordneten Dateien überprüfen und mit diesen online arbeiten kann. Dieses Programm ist relativ neu im Leistungsumfang des ISPF. Vorbemerkung Wie Sie bei der Beschreibung des TSO/ISPF Logon Verfahrens wohl bemerkt haben werden, spielen die Dateien, die dort zugeordnet werden, ein wichtige Rolle für Ihren TSO/ISPF User. Wenn Sie aber nun vor Ihrem hochgefahrenen ISPF System sitzen und nachschauen wollen, welche Zuordnungen bei Ihnen gerade aktiv sind, haben Sie zwei Möglichkeiten, diese Informationen zu bekommen: •
•
Mit dem TSO Befehl LISTALC (List Allocation). Dieser Befehl ist in der IBM Broschüre TSO/E Command Reference beschrieben. Er liefert, je nachdem, welche Parameter man benutzt, eine Liste der Allocated Data Sets. Falls Sie LISTALC einmal ausprobieren wollen, können Sie es wie folgt in jeder ISPF Command Line aufrufen: „ t s o l i s t a l c s t h". Mit dem Programm ISRDDN.
Mit dem Befehl LISTALC wollen wir uns hier nicht weiter beschäftigen, denn das Programm ISRDDN liefert weitaus bessere Informationen.
9.1
ISRDDN - Beschreibung und Aufruf
Das Programm ISRDDN ist in der Broschüre ISPF User's Guide Volume 1 im Abschnitt „Appendix G" beschrieben. Ich gebe Ihnen hier eine kurze Einfuhrung und auch Hinweise, zu welchen Zwecken Sie das Programm nutzen können. ISRDDN ist zwar ein TSO Programm und muss deshalb auch als TSO Programm aufgerufen werden, aber es kann nur unter der ISPF Oberfläche laufen, da es ISPF Dienste nutzt. Zum Aufruf geben Sie in irgendeinem ISPF Panel in der ISPF Command Line folgendes ein:
186
9 ISRDDN - Utility für zugeordnete Dateien
TSO ISRDDN oder nur DDLIST und drücken dann ENTER: Danach erscheint das folgende oder ein ähnliches Panel: Current Data Set Allocations Command ===> Blksz Lrecl RCFM Org Act 6160 80 FB PO > > ** 32760 U LIB > * * 32760 ü PO > > LIB > 27920 80 FB 80 FB PO > 8800 80 FB 8800 PO > > 27920 80 FB LIB > LIB > 27920 80 FB 80 FB PO > 8800 8800 80 FB PO > 80 FB LIB > 3120 > 80 FB PO > 8800 8800 80 FB PO > 27920 80 FB LIB > > LIB > 27920 80 FB 8800 80 FB PO > PO > 8800 80 FB Abbildung 97 Anzeige des Programms
Scroll ===> CSR DDname AVDATA ISPLLIB
Data Set Name SYS1.HELP
Actions
PROX. LANZ . LOAD PROX.LOGON.LOAD ISPMLIB PROX. LOGON. MSGS ISF.SISFMLIB ISP.SISPMENU ISPPLIB
ISPPROF ISPSLIB ISPTABL ISPTLIB
PROX. LANZ . PANEL PROX. LOGON. PANEL ISP.SISPPENU ISF.SISFPLIB LANZT.ISPF.PROFILE.LPRT ISP.SISPSLIB ISP.SISPSENU LANZT.USER.TABL.LPRT LANZT.USER.TABL.LPRT ISP.SISPTENU ISF.SISFTLIB
ISRDDN
Diese Anzeige teilt sich von links nach rechts in drei Abschnitte auf: 1. Die Spalten Blksz Lrecl RCFM Org zeigen die Dateicharakteristik der rechts stehenden Dateien. Durch Betätigen der Taste PF 11 kann man hier weitere Informationen zu den Dateien und deren Status bekommen. 2. Die Spalte Act dient zur Eingabe von einstelligen Line Commands, die in der Überschriftzeile rechts hinter Actions: aufgeführt sind. 3. Die Spalten DDname und Data Set Name enthalten die entsprechenden Angaben wie der Name sagt.
9.2
ISRDDN - Bedienung des Programms
Mit der PF1 Taste gelangt man in die sehr umfangreiche Hilfe Anwendung zum Programm ISRDDN. Für die Bedienung der Hilfe Panels im Programm ISRDDN beachten Sie bitte die Hinweise im Kapitel „Panels, POP UP Windows, HELP Panels" auf Seite 63. Ich möchte Ihnen hier die wichtigsten Anwendungsmöglichkeiten von ISRDDN, so wie ich sie in der Praxis meistens benötige, aufzeigen.
9.3 Suchen eines Members in den Online Dateien
187
Das Programm ISRDDN gibt Antworten auf folgende Fragen: •
Welche DSN sind unter welchen DD Namen gerade in meiner TSO Umgebung zugeordnet? In welchen DSNs aller zugeordneten Dateien ist ein bestimmtes Member enthalten? Welche ENQs existieren gerade? Ist eine bestimmte Datei mit ENQs belegt? Ist ein bestimmter Lademodul in der LPA, in der LINKLIST Kette oder aber gar nicht zu finden? Welche Dateien gehören zur LINKLIST Kette? Welche Dateien sind APF autorisiert?
• • • • • •
Die in der folgenden Tabelle aufgeführten Line Commands können vor einem DD Namen oder einem einzelnen DSN eingegeben werden: Befehl B E V M F C I 0
Ausführung von Browse der ersten 16 Dateien einer Kette oder einer einzelnen Datei. Edit der ersten 16 Dateien einer Kette oder einer einzelnen Datei. View der ersten 16 Dateien einer Kette oder einer einzelnen Datei. Anzeige einer erweiterten Member Liste der ersten 16 Dateien einer Kette oder einer einzelnen Datei. Absetzen des Befehls FREE auf den DD Namen. Compress eines PDS. Anzeigen der Dateicharakteristik. Anzeigen der TSO User sowie der Jobs, die diese Datei belegen.
Tabelle 19 Line Commands des Programms ISRDDN
Die folgenden Kapitel enthalten Beispiele für einige der wichtigsten Funktionen, die man mit dem Programm ISRDDN ausführen kann.
9.3
Suchen eines Members in den Online Dateien
Manchmal kommt es vor, dass man eine Prozedur online ausführt, die dann aber nicht das erwartete Ergebnis zeigt. Dies kann vielleicht daher rühren, dass man unbeabsichtigt eine alte Version dieser Prozedur „erwischt" hat, oder aber eine ganz andere, gleichnamige Prozedur. Ein solcher Fall lässt sich mit Hilfe von ISRDDN ganz leicht aufklären. Dazu gehen Sie folgendermaßen vor: •
Sie tragen in der Command Line irgendeines ISPF Panels den Befehl TSO ISRDDN ein und drücken ENTER.
188 •
9 ISRDDN - Utility für zugeordnete Dateien
Sie geben in der Command Line des ISRDDN Panels den Befehl MEMBER Name ein und drücken ENTER. Name ist der Name der gesuchten Prozedur. Sie können MEMBER auch mit M abkürzen.
Das Programm beginnt dann, den PDS nach dem Membernamen zu durchsuchen. Es werden alle zugeordneten PDS „durchlaufen". Nach Beendigung der Suche gibt es zwei Möglichkei• •
Das Member wurde nicht gefunden. Das Member wurde ein- oder mehrmals gefunden.
Wenn das gesuchte Member mindestens einmal gefunden wurde, dann erscheint im linken Teil des Panels neben jedem PDS, in dem das Member steht, der Membemame. Die vorher normalerweise dort stehenden Angaben werden ausgeblendet. Sie können jetzt in der Act Spalte jeder dieser Zeilen ein B für Browse eingeben, um sich die einzelnen Member anzuschauen. Wir wollen uns diesen Such Vorgang einmal ansehen, indem wir das Member HUGO suchen: Wir geben in dem gerade angezeigten ISPF Panel den Aufruf für ISRDDN ein. Menu
Options
View
Utilities
Compilers
Help
DSLIST - Data Sets Matching SMQP.SDWH Command ===> tso isrddn
Row 1 of 1 Scroll = = > CSR
Command - Enter "/" to select action
Message
SMQP.SDWH.PROTOKOL ***************************** End of Data Set list Abbildung 98 Aufruf des Programms
Volume D1D145
* * * * * * * * * * * * * * * * * * * * * * * * * * * *
ISRDDN
Danach erscheint das ISRDDN Panel. Dort geben wir dann unseren Suchbefehl für das Member HUGO ein. Row 1 of 130
Current Data Set Allocations Command ==—> member hugo Volume T1S004 T1S004 T1N004 T1S005 T1N015
Disposition Act DDname > ISPLLIB SHR,KEEP > SHR,KEEP > SHR,KEEP > > SHR,KEEP SHR,KEEP >
Scroll = = > CSR Data Set Name DBT1 DBT1 DBT1 DBT1 DBT1
Actions: B E V M F C I Q
DT1A.DSNEXIT DT1A. DSNLOAD DT1A. RUNLIB . LOAD PLATINUM. LOADLIB SDSQLOAD
Abbildung 99 Suchen nach einem Member mithilfe des Programms
ISRDDN
189
9.4 Freigeben einer Dateizuordnung Das Ergebnis sehen wir in der folgenden Bildschirmanzeige: Current Data Set Allocation Command = = > Message Member: HUGO
Member: HUGO
Member: HUGO
Act > > > > > > > > > b > >
Member was found Scroll ===> CSR
DDname Data Set Name Actions : B E V M F C I Q ISP08532 SMQP. USER. PANEL SMQP. PROD. PANEL SYSEXEC PROX.LANZ.CEXEC PROX.LOGON.CEXEC ISP.SISPEXEC SYS1.SBPXEXEC SYSPROC SYST1. TSO. USERPROC SYST0.TSO.USERPROC SYST1.TSO.REXXDEMO
Abbildung 100 Gefundene Members nach einem Suchvorgang mittels ISRDDN
Wir wollen uns nun das Member in der dritten Position von oben anschauen. Dazu positionieren wir den Cursor in der Act Spalte in der Zeile, in der das Member genannt ist, und geben dort b fur BROWSE ein und drücken ENTER. Mit dieser Eingabe bekommen wir das Member direkt im Browse angezeigt: Menu
Utilities
Compilers
Help
BROWSE SYST1.TSO.USERPROC(HUGO) - 01.00 Command ===>
*********************************
T o p 0f
Vol PLPRT1 Line 00000000 Col 001 080 Scroll ===> CSR
D a ta **********************************
/* rexx */ address ispexec 'SELECT PGM(BSSOOPRM) PARM(B92, PE92PRIM/B920NEXS)' ******************************** Bottom of Data ********************************
9.4
Freigeben einer Dateizuordnung
Manchmal kommt es vor, dass man in einer Prozedur online eine Datei zugeordnet hat, diese Zuordnung aber wegen eines Fehlers oder weil ein FREE Befehl vergessen wurde, nach der Ausfuhrung der Prozedur noch in Ihrem User vorhanden ist. Wenn man nun diese Datei in einem Batch Job verwenden will, bekommt man die Meldung, dass diese Datei nicht frei ist und der Job bleibt mit „WAITING FOR DATA SETS" stehen. Dieses Problem lässt sich mithilfe des Programms ISRDDN leicht lösen, indem wir diese Datei mithilfe von ISRDDN freigeben. Wir wollen uns einmal so einen Fall ansehen, indem wir im TSO online eine bereits existierende Datei mit DISP=OLD zuordnen, um sie dann in einem Batch Job als SYSPROC Datei zu benutzen.
190
9 ISRDDN - Utility für zugeordnete Dateien
Dazu geben wir im Menü 6 des ISPF folgende Anweisung ein und drücken ENTER: alloc
dd(input)
dsn('PROX.LANZ.REXX')
old
reuse
Durch diese Eingabe ist diese Datei fest an den User, der diese Eingabe gemacht hat, gebunden. Wenn nun ein Batch Job versucht, diese Datei zuzuordnen, wird die Ausfuhrung des Jobs angehalten und es erscheint im Job Protokoll folgende Meldung: IEF861I FOLLOWING RESERVED DATA SET NAMES UNAVAILABLE TO LANZTC IEF863I DSN = PROX. LANZ . REXX LANZTC IEF099I JOB LANZTC WAITING FOR DATA SETS
Wenn wir nicht genau wissen, wer diese Datei gerade im exklusiven Zugriff hält, können wir ISRDDN auch für die Klärung dieser Frage heranziehen. Dazu rufen wird IRSDDN auf und geben ENQ ein. In dem daraufhin erscheinenden Panel geben wir in der Zeile M i n o r n a m e p r e f i x den Namen des betreffenden DSN ein. Alle anderen Zeilen bleiben leer. Wenn wir dann ENTER drücken, erscheint folgende Anzeige am Bildschirm: System ENQ Status
Row X of 1 Scroll ===> CSR
Command ===> Scroll LEFT or RIGHT to see type or system name. Major name prefix . . . (SYSDSN, SPFEDIT, etc) Minor name prefix . . . PROX. LANZ. REXX Address id prefix . . . (Job name, User id, etc) System prefix (System name) Major Minor 1 1 1 PROX.LANZ.REXX 1 SYSDSN
Abbildung 101 ENQs mithilfe von ISRDDN
(dsn etc) Job Name 1 1 1 LANZT 1 1
ermitteln
Unter der Spalte J o b Name finden wir den Namen des Jobs bzw. Users, der diese Datei „festhält". Um diese Datei freizugeben rufen wir in unserem TSO User ISRDDN auf. In der Anzeige finden wir die Datei unter dem DD Namen INPUT zugeordnet: Current Data Set Allocations Command Volume T1N017 OSTOA9 D1D119 T1S004 T1S004
===>
Disposition Act > SHR,KEEP SHR,KEEP > > F OLD,KEEP > > SHR,KEEP > SHR,KEEP
Abbildung 102 Datei mithilfe von
DDname ADMGGMAP AVDATA INPUT ISPLLIB
Data Set Name DB21.DSQMAPE SYS1.HELP PROX.LANZ.REXX
Actions : B E V M F c I Q
DB21.DT1A.DSNEXIT DB21.DT1A.DSNLOAD
ISRDDNfreigeben
Row 1 of 114 Scroll = - => CSR
191
9.5 Warnung bei inkonsistenten Datei Strukturen
Wir geben jetzt in der Act Spalte vor dem DD Namen INPUT ein F für FREE ein und drücken ENTER. Dadurch wird diese Datei in unserem TSO User freigegeben und der Batch Job kann jetzt weiterlaufen.
9.5
Warnung bei inkonsistenten Datei Strukturen
Wenn beim Aufruf des Programms ISRDDN die Option CHECK auf ON eingestellt ist, kann es vorkommen, dass sofort die unten zu sehende Anzeige erscheint. Das bedeutet, dass ISRDDN eine inkonsistente Dateiverkettung entdeckt hat. Dieser Zustand kann dazu fuhren, dass man Members aus dieser Dateikette möglicherweise nicht aufrufen kann. Current Data Set Allocations Command ===> Act DDname > SYSEXEC LIB > PO > PO > > SYSPROC PO >
Blksz Lrecl RCEW Org 27998 27920 8800
255 VB 80 FB 80 FB
3120
84 VB
Data Set Name
Actions :
Row 86 of 112 Scroll ===> CSR B E V M F C I Q
PROX.LANZ.CEXEC SYST1.TSO.EXEC ISP.SISPEXEC DBT1 .DT1A.DSNCLIST
Warning: ISRDDN has detected that one or more concatenations, including DD name SYSEXEC contain mixed record formats, organizations, or fixed record lengths. Reading from allocations containing different types of data sets can cause I/O errors, ABENDS, or other unpredictable results. For further information, see the z/OS documentation on using data sets. Enter CHECK OFF to disable this check.
Abbildung 103 Warnung bei inkonsistenten Dateistrukturen
durch ISRDDN
Wenn Sie sich im obigen Panel die in dem Rahmen stehende Meldung anschauen, sehen Sie, dass das Programm für das DD Statement SYSEXEC eine Inkonsistenz in den Datei Charakteristiken der Concatenated Data Sets festgestellt hat. Ich habe die betreffenden Angaben grau unterlegt. Man kann mit dem TSO User aber möglicherweise trotzdem einwandfrei arbeiten. Es handelt sich hierbei lediglich um eine Warnung. Falls Sie ständig in Ihrem TSO User mit solchen Ketten arbeiten, die inkonsistente Datei Charakteristiken enthalten, werden diese Warnungen bei jedem Aufruf von ISRDDN automatisch angezeigt. Wenn Sie aber einwandfrei mit dieser Struktur arbeiten können, kann diese Meldung mit der Zeit sehr lästig sein. Deshalb gibt es die Möglichkeit, die Anzeige dieser Warnungen zu unterdrücken. Dazu geben Sie in der Command Line des Programms ISRDDN den Befehl CHECK OFF ein und drücken dann ENTER.
192
9 ISRDDN - Utility für zugeordnete Dateien
Wenn Sie bei der Ausführung von REXX Prozeduren unerklärliche Abbrüche bekommen, die nicht auf Fehlern in den Prozeduren beruhen, dann sollten Sie den Dateicharakteristiken der verketteten DSN in den DD Namen SYSPROC bzw. SYSEXEC Ihre Aufmerksamkeit schenken.
9.6
Die Anzeige Optionen „SHORT" und „LONG"
Diese beiden Optionen steuern die Anzeige der einzelnen DD Namen mit den dazu gehörigen DSNs dahingehend, dass der DD Name entweder direkt vor dem ersten DSN steht oder aber in einer extra Zeile darüber. Wir wollen uns einmal die Anzeige eines DD Namens anschauen, wenn die Option SHORT gesetzt ist. Wir wählen hierzu den DD Namen ISPSLIB aus, indem wir gleich zu Beginn unserer Übung den Befehl ONLY I S P S L I B eingeben und ENTER drücken. Daraufhin erhalten wir folgendes Bild: Current Data Set Allocations Command ===> Blksz Lrecl RCFM 80 FB 27920 27920 80 FB 3120 80 FB 8800 80 FB 8800 80 FB 27920 80 FB 8800 80 FB 80 FB 8800
Org PO PO PO PO PO PO PO PO
Row 1 of 8 Scroll ===> PAGE
Act DDname Data Set Name Actions > 1 ISPSLIB DBT1.SDSQSLBE > DBT1.DT1A.DSNSPFS > SYST1.TSO.ISPSLIB > ISP.SISPSLIB > SYS1.DGTSLIB > SYSPT. CAI.CAIISPS > CBC.SCBCSKL > ISP.SISPSENU End of Allocation List
Abbildung 104 Anzeige der ISPSLIB Kette mit der Anzeige Option SHORT
Wenn wir nun in der Spalte Act vor dem DD Namen ISPSLIB ein b für Browse eingeben, erhalten wir eine Anzeige, die sämtliche Member bei deren erstmaligem Auftauchen innerhalb aller Concatenated Data Sets von ISPSLIB enthält. Hier ein Ausschnitt aus dieser Anzeige:
193
9.6 Die Anzeige Optionen „SHORT" und „LONG"
Menu
Functions
Utilities
BROWSE DBT1.SDSQSLBE Command ===> Name Prompt Lib DRUTPL 3 DSNESKL1 2 DSQABB1P 1 DSQABB1S 1 DUDOCLIB 6 EDGSGSYN 5 EOF 3 EOF2 3 EOF3 3 EOF3RES 3 EOF4 3 EPIREST 3 EPIREST2 3
Help
Size 11
Created 1992/07/28
Row 00115 of 01192 Scroll = > PAGE ID Changed 1992/07/29 08:: 37::24 SY412
120 120 120 120 120 49 53
1987/03/30 1987/07/27 1987/08/06 1987/12/15 1987/08/13 1989/10/17 1989/10/18
1988/02/02 1988/02/02 1987/12/15 1987/12/15 1988/02/02 1991/10/28 1991/10/28
08:: 22::00 08:; 22::00 15: 10:: 00 15:: 07::00 08:: 23::00 14:: 08::00 14 ill: : : 00
SY412 SY412 SY412 SY412 SY412 SY412 SY412
Abbildung 105 Member List eines Concatenated Data Set
In der Spalte „Lib" steht die relative Position des DSN in dem jedes angezeigte Member zuerst gefunden wurde. Das bedeutet, dass die angezeigten Member durchaus noch mehrfach in weiter hinten liegenden Dateien vorkommen können. Diese Members kann man mit dieser Art der Anzeige nicht sehen. Wenn Sie jetzt aber ein Browse nur mit der ersten Datei der Kette durchfuhren wollen, dann geht das in einem Panel, das mit der Anzeige Option SHORT erzeugt wurde gar nicht. Es geht nur, wenn vor diesem DSN kein DD Name steht. Um die Anzeige so einzustellen, dass der DD Name jeweils vor der DSN Kette in einer extra Zeile steht, geben wir jetzt den Befehl „LONG" ein und erhalten damit folgendes Bild: Current Data Set Allocations Command ===> Blksz Lrecl RCiW Org 27920 27920 3120 8800 8800 27920 8800 8800
80 80 80 80 80 80 80 80
FB FB FB FB FB FB FB FB
PO PO PO PO PO PO PO PO
Act DDname > ISPSLIB > b > > > > > > >
Row 1 of 9 Scroll ===> PAGE Data Set Name
Actions:
B E V M F C I Q
DBT1.SDSQSLBE DBT1.DT1A.DSNSPFS SYST1.TSO.ISPSLIB ISP.SISPSLIB SYS1.DGTSLIB SYSPT . CAI. CAIISPS CBC.SCBCSKL ISP.SISPSENU
Abbildung 106 Anzeige der ISPSLIB Kette mit der Anzeige Option LONG
Würden wir jetzt wieder vor dem DD Namen ein b eingeben, dann erhielten wir die bereits oben gezeigte Liste mit der Member Anzeige aus allen DSNs der Kette ISPSLIB. Jetzt können wir aber auch vor dem ersten DSN ein b eingeben und erhalten damit nur die Member List dieser Datei:
194
Menu
9 ISRDDN - Utility fìir zugeordnete Dateien
Functions
Utilities
BROWSE DBT1.SDSQSLBE Command ===> Name Prompt . DSQABB1J . DSQABB1P . DSQABB1S **End**
9.7
Help
Size
Row 00001 of 00003 Scroll = > PAGE ID Changed
Created
Das Parmlib Member ALLOCxx anzeigen
Als wir weiter vorne im Buch über die Concatenated Data Sets gesprochen haben, war die Rede von einem Parmlib Member mit dem Namen ALLOCxx, in dem die maximale Anzahl von Sequential Concatenated Data Sets fur eine LP AR festgelegt wird. Dieses Member wollen wir uns jetzt einmal anzeigen lassen. Dazu benutzen wir den speziellen Befehl Parmlib des ISRDDN: Wir rufen ISRDDN auf und geben als Primary Command PARMLIB ein und drücken ENTER. Daraufhin erscheint das folgende Panel: Current Data Set Allocations Command ===> m alloc * parmlib Volume OSTOA8 OSTOMC PLPRT1 P0XYZ1 P0XYZ1 TINO 17 PLPRT1
Disposition Act DDname > PARMLIB > > > > SYSEXEC > SHR,KEEP SHR,KEEP > > SHR,KEEP SHR,KEEP >
Abbildung ¡07 Anzeige der Parmlib
Row 85 of 115 Scroll = = > CSR Data Set Name
Actions:
B E V M F C I Q
SYS1. PARMLIB SYS1. TST0 . PARMLIB SYS1. LPRT. PARMLIB PROX. LANZ . CEXEC PROX. LOGON. CEXEC DBT1.SDGOEXEC SYST1.TSO.EXEC
Dateien
Vom Programm ISRDDN wird auf Grund dieses Befehls der DD Name PARMLIB mit der dazugehörenden DSN Kette in unsere Anzeige eingefugt, obwohl dieser DD Name in unserer Logon Prozedur gar nicht vorhanden war. Die Möglichkeit der Parmlib Anzeige ist ein spezieller Service des Programms ISRDDN. Jetzt suchen wir ganz gezielt nach dem Member ALLOCxx, und zwar nur im DD Namen Parmlib, indem wir den oben gezeigten Befehl m a l l o c * p a r m l i b eingeben und ENTER drücken. Durch die Angabe von alloc* wird generisch nach allen Members, die mit ALLOC beginnen, gesucht.
195
9.7 Das Parmlib Member ALLOCxx anzeigen Wir erhalten dann folgende Anzeige: Current Data Set Allocation Command ===> Message Member: ALLOC*
Member was found Scroll ===> CSR
Act DDname > PARMLIB > b > > > SYSEXEC > > >
Data Set Name
Actions: B E V M F C I Q
SYS1 PARMLIB SYS1 TST0.PARMLIB SYS1 LPRT. PARMLIB PROX LANZ. CEXEC PROX LOGON.CEXEC DBT1 SDGOEXEC
Abbildung 108 BROWSE des Parmlib Members ALLOCOO
Wenn wir nun in der Spalte Act in der Zeile mit M e m b e r : ALLOC* ein b eingeben und ENTER drücken, erhalten wir die Anzeige eines BROWSE Panels mit Member Liste, in der hier nur das Member ALLOCOO zu sehen ist. Wenn, wie in diesem Fall, nur ein Member in der Member Liste steht, können Sie sicher sein, dass dieses ALLOCOO Member auch das aktiv benutzte ist. Sollten bei Ihnen mehrere Member erscheinen, müssen Sie sich bei Ihrer Systemtechnik erkundigen, welches Member aktiv benutzt wird. Menu
Functions
Utilities
BROWSE SYS1. PARMLIB Command = = > Name Prompt S ALLOCOO
Help
Size 125
Created 1997/08/01
Row 00001 of 00001 Scroll ===> CSR Changed ID 1999/12/28 13:33:43 SYZ67
Wir rufen nun das Member ALLOCOO auf, indem wir vor dem Member ein s eingeben und ENTER drücken. In dem jetzt erscheinenden Browse Anzeige Panel suchen wir so lange nach dem Wort TIOT bis die folgende Anzeige erscheint. Menu
Utilities
Compilers
Help
Vol OSTOA8 BROWSE SYS1.PARMLIB(ALLOCOO) - 01.03 CHARS 'TIOT' found Command ===> Scroll ===> CSR /•A******************************************************************/ 00450000 TIOT SIZE(64) /* Size of the task I/O table */ 00460001 /* max. 64 DD-Statements/Step allowed */ 00470002 00480000
Wir sehen also, dass in dieser LPAR maximal 64 „Sequential Concatenated Data Sets" pro DD Statement erlaubt sind. Wie Sie an den wenigen Beispielen, die wir hier durchgesprochen haben, erkennen können, ist das Programm ISRDDN ein sehr nützliches Werkzeug. Nutzen Sie es also eifrig.
196
9 ISRDDN - Utility fiir zugeordnete Dateien
Ich empfehle Ihnen, sich durch weitere Übungen mit dem Programm vertraut zu machen. Benutzen Sie dazu die sehr umfangreiche Hilfe Einrichtung des Programms ISRDDN, die Sie über die PF1 Taste erreichen.
9.7.1
Anzeige der LINKLIST Kette
Wenn Sie wissen wollen, welche Ladebibliotheken in dem System LINKLIST verkettet sind, dann geben Sie das Command LINKLIST ein und drücken ENTER. Daraufhin erhalten Sie zusätzlich zu den bereits vorhandenen Dateien auch die beiden Ketten unter den DD Namen LINKLIST und LPALIB angezeigt. Wenn Sie jetzt nach einem Member suchen, werden auch diese beiden Bibliotheken durchsucht. Das folgende Bild zeigt einen Ausschnitt der Anzeige, nachdem ich LINKLIST eingegeben hatte: Current Data Set Allocations Command
Scroll = ==> CSR
===>
Blksz Lrecl RCFM * * ü 32760 * * ü 32760 •• U 32760 * * U 32760 * * ü 23200 * * O 32760 * * O 32760 * * O 6000 * * U 32760 * * O 32760 * * U 32760 * * U 6144 •* ü 32760 23200 U ** U 27998 * * ü 6144 32760 32760 32760 32760 32760 32760 32760 27998 27998
* *
* * * * * * ** * *
Row 115 of 20
u u u u ü u u
255 VB 255 VB
Org PO PO PO PO PO PO PO PO PO PO PO PO PO PO PO PO
Act > > > > > > > > > > > > > > > > > PO > PO > PO > PO > PO > PO > PO > > LIB > LIB >
DDname Data Set Name Actions: B E V M F C I Q LINKLIST SYS1. SIOALMOD SYS1. SERBLINK IN6. V2R1M0 . SINGMOD1 ING. V2R1M0 . SINGMOD2 SYSP.PDSFAST.LOADLIB SYSP.LINKLIB SYS1.DGTLLIB SYSP. COMPAREX. LOAD SYS1. SASFPLIB SYS1.SASFPLNK DCF.R40.DCFLOAD SYSP. TST1. SA. USERLNK REXX. V1R3M0 . SEAGLMD SYSP.EASYPLUS.LINKLIB SYS1.SSPLIB SYSP. MQM. LINKLIB LPALIB SYS1.LPALIB ISF.SISFLPA ISP.SISPLPA CEE.SCEELPA SYS1. SERBLPA SYS1. SDWWDLPA REXX. V1R3M0 . SEAGLPA SYSEXEC PROX.BUCH.CEXEC PROX. UTIL. CEXEC
Abbildung 109 Anzeige der LINKLIST Kette mithilfe des Programms
ISRDDN
Tipp Geschwindigkeit ist keine Hexerei, wenn man immer das richtige Werkzeug für einen konkreten Bedarfsfall zur Hand hat und man dieses Werkzeug auch gut genug beherrscht, um den optimalen Nutzen daraus zu ziehen.
10
„Geheime" Programme
In diesem Kapitel möchte ich Ihnen einige Befehle und die dazugehörigen Programme vorstellen, die in der Standardliteratur nicht beschrieben sind. Diese Programme und Befehle können aber sehr hilfreich sein. Aus der PC Welt kennen Sie vielleicht den Ausdruck der „geheimen" Befehle. Manche Autoren versuchen, mit diesem Begriff zu suggerieren, dass sie Ihnen jetzt etwas verraten was „geheim" ist und nur sie wüssten darüber Bescheid. Woher kommen diese Programme und Befehle? Das ist ganz einfach zu erklären: In den Entwicklungsabteilungen der Hersteller werden von den Entwicklern manchmal Programme zur eigenen Benutzung geschrieben, um die tägliche Arbeit zu beschleunigen. Und dann kommt es vor, dass Vorgesetzte und Kollegen diese für den Eigenbedarf entwickelten Programme für ihre eigene Arbeit auch ganz prima finden und so der Vorschlag entsteht, diese „tollen" Programme auch der Allgemeinheit zur Verfugung zu stellen. In dieser Situation kann der Softwarehersteller zweierlei tun: •
•
Er kann diese Programme offiziell herausbringen. Dies heißt aber auch, er muss für die Funktionalität dieser Programme gerade stehen. Darüber hinaus erwarten die Kunden dann auch einen entsprechenden Support. Und das kostet Geld. Er kann diese Programme aber auch inoffiziell freigeben. Damit geht meistens ein Ausschluss jeglicher Gewährleistung, Unterstützung und Wartung einher. In der PC Welt nennt man Sammlungen solcher Programme auch „Tool Kits".
Ich möchte Ihnen jetzt auf den folgenden Seiten einige dieser Programme vorstellen, die in der TSO/ISPF Umgebung sehr gute Dienste leisten, aber in keiner offiziellen Broschüre der IBM beschrieben sind. Es handelt sich dabei um folgende Befehle und Programme: • • •
Den TSO Befehl CONCATD, den wir bereits beim Logon Verfahren benutzt haben. Das DSLIST Programm ISRDSLST. Das TSO/ISPF Programm TASID.
198
10 „Geheime" Programme
10.1
Der T S O Befehl
C O N C A T D
Wenn man vor dem Starten von ISPF noch weitere Dateien dynamisch zu den bereits in der LOGON JCL definierten Gruppen von DSN Ketten hinzufügen will, besteht das Problem, dass es keinen offiziellen TSO Befehl gibt, mit dem dies erreicht werden kann. Es gibt aber den inoffiziellen Befehl CONCATD, den man dazu benutzen kann. Hier eine Verlautbarung der IBM zu diesem Befehl: CONCA TD is not provided with TSO, and is usually installed from the MVSTOOLS disk - 'CONCATD IBM Version 410 for OS/390'. Customers using the z/OSplatform will not have CONCA TD available. Natürlich läuft das Programm CONCATD auch unter z/OS TSO. Es muss nur installiert sein. Sie können dies leicht überprüfen, indem Sie im ISPF das Menü 6/TSO aufrufen und dort H CONCATD eingeben und ENTER drücken. Wenn dann die Hilfe Informationen zu CONCATD erscheinen, ist der Befehl auch vorhanden. Wir wollen uns jetzt die (leider englische) Beschreibung zum Befehl CONCATD anschauen: //********************************************************************/
II*
Macro-Name = CONCATD
//* //* II* II* II* II* II* II*
Descriptive-Name = HELP text for CONCATD command processor Dynamic Concatenation/Deconcatenation of Data Sets or Files Copyright = 5775-DNH (C) COPYRIGHT IBM Deutschland GmbH Lizenziertes Material - Eigentum der IBM Siehe IBM Copyright-Richtlinien Form 30617
*/ */ */ */ */ */ */ */ */ */
II*
Change Activity =
*/
II*
II* II*
*!
*/
//********************************************************************/
FUNCTIONThe CONCATD command performs the following functions: - Dynamically concatenates a data set or list of data sets before an existing or after an existing allocation. - Deconcatenates from an existing ddname allocation. - Creates an new allocation, if none exists. - Frees the whole file, if the caller deconcatenates all data sets of an existing allocation. - Lists the file allocation, if the file keyword and the list operand were used. - Allocates the file with the permanently allocated attribute, if the PERM keyword was entered, or if the file already exists with an permanently allocated attribute. EXAMPLES: /* allocate MX clist in front of existing allocation */ CONCATD F (SYSPROC) DA (MY. CLIST) /* deconcatenate my MVS.CLIST from file SYSPROC */ DECON F (SYSPROC) DA (MVS . CLIST) /* list my sysproc allocation */ CD F(SYSPROC) LIST
10.1 Der TSO Befehl CONCATD
199
V=IBM P=TSO/SYSHELP R=V3R3M0 I=CONCATD SYNTAXCONCATD FILE(ddname) DSN(dsname) BEFORE/after NOLIST/list CONCAT/deconcat SHR/old BLKSIZE (vvvw) NOPERM or PERM REQUIRED - FILE/DDN and DSN/DA or FILE/DDN and LIST DEFAULTS - BEFORE, NOLIST, CONCAT, SHR ALIAS
- CD, DECON
RESTRICTIONS - All the data sets to be concatenated must have the same data set organization, if you use or default to the BEFORE option. OPERANDS FILE('ddname') OR DDN(1ddname1) - DDNAME to be associated with data set. DSN('dsname') OR DA('dsname') - DSNAME is the name of the data set to be concatenated. DSN('dsname-list') OR 1 DA( dsname-list1) - DSNAME-LIST is a list of data set names to be concatenated. BEFORE The names specified with the DA/DSN parameter will be allocated in front of the data sets associated with the filename passed. Append the filename specified with the data sets AFTER passed via the DA/DSN keyword. Suppress error and information messages and NOLIST suppress file allocation listing. LIST Display any error or information message and provide an allocation listing at CONCATDs termination. CONCAT DECONCAT
Concatenates data sets to the filename passed. - Deconcatenates the requested data sets from the filename passsed. NOTE: If you choose DECON as command name you don't have to specify the keyword DECON. - Use SHARE disposition for allocation. SHR OLD - Use OLD disposition for allocation. BLKSIZE - A block size value from 0 up to 32760 to be used for all data sets in the concatenation. NOPERM - File concatenation will be dynamically allocated. PERM - File concatenation will be permanently allocated. NOTE: If you specify neither PERM nor NOPERM and the file exists, the existing allocation attribute will be kept. Abbildung 110 Beschreibung des Programms CONCATD
Wie der Beschreibung zu entnehmen ist, kann man weitere DSN sowohl vorne als auch hinten an eine bestehende Kette anfügen. In der Praxis werden aber meist weitere DSN vorne angefugt, um eigene Programmbibliotheken vor die Systemsebene zu stellen.
200
10 „Geheime" Programme
Wir schauen uns hier noch einmal das Beispiel aus unserer privaten Logon Prozedur an: "CONCATD DDN(SYSEXEC) DSN ( ' LANZT.TEST, .REXX'", , " ' LANZT.. PROD.. REXX' ) CONCAT "CONCATD DDN(ISPPLIB) DSN('LANZT..TEST,.PANEL'" r " ' LANZT,. PROD,.PANEL') CONCAT "CONCATD DDN (ISPMLIB) DSN(1LANZT..TEST.•MSGS'", " ' LANZT.. PROD.MSGS') CONCAT "CONCATD DDN(ISPSLIB) DSN ( ' LANZT. .TEST..SKEL'", " ' LANZT.. PROD,.SKEL') CONCAT "CONCATD DDN(ISPTLIB) DSN ( ' LANZT.,TEST..TABL') CONCAT "CONCATD DDN ( ISPTABL) DSN ( ' LANZT.,TEST..TABL') CONCAT
BEFORE S HR LIST" BEFORE SHR LIST" BEFORE SHR LIST" BEFORE SHR LIST" BEFORE SHR LIST" BEFORE SHR LIST"
Wenn wir uns nun anschauen, welche Verknüpfungen nach Ausfuhrung der obigen Prozedur vorliegen, sehen Sie die Auswirkungen des Befehls CONCATD: Die vorne angefügten Dateien habe ich grau unterlegt. D1D138 D1D118 PLPRT1 OSTOA8 OSTOA8
SHR,, KEEP SHR,.KEEP SHR,.KEEP SHR,.KEEP SHR,.KEEP
D1D151 D1D134 PLPRT1 OSTOA8 OSTOA8
SHR,.KEEP SHR,.KEEP SHR,.KEEP SHR,.KEEP SHR,.KEEP
D1D117 D1D137 PLPRT1 OSTOA8
SHR,.KEEP SHR,.KEEP SHR,,KEEP SHR,.KEEP
D1D128
SHR,.KEEP
D1D128 PLPRT1 OSTOA8 OSTOA8
SHR,.KEEP SHR,.KEEP SHR,.KEEP SHR,.KEEP
D1D122 D1D138 P0XYZ1 P0XYZ1 PLPRT1 OSTOA8
SHR,.KEEP SHR,, KEEP SHR,.KEEP SHR,.KEEP SHR,.KEEP SHR,,KEEP
> >
ISPMLIB
> > > > > >
ISPPLIB
> >
> > >
ISPSLIB
> > > > > > >
ISPTABL ISPTLIB
> >
> > > >
> > > >
>
SYSEXEC
LANZT.TEST.MSGS LANZT.PROD.MSGS SYSTX.TSO.ISPMLIB ISF.SISFMLIB ISP. SISPMENU LANZT.TEST.PANEL LANZT.PROD.PANEL SYST1.TSO.PANELS ISP.SISPPENU ISF.SISFPLIB LANZT.TEST.SKEL LANZT.PROD.SKEL SYST1.TSO.ISPSLIB ISP.SISPSENU LANZT . TEST . TABL LANZT.TEST.TABL SYST1.TSO.ISPTLIB ISP.SISPTENU ISF.SISFTLIB LANZT.TEST.REXX LANZT.PROD.REXX PROX.LANZ.CEXEC PROX. LOGON. CEXEC SYST1.TSO.EXEC ISP.SISPEXEC
201
10.2 Das Programm ISRDSLST
10.2
Das Programm ISRDSLST
Das Programm ISRDSLST dient zur Anzeige von „Personal Data Set Lists" auch DSLISTen genannt. DSLISTen sind Zusammenstellungen von DSNs, die mit Hilfe von Masken im ISPF definiert werden können, um Gruppen von Dateinamen anzeigen zu können. Die Anzeige erfolgt in der Form, die Sie aus dem ISPF Menü 3.4 kennen. Siehe hierzu auch das Kapitel „DSLIST - Data Set Lists" ab Seite 91. Das Programm ISRDSLST können Sie auf zwei Arten benutzen: 1. Innerhalb einer Prozedur, wenn Sie eine DSLIST anzeigen wollen. Zu diesem Zweck wird das Programm eher weniger genutzt. 2. Innerhalb einer ISPF Command Table, um damit gezielt bestimmte DSLISTen mit einem kurzen Befehl aufrufen zu können. Die Benutzung in Command Tables ist das Hauptverwendungsgebiet für das Programm ISRDSLST. Wir wollen uns jetzt einmal an einem Beispiel ansehen, wie man das Programm in einer REXX Prozedur nutzen kann. Es handelt sich hierbei um eine reine Beispielprozedur. Hier wird dem Benutzer die DSLIST mit dem Namen ADMIN angezeigt. /* DOC: REXX ISRDSLST */ /* DOC: Beispiel für die Benutzung des Programm ISRDSLST */ /* (c) LANZT am: 9 Mar 2004 */ / * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /
address "ISPEXEC" "CONTROL ERRORS RETURN" "SELECT PGM (ISRDSLST) PARM (DSL ADMIN) SUSPEND SCRNAME ($A) " exit Abbildung 111 Aufruf des Programms ISRDSLST in einem REXX
Programm
Im PARM Feld wird im ersten Wort die Art des Aufrufs und im zweiten Wort der Name der DSLISTe angegeben, die angezeigt werden soll. Für den Aufruf von DSLISTen muss als erstes Wort immer DSL verwendet werden. Bei der Ausführung der obigen Prozedur erscheint folgende Anzeige am Bildschirm: Menu
Options
View
Utilities
Compilers
Help
DSLIST - Data Sets Matched in list ADMIN Command = = > Command - Enter "/" to select action PRTT. PROCLIB. JCL PRTT. PROCXXX. JCL SMQP. JCL SMQP. MASENTN SMQP.PAN. JCL SQMT. MASENTN
Row 1 of 8 Scroll = > CSR Message
Volume P0XYZ1 P0XYZ1 D1D118 D1D144 D1D126 D1D148
End of Data Set list
202
10 „Geheime" Programme
Wenn wir uns jetzt noch mit SWAP LIST die gerade geöffneten ISPF Ebenen anschauen, dann sehen wir, dass auch die Angabe SCRNAME(SA), die wir bei dem Aufruf angegeben haben, in der Anzeige erscheint: Menu - i
Options —
Utilities Compilers Help ISPF Task List Active ISPF Logical Sessions
View
Start a new screen Start a new application Application Name ID 2* 67
Name $A DSLIST
Panelid ISRUDSLO ISRUDLP ISRSPRIM
Applid ISR I SR ISR
Session Type 3270 3270 3270
P0XYZ1 P0XYZ1 D1D118 D1D144 D1D126 D1D157 D1D117 D1D148 *******************
Abbildung 112 Anzeige Panel des Befehls SWAP LIST
Siehe hierzu die Kapitel „ISPF Command Tables" ab Seite 79 und „CMDSMOD - Bearbeiten von ISPF Command Tables" ab Seite 535. Im letzteren Kapitel wird gezeigt, wie man Einträge in ISP Command Table macht, die das Programm ISRDSLST benutzen.
10.3
Das Programm TASID
Das Programm TASID ist ein sehr nützliches Programm, wenn man Informationen über das z/OS System erfahren will, an dem man gerade arbeitet. Es handelt sich hierbei ebenfalls um ein unveröffentlichtes Programm der Firma IBM. Es befindet sich allerdings nicht im Lieferumfang des TSO, sondern Sie müssen es sich von Ihrer Systemtechnik besorgen. Sie benötigen zur Ausfuhrung TASID zwei Dinge: 1. Das Programm TASID als Lade Modul. 2. Die dazugehörige Panel Library. Wenn Sie beide Quellen haben, müssen Sie entscheiden, wie Sie das TASID Programm aufrufen wollen. Es gibt dafür folgende Möglichkeiten des Vorgehens: •
Sie kopieren sich das Programm in eine Lade Bibliothek, die in Ihrem TSO User schon zugeordnet ist und kopieren auch die ca. 170 Panels in Ihre Panel Bibliothek. Dann können Sie das Programm einfach mit TSO TASID aufrufen.
203
10.3 Das Programm TASID •
Sie erzeugen sich eine kleine REXX Prozedur in Ihrer persönlichen REXX Bibliothek, welche die notwendigen Zuordnungen durchfuhrt und rufen das Programm mit Hilfe dieser Prozedur auf.
Ich habe den zweiten Weg gewählt. Die kleine REXX Prozedur finden Sie anschließend: /* DOC: REXX TASID /* DOC: Aufruf des TASID Systems /* (c) LANZT address "LIBDEF "LIBDEF "SELECT "LIBDEF "LIBDEF
*/ */
am: 23 Jan 2003 */
"ISPEXEC" ISPPLIB DATASET ID(>PROX TASID PANEL' ) STACK" ISPLLIB DATASET ID('PROX TASID LOAD') STACK" PGM(TASID)" ISPPLIB" ISPLLIB"
Abbildung 113 REXX Prozedur zum Aufruf des Programms TASID
Ich verzichte darauf, diese Prozedur hier in allen Einzelheiten zu erklären. Sie können sich entweder die entsprechenden Kapitel im weiteren Verlauf dieses Buches, die sich mit der Erstellung solcher Prozeduren beschäftigen, anschauen oder einfach die Prozedur, so wie sie hier steht, abschreiben. Sie müssen lediglich die grau unterlegten Dateinamen Ihren Bedürfnissen anpassen. Wenn Sie TASID dann aufrufen, erhalten Sie das Panel auf der folgenden Seite: Auch hier werde ich die Inhalte des Panels nicht detailliert beschreiben, da die Werte oft nur für Systemspezialisten aussagefahig sind. Aber vielleicht gehören Sie ja zu dieser Spezies. Spielen Sie einfach ein wenig mit TASID herum und Sie werden sehen, dass in den Tiefen des Tools allerhand nützliche Informationen zu finden sind. Ich empfehle Ihnen sich den Abschnitt unter dem Text
Select one of the following options: einmal genauer anzusehen. Sie sollten die dort genannten Anzeigemöglichkeiten alle einmal durchgehen.
204
10 „Geheime" Programme
Hier jetzt ein Beispiel für den Aufruf des Programms TASID. Ich habe einige interessante Werte grau unterlegt: File
Navigate
Settings
CPU=17% Option
TASID option menu
Select one of the following options: 1 - Address space list 5 2 - System ENQ contention 6 3 - Total system ENQ status 7 4 - Initiator Status List 8 -
End of data
Version 5.07c Miscellaneous displays Current dataset allocations Storage View Facility Snapshot
Current time 15:19 on 2004/03/02 Last IPL time 11:14 on 2004/01/24 IPL Parameters 67CB T1 1 z/OS 01.04.00 JES version JES2 SMF ID LPRT JES level 1. 4Tr User ID LANZT RACF level 7.70.7 Node JES2LPRT TSO version 3.3.0 VTAM Adr VTLANZT8 VTAM Level 6.1 Proc LOGONXX DFSMS level 1.03.0 Region 6800K RACF Grp XYZ#PART DSF level 1.16.0 Mode PR/SM ISPF Level 5.2.0 LPARs 6
TSO users Started tasks Jobs System addrs Free initiators
216 172 416 35 144
Total
983
CPU utilization CPU 2064-113 ENQ Contention Real Storage Expand Storage
MVS Information: z/OS 01.04.00 JES Information : JES2 / z/OS 1.4 / HJE7707 System: LPRT PLEX: AEPLEX Sysres: XYZ0A8
17% ( 10 CPUs) 7 4194304K OK z/Arch
This system keeps a history of 3 passwords. Automatic revocation after 3 invalid logon attempts. Password warning is 2 days before password expires. Revocation for inactivity is not in effect. RACF program control is available. SMS is available with PDSE support. TASID 5.07c - Compiled at 23.53 on 07/03/01 (c) Copyright IBM Corp, 1993, 2001. All Rights Reserved. Abbildung 114 TASID Option Menu
Hier die Erklärungen zu den grau unterlegten Werten: z/OS SMF ID LPRT 4 User ID LANZT Proc LOGONXX Region 6800K 4 ISPF Level 5.2.0
Das ist das installierte Release des z/OS. Das ist der Name der LPAR, in der TASID aufgerufen wurde. Das ist die USERID der TSO Benutzers. Das ist der Namen der Logon Prozedur. Der TSO Benutzer kann bis zu 6800K Storage nutzen. Es ist das ISPF Release 5.2.0 installiert.
11
Einfuhrung in die Programmiersprache REXX
Die ab hier folgenden Kapitel wenden sich an ISPF Benutzer, die über Programmierkenntnisse verfugen. Sie lernen, wie man mithilfe der Prozedurensprache REXX eigene Funktionen in das ISPF einfügen und nutzen kann. In den folgenden Unterkapiteln möchte ich Ihnen eine kurze Einfuhrung in die Programmiersprache REXX geben. Es handelt sich hierbei nicht um einen regelrechten Programmierkurs für REXX, sondern um eine kleine Einführung, die vor allem auf die wesentlichen Funktionen und Möglichkeiten von REXX eingeht. An Hand von praktischen Beispielen werde ich Ihnen die Anwendung von REXX im TSO/ISPF Umfeld erläutern.
11.1
Meine erste Begegnung mit REXX
Als ich das erste Mal Mitte der achtziger Jahre des vorigen Jahrhunderts mit REXX programmieren konnte, sagt ich sofort „WOW, was für eine Sprache!". REXX befreite mich von der Mühsal der Datendefinition, die ich in den von mir bis dahin benutzen Sprachen Assembler, FORTRAN und PL/1 vornehmen musste, bevor ich mit der eigentlichen Programmierung beginnen konnte. Mit REXX kann man sofort mit der Programmierung loslegen! Darüber hinaus begeisterten mich die wirklich sehr eleganten Funktionen zur Textverarbeitung. Und was das Allerbeste war: Endlich traf ich auf eine Sprache, mit der man „GOTO" freie Programme erstellen kann. Zunächst war ich sehr skeptisch, ob ich tatsächlich ohne „GOTO" auskommen würde. Und siehe da! Es hat bis heute geklappt. Sie werden also in keiner meiner REXX Prozeduren ein „GOTO" finden, was man im REXX mit „SIGNAL" ausführen müsste.
11.2
Was ist REXX?
REXX wurde von Mike Cowlishaw im Jahre 1979 in einem IBM Labor in England entwickelt. Die Sprachelemente und die Syntax stützen sich stark auf Elemente aus den Program-
206
11 Einfuhrung in die Programmiersprache REXX
miersprachen PL/1 und ALGOL. Wie Mike mir erzählte, hat er sich während der Entwicklung von REXX in seinem Büro folgenden Leitsatz an der Wand geschrieben: Keep the language small! Mike Cowlishaw hat uns mit REXX eine Sprache beschert, die tatsächlich mit einem geringen Sprachumfang auskommt und mit der auch die damit entwickelten Programme wirklich „small" bleiben. Seit 1990 gibt es die internationale „REXX Language Association" (REXXLA), in der ich auch Mitglied bin. Wir haben im Mai 2004 in Böblingen, anlässlich unseres jährlichen Symposiums, zusammen mit dem dortigen IBM Labor den 25-jährigen Geburtstag von REXX würdig begangen. Mike Cowlishaw musste dabei eine große Geburtstagstorte anschneiden. Informationen über REXXLA finden Sie unter der Internet-Adresse: http://www.rexxla.org/ Informationen über alles, was mit REXX zusammenhängt finden Sie im Internet unter: http://www.ibm.com/software/awdtools/rexx/ REXX ist inzwischen in allen Mainframe Systemen der IBM verfügbar. Die IBM hat schon vor Jahren eine REXX Version für das PC Betriebssystem OS/2 herausgebracht. In OS/2 ist REXX die Standard Script Sprache.
11.2.1
Object REXX
Eine weitere Entwicklung der IBM ist das „Object REXX". Diese Version von REXX ist, wie es der Name schon sagt, objektorientiert. Object REXX läuft auf den Systemen AIX, Linux, Sun Solaris und Windows. Wie die IBM anlässlich der oben genannten Jubiläumsveranstaltung bekannt gab, wird Object REXX in naher Zukunft als „Open Source" Sprache freigegeben.
11.2.2
Net REXX
NetREXX ist eine weitere Entwicklung von Mike Cowlishaw. Die folgende Beschreibung darüber findet man im Internet unter der weiter unten genannten Adresse: NetRexx is inspired by two very different programming languages, Rexx and Java. It blends the clean easy-to-learn syntax of Rexx with the robustness and portability of the Java Environment. The result is a language which is tuned for both scripting and application development, and is designed for both interpretation and compilation. It is therefore truly general-purpose. Die Software fur NetREXX und die gesamte Literatur dazu können Sie kostenlos von der folgenden Internet-Adresse herunterladen:
11.3 Überblick über REXX unter TSO
207
http://www.ibm.com/software/awdtools/netrexx/
11.3
Überblick über REXX unter TSO
Woher stammt der Name REXX? Er ist ein Extrakt verschiedener Buchstaben aus folgendem Text: REstructured eXtended eXecutor. Die Programmiersprache REXX, wie ich sie in diesem Buch vorstelle, ist beschrieben in der IBM Broschüre: z/OS TSO/E REXX Reference Diese Broschüre enthält neben einer ausführlichen Beschreibung der REXX Sprache, wie sie unter z/OS TSO benutzt werden kann, auch noch Hinweise, wie man mithilfe anderer Programmiersprachen zusätzliche Unterprogramme und Funktionen erstellen kann, die von REXX aus aufgerufen werden können. Ich habe diese Möglichkeiten schon des Öfteren genutzt, indem ich externe Funktionen in der Assembler Sprache entwickelt habe, die den Funktionsumfang meiner REXX Umgebung ergänzen. Dazu gehören auch eine CHANGE und eine SQRT (Quadratwurzel) Funktion, die es im Standard REXX nicht gibt. Hinweis Wie ich Ihnen schon weiter oben sagte, werden wir bei der Programmierung im ISPF ausschließlich die Prozedurensprache REXX benutzen. Dieses Buch soll einerseits kein Lehrbuch für die Programmiersprache REXX sein, andererseits ist REXX so einfach zu erlernen, dass jeder, der schon einmal in irgendeiner Sprache programmiert hat, sich mit Leichtigkeit im REXX zurechtfinden wird. Ich möchte Sie in den folgenden Kapiteln Schritt für Schritt in die praktische Anwendung der Programmiersprache REXX im TSO/ISPF Umfeld einführen. Dabei werde ich in den Beispielen aus der Praxis manchmal schon Befehle verwenden, bevor wir diese besprochen haben. Falls Ihnen diese Befehle nicht klar sind, empfehle ich Ihnen, jeweils bei der Beschreibung des entsprechenden Befehls nachzuschauen. Zunächst wollen wir uns der Ausführung von REXX Programmen zuwenden.
11.4
REXX Prozeduren im TSO
REXX ist eine Prozedurensprache. Das heißt, dass man zur Ausführung einer REXX Prozedur einen Interpreter benötigt. Der Interpreter für die Prozedurensprache REXX ist im TSO direkt integriert. Dadurch können REXX Programme im TSO ausgeführt werden, indem man sie einfach wie einen TSO Befehl aufruft. Da es aber von früher her im TSO auch die CLIST
208
11 Einführung in die Programmiersprache REXX
Sprache (ebenfalls eine Prozedurensprache ) gibt, musste man ein Verfahren einfuhren, an dem der TSO Command Prozessor erkennt, dass es sich bei einem Prozeduraufruf nicht um eine CLIST sondern um eine REXX Prozedur handelt.
11.4.1
Erkennen einer REXX Prozedur durch den TSO Command Processor
Regel Der TSO Command Processor erkennt eine REXX Prozedur daran, dass in der ersten Zeile der Prozedur der Text REXX steht. Fehlt dieser Text, dann nimmt der TSO Command Processor an, dass es sich um eine Prozedur vom Typ CLIST handelt und übergibt die Prozedur an den CLIST Procedure Processor. Diese Vorschrift bewirkt, dass die erste Zeile eines REXX Programms, das im z/OS TSO ausgeführt werden soll immer eine Kommentarzeile ist, in der irgendwo der Text REXX oder rexx steht. Als Beispiel sehen Sie hier den Programmkopf einer meiner REXX Prozeduren: /* DOC: REXX TT /* DOC: Beispiel f ü r /* (o) LANZT
*/ */ am: 20 Jan 2004 */
/ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /
11.4.2
Ausführen von REXX Prozeduren im TSO
REXX Prozeduren können wie folgt im TSO aufgerufen und ausgeführt werden: 1. Explizit durch den TSO Befehl EXEC. Bei der Benutzung des TSO Befehls EXEC wird das auszuführende Member im Operanden des EXEC Befehls direkt bestimmt. Dies bedeutet, dass ein Member, das eine REXX Prozedur enthält, aus jedem PDS heraus ausgeführt werden kann. Beispiel TSO EXEC
'dsn(member)'
Der EXEC Befehl hat noch eine Reihe von Optionen, die aber nur für Spezialfälle interessant 2. Implizit durch den Aufruf als TSO Befehl. Hier gibt es verschiedene Möglichkeiten des Aufrufs: •
Man gibt nur den Namen der REXX Prozedur als TSO Befehl an. Z.B.: TSO pgm. In diesem Fall werden zunächst alle zugeordneten System und User Load Libraries nach diesem Programmnamen durchsucht. Wenn der Name dort nicht gefunden wird, dann wer-
11.5 REXX Prozeduren kompilieren
•
•
209
den die Bibliotheken, die unter SYSEXEC und unter SYSPROC zugeordnet sind durchsucht. Man stellt beim Aufruf dem Namen ein Prozentzeichen (%) ohne Blank voran. Z.B.: TSO %pgm. In diesem Fall wird nur in den Bibliotheken, die unter SYSEXEC und unter SYSPROC zugeordnet sind gesucht. Welche der beiden Bibliotheken SYSEXEC und SYSPROC zuerst durchsucht wird, kann mit dem TSO Befehl EXECUTIL SEARCHDD(YES/NO) bestimmt werden. Siehe hierzu das Kapitel „EXECUTIL EXEC Ausfuhrung beeinflussen" ab Seite 316. Man ordnet temporär mittels ALTLIB eine REXX Bibliothek zu, in der REXX Programme stehen, die man ausfuhren möchte. Siehe hierzu das Kapitel „ALTLIB - Dynamische Verkettung von EXEC Bibliotheken" ab Seite 342.
3. Implizit durch Aufruf mittels des ISPF SELECT Services. Das folgende Beispiel zeigt die Ausführung eines REXX Programms durch den SELECT Service des ISPF aus einer temporären, mithilfe von ALTLIB zugeordneten Datei: "ALTLIB ACTIVATE APPLICATION (EXEC) DDNAME (##DD) " "ISPEXEC SELECT CMD(%"mem Strip(pp)")" "ALTLIB DEACTIVATE APPLICATION (EXEC) "
Informationen zum ISPF SELECT Service finden Sie in der IBM Broschüre ISPF Services Guide. Informationen zur Anwendung des ALTLIB Befehls finden Sie im Kapitel „ALTLIB - Dynamische Verkettung von EXEC Bibliotheken" ab Seite 342. Der ALTLIB Befehl hat auch eine Display Option. Ich habe diese einmal bei einem Aufruf angegeben, nachdem der obige Befehl mit ACTIVATE durchgeführt worden war und bevor das DEACTIVATE ausgeführt wurde. Damit erhielt ich folgende Anzeige: Current search order (by DDNAME) is: Application-level EXEC DDNAME=##DD System-level EXEC DDNAME=SYSEXEC System-level CLIST DDNAME=SYSPROC
11.5
REXX Prozeduren kompilieren
Es gibt im z/OS MVS die Möglichkeit, REXX Prozeduren zu kompilieren, bevor man sie ausfuhrt. Mit dem REXX Compiler können sogar Lademodule erzeugt werden, die dann in einem Batch Job direkt mit EXEC PGM=NAME ausgeführt werden können. Da das Kernthema dieses Buches das ISPF ist und das Thema REXX Compiler den Rahmen dieses Buches bei weitem sprengen würde, muss ich leider darauf verzichten, den REXX Compiler zu behandeln. Sie finden aber in den LANZ Utilities Prozeduren, um mithilfe des REXX Compilers CEXEC und LOAD Module zu erzeugen. Siehe hierzu die Kapitel: „#RC - REXX Programm im Batch kompilieren" ab Seite 521 und „#RCLOAD - Aus REXX Programm Lademodul erzeugen" ab Seite 523.
210
11 Einfuhrung in die Programmiersprache REXX
11.6
Performance von REXX Prozeduren
Da bei der Ausfuhrung von REXX Prozeduren jedes Statement interpretiert werden muss, benötigt das System dafür natürlich Rechenzeit, die zur Ausfuhrungszeit der Befehle hinzugerechnet werden muss. Die heute zur Verfugung stehenden Host Prozessoren sind aber so schnell, dass man kaum einen Zeitunterschied zu einem kompilierten Programm merkt. Wenn man sich Gedanken über die Performance von REXX Prozeduren macht, sollte man zunächst die größten Performance Bremsen genauer unter die Lupe nehmen. Die folgenden Operationen bremsen normalerweise am meisten: • • •
I/O Operationen Laden von externen REXX Prozeduren Aufruf von externen System Funktionen
Es ist also ratsam, immer zuerst an diesen Stellen mit seinen Maßnahmen zur Performance Verbesserung anzusetzen. Man sollte sich auch aus dem folgenden Grund nicht allzu viel von kompilierten REXX Prozeduren versprechen: Hinweis Wenn das Verhältnis von auszuführendem REXX Kode zu den Aufrufen von externen Funktionen, wie z.B. zum TSO, ISPF, I/O, DB2 usw. so ist, dass die meiste Zeit für den Programmdurchlauf in diesen Systemen verbraucht wird, bringen kompilierte REXX Prozeduren keinen merklichen Performance Gewinn. Diese Erkenntnis habe ich bei der Mitarbeit in einem sehr großen Projekt mit Hunderten von kompilierten REXX Programmen gewonnen. Siehe hierzu auch die Laufzeitvergleiche zwischen kompilierten REXX Programmen und solchen mit unkompiliertem Kode im Kapitel „DATE - Datumsfunktionen" ab Seite 269. Tipp Das Laden von externen REXX Prozeduren kann man am einfachsten beschleunigen, indem man diese Prozeduren als interne Prozeduren einbettet.
11.7
Syntax der REXX Sprache
Die Syntax der REXX Sprache ist sehr einfach und stark von PL/I geprägt: • •
Ein Statement steht normalerweise immer in einer Zeile. Es kann mit einem Semikolon abgeschlossen werden. Es muss aber nicht explizit abgeschlossen werden! Sollen mehrere Statements in einer Zeile stehen, müssen, bis auf das letzte, alle mit einem Semikolon (;) beendet werden. Das letzte Statement kann natürlich auch mit einem Semikolon abgeschlossen werden, es muss aber nicht.
11.7 Syntax der R E X X Sprache
211
•
Soll ein Statement auf der nächsten Zeile fortgesetzt werden, dann muss die vorhergehende Zeile mit einem K o m m a (,) enden. Das gilt auch für Literale. Das Fortsetzungskomma selbst wird immer durch ein Blank ersetzt. Soll dieses Blank vermieden werden, dann müssen die beiden Literalteile mit dem Verkettungsoperator (!!) verkettet werden.
• •
Leerzeilen sind im Programmkode zulässig. Kommentare beginnen immer mit /* und enden immer mit */. Alle Texte, die zwischen diesen beiden Begrenzungen liegen, gehören zum Kommentar, auch wenn sie sich über mehrere Zeilen erstrecken und R E X X Befehle enthalten. Kommentare können überall stehen, w o ein Blank innerhalb eines Statements zulässig ist und sie können geschachtelt werden.
•
Literale sind in paarige Gänsefüßchen oder Hochkommata zu setzen. Es gibt drei Arten von Literalen: - Text Literale Diese Literale können beliebigen Text enthalten und sie können über mehrere Zeilen definiert werden, wobei ein Literal 250 Zeichen nicht übersteigen darf. - Hexadezimale Literale. Diese können nur Hexadezimalzeichen enthalten und müssen durch den Buchstaben x bzw. X abgeschlossen werden. Die einzelnen Bytes können durch Blanks getrennt eingegeben werden. - Binäre Literale. Diese können nur 0 und 1 enthalten und müssen durch den Buchstaben b bzw. B abgeschlossen werden. Die einzelnen Bytes und Halbbytes können durch Blanks getrennt eingegeben werden.
11.7.1
Beispiele für korrekte REXX Statements
a = 5; B = "FF FF FF FF"x; L = "1111 0000 1111 0001 1111 0010"b X = 1 /* Anfangswert für x setzen */ do 1c = 1 to 50; m.k = 0; /* Nullsetzen */ end k;
Anschließend sehen Sie ein Beispiel für Fortsetzungszeilen bei der Definition von Text Literalen. Beachten Sie dabei, dass das Fortsetzungszeichen im resultierenden Text als Blank erscheint. Deshalb sollte man Fortsetzungszeilen von Literalen immer so definieren, dass der resultierende Text an dieser Stelle sowieso ein Blank enthält. if sysdsn(newdsn) "OK" then do zedlmsg = "Der COPY Dataset existiert nicht.", "Kopieren unmöglich!!", "Bitte existierenden DSN eingeben oder andere", "Funktion wählen." "ISPEXEC SETMSG MSG(ISRZ001)" msglvll = "Fehler beim COPY" iterate ipanel
212
11.8
11 Einfuhrung in die Programmiersprache REXX
Variablen im REXX
Regeln • •
• •
•
Im REXX können und brauchen Variable nicht (vor)definiert zu werden. Ihr Typ (CHAR oder NUM) definiert sich immer nach dem Inhalt. Der Typ wird nach jeder Zuweisung eines Wertes neu bestimmt. Das heißt, REXX Variable können laufend ihren Datentyp zwischen CHAR und NUM ändern, je nachdem welche Daten zuletzt hinein gestellt wurden. Die Länge der Variablennamen kann maximal 250 Zeichen betragen. Wird eine Variable benutzt, ohne dass ihr vorher ein Wert zugewiesen wurde, dann ist ihr Inhalt immer gleich ihrem Namen in Großbuchstaben. Einer Variablen, der nicht durch Funktionen oder externe Eingabe der Typ NUM zugewiesen wird, muss, bevor sie in einer Rechenoperation benutzt werden kann, explizit ein numerischer Wert zugewiesen werden. Der Inhalt einer Character String Variable darf 16MB nicht übersteigen.
Beispiele say hugo_ist_mein_liebling gibt den Text HUGO_IST_MEIN_LIEBLING aus. Sobald Sie aber das folgende Statement ausgeführt haben.
hugo_ist_mein_liebling = "willi" Und Sie führen dann say hugo_ist_mein_liebling aus, erscheint jetzt willi in der Ausgabe.
11.9
Datentypen von REXX Variablen
Im REXX gibt es, wie oben erwähnt, bei Variablen nur zwei Datentypen. Diese sind NUM für einen numerischen Inhalt und CHAR für alle anderen Inhalte. Wie oben bereits erklärt, wird der Datentyp intern bei jeder Zuweisung eines Wertes zu einer Variablen bestimmt. Er kann im Programm nicht explizit festgelegt, sondern mit der Funktion DATATYPE(var) nur abgefragt werden. Hier ein kurze Aufstellung, welchen Datentyp die Variable HUGO nach einer entsprechenden Zuweisung von Werten hat: Zuweisung zu hugo hugo = "250" hugo = 250 hugo = "25 0" hugo = date () hugo = date ("S") hugo = "F0 Fl"x hugo = "Cl Fl"x hugo = "1111 0001 1111 1001"b
Inhalt/Wert von hugo 250 250 "25 0" "14 May 2004 20040514 01 "AI" 19
Datentyp NUM NUM CHAR CHAR NUM NUM CHAR NUM
11.10 Operatoren der REXX Sprache
213
Regel Nur wenn eine im REXX Sinn zulässige Zahl zugewiesen wird, ist der resultierende Datentyp NUM. Zulässige Blanks in HEX und BIN Strings werden bei der Zuweisung vom REXX entfernt. Nullstrings Eine besondere Datenart ist der Nullstring. Diese Datenart wird sehr oft Variablen zugewiesen, wenn kein Ergebnis eines ausgeführten Befehls vorhanden ist. Der Nullstring wird als Literal durch zwei aufeinander folgende Hochkommata bestimmt. Nullstrings sind vom Datentyp CHAR und haben eine Datenlänge von 0 (Null). Beispiele für Definition und Abfrage auf Nullstrings: i f a = "" then do end
11.10
Operatoren der REXX Sprache
Operatoren dienen dazu, die Operationen, die mit Variablen und Konstanten durchgeführt werden zu definieren. Es gibt folgende Arten von Operatoren: • • • •
Stringoperatoren Arithmetische Operatoren Vergleichsoperatoren Logische Operatoren
11.10.1 String Operatoren Hier treffen wir auf eine der größten Stärken von REXX. Um Texte zusammenzuführen, schreibt man einfach die verschiedenen Konstanten und Variablen hintereinander in ein Statement. Dabei gelten folgende Regeln: Regeln • •
•
Wenn im Statement zwischen den Konstanten und Variablen mehr als ein Blank steht, wird im Ergebnis an dieser Stelle nur ein Blank stehen. Will man das automatische Einfügen eines Blanks unterbinden, müssen die Elemente mit dem Verkettungsoperator (H) verknüpft werden. Dabei werden links oder rechts vom Verbindungsoperator stehende Blanks ignoriert. Will man gezielt mehrere Blanks einfügen, müssen diese als Literal definiert werden.
214 •
11 Einfuhrung in die Programmiersprache REXX
Der Verbindungsoperator ist nicht notwendig, wenn die einzelnen Elemente des Statements vom Interpreter eindeutig erkannt werden können.
Beispiele erg = 25**3 say "Das Quadrat von 25 ist say "Das Quadrat von 25 ist do i = 2 to 5 say right(i hoch i" = say right(i"hoch"i" = end i
=" 25**2", 25**3="erg ="!! 25**2", 25**3="erg "right(i**i,5),20,"-") "right(i**i,5),20)
Das obige Programm bringt folgendes Ergebnis: Das Quadrat von Das Quadrat von 2 HOCH 2 = 2hoch2 = 3 HOCH 3 = 3hoch3 = 4 HOCH 4 = 4hoch4 = 5 HOCH 5 = 5hoch5 =
25 ist = 625, 25**3=15625 25 ist =625, 25**3=15625 4 4 27 27 256 256 3125 3125
Da die Variable h o c h nicht besetzt wurde, enthält sie den eigenen Namen in Großschreibung.
11.10.2
Arithmetische Operatoren
Die folgende Tabelle enthält die arithmetischen Operatoren: Operator + -
*
/ %
// * •
Funktion Addition Subtraktion Multiplikation Division Ganzzahlige Division. Der Rest wird unterdrückt, das Ergebnis wird nicht gerundet. Division und Rückgabe des Restes. Potenzierung. Nur ganze Zahlen sind als Potenzen erlaubt.
Tabelle 20 Arithmetische REXX Operatoren
Ferner können vor Variablen und Konstanten noch Vorzeichen gesetzt werden. Beispiel a = 3 b = a * 3 % 5
11.10 Operatoren der REXX Sprache
215
d = a * 3 // 5 say a b c d c+d a*100/10"%" Ausgabe: 3 1 - 3 4 1 30%
11.10.3
Vergleichsoperatoren
Die Vergleichsoperatoren sind in der folgenden Tabelle zusammengefasst: Operator =
> < X
>=
\< , -!> ==
»
« » = « = \ » , -1»
Bedeutung Normal gleich, auch wenn mit Blank erweitert. Größer als Kleiner als Ungleich Ungleich Größer gleich Nicht kleiner Kleiner gleich Nicht größer als Exakt gleich Exakt ungleich Exakt größer Exakt kleiner Exakt größer als oder gleich Exakt nicht kleiner als Exakt kleiner gleich Exakt nicht größer als
Tabelle 21 Vergleichsoperatoren im REXX
Ergebnis eines Vergleichs ist immer 0 oder 1 und vom Type NUM. Wo liegt der Unterschied zwischen dem exakten und dem normalen Vergleich? Bei normalen Vergleichen •
•
werden vor dem Vergleich bei beiden Operanden, von denen mindestens einer den Typ CHAR hat, fuhrende und nachfolgende Blanks entfernt. Dann wird der kürzere Operand rechts mit Blanks erweitert, damit er die gleiche Länge wie der längere Operand hat. wird numerisch verglichen, wenn beide Operanden vom Typ NUM sind. Das heißt, dass ein Operand vom anderen subtrahiert wird. Das Ergebnis der Subtraktion wird dann auf größer Null, gleich Null oder kleiner Null untersucht.
Bei exakten Vergleichen •
finden keine Erweiterungen des kürzeren Vergleichswertes durch Blanks statt.
216 • •
11 Einfuhrung in die Programmiersprache REXX
werden numerische Werte Zeichenweise von links nach rechts verglichen und nicht durch arithmetische Operationen. sind Werte unterschiedlicher Länge immer ungleich.
Dass und wie man Vergleichsoperatoren auch in Rechenanweisungen verwendet, zeigt das folgende Beispiel. Hier wird in einem einzigen Statement der „Julian Day" innerhalb eines Jahres berechnet: JD2: PROCEDURE arg j j j j mm dd return(, (mm-1) * 30 + dd - (mm>2)*2 +, (mm>l) + (mm>3) + (mm>5) + (mm>7) + (mm>8) + (mm>10) +, (mm>2) * ( ( j j j j / / 4 = 0) - ( j j j j / / 100 = 0) + ( j j j j / / 400 = 0))) Programm 4 JD2: Rechnen mit
Vergleichsoperatoren
Eine genaue Beschreibung dieses Statements finden Sie unter „Datumsberechnungen mit der DATE Funktion" ab Seite 270.
11.10.4
Logische Operatoren
Die logischen Operatoren finden meistens nur Anwendung in logischen Statements, wie z.B. IF, WHEN usw. Die folgende Tabelle zeigt die logischen Operatoren: Operator &
i && P r ä f i x \,—i
Bedeutung Ergibt 1, wenn beide Ausdrücke wahr sind. Ergibt 1, wenn mindestens einer von zwei Ausdrücken wahr ist. Ergibt 1, wenn einer von zwei Ausdrücken wahr ist, aber nicht beide. Negiert einen logischen Ausdruck.
Tabelle 22 Logische Operatoren im REXX
11.11
Sterns im R E X X
Sterns sind so etwas Ähnliches wie dimensionierte Variable bei anderen Programmiersprachen. Stems beginnen mit einem Variablennamen, dem ein Punkt folgt. Die Begriffe hinter dem Punkt sind so etwas Ähnliches wie Indizes. Diese Indizes können sowohl Zahlen als auch beliebige Texte sein. In der REXX Literatur werden Stems auch als „Compound Variables" bezeichnet. Das heißt, dass eine Stem Variable HUGO.l, solange ihr kein Wert zugewiesen wurde, genau so den Inhalt „HUGO.l" hat wie eine Variable HUGO den Wert „HUGO". Einfacher gesagt: Jede Stem Variable ist für sich gesehen eine ganz normale Variable. Sie wird nur anders geschrie-
217
11.11 Stems im REXX
ben. Und man kann auf Grund der „Zusammensetzung" durch die Angaben hinter den Punkten leichter mit einer ganzen Gruppe von Variablen arbeiten. Da das Verständnis für die Sterns im REXX den Anfängern erfahrungsgemäß größerer Schwierigkeiten bereitet, möchte ich in einem kleinen Beispiel zeigen, wie diese Technik funktioniert. Aufgabe Bei einem Skatturnier, bei dem eine zunächst unbekannte Anzahl Spieler teilnehmen wird, sollen die Kontostände der erreichten Punktzahl am Ende des Turniers sofort für alle Spieler ausgegeben werden können. Zur Eingabe der Daten wird ein Panel erstellt, in das man jeweils immer nur den Namen des Spielers und seine bei einem Spiel erreichten Punkte mit Vorzeichen eingibt (verlorene Spiele gehen mit Minus in das Ergebnis ein). Am Ende des Turniers sollen die Konten aller Spieler ausgedruckt werden. Die Eingabe ist beendet und der Ausdruck wird angestoßen, wenn als Name ein Stern (*) eingegeben wird. Hier die Prozedur SKAT, die diese kleine Aufgabe erledigt: /* DOC: REXX SKAT /* DOC: Programm für Skatturnier /* (c) LANZT
*/ */ am: 7 Apr 2004 */
/ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /
spieler = "" / * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /
/* Teil 1: Eingeben der Daten
*/
/ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /
do eingaben = 1 /* Unendliche Schleife "ISPEXEC DISPLAY PANEL(SKAT)" /* Panel ausgeben, Daten einlesen if pre = 1 then exit /* Notausgang zum Abbrechen - PF3 if name = "*" then leave eingaben /* Ende der Eingabe if wordpos(name,spieler) = 0 then do /* 1st Name schon da? konten.name = punkte /* Nein, dann Punkte eintr. spieler = spieler name /* und Spieler merken end else konten.name = konten.name + punkte /* Punkte addieren end eingaben
*/ */ */ */ */ */ */ */
/ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /
/* Teil 2: Ausgeben der Ergebnisse
*/
/ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /
say "Ergebnisse des Skatturniers vom "date() say left("Name",15)"Kontostand" say copies("-",25) do is = 1 to words(spieler) name = word(spieler,is) say left(name,15)right(konten.name,10) end is say copies("-",25) exit Programm 5 SKAT: REXX Prozedur für das Skat Turnier
218
11 Einführung in die Programmiersprache REXX
Sie sehen, hier wird der Name des Spielers als Index für die Adressierung im Stem benutzt. Das ist eben das Besondere an den Sterns im REXX, dass die „Indizes" auch Texte sein können! Wie Sie auch leicht erkennen können, hat die Sache einen Haken. Man muss sich hierbei die Namen, die im Stem als Index vorkommen können, in einem weiteren Textfeld merken, denn sonst weiß man zum Zeitpunkt der Auswertung ja nicht, welche Namen überhaupt existieren und welche Sterns man adressieren kann. Natürlich kann man auch Zahlen als Index nehmen. Dies ist in der Praxis die am häufigsten verwendete Indexart. Aber die Möglichkeit auch normale Texte als „Index" benutzen zu können ist ziemlich „cool"! Bei allen mir bekannten Programmiersprachen habe ich eine solche elegante Art der Indizierung bisher nicht erlebt. Auf den Ausdruck des Panels SKAT verzichte ich hier. Dies ist ein sehr einfaches Panel mit zwei Eingabefeldern für den Namen und die Punktezahl. Ich habe das Programm aufgerufen und einige Ergebnisse eingegeben. Hier der Ausdruck: Ergebnisse des Skatturniers vom 7 Apr 2004 Name Kontostand HERR MEIER SCHULZE HEROLD
11.11.1
23 40 -33 77
STEMS mit Nullstring initialisieren
Das folgende Programmbeispiel macht die Wirkung von Nullstring Zuweisungen bei Sterns deutlich: /* DOC: REXX NULLSTR /* DOC: Demonstration von Nullstrings in Sterns /* (c) LANZT
*/ */ am: 23 Apr 2004 */
/ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /
hugo. hugo.l hugo.3 hans.l hans.2 do i = say end i
« *" /* Stem wird mit Nullstring initialisiert */ = 10 = 20 = 111 = 222 1 to 5 left(">"hugo.i""hans.i""hugo.i.k""hugo.i.k" 0 & pilot_paket then do if (wordpos("COP",ingrps) > 0) then call cop_verarb if (wordpos("MAC",ingrps) > 0) then call mac_verarb end
2. Beispiel zum IF Befehl if syst = "1" , & notfall_paket £ Apilot_paket then do " FTINCL VINTEXTR" if rc > 0 then call ispf_error rc " aus FTINCL VINTEXTR" else say exname time(),. "Release Step für ARCH Versandjobs eingefügt" end
3. Beispiel zum IF Befehl if sql_ca_msg.0 > 0 then do ica = 1 to sql_ca_msg.0 say exname strip(sql_ca_msg.ica) end ica
Bei diesem Beispiel können Sie sehen, dass in einem IF Befehl nicht nur eine DO Gruppe, sondern auch eine DO Schleife begonnen werden kann.
12.7
INTERPRET - Befehle generieren
Der INTERPRET Befehl erzeugt aus Konstanten und Variablen einen REXX Befehl und fuhrt diesen dann sofort aus. Damit kann man dynamisch REXX Befehle generieren und ausfuhren. INTERPRET ausdruck ausdruck Der Inhalt von ausdruck wird aufgelöst und der dadurch entstehende REXX Befehl kommt sofort zur Ausführung. Der ausdruck besteht in der Regel aus Literalen und Variablen, die den auszuführenden Befehl bilden. Den INTERPRET Befehl richtig anzuwenden, macht dem Anfänger zunächst einige Schwierigkeiten. Deshalb werde ich die Arbeitsweise des INTERPRET Befehls an einigen Beispielen zeigen. Wie meistens in diesem Buch, sind diese Beispiele aus einigen meiner Praxisprogramme entnommen. 1. Beispiel zum INTERPRET Befehl Ich habe für eine Anwendung ein internes Unterprogramm entwickelt, das mithilfe von ISPF I/O Services eine Datei einliest. Da ich dieses Unterprogramm für alle Lesevorgänge des Programms nutzen möchte, soll der Name des Sterns (ohne Punkt), in dem die Datensätze
240
12 Die REXX Befehle
stehen als Variable beim Aufruf des Unterprogramms übergeben werden. Das Unterprogramm soll dann diesen Stem mit den Datensätzen füllen, wobei am Ende des Einlesevorgangs die Variable name.O die Anzahl der eingelesenen Sätze enthalten soll. Weiterhin soll vor dem Rücksprung aus dem Unterprogramm das Host Command Environment, das beim Aufruf des Unterprogramms aktiv war, wieder hergestellt werden. Ich habe aus dem Unterprogramm diejenigen Statements herausgezogen, welche die Übernahme des Namens des zu erzeugenden Stems und den Ablauf des Einlesens zeigen. Das Unterprogramm kann mit zwei oder auch drei Parametern aufgerufen werden. Deshalb ist die Übernahme der Argumente etwas aufwändiger als sonst üblich. Alle Stellen, an denen ich Statements weggelassen habe sind durch eine gepunktete Zeile gekennzeichnet. 057 058 059 060 061 062 063 064 065 066 067 068 069 070 071 072
daten_lesen=lmget: merk_address = address() /* Merke aktives Host Command Environment arg inparm iwp = words(inparm) select when iwp = 2 then do indsn = word(inparm,1) instem= word(inparm,2) /* Übernahme des Stem Namens */ inmem = "" end when iwp = 3 then do indsn = word(inparm,1) inmem = word(inparm,2) instem- word(inparm,3) /* Übernahme des Stem Namens */ end address "ISPEXEC"
093 094 095 096 097 098 099 100 101 102 103 104 105 106 107 108 109 110
/* Hier beginnt das Einlesen der Datensätze do izeile = 1 "LMGET DATAID ("inid" ) MODE (INVAR) DATAIOC (ZEILE) DATALEN (XNL) " , "MAXLEN(32760)" lmget_rc = rc select when lmget_rc = 0 then interpret instem".izeile = zeile" when lmget rc = 8 then do; interpret instem".0 = izeile-1" leave izeile; end; otherwise call dll_exit rc "LMGET bei daten_lesen_lmget"indsn inmem end /* select */ end izeile " LMCLOSE DATAID (" INID ") " " LMFREE DATAID (" INID ") " address (merk address) return
*/
Wir nehmen jetzt einmal an, dass beim aktuellen Aufruf des Unterprogramms für den zu erzeugenden Stem der Name „DATEI1" übergeben wurde und als Host Command Environment das TSO aktiv war. Aus den INTERPRET Befehlen entstehen die folgenden REXX Anweisungen:
241
12.7 INTERPRET - Befehle generieren Zeile 099:
Hier treffen wir die Annahme, dass die Laufvariable „IZEILE" gerade den Wert 55 hat. Aus Interpret instem" . izeile = zeile" wird nach Auflösung der Variablen: "DATEI1. izeile = zeile" Das jetzt entstandene Literal ist ein normaler REXX Befehl. Dieser wird jetzt ausgeführt, wobei noch die Laufvariable IZEILE in 55 aufgelöst wird. Zeile 101: Wenn das Dateiende erreicht ist, meldet die ISPF Funktion LMGET (Zeile 095) einen RC von 8. Aus interpret instem".0 = izeile-1" wird nach Auflösung der Variablen: "DATEI1.0 = izeile-1" Hier möchte ich Sie an die Ausfuhrungen erinnern, die ich anlässlich der Besprechung des DO Befehls bezüglich des Inhalts von Laufvariablen gemacht habe. Aus dem dort Gesagten geht hervor, dass man hier izeile-1 einsetzen muss, um die Anzahl der gelesenen Datensätze richtig zu ermitteln. Schauen Sie sich auch die Konstruktion der DO Schleife do izeile = 1 (Zeile 094) einmal genauer an. Diese Schleife wird mit dem Befehl leave izeile (Zeile 102) verlassen. Zeile 109: Vor dem Rücksprung aus dem Unterprogramm muss jetzt noch das beim Eintritt in das Unterprogramm aktive Host Command Environment wieder hergestellt werden. Das erledigen wir mit dem Befehl: address
(merk_address) .
Nachdem dieser Befehl ausgeführt wurde, ist sichergestellt, dass nach der Rückkehr aus dem Unterprogramm auch wieder das richtige Host Command Environment hergestellt ist. Hinweis Man könnte den Befehl address (merk address) auch so schreiben: address value (merk_address). Man könnte den Befehl auch mit INTERPRET ausführen. Das sähe dann so aus: interpret "address "merk_address. 2. Beispiel zum INTERPRET Befehl Ich habe schon weiter vorne in diesem Buch erwähnt, dass ich eine kleine Anwendung geschrieben habe, mit deren Hilfe ich die zuletzt von mir editierten Dateien anzeigen lassen kann, um diese dann erneut editieren zu können. Zu dieser Anwendung gehört das Programm #IMACR01. Für Steuerungszwecke müssen in dieser Anwendung einige Variable besetzt
242
12 Die REXX Befehle
werden. Da ich aber die Anwendung in mehreren ISPF Ebenen gleichzeitig benutze, müssen die Namen der Variablen die ISPF Ebenennummer enthalten. Die folgenden Statements zeigen, wie dies mithilfe des INTERPRET Befehls bewerkstelligt wird: address "ISPEXEC" "VGET (ZSCREEN) SHARED" interpret "rcsave"zscreen" = 'NO'" interpret '"VPUT (RCSAVE'zscreen') PROFILE"' interpret "pasave"zscreen" = 'NO'" interpret "'VPUT (PASAVE' zscreen') PROFILE'"
Wie Sie sehen, werden hier nicht nur originale REXX Befehle generiert, sonder auch ISPF Befehle. Da Letztere aber zur Ausfuhrung in Hochkommata stehen müssen, werden die beiden Literalbegrenzungszeichen (') und (") wechselweise so eingesetzt, dass ein brauchbares Ergebnis entsteht. Wenn man die INTERPRET Befehle einmal „übersetzt" und annimmt, dass die Variable ZSCREEN den Wert 4 hat, dann würde die folgende Befehlssequenz ablaufen: rcsave4 = 'NO' "VPUT (RCSAVE4) PROFILE" pasave4 = 'NO' "VPUT (PASAVE4) PROFILE"
3. Beispiel zum INTERPRET Befehl Dieses Beispiel stammt auch aus einem meiner Anwendungsprogramme. Es ist einigermaßen komplex. Deshalb ist es ja gerade so schön! Um diese Befehlssequenz für Sie verständlich zu machen, muss ich vorab einiges zur Ausgangssituation sagen, unter der die gezeigten Befehle ablaufen: Es handelt sich hierbei um ein Programm, das mithilfe eines Assembler Unterprogramms DB2 Tabellen liest und ausdruckt. Das notwendige SQL Statement wird vom Bediener mithilfe eines Panels eingegeben und vom Assembler Programm ausgeführt. Dabei erstellt das Assembler Programm, bevor es die Kontrolle wieder an das rufende REXX Programm zurückgibt, folgende Daten in REXX Variablen und Sterns bereit: • •
•
Die Variable S Q L N R O W S enthält die Anzahl der gelesenen Datenzeilen. Der Stem SQL CN. (CN steht für Column Name) enthält die Namen der Spalten aus der DB2 Tabelle, die durch das SQL Statement bestimmt wurden. Dabei enthält SQLCN.O die Anzahl Spalten, die im SQL Statement benannt wurden. In einem weiter vorne liegenden Programmteil wurde der Stem SPALTENL. besetzt, der zu jeder Spalte die für den Ausdruck notwendige Spaltenbreite ermittelt.
Hier nun der Programmteil, der die Werte in den Stem ZEILE, überträgt, der dann zur Anzeige kommt: do row = 1 to sql_nrows io = io + 1 zeile.io = filier
243
12.7 INTERPRET - Befehle generieren do col = 1 t o SQLCN.O i n t e r p r e t "wert = " s q l _ c n . c o l " . r o w " zeile.io = zeile.io!!left("'"wert"'",spaltenl.col-l)"," end c o l zeile.io = zeile.io!!' ' z e i l e . i o = overlay(" " , z e i l e . i o , l a s t p o s ( " , " , z e i l e . i o ) , 2 ) end row Erklärung
Nehmen wir einmal an, die Laufvariable ROW stünde auf 5 und die Laufvariable COL auf 3. Dann ergibt sich nach der Ersetzung der Laufvariablen COL und ROW folgende Situation: SQL_CN.3 enthält den Text PRI DATE. Somit entsteht das Statement: wert =
PRI_DATE.5
PRI DATE. 5 enthält, wie im Ausdruck zu sehen, den Text: 20040421, Hier jetzt der Ausdruck, nachdem das Programm gelaufen ist: —* Echoprint des SELECT Statements SELECT PRI_OBJ, PRI_TYP, PRI_DATE, PRI_TIME FROM EPQMS.CROSS1 WHERE PRI TYP = 'REXX' AND PR! OBJ LIKE '#IM%' ORDER BY PRI OBJ;
— * DOC: SELECT-AUSGABE FUER TABELLE: EPQMS.CR0SS1 - - * DOC: AUS DEM DB2 SUBSYSTEM: DBT1 Gelesene Saetze: 14 —* DOC: ERSTELLT: 21 APR 2004 14:47:28 —
*
* * *
—
* *
—
* *
* - -
PRI OBJ '#IM ' #IMACROA' '#IMACROI' '#IMACROI' '#IMACR02' '#IMACR02' ' #IMEXECE' '#IMEXECE' ' #IMEXEC1' '#IMEXEC1' ' #IMEXE1 ' 1 #IMINIT ' 1 #IMM '#IMUSE '
PRI_TYP 'REXX 'REXX 'REXX 'REXX 'REXX 'REXX 'REXX 'REXX 'REXX 'REXX 'REXX 'REXX 'REXX 'REXX
,'20031127' ,'20040405' ,'20020828' ,'20040421' ( 1 t ,'20040421' ,'20020606' ,'20020606' ,'20020708' ,'20020708' ,'20020708' ,'20031127' ,'20031126' ,'20031126'
PRI TIME '09 37 02 '10 31 41 '13 28 03 '14 06 30 '13 13 55 '13 13 55 •15 56 59 '15 56 59 '18 21 40 '18 21 40 '18 18 42 '11 06 27 '16 11 08 '15 52 22
Ich hoffe, es ist mir gelungen, Sie für den INTERPRET Befehl zu begeistern! Man kann damit, wenn erforderlich, sehr elegante Lösungen „zaubern". Und in manchen Fällen ist er einfach unerlässlich!
244
12.8
12 Die REXX Befehle
NUMERIC - Rechenoptionen setzen
Bevor ich mich diesem Thema direkt zuwende, muss ich Ihnen erklären, wie das REXX Daten und hier speziell Zahlen intern speichert. Falls Sie schon einmal in einer anderen Programmiersprache als REXX programmiert haben, kennen Sie den Aufwand, den Sie zur Definition Ihrer Variablen dort leisten müssen. Da gibt es Binärdaten, die in Feldern von 16, 32 oder 64 Bit abgelegt werden können. Es gibt Dezimaldaten mit bis zu 31 Dezimalziffern. Dazu kommen noch die verschiedenen Varianten der Floating Point Daten. Dies alles können Sie bei REXX vergessen! Denn: Regeln REXX legt grundsätzlich alle Daten in Textfeldern ab. Also auch die Daten, die Zahlen enthalten. Die Zahlen werden, bevor sie an Rechenoperationen teilnehmen, in für das zugrunde liegende System passende Zahlenformate gebracht und nach Abschluss der Rechenoperation wieder in Textfelder konvertiert. Dies gilt für jede einzelne Rechenoperation innerhalb eines Befehls. Aus dieser sehr einfachen Regel ergibt sich, dass es natürlich für die Zahlen eine definierte Breite geben muss, damit die Zahlendarstellung beherrschbar bleibt. Beispiel Wenn der Befehl X = 2/3 ausgeführt wird, entsteht ein unendlicher Bruch. Da in REXX die gebrochenen Zahlen nicht in Worten wie z.B. „Short Floating Point" oder „Long Floating Point" gespeichert werden, bei denen die Anzahl Stellen nach dem Komma automatisch durch die Wortlänge begrenzt ist, sondern als ungepackte Zahlen im EBCDIC Format, würde man hier eine unendlich lange Zahl speichern müssen. Das heißt, es muss irgendwo festgelegt sein, wie viele signifikante Ziffern bei einer solchen Zahl gespeichert werden sollen. Wenn die Standardbreite von NUMERIC DIGITS 9 aktiv ist, würde die Zahl X wie folgt dargestellt und auch so in EBCDIC Zeichen gespeichert: 0.666666667. Das heißt, dass für die Speicherung von X intern 11 Byte belegt werden. Den Befehl NUMERIC gibt es mit drei Hauptfunktionen, von denen ich aber nur zwei besprechen werde. NUMERIC DIGITS
zahl
Hiermit wird festgelegt, wie viele signifikante Ziffern von einer Zahl gespeichert werden. Diese Festlegung gilt immer ab sofort und so lange, bis eine Änderung mit einem neuen NUMERIC DIGITS Statement erfolgt oder das Programm endet.
12.8 NUMERIC - Rechenoptionen setzen
245
zahl Hierbei muss es sich um eine ganze Zahl handeln. Natürlich ist auch die Angabe mithilfe einer Variablen möglich. Der Standardwert ist 9. Hinweis So lange sich die Zahlen in einem Programm unterhalb von ABS(999999999) bewegen, braucht man den Wert für NUMERIC DIGITS nicht zu ändern. Sobald aber während des Programmdurchlaufs eine Zahl entsteht, die diesen Zahlenraum sprengt, muss man entweder vorher die NUMERIC DIGITS entsprechend erhöht haben, oder man bekommt einen Programmabbruch. Siehe hierzu auch das Kapitel „Interessantes Problem im R E X X " auf Seite 386. Wenn man dies alles liest, könnte man versucht sein, am Beginn eines jeden R E X X Programms einfach den Befehl NUMERIC DIGITS 50 einzugeben. Damit wäre man dann wahrscheinlich immer auf der sicheren Seite. Aber dabei muss man natürlich bedenken, dass dann alle gebrochenen Zahlen, die entsprechend viele Stellen hinter dem Komma haben mit 50 signifikanten Ziffern gespeichert, und was noch viel schlimmer ist, auch berechnet werden. Beispiel Die folgenden Befehle ergeben: numeric digits 70 b = 10 + .5e-67 say b 10.00000000000000000000000000000000000000000000000000000000000000000005
NUMERIC FUZZ
zahl
Hiermit wird festgelegt, wie viele Ziffern einer Zahl mit Dezimalstellen von rechts her gerundet werden, bevor eine Vergleichsoperation ausgeführt wird. Diese Festlegung gilt immer ab sofort und so lange, bis eine Änderung mit einem neuen NUMERIC FUZZ Statement erfolgt oder das Programm endet. zahl Hierbei muss es sich um eine ganze Zahl handeln. Natürlich ist auch die Angabe mithilfe einer Variablen möglich. Der Standardwert ist 0. Die Zahl muss immer kleiner sein als der aktuelle DIGITS Wert. Die Wirkungsweise von NUMERIC FUZZ kann man am besten verstehen, wenn man sich dazu ein Beispiel anschaut:
246
12 Die REXX Befehle
numeric digits numeric fuzz 0 if 4.9999 = 5 if 4.9999 < 5 numeric fuzz 1 if 4.9999 = 5 if 4.9999 < 5
5 ergibt Bedingung nicht erfüllt ergibt Bedingung erfüllt ergibt Bedingung erfüllt ergibt Bedingung nicht erfüllt
Um dieses Beispiel zu verstehen, muss man sich vergegenwärtigen, dass REXX normale Vergleichsoperationen (also nicht die exakten mit den Doppeloperatorzeichen) zwischen zwei Zahlen dergestalt durchfuhrt, dass zuerst die zweite Zahl von der ersten subtrahiert wird und dann das Ergebnis mit Null verglichen wird. Wenn man bei den obigen IF Statements, die hinter dem NUMERIC FUZZ 1 liegen, die gezeigten Ergebnisse bekommt, dann liegt das an folgendem Effekt: Dadurch, dass FUZZ kleiner als DIGITS ist, wird vor der Subtraktion gerundet. Aus 4.9999 wird die ganze Zahl 5. Tipp Falls Sie einmal mit REXX umfangreiche Berechnungen durchfuhren müssen, bei denen auch Vergleiche von gebrochenen Zahlen vorkommen, die wegen Unterschieden in den hinteren Nachkommastellen nicht so ausfallen, wie Sie es erwarten, dann erinnern Sie sich an NUMERIC FUZZ. Die gerade aktiven Werte fur NUMERIC kann man sich auch mit entsprechenden Funktionen anzeigen lassen: say "NUMERIC DIGITS hat jetzt den Wert: "digits() say "NUMERIC FUZZ hat jetzt den Wert: "fuzz() exit
Hier der Ausdruck: NUMERIC DIGITS hat jetzt den Wert: 9 NUMERIC FUZZ hat jetzt den Wert: 0
12.9
PARSE - Texte zerlegen
Der PARSE Befehl ist einer der stärksten Befehle der REXX Sprache. Man kann damit auf elegante Art Zerlegungen von Texten durchführen, Daten vom Stack oder vom Terminal lesen und Informationen über das gerade ausgeführte Programm erhalten. Sie haben eine seiner Varianten schon bei der Besprechung des ARG Befehls im Kapitel „ARG - Die Übernahme von Parametern" auf Seite 227 kennen gelernt. Wir werden uns nun weitere Ausprägungen anschauen. Auch hier möchte ich Ihnen einige Beispiele aus der Praxis vorstellen.
12.9 PARSE - Texte zerlegen
247
Aber zunächst einmal hier ein Überblick über die verschiedenen Varianten des Parse Befehls in Form einer Tabelle: PARSE Typ PARSE ARG PARSE EXTERNAL
PARSE NUMERIC PARSE PULL PARSE SOURCE PARSE VALUE PARSE VAR PARSE VERSION
Funktionen Zerlegt Übergabeparameter bei Programmaufrufen ganz allgemein. Liest Daten vom Terminal bei Online Aufrufen von Programmen. Bei Batch Aufrufen wird von SYSTSIN gelesen. Wenn keine Daten (mehr) vorhanden sind, wird ein Nullstring zurückgegeben. Gibt die gerade aktiven Werte für die drei NUMERIC Optionen DIGITS FUZZ FORM zurück. Liest den TSO Data Stack aus. Wenn dieser leer ist, arbeitet dieser Befehl wie PARSE EXTERNAL. Gibt Informationen über den Quellkode des gerade ablaufenden Programms zurück. Zerlegt einen Ausdruck. Zerlegt eine Variable. Gibt Informationen über den REXX Interpreter zurück, unter dem das Programm ausgeführt wird.
Tabelle 25: Varianten des PARSE Befehls
Regeln •
•
•
•
Bei allen PARSE Befehlen kann als zweites Wort UPPER mitgegeben werden. Dadurch werden die Ergebnisse in Großbuchstaben zurückgegeben. Genau so, wie es der Befehl ARG auch macht. In den zu zerlegenden Daten spielt das Blank eine besondere Rolle: Wenn in der Variablenliste keine Trennzeichen oder Aufsetzpunkte angegeben sind, erfolgt die Trennung an den im Text enthaltenen Blanks. In der Variablenliste kann der Punkt als Platzhalter für Variable verwendet werden. Zur Sicherheit benutze ich den Punkt immer als letzte Variablenposition. Er sammelt dann alles, was eventuell im Text noch hinter den von mir benötigten Positionen steht. Ansonsten würde dieser Teil noch zusätzlich in der letzten zugewiesenen Variablen stehen. Variablen, denen bei der Zerlegung keine Werte zugewiesen werden konnten, enthalten Nullstrings.
Gestaltungsmöglichkeiten von Parse Masken Es gibt verschiedene Möglichkeiten, den Zerlegungsprozess in PARSE Befehlen zu steuern. Mit den folgenden Separierungszeichen in einer Maske (Template) kann man den Zerlegungsprozess des PARSE Befehls steuern: • • • •
Das Blank. Eine Zeichenkette. Variable, die Trennzeichen enthalten. Zahlen, die Aufsetzpunkte bestimmen.
248
12 Die REXX Befehle
Wir wollen uns jetzt die einzelnen Varianten des PARSE Befehls etwas genauer anschauen: 1. PARSE ARG Diesen Befehl habe ich bei der Besprechung des ARG Befehls schon ausfuhrlich behandelt. Siehe hierzu das Kapitel „ARG - Die Übernahme von Parametern" auf Seite 227. Der PARSE ARG Befehl ist der einzige PARSE Befehl, bei dem mehrere Eingabevariable aufgelöst werden können. Dies ist notwendig, um bei der Übergabe von mehreren Parameter Variablen beim Programmaufruf auch alle Parameter erfassen zu können. 2. PARSE VALUE ... WITH Hier kann als zu zerlegender Text ein Ausdruck angegeben werden. Der standardmäßige Seperator ist das Blank. Zwischen den einzelnen Worten können auch mehrere Blanks stehen. Der Befehl PARSE VALUE "Ich
heisse
Hugo
" WITH wl w2 w3
Ergibt: wl = "Ich", w2 = "heisse", w3 = "
Hugo
Hier stellt sich jetzt die Frage: „Warum enthält die Variable W3 nicht nur das Wort „Hugo", sondern auch noch drei Blanks davor und vier Blanks dahinter, während W2 nur den Text „heisse" enthält, wo doch dort auch drei Blanks davor stehen? Zur Beantwortung dieser Frage müssen wir uns jetzt eine besondere Regel bei der Anwendung des PARSE Befehls anschauen: Regel Der letzten Variablen im Template eines PARSE Befehls werden sämtliche Zeichen, die nach der Zuweisung des Wertes der vorletzten Variablen noch vorhanden sind, zugewiesen. Warum gibt es diese Regel? Diese Regel ist aus der Überlegung heraus entstanden, dass man bei der Zerlegung von Texten die Möglichkeit haben sollte, in mehreren Schritten vorzugehen, um ganz unterschiedlich strukturierte Texte zerlegen zu können. Daraus folgt dann, dass es schon sinnvoll sein kann, immer der letzten Variablen den gesamten Rest des Textes ohne irgendwelche Abstriche zuzuweisen. Man kann dann diese letzte Variable in einem nächsten PARSE Schritt weiter zerlegen. Wie kann man diese Regel umgehen? Diese Regel kann man leicht umgehen, indem man hinter der letzten regulären Variablen eine Platzhaltervariable, nämlich einen Punkt, einfügt. Damit würde dann das obige Statement so aussehen: PARSE VALUE "Ich
heisse
Hugo
" WITH wl w2 w3 .
12.9 PARSE - Texte zerlegen
249
Ergibt: wl = "Ich", w2 = "heisse", w3 = "Hugo" Hinweis Diese Regel gilt für alle Versionen des Parse Befehls. Beispiel für die Verwendung von PARSE VALUE ... WITH In diesem Beispielprogramm werden DATE und TIME Werte auf verschiede Arten zerlegt. 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
/* DOC: REXX PARSE1 ****************************************/ /* DOC: Beispiel für PARSE VAR mit verschiedener Separierung */ /* (c) LANZT am: 20 Jan 2004 */ /*************************************************************/ say date() say time() /* Das Trennzeichen ist Blank. */ parse value date("N") with tag monat jahr . say "Trennzeichen ist Blank >"tag""monat""jahr"< /* Mit Verwendung von Zahlen für ablosute Aufsetz-Position. */ parse value date("S") with jjjj 5 mm 7 tt . say "Absolute Position >"jjjj""mm""tt""jjjj""mm""tt""std""min""sek""std""min""sek""std""min""sek""std""min""sek" 8 then call ispf_error rc
253
12.10 PROCEDURE - Interne Unterprogramme Und so sieht das Unterprogramm ISPF_ERROR aus: / * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /
/* ispf_error
*/
/ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /
ispf_error: arg rc instr = sigl-1 say exname copies("-",68) say exname "RC="rc if zerrlm "ZERRLM" then say exname strip(zerrlm) say exname "SOURCE: "instr strip(sourceline(instr)) say exname copies (" -11,68) maxrc = 8 exit
Ich habe in das Programm mit dem Namen CRSREF, aus dem die obigen Teile stammen, einen Fehler eingebaut, indem ich den Panel Namen absichtlich verändert habe und es dann laufen lassen. Die Fehlermeldung sieht somit wie folgt aus: CRSREF: CRSREF: RC=12 CRSREF: Panel not found. CRSREF: SOURCE: 92 "TBDISPL "tab2" PANEL(XCRSPAN2)" CRSREF:
12.10
PROCEDURE - Interne Unterprogramme
Man kann interne Unterprogramme und Funktionen auf zwei verschiedene Arten gestalten: • •
Mit PROCEDURE Anweisung. Ohne PROCEDURE Anweisung.
12.10.1
Interne Unterprogramme mit PROCEDURE Anweisung
Bei diesen Unterprogrammen muss in der Anweisung, die das Unterprogramm benennt, hinter dem Namen des Unterprogramms die Option PROCEDURE aufgenommen werden. Diese Option bewirkt, dass alle Variablen, die im Unterprogramm vorkommen von denjenigen des Hauptprogramms abgeschottet werden, und zwar auch die gleichnamigen. Das heißt, dass die Variablen zwischen beiden Programmen wechselweise unbekannt sind. Will man einige Variable trotzdem in beiden Programmen bekannt machen, muss man dazu die Option EXPOSE benutzen. Alle hinter EXPOSE aufgeführten Variablen sind dann in beiden Programmen bekannt. Vorteil: Man muss sich bei der Benutzung von Variablen im Unterprogramm keine Gedanken darüber machen, ob die einzelnen Variablen nicht eventuell auch im Hauptprogramm benutzt werden und man sie deshalb im Unterprogramm tunlichst nicht überschreiben sollte. Es sei denn, dies ist beabsichtigt.
254
12 Die REXX Befehle
Nachteil: Man muss alle Variable, die sowohl im Hauptprogramm als auch im Unterprogramm benötigt werden, entweder in einer EXPOSE Option angeben oder durch Parameterübergabe bekannt machen. Beispiel packcalc: procedura expose db2sys exname syst #pin pinmem. #pac pacmem., lokationen. mittw. inst, testkz
Wie Sie in diesem Beispiel aus der Praxis sehen, werden nicht nur einzelne Variable, sondern auch Sterns „EXPOSED".
12.10.2
Interne Unterprogramme ohne PROCEDURE Anweisung
Am Eingangspunkt des Unterprogramms fehlt die Option PROCEDURE. Alle Variablen des Haupt- und des Unterprogramms sind wechselweise bekannt. Vorteil: Man hat alle Variablen in beiden Programmteilen verfügbar. Wenn man im Unterprogramm eine Variable neu definiert, ist diese nach dem Rücksprung auch im Hauptprogramm bekannt. Nachteil: Man muss sorgfältig darauf achten, dass man im Unterprogramm nicht unbeabsichtigt Variable des Hauptprogramms ändert. Ganz dramatische Effekte ergeben sich, wenn man die Laufvariable einer DO Schleife sowohl im Haupt- als auch im Unterprogramm benutzt und der Unterprogrammaufruf aus der entsprechenden DO Schleife des Hauptprogramms heraus erfolgt. Regel Die PROCEDURE Anweisung darf in externen REXX Unterprogrammen nicht verwendet werden, denn bei externen Prozeduren sind deren Variablen im Hauptprogramm ja so wie so nicht bekannt.
12.11
QUEUE - Mit dem TSO Stack arbeiten
In diesem Kapitel werde ich Ihnen zeigen, wie man elegant Daten in einem internen Zwischenspeicher ablegen und wieder auslesen kann. Das Gebiet der DATA STACKS ist sehr umfangreich. Ich werde hier nur den Teil beschreiben, der sich mit dem Befehl QUEUE beschäftigt.
12.11 QUEUE - Mit dem TSO Stack arbeiten 12.11.1
Der TSO/E Data
255
Stack
Bevor ich mich dem Befehl QUEUE zuwende, gebe ich Ihnen eine kleine Einfuhrung in die Technik des TSO/E Data Stack: Der TSO/E Data Stack ist ein Bereich im virtuellen Speicher, den man zur Zwischenspeicherung von Daten aller Art nutzen kann. Der Data Stack ist in allen REXX Programmen, die in einer Task laufen, bekannt. Dadurch eignet sich der Data Stack hervorragend zum Austausch von Daten zwischen internen und externen REXX Unterprogrammen. Die Daten werden Satz für Satz in den Data Stack geschrieben. Ein einzelner Satz kann bis zu 16 MB lang sein. Der TSO/E Data Stack wird nur durch den verfügbaren Hauptspeicher begrenzt und er kann mit zwei verschiedenen Befehlen beschrieben werden:
I
Hinweis ln der IBM Broschüre TSO/E REXX Reference steht, dass ein Eintrag im Stack maximal 16MB lang sein kann. In der IBM Broschüre TSO/E REXX User's Guide steht, dass ein Eintrag (data item) nur durch die Größe des verfügbaren Speichers begrenzt ist. Ich habe die Sache überprüft. Die IBM Broschüre TSO/E REXX Reference hat recht: 16 MB ist die Maximallänge für einen Eintrag!
QUEUE ausdruck Dieser Befehl schreibt die Datensätze immer an das Ende des Stacks. Das bedeutet, dass der zuletzt geschriebene Satz beim Lesen auch als letzter gelesen wird. Diese Technik bezeichnet man auch als „first in first out" (FIFO). Wenn man einen Stack erstellt, um daraus eine Datei zu erzeugen, dann ist FIFO immer richtig. Denn bei einer Datei erwartet man normalerweise, dass der zuerst geschriebene Datensatz beim Lesen auch wieder als erster erscheint. PUSH ausdruck Dieser Befehl schreibt die Datensätze immer an den Anfang des Stacks. Das bedeutet, dass der zuletzt geschriebene Satz beim Lesen als erster gelesen wird. Diese Technik bezeichnet man auch als „last in first out" (LIFO).
Ein QUEUE Befehl ohne ausdruck erzeugt einen Leereintrag im Stack. Dieser Leereintrag wird von verschiedenen Befehlen (z.B. dem EXECIO Befehl) benötigt, um das Ende der Daten im Stack zu erkennen. Die folgenden Befehle können Daten aus dem Stack auslesen: • • • •
PULL EXECIO SUBMIT DSN (für die Durchführung von DB2 Utility Funktionen)
Vermutlich gibt es noch viel mehr Programme und Systeme, mit denen man vom Stack Daten lesen kann.
256
12 Die REXX Befehle
12.11.2
Benutzungsmöglichkeiten fur den TSO/E Data Stack
Den TSO/E Data Stack kann man im REXX fur folgende Zwecke benutzen: Dynamisches Erstellen eines Batch Jobs mit anschließendem SUBMIT. Ausgeben und Einlesen von Dateien mittels EXECIO. Austausch von größeren Datenmengen zwischen internen und externen Unterprogrammen. 1. Beispiel: Submit eines Batch Jobs. Mit der Prozedur COMPRESS wird ein Compress Job submittet. Der Aufruf der Prozedur geschieht im Menü 3.4 vor dem DSN, der compressed werden soll. /* /* /* /*
DOC: DOC: DOC: (c)
REXX COMPRESS ************************************************/ Erzeugen und SUBMIT eines Compress Jobs für einen PDS. */ Aufruf im Menue 3.4 vor dem DSN */ Franz Lanz am: 21 May 1999 */
/*********************************************************************/
parse arg dsn " 1 "dsn" 1 " "ISPEXEC CONTROL ERRORS RETURN" "ISPEXEC VGET (ACCOUNT JOBCLASS MSGCLASS) PROFILE" if rc > 0 then do zedlmsg = "Fehler: Die Variablen ACCOUNT JOBCLASS MSGCLASS", "konnten nicht korrekt aus dem Profile Pool gelesen", "werden. Prozedur beendet." address "ISPEXEC" "SETMSG MSG(ISRZ001)" exit end uid = useridO jobname = uid!!jobsuff() queue "//"jobname" JOB ("account")"uid" COMPRESS'," queue "// NOTIFY="uid",MSGLEVEL=(0,0),MSGCLASS="msgclass"," queue "// USER="uid",CLASS="jobclass queue "//COMPRESS EXEC PGM=IEBCOPY,REGION=20M" queue "//SYSPRINT DD SYSOUT=* " queue "//SYSUT1 DD DISP=SHR,DSN="dsn queue "//SYSUT2 DD DISP=SHR,DSN="dsn queue "//SYSUT3 DD UNIT=VIODA,SPACE=(CYL,(10,10))" queue "//SYSUT4 DD UNIT=VIODA,SPACE=(CYL,(10,10))" queue "//SYSIN DD DUMMY" queue x = outtrap(text.) "submit *" x = outtrap("OFF") zedlmsg = text.2 "ISPEXEC SETMSG MSG(ISRZOOl) COND" exit Programm 9 COMPRESS: Submit eines Compress Jobs
2. Beispiel: Ausgeben einer Datei. Das in diesem Beispiel gezeigte Programm erstellt durch interne Rechenoperationen die Datenreihen für das Ausfüllen von Lottoscheinen für das Lottosystem 6 aus 49. Damit
12.11 QUEUE - Mit dem TSO Stack arbeiten
257
man die Datenreihen jederzeit nachschauen kann, werden die Ergebnisse eines Rechendurchlaufs als Member in einen PDS geschrieben. Der Name des Members wird wie folgt gebildet: LJJMMTT, JJMMTT wird aus der Date Funktion entnommen. Der DSN wird wie folgt gebildet: userid().LOTTO.ZAHLEN. Bei der Ausfuhrung des Programms muss die Ausgabedatei bereits existieren. /* /* /* /*
DOC: REXX LOTTO ************************************************/ DOC: Programm zum ausdrucken von Lottozahlen mit 6 aus 49 plus */ DOC: Zusatzzahl. */ (c) LANZT am: 19 Mar 2002 */
/*********************************************************************/
/* BEM: Das Programm arbeitet so, dass jede Zahl im Zahlenraum /* BEM: 1 bis 49 je einmal in den insgesamt 7 Gruppen vorkommt.
*/ */
/*********************************************************************/
do runde = 1 to 8 nn = "" /* Merkbereich der Zahlen der Runde do k = 1 to 7 nr = "" /* Merkbereich der Zahlen der Reihe t. = 0 do i = 1 to 7 do n = 1 until wordpos(x,nn) = 0 & wordpos(x,nr) = 0
*/ */
x = random(l,49) end n nr = nr x /* Zahlen der Reihe merken t.i = x end i call sort /* Die ersten 6 Zahlen der Reihe sortieren reihe = right(t.1,2) right(t.2,2) right(t.3,2) right(t.4,2), right(t.5,2) right(t.6,2) right(t.7,2) nn = nn nr /* Zahlen der Runde merken say reihe /* Kontrollausgabe der Zeile
queue reihe
/* Datenzeile in Stack schreiben
*/
*/
*/ */
*/
end k say copies("-",20)
queue copies("-",20) /* Trennzeile in Stack schreiben
*/
end runde dsn = userid()".LOTTO.ZAHLEN" member = "L"substr(date("S"),3) "alloc dd(out) dsn('"dsn"("member")') shr reu"
"execio "queuedO" diskw out (finis" "free dd(out)" exit
/*********************************************************************/
/* Bubble Sort für die ersten 6 Zahlen im Stem. Die Zusatzzahl darf /* nicht mit sortiert werden. Es wäre dann ja immer die höchste der /* Gruppe.
*/ */ */
/*********************************************************************/
sort: procedure expose t. do 1 = 1 to 6 do m = 1+1 to 6 s = t.l if t.m < s then do; t.l = t.m; t.m = s; end end m end 1 return Programm 10 LOTTO: Lottozahlen berechnen
258
12 Die REXX Befehle
Hier die ersten Gruppen der Lottozahlen, wie sie das Programm berechnet und in die Datei LANZT.LOTTC).ZAHLEN(L040427 geschrieben hat: 21 1 2 7 24 3 15
23 13 5 11 37 8 18
28 17 9 14 40 16 29
38 30 10 19 43 26 31
44 34 20 22 45 27 36
48 41 32 33 46 39 49
12 6 42 25 4 35 47
1 3 5 14 7 2 8
24 13 11 23 9 10 27
28 26 17 37 19 15 31
41 30 34 38 25 20 33
45 32 36 44 29 21 42
49 39 43 47 35 22 46
40 4 12 18 16 48 6
1 5 12 24 3 13 2
26 8 20 28 4 14 10
30 19 29 32 7 27 15
38 37 33 36 22 34 16
41 44 35 42 23 39 18
45 48 40 46 31 43 25
11 21 47 17 49 6 9
3. Beispiel: Austausch von Daten mit einem externen Unterprogramm. In dem folgenden Beispiel wird in einem REXX Hauptprogramm eine Datei, die Namen enthält, eingelesen. Diese Namen sollen in einem externen Unterprogramm sortiert werden. Die sortierten Namen sind danach wieder an das Hauptprogramm zurückzugeben. Hier zunächst das Hauptprogramm NAMSORT: /* /* /* /*
DOC: REXX NAMSORT DOC: Beispiel für den Datenaustausch zwischen Haupt- und UnterDOC: programm über den Data Stack (c) LANZT am: 27 Apr 2004
*/ */ */ */
/ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /
"alloc dd(in) dsn('LANZT.NAMEN.UNSORT') shr reuse" "execio * diskr in (finis" /* direkt in den Data Stack lesen "free dd(in)" call nsort do i = 1 to queued () pull name say name end exit Programm 11 NAMSORT: Hauptprogramm für Sort Beispiel
Die wichtigen Befehle sind grau unterlegt.
*/
12.11 QUEUE - Mit dem TSO Stack arbeiten
259
Und jetzt das Unterprogramm NSORT: /* /* /* /*
DOC: REXX NSORT DOC: Unterprogramm zum Sortieren eines Datenbestandes, der im DOC: Data Stack übergeben und sortiert wieder zurückgegeben wird. (c) LANZT am: 27 Apr 2004
*/ */ */ */
/ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /
nsort: ianz = queued () / * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /
/* Übertragen des Data Stack Inhalts in einen Stem
*/
/ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /
do i = 1 to ianz; pull name; t.i = name; end i /*********************************************************************/ /* Sortieren des Stems mittels Bubble Sort
*/
/ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /
do 1 = 1 to ianz do m = 1+1 to ianz = t.l s if t.m < s then do; t.l = t.m; t.m = s; end end m end 1 /*********************************************************************/ /* Übertragen des Stems in den Data Stack */ fir********************************************************************/ do i = 1 to ianz; queue t.i; end i return Programm ¡2 NSORT: Unterprogramm filr Sort Beispiel
Tipp Vergessen Sie niemals den abschließenden QUEUE Befehl ohne Operanden, wenn der Data Stack von einem Befehl ausgelesen werden soll, der diesen Nullstring erwartet. Dieser Fehler kann sich sehr unangenehm wie folgt bemerkbar machen: Wenn Sie die Prozedur online ausfuhren und der Data Stack wird durch einen EXECIO Befehl oder SUBMIT Befehl ausgelesen, dann endet der Leseversuch des entsprechenden Befehls erst bei Erreichen eines Nullstring Eintrags. Wird dieser nicht gefunden, dann versucht der Befehl weitere Daten vom Terminal, nämlich Ihrem Bildschirm zu lesen. Dies äußert sich dann darin, dass sich nach dem Aufruf der Prozedur nichts mehr am Bildschirm bewegt, worüber Sie sich dann wundern. Erst wenn Sie dann ENTER drücken, bekommt der Lesebefehl seinen heiß ersehnten Nullstring und es geht weiter. Bei dem Befehl EXECIO können Sie den abschließenden Nullstring weglassen, wenn Sie den Befehl so schreiben:
" e x e c i o "queuedO" diskw o u t
(finis".
Siehe hierzu auch das obige Beispiel in dem LOTTO Programm. Dieser Trick funktioniert beim SUBMIT Befehl allerdings nicht, denn dort bedeutet der Stern nur, dass vom Stack gelesen wird. Allerdings können Sie bei der Verwendung des SUBMIT Befehls das Ende des Datenstroms mit einer speziellen Endezeile markieren, die genau zwei Zeichen enthält. Die zwei Zeichen dieser Endezeile sind dann bei der Ausfuhrung des SUBMIT Befehls anzugeben:
queue "XX" "submit * end(XX)".
260
12.12
12 Die REXX Befehle
SAY - Texte ausgeben
Mit dem SAY Befehl kann man beliebige Texte aus einem REXX Programm heraus ausgeben. Dieser Befehl ist als Testhilfe und für die Ausgabe von Kontrollinformationen sehr gut geeignet. Wenn ein REXX Programm in einem Batch Job ausgeführt wird, erfolgt die Ausgabe der SAY Meldungen über das DD Statement SYSTSPRT. In den vorhergehenden Programmbeispielen sind schon eine Reihe von SAY Befehlen benutzt worden. Deshalb verzichte ich hier auf weitere Beispiele zum SAY Befehl.
12.13
SELECT - Bedingte Befehlssequenzen
Mit dem SELECT Statement kann man sehr effiziente Bedingungssteuerungen „bauen". Vor allem dann, wenn von einer Reihe von Bedingungen nur die Anweisungen, die bei einer dieser Bedingungen erforderlich sind, ausgeführt werden sollen oder dürfen. Neben der DO Gruppe ist das SELECT Statement das wichtigste Programmelement, um GOTO freien Kode zu erzeugen. Regeln • • •
• • • •
•
•
Das SELECT Statement eröffnet eine Gruppe von Bedingungsabfragen. Es muss mit einem END abgeschlossen werden. Die Bedingungsabfragen können aus beliebig vielen WHEN Statements bestehen, die von oben nach unten durchlaufen werden, bis eine der WHEN Bedingungen erfüllt ist. Wenn eine der WHEN Bedingungen erfüllt ist, werden die dazugehörenden Befehle ausgeführt. Danach wird die SELECT Sequenz an dem zum SELECT Statement gehörenden END verlassen. Wenn keine der WHEN Bedingungen erfüllt ist, dann wird die im OTHERWISE Statement stehende Anweisung ausgeführt. Das OTHERWISE Statement ist obligatorisch. Es ist unmittelbar vor dem zum SELECT gehörenden END Statement einzufügen. Hinter OTHERWISE können beliebig viele Statements folgen, ohne dass diese in eine DO Gruppe eingeschlossen sein müssen. Das Fehlen der OTHERWISE Bedingung wird vom Interpreter erst dann bemerkt, wenn bei einem aktuellen Programmdurchlauf keine der WHEN Bedingungen erfüllt ist. In diesem Fall erfolgt ein Programmabbruch. Hier können Sie also eine Zeitbombe in Ihr Programm einbauen. Sobald eine der WHEN Bedingungen erfüllt ist, bleiben die danach noch folgenden Bedingungen unberücksichtigt und deren Programmkode wird auch nicht mehr durchlaufen. Das bedeutet, dass man immer die beim Durchlauf des Programms wahrscheinlich am häufigsten erfüllte WHEN Abfrage an den Anfang der WHENs stellen sollte. Hinter dem Schlüsselwort WHEN können alle Möglichkeiten, die auch das IF Statement kennt, genutzt werden.
261
12.13 S E L E C T - B e d i n g t e B e f e h l s s e q u e n z e n
1. Beispiel: E i n f a c h e S E L E C T S t r u k t u r . D i e s e s Beispiel zeigt eine e i n f a c h e S E L E C T Struktur. H i e r w e r d e n auf G r u n d v o n einzelnen A u s w a h l z e i c h e n K l a r n a m e n eingesetzt. select when substr(in.i,54,1) when substr(in.i,72,1) when substr(in.i,72,1) when substr(in.i,72,1) when substr(in.i,72,1) when substr(in.i,72,1) otherwise nop end /* Select */
= = = = = =
"A" "P" "M" "I" "S" "B"
then then then then then then
iobjtname iobjtname iobjtname iobjtname iobjtname iobjtname
= = = = = =
"CICSUPRO" "CICSHAPRO" "CICSMASKE" "INCLUDE" "TEXT" "DB2BIND"
2. Beispiel: E t w a s k o m p l e x e r e S E L E C T S t r u k t u r . H i e r sind die a u s z u f ü h r e n d e n B e f e h l e in D O G r u p p e n a n g e o r d n e t . select when iobjtname = iobjname = iobjtname = iobjspname = end when iobjtname = iobjtname = iobjspname = end when iobjtname = iobjtname = iobjspname = end otherwise iterate end /* Select */ 3.
"CICSHAPRO" then do "L"iobjname "LOADCICSHAPR" "LOAD" "CICSUPRO" then do "LOADCICSUPRO" "LOAD" "CICSMASKE" then do "LOADCICSMASK" "LOAD" i
Beispiel: K o m p l e x e S E L E C T S e q u e n z . H i e r w e r d e n , a b h ä n g i g v o m E r g e b n i s der S Y S D S N F u n k t i o n , v e r s c h i e d e n e A k t i o n e n ausgeführt. sysdsnret = sysdsn("'"ausdsn"'") select when sysdsnret = "OK" & reuse = "J" then do x = listdsi("'"ausdsn"'") if sysdsorg = "PO" then do zedsmsg = "DSORG falsch" zedlmsg = "Die angegebene Datei ist eine PO Datei. Diese ist", "als Ausgabedatei nicht zulässig" "ISPEXEC SETMSG MSG(ISRZ001)" return(4) end /******************************************,**.*****/
/* Eventuelle ENQs auf der Quelldatei ermitteln */ /***************************************************/ enqs = "" x = outtrap(has.)
262
12 Die REXX Befehle address "TSO" "WHOHAS "ausdsn whore = ro x = outtrap("OFF") if whore > 0 then do select when whore = 11 then do zedsmsg = "ENQ gefunden" zedlmsg = "Es wurden mehr als 100 ENQs auf die Datei", "gefunden. Sie kann deshalb nicht benutzt werden." "ISPEXEC SETMSG MSG(ISRZ001)" return(4) end otherwise do if has.0 > 11 then iend = 12 else iend = has.0 do iwh = 3 to iend enqs = enqs word(has.iwh,5) end iwh zedsmsg = "ENQ gefunden" zedlmsg = "Es wurden folgende ENQs auf die Datei", "gefunden: "enqs, "Sie kann deshalb nicht benutzt werden." "ISPEXEC SETMSG MSG(ISRZ001)" return(4) end end /* select */ end "DELETE '"ausdsn"'" "alloc dd(datout) dsn('"ausdsn" ') new reuse", "space("trk trk") tracks storclas("storclas")", "recfm(v b) lrecl("lrecl") blksize(27998)"
when sysdsnret = "OK" & reuse "J" then do "ISPEXEC ADDPOP" "ISPEXEC DISPLAY PANEL(INSMAKE1) " "ISPEXEC REMPOP" if relkz "J" then return(4) ausdsn = ausdsn".$" insdsn = ausdsn "ISPEXEC VPUT (INSDSN) PROFILE" "alloc dd(datout) dsn('"ausdsn"') new reuse", "space("trk trk") tracks s torclas("s torclas")", "recfm(v b) lrecl("lrecl") blksize(27998)" when sysdsnret = "DATASET NOT FOUND" then do "alloc dd(datout) dsn('"ausdsn"1) new reuse", "space("trk trk") tracks storclas("storclas")", "recfm(v b) lrecl("lrecl") blksize(27998)" end otherwise do zedsmsg = "SYSDSN Error " zedlmsg = sysdsnret "ISPEXEC SETMSG MSG(ISRZ001)" return(4) end end /* select */
12.14 N O P - No Operation
263
Tipp Ich setze hinter das abschließende END immer den Kommentar /* Select */. Manchmal nummeriere ich die SELECT und END Sequenzen innerhalb eines Programms auch durch. Das erhöht den Überblick bei sehr langen und geschachtelten Sequenzen. Vergessen Sie niemals die OTHERWISE Anweisung!
12.14
NOP - No Operation
Dies ist eine sehr einfache Anweisung. NOP steht fur „NO OPERATION" und bedeutet, dass nichts ausgeführt wird. NOP wird sehr häufig in OTHERWISE Statements benutzt. Siehe hierzu das 1. Beispiel zur SELECT Anweisung.
12.15
PULL - Eingabe am Bildschirm
Diesen Befehl bespreche ich nur deshalb hier, um Sie vor dessen Fallstricken zu warnen. Er wird nämlich sehr selten benötigt. Der Befehl arbeitet wie folgt: • •
Wenn im Data Stack etwas steht, dann liest PULL einen Satz aus dem Data Stack. Nur wenn im Data Stack nichts steht, dann liest PULL vom Terminal.
Wenn Sie etwas vom Terminal lesen wollen, haben Sie zwei Möglichkeiten: •
•
Mit einem kleinen Panel, in dem Sie die benötigten Eingabefelder definieren. Diesen Weg benutze ich IMMER dann, wenn ich möchte, dass der Benutzer etwas eingibt. Damit bieten sich auch viel bessere Möglichkeiten der Vorgabe von Texten und der Plausibilitätsprüfung der eingegebenen Werte. Mit dem Befehl PULL.
Tipp Wenn Sie glauben, unbedingt den Befehl PULL benutzen zu müssen, dann rate ich Ihnen dringend, davor eine Abfrage einzubauen, die feststellt, ob der Data Stack auch tatsächlich leer ist. Gegebenenfalls können Sie bei der Gelegenheit den Data Stack auch gleich leeren. Das könnte dann so aussehen: do i = 1 to queued(); pull xxx; end i; /* Queue leeren */ pull eingabe_wert /* Lesen vom Terminal */
12.16
TRACE - Die starke Testhilfe
Wenn Sie in der Anwendungsentwicklung tätig sind, kennen Sie sicherlich die verschiedensten Testhilfen. Da REXX eine Interpretersprache ist, können natürlich hier die Testhilfen be-
264
12 Die REXX Befehle
sonders elegant definiert und genutzt werden. Die ausfuhrliche Beschreibung des TRACE Befehls finden Sie in der IBM Broschüre TSO/E REXX Reference. Ich benutze in der Praxis meistens den Befehl TRACE ? I bzw. TRACE ?R. Durch die Angabe des Fragezeichens (?) wird erreicht, dass der Interpreter nach jedem durchgeführten Befehl anhält und man dann eigene Befehle von Hand eingeben kann. Diese Befehle werden auch sofort ausgeführt. Die Möglichkeit der Direkteingabe von Befehlen kann man auch nutzen, um einen laufenden TRACE mit TRACE O wieder abzuschalten. Das Programm läuft dann so lange ohne TRACE, bis ein weiteres TRACE Statement im Programm ausgeführt wird, oder bis das Programm endet. Beispiel Die folgende Prozedur erstellt eine Liste der Potenzen von 2. Ich habe gleich zu Beginn ein TRACE Statement eingefugt. / * DOC: REXX POTENZ2 ************************************************/ / * DOC: Prozedur zum Erzeugen e i n e r L i s t e der 2 - e r Potenzen */ am: 14 Apr 2000 */ / * (c) LANZT / * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /
trace ?i
numeric d i g i t s 30 do I = 1 t o 64 wert = r i g h t ( " 2 * * " i , 1 0 ) r i g h t ( s t r u k t ( 2 * * i ) , 3 0 ) queue wert say wert end i address TSO " a l l o c dd(ut) d s n ( ' p e v x . l o g o n . r e x x ( b i n t a b ) ' ) address TSO "execio "queuedO" diskw ut ( f i n i s " " f r e e dd (ut) "
reuse shr"
Wenn ich nun diese Prozedur online laufen lasse, bekomme ich folgende Anzeige am Bildschirm: 6 *-* numeric d i g i t s 30 >L> "30" +++ I n t e r a c t i v e t r a c e .
TRACE OFF to end debug, ENTER to continue. +++
7 *-* do I = 1 to 64 >L> "1" >L> "64" 8 *-* >L> >V> X»
>L> >F> >L> >V> >0>
>F> >L> >F> >o>
wert = r i g h t ( " 2 * * " i , 1 0 ) "2**" "1" "2**1 "10" "
"2" "1" "2" "2" "30"
M
right(strukt(2**i),30)
265
12.17 SIGNAL - Springen bei Fehlern
9 *-* >v>
queue
wert 2
2**1
trace o 2 4 8
2**1
2**2 2**3
Ich habe durch die direkte Eingabe von TRACE O den TRACE ausgeschaltet. Danach läuft das Programm normal zu Ende. Wie Sie am TRACE aus der Berechnung in der Zeile WERT = ... sehen, werden die einzelnen Rechenschritte detailliert aufgelistet. Ich empfehle Ihnen, sich mit der Verwendung des TRACE Befehls intensiv zu beschäftigen.
12.17
SIGNAL - Springen bei Fehlern
SIGNAL kennt drei Hauptformen des Befehls: SIGNAL label SIGNAL ON fehlerart NAME label SIGNAL VALUE ausdruck Mit der ersten Art kann man direkt zu dem genannten Label springen. Diese Benutzung des Befehls SIGNAL entspricht einem GOTO in anderen Programmiersprachen. Ich kann mich nicht erinnern, diese Art von SIGNAL jemals benutzt zu haben. Denn ich entwickle im REXX grundsätzlich nur GOTO freien Programmkode. Mit der zweiten Art kann man zu Beginn des Programms so genannte Traps setzen, um den Interpreter zu veranlassen, im Fehlerfall dorthin zu springen. Mit der dritten Art des Befehls kann man in „ausdruck" eine interne Sprungadresse eines Programms bestimmen. Dorthin wird dann bei der Ausfuhrung des Befehls verzweigt.
13
Die REXX Funktionen
Funktionen spielen im REXX eine große Rolle. Vor allem seien hier die Funktionen zur Textverarbeitung genannt. Wenn Sie das folgende Kapitel durchgearbeitet haben, werden Sie vielleicht staunen, was man mit den REXX Funktionen alles machen kann. Also viel Spaß bei der Lektüre über die REXX Funktionen! Die REXX Sprache, wie wir sie im TSO/E unter z/OS nutzen können, besteht aus zwei Blöcken von Sprachelementen: • •
Den REXX Befehlen, wie wir sie im Kapitel „Die REXX Befehle" ab Seite 221 kennen gelernt haben. Dem großen Vorrat an Standardfunktionen, die zur REXX Sprache gehören.
Wir wollen uns jetzt dem zweiten Teil, nämlich den REXX Functions zuwenden. Ich werde dabei nicht jede Funktion, die in der IBM Broschüre TSO/E REXX Reference beschrieben ist besprechen, sondern nur diejenigen, die meiner Meinung nach in der Praxis häufig benötigt werden. Wie Funktionen aufgerufen werden, habe ich Ihnen schon im Kapitel „CALL - Aufruf anderer Programme" ab Seite 233 erklärt. Dort haben wir auch schon über die Themen Parametereingabe und Rückgabe der Ergebnisse gesprochen. Die REXX Funktionen kann man nach Anwendungsgebieten in Gruppen einteilen. Ich habe für die Vorstellung der REXX Funktionen in diesem Buch folgende Einteilung der Gruppen vorgenommen: • • • • • • • •
Allgemeine Funktionen Arithmetische Funktionen Vergleichsfunktionen Konvertierungsfunktionen Formatierungsfunktionen Stringfunktionen Wortfunktionen Systemfunktionen
13.1
Allgemeine Funktionen
Die Anzahl der verfügbaren Standardfunktionen ist in der REXX Sprache größer als die Anzahl der Befehle. Daran können Sie erkennen, wie wichtig die Kenntnis über die Funktionen
268
13 Die REXX Funktionen
im REXX ist. Durch interne und externe Unterprogramme können Sie sich ganz einfach auch eigene, neue Funktionen erstellen und so Ihren Vorrat an verfügbaren Funktionen beliebig erweitern.
13.1.1
ADDRESS - Active Host Command Environment
Diese Funktion gibt den Namen des gerade aktiven „Host Command Environments" zurück. Es können keine Parameter eingegeben werde. Funktion Rückgabe des gerade aktiven „Host Command Environments". Format name =
address()
Bitte beachten Sie, dass man die Wiederherstellung eines mit der Funktion ADDRESS() in einer Variablen abgelegten Environments nur wie folgt erreichen kann: • •
Durch Setzen der Variablen in umgebende Klammern. Durch Verwendung der VALUE Funktion.
Das folgende Beispiel zeigt die beiden Varianten: envir = address() address (envir) address value envir
/* Diese beiden Befehle führen /* zum gleichen Ergebnis
*/ */
Siehe hierzu auch das Kapitel „ADDRESS - Die Verbindung zu den Subsystemen" ab Seite 221.
13.1.2
ARG - Eingabeparameter testen oder übernehmen
Die Funktion ARG kennt drei Anwendungsformen: • • •
Ermitteln der Anzahl der Eingabeparameter. Testen auf das Vorhandensein bestimmter Eingabeparameter. Einzelne oder alle Parameter übernehmen.
Format ARG(n,option)
n Wenn diese Option angegeben ist, wird der Inhalt des n-ten Parameters zurückgegeben. Falls dieser Parameter nicht besetzt ist, wird ein Nullstring zurückgegeben.
13.1 Allgemeine Funktionen
269
option Gibt eine 1 zurück, wenn der unter n genannte Parameter vorhanden ist. Ansonsten wird 0 zurückgegeben. ff Gibt eine 1 zurück, wenn der unter n genannte Parameter nicht vorhanden ist. Ansonsten wird 0 zurückgegeben. Beispiele /* Aufruf: "Call name ;" (keine Argumente) */ ARG Ö 1 1 -> ARG (1) 1 1 - > ARG (2) - > 0 ARG(1,'e') - > ARG(1,'0') 1 /* Aufruf: "Call name 'a',,'b' " (drei Argumente) -> 3 ARG () - > 'a ARG (1) 1 1 ARG (2) -> - > 'b ARG (3) 1 1 /* für n >= 4 */ ARG (n) - > ARG(1,'e') -> 1 ARG (2, 1 E 1 ) -> ARG(2,'O') -> 1 ARG(3,'o') - > ARG(4,'o') -> 1
0 0
13.1.3
D A T E - Datumsfunktionen
Die DATE Funktion stellt das heutige Datum in allen möglichen Formen zur Verfügung. Darüber hinaus kann man mit der DATE Funktion auch Datumsberechnungen vornehmen. Funktion Die DATE Funktion gibt es in zwei Varianten: 1. Rückgabe des heutigen Datums in verschiedenen Formen. 2. Berechung von Datumswerten. Auf den folgenden Seiten werde ich Ihnen diese beiden Varianten ausfuhrlich vorstellen. Siehe hierzu auch das Kapitel „DATEALL - Datumsberechnungen aller Art" ab Seite 545. 1. Rückgabe des heutigen Datums: Funktion Gibt das heutige Datum in verschiedenen Formen zurück. Format Datum = DATE(format)
270
13 Die REXX Funktionen
Es wird das heutige Datum in der im f o r m a t definierten Schreibweise zurückgegeben. Die möglichen Eingaben für f o r m a t und die daraus entstehenden Rückgabewerte sind in der folgenden Tabelle zusammengefasst. Von den Worten in der Spalte FORMAT ist jeweils immer nur der erste, grau unterlegte, Buchstabe zu verwenden. Format Base
Rückgabewert Tage seit dem 1. Januar 0001 ohne den heutigen Tag. Mit dem Aufruf wd = d a t e ("B") / / 7 kann man den heutigen Wochentag ermitteln. Dabei ist 0 der Montag und 6 der Sonntag. Century Tage seit dem 1. Januar des laufenden Jahrhunderts einschließlich des heutigen Tages. Days Tage seit dem 1. Januar des laufenden Jahres einschließlich des heutigen Tages. European Datum im europäischen Format: DD/MM/JJ. Datum in der Form: JJDDD. Julian Month Englischer Name des Monats in Groß- und Kleinschreibung. Z.B. January. Datum in der Form: DD Mon J J J J . In Mon werden die ersten drei BuchstaNormal ben der englischen Monatsbezeichnung zurückgegeben. Jan, Feb, Mar usw. Dies ist die Standardannahme, wenn kein Parameter eingegeben wurde. Datum in der Form: JJ/MM/DD. Ordered Standard Datum in der Form: JJJJMMDD. Datum im amerikanischen Format: MM/DD/JJ. Usa Weekday Englischer Wochentag. Monday, Tuesday usw. Tabelle 26 Optionen der DATE Funktion
Beispiele > DATE 0 DATE CB') > DATE C O > DATE ('D') - > -> DATE C E ' ) DATE CJ') -> DATE CM') -> DATE CN') -> DATE CO') DATE C S ' ) - - > - - > DATE CU') DATE CW) -->
29 Apr 2004 731699 1581 120 29/04/04 04120 April 29 Apr 2004 04/04/29 20040429 04/29/04 Thursday
2. Datumsberechnungen mit der DATE Funktion: Funktion Mit der DATE Funktion kann man einige Datumskonvertierungen in ein anderes Format und auch Datumsberechnungen durchführen.
13.1 Allgemeine Funktionen
271
Format Ergebnis
=
DATE(formatl,eingäbe,format2)
Regel Das in eingäbe angegebene Datum wird in das in formatl angegebene Format konvertiert. format2 muss angegeben werden und definiert das Format von eingäbe, eingäbe kann auch eine D A T E Funktion sein. U m diese Möglichkeiten der D A T E Funktion zu zeigen, habe ich eine kleine R E X X Prozedur geschrieben und ausgeführt. Das Ergebnis sehen Sie hier: Heutiges Datum = 29 Apr 2004 Berechnung: Heute minus 200 Tage, Ausgabe in N (TT Mon JJJJ) Statement : date("N",date("B") - 200,"B") Ergebnis : 12 Oct 2003 Berechnung: S Datum plus 100 Tage, Ausgabe in S (JJJJMMTT) Statement : date("S",date("B",20040101,"S") + 100,"B") Ergebnis : 20040410 Berechnung: Heute plus 360 Tage, Ausgabe in E (TT/MM/JJ) Statement : date("E",date("B") + 360,"B") Ergebnis : 24/04/05 Umrechnung: S Format (JJJJMMTT) in N Format (TT Mon JJJJ) Statement : DATE(,"20020609","S") Ergebnis : 9 Jun 2002 Umrechnung: N Format (TT Mon JJJJ) in B Format Statement : DATE("B","25 Sep 2001") Ergebnis : 730752 Umrechnung Statement Ergebnis
C Format (TTTT) in N Format (TT Mon JJJJ) DATE("N","1000","C") 26 Sep 2002
Umrechnung: 0 Format (JJ/MM/TT) in U Format (MM/TT/JJ) Statement : DATE("U","03/08/15","O") Ergebnis : 08/15/03 Umrechnung: J Format (JJTTT) in E Format (TT/MM/JJ) Statement : DATE("E","01101","J") Ergebnis : 11/04/01 Hinweis Bei Konvertierungen und Berechnungen können die Formate C und J nicht als Ergebnis benutzt werden. Das ist sehr schade, denn gerade Konvertierungen in das J Format kommen in der Praxis oft vor.
272
13 Die R E X X Funktionen
Algorithmus zur Berechnung des Julian Day im Jahr Ich habe einmal überlegt, wie man einen Algorithmus bauen müsste, um den Julian Tag im Jahr mithilfe von D A T E oder R E X X in einem Statement zu berechnen. Dabei kam folgendes Programm heraus: 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
/* DOC: REXX JÜLDATE */ /* DOC: Berechnung des Julian Date */ /* (c) LANZT am: 29 Apr 2004 */ /*****************************************************************/ say "JD1 mat DATE Funktion:" say "1960 12 31 = "right(jdl("1960 12 31") ,3) say "2003 12 31 = "right(jdl("2003 12 31") ,3) say "2004 12 31 = "right(jdl("2004 12 31") ,3) say "2004 01 31 = "right(jdl("2004 01 31") ,3) say "2004 02 29 = "right(jdl("2004 02 29") ,3) say "2004 03 01 = "right(jdl("2004 03 01") ,3) say "2003 03 01 = "right(jdl("2003 03 01") ,3) say "2004 04 29 = "right(jdl("2004 04 29") ,3) say "2010 04 29 = "right(jdl("2010 04 29") ,3) say "2100 12 31 = "right(jdl("2100 12 31") ,3) say " JD2 mit REXX Statements:" say "1960 12 31 = "right(jd2("1960 12 31") ,3) say "2003 12 31 = "right(jd2("2003 12 31") ,3) say "2004 12 31 = "right(jd2("2004 12 31") ,3) say "2004 01 31 = "right(jd2("2004 01 31") ,3) say "2004 02 29 = "right(jd2("2004 02 29") ,3) say "2004 03 01 = "right(jd2("2004 03 Ol") ,3) say "2003 03 01 = "right(jd2("2003 03 01") ,3) say "2004 04 29 = "right(jd2("2004 04 29") ,3) say "2010 04 29 = "right(jd2("2010 04 29") ,3) say "2100 12 31 = "right(jd2("2100 12 31") ,3) exit
28
29 30 31 32 33 34 35 36 37 38 39 40
/*****************************************************************/
/* Berechnen des Julian Day aus der Eingabe JJJJ MM TT */ /*****************************************************************/ JD1: PROCEDURE /* Berechnung mithilfe der DATE Funktion */ arg jj mm dd return (date ("B", date ("B", jj! ! • ! !dd,"S") , - date("B",jj"0101","S"),"B") + 1 ) JD2: PROCEDURE /* Berechnung mithilfe von REXX Rechenoperationen */ arg jj mm dd return(, (mm-1) * 30 + dd - (mm>2)*2 +, (mm>l) + (mm>3) + (mm>5) + (mm>7) + (mm>8) + (mm>10) +, (mm>2) * ((jj // 4 = 0) - (jj // 100 = 0) + (jj // 400 » 0)))
Programm 13 JULDATE: Berechnung des julianischen Tags im Jahr
Ich habe das obige Programm laufen lassen und erhielt folgende Ausgabe: JDl mit 1960 12 2003 12 2004 12 2004 01 2004 02
DATE 31 = 31 = 31 = 31 = 29 =
Funktion: 366 365 366 31 60
13.1 Allgemeine Funktionen 2004 03 2003 03 2004 04 2010 04 2100 12 JD2 m i t 1960 12 2003 12 2004 12 2004 01 2004 02 2004 03 2003 03 2004 04 2010 04 2100 12
01 = 01 = 29 = 29 = 31 = REXX 31 = 31 = 31 = 31 = 29 = 01 = 01 = 29 = 29 = 31 =
273
61 60 120 119 365 Statements: 366 365 366 31 60 61 60 120 119 365
Wie Sie sehen, erhalte ich mit beiden Methoden der Berechnung die gleichen Ergebnisse. Erklärung zu den oben grau unterlegten Anweisungen: Teil 1: Berechnung mit der DATE Funktion. Programmzeilen 33 und 34. Mit der DATE Funktion lässt sich das Ergebnis mit dem wenigsten Aufwand erreichen. Dies geht dann so: Beide DATE Aufrufe bekommen als Eingabe ein Datum im S-Format (JJJJMMTT). Und zwar einmal mit dem Datum, zu dem der Julian Day gesucht wird und einmal mit dem Datum des 1. Januar des gleichen Jahres. In den DATE Aufrufen werden die S-Formate in B-Formate umgewandelt und das Ergebnis wird auch im B-Format ausgegeben. Wenn man nun die beiden Ergebnisse subtrahiert und noch eine Eins addiert, erhält man den Julian Day zu dem eingegebenen Datum. Teil 2: Berechnung mit REXX Anweisungen. Programmzeilen 38 bis 40. Grundlage der Überlegung zur Entwicklung der Formel war, dass man in einer REXX Zuweisung auch mit dem Ergebnis logischer Operationen rechnen kann. Die logischen Vergleiche werden in Zuweisungen in Null (nicht wahr) und Eins (wahr) aufgelöst und man kann sie dann in Rechenoperationen nutzen. In den folgenden Überlegungen werden die Variablen JJ, MM und DD für Jahr, Monat und Tag benutzt. •
•
Zunächst kann man sagen, dass sich der fortlaufende Tag im Jahr grundsätzlich mit der Formel: (MM-1) *30+DD berechnen lässt. Diese Formel stimmt aber nur für den Januar. Schon im Februar funktioniert sie nicht mehr, weil der Januar 31 Tage hat. Daraus folgt die Überlegung: Man muss für jeden Monat, der keine 30 Tage hat die entsprechende Differenz addieren oder subtrahieren. Das Ganze muss für alle Monate gemacht werden, die VOR dem eingegebenen Monat liegen. Damit ergeben sich für die einzelnen Monate folgende Differenzwerte: Januar = +1, Februar = -2, März = +1, Mai = +1, Juli = +1, August = +1, Oktober = +1
274 •
13 Die R E X X Funktionen Und dann ist da noch das Problem des Schaltjahres! In Schaltjahren muss bei allen Monaten, die hinter dem Februar liegen, nochmals ein Tag addiert werden. Schaltjahre sind Jahre, deren Jahreszahl ohne Rest durch 4 oder 4 0 0 teilbar ist, außer solchen, deren Jahreszahl ohne Rest durch 100 teilbar ist. Wir wollen uns jetzt einmal die Einzelteile der Formel anschauen: (mm-1)
*
30 +
dd
Dies ist die Grundformel. -
(mm>2)*2
Dies sind die zwei Tage, die für den Februar abgezogen werden müssen. +
(mm>l)
+
(mm>3)
+
(mm>5)
+
(mm>7)
+
(mm>8)
+
(mm>10)
Hier werden die zusätzlichen Tage der 31-Tage Monate addiert. Das funktioniert so: Immer wenn eine der Bedingungen erfüllt ist, ergibt sich für den logische Ausdruck eine Eins, sonst ergibt sich eine Null. +
(mm>2)
*
((jj//4
Der Ausdruck ( ( j j / / 4 eine Null, wenn JJ
= 0) = 0)
-
(jj//100 (jj//100
= 0) = 0)
+ +
(jj//400 (jj//400
=
0))
= 0))
ergibt
kein Schaltjahr ist, sonst eine Eins. Da die Addition aber nur bei
Monaten erfolgen darf, die hinter dem Februar liegen, wird der Schaltjahrwert noch mit der Bedingung (mm>2)
multipliziert.
Sie werden jetzt vielleicht fragen: „Welche Methode ist schneller?" Ich habe mit dem Programm J U L D A T E die folgenden Testläufe durchgeführt: Test: Mit unkompiliertem R E X X Kode. JULDATE Start Programm 12:36:30 Compiled: NOT COMPILED 1. Zeit fuer 100000 Durchlaeufe mit Date Funktion : 5.938666 2. Zeit fuer 100000 Durchlaeufe mit REXX Statements: 7.319412 JULDATE Ende Programm 12:36:43 Test: Mit kompiliertem R E X X Kode. JULDATE 1. Zeit 2. Zeit JULDATE
Start Programm 12:38:56 Compiled: 1 Sep 2004 12:36:14 fuer 100000 Durchlaeufe mit Date Funktion : 2 . 4 6 2 8 9 9 fuer 100000 Durchlaeufe mit REXX Statements: 1.733322 Ende Programm 12:39:01
Die 1. Zeit gibt an, wie viele Sekunden für die 100000 Durchläufe bei der Verwendung der D A T E Funktion durch den Aufruf des Unterprogramms JD1 verstrichen sind. Die 2. Zeit gibt an, wie viele Sekunden für die 100000 Durchläufe bei der Verwendung der R E X X Befehle durch den Aufruf des Unterprogramms J D 2 verstrichen sind. Wie man sieht, bringt in diesem speziellen Fall die Verwendung des kompilierten Kodes einen ganz beachtlichen Zeitvorteil.
13.1 Allgemeine Funktionen
13.1.4
275
TIME - Zeitfunktionen
Funktion Die TIME Funktion bietet zwei Möglichkeiten, sie zu nutzen: •
Rückgabe der gegenwärtigen Tageszeit.
•
Starten und Stoppen der Differenzzeitmessung.
Format Z e i t = TIME(format) Die folgende Tabelle zeigt, welche Optionen mit f o r m a t gesetzt werden können und welche Ausgaben TIME dann liefert. Rückgabe der Tageszeit Format Civil Elapsed
Hours Long Minutes Normal Reset Seconds
Rückgabewert Tageszeit in der Form HH :MMxx, wobei xx am oder pm sein kann. Dies ist für die amerikanischen Zeitangaben gedacht. Gibt die Zeit in der Form SSSSSSSSS.UUUUUU zurück, wobei vor dem Dezimalpunkt die Sekunden stehen und dahinter die Dezimalstellen der Sekunden. Mit dieser Form wird die Stoppuhr gestartet. Jeder weitere Aufruf mit dieser Form gibt die abgelaufene Zeit seit dem ersten Aufruf zurück. Gibt den Stundenwert der Tageszeit ein- oder zweistellig zurück. Gibt die Uhrzeit in der Form HH:MM:SS.UUUUUU zurück. Die Stellen nach dem Komma sind Mikrosekunden. Gibt die Minuten zurück, die seit Mitternacht verstrichen sind. Gibt die Zeit in der Form HH:MM:SS zurück. Dies ist die Standardeinstellung. Gibt die Zeit seit dem Start oder dem letzten RESET der Stoppuhr zurück und setzt die Stoppuhr auf Null. Gibt die Sekunden zurück, die seit Mitternacht verstrichen sind.
Tabelle 27 Optionen der TIME Funktion
Beispiele für die Rückgabe der Tageszeit TIME() --> TIME C C ) --> TIME('H') --> TIME('L') — > TIME ( 'M' ) — > TIME('N') — > TIME('S') -->
17:40:23 5 :40pm 17 17:40:23.656081 1060 17:40:23 63623
Beispiele für die Zeitmessung TIME ( ' E ' ) — > 0 TIME('R') — > 0.000530
276
13 Die REXX Funktionen
Zwischen dem Aufruf mit dem format E und dem Aufruf mit dem format R sind 530 Mikrosekunden vergangen.
13.1.5
QUEUED - Sätze im Data Stack
Funktion Rückgabe der Anzahl Datensätze im TSO Data Stack. Format Z a h l = QUEUED() Gibt die Anzahl der Sätze im Data Stack zurück. Es kann kein Parameter eingegeben werden. Bei einer Rückgabe von Null ist der Data Stack leer.
13.1.6
SOURCELINE - Rückgabe einer Programmzeile
Funktion • •
Rückgabe der Anzahl Zeilen des Quellkodes. Rückgabe des Textes einer Zeile aus dem Quellkode des Programms.
Format A n z a h l = SOURCELINE() Gibt die Anzahl der Zeilen des Quellkodes zurück. T e x t = SOURCELINE(n) Gibt den Inhalt der n-ten Zeile zurück. Diese Funktion kann dazu benutzt werden, um im Fehlerfall das fehlerhafte Statement anzuzeigen. Beispiel Die folgende Routine zur Fehlerbehandlung von ISPF Fehlern benutze ich fast in jedem Programm, in dem ISPF Services aufgerufen werden. ispf_error: arg rc text instr = sigl-1 say exname copies("-",68) say exname "RC="rc text if zerrlm "ZERRLM" then say exname strip(zerrlm) say exname "SOURCE: "instr strip(sourceline(instr)) say exname copies("-",68) maxrc = 8 return
Den Aufruf dieser internen Prozedur zeigt das folgende Beispiel: "ISPEXEC LMINIT DATAID (ID) DATASET ("dsn" ) ENQ (SHR) " if rc > 0 then call ispf_error rc "LMINIT fuer "dsn
13.1 Allgemeine Funktionen
13.1.7
277
USERID - TSO User ID ermitteln
Funktion Rückgabe der TSO User ID. Format u s e r = USERID() Nach diesem Aufruf steht in u s e r die User ID des TSO Users.
13.1.8
VALUE - Variablen ersetzen
Funktion Zusammensetzen eines Variablennamens aus konstanten und variablen Teilen und Rückgabe des Inhalts dieser Variablen. Format w e r t = VALUE("XYZ"var) Mit dem Befehl VALUE kann man dynamisch einen Variablennamen aus konstanten und variablen Teilen erzeugen. Der Inhalt der Variablen mit dem so erzeugten Namen wird als Funktionswert zurückgegeben. Dieser Befehl arbeitet so ähnlich, wie der Befehl INTERPRET. Während aber INTERPRET immer erst den ganzen Befehl bildet und dann ausfuhrt, wird bei der Funktion VALUE nur der Variablenname dynamisch gebildet und der Inhalt der so erzeugten Variablen zurückgegeben. Beispiel Das Edit Makro #TSOB aus den LANZ Utilities dient dazu, REXX Prozeduren, die im Edit stehen, zur Ausfuhrung in einem Batch Job zu submitten. In diesem Batch Job kann sowohl eine variable Anzahl von STEPLIB DSNs als auch eine variable Anzahl von SYSEXEC DSNs vorkommen. Diese Informationen sind im TSO User PROFILE gespeichert. Die Speicherung geschieht durch ein REXX Programm, das bei Bedarf aufgerufen wird. Die Organisation der Speicherung ist wie folgt: In den PROFILE Variablen SYSEXEC und STEPLIB steht jeweils die Anzahl der für diesen Typ vorhandenen DSNs. Die dazugehörenden DSNs stehen dann in den Variablen SYSEXECn und STEPLIBn, wobei n von 1 bis Inhalt von SYSEXEC bzw. STEPLIB geht. Hier die Statements, mithilfe derer die Werte in die Variablen gefüllt werden: sysexec steplib sysexecl sysexec2 sysexec3 sysexec4
= = = = = =
4 3 "PROX.LANZ.REXX" "PROX.LOGON.REXX" "SMQP.USER.CEXEC" "SMQP.PROD.CEXEC"
278
13 D i e R E X X F u n k t i o n e n
Steplibl = "PROX.LOGON.LOAD" Steplib2 = "DB2P.ALIAS.DSNLOAD" Steplib3 = "SMQP.LOAD" D i e B e f e h l e , w e l c h e d i e S p e i c h e r u n g in d i e P R O F I L E b e s o r g e n h a b e ich w e g g e l a s s e n . H i e r soll n u r d i e B e l e g u n g d e r V a r i a b l e n g e z e i g t w e r d e n . N a c h f o l g e n d der Programmteil aus d e m Edit M a k r o # T S O B , der die Variablen aus d e m Profile liest u n d in d i e J C L e i n b a u t : /********************************************************************/ /* Einlesen der Umgebungsvariablen
*/
/********************************************************************/
" ISPEXEC CONTROL ERRORS RETURN" "ISPEXEC VGET (SYSEXEC STEPLIB", "ACCOUNT JOBCLASS MSGCLASS) PROFILE" if rc > 0 then do zedlmsg = "Fehler: Variable konnten nicht korrekt aus dem", "Profile Pool gelesen werden. Prozedur beendet." if zerrlm "ZERRLM" then zedlmsg = zedlmsg strip(zerrIm) address "ISPEXEC" "SETMSG MSG(ISRZOOl) COND" exit jobname = userid() jobsuff () queue "//"jobname" JOB ("account"),'#TSOB: "mem"',CLASS="jobclass"," queue "// NOTIFY="userid()",MSGLEVEL=(0,0),MSGCLASS="msgclass"," queue "// COND=(0,LT),TIME=100,USER=SQMTP" queue "//"copies("*",68) queue "//* TSO-BATCH AUS: "dsn"("mem")" queue "//"copies("*",68) queue "//TSOBATCH EXEC PC31=IKJEFT01 ,REGION=80M,DYNAMNBR=99" if steplib > 0 then do "ISPEXEC VGET (STEPLIB1) PROFILE" if rc > 0 then call ispf_error rc "VGET STEPLIB1" queue "//STEPLIB DD DISP=SHR,DSN="Steplibl do i = 2 to steplib "ISPEXEC VGET (STEPLIB"i") PROFILE" if rc > 0 then call ispf_error rc "VGET STEPLIB"i queue "// DD DISP=SHR,DSN="value("steplib"i) end i queue "//SYSEXEC DD DISP=SHR,DSN="dsn if sysexec > 0 then do i = 1 to sysexec "ISPEXEC VGET (SYSEXEC"i") PROFILE" if rc > 0 then call ispf_error rc "VGET SYSEXEC"i queue "// DD DISP=SHR,DSN="value("SYSEXEC"i) end i queue "//SYSPRINT DD queue "//SYSTSPRT DD
SYSOUT=*" SYSOUT=*"
13.2 Arithmetische Funktionen
13.2
279
Arithmetische Funktionen
In den folgenden Unterkapiteln werde ich Funktionen besprechen, die verschiedene Möglichkeiten der Behandlung und Steuerung von arithmetischen Operationen betreffen.
13.2.1
ABS - Absolutwert einer Zahl
Funktion Rückgabe des Absolutwerts einer Zahl. Format
ergebnis = ABS(zahl) Nach diesem Aufruf steht in ergebnis der Absolutwert von zahl. Diese Funktion gibt den vorzeichenlosen Absolutwert der eingegebnen Zahl zurück. Das Format der zurückgegebenen Zahl ergibt sich aus den gerade gültigen NUMERIC Optionen. Beispiele ABS(-2/3) ABS (' -0.307')
13.2.2
0.666666667 0.307
DIGITS, FORM, FUZZ - Optionen für Rechenoperationen abfragen
Mit diesen drei Funktionen können die Werte, die gerade für die Durchführung von arithmetischen Ausdrücken gelten, abgefragt werden. Diese Informationen kann man auch durch den Befehl PARSE NUMERIC var erhalten. Beispiel numeric digits 12 numeric fuzz 3 parse numeric nums dig = digits () fuz = fuzz() for = form() say "Werte aus PARSE = "nums say "Werte aus Funktionen = "dig fuz for
Hier der Ausdruck beim Aufruf dieser Prozedur: Werte aus PARSE = 12 3 SCIENTIFIC Werte aus Funktionen = 12 3 SCIENTIFIC
280
13.2.3
13 Die REXX Funktionen
MIN, MAX - Minimal- und Maximalwert
Diese Funktionen geben jeweils den Minimal- oder Maximalwert einer Gruppe von Zahlen, die als einzelne Parameter eingegeben werden, zurück. Es können in einer Parameterliste maximal 20 Werte eingegeben werden. Da aber diese Funktionen auch geschachtelt werden können, kann man maximal 20 mal 20, also 400 Werte in einem Funktionsaufruf verarbeiten lassen.
13.2.4
RANDOM - Zufallszahl generieren
Funktion Mit dieser Funktion kann man sich eine Zufallszahl generieren lassen. Dabei kann eine Unter- und eine Obergrenze innerhalb derer sich die Zahlen bewegen sollen, angegeben werden. Format random(anfang,ende[,ind]) an f a n g ende ind
Untergrenze des Zahlenraums, Obergrenze des Zahlenraums. Basiszahl, mit deren Hilfe man die Wiederholbarkeit erreichen kann.
1. Beispiel: Siehe hierzu das Programm LOTTO auf Seite 257. 2. Beispiel: In diesem Beispiel wird gezeigt, dass bei wiederholten Aufrufen immer die gleichen Zahlen ausgegeben werden, wenn man sich dabei auf die gleiche Basiszahl bezieht. /* DOC: REXX RANDOM */ /* DOC: Beispiel f ü r die Generierung von Zufallszahlen */ /* (c) LANZT am: 30 Apr 2004 */ / * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /
nnn = "" do 10; nnn = nnn say nnn t x t = random(1,1000,12) do i = 1 to 10; t x t = t x t say t x t seq = random(1,12,1) do i = 1 to 10; seq = seq say seq t x t = random(1,1000,12) do i = 1 to 10; t x t = t x t say t x t seq = random(1,12,1) do i = 1 to 10; seq = seq say seq
random(l,1000); end random(1,1000); end i random(1,12);
end i
random(l,1000); end i random(1,12);
Programm 14 RANDOM: Berechnen von Zufallszahlen
end i
13.3 Vergleichsfunktionen
281
Die Ausgabe dieses Programm sehen Sie hier: 311 976 3 8 976 3 8
886 265 230 967 115 390 676 577 161 509 127 16 332 637 364 595 134 852 333 2 6 5 11 2 4 12 5 9 509 127 16 332 637 364 595 134 852 333 2 6 5 11 2 4 12 5 9
Wie Sie sehen, sind in den Zeilen 2 und 4, sowie 3 und 5 jeweils die gleichen Zahlen erschienen, weil für die entsprechenden Aufrufe von RANDOM eine Basiszahl angegeben wurde. Welche Basiszahl man wählt, ist gleichgültig.
13.2.5
SIGN - Rückgabe des Vorzeichens
Funktion Rückgabe des Vorzeichens einer Zahl. Format ergebnis =
sign(zahl)
SIGN gibt das Vorzeichen der angegebenen Zahl nach folgenden Regeln zurück: zahl > 0 zahl = 0 zahl < 0
13.3
ergebnis = 1 ergebnis = 0 ergebnis = -1
Vergleichsfunktionen
Neben der Möglichkeit Vergleiche mit dem IF Befehl durchzuführen, gibt es noch einige Funktionen, mit denen man im REXX Vergleiche durchführen kann. Die wichtigste dieser Funktionen ist DATATYPE, denn ohne diese Funktion könnte man Plausibilitätsprüfungen von numerischen Daten gar nicht durchführen.
13.3.1
COMP ARE - Texte vergleichen
Funktion Diese Funktion gibt eine Null zurück, wenn beide Texte gleich sind. Wenn die Texte nicht gleich sind, wird die Position des Zeichens zurückgegeben, ab dem die Texte nicht gleich Format COMPARE(textl,text2[,füllzeichen])
282
13 Die REXX Funktionen
textl,text2 Die zu vergleichenden Texte. füllzeichen Der kürzere der beiden Texte wird vor dem Vergleich mit dem Füllzeichen aufgefüllt. Das Standardzeichen ist das Blank. Hinweis Diese Funktion habe ich bisher nie benötigt. Man kann Textvergleiche ja auch mit den normalen logischen Operanden durchfuhren. Wenn man allerdings herausfinden will, ab welcher Position die „Ungleichheit" beginnt, ist COMP ARE sehr nützlich.
13.3.2
DATATYPE - Datentyp ermitteln
Funktion Dies ist eine sehr wichtige Funktion. Sie wird immer benötigt, wenn vor einer Rechenoperation sichergestellt werden muss, dass die an der Rechenoperation teilnehmenden Operanden auch ALLE vom Typ NUM sind. Format ergebnis = d a t a t y p e ( t e x t , [ t y p e ] ) ergebnls • Ist NUM, wenn text eine Zahl enthält, mit der REXX arbeiten kann. • Ist CHAR, in allen anderen Fällen. text Dies ist der zu untersuchende Text. Wenn nur dieser angegeben ist, dann gibt die Funktion die oben genannten Werte zurück. type Wenn auch Type angegeben ist, dann gibt die Funktion eine 1 zurück, wenn die mit type bezeichnete Eigenschaft von text erfüllt ist, sonst eine 0. Mit type können folgende Eigenschaften abgefragt werden: A B L M N S u w
text besteht vollständig aus alphanumerischen Zeichen (a-z, A-Z, 0-9). text besteht vollständig aus Binärzeichen (0-1). text enthält nur Kleinbuchstaben (a-z). text enthält nur Buchstaben (a-z, A-Z). text ist eine gültige REXX Zahl. text ist ein im REXX gültiges Symbol (z.B. ein Variablenname). text enthält nur Großbuchstaben (A-Z). text enthält eine ganze Zahl.
13.3 Vergleichsfunktionen X
283
text enthält nur hexdezimale Ziffern (a-z, A-Z, 0-9), wobei Blanks zwischen Hex Paaren stehen können. Nullstring ist auch ein Hexadezimales Zeichen.
Beispiel Die folgenden Programmzeilen stammen aus einem Programm, das Datumsumrechnungen vom Format JJJJ/MM/TT in das Format J J J J / T T T und umgekehrt durchfuhrt. Bevor in dem Programm irgendwelche Rechenoperationen durchgeführt werden, muss geprüft werden, ob alle eingegebenen Werte numerisch sind. Diese Statements sehen Sie jetzt hier: 24 25 26 27 28
parse var indat jjjj"/"mm"/"tt . if (datatype(jjjj,"N") * datatype(mm,"N") *, datatype(tt,"N") = 0) then return("999") if mm > 12 ! tt > 31 ! (jjjj * mm * tt = 0) then return("999") mmtt = schalt(jjjj)
Der PARSE Befehl in der Zeile 24 zerlegt die eingegebene Zahl in JJJJ, MM und TT. Das IF Statement in Zeile 25 prüft, ob alle drei Werte numerisch sind. Das funktioniert so: Die DATATYPE Funktion gibt für alle Tests, bei denen eine richtige Zahl gefunden wird, eine 1 zurück, sonst eine Null. Wenn auch nur einer der Tests eine Null liefert, dann ergibt die Multiplikation aller drei Testergebnisse auf jeden Fall auch eine Null. Damit ist sicher, dass mindestens ein Wert nicht numerisch ist. Tipp Falls jemand jetzt denkt: „Das kann man doch viel besser machen, indem man die beiden IF Statements in Zeile 25 und 27 in ein IF Statement zusammenzieht", dann kann ich nur sagen: „Da haben Sie aber mit Zitronen gehandelt!". Ja, warum geht das denn nicht? Das geht erst schief, wenn das Programm tatsächlich einmal mit falschen Eingabewerten aufgerufen wird. Denn dann passiert Folgendes: Alle Rechenoperationen eines IF Statements werden ausgeführt, um das Ergebnis zu bestimmen. Also auch diejenigen Rechenoperationen, die in Vergleichen von Zahlenwerten stecken. Das bedeutet in unserem Fall, dass die Operationen j j j j * m m * t t ausgeführt werden, um das IF Statement richtig abzuschließen. Wenn also einer der Werte ein nichtnumerisches Zeichen enthält, bricht in diesem Fall das Programm ab. Wenn jemand also der Versuchung erliegen sollte, diese beiden IFs in eines zusammenzuziehen, dann hat er sich hier eine klassische Zeitbombe eingebaut. Es geht nämlich so lange gut, bis tatsächlich einmal ein falscher Wert auftaucht. Also merken Sie sich die folgende Regel: Regel Bevor man irgendwelche Rechenoperationen durchführt, muss durch vorhergehende Tests, in denen KEINE Rechenoperationen vorkommen, sichergestellt werden, dass alle beteiligten Werte numerisch sind!
284
13.4
13 Die REXX Funktionen
Konvertierungsfunktionen
Mit diesen Funktionen kann man Texte und Zahlen in andere interne Darstellungen konvertieren. Normalerweise braucht man diese Funktionen eigentlich gar nicht, denn im TSO/E REXX ist alles ganz einfach: Alle internen Datendarstellungen erfolgen grundsätzlich im EBCDIC Format. Das bedeutet Folgendes: •
•
Die Zahl 1234567 steht intern in sieben Bytes, die folgenden Hexadezimalwert haben: "Fl F2 F3 F4 F5 F6 F7"X Im Allgemeinen wird diese Darstellung das „ungepackte" Format genannt. Der Text "Ich bin guter Laune! hat intern die Länge 20 und besteht aus folgenden Hexadezimalzeichen: "C9 83 88 40 82 89 95 40 87 A4 A3 85 99 40 D3 81 A4 95 85 4F"X
Die Konvertierungsfunktionen benötigt man immer dann, wenn von außen Zeichen in unser REXX Programm gelangen, die nicht den REXX Konventionen entsprechen. Ein Beispiel sehen Sie in dem Kapitel „Interessantes Problem im REXX" ab Seite 386. Ein weiteres Beispiel möchte ich Ihnen hier zeigen: Dieses kleine REXX Programm ermittelt den Job Namen direkt aus den Systemtabellen des z/OS. /* DOC REXX JOBNTSO /* DOC Ermitteln des Job Namens mithilfe /* DOC des z/OS. /* (c) LANZT /************ /* CVT = STORAGE(10,4) /* TCBP = STORAGE (D2X(C2D (CVT) ) ,4) /* TCB = STORAGE(D2X(C2D(TCBP)+4),4) /* TIOT = STORAGE(D2X(C2D(TCB)+12),4) /* SAY STRIP(STORAGE(D2X(C2D(TIOT)),8)) EXIT
*/ */ */ am: 10 May 2004 */
der CVT (Common Vector Table)
FLCCVT - PSA DATA AREA */ CVTTCBP */ TCB */ TCBTIO */ TIOCNJOB */
Programm 15 JOBNTSO: Beispiel für die STORAGE Funktion
Falls Sie die nötigen Kenntnisse des z/OS Betriebssystems haben, versuchen Sie einmal die REXX Befehle zu entschlüsseln. Die dazu notwendigen Kenntnisse über die Konvertierungsbefehle können Sie den folgenden Unterkapiteln entnehmen. Natürlich sind hier alle, die schon einmal im Assembler programmiert haben im Vorteil. Dies gilt für alle Konvertierungsfunktionen.
285
13.4 Konvertierungsfunktionen
13.4.1
C2D - Character to Decimal
Funktion Diese Funktion gibt den Dezimalwert eines Textes zurück. Durch die Angabe einer Länge können auch negative Zahlen konvertiert werden.
Format zahl = C2D(text,n) text Dieser Text wird als binärer String angesehen, dessen dezimaler Zahlenwert zurückgegeben wird. Diese Zahl gibt an, wie viele Bytes aus t e x t von rechts her umgewandelt werden. Ist das erste (also das am weitesten links stehende) Bit dieser Zahl eins, dann wird die Zahl als negative Zahl im Zweierkomplement ausgegeben. Ist diese Zahl Null, dann ist der Rückgabewert immer Null.
Hinweis Bei der Anwendung dieser Funktion muss unbedingt darauf geachtet werden, dass NUMERIC DIGITS groß genug gesetzt ist. Anderenfalls endet der Aufruf von C2D mit einem Fehler. In dem folgenden kleinen Programm habe ich verschiedene Aufrufe der Funktion C2D zusammengetragen. Ich denke, damit können Sie die Arbeitsweise von C2D gut verstehen. /* DOC: REXX C2D ********************* /* DOC: Beispiele für Convert Function C2D /* (c) LANZT numeric digits 22 say right(c2d( •00000001 x),22) say right(c2d( •7fffffff"x),22) say right(c2d( '7fffffff'' X 4 ,22) say right(c2d( '80000000 X 4 ,22) say right(c2d( '7fffffff' X 1 ,22) say right(c2d( •7fffffff X 2 ,22) say right(c2d( '00007fff ' X 2 ,22) say right(c2d( '00008000 X 2 ,22) say right(c2d( '0000007f' X 1 ,22) say right(c2d( '00000080' * 1 ,22) say right(c2d( 'OOOOOOff' X ,22) ,22) say right(c2d( '12345678' say right(c2d("ABCDEFGH' ,22)
/* /* /* /* /* /* /* /* /* /* /* /* /*
am: 11 May 2004
Eine Eins Größte positive Zahl im Vollwort Größte positive Zahl im Vollwort Größte negative Zahl im Vollwort Nur das rechteste Byte Nur die rechtesten 2 Bytes Größte positive Zahl im Halbwort Größte negative Zahl im Halbwort Größte positive Zahl im Byte Größte negative Zahl im Byte Größte Zahl im Byte ohne Vorz. Binärer Wert der EBCDIC 12345678 Binärer Wert der EBCDIC ABCDEFGH
*/ */ */ */ */ */ */ */ */ */ */ */ */
286
13 Die REXX Funktionen
Ich habe das Programm laufen lassen. Die Ergebnisse sehen Sie hier: c2d("00000001"x) c2d("7fffffff"x) o2d("7fffffff"x,4 c2d("80000000"x,4 c2d("7fffff ;"x,1 c2d("7fffffff"x,2 c2d("00007fff"x,2 c2d("00008000"x,2 c2d("0000007f"x,l c2d("00000080"x,1 c2d("OOOOOOff"x c2d("12345678" c2d("ABCDEFGH"
13.4.2
1 2147483647 2147483647 -2147483648 -1 -1 32767 -32768 127 -128
255 17434265340928784376 13961937044701104072
C2X - Character to Hexadecimal
Funktion Diese Funktion gibt zum dem eingegebenen Text dessen hexadezimale Schreibweise zurück. Die Ausgabe ist damit immer doppelt so lang, wie der eingegebene Text.
Format zahl = C2X(text) text Dieser Text wird als EBCDIC String angesehen, dessen hexadezimale Zeichenfolge zurückgegeben wird.
Beispiele say say say say
c2x("1234567890") c2x("ABCDEFGHIJ") c2x("abcdefghij") c2x("•'§$%&/()=")
13.4.3
/* ergibt: /* ergibt: /* ergibt: /»ergibt:
F1F2F3F4F5F6F7F8F9F0 C1C2C3C4C5C6C7C8C9D1 81828384858687888991 4F7D7C5B6C50614D5D7E
*/ */ */ */
D2C - Decimal to Character
Funktion Mit dieser Funktion kann man eine Dezimalzahl in das EBCDIC Character Format umwan-
Format zahl = D2C(zahl,n) zahl Dieser Text wird als Dezimalzahl angesehen, deren interne Darstellung in EBCDIC Zeichen zurückgegeben werden.
287
13.4 Konvertierungsfunktionen
Diese Zahl gibt an, wie viele Bytes nach der Umwandlung von z a h l zurückgegeben werden. Falls die durch n angegebene Ausgabelänge größer ist, als aus der z a h l Zeichen entstehen, wird links mit Blanks aufgefüllt. Falls bei der Umwandlung mehr Zeichen entstehen, als durch n definiert, werden links stehende Zeichen abgeschnitten.
Beispiele numeric digits 22 say d2c(240,10) say d2c(249,10) say d2c(13961937044701104072,10) say d2c(17434265340928784376,10)
13.4.4
/* /* /* /*
ergibt: ergibt: ergibt: ergibt:
0 9 ABCDEFGH 12345678
*/ */ */ */
D2X - Decimal to Hexadecimal
Funktion Mit dieser Funktion kann man eine Dezimalzahl in das Hexadezimal Format umwandeln.
Format zahl = D2X(zahl,n) zahl Dieser Text wird als Dezimalzahl angesehen, deren Darstellung in Hexadezimalzeichen zurückgegeben wird. Diese Zahl gibt an, wie viele Bytes nach der Umwandlung von z a h l zurückgegeben werden. Falls die durch n angegebene Ausgabelänge größer ist, als aus der z a h l Zeichen entstehen, wird links mit 00 aufgefüllt, wenn es sich um eine positive Zahl handelt und es wird mit FF aufgefüllt, wenn es sich um eine negative Zahl handelt. Falls bei der Umwandlung mehr Zeichen entstehen, als durch n definiert sind, werden links stehende Zeichen abgeschnitten.
Beispiel numeric digits 22 say d2x(240,20) say d2x(249,20) say d2x(-16,20) say d2x(13961937044701104072,20) say d2x(17434265340928784376,20)
/* /* /* /* /*
ergibt: ergibt: ergibt: ergibt: ergibt:
000000000000000000F0 000000000000000000F9 FFFFFFFFFFFFFFFFFFFO OOOOC1C2C3C4C5C6C7C8 0000F1F2F3F4F5F6F7F8
*/ */ */ */ */
Die grau unterlegten Stellen wurden aufgrund der Längenangabe von 20 links aufgefüllt.
13 Die REXX Funktionen
288
13.4.5
X2B - Hexadecimal to Binary
Funktion Umwandlung einer Hexadezimalzahl in eine binäre Zeichenkette im Text Format. Format text = X2B(hexzahl) hexzahl Diese Hexadezimalzahl wird in eine binäre Zeichenkette umgewandelt. Die Ausgabe ist viermal so lang, wie die Eingabe. Beispiele say x2b("ff") say x2b("ll") say x2b("8AB1")
13.4.6
/* ergibt: 11111111 /* ergibt: 00010001 /* ergibt: 1000101010110001
*/ */ */
X2C - Hexadecimal to Character
Funktion Umwandlung einer Hexadezimalzahl in eine Zeichenkette. Format text = X2C(hexzahl) hexzahl Diese Hexadezimalzahl wird in eine Zeichenkette umgewandelt. Die Ausgabe ist halb so lang, wie die Eingabe. Beispiele say say say say
x2c("f0flf2f3f4f5f6f7f8f9") x2c("clc2c3c4c5c6c7c8c9dl") x2c("81828384858687888991") x2c("4F7D7C5B6C50614D5D7E")
13.4.7
/* /* /* /*
ergibt: 0123456789 ergibt: ABCDEFGHIJ ergibt: abcdefghij ergibt: ! ' § $ % & / ( ) =
X2D - Hexadecimal to Decimal
Funktion Umwandlung einer Hexadezimalzahl in eine Dezimalzahl. Format zahl = X2D(hexzahl,n) hexzahl Diese Hexadezimalzahl wird in eine Dezimalzahl umgewandelt.
*/ */ */ */
13.4 Konvertierungsfunktionen
289
Diese Zahl gibt an, wie viele Bytes aus h e x z a h l von rechts her umgewandelt werden. Ist das erste (also das am weitesten links stehende) Bit dieser Zahl eins, dann wird die Zahl als negative Zahl im Zweierkomplement ausgegeben. Ist diese Zahl Null, dann ist der Rückgabewert immer Null. Hinweis Bei der Anwendung dieser Funktion muss unbedingt darauf geachtet werden, dass NUM E R I C DIGITS groß genug gesetzt ist. Anderenfalls endet der Aufruf von X 2 D mit einem Fehler. Beispiele /* DOC: REXX X2D ************************************************/ /* DOC: Beispiele für Convert Function X2D */ /* (c) LANZT am: 11 May 2004 */ /*********************************************************************/ numeric digits 22
say say say say say say say say say say say
right(x2d("00000001"),22) right(x2d("7fffffff"),22) right(x2d("7fffffff",4),22) right(x2d("80000000",4),22) right(x2d("7fffffff",1),22) right(x2d("7fffffff",2),22) right(x2d("00007fff",2),22) right(x2d("00008000",2),22) right(x2d("0000007f",1),22) right(x2d("00000080",1),22) right(x2d("000000ff" ),22)
/* /* /* /* /* /* /* /* /* /* /*
Eine Eins Größte positive Zahl im Vollwort Gröfite positive Zahl im Vollwort Größte negative Zahl im Vollwort Nur das rechteste Byte Nur die rechtesten 2 Bytes Größte positive Zahl im Halbwort Größte negative Zahl im Halbwort Größte positive Zahl im Byte Größte negative Zahl im Byte Größte Zahl im Byte ohne Vorz.
*/ */ */ */ */ */ */ */ */ */ */
Ich habe das Programm laufen lassen. Das Ergebnis sehen Sie hier: x2d( "00000001" ) x2d( "7fffffff" ) x2d( "7fffffff" ,4) x2d( "80000000" ,4) x2d( "7fffffff" ,1) x2d( "7fffffff" ,2) x2d( "00007fff" ,2) x2d( "00008000" ,2) x2d( "0000007f" ,1) x2d( "00000080" ,1) x2d( "000000ff" )
1 2147483647 2147483647 -2147483648 -1 -1 32767 -32768 127 -128 255
Hinweis X 2 D arbeitet genau so, wie die Funktion C2D, nur mit dem Unterschied, dass als Eingabewerte Hexadezimalzahlen angegeben werden.
290
13.5
13 Die REXX Funktionen
Formatierungsfunktionen
Mithilfe dieser Funktionen können Daten passend für die Ausgabe formatiert werden.
13.5.1
CENTER - Zentrieren einer Zeichenkette
Funktion Mit dieser Funktion kann eine Zeichenkette so angeordnet werden, dass die Zeichenkette in der Mitte steht und sowohl links als auch rechts mit dem Füllzeichen aufgefüllt wird. Format text =
CENTER(intext,länge,füllzeichen)
intext Eingabetext, der auf die in l ä n g e stehende Anzahl Zeichen erweitert oder verkürzt wird, länge Anzahl Zeichen des Ergebnistextes. Ist l ä n g e kleiner als die Länge von i n t e x t , dann wird der Eingabetext links und rechts gleichmäßig abgeschnitten zurückgegeben. füllzeichen Hier kann ein Füllzeichen angegeben werden, welches bei einer Erweiterung des i n t e x t links und rechts angefügt wird. Standard für das Füllzeichen ist das Blank.
13.5.2
COPIES - Texte vervielfältigen
Funktion Mit dieser Funktion kann eine Zeichenkette n-mal vervielfältigt werden. Format t e x t = COPIES(intext,n) intext Eingabetext, der n-mal vervielfältigt ausgegeben wird. n Anzahl der Vervielfältigungen. Beispiel say copies ("*" ,10)
ergibt >**********
123456.667 —> 123457 —> 123456.67 —> 123456.6670 - - > 1.23456667E+05 --> 123456.67
Strukturieren großer Zahlen Wie Sie an den obigen Beispielen erkennen können, fehlt hier noch eine Möglichkeit, große Zahlen in Dreiergruppen anzuordnen. Diesen Mangel habe ich schon vor langer Zeit entdeckt und eine REXX Funktion entwickelt, die das kann. Diese Funktion heißt STRUKTR und ist in den LANZ Utilities enthalten. Siehe hierzu das Kapitel „STRUKTR - Zahlen strukturieren" ab Seite 544. Beispiele ohne und mit STRUKTR format(123456.6666) format(123456.6666,8,0) format(123456.6666,8,2) format(123456.6666,8,4) format(123456.6666,,,2,2) format(123456.6666,8,2,2,7) struktr(format(8123456.6666), ' . ') struktr(format(123456.6666,8,0), ' : ') struktr(format(99123456.6666,8,2)) struktr (format (123456. 6666,8,4) , ' • . ' ) struktr(format(9876123456.6666,,,2,2), 1 .') struktr(format(9876123456.6666,12,2,2,11))
- - > 123456.667 - - > 123457 — > 123456.67 - - > 123456.6670 — > 23456667E+05 — > 123456.67 -> 8.123.456,67 -> 123:457 -> 99 123 456,70 -> 123.456,6670 - -> 9.876.123.460 9 876 123 460,00
292
13 Die REXX Funktionen
Beim Aufruf von STRUKTR kann das Trennzeichen als 2. Parameter mitgegeben werden. Wenn kein Trennzeichen eingegeben wird, dann wird als Trennzeichen Blank benutzt. Ich habe die Trennzeichenparameter grau unterlegt.
13.5.4
JUSTIFY - Formatieren einer Zeichenkette
Funktion Blockformatieren einer aus Worten bestehenden Zeichenkette durch Hinzufugen von Füllzeichen zwischen den Worten. Format text =
JUSTIFY(intext,länge[,füllzeichen])
intext Eingabetext, der normalerweise aus Worten besteht, die jeweils durch ein oder mehrere Blanks getrennt sind. länge Länge des Ergebnistextes, füllzeichen Zeichen, das zwischen die Worte eingefugt wird. Default ist das Blank. Beispiel say justify(" Das ist ein say justify(" Wort
Text",40,"-") ",40,"-")
Diese Befehle geben folgende Texte aus: Das Wort
ist
ein
Text
13.5.5
LEFT - Text linksbündig anordnen
Funktion Diese Funktion dient zum linkbündigen Ausrichten eines Textes mit Auffüllen durch Füllzeichen. Format text =
LEFT(intext,länge[,füllzeichen])
intext Eingabetext, der nicht länger als l ä n g e sein sollte.
13.6 Stringfunktionen
293
länge Länge des Ergebnistextes. füllzeichen Zeichen, das den Text für die Ausgabe rechts um die erforderliche Anzahl füllzeichen erweitert, bis er so lang ist, wie länge angibt. Default ist das Blank. Beispiele finden Sie in vielen Programmen hier im Buchtext.
13.5.6
RIGHT - Text rechtsbündig anordnen
Funktion Diese Funktion dient zum rechtsbündigen Ausrichten eines Textes mit Auffullen durch Füllzeichen. Format text =
RIGHT(intext,länge[,füllzeichen])
intext Eingabetext, der nicht länger als länge sein sollte. länge Länge des Ergebnistextes. füllzeichen Zeichen, das den Text für die Ausgabe links um die erforderliche Anzahl füllzeichen erweitert, bis er so lang ist, wie länge angibt. Default ist das Blank. Beispiel Beispiele finden Sie im Kapitel „X2D - Hexadecimal to Decimal" ab Seite 288.
13.6
Stringfunktionen
Die Stringfunktionen bilden im REXX eine mächtige Gruppe von Programmiermitteln. Bis auf eine CHANGE Funktion habe ich bisher noch keine weitere String Funktion vermisst. Deshalb habe ich schon vor langer Zeit eine CHANGE Funktion mithilfe von REXX geschrieben. Der REXX Quellkode dieser CHANGE Funktion befindet sich in den LANZ Utilities. Die CHANGE Funktion ist im Kapitel: „CHANGE - Change Funktion im REXX" ab Seite 543 beschrieben.
294
13.6.1
13 Die REXX Funktionen
DELSTR - Löschen von Teilstrings
Funktion Mit dieser Funktion kann man aus einem Text einen Teil herauslöschen. Der Text wird um den heraus gelöschten Teil gekürzt. Format text = DELSTR(intext,start[,anzahl]) intext Eingabetext, start Startposition des zu löschenden Textes in intext. Wenn die Startposition größer ist, als der intext lang ist, dann wird intext unverändert zurückgegeben. anzahl Anzahl der Zeichen, die gelöscht werden sollen. Wird dieser Parameter nicht angegeben, dann wird der Text bis zum Ende gelöscht. Beispiel say delstr("Hallo",4)
13.6.2
ergibt: "Hai"
INSERT - Text einfügen
Funktion Mit INSERT kann man einen Text in einen anderen Text einfügen. Dies ist gewissermaßen die Umkehrfunktion zu DELSTR. Format text =
INSERT(intext,text[,start][,länge][,füllzeichen])
intext Text, der eingefugt wird. text Text, in den eingefügt wird, start Startposition in text, nach der die Einfügung erfolgen soll. Wenn die Startposition fehlt oder Null ist, dann wird intext am Beginn von text eingefugt.
295
13.6 Stringfunktionen
länge Anzahl der Zeichen, die eingefugt werden sollen. Wird dieser Parameter nicht angegeben, dann wird automatisch die aktuelle Länge von intext benutzt. füllzeichen Um dieses Zeichen wird intext vor dem Einfügen verlängert, wenn länge größer ist als die aktuelle Länge von intext. Beispiel Siehe nächste Funktion CHANGE.
13.6.3
CHANGE - Ändern von Texten
Diese Funktion ist nicht Bestandteil von TSO/E REXX. Vielmehr habe ich sie entwickelt, weil eine CHANGE Funktion bei der täglichen Arbeit mit REXX im TSO/ISPF Umfeld meiner Meinung nach unerlässlich ist. Diese Funktion ist Bestandteil der LANZ Utilities. Siehe hierzu das Kapitel „CHANGE - Change Funktion im REXX" ab Seite 543. Funktion Ändern von Texten. Format text =
CHANGE(intext,suchtext[,ersatztext][,testtext])
intext Text, der geändert werden soll. suchtext Text, der ersetzt werden soll. CHANGE ersetzt alle Vorkommen von suchtext, die in intext beim Durchsuchen von links nach rechts in einem Aufruf vorkommen. Kommt suchtext im ersatztext ebenfalls vor, dann werden diese Stellen natürlich nicht ersetzt. ersatztext Dieser Text soll den suchtext ersetzen. Wenn der Ersatztext weggelassen wird oder einen Nullstring enthält, dann wird suchtext lediglich aus intext entfernt. testtext Der CHANGE soll nur dann erfolgen, wenn dieser Text auch in intext enthalten ist. Natürlich macht es keinen Sinn, wenn suchtext und testtext gleich sind. Die Funktion läuft aber auch dann einwandfrei durch. Hier zunächst der Quellkode der Funktion CHANGE: 01 /* DOC: Funktion CHANGE Im REXX 02 /* DOC: Autor: Franz Lanz im Juni 91 03 /* Aufruf: text = change(intext,suchtextY,ersatztext"Y,testtext")
*/ */ */
296
13 Die REXX Funktionen
04 05 06 07 08 09 10 11
/* /* /* /* /* /* /* /*
13 14 15 16 17 18 19 20 21
parse arg intext,suchtext,ersatztext,testtext if length(testtext) > 0 & pos(testtext,intext) = 0 then return(intext) ip = 1 do while pos(suchtext,intext,ip) > 0 ii = pos(suchtext,intext,ip) intext = insert(ersatztext,delstr(intext,ii,length(suchtext)),ii-l) ip = ii + length(ersatztext) end return(intext)
12
text : ergebnis-string intext : eingäbe string suchtext : suchbegriff ersatztext: ersatzstring, der den Suchbegriff ersetzt testtext : change nur, wenn dieser text im string vork. Der Ersatzstring kann laenger oder kuerzer als der Suchbegriff sein. Wird der Ersatzstring weggelassen, dann wird der Suchbegriff aus dem intext-String entfernt.
*/ */ */ */ */ */ */ */
/*********************************************************************/
Programm 16 CHANGE: Funktion für Tex tänderungen
Erläuterungen zum Programm CHANGE: Zeile 13 Übernahme der Parameter. Wenn ein Parameter nicht übergeben wurde, enthält die entsprechende Variable einen Nullstring. Zeile 14 Wenn der Testtext angegeben wurde, dieser aber nicht in Intext enthalten ist, wird nur Intext zurückgegeben. Zeile 15 Setzen des Anfangswertes für den Such-Pointer. Zeile 16 Die DO WHILE Schleife läuft so lange, wie der Suchtext im Intext beim Durchlauf gefunden wird. Dadurch wird auch das mehrfache Auftreten des Suchtextes verarbeitet. Zeile 17 Nächste Position des Suchtextes ermitteln. Zeile 18 Hier wird der Suchtext mittels DELSTR gelöscht und stattdessen der Ersatztext mittels INSERT eingefügt. Zeile 19 Der Suchpointer wird hinter den soeben neu eingefugten Ersatztext gesetzt.
13.6 Stringfunktionen
297
Zeile 20 Ein neuer Suchlauf beginnt. Zeile 21 Rückkehr ins rufende Programm und Rückgabe des Ergebnistextes. Beispiele say say say say say say say say
"1. "2. "3. "4. "5. "6. " 7. "8.
Vchange ("Hugo und Willi sind da", "Willi" , "Albert") "e Hugo*********< >***************
_ZCMD / / + +DSN + + 1. + 2. + 3. + 4. + 5. + 6. + 7. + 8. + 9. +10. +11.
=#dsn =?sspi =? ssp2 =?ssp3 =? ssp4 =? ssp5 =? ssp6 =?ssp7 =?ssp8 =?ssp9 =?sspl0 =?sspll
+ alle Members
16.3 E i n i g e t y p i s c h e B e i s p i e l e +12. +13. +14. +
329
=?sspl2 =?sspl3 =?sspl4
+MSGl=#msglvll + %Hilfe m i t PF1, ausführen m i t ENTER ) INIT &zcmd = ' ' .Cursor = sspl .csrpos = 1 . help = SSTU01 Smsglvll = 1 ' )REINIT i f (.msg A = Sz) .attr(.Cursor)=•HILITE(REVERSE)' Spanrc = 1 ) PROC Spanrc = 0 i f ( . r e s p = END) &panrc = 1 ) END Programm 25 SSPANEL1: Panel Definition
D a m i t ich n i c h t b e i j e d e m A u f r u f d i e S u c h t e x t e n e u e i n g e b e n m u s s , w e r d e n d i e V a r i a b l e n S S P 1 b i s S S p l 4 , w e l c h e d i e S u c h t e x t e e n t h a l t e n , in d e n I S P F P r o f i l e g e s c h r i e b e n u n d v o r d e m N e u a u f r u f d e s P a n e l s w i e d e r e i n g e l e s e n . Ich h ä t t e d a s S c h r e i b e n u n d L e s e n d e r V a r i a b len a u c h i m P a n e l d u r c h f u h r e n k ö n n e n , h a b e m i c h a b e r d a f ü r e n t s c h i e d e n , d i e s in d e r P r o z e dur SS zu tun. Hier jetzt der Ausschnitt aus der R E X X Prozedur SS mit d e m das Panel S S P A N E L 1 aufgerufen wird: / * * * * * * * * * * * * * * * * * * * * * * * * * inputpanel * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * / / * e i n l e s e n m e h r e r e r s u c h b e g r i f f e ueber das p a n e l s s p a n e l l */ / * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /
inputpanel: dsn = argdsn "ISPEXEC VGET
(SSP1,SSP2,SSP3,SSP4,SSP5,SSP6,SSP7,"!!, " S S P 8 , S S P 9 , S S P 1 0 , S S P 1 1 , S S P 1 2 , S S P 1 3 , S S P 1 4 ) PROFILE" "ISPEXEC DISPLAY PANEL(SSPANEL1)" i f p a n r c = 1 then e x i t p.l=sspl; p.2=ssp2; p.3=ssp3; p.4=ssp4; p.5=ssp5; p.6=ssp6; p.7=ssp7; p.8=ssp8; p.9=ssp9; p.lO=ssplO; p . l l = s s p l l ; p , 1 2 = s s p l 2 ; p , 1 3 = s s p l 3 ; p . l 4 = s s p l 4 ; "ISPEXEC VPUT ( S S P 1 , S S P 2 , S S P 3 , S S P 4 , S S P 5 , S S P 6 , S S P 7 , " ! ! , " S S P 8 , S S P 9 , S S P 1 0 , S S P 1 1 , S S P 1 2 , S S P 1 3 , S S P 1 4 ) PROFILE" do i n i = 1 t o 14 i f p . i n i = ' ' then l e a v e i n i i f s u b s t r ( p . i n i , 1 , 1 ) = "C" then i n . i n i = " srchfor"p.ini eise in.ini = " srchfor "p.ini end i n i ini = ini - 1 c a l l sysinout return Programm 26 INPUTPANEL: DISPLAY PANEL Beispiel
330
16 Einleitung zum Programmieren im ISPF
Und so sieht die Anzeige aus, wenn das Panel SSPANEL1 ausgegeben wurde: COMMAND
= >
Eingabe der Anweisungen für Super-Search Aufrufe
DSN = 'PROX. LOGON.REXX'
alle Members
1. = 'MSG' 2.
=
3. = 4. = 5. = 6.
=
7. = 8.
=
9. = 10. = 11. = 12. =
13. = 14. = MSG1= Hilfe mit PF1, ausführen mit ENTER
16.3.2
Beispiel für die Verwendung von Skeletons
Skeletons werden meistens benutzt, um umfangreiche Job Streams zusammenzustellen. Aus einer solchen Anwendung habe ich das folgende Beispiel entnommen. Funktion In einen umfangreichen Job, der durch eine REXX Prozedur erstellt wird, werden auch Steps eingefugt, die BIND PACKAGE Anweisungen für DB2 durchfuhren. Da diese Jobs für verschiedene LPARs erstellt werden müssen, sind alle Werte, die sich auf die einzelnen LPARs beziehen, variabel gehalten. Hier zunächst das Skeleton Member: Die Variablen in Skeletons beginnen immer mit einem Ampersand (&) Zeichen. Die Verknüpfung von Variablen mit Texten oder anderen Variablen geschieht durch einen Punkt (.). Da die einzelnen Qualifiers der DSNs auch durch Punkte getrennt werden müssen, muss man bei der Erstellung von DSNs durch Verknüpfung von Variablen in Skeletons zwei Punkte benutzen. //* DOC: SKEL VINTPAC ************************** //* DOC: AUSFUEHREN DER BIND PACKAGE ANWEISUNGEN //*********************************************** //SSTEPN EXEC //STEPLIB DD // DD // DD //SYSPROC DD // DD JIM $ ISPFDD NT //DBRMLIB DD
PGM=IKJEFT01,REGI0N=4M DISP=SHR,DSN=SDSNEXIT DISP=SHR,DSN=&DSNLOAD DISP=SHR,DSN=&VERLOAD DISP=SHR,DSN=SVERREXXO DISP=SHR,DSN=SVERREXX1 DISP=SHR,DSN=SDBRMLIB
331
16.3 Einige typische Beispiele //RUNLIB //BGFILE //STAT //FEHL
//
//SYSIN
//
//SYSPRINT
//
DD DD DD DD DD DD
DISP=SHR,DSN=SDB2RUN DISP=SHR,DSN=SBGFILE DISP=MOD,DSN=&PACKSTAT..4DB2SYS DISP=MOD,FREE=CLOSE, DSN=SDB2FEHL..SDB2SYS..iGRP UNIT=VIODA,SPACE=(CYL, (10,10)) , DSORG=PS,RECEM=FB,LRECL=80,BLKSI2E=27920 UNIT=VIODA,SPACE=(CYL,(5,5)),DSORG=PS, RECFM=FBA,LRECL=133,BLKSIZE=27950 SYSOUT=* SYSOUT=*
//LISTE DD //SYSTSPRT DD //SYSTSIN DD PROFILE NOPREFIX NOMSGID ISPSTART CMD (%VINTPAC &DB2SYS &SYST SPACKZEIT) END //INMEM DD * Programm 27 VINTPAC: Skeleton Definition
Jetzt der Ausschnitt aus dem Programm, das den Skeleton VINTPAC in den Job einfugt, wobei die Skeleton Variablen durch die Aktualwerte ersetzt werden. /* /* Werte für SKEL VINTPAC aus LOKATIONEN lesen /* say exname time() "Beginn Step PACAUSF" dsnexit = lesen_lokation("VPROD"syst "DSNEXIT") dsnload = lesen_lokation("VPROD"syst "DSNLOAD") dbrmlib = lesen_lokation("VPROD"syst "DBR") db2run = lesen_lolcation("VPROD"syst "DB2RUNLIB") bgfile = bgut db2sys = lesen_lokation("VPROD"syst "DB2SYS") bnderr = lesen_lokation("VPROD"syst "BNDERR") packzeit= packcalc("PAC") /* Laufzeitberechnung für BIND */ stepn = "PACAUSF" /* Dieser Name wird auch in BNDERR benutzt "ISPEXEC FTINCL VINTPAC" if rc > 0 then call ispf_error rc " aus FTINCL VINTPAC"
*/ */ */
Hinweis Manche Variablen werden schon weiter vorne im Job Erstellungsprogramm besetzt. Sie tauchen deshalb in diesem Programmteil nicht auf. Und hier der erstellte Step, in dem die Variablen durch die echten Werte ersetzt sind: //* DOC: SKEL VINTPAC ************************** //* DOC: AUSFUEHREN DER BIND PACKAGE ANWEISUNGEN //**********************************************, //PACAUSF EXEC PGM=IKJEFT01 ,REGION=4M //STEPLIB DD DISP=SHR,DSN=DB2P. ALIAS. DSNEXI // DD DISP=SHR,DSN=DB2P.ALIAS.DSNLOA // DD DISP=SHR,DSN=PROX.LOAD //SYSPROC DD DISP=SHR,DSN=PROX.CEXEC // DD DISP=SHR,DSN=PROX.CEXEC //* DOC: SKEL $ISPFDD ****************** //ISPMLIB DD DISP=SHR,DSN=ISP.SISPMENU
332
16 Einleitung zum Programmieren im ISPF
/ISPPLIB DD DISP=SHR,DSN=ISP.SISPPENU /ISPSLIB DD DISP=SHR,DSN=ISP.SISPSENU /ISPPROF DD DISP=(NEW,PASS),DCB=(RECFM=FB,LRECL=80,BLKSIZE=3120), / SPACE=(TRK,(5,5,10),RLSE),UNIT=VIODA /ISPTLIB DD DISP=(SHR,PASS),DSN=*.ISPPROF,VOL=REF=*.ISPPROF DD DISP=SHR,DSN=ISP.SISPTENU / /ISPLOG DD DUMMY /****** ENDE $ISPFDD ****************** /DBRMLIB DD DISP=SHR,DSN=PRDXX. DBRMLIB /RUNLIB DD DISP=SHR,DSN=DB2P.ALIAS.RUNLIB.LOAD /BGFILE DD DISP=SHR,DSN=PRDXX.DB2PACK /STAT DD DISP=MOD,DSN=PROX.PACKSTAT.DB2P /FEHL DD DISP=MOD,FREE=CLOSE, / DSN=PROX.DB2BIND. ERROR. DB2P.PAC /SYSIN DD UNIT=VIODA,SPACE=(CYL, (10,10) ) , DSORG=PS, RECFM=FB,LRECL=80,BLKSIZE=27920 / /SYSPRINT DD UNIT=VIODA, SPACE= (CYL, (5, 5) ) ,DSORG=PS , / REC™=FBA,LRECL=133,BLKSIZE=27950 /LISTE DD SYSOUT=* /SYSTSPRT DD SYSOUT=* /SYSTSIN DD * PROFILE NOPREFIX NOMSGID ISPSTART CMD(%VINTPAC DB2P 0 182,182) END //INMEM DD * B97158 B97198
Dies ist ein relativ komplexes Beispiel aus der Praxis. Versuchen Sie einmal den Ablauf nachzuvollziehen. Ich habe alle wichtigen Stellen grau unterlegt. Wir werden uns in einem späteren Kapitel noch ausführlich mit der Benutzung von Skeletons beschäftigen.
16.3.3
Beispiel für die Benutzung von Tables
ISPF Tables sind Datenobjekte, die normalerweise im ISPF mit Programmen verarbeitet werden. ISPF Tables können mit der ISPF Option 7.4 auch direkt angesehen und manipuliert werden. Dieses Werkzeug ist aber eigentlich nur für Testzwecke gedacht. Beispiel Ich möchte Ihnen hier eine Tabelle vorstellen, die ich täglich benötige. Sie enthält die Namen der von mir zuletzt editierten Dateien, zusammen mit weiteren Informationen wie Datum und Uhrzeit der Benutzung. Zunächst hier der Programmteil aus dem Edit Makro #IMACR02, das am Ende jeder Edit Sitzung aufgerufen wird. Dabei wird die Table SLElpar geöffnet und der DSN der soeben editierten Dateien (mit Member) in die Table eingetragen. Falls die Table noch nicht existiert, wird sie neu angelegt und dann wird der DSN der editierten Datei als erste Zeile eingetragen. / * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /
/* Name der editierten Datei in die LE Tabelle eintragen
*/
/ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /
in_tab_ein: if edmem "" then dsn = eddsn"("edmem")"
333
16.3 Einige typische Beispiele else dsn = eddsn /* */ */ /* Edit DSN mit Edit Datum in Table eintragen und wegschreiben /* */ "ISPEXEC VGET (ZSYSID) SHARED" /* Hole Namen der LPAR */ tabname = "$LE"zsysid "ISPEXEC TBOPEN "tabname" LIBRARY(ISPTABL) WRITE SHARE" openrc = rc funktion = ""; datum = date("0"); zeit = time(); select when openrc = 0 then do /* Table existiert */ "ISPEXEC TBMOD "tabname" ORDER" "ISPEXEC TBSORT "tabname" FIELDS(DATUM,C,D,ZEIT,C,D)" "ISPEXEC TBCLOSE "tabname" LIBRARY(ISPTABL) REPLCOPY PAD(100)" end when openrc = 8 then do /* Table muss neu angelegt werden */ "ISPEXEC TBCREATE "tabname" KEYS (DSN) NAMES (FUNKTION,DATUM, ZEIT) " "ISPEXEC TBADD "tabname" ORDER" "ISPEXEC TBCLOSE "tabname" LIBRARY(ISPTABL) REPLCOPY PAD(IOO)" end when openrc > 8 then do zedlmsg = zerrlm "ISPEXEC SETMSG MSG(ISRZ001)" otherwise nop end /* select */ return
Verarbeitet wird die Table in dem Programm LASTED. Aus diesem Programm sehen Sie jetzt den Teil, der die Table zur Anzeige bringt: /* /* Tabelle mit DSN(MEMBER) Zeilen anzeigen /*
*/ */ */
"ISPEXEC TBTOP "tabname "ISPEXEC TBDISPL "tabname" PANEL(LASTED) AUTOSEL(NO)" if pre = 1 then exit if rc > 4 then do; call i error "TBDISPL"; exit; end;
Wenn der TBDISPL Befehl ausgeführt wird, erscheint das folgende Panel, dessen Anzeige ich verkürzt darstelle: LPRT Tabelle mit den zuletzt editierten Dateien anzeigen Row 1 to 35 of 123 COMMAND = > SCROLL ===> CSR Sort: D — Date or N = Name D _ C Letzte DSN in Edit PROX. LOGON. REXX (#TT) SMQP. JCL(TT) SQMT.JCL(ISRDDN) PROX. LANZ . REXX ( INTTEST ) PROX. LOGON. REXX ( # IMACROI ) PROX. LOGON. REXX (# IMACROA)
Maximale Zeilen: 123 Datum
Zeit
04/04/05 04/04/05 04/04/05 04/04/05 04/04/05 04/04/05
18:08:35 17:03:10 15:07:40 14:29:35 10:34:59 10:31:38
334
16 Einleitung zum Programmieren im ISPF
Wenn ich in dieser Anzeige den Cursor vor einem DSN positioniere, kann ich dort Auswahlkodes für Edit, View, Browse usw. eingeben. Am Ende einer solchen Aktion erscheint wieder dieses Panel und ich kann eine neue Auswahl treffen. Eine ausführliche Beschreibung der Anwendung finden Sie im Kapitel „Die Programme DOC und LASTED" ab Seite 499.
16.3.4
Beispiel für die Verwendung von ISPF Variablen
Es gibt zwei Typen von Variablen im ISPF: 1. Die System Variablen. 2. Die Benutzer Variablenn System Variablen werden, wie es der Name schon sagt, vom ISPF angelegt und verwaltet. Man kann sie in allen ISPF Funktionen nutzen. Einige von ihnen kann man auch inhaltlich ändern. Einige Systemvariable sind bestimmten ISPF Services zugeordnet. Da ich in den bisher gezeigten Beispielen schon einige Variable beider Typen benutzt habe, werde ich auf weitere Beispiele verzichten. Allerdings möchte ich Ihnen zeigen, wie Sie die jetzt in Ihrem ISPF definierten Variablen und deren Inhalt ansehen können. Dazu gehen wir wie folgt vor: Wir wählen die ISPF Option 7.3 aus und erhalten folgendes Panel, das ich verkürzt darstelle: Menu
Utilities
Help Variables
Command
= >
Row 1 to 31 of 930 Scroll = > CSR
Add, delete, and change variables. Underscores need not be blanked. Enter END command to finalize changes, CANCEL command to end without changes. Application . : ISR Variable Z ZACCTNUM ZAPPLXD ZBDMXCNT ZCUNIT ZCUSIZE ZDATE ZDATEF ZDATE FD ZDATE STD ZDAY ZDAYOFWK ZDBCS ZDECS ZENVIR ZFLMTRMT ZGE ZGUI ZHILITE
P S S S S S S S S S S S S S S S S S S S
A N N N N N N N N N N N N N N N N N N N
Value 09806462 ISR 000000000 SYSALLDA 0128 04/04/06 YY/MM/DD YY/MM/DD 2004/04/06 06 Tuesday NO ISPF 5.2MVS ISR3278A YES YES
Abbildung 115 Anzeige der Z-Variablen
TSO
335
16.3 Einige typische Beispiele
Soweit es das ISPF zulässt, können Sie in diesem Panel die Inhalte von Variablen ändern, sie ganz löschen oder auch neue Variable anlegen. Ich habe einige der Z-Variablen grau unterlegt. Diese enthalten Werte, die man im täglichen Betrieb oft benötigt. Beispiel Ich habe eine kleine REXX Prozedur erstellt, die einige der ISPF Variablen einliest und mit SAY ausgibt: /* /* /* /*
DOC: REXX ZVARS DOC: Beispielprogramm zur Ausgabe einiger Z Variablen, die mit DOC: Standardwerten besetzt sind. (c) LANZT am: 8 Apr 2004
*/ */ */ */
"ISPEXEC VGET (ZDATESTD ZACCTNUM ZAPPLID ZDAY ZDAYOFWK ZJDATE ZJ4DATE" , " ZDATE ZDATEF ZTIME ZTIMEL) " * Beschreibungen der Variablen */ * Datum im Format von ZDATEF " ZDATE say "ZDATE */ = * Datumsformat say " ZDATEF */ = " ZDATEF say "ZDATESTD = "ZDATESTD * Datum im Standard Format */ say "ZDAYOFWK = "ZDAYOFWK * Wochentag */ * Monatstag say "ZDAY */ = "ZDAY * Julian Day in Kurzform say "ZJDATE */ = "ZJDATE * say "ZJ4DATE = "ZJ4DATE Julian Day in Langform */ * "ZTIME say "ZTIME Tageszeit in Kurzform */ = * Tageszeit in Langform say "ZTIMEL "ZTIMEL */ = say "ZACCTNUM = "ZACCTNUM * Account Nummer des TSO users */ * ISPF Application ID say "ZAPPLID = "ZAPPLID */
Hier die Ausgabe der Prozedur ZVARS: ZDATE ZDATEF ZDATESTD ZDAYOFWK ZDAY ZJDATE ZJ4DATE ZTIME ZTIMEL ZACCTNUM ZAPPLID
16.3.5
04/04/08 YY/MM/DD 2004/04/08 Thursday 08 04.099 2004.099 10:09 10:09:56.56 09806462 ISR
Beispiel für die Dateiverarbeitung mit ISPF
Für die Verarbeitung von Dateien hat man in einer ISPF Umgebung und bei der Verwendung der Prozedurensprache REXX grundsätzlich zwei Möglichkeiten: • •
Man verwendet den REXX Befehl EXECIO, der nur die Unterstützung des TSO benötigt. Man verwendet ISPF File Management Services.
Diese Unterscheidung ist insofern wichtig, als man damit festlegt, ob die Prozedur zur Ausführung lediglich die TSO Ebene oder auch die ISPF Ebene benötigt. Dieser Festlegung kommt vor allem dann Bedeutung zu, wenn beabsichtigt ist, die Prozedur auch in einem Batch Job zu benutzen. Denn in dem ersten Fall benötigt sie keine ISPF Umgebung im zwei-
336
16 Einleitung zum Programmieren im ISPF
ten aber schon. Das ist bei der Erstellung des Batch Jobs aber von einiger Bedeutung, wie wir in dem Kapitel „TSO und ISPF in Batch Jobs ausfuhren" ab Seite 319 gesehen haben. 1. Beispiel: Dateiverarbeitung mit TSO Unterstützung. Funktion Es wird ein Member eingelesen, welches selbst wieder Membernamen enthält. Diese Membernamen werden im String NONMEM gesammelt, wobei jeder Name nur dann in den String übernommen wird, wenn er ausschließlich aus zulässigen Zeichen besteht. Dieser Programmteil ist ein Ausschnitt aus einem wesentlich größeren Programm. Er enthält aber die gesamte Dateiverarbeitung zum Einlesen eines Members in den Stem „SICHN.". Vor dem Einlesen wird mit der Funktion SYSDSN geprüft, ob das Member auch tatsächlich existiert. /**********************************************************************/ /* Festellen, ob ein Member $SICHNOT vorhanden ist. Wenn ja, dann */ /* dieses einlesen und die Ausschlussmember in den String NONMEM füll.*/ /**********************************************************************/ member_name_char = "ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890§$#" nonmem = "" sichnot = "'"dataset"($SICHNOT)'" if sysdsn(sichnot) = "OK" then do address "TSO" "alloc dd(sichnot) dsn("sichnot") shr reuse" address "TSO" "execio * diskr sichnot (stem sichn. finis" address "TSO" "free dd(sichnot)" do i = 1 to sichn.0 sm = word(sichn.i,1) upper sm if verify(sm,member_name_char) 0 then iterate i nonmem = nonmem sm end i end
2. Beispiel: Dateiverarbeitung mittels ISPF Funktionen. Funktion Es wird ein Member erzeugt, dessen Datensätze im Stem DSNS, stehen. /****«****************************************************************/ /* Build Member COMPDSNS and write it into PO Dataset
*/
/ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /
"ISPEXEC LMINIT DATAID (UT) DATASET ("pds" ) ENQ (SHRW) " if rc > 0 then do call ispf_error rc „ISPEXEC LMINIT UT" return(12) end "ISPEXEC LMOPEN DATAID("ut") OPTION(OUTPUT)" if rc > 0 then do call ispf_error rc "LMOPEN UT" " LMFREE DATAID ( " ut") " return(12) end
16.3 Einige typische Beispiele
337
do i = 1 to dsns.0 record = dsns.i "ISPEXEC LMPUT DATAID("ut") MODE(INVAR) DATALOC(RECORD) DATALEN(80)" if rc > 0 then do call ispf_error rc "LMPUT" leave i end end i "ISPEXEC LMMREP DATAID ( "ut" ) MEMBER (COMPDSNS) " if rc > 8 then do call ispf_error rc "LMMREP" end "ISPEXEC LMCLOSE DATAID("ut")" "ISPEXEC LMFREE DATAID("ut")"
Dieses Beispiel ist nur ein Ausschnitt aus einem größeren Programm. Wie Sie sehen, benötigt man bei der Benutzung von ISPF Funktionen für die Durchfuhrung von Datei Einund Ausgaben einen wesentlich größeren Programmieraufwand als mit der EXECIO Methode unter TSO. Warum ich den Aufwand oft trotzdem betreibe, ist in dem folgenden Hinweis erklärt. Hinweis Die Bearbeitung von Dateien mithilfe von ISPF File Services ist wesentlich schneller als die TSO Methode mittels EXECIO. Dazu kommt noch, dass die Fehlerkontrolle und Fehlerauswertung die das ISPF bei der Ausfuhrung der Befehle liefert, viel besser ist als diejenige, die das TSO liefert.
16.3.6
Beispiel für die Ausgabe von Messages mit ISPF
Zur Ausgabe von eigenen Meldungen steht im ISPF ein Standardverfahren zur Verfugung, bei dessen Nutzung man ISPF Systemvariable mit Inhalten füllt und diese dann mit einem speziellen ISPF Service ausgibt. Das sind die Variablen: ZEDSMSG ZEDLMSG Hier haben die Buchstaben S und L die Bedeutung SHORT und LONG. Das heißt, dass man in ZEDSMSG eine kurze Nachricht mit bis zu 24 Zeichen stellen kann und in ZEDLMSG eine lange Nachricht mit bis zu 512 Zeichen. Wenn man nun die Ausgabe so gestaltet, dass man im Fehlerfall die Meldungen vom ISPF, die in ZERRLM stehen, in die Variable ZEDLMSG zusammen mit einem eigenen Text stellt, ergeben sich elegante Möglichkeiten, Fehlermeldungen auszugeben. Siehe hierzu das Kapitel „Fehlerbehandlung im ISPF" ab Seite 401. Diese Variablen werden von dem Befehl ISPEXEC SETMSG MSG(ISRZOOl) zur Ausgabe von Messages benutzt.
338
16 Einleitung zum Programmieren im ISPF
Das folgende Beispiel zeigt dies: Die hier verwendete Funktion QUERYENQ ist im Kapitel „QUERYENQ - ENQs ermitteln" ab Seite 397 beschrieben. when vcactnx CSR
DSLIST - Data Sets Matching PROX.SA.SIROS .VSTAF Command = > Command - Enter "/" to select action PROX.SA SIROS.VSTAF PROX.SA SIROS . VSTAF. DATA PROX. SA SIROS. VSTAF. INDEX
Message
Volume •VSAM* P0XYZ3 P0XYZ3
1 1 | Fehler bei Aufruf von BROWSE: PROX. SA. SIROS .VSTAFis a VSAM data set. An [ attempt was made to invoke a VSAM editor, viewer. or browser, but it is not 1 | allowed due to configuration table settings. 1
Hinweis Da bei der Ausgabe der obigen Message die Variable ZEDSMSG nicht besetzt war, wird deren Meldung, die normalerweise in der 3. Zeile der Anzeige rechts erscheint, unterdrückt. Ein weiterer Effekt, der aus dem Leerlassen von ZEDSMSG entsteht, ist der, dass die Anzeige des Textes in ZEDLMSG sofort auf dem Bildschirm erscheint und nicht erst nach dem Drücken der PF1 Taste, was notwendig wäre, wenn ZEDSMSG ebenfalls besetzt ist.
16.4 LIBDEF - Dynamische Verkettung von ISPF Bibliotheken
16.4
339
LIBDEF - Dynamische Verkettung von ISPF Bibliotheken
Wir haben weiter vorne in diesem Buch schon über die ISPF Bibliotheken gesprochen. Dort haben wir auch gesehen, dass diese Bibliotheksketten vor dem Starten des ISPF zugeordnet sein müssen. Wenn man aber nun eine Anwendung ausfuhren will, deren ISPF Objekte in eigenen ISPF Bibliotheken gespeichert sind, dann müsste man diese Objekte alle in die entsprechenden Bibliotheken, die fest zugeordnet sind, einspeichern. Da dies sehr aufwändig und unpraktisch wäre, wurde im ISPF eine Möglichkeit geschaffen, dynamisch und während das ISPF läuft, zusätzliche Bibliotheken vor die bereits vorhandenen zuzuordnen. Der Service, der dies besorgt, heißt LIBDEF Service. Funktion Zusätzliche Dateien zu den vorhandenen ISPF Bibliotheken dynamisch zuordnen und solche Zuordnungen auch wieder entfernen. Format ISPEXEC LIBDEF
lib-type [DATASET|EXCLDATA|LIBRARY|EXCLLIBR] [ID(dataset-list)|ID(libname)] [COND|UNCOND|STACK|STKADD]
lib-type Hier wird angegeben, für welchen Library Typ die Zuordnung erfolgen soll. Für folgende Library Typen kann eine LIBDEF Zuordnung erfolgen: ISPMLIB ISPPLIB ISPSLIB ISPTLIB ISPTABL ISPFILE ISPLLIB
Message library Panel library Skeleton library Table input library Table Output library File tailoring Output file Load module library
[DATASET|EXCLDATA|LIBRARY|EXCLLIBR] DATASET Definiert, dass die Angaben in ID eine Reihe von DSN bezeichnet. EXCLDATA
Definiert bei einem LIBDEF ISPLLIB Befehl, dass die Angaben in ID eine Reihe von DSN bezeichnet.
LIBRARY
Definiert, dass die Angaben in ID einen DD Namen bezeichnet.
EXCLLIBR
Definiert bei einem LIBDEF ISPLLIB Befehl, dass die Angaben in ID einen DD Namen bezeichnet.
[ID(dataset-list)|ID(libname)]
340 dataset-list libname
16 Einleitung zum Programmieren im ISPF Hier können bis zu 16 DSNs benannt werden, Hier kann ein DD Name angegeben werden.
Hinweis Die d a t a s e t - l i s t ist wie folgt zu definieren: ' D S N l 1 , 'DSN2 1 , ' DSN3' usw. Siehe hierzu das Beispiel weiter unten. [COND|UNCOND|STACK|STKADD] Mit diesen Optionen kann man definieren, ob und wo die mit LIBDEF erstellten Ketten angeordnet werden sollen. Hinweis Benutzen Sie immer die Option STACK. Wenn diese Option beim Anlegen der LIBDEFs fehlte, werden beim abschließenden Zurücknehmen der Zuordnungen alle vorher bestehenden LIBDEFs zurückgenommen. Falls man nämlich eine neue Anwendung innerhalb einer anderen Anwendung aufgerufen hat, die selbst auch LIBDEFs abgesetzt hatte, werden deren LIBDEFs ebenfalls zurückgenommen. Dies führt dazu, dass man nach der Rückkehr in die vorhergehende Anwendung, mit dieser nicht mehr arbeiten kann. Beispiel Das folgende Beispiel zeigt die LIBDEF Definitionen fur einige ISPF Bibliotheken: 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
/* DOC: REXX LIBDEF ************************************************/ / * DOC: B e i s p i e l f ü r d i e Ausführung von LIBDEF. */ / * (c) LANZT am: 4 Jun 2004 */ /*********************************************************************/ address ISPEXEC "CONTROL ERRORS RETURN" "LIBDEF ISPSLIB DATASET ID(1PEVP.SKEL' , " , " ' SMQP. PROD . SKEL' , " , "'SMQP.TEST.SKEL',", "' SQMT. PILOT. SKEL "' , " ' SQMT .USER. SKEL ' ) STACK" i f r c > 0 then c a l l i s p f _ e r r o r "LIBDEF ISPPLIB DATASET ID ('PROX.BUCH. PANEL'," , "' PROX.LANZ. PANEL' , " , " 'PROX. LOGON. PANEL1 , " , "' PROX. TASID . PANEL' ) STACK" i f r c > 0 then c a l l i s p f _ e r r o r "LIBDEF ISPMLIB DATASET ID (' PROX. BUCH .MSGS ' , " , "' PROX. LOGON. MSGS ' ) STACK" i f r c > 0 then c a l l i s p f _ e r r o r exit "LIBDEF ISPSLIB" / * LIBDEF wieder zurücknehmen */ "LIBDEF ISPPLIB" / * LIBDEF wieder zurücknehmen */ "LIBDEF ISPMLIB" / * LIBDEF wieder zurücknehmen */ exit
Programm 28 LIBDEF: Beispiele fiir die Anwendung des LIBDEF Befehls
16.4 LIBDEF - Dynamische Verkettung von ISPF Bibliotheken
341
Hinweis Ich habe in dem obigen Beispiel das Programm in der Zeile 21 verlassen, um zeigen zu können, wie die LIBDEF Definitionen nach der Ausfuhrung des LIBDEF Befehls des Programms aussehen. Um dies festzustellen, kann man den Online Befehl ISPLIBD aufrufen. Ich habe nach Ablauf der obigen Prozedur diesen Befehl in der Command Zeile eingegeben. Das Ergebnis sehen Sie anschließend:
ISPLLSA Command
LIBDEF Utility — ISPF LIBDEF Display
Library ISPFILE ISPILIB ISPLLIB ISPMLIB
DATASET
ISPPLIB
DATASET
ISPSLIB
DATASET
ISPTABL ISPTLIB **End**
Row 1 to 16 of 16 Scroll = > CSR
= > Type
USR Identifier ** LIBDEF not active ** LIBDEF not active ** LIBDEF not active PROX. BUCH. MSGS PROX. LOGON. MSGS PROX.BUCH.PANEL PROX. LANZ . PANEL PROX. LOGON. PANEL PROX. TASID. PANEL PROX.SKEL SMQP.PROD.SKEL SMQP.TEST.SKEL SQMT. PILOT. SKEL SQMT. USER. SKEL ** LIBDEF not active ** LIBDEF not active
** ** **
** **
A bbildung 116 ¡SPF LIBDEF DISPLA Y Panel
Hinweis Die LIBDEF Definitionen gelten immer nur für die ISPF Ebene, in der Sie ausgefiihrt werden. Das ist auch unbedingt notwendig, denn sonst könnte man ja verschiedene ISPF Anwendungen nicht gleichzeitig in mehreren Ebenen betreiben. Diesen Effekt möchte ich Ihnen zeigen, indem ich in einer anderen ISPF Ebene auch ISPLIBD aufrufe, während die oben durchgeführten Definitionen noch existieren. Wie Sie auf dem folgenden Bild sehen, sind in der anderen ISPF Ebene keine LIBDEFs aktiv. Damit haben wir den Beweis erbracht, dass die LIBDEF Anweisungen immer nur für die Ebene gelten, in der sie ausgeführt werden.
342
16 Einleitung zum Programmieren im ISPF LIBDEF Utility ISPF LIBDEF Display
Row 1 to 8 of 8 Scroll = > CSR
Command = > Library ISPFILE ISPILIB ISPLLIB ISPMLIB ISPPLIB ISPSLIB ISPTABL ISPTLIB **End**
16.5
Type
USR Identifier ** LIBDEF not ** LIBDEF not ** LIBDEF not ** LIBDEF not ** LIBDEF not * * LIBDEF not ** LIBDEF not ** LIBDEF not
active active active active active active active active
* * * * * *
* * * *
•• * *
ALTLIB - Dynamische Verkettung von EXEC Bibliotheken
Mit LIBDEF können nur ISPF Bibliotheken vor die standardmäßig zugeordneten Bibliotheken gesetzt werden. Aus den ISPF Bibliotheken können aber keine REXX Prozeduren ausgeführt werden. Um auch für REXX Prozeduren Bibliotheken vor die SYSPROC und SYSEXEC Dateien zuordnen zu können, wurde der Befehl ALTLIB eingeführt. ALTLIB muss als TSO Befehl ausgeführt werden. Wie wir weiter unten sehen werden, wirkt ALTLIB unter ISPF etwas anders als unter TSO. Mit dem ALTLIB Befehl kann man Folgendes erreichen: • • • • •
Alternative Bibliotheken für Prozeduren Aufrufe definieren. Festlegen, welche User-, Application-, und System-Level Bibliotheken durchsucht werden. Einen oder mehrere Bibliotheken Level von der Suche ausschließen. Die Suchreihenfolge auf den System Level zurücksetzen. Die gegenwärtige Suchreihenfolge anzeigen.
Normalerweise ist das TSO so eingestellt, dass bei einem Prozeduraufruf immer zuerst die SYSEXEC Bibliothek und dann die SYSPROC Bibliothek durchsucht werden. Dies gilt natürlich nur dann, wenn beide Bibliotheksketten zugeordnet sind. Mit dem ALTLIB Befehl kann man die gegenwärtige Suchreihenfolge anzeigen: Ich habe bei meinem TSO User den Befehl TSO ALTLIB DISPLAY eingegeben und folgenden Ausdruck erhalten: Current search order (by DDNAME) is: System-level EXEC DDNAME=SYSEXEC System-level CLIST DDNAME=SYSPROC
343
16.5 ALTLIB - Dynamische Verkettung von EXEC Bibliotheken
16.5.1
Suchreihenfolge in den Prozedurenbibliotheken
Die folgende Tabelle zeigt die Suchreihenfolge für Prozeduren Bibliotheken. Die zugehörigen DD Namen werden ebenfalls angezeigt. Diese DD Namen können entweder dynamisch mit dem ALLOCATE Befehl angelegt werden, oder schon durch die LOGON Prozedur angelegt worden sein. Nr. 1 2 3 4 5 6
Library Level User REXX Exec User CLIST Application REXX Exec Application CLIST SYSTEM REXX Exec SYSTEM CLIST
Zugeordneter DD Name SYSUEXEC SYSUPROC Definiert durch DD Namen oder DATASET Op. Definiert durch DD Namen oder DATASET Op. SYSEXEC SYSPROC
Tabelle 28 Suchreihenfolge in den Prozedurenbibliotheken
1. Beispiel: Temporäres Aktivieren einer Bibliothek zur Ausführung einer REXX Prozedur aus dieser Datei. 37 "ALTLIB ACTIVATE APPLICATION(EXEC) DDNAME (##DD) " 38 "ISPEXEC SELECT CMD(%"mem Strip (pp)")" 39 "ALTLIB RESET"
Hier wird die Datei, die unter dem DD Namen ##DD bereits zugeordnet ist, für den Aufruf der im SELECT Statement genannten Prozedur bereit gestellt. 2. Beispiel: Deaktivieren des CLIST System Levels. TSO ALTLIB DEACTIVATE SYSTEM(CLIST) Wenn ich jetzt wieder ein Display Command absetze, erhalte ich folgenden Ausdruck: Current search order (by DDNAME) is: System-level EXEC DDNAME=SYSEXEC Dies bedeutet, dass Prozeduren aus der SYSPROC Kette jetzt nicht mehr gefunden werden können. 3. Beispiel: Ich habe eine kleine REXX Prozedur geschrieben, die folgende Befehle abgesetzt hat. 01 /* DOC: REXX A1TLIB1 02 /* DOC: Beispiel 1 für das TSO Command ALTLIB 03 /* (c) LANZT
04 /************************************************** 05 06 07 08 09
"altlib display" "alloc dd(sysuexec) dsn(PROX.BUCH.REXX,", !!"PROX.UTIL.REXX) shr reuse" "altlib act user(exec)" say
*/ */
am: 17 May 2004 */
344
16 Einleitung zum Programmieren im ISPF 10 "altlib display" 11 "altlib reset" 12 say
13 "altlib display"
14 15 16 17
"ispexec qbaselib sysuexec id(dsns)" say say "DSNS zum DD Namen SYSUEXEC: "dsns "free dd(sysuexec)"
Programm 29 ALTLIB1: Beispiel für die Anwendung des ALTLIB Befehls
Beim Ablauf der Prozedur wird folgender Ausdruck erzeugt: Current search order (by DDNAME) is: System-level EXEC DDNAME=SYSEXEC System-level CLIST DDNAME=SYSPROC Current search order (by DDNAME) is: User-level EXEC DDNAME=SYSUEXEC System-level EXEC DDNAME=SYSEXEC System-level CLIST DDNAME=SYSPROC Current search order (by DDNAME) is: System-level EXEC DDNAME=SYSEXEC System-level CLIST DDNAME=SYSPROC DSNS zum DD Namen SYSUEXEC:
16.5.2
'PROX.BUCH.REXX 1 ,'PROX.UTIL.REXX 1
Der ALTLIB Befehl unter ISPF
Solange ALTLIB nur unter TSO benutzt wird, sind die einmal mittels ALTLIB eingestellten Suchreihenfolgen so lange aktiv, bis sie durch einen weiteren ALTLIB Befehl geändert wer-
Wird hingegen der ALTLIB Befehl unter ISPF aufgerufen, ändert sich diese Regel wie folgt: Regeln •
• •
•
Wenn man ALTLIB benutzt, während ISPF aktiv ist, kann man diesen Befehl auf dem Application Level absetzen. Bibliotheken, die beim Ablauf einer Application definiert werden, bleiben so lange aktiv, wie diese Application läuft. Wenn die Application endet, wird wieder der Zustand hergestellt, der vor dem Aufruf der Application bestanden hat. Wenn im ISPF Split Screen Mode eine Anwendung gestartet wird, die ALTLIB Befehle absetzt, dann gilt die dort definierte Suchreihenfolge nur für diese Screen Ebene. Diejenigen Bibliotheken, die beim Start einer Application im ISPF aktiv sind, werden durch die NEWAPPL und PASSLIB Parameter, die beim Start der Anwendung im SELECT Statement angegeben sind, nicht deaktiviert. Wenn beim Start einer Anwendung zwar NEWAPPL angegeben ist, PASSLIB aber nicht, dann stehen alle vorher definierten LIBDEF und ALTLIB Bibliotheken in dieser Anwendung nicht zur Verfügung. Sie stehen erst wieder zur Verfugung, wenn diese Anwendung endet.
16.5 ALTLIB - Dynamische Verkettung von EXEC Bibliotheken •
345
Wenn eine Anwendung mit NEWAPPL und PASSLIB gestartet wird, dann sind dort alle vorher mit LIBDEF und ALTLIB erstellten Bibliothekszuordnungen aktiv. Werden allerdings in dieser Anwendung weitere LIBDEF und ALTLIB Anweisungen ausgeführt, dann sind diese nur so lange aktiv, wie die Anwendung aktiv ist. Wenn beim Start einer Anwendung weder NEWAPPL noch PASSLIB angegeben sind, dann sind in dieser Anwendung alle vorher erstellten LIBDEF und ALTLIB Definitionen aktiv. Alle in dieser Anwendung veränderten LIBDEF und ALTLIB Definitionen bleiben auch nach dem Ende der Anwendung aktiv. ALTLIB Anweisungen, die vor dem Start von ISPF abgesetzt werden, sind nach dem Aufruf von ISPF dort nicht bekannt.
•
•
Ich gebe gerne zu, dass diese Regeln etwas komplex und verwirrend sind. Deshalb empfehle ich Ihnen, sich mit dem Thema ALTLIB durch eigene Tests vertraut zu machen.
16.5.3
Stapelung der APPLICATION Level ALTLIBs
Wenn innerhalb einer Anwendung mehrere ALTLIB Befehle auf dem APPLICATION Level abgesetzt werden, dann werden diese bis zu einer Tiefe von ACHT Ebenen gestapelt. Diese Stapelung geschieht so, dass immer die zuletzt erstelle Definition ganz oben steht. Beispiel: Stapelung von APPLICATION Level ALTLIBs. Ich habe die folgende Prozedur laufen lassen: 01 /* DOC: REXX ALTLIB2 02 /* DOC: Beispiel 2 für das TSO Command ALTLIB 03 /* (c) LANZT
*/ */ am: 17 May 2004 */
04 /*********************************************************************/ 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19
"altlib say "altlib "altlib say "altlib "altlib say "altlib "altlib say "altlib "altlib say "altlib
display" act application(exec) dataset(PROX.BUCK.REXX)" display" act application(exec) display"
dataset(PROX.UTIL.REXX)"
act application(exec) dataset(PROX.LANZ.REXX)" display" act application(exec) display"
dataset(PROX.LOGON.REXX)"
reset"
Programm 30 ALTLIB2: Beispiele für die Stapelung von ALTLIB Anweisungen
346
16 E i n l e i t u n g z u m P r o g r a m m i e r e n i m I S P F
Hier die Ausgabe, welche die obige Prozedur erzeugt: Current search order (by DDNAME) is: System-level EXEC DDNAME=SYSEXEC System-level CLIST DDNAME=SYSPROC Current search order (by DDNAME) is: Application-level EXEC DDMAME=SYS00002 System-level EXEC DDNAME=SYSEXEC System-level CLIST DDNAME=SYSPROC Current search order (by DDNAME) is: Application-level EXEC DDNAME=SYS00003 Stacked DDNAME=SYS00002 System-level EXEC DDNAME=SYSEXEC System-level CLIST DDNAME=S YSPROC Current search order (by DDNAME) is: Application-level EXEC DDNAME=SYS00004 Stacked DDNAME=SYS00003 Stacked DDNAME=SYS00002 System-level EXEC DDNAME=SYSEXEC System-level CLIST DDNAME=SYSPROC Current search order (by DDNAME) is: Application-level EXEC DDNAME=SYS00005 Stacked DDNAME=SYS00004 Stacked DDNAME=SYS00003 Stacked DDNAME=SYS00002 System-level EXEC DDNAME=SYSEXEC System-level CLIST DDNAME=SYSPROC
16.5.4
Der QUIET Operand des ALTLIB DISPLAY Befehls
W e n n man den A L T L I B D I S P L A Y Befehl unter ISPF benutzt, kann m a n die Option Q U I E T angeben. Mit dieser Option wird erreicht, dass die durch den A L T L I B D I S P L A Y B e f e h l a u s g e g e b e n e n I n f o r m a t i o n e n in I S P F V a r i a b l e i m S H A R E D P o o l g e s c h r i e b e n u n d n i c h t ü b e r S Y S T S P R T ausgegeben werden. M a n kann dann diese ISPF Variablen nutzen, u m die darin enthalten Informationen im P r o g r a m m zu verwenden. Es werden folgende ISPF Variable belegt: •
I K J A D M e n t h ä l t d i e A n z a h l Z e i l e n , d i e in I S P F V a r i a b l e g e s c h r i e b e n w u r d e n .
•
D i e V a r i a b l e n I K J A D M 1 bis IKJ A D M 9 9 e n t h a l t e n d i e e i n z e l n e n Z e i l e n .
D a s f o l g e n d e B e i s p i e l zeigt, w i e m a n d i e s e M e s s a g e s in e i n e m P r o g r a m m v e r w e n d e n k a n n : 01 02 03 04 05 06 07 08 09
/* DOC: REXX ALTLIB3 ************************************************/ /* DOC: Beispiel für das TSO Command ALTLIB DISPLAY QUIET unter ISPF */ /* (c) LANZT am: 17 May 2004 */ /*********************************************************************/ "altlib act application(exec) dataset(PROX.BUCH.REXX)" "altlib act application(exec) dataset(PROX.UTIL.REXX)" "altlib act application(exec) dataset(PROX.LANZ.REXX)" "altlib act application(exec) dataset(PROX.LOGON.REXX)" "altlib display quiet"
16.5 ALTLIB - Dynamische Verkettung von EXEC Bibliotheken 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
347
"ispexec vget (ikjadm) shared" do i = 1 to ikjadm "ispexec vget (ikjadm"i") shared" z = value("ikjadm" i) parse var z x "DDNAME=" ddname . if ddname "" then do "ispexec qbaselib "ddname" id(dsns)" dsns = translate(dsns," ","',") say right(ddname":",9) word(dsns,1) do k = 2 to words(dsns) say " " word(dsns,k) end k end say end i "altlib reset"
Programm 31 ALTLIB3: Anwendung der QUIET Option
Erläuterungen zu diesem Programm: Zeilen 05 bis 08 Hier werden einige Dateien auf den APPLICATION Level gestapelt. Zeile 09 Absetzen des ALTLIB DISPLAY Befehls mit der Option QUIET. Dabei werden die einzelnen Zeilen in die oben beschriebenen Variablen in den ISPF SHARED Pool geschrieben. Zeile 10 Die Variable IKJADM wird aus dem SHARED Pool gelesen. Sie enthält die Anzahl der ausgegebenen Zeilen. Zeile 11 Diese Schleife läuft über die Anzahl der erzeugten Zeilen in den Variablen IKJADMi. Zeile 12 Der Inhalt einer Zeile wird gelesen. Zeile 13 Eine Zeile wird in die Hilfsvariable z umgespeichert. Zeile 14 Der Parse Befehl extrahiert die DD Namen aus den Zeilen, die einen solchen enthalten.
348
16 Einleitung zum Programmieren im ISPF
Zeile 15 Wenn ein DD Name gefunden wurde, dann werden in dieser DO Gruppe zu diesem DD Namen die zugeordneten DSNs ermittelt und ausgedruckt. Zeile 16 Mit dem ISPF Befehl QBASELIB werden zu einem DD Namen die zugeordneten DSNs ermittelt und in der String Variablen DSNS bereitgestellt. Die Beschreibung des ISPF Befehls QBASELIB finden Sie im Kapitel „QBASELIB - Query DSN Information" ab Seite 393. Zeile 17 Aus dem String DSNS werden die zwischen den DSNs stehenden Hochkommata und Kommata entfernt. Zeile 18 Hier wird die erste Zeile des Ausdrucks der DSNs zusammen mit dem DD Namen ausgedruckt. Zeile 19 bis 21 Falls zu einem DD Namen mehrere DSNs verketten sind, werden diese hier ausgedruckt. Ich habe das Programm ausgeführt. Es hat die folgende Ausgabe erzeugt: SYS00005: PROX.LOGON.REXX SYS00004: PROX.LANZ.REXX SYS00003: PROX.UTIL.REXX SYS00002: PROX.BUCH.REXX SYSEXEC : PROX. BUCH . REXX PROX. LANZ. REXX PROX. LOGON. REXX SMQP. USER. CEXEC SMQP.PROD.CEXEC SYSPROC: PROX. BUCH. REXX PROX. LANZ. REXX PROX. LOGON. REXX SMQP. USER. CEXEC SMQP.PROD.CEXEC
Tipp Mit den Möglichkeiten, die der ALTLIB DISPLAY QUIET Befehl bietet, kann man in einem Programm feststellen, welche Zuordnungen für die Ausfuhrung von Prozeduren bestehen.
17
Dateiverarbeitung mit ISPF
Im ISPF steht für die Verarbeitung von Dateien eine breite Palette von Diensten bereit. Bis auf einige Sonderkommandos beginnen alle Data Set Services im ISPF mit dem Präfix LM. Dieser Präfix steht für: Library Management. Insgesamt habe ich 25 Services gezählt, die zurzeit verfügbar sind. Wenn man sich zum ersten Mal mit den LM Services beschäftigt, stellt sich sofort die Frage: „Was benötige ich für ein bestimmtes Vorhaben?"
17.1
Die LM Services
Um mithilfe der LM Services das Lesen oder Schreiben von Daten, die Anzeige und Manipulation von PDS und sequentiellen Dateien auszuführen, benötigt man niemals nur einen Service alleine. Vielmehr sind in der Regel mehrere Service Calls zu benutzen. Und das in der richtigen Reihenfolge!
17.1.1
Gruppierung der LM Services
Immer, wenn ich in einem REXX Programm etwas mit Dateien bewerkstelligen muss, stehe ich vor der Frage: „Mit oder ohne ISPF Services?". Eines ist dabei sofort klar: Die Nutzung von ISPF Services bedarf eines größeren Programmieraufwandes, als einfach nur den EXECIO Befehl aus dem Vorrat der REXX TSO Befehle zu benutzen. Was gibt es also für Gründe, die ISPF Services für die Dateiverarbeitung trotzdem zu nehmen? Gründe für die Benutzung von ISPF Services für die Dateiverarbeitung anstatt des EXECIO Befehls: • • •
Dateiverarbeitungen mit ISPF Services haben eine wesentlich bessere Performance. Die Fehlerkontrolle und Fehleranalyse ist viel besser. Es gibt umfangreiche Möglichkeiten mit Members und Member Lists zu arbeiten.
Während man für die Benutzung des EXECIO Befehls lediglich vorher einen TSO ALLOC Befehl absetzen muss, ist für die Benutzung der ISPF Services zur Dateiverarbeitung eine ganze Reihe von Befehlen notwendig, die auch noch in der richtigen Reihenfolge hintereinander auszuführen sind. Hinzu kommt, dass für jeden Service wieder unterschiedliche Kombinationen der Befehle benutzt werden müssen.
350
17 Dateiverarbeitung mit ISPF
Mit der folgenden Tabelle möchte ich Ihnen eine Hilfestellung anbieten, die für eine bestimmte Aufgabenstellung optimalen Services herauszusuchen. In der rechten Spalte sehen Sie die Befehle, die notwendig sind, um einen Service Vorgang komplett abzuwickeln. Der oder die Kernbefehle zur Ausfuhrung eines Service Vorhabens sind grau unterlegt. Optionen, die bei bestimmten Vorhaben unbedingt gesetzt werden müssen, habe ich hinzugefugt. Weiterhin habe ich hinter einzelne Befehle Hinweise angefugt, die bei der Benutzung dieses Service wichtig sind. Hinweis Vergessen Sie nie, die abschließenden Befehle LMCLOSE und LMFREE abzusetzen, damit die verwendeten Ressourcen nicht weiterhin festgehalten werden. Vorhaben Sequentiell lesen: Datei
Sequentiell lesen: Member
Sequentiell schreiben: Datei
Sequentiell schreiben: Member
Member kopieren
Tabelle 29 Data Set Services des ISPF- Teil 1
Reihenfolge der Services LMINIT LMOPEN LMGET (in Schleife) LMCLOSE LMFREE LMINIT LMOPEN LMMFIND (Member lokalisieren) LMGET (in Schleife) LMCLOSE LMFREE LMINIT LMOPEN LMPUT (in Schleife) LMCLOSE LMFREE LMINIT LMOPEN ... OPTION(OUTPUT) LMPUT (in Schleife) LMMREP (Member schreiben) LMCLOSE LMFREE LMINIT (Input) LMINIT... ENQ(SHR) (Output) LMCOPY LMFREE (Input) LMFREE (Output)
351
17.1 Die LM Services Vorhaben Member verschieben
Member löschen
Member umbenennen (RENAME)
Statistics eines Members anzeigen und ändern.
Kompress eines PDS
Memberliste eines PDS einlesen.
Memberliste eines PDS in einem Panel anzeigen. Members können ausgewählt werden. Der ausgewählte Membername wird zurückgegeben. Memberliste mehrerer verketteter Dateien zur Bearbeitung anzeigen.
DSLISTen anzeigen wie im Menü 3.4
Tabelle 30 Data Set Services des ISPF - Teil 2
Reihenfolge der Services LM1NIT (Input) LM1NIT ... ENQ(SHR) (Output) LMMOVE LMFREE (Input) LMFREE (Output) LMINIT... ENQ(EXCLU) LMOPEN... OPTION(OUTPUT) LMMDEL LMCLOSE LMFREE LMINIT... ENQ(EXCLU) LMOPEN ... OPTION(OUTPUT) LMMREN LMCLOSE LMFREE LMINIT LMMSTATS LMFREE LMINIT... ENQ(EXCLU) LMCOMP LMFREE LMINIT LMOPEN LMMLIST (in Schleife) LMCLOSE LMFREE LMINIT ... ENQ(EXCLU) LMOPEN ... OPTION(OUTPUT) LMMDISP LMCLOSE LMFREE address TSO "alloc ...dsn(dsnlist)" LMINIT MEMLIST LMFREE address TSO "free..." lvl = "PROX.LANZ.**" LMDINIT ... LEVEL("lvl")" LMDD1SP LMDFREE
352
17 Dateiverarbeitung mit ISPF
Hinweis Die Beschreibung der einzelnen Services werde ich weitgehend von denjenigen in der IBM Broschüre ISPF Services Guide ableiten. Da aber dort, wie in allen Broschüren des ISPF, die beigefugten Beispiele sehr knapp gehalten sind, werde ich zu (fast) jedem Service ein Beispielprogramm bringen, das von mir getestet wurde und zu dem jeweils immer das Testergebnis ausgedruckt angefugt ist. Nur bei Services, deren Funktion sehr einfach ist (z.B. LMFREE), verzichte ich auf ein dediziertes Beispiel. In den Beschreibungen der einzelnen Parameter werde ich die Default Values immer grau unterlegen.
17.1.2
LMINIT - Beginnen der Dateiverarbeitung
Funktion Mit LMINIT beginnt jede Dateiverarbeitung durch ISPF Services. Hauptzweck dieses Befehls ist die Verknüpfung der physischen Datei(en) mit einer ISPF DATAID, Auf diese DATAID beziehen sich alle weiteren Befehle, die mit der im LMINIT Befehl angesprochenen Physik arbeiten wollen. Die DATAID wird bei der Durchfuhrung des LMINIT Befehls vom System vergeben und in der beim LIMINIT anzugebenden Variablen gespeichert. Format ISPEXEC LMINIT
DATAID(dataid) {DATASET(dsn)} {DDNAME(ddname)} ENQ(SHR|EXCLU|SHRW|MOD)
dataid Hier muss ein maximal 8-stelliger Name angegeben werden. Das ISPF speichert darin einen Wert ab, der diese DATAID eindeutig adressiert. Der Name der ID Variablen muss bei jedem weiteren Befehl, der sich auf die im LMINIT Befehl angesprochene Physik bezieht, angegeben werden. Die Angabe in den weiteren Befehlen kann auf zweierlei Art erfolgen: DATAID (" dataid") oder DATAID(&dataid) Beide Angaben sind gleichwertig. Nehmen Sie die, die Ihnen am meisten zusagt! Name der Datei, die mit diesem LMINIT adressiert wird, ddname DD Name der Datei, die mit diesem LMINIT adressiert wird. Dieser ddname muss zum Zeitpunkt der Ausführung des LMINIT bereits zugeordnet sein. Dies kann entweder durch einen im Programm vorher ausgeführten TSO ALLOC Befehl geschehen sein, oder aber durch ein DD Statement von außen kommen. DATASET (dsn) und DDNAME (ddname) können nur alternativ benutzt werden!
17.1 Die LM Services
353
SHR Shared Zugriff auf diese Datei. Andere Benutzer können ebenfalls auf diese Datei zugreifen. EXCLU Exklusiver Zugriff. Kein anderer User kann gleichzeitig auf die Datei zugreifen. SHRW Wirkt wie SHR. Aber es können Members in den PDS geschrieben werden. Gilt nur für Zugriffe auf PDS. MOD An eine sequentielle Datei können Sätze angefugt werden. Regeln Die ENQ Option kann nur benutzt werden, wenn die Datei über die Option DATASET angesprochen wird. Bei Adressierung über die Option DDNAME werden die ENQ Bedingungen durch das ALLOC bzw. DD Statement bestimmt. Soll die LMINIT Funktion für eine Gruppe von Concatenated Data Sets durchgeführt werden, dann geht das nur mit Angabe des DDNAME Parameters. Die Verkettung der Dateien muss zuvor mit einem TSO ALLOC Statement oder durch DD Statements in der JCL eines Batch Jobs erfolgt sein. Hinweis Der Befehl LMINIT kennt noch weitere Optionen. Diese werde ich hier nicht besprechen, da ich sie bisher nie benötigt habe. Diese Praxis werde ich auch beim Besprechen der weiteren ISPF Befehle beibehalten. Beispiele "alloc dd(syscexec) reuse new sp(10 10) cyl recfm(v b) lrecl(2S5)", "blksize(27998) dsorg(ps) unit(vioda)" "ISPEXEC LMINIT DATAID (UTEX) DATASET ( '"cexecdsil" ' ) ENQ (SHR) " "ISPEXEC LMINIT DATAID (INEX) DDNAME (SYSCEXEC) " "LMINIT DATAID (CHK) DATASET ("dsn" ) ENQ (SHR)" if rc > 0 then call ispf_error rc "LMINIT DATAID(CHK)" "LMINIT DATAID (IN) DDNAME (INDD) ENQ (SHR)" if rc > 0 then call ispf_error rc "LMINIT DDNAME(INDD)"
17.1.3
LMFREE - Datei freigeben
Funktion Durch LMFREE wird eine mit LMINIT begonnene Dateiverarbeitung wieder beendet. LMINIT und das dazugehörige LMFREE müssen mit der gleichen DATAID im Programm immer paarweise vorkommen.
354
17 Dateiverarbeitung mit ISPF
Format ISPEXEC LMFREE DATAID(data-id) data-id Hier wird die gleiche Variable angegeben, die beim LMINIT benutzt wurde. Eventuell beim LMINIT gesetzte ENQ Definitionen werden freigegeben.
17.1.4
LMOPEN - Datei öffnen
Funktion Je nachdem, welche Verarbeitung mit der durch LMINIT zugeordneten Datei geplant ist, muss vor der Dateiverarbeitung ein LMOPEN durchgeführt werden. Siehe hierzu das Kapitel „Gruppierung" ab Seite 349. Dort ist in der entsprechenden Tabelle angegeben, für welche Verarbeitungsarten ein LMOPEN notwendig ist. Format ISPEXEC LMOPEN
DATAID(data-id) [OPTION(INPUT|OUTPUT)] [LRECL(lrecl-var) [RECFM(recfm-var)] [ORG(org-var)]
DATAID(data-id) Hier muss der Name der Variablen angegeben werden, die in dem zugehörigen LMINIT Statement angelegt wurde. OPTION(INPUT|OUTPUT) Hier wird festgelegt, ob die Datei nur für Eingabe oder auch für Ausgabe geöffnet werden soll. INPUT ist der Standardwert. [LRECL(lrecl-var) Wenn diese Option benutzt wird, dann ist nach dem Open in der lrecl-var die LRECL der Datei gespeichert. [RECEM (recfm-var)] Wenn diese Option benutzt wird, dann ist nach dem Open in der recfm-var das Record Format der Datei gespeichert (FB, VB, usw.). [ORG(org-var)] Wenn diese Option benutzt wird, dann ist nach dem Open in der org-var die Organisationsform der Datei gespeichert (PO oder PS). Beispiel Zur Verdeutlichung der verschiedenen Optionen der Funktion LMOPEN habe ich die folgende kleine Prozedur geschrieben:
355
17.1 Die LM Services /* DOC: REXX LMOPEN /* DOC: Beispiel für die ISPF Funktion LMOPEN /* (c) LANZT
*/ */ am: 26 May 2004 */
/ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /
address ISPEXEC "CONTROL ERRORS RETURN" "LMINIT DATAID (IN) DATASET ( ' LANZT. ISFCMDS. LIST ' ) ENQ (SHR) " "LMOPEN DATAID(SIN) OPTION(INPUT) LRECL(lrecl) RECFM(recfm) ORG(org)" say "LRECL="lrecl", RECFM="recfm", ORG="org "LMCLOSE DATAID (SIN)" "LMFREE DATAID (SIN)" exit Programm 32 LMOPEN: Beispiel für die Durchführung eines LNOPEN
Diese Prozedur brachte folgende Ausgabe zur Anzeige: LRECL=00000796,
17.1.5
RECFM=VB
, ORG=PS
LMCLOSE - Datei schließen
Funktion Die Datei, die mit dieser DATAID verknüpft ist, wird geschlossen. Format ISPEXEC LMCLOSE D A T A I D ( d a t a - i d ) data-id Hier wird die gleiche Variable angegeben, die bei dem LMINIT und dem LMOPEN benutzt wurde. Die eventuell beim LMINIT gesetzten ENQs auf Dateien werden mit dem LMCLOSE freigegeben. Hinweis Wenn das zugehörige LMINIT mit der Option ENQ(SHRW) durchgeführt wurde und das zugehörige LMOPEN mit der Option OPTION(OUTPUT) versehen war, dann ist es sehr wichtig, dass so bald wie möglich ein LMCLOSE durchgeführt wird, da das betroffene Plattenlaufwerk sonst so lange „RESERVED" ist, bis das LMCLOSE erfolgt. Wenn die Ausgabe in eine sequentielle Datei erfolgte, dann wird mit dem LMCLOSE der letzte Datenblock geschrieben.
17.1.6
LMMFIND - Member lokalisieren
Funktion Die LMMFIND Funktion sucht nach einem Member in einem PDS/PDSE oder in einer Kette solcher Dateien. LMMFIND kann auch Member Statistics zurückgeben. Wenn das mit LMINIT und LMOPEN angesprochene Objekt eine Concatenated Data Set ist, dann lokalisiert LMMFIND das erste Vorkommen des Members.
356
17 Dateiverarbeitung mit ISPF
Der LMINIT und der LMOPEN Service müssen vor der Ausfuhrung von LMMFIND aufgerufen worden sein. Format ISPEXEC LMMFIND D A T A I D ( d a t a - i d ) MEMBER(member-name) [LRECL(lrecl-var)] [RECFM(recfm-var)] [GROUP(group-var)] [STATS(YES|NO)] [LRECL(lrecl-var)] Hier handelt es sich um den gleichen Parameter wie bei der Funktion LMOPEN. Der Unterschied besteht aber darin, dass beim Suchen in einem Concatenated Data Set die Werte aus dem PDS übergeben werden, in dem das Member gefunden wurde. [RECEM(recfm-var)] Hier ist sinngemäß das Gleiche zu sagen wie bei LRECL. [STATS(YES|NO)] Wenn hier YES angegeben wird, dann werden vom ISPF einige Variable besetzt, die unter anderem Werte aus den Member Statistics des gefundenen Members enthalten. Hierbei ist vor allem die Variable ZLLIB interessant. In dieser Variablen wird, wenn sich das LMOPEN auf eine Liste von Concatenated Data Sets bezieht, die Positions-Nummer der Datei innerhalb der PDS Kette zurückgegeben, in welcher das Member gefunden wurde. Da Anzahl, Name und Typ der zurückgegebenen Variablen vom Typ der Datei abhängen, verzichte ich hier auf eine ausfuhrliche Beschreibung. Falls Sie das Thema weiter verfolgen möchten, empfehle ich Ihnen die IBM Broschüre ISPF Services Guide. Beispiel Das folgende Programm habe ich entwickelt, um zu zeigen, wie man eine Gruppe von Dateien zu einem Satz von Concatenated Data Sets zuordnet und darin dann Members lokalisiert. Ich habe bewusst die Variablen PDSO bis PDS4 im Hauptprogramm definiert, um Ihnen beim Aufruf der Funktion SUCHEN nochmals ein Beispiel für die Verwendung der Funktion VALUE vorzuführen. 01 02 03 04 05 06 07 08 09 10 11 12 13 14
/* DOC: REXX LMMFIND */ /* DOC: Beispiel für die ISPF Funktion LMMFIND bei der Verarbeitung */ /* DOC: von Concatenated Data Sets. */ /* (c) LANZT am: 26 May 2004 */ /*********************************************************************/ pdsO = "keinem PDS" /* für 'Member nicht gefunden' */ pdsl = "'PROX.BUCH.REXX'" /* Definition der */ pds2 = "'PROX.LANZ.REXX'" /* Concatenated */ pds3 = "'PROX.LOGON.REXX'" /* PDS */ pds4 = "'PROX.UTIL.REXX'" say "Member abed wurde gefunden in: "value("PDS"suchen(abcd)) say "Member $DOC wurde gefunden in: "value("PDS"suchen($DOC)) say "Member #CHA0007 wurde gefunden in: "value("PDS"suchen(#CHA0007)) say "Member #TSOB### wurde gefunden in: "value("PDS"suchen(#TSOB###))
17.1 Die LM Services
357
15 say "Member #XPEDA 16 say "Member $D0C111 17 say "Member ABCDEFG 18 19 20 21 22 23 24 25
wurde gefunden in: "value("PDS"suchen(#XPEDA)) wurde gefunden in: "value("PDS"suchen($D0C111)) wurde gefunden in: "value("PDS"suchen(ABCDEFG))
exit /*********************************************************************/ /* Funktion SUCHEN: Sucht Member in den Concatenated Data Sets und */ /* gibt die Nummer des Data Sets zurück, in dem das Member gefunden */ /* wurde. Wird das Member nicht gefunden, wird Null zurückgegeben. */ /*********************************************************************/ suchen: arg member
26 "alloc dd(in) dsn("pdsl pds2 pds3 pds4") shr reuse" 27 28 29 30 31
"ISPEXEC CONTROL ERRORS RETURN" "ISPEXEC IMINIT DATAID (INPUT) DDNAME (IN) ENQ(SHR)" if rc > 0 then call ispf_error "ISPEXEC LMOPEN DATAID(6INPUT)" if rc > 0 then call ispf error
32 "ISPEXEC LMMFIND DATAID(SINPUT) MEMBER("member") STATS(YES)" 33 if rc > 0 then zllib = 0 34 "ISPEXEC LMCLOSE DATAID (SINPUT) " 35 "ISPEXEC LMFREE DATAID (&INPUT) " 36 return(zllib) 37 /*********************************************************************/ 38 /* DOC: ISPF_ERROR */ 39 /*********************************************************************/ 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
ispf_error: arg rc instr = sigl-1 srcline = instr": "strip(sourceline(instr)) if sysvar("SYSENV") = "FORE" then do zedlmsg = "ISPF Fehler im Programm >"exname"< RC="rc, "aus Statement:"copies(" ",60) srcline copies(" ",60) if zerrlm "ZERRLM" then, zedlmsg = zedlmsg" ISPF Fehlermeldung:" strip(zerrlm) address "ISPEXEC" "SETMSG MSG(ISRZ001)" end else do say exname copies("-",68) say exname "ISPF Fehler: RC="rc" aus Statement:" say exname srcline if zerrlm "ZERRLM" then, say exname "ISPF Fehlermeldung:" strip(zerrlm) say exname copies("-",68) zispfrc = rc address "ISPEXEC" "VPUT (ZISPFRC)" end exit(rc) **************/
Programm 33 LMMFIND: Suchen von Members in verketteten Bibliotheken
Ich habe das Programm ausgeführt. Das Ergebnis sehen Sie hier: Member Member Member Member Member
abed $DOC #CHA0007 #TSOB### #XPEDA
wurde wurde wurde wurde wurde
gefunden gefunden gefunden gefunden gefunden
in: keinem PDS in: 'PROX.BUCH.REXX' in: 'PROX.LOGON.REXX' in: 'PROX.BUCH.REXX' in: 'PROX.LANZ.REXX'
358
17 Dateiverarbeitung mit ISPF
Member $D0C111 Member ABCDEFG
wurde gefunden in: 'PROX.UTIL.REXX' wurde gefunden in: keinem PDS
Bei der online Ausfuhrung des Programm habe ich am Ende keinen TSO FREE Befehl durchgeführt, dadurch steht die Zuordnung des DD Namens noch in meinem TSO User bereit. Ich habe das Programm ISRDDN aufgerufen und in dessen Anzeige folgende Zeilen gefunden: IN D1D101 D1D119 D1D135 D1D142
SHR,KEEP SHR,KEEP SHR,KEEP SHR,KEEP
> > > >
PROX. BUCH. REXX PROX.LANZ.REXX PROX. LOGON. REXX PROX.UTIL.REXX
Man kann jetzt die Zuordnung von Hand freigeben, indem man vor dem DD Namen IN ein F eingibt. Dies habe ich aber nur aus Gründen des Vorzeigeeffekts so gemacht. Normalerweise müsste natürlich am Ende des Unterprogramms SUCHEN ein "FREE DD(IN)" stehen.
17.1.7
LMMREP - Member ersetzen
Funktion Der LMMREP Service ersetzt ein Member in einem PDS. Ist das Member noch nicht vorhanden, dann wird es dem PDS hinzugefügt. Vor der Ausführung des LMMREP Befehls müssen der LMINIT Service mit den Optionen ENQ(SHRW) oder ENQ(EXCLU) sowie der Befehl LMOPEN mit OPTION(OUTPUT) ausgeführt worden sein. Außerdem müssen vorher mit dem LMPUT Befehl unter der gleichen DATAID Datensätze ausgegeben worden Format ISPEXEC LMMREP
DATAID(data-id) [STATS(YES|NO)] [NOENQ]
MEMBER(member-name)
DATAID(data-id) Gibt die d a t a - i d an, die bereits vom LMINIT und LMOPEN Service benutzt wurden. MEMBER(member-name) Gibt den Namen des Members an, das in den PDS geschrieben werden soll. [STATS(YES|NO)] Mit der Option STATS(YES) wird festgelegt, dass die Member Statistics fur dieses Member nach dem Eintrag in die Directory geschrieben oder updatet werden. Dabei müssen mindestens die Werte ZLCDATE für das Creation Date und ZLMDATE für das Modification Date vom Programm besetzt worden sein. Näheres zu den übrigen Variablen, die außerdem noch besetzt werden können, finden Sie in der Beschreibung des Service LMMREP in der IBM Broschüre ISPF Services Guide.
17.1 Die LM Services
359
[NOENQ] Diese Option veranlasst das ISPF, während der Durchfuhrung des Befehls, KEIN ENQ auf den betreffenden PDS abzusetzen. Hinweis Wenn bei der Ausfuhrung von LMMREP das betreffende Member noch nicht im PDS vorhanden ist, dann endet der Befehl LMMREP mit einem RC=8, obwohl alles ordnungsgemäß gelaufen ist. Dies müssen Sie bei der Überprüfung der Return Codes unbedingt beachten.
17.1.8
LMM ADD - Member hinzufügen
Funktion Dieser Service arbeitet im Grunde genau gleich, wie der LMMREP Service. Der Unterschied besteht lediglich darin, dass ein bereits vorhandenes Member nicht ersetzt wird. Diesen Service sollte man immer dann benutzen, wenn man keinesfalls bereits vorhandene Member überschreiben will. Hinweis Wenn bei der Ausfuhrung von LMMADD das betreffende Member bereits im PDS vorhanden ist, dann endet der Befehl LMMADD mit einem RC=4 und das Member wird nicht in den PDS geschrieben. Tipp Ich benutze beim Schreiben von Members in einen PDS immer den Befehl LMMREP. Dies hat auch den Vorteil, dass ich beim Testen eines Programms nicht vor jedem Testlauf das Member von Hand entfernen muss. Vorsicht ist allerdings geboten, wenn aufgrund der Anwendungslogik immer nur neue Member eingetragen werden dürfen. Hier möchte ich nochmals darauf hinweisen, dass bei der Anwendung des Befehls LMMREP beachtet werden muss, dass der RC=8 gesetzt wird, wenn das Member noch nicht vorhanden war. Beispiele für die Anwendung der Befehle LMMREP und LMMADD finden Sie am Ende des Kapitels „LMPUT - Datensatz ausgeben" ab Seite 361.
17.1.9
LMGET - Datensatz lesen
Funktion Mit LMGET wird ein Datensatz aus der Datei gelesen, die unter der gleichen DATAID durch LMINIT und LMOPEN bereitgestellt wurde. Soll ein Member sequentiell gelesen werden, dann muss noch ein LMMFIND auf das Member mit der gleichen DATAID durchgeführt worden sein.
360
17 Dateiverarbeitung mit ISPF
Format ISPEXEC LMGET
DATAID(data-id) MODE(MOVE|LOCATE|INVAR) DATALOC(dataloc-var) DATALEN(datalen-var) MAXLEN(max-length)
AJJe Parameter müssen angegeben werden! DATAID(data-id) data-id bezeichnet die gleiche DATAID, für die bereits der LMINIT, der LMOPEN und eventuell der LMMFIND Service ausgeführt worden waren. MODE(MOVE|LOCATE|INVAR) In REXX Programmen muss immer MODE (INVAR) angegeben werden. DATALOC(dataloc-var) dataloc-var ist der Name einer REXX Variablen, in welcher der eingelesene Datensatz gespeichert wird. DATALEN(datalen-var) datalen-var ist der Name einer REXX Variablen, in der die Länge des eingelesenen Datensatzes gespeichert wird. MAXLEN(max-length) Hier wird eine ganze Zahl angegeben, welche die maximale Länge eines Datensatzes enthält. Man kann hier immer die Zahl 32760 angeben. Beispiel Das Member LANZT.LOGON.CLIST(ALIAS) soll gelesen werden. Diese Datei ist mit RECFM=VB definiert. Ich habe bei der Erstellung des Programms bewusst auf jegliche Fehlerprüfung verzichtet, um das Beispiel übersichtlicher zu halten. 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19
*/ / * DOC REXX LMGET */ / * DOC Beispielprogramm für das Lesen eines Members aus einem / * DOC Data Set mit RECFM=VB am: 26 May 2004 */ / * (c) LANZT address ISPEXEC "LMINIT DATAID (IN) DATASET (' LANZT. LOGON. CLIST ' ) ENQ(SHR)" "LMOPEN DATAID (SIN)" "LMMFIND DATAID (&IN) MEMBER("alias" ) " do i = 1 "LMGET DATAID (&IN) " , "MODE (INVAR) DATALOC (REC) DATALEN (LREC) MAXLEN (32760) " select when rc = 0 then do say "Satz "right(i,3)", Lange="right(lrec,5) say rec iterate i end when rc = 8 then leave i
17.1 Die LM Services
361
20 otherwise nop 21 end /* select */ 22 end i 23 "LMCLOSE DATAID(&IN)" 24 "LMFREE DATAID (SIN)" Programm 34 LMGET: Lesen einer Datei mithilfe der ISPF Services
Hier das Ergebnis der Programmausführung: Satz
1, Länge=00071
Satz
2, Länge=00071
Satz
3, Länge=00071
/* DOC: REXX ALIAS
*/
/* DOC: Setzen eines Alias Eintrages /* (c) LANZT
*/ am: 30 Mar 2004 */
Satz 4, Länge=00071 /*********************************************************************/ Satz
5, Länge=00070
"def alias(name(LANZT.ISPF.PROFILE.LPRT) relate(LANZT.ISPF.PROFILE))",
Satz
6, Länge=00029
"cat(UCAT.TSTO.OSERCAT)"
Satz
7, Länge=00004
Satz
8, Länge=00064
exit
"def alias(name(LANZT.USER.TABL.LPRX) relate(LANZT.USER.TABL))",
Satz
9, Länge=00029
"cat(UCAT.TSTO.USERCAT)"
17.1.10
LMPUT - Datensatz ausgeben
Funktion Mit LMPUT wird ein Datensatz in eine Datei ausgegeben, die unter der gleichen DATAID mithilfe von LMINIT und LMOPEN bereitgestellt wurde. Sollen die Datensätze in ein Member geschrieben werden, dann muss noch ein LMMADD oder ein LMMREP für dieses Member mit der gleichen DATAID durchgeführt werden. Format ISPEXEC LMPUT
DATAID(data-id) MODE(INVAR|MOVE) DATALOC(dataloc-var) DATALEN(data-length) [NOBSCAN]
DATAID(data-id) data-id bezeichnet die gleiche DATAID, mit der bereits die Befehle LMINIT und LMOPEN ausgeführt worden waren. MODE(INVAR|MOVE) In REXX Programmen muss immer MODE (INVAR) angegeben werden.
362
17 D a t e i v e r a r b e i t u n g mit I S P F
DATALOC(dataloc-var) dataloc-var
ist der N a m e einer R E X X V a r i a b l e n , in w e l c h e r der zu s c h r e i b e n d e D a -
tensatz gespeichert ist. DATALEN(data-length) In d a t a - l e n g t h ist die L ä n g e des zu s p e i c h e r n d e n D a t e n s a t z e s a n z u g e b e n . [NOBSCAN] W e n n d i e s e O p t i o n a n g e g e b e n ist, w e r d e n b e i m S c h r e i b e n v o n V B S ä t z e n die T r a i l i n g B l a n k s nicht abgeschnitten. Beispiel In d i e s e m P r o g r a m m w e r d e n die variabel langen D a t e n s ä t z e des M e m b e r s A L I A S gelesen u n d alle Sätze, die n i c h t mit /* b e g i n n e n , in ein a n d e r e s M e m b e r m i t d e m N a m e n A L I A S N E U a u s g e g e b e n . B e i m Schreiben des M e m b e r s A L I A S N E U w e r d e n die M e m b e r Statistics erzeugt. D i e Z u w e i s u n g der W e r t e f u r die M e m b e r Statistics in die e n t s p r e c h e n d e n Z L Syst e m V a r i a b l e n e n t n e h m e n Sie bitte d e m P r o g r a m m . 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
/* DOC: REXX LMPUT ************************************************/ /* DOC: Beispielprogramm für das Schreiben eines Members mit */ /* DOC: Erstellung der Statistik Informationen. */ /* (c) LANZT am: 26 May 2004 */ /*********************************************************************/ address ISPEXEC "CONTROL ERRORS RETURN" "LMINIT DATAID(IN) DATASET ('LANZT. LOGON. CLI ST ' ) ENQ(SHR) " "LMINIT DATAID(UT) DATASET (' LANZT . LOGON. CLIST ' ) ENQ(SHRW)" " LMOPEN DATAID (SIN) " "LMOPEN DATAID(SUT) OPTION(OUTPUT)" "LMMFIND DATAID (SIN) MEMBER (ALIAS) " zlinorc = 0 /* Aufsetzen des Datensatzzählers für Member Statistics */ do i = 1 "LMGET DATAID (SIN) " , "MODE (INVAR) DATALOC (REC) DATALEN (LREC) MAXLEN (32760) " select when rc = 0 then do if left(rec,2) = "/*" then iterate i "LMPUT DATAID (SUT) MODE (INVAR) DATALOC (REC) " , "DATALEN("length(rec)")" zlinorc = zlinorc + 1 /* Hochzählen des DatensatzZählers */ iterate i end when rc = 8 then leave i otherwise nop end /* select */ end i zlvers = 1 /* Setzen Versions Nummer ( W ) */ zlmods = 1 /* Setzen Modification Level (MM) */ zlcnorc = zlinorc /* Setzen aktuellen Datensatzzähler wie Initial */ zlcdate = date("0") /* Setzen Erstellungsdatum (JJ/MM/DD) */ zlmdate = zlcdate /* Setzen Änderungsdatum (JJ/MM/DD) */ zlmtime = time() /* Setzen Zeit (HH:MM:SS) */ zluser = userid() /* Setzen User ID */ "LMMREP DATAID (&UT) MEMBER (ALIASNEU) STATS (YES) " "LMCLOSE DATAID (SIN)"
17.1 D i e L M Services 38 39 40 41
363
"LMCLOSE DATAID (SUT) " "LMFREE DATAID (SIN)" "LMFREE DATAID(4UT)" exit
Programm 35 LMPUT: Anwendung des LMPUT Services
Hinweise Ich habe hier bewusst auf das Einfügen der Fehlerabfragen nach j e d e m L M Service Befehl verzichtet, u m den P r o g r a m m k o d e übersichtlicher zu halten. Ich empfehle Ihnen aber dringend, bei Ihren produktiven P r o g r a m m e n f ü r eine korrekte Fehlerabfrage zu sorgen. W e n n m a n die W e r t e f ü r die M e m b e r Statistics nicht mit k o r r e k t e n D a t e n füllt, k a n n es v o r k o m m e n , dass die M e m b e r Statistics e n t w e d e r gar nicht g e s c h r i e b e n w e r d e n , o d e r einzelne W e r t e leer bleiben o d e r Null sind. Leider gibt es in diesen Fällen keinerlei M ö g l i c h keit, mittels F e h l e r a b f r a g e einen solchen Fall zu e r k e n n e n . M a n k a n n es n u r d u r c h T e s t e n herausfinden. N a c h f o l g e n d j e t z t die D a t e n s ä t z e aus den b e i d e n M e m b e r s A L I A S und A L I A S N E U . Ich hab e diesen A u s d r u c k in H e x F o r m erzeugt, d a m i t m a n die variabel l a n g e n D a t e n s ä t z e erkennen k a n n . Member ALIAS: Member ALIAS: BROWSE LANZT. LOGON. CLIST (ALIAS) - 01.00 Line 00000000 Col 001 080 Command = > Scroll ===> CSR ********************************* T 0 p of Data ********************************* /* DOC: REXX ALIAS */ 654CDC74DCEE4CDCCE44444444444444444444444444444444444444444444444444456 1C0463A09577013912000000000000000000000000000000000000000000000000000C1 /* DOC: Setzen eines Alias Eintrages */ 654CDC74E8AA8948898A4C988A4CB9A9888A44444444444444444444444444444444456 1C0463A02539550595520139120595391752000000000000000000000000000000000C1 /* (c) LANZT am: 30 Mar 2004 */ 6544854CECFF444444444444444444444444444444444444444448974FF4D894FFFF456 1COD3D0153860000000000000000000000000000000000000000014A0300419020040C1 / * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /
65555555555555555555555555555555555555555555555555555555555555555555556
lccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccci "def alias(name(LANZT.ISPF.PROFILE.LPRT) relate(LANZT.ISPF.PROFILE))", 788848988A498984CECFF4CEDC4DDDCCDC4EEEF549898A84CEOFF4CEDC4DDDCCDC5576 F456013912D5145D15386B9276B7966935B3231D0953135D15386B9276B7966935DDFB "cat(UCAT.TST0.USERCAT)" 4444478 8A4ECCE4EEEF4EECDCCE57 OQ000F313D4313B3230B4259313DF exit 8A8A 5793 "def alias (name (LANZT.USER.TABL.LPRX) relate (LANZT.USER.TABL) )" ,
364
17 Dateiverarbeitung mit ISPF
788848 988A4 98 984CECFF4EECD4ECCD4EEEF5498 98A84CECFF4EECD4ECCD5576 F456013912D5145D15386B4259B3123B3232D0953135D15386B4259B3123DDFB "cat (UCAT . TSTO .USERCAT) " 4444478 8A4ECCE4EEEF4EECDCCE5 7 Û0O00F313D4313B3230B4259313DF h******************************* Bottom of Data
Member ALIASNEU BROWSE LANZT.LOGON.CLIST(ALIASNEU) - 01.00 Line 00000000 Col 001 080 Command = > Scroll = > CSR ********************************* Top of Data ********************************** "def alias(name(LANZT.ISPF.PROFILE.LPRT) relate(LANZT.ISPF.PROFILE))", 788848988A498984CECFF4CEDC4DDDCCDC4EEEF549898A84CECFF4CEDC4DDDCCDC5576 F456013912D5145D15386B9276B7966935B3231D0953135D15386B9276B7966935DDFB "cat (UCAT. TSTO . USERCAT) " 44444788A4ECCE 4EEEF4EECDCCE5 7 00000F313D4313B3230B4259313DF exit 8A8A 5793 "def alias(name(LANZT.USER.TABL.LPRX) relate(LANZT.USER.TABL)}", 788848988A498984CECFF4EECD4ECCD4EEEF549898A84CECFF4EECD4ECCD5576 F456013912D5145D15386B4259B3123B3232D0953135D15386B4259B3123DDFB "cat(UCAT.TSTO.USERCAT) " 44444788A4ECCE4EEEF4EECDCCE57 000Q0F313D4313B323OB4259313DF ******************************** Bottom of Data
17.1.11
L M C O P Y - Daten kopieren
Funktion Der LMCOPY Service kopiert Members von PDS oder ganze sequentielle Dateien. Format ISPEXEC LMCOPY
FROMID(from-data-id) TODATAID(to-data-id) [FROMMEM(from-member-name)] [ TOMEM ( t o - m e m b e r - n a m e ) ] [REPLACE] [TRUNC] [LOCK]
[ FROMMEM (f rom-membe r - name) ] f r o m - m e m b e r - n a m e ist der Membername des Quellmembers oder eine Maske, durch welche die Members generisch ausgewählt werden. Ist ein Stern (*) angegeben, dann werden alle Members kopiert. Wenn der „from" Data Set ein PDS ist, muss dieser Para-
365
17.1 Die LM Services
meter angegeben werden. Ist der „from" Data Set vom Typ sequentiell, darf dieser Parameter nicht angegeben werden. [TOMEM(to-member-name)] to-member-name ist der Membername des Members in der Ausgabedatei. Wenn der from-member-name angegeben ist und der to-member-name nicht, wird das Member unter dem from-member-name in die Ausgabedatei gespeichert. Wenn die Quelldatei eine sequentielle Datei ist, muss to-member-name angegeben sein. Wenn die Zieldatei eine sequentielle Datei ist, darf to-member-name nicht angegeben werden. [REPLACE] Gibt an, dass die Daten, wenn vorhanden, ersetzt werden. Wenn dieser Parameter nicht angegeben ist, werden beim Kopieren von mehreren Members nur diejenigen kopiert, die in der Ausgabedatei nicht vorhanden sind. Falls Members nicht kopiert werden, weil sie schon vorhanden sind, dann wird der RC=12 gesetzt. [TRUNC]
Erlaubt das Abschneiden der Ausgabedaten auf die LRECL der Ausgabedatei. Das folgende Beispiel zeigt alle Variationen des LMCOPY Befehls. Auch hier habe ich auf die Fehlerabfragen verzichtet. 01 /* DOC: REXX LMCOPY it***********************************************/ 02 /* DOC: Beispielprogramm für das Kopieren von Members und sequential */ 03 /* DOC: Data Sets. */ 04 /* (c) LANZT am: 26 May 2004 */ 05 /*********************************************************************/ 06 address ISPEXEC 07 "CONTROL ERRORS RETURN" 08 "IMINIT DATAID (IN) DATASET (' LANZT. LOGON. CLIST 1 ) " 0 9 " LMINIT DATAID (U1) DATASET (' LANZT. SAV. CLI ST ' ) ENQ (SHRW) " 10 "LMINIT DATAID (U2) DATASET (' LANZT. SEQ. CLIST ' ) ENQ (EXCLU) " 11 "LMINIT DATAID (U3) DATASET (' LANZT. SEI. CLIST ' ) ENQ (EXCLU) " 12 13 /* Kopieren aller Member, die mit LOG beginnen */
14 "LMCOPY
FROMID (&IN) TODATAID (&U1) FROMMEM (LOG*) TRUNC REPLACE"
15 16 /* Kopieren des Members ALIAS unter dem Namen ALIASC
17 "LMCOPY
*/
FROMID(SIN) TODATAID (SU1) FROMMEM (ALIAS) TOMEM (ALIASC) "
18 19 /* Kopieren aller Member, die mit AL beginnen in sequentielle Datei
*/
21 22 /* Kopieren einer sequentiellen Datei in eine andere sequent. Datei
*/
20 "LMCOPY
FROMID (SIN) TODATAID (SU2) FROMMEM (AL*) "
23 "LMCOPY
FROMID (SU2) TODATAID (SU3) TRUNC REPLACE"
24 25 26 27 28 29
DATAID DATAID DATAID DATAID
"LMFREE "LMFREE "LMFREE "LMFREE exit
(SIN)" (&U1) " (&U2) " (SU3) "
Programm 36 LMCOPY: Kopieren von Members
366
17.1.12
17 Dateiverarbeitung mit ISPF
LMMOVE - Daten verschieben
Funktion Der LMMOVE Service verschiebt Members von PDS oder ganze sequentielle Dateien. Da LMMOVE die gleichen Funktionen und Parameter kennt wie LMCOPY, werde ich hier auf die komplette Beschreibung verzichten. Der Unterschied zu LMCOPY besteht lediglich darin, dass LMMOVE die Quelldaten nach dem Kopieren löscht.
17.1.13
LMMDEL - Member löschen
Funktion Der LMMDEL Service löscht ein Member aus einem PDS. Folgende Services müssen vorher aufgerufen werden: 1. LMINIT mit Parametern ENQ(SHRW) oder ENQ(EXCLU) 2. LMOPEN mit dem Parameter OPTION(OUTPUT) Format ISPEXEC LMMDEL DATAID(data-id) [NOENQ]
MEMBER(member-name)
Die Parameter sind die gleichen, wie sie in den vorhergehenden Services beschrieben wurden. Da es sich hierbei um eine sehr einfache Funktion handelt, verzichte ich auf ein ausfuhrliches Beispiel.
17.1.14
LMMREN - Member umbenennen
Funktion Mit dem LMMREN Service wird ein Member eines PDS umbenannt. Folgende Services müssen vorher aufgerufen werden: LMINIT mit Parametern ENQ(SHRW) oder ENQ(EXCLU) LMOPEN mit dem Parameter OPTION(OUTPUT) Format ISPEXEC LMMREN
DATAID(data-id) MEMBER(old-member-name) NEWNAME(new-member-name) [NOENQ]
17.1 Die LM Services
367
Die Parameter sind die gleichen, wie sie in den vorhergehenden Services beschrieben wurden. Da es sich hierbei um eine sehr einfache Funktion handelt, verzichte ich auf ein ausführliches Beispiel.
17.1.15
LMMSTATS - Statistics eines Members anzeigen und ändern
Funktion Der LMMSTATS Service setzt oder löscht die Member Statistics fur ein Member in einem PDS. Es brauchen nicht alle Statistic Values besetzt zu werden. Sind einige Werte nicht besetzt, versucht LMMSTATS die restlichen Werte zu ermitteln (wie z.B. Anzahl der Sätze des Members), um sie einsetzen zu können. Vor der Ausführung des Befehls muss ein LMINIT durchgeführt werden. Format ISPEXEC LMMSTATS DATAID (data-id) MEMBER (member-name) [DELETE] [VERSION(version-number)] [MODLEVEL(mod-level)] [CREATED(create-date)] [MODDATE(last-modified-date)] [MODTIME(last-modified-time)] [CURSIZE(current-size)] [INITSIZE(initial-size)] [MODRECS(records-modified)] [USER(user-id)] [CREATED4(4-char-year-create-date)] [MODDATE4(4-char-year-last-modified-date)] DATAID(data-id) Variablenname der DATAID aus dem zugehörigen LMINIT. MEMBER (member-name) Membername dessen Statistics geändert werden sollen. Hier kann auch eine generische Maske eingegeben werden, um mehrere Member zu bearbeiten. [DELETE] Mit dieser Angabe werden die Statistics gelöscht. [VERSION(version-number)] Versionsnummer, die gesetzt werden soll. Hier muss eine Zahl von 1 bis 99 angegeben werden.
368
17 Dateiverarbeitung mit ISPF
[MODLEVEL(mod-level)] Modification Level, der gesetzt werden soll. Hier muss eine Zahl von 0 bis 99 angegeben werden. [CREATED(create-date)] Erstelldatum des Members. Hier muss ein Datum in der für das entsprechende Land gültigen Form eingegeben werden. In Deutschland hat der Text die Form JJ/MM/DD. Diese Form wird im REXX durch den Aufruf der Funktion DATE("0") bereitgestellt. [MODDATE(last-modified-date)] Modifikationsdatum des Members. Die Form ist die gleiche, wie bei CREATED. [MODTIME(last-modified-time)] Tageszeit der Modifikation des Members in der Form HH:MM:SS. Dieses Format wird im REXX durch die Funktion TIME() bereitgestellt. [CURSIZE(current-size)] Anzahl der Datensätze im Member. Diesen Parameter sollte man nie angeben. Der Wert wird dann vom System ermittelt und richtig eingesetzt. [INITSIZE(initial-size)] Anzahl der Datensätze bei der Erstellung des Members. Diesen Parameter sollte man nie angeben. Der Wert wird dann vom System ermittelt und richtig eingesetzt. [MODRECS(records-modified)] Gibt die Anzahl der modifizierten Datensätze an. [USER(user-id)] User ID, die bei dem Member eingesetzt werden soll. Diese Angabe darf maximal 7 Zeichen enthalten. [CREATED4(4-char-year-create-date)] Erstelldatum des Members in der Form mit vierstelliger Jahreszahl. Hier muss ein Datum in der für das entsprechende Land gültigen Form eingegeben werden. In Deutschland hat der Text die Form JJJJ/MM/DD. Diese Form wird im REXX durch keinen Aufruf der Funktion DATE direkt bereitgestellt. Der Text muss vielmehr erst zusammengestellt werden. [MODDATE4(4-char-year-last-modified-date)] Datum der Modifizierung des Members. Hier gelten die gleichen Regeln wie für CREATED4. Beispiel Das folgende Beispielprogramm erstellt für zwei Members in einem PDS jeweils die Member Statistics. 01 02 03 04 05 06
/* DOC: REXX LMMSTATS ************************** /* DOC: Eintragen der Statistics fuer ein Member /* (c) LANZT /*********************************************** address "ISPEXEC" "CONTROL ERRORS RETURN"
*/ */ am: 24 Apr 2001 */ *****************/
369
17.1 Die LM Services 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
"LMINIT
DATAID (ID) DATASET ( 1 LANZT. SAV. CLIST ' ) "
"LMMSTATS DATAID(SID) MEMBER(LOGON)
DELETE"
/* Erstellen der Statistics mit den Standardwerten "LMMSTATS DATAID (SID) MEMBER (LOGON) "
*/
"LMMSTATS DATAID (&ID) MEMBER (ALIASC) DELETE" /* Erstellen der Statistics mit definierten Werten */ /* Wenn sowohl CREATED als auch CREATED4 angegeben ist, gilt CREATED */ "LMMSTATS DATAID(&ID) MEMBER (ALIASC) " , "VERSION(33) "MODLEVEL(55) "CREATED(99/12/31) "MODDATE("date("O")") "MODTIME (" time () ") "CURSIZE(3333) "INITSIZE(9999) "MODRECS(2222) "USER(DONALD) "CREATED4(1999/11/22) "MODDATE4(2000/12/01)" "LMFREE DATAID (&ID) " exit
Programm 37 LMMSTATS: Setzen der Member
Statistics
Vor der Erstellung der Statistics werden die vorhandenen Werte gelöscht (Zeilen 09 und 14). In Zeile 12 werden die Statistics für das Member LOGON ohne jegliche Angaben von Parametern erstellt. In diesem Fall sucht sich das System die Werte selbst aus. Dabei werden die Datums- und Zeitwerte vom Zeitpunkt der Ausfuhrung des Befehls ermittelt. Die Anzahl Sätze der Datei sowie die User ID werden ebenfalls vom System ermittelt und eingetragen. Hier sehen Sie die eingetragenen Werte in der Member List Anzeige: 1. Bild: Die Normalansicht. BROWSE LANZT. SAV. CLIST Command = > Name Prompt . ALIASC . LOGON **End**
Size 10 239
Created 1999/12/31 2004/05/28
Row 00001 of 00002 Scroll = > CSR Changed ID 2004/05/28 12:23:24 DONALD 2004/05/28 12:23:24 LANZT
2. Bild: Die Alternativansicht nach Shift mithilfe der PF11 Taste. BROWSE LANZT. SAV. CLIST Command = = > Name Prompt . ALIASC . LOGON **End**
Size 10 239
Init 9999 239
Mod 2222 0
Row 00001 of 00002 Scroll ===> CSR W MM ID DONALD 33.55 LANZT 01.00
370
17 Dateiverarbeitung mit ISPF
Tipp Wenn man mit LMMREP/LMMADD ein Member neu erzeugt, dann ist es am Einfachsten, bei diesen Befehlen mit der Option STATS(NO), dem Standardwert, zu arbeiten und dann direkt danach einen Aufruf von LMMSTATS ohne Angabe von Parametern auszufuhren. Achten Sie in diesem Fall darauf, dass Sie vor dem LMMSTATS ein LMCLOSE ausführen. Denn LMMSTATS darf nur auf eine DAT AID angewendet werden, die nicht geöffnet ist. Diese Vorgehensweise hat den Vorteil, dass der LMMSTATS Befehl die nicht angegebenen Statistics Werte aufgrund der vorhandenen Physik und der gegenwärtigen Zeit selbst festlegt. Bei LMMREP/LMMADD müssen Sie dagegen die Werte selbst ermitteln und die entsprechenden Variablen besetzen. Dazu kommt noch, dass man bei STATS(YES) in LMMREP/LMMADD einige Werte unbedingt besetzen muss, sonst wird gar nichts eingetragen. Weiterhin werden Werte, die nicht besetzt sind, nicht eingetragen, denn diese beiden Befehle machen von sich aus gar nichts bezüglich der Inhaltsermittlung der Statistics Einträge.
17.1.16
LMCOMP - Compress eines PDS
Funktion Mit LMCOMP wird ein PDS compressed. Ein PDSE kann und braucht nicht compressed zu werden! Falls kein Compress Exit im System installiert wurde, benutzt LMCOMP das Programm IEBCOPY für die Ausfuhrung des Compress. Format ISPEXEC LMCOMP DATAID(data-id) Vor der Ausführung des Befehls LMCOMP muss ein LMINIT Befehl mit der Option ENQ(EXCLU) ausgeführt worden sein.
17.1.17
LMMLIST - Ausgeben einer Member Liste
Funktion Wenn der LMMLIST Service mit der LIST oder der SA VE Option aufgerufen wird, generiert er eine Liste des ersten Auftretens eines Members in einem Concatenated Data Set. Wird nur eine Datei im TSO ALLOC Statement, das dem LMINIT Service Aufruf vorangeht, angegeben, dann werden nur die Membernamen dieser Datei gelistet. Beim erstmaligen Aufruf bestimmt der Inhalt der MEMBER Variablen den Aufsetzpunkt für die Auswahl des Members, von dem ab die Membernamen zurückgegeben werden. Ist die MEMBER Variable BLANK, dann werden alle Membernamen zurückgegeben.
17.1 Die LM Services
371
Hinweis LMMLIST stellt bei jedem Aufruf immer nur den nächsten Namen in der aufsteigenden alphabetischen Sortierfolge bereit. Deshalb muss LMMLIST in einer Schleife aufgerufen werden, wenn man mehrere Membernamen einer Datei erfassen möchte. Bevor LMMLIST benutzt werden kann, muss der LMINIT und der LMOPEN Service ausgeführt werden. Format ISPEXEC LMMLIST DATAID(data-id) [OPTION(LIST|FREE|SAVE)] [MEMBER(member-var)] [STATS(YES|MO)] [GROUP(group)] [PATTERN(member-pattern)] [OPTION(LIST|FREE|SAVE)] LIST Beim erstmaligen Aufruf vom LMMLIST wird eine interne Member List erstellt. Wenn member-var mit Blanks initialisiert worden ist, dann werden bei jedem Aufruf vom LMMLIST nach und nach alle Member der Liste unter Berücksichtigung des member-pattern in der member-var zur Verfugung gestellt. Wenn der in der member-var zur Verfugung gestellte Name nicht gefunden wird, dann wird automatisch der nächste Name zurückgegeben. FREE Mit FREE wird der benutzte Speicher frei gegeben. Immer, wenn eine Schleife zur Ermittlung von Membernamen beendet ist, sollte ein einzelner Aufruf von LMMLIST mit der Option FREE erfolgen. SAVE Mit der Option SAVE wird die Liste der Members in eine Datei ausgegeben. Der Name dieser Datei ergibt sich aus der Definition im GROUP Parameter. [MEMBER(member-var)] In member-var wird zunächst vor dem ersten Aufruf von LMMLIST die Startposition fur das Suchen der Members in der Member List angegeben. Es wird entweder der Name des direkt adressierten Members oder der als nächster gefundene Name in member-var zurückgegeben. [STATS(YES|HO)] Wird YES angegeben, dann werden zu jedem Member dessen Member Statistics Information in den entsprechenden Variablen zurückgegeben. Welche Informationen zurückgegeben werden, ist in der IBM Broschüre ISPF Services Guide in der Beschreibung des Services LMMFIND zu finden.
372
17 D a t e i v e r a r b e i t u n g m i t I S P F
[GROUP(group)] H i e r k a n n ein b i s z u a c h t S t e l l e n l a n g e r N a m e a n g e g e b e n w e r d e n , a u s d e m e i n D S N g e b i l d e t w i r d , in d e n d a n n , bei A n g a b e d e r O P T I O N ( S A V E ) , d i e M e m b e r L i s t e g e s c h r i e b e n wird. Wird der G R O U P Parameter weggelassen und O P T I O N ( S A V E ) angegeben, dann e r f o l g t d i e A u s g a b e d e r M e m b e r n a m e n in d e n L I S T D a t a S e t d e s I S P F . D e r D S N w i r d wie folgt gebildet: < p r e f i x > . < g r o u p > . M E M B E R S . [PATTERN(member-pattern)] Hier kann eine M a s k e angegeben werden, die festlegt, w e l c h e M e m b e r tatsächlich zurückgegeben werden. Die Beschreibung, wie die M a s k e aufgebaut werden muss, finden S i e im I S P F U s e r ' s G u i d e . Beispiel 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
/* DOC: REXX LMMLIST ************************************************/ /* DOC: Beispiel LMMLIST: Ausgeben der Member Liste aus mehreren PDS.*/ /* DOC: Verkettung mehrerer Bibliotheken. Bis zu 16 moeglich! */ /* BEM: Wenn ein Member in mehreren PDS vorhanden ist, wird es in */ /* BEM: dem PDS ausgewiesen, in dem es zuerst gefunden wird. */ /* (o) Franz Lanz am: 1 Jul 1998 */ /*********************************************************************/ dsnl = "'LÄNZT.LOGON.CLIST'" dsn2 = "'LANZT.LOGON.TRANS'" dsn3 = LANZT.SAV.CLIST'" "alloc dd(indd) dsn("dsnl dsn2 dsn3") shr reuse" /*********************************************************************/ address "ISPEXEC" "CONTROL ERRORS RETURN" "LMINIT DATAID (IN) DDNAME (INDD) " if rc > 0 then do; "SETMSG MSG(ISRZ002)"; exit; end "LMOPEN DATAID("in")" if rc > 0 then do; "SETMSG MSG(ISRZ002)"; exit; end mem = " " say left("Member",10)"NR gefunden in DSN" do i = 1 "LMMLIST DATAID("in") MEMBER(MEM) OPTION(LIST) STATS(YES)" select when rc = 0 then say left(mem,10)right(illib,2) value("DSN"zllib) when rc = 8 then leave i otherwise do say strip(zerrsm) say strip(zerrlm) leave i end end /* select */ end i ''LMMLIST DATAID (" in") OPTION (FREE) " /* Speicher freigeben */ "LMCLOSE DATAID("in")" "LMFREE DATAID("in")" address "TSO" "FREE DD(INDD)" exit
Programm 38 LMMLIST: Anwendung des LMMLIST Services
17.1 Die LM Services
373
Ich habe das obige Programm laufen lassen und folgende Ausgabe erhalten: Member NR gefunden i n DSN 1 'LANZT. LOGON. CLIST' $DOC $SICHDAT 1 'LANZT..LOGON. CLIST' 1 'LANZT..LOGON. CLIST' $SICHREC AEPQMS 2 'LANZT..LOGON. TRANS' ALIAS 1 'LANZT..LOGON. CLIST' ALIASC 3 'LANZT..SAV.CLIST' 1 'LANZT.. LOGON.CLIST' ALIASNEU CEPQMS 2 'LANZT..LOGON. TRANS' COMPLOG 1 'LANZT. LOGON. CLIST' HEPQMS 2 'LANZT,.LOGON. TRANS' LOGDXYZ1 1 'LANZT..LOGON. CLIST' LOGDLPRT 1 'LANZT. LOGON. CLIST1 LOGDLPRX 1 'LANZT..LOGON. CLIST' LOGON 1 'LANZT..LOGON. CLIST' VARDAT 1 'LANZT..LOGON. CLIST' VAREDIT 1 'LANZT..LOGON. CLIST' ZLOGON1 3 'LANZT. SAV.CLIST'
17.1.18
LMMDISP - Anzeige und bearbeiten einer Memberliste
Funktion Mit dem Service LMMDISP wird ein Panel mit Membernamen angezeigt. Vor jedem Member kann ein Befehl eingegeben werden, der im Programm zur weiteren Verarbeitung benutzt werden kann. Die Member können auch aus einer Kette von Concatenated Data Sets stamLMMDISP ist ein sehr umfangreicher Befehl. Ich werde hier nur die DISPLAY Option besprechen. Wer sich fur die anderen fünf Optionen interessiert, möge bitte in der IBM Broschüre ISPF Dialog Services nachschlagen. Format der Display Option ISPEXEC LMMDISP D A T A I D ( d a t a - i d ) [OPTION(DISPLAY)] [MEMBER(pattern)] [STATS(YES|NO)] [PANEL(panel-name)] [CURSOR(ZCMD|ZLLCMD|ZLUDATA)] [TOP(top-row)] [COMMANDS(S|ANY)] [FIELD(1|9)] [ALLOWNEW] [OPTION(DISPLAY)] Diese Angabe bestimmt, dass die Display Funktionalität von LMMDISP ausgeführt werden soll. [MEMBER ( p a t t e r n ) ] Hier kann eine Member Auswahl Maske angegeben werden.
374
17 Dateiverarbeitung mit ISPF
[STATS(YES|NO)] Mit STATS (YES) wird festgelegt, dass für jedes ausgewählte Member die Statistics Values zurückgegeben werden. [PANEL(panel-name)] Hier kann ein optionales (eigenes) Panel für die Anzeige ausgewählt werden. [CURSOR (ZCMD | ZLLCMD | Z LUDATA) ] CURSOR legt fest, an welcher Position der Cursor bei der Anzeige des Panels stehen soll. ZCMD
Der Cursor steht in der Command Line des Panels.
ZLLCMD
Der Cursor steht am beginn der ersten Datenzeile.
Z LUDATA
Der Cursor steht im zweiten Eingabefeld der ersten Datenzeile.
[TOP(top-row)] Hier kann der Name eines Members eingegeben werden, dessen Zeile bei der Anzeige des Panels ganz oben steht. [COMMANDS(S|ANY)] S
Es kann als Auswahlkode nur ein S eingegeben werden.
ANY
Es können beliebige Auswahlkodes eingegeben werden.
Hier wird angegeben, wie breit das Eingabefeld vor jedem Member ist: [FIELD(1|9)] 1 Einstellig. Es können nur einstellige Auswahlkodes eingegeben werden. 9
Neunstellig. Es können achtstellige Befehle eingegeben werden. Neunstellige Befehle sind im ISPF nicht möglich.
Beispiel Bei dem folgenden Beispiel wird eine Kette von Concatenated Data Sets mit LMINIT geöffnet. Anschließend wird die Member List mit LMMDISP angezeigt. Es können dann vor einem beliebigen Member Auswahlkodes (Befehle) eingegeben werden. Diese Befehle werden zusammen mit dem Membernamen und dem dazugehörenden DSN mit SAY ausgegeben. Durch Drücken der PF3 Taste wird die Anzeige geschlossen. 01 02 03 04 05 06 07 08 09 10 11 12 13
/ * DOC: REXX LMMDISP ************************************************/ /* DOC: B e i s p i e l f ü r LMMDISP */ / * (c) Franz Lanz am: 1 J u l 1998 */ /*********************************************************************/ dsnl = "'LANZT.LOGON.CLIST'" dsn2 = "'LANZT.LOGON.TRANS'" dsn3 = "'LANZT.SAV.CLIST'" " a l l o c dd(indd) d s n ( " d s n l dsn2 dsn3") shr reuse" /*********************************************************************/ address "ISPEXEC" "CONTROL ERRORS RETURN" mem = "LTEST01" "LMINIT DATAID (IN) DDNAME (INDD) "
375
17.1 Die LM Services 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
"LMOPEN DATAID("in")" do lauf = 1 "LMMDISP DATAID ("in") STATS (YES) MEMBER(*) OPTION (DISPLAY) " , "CURSOR(ZLLCMD) COMMANDS(ANY) FIELD(9)" select when rc = 8 then leave lauf when rc = 0 then do say "Auswahlkode: "left(zllcmd,8)" bei Member: "left(zlmember,9), "aus DSN: "value("dsn"zllib) iterate lauf end otherwise nop end /* select */ end lauf "LMCLOSE DATAID("in")" "LMFREE DATAID("in")"
Programm 39 LMMDISP: Anwendung des LMMDISP Services
Ich habe das Programm laufen lassen und einige Befehle eingegeben. Die daraus entstandenen Ausgaben finden Sie nach der Anzeige des Panels. Menu
Functions
Utilities
Help
MEMBER LIST LANZT LOGON. CLIST Command = > Prompt Lib Name 1 . .. $DOC Willi. . . . $SICHDAT 1 1 ... $SICHREC 2 ... AEPQMS 1 . . . ALIAS browse . . ALIASC 3 1 . . . ALIASNEU listen . . CEPQMS 2 VAREDIT 1 ... ZLOGON1 3 **End**
Size 35 11 8 117 9 10 5 69 8 239
Created 2002/06/28 2002/06/28 2002/06/28 2003/09/11 2004/03/30 1999/12/31 2004/05/27 2004/03/25 1997/12/03 2004/05/28
Row 00001 of 00017 Scroll ==> CSR Changed ID 2002/07/09 09 11 43 LANZT 2002/06/28 13 04 58 LANZT 2002/06/28 13 04 58 LANZT 2004/03/26 14 28 16 LANZT 2004/03/30 11 16 35 LANZT 2004/05/28 12 23 24 DONALD 2004/05/27 11 17 36 LANZT 2004/03/25 16 18 44 LANZT 1998/12/03 15 01 40 $990831 2004/05/28 12 23 24 LANZT
Ich habe die in der Panel Anzeige zu sehenden Line Commands eingegeben und dann dreimal hintereinander Return gedrückt. Dabei erschienen nacheinander die folgenden Zeilen: Auswahlkode: WILLI Auswahlkode: BROWSE Auswahlkode: LISTEN
bei Member: $SICHDAT bei Member: ALIASC bei Member: CEPQMS
aus DSN: 'LANZT.LOGON.CLIST' aus DSN: 1LANZT.SAV.CLIST' aus DSN: 'LANZT.LOGON.TRANS'
Man kann nun in das oben zu sehende Programm eine beliebige Verarbeitung fur die angezeigten Member einfügen und sich so auf schnelle Art eine Memberverarbeitung zusammen bauen. Hinweis In der Spalte L i b ist angegeben, in welcher Datei der Kette dieses Member zuerst gefunden wurde. Das Member kann aber in den dahinter liegenden Dateien der Kette noch beliebig oft vorkommen.
376
17.1.19
17 Dateiverarbeitung mit ISPF
LMDINIT - Initialisieren des LMDDISP Service
Funktion Der LMDINIT Service generiert eine DATAID für einen nachfolgenden LMDDISP oder LMDLIST Service. Format ISPEXEC LMDINIT
LISTID(dslist-id-var) {LEVEL(dsname-level)} {VOLUME(volume-serial)} LISTID(dslist-id-var) List ID Variable. {LEVEL(dsname-level)} In d s n a m e - l e v e l wird eine Maske für die Auswahl der DSNs angegeben. Die Regeln für die Gestaltung der Maske sind genau die gleichen, wie im Menü 3.4 des ISPF. {VOLUME(volume-serial)} Hier kann eine VOLSER (ein Plattenname) angegeben werden. Wird dieser Name angegeben, dann werden die Dateien nur im VTOC dieser Platte gesucht.
17.1.20
LMDDISP - Data Set List Service
Mit dem LMDDISP Service kann man ein Panel anzeigen lassen, das dem Menü 3.4 des ISPF entspricht. Dabei können die anzuzeigenden DSNs mittels einer Maske, die beim Aufruf von LMDINIT angegeben werden muss, ausgewählt werden. Vor dem Aufruf von LMDDISP muss deshalb der LMDINIT Service aufgerufen werden. Format ISPEXEC LMDDISP
LISTID(dslist-id) [VIEW(VOLUME|SPACE|ATTRIB|TOTAL)] [CONFIRM(YES|NO)] [PANEL(panel-name)]
LISTID(dslist-id) List ID Variable aus dem LMDINIT Service. [VIEW(VOLUME|SPACE|ATTRIB|TOTAL)] Hier kann angegeben werden, welche Zusatzangaben beim Anzeigen des Panels mit erscheinen sollen. [CONFIRM(YES|NO)] Bei YES erscheint vor dem DELETE einer Datei das Confirm Delete Panel. Bei NO erscheint nur dann dieses Panel, wenn eine Datei gelöscht werden soll, deren Schutzdatum noch nicht abgelaufen ist.
377
17.1 Die LM Services
[PANEL(panel-name)] Hier kann der Name eines Panels angegeben werden, dass statt des Standardpanels aus dem Menü 3.4 benutzt werden soll. Beispiel 01 /* DOC: REXX LMDDISP ************************************************/ 02 /* DOC: Beispiel fuer LMDDISP und LMDINIT */ 03 /* (o) Franz Lanz am: 1 Jul 1998 */ 04
05 06 07 08 09 10 11 12
/*********************************************************************/
address "ISPEXEC" "CONTROL ERRORS RETURN" "LMDINIT LISTID (IN) LEVEL (PROX. *. REXX) " if rc > 0 then call ispf error rc "IMDDISP LISTID("in") VIEW(TOTAL)" if rc > 0 then call ispf_error rc "LMDFREE LISTID("in")" exit
Programm 40 LMDDISP: Anwendung des LMDDISP Services
Die Prozedur I S P F E R R O R habe ich aus Platzgründen weggelassen. Ich habe diese Testprozedur für LMMDISP ausgeführt. Das Ergebnis sehen Sie hier: Menu
Options
View
Utilities
Compilers
Help
DSLIST - Data Sets Matching PROX.*.REXX Command = = > Command - Enter "/" to select action Tracks % XT Device Dsorg Recfm Lrecl Blksz
Roh 1 of 4 Scroll = > CSR Message Created Expires
Volume Referred
150
PROX . BUCH . REXX 4 1 3390 PO-E FB
D1D101 80 27920 2004/04/26 ***None*** 2004/06/02
150
PROX. LANZ. REXX 34 1 3390 PO-E FB
D1D119 80 27920 2002/04/30 ***None*** 2004/06/03
75
PROX. LOGON. REXX 60 1 3390 PO-E FB
80 27920 2002/09/19
D1D135 2004/06/02
PROX . UTIL . REXX D1D142 150 1 1 3390 PO-E FB 80 27920 2004/05/26 ***None*** 2004/05/26 ***************************** End of Data Set list ****************************
Durch die Option VIEW(TOTAL) im LMDDISP Befehl kommen hier alle Dateiattribute zur Anzeige.
378
17.1.21
17 Dateiverarbeitung mit ISPF
LMDLIST - List Data Sets
Funktion Dieser Service arbeitet fast genau so wie der LMDDISP Service. Der Unterschied besteht darin, dass die zur Maske passenden DSN bei jedem Aufruf von LMDLIST jeweils zurückgegeben werden. Der LMDINIT Service muss vorher ausgeführt worden sein. Für die Rückgabe der intern gespeicherten DSN gibt es zwei Möglichkeiten: 1. Die LIST Option gibt immer einen Namen pro Aufruf zurück. Deshalb muss bei dieser Art der Verwendung von LMDLIST der Befehl so lange in einer Schleife aufgerufen werden, bis der RC=8 auftritt. 2. Die SAVE Option schreibt die DSNs in eine Datei. In diesem Fall ist natürlich nur ein Aufruf erforderlich. Format ISPEXEC LMDLIST LISTID(dslist-id) [OPTION(LIST|FREE|SAVE)] [DATASET(dataset-var)] [STATS(YES|NO)] [GROUP(group)] LISTID(dslist-id) Angabe der dslist-id aus dem LMDINIT Statement. [OPTION(LIST|FREE|SAVE)] LIST Beim erstmaligen Aufruf vom LMMLIST wird eine interne Member List erstellt. Wenn member-var mit Blanks initialisiert worden ist, dann werden bei jedem Aufruf vom LMMLIST nach und nach alle Member der Liste unter Berücksichtigung des member-pattern in der member-var zur Verfugung gestellt. Wenn der in der membervar zur Verfugung gestellte Name nicht gefunden wird, dann wird automatisch der nächste Name zurückgegeben. FREE Mit FREE wird der benutzte Speicher frei gegeben. Immer, wenn eine Schleife zur Ermittlung von Membernamen beendet ist, sollte ein einzelner Aufruf von LMMLIST mit der Option FREE erfolgen. SAVE Mit der Option SAVE wird die Liste der Members in eine Datei ausgegeben. Der Name dieser Datei ergibt sich aus der Definition im GROUP Parameter. [DATASET(dataset-var)] In dataset-var wird zunächst vor dem ersten Aufruf von LMDLIST die Startposition fiir das Suchen der DSNs in der DSN List angegeben. Es wird entweder der Name des direkt adressierten DSN oder der als nächster gefundene Name in dataset-var zurückgegeben.
17.1 Die LM Services
379
[STATS(YES|NO)] Wird YES angegeben, dann werden zu jedem DSN Statistics Informations in den zugehörigen Variablen zurückgegeben. Welche Informationen zurückgegeben werden ist in der IBM Broschüre ISPF Services Guide unter dem Service LMDLIST beschrieben. [GROUP(group)] Hier kann ein bis zu acht Stellen langer Name angegeben werden, aus dem ein DSN gebildet wird, in den dann, bei Angabe der OPTION(SAVE), die DSN Liste geschrieben wird. Wird der GROUP Parameter weggelassen und OPTION(SAVE) angegeben, dann erfolgt die Ausgabe der Membernamen in den LIST Data Set des ISPF. Der DSN wird wie folgt gebildet: ..DATASET. Beispiel 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
/* DOC: REXX LMDLIST ************************************************/ /* DOC: Beispiel fuer LMDLIST für eine Data Set Mask */ /* (c) Franz Lanz am: 1 Jul 1998 */ /*********************************************************************/ dsn = "PEV*.*.REXX" /* Definiere Maske */ address "ISPEXEC" "CONTROL ERRORS RETURN" "LMDINIT LISTID(IN) LEVEL("DSN")" if rc > 0 then call ispf_error rc dataset = " " /* Startpunkt. Bei BLANK werden alle DSN geholt. */ dsns = "" /* Sammelstring für die DSN */ do idat = 1 "LMDLIST LISTID("IN") STATS(YES) DATASET(dataset) OPTION(LIST)" select when rc = 0 then dsns = dsns dataset when rc = 8 then leave idat otherwise call ispf_error rc end /* select */ end idat do i = 1 to words(dsns) say word(dsns,i) end i "LMDFREE LISTID("in")" exit
Programm 41 LMDLIST: Anwendung des LMDLIST Services
Ich habe das obige Programm laufen lassen und dabei die folgende Ausgabe erhalten: PEVP. REXX. REXX PROX. BUCH. REXX PROX. LANZ. REXX PROX. LOGON. REXX PROX. UTIL. REXX
17.1.22
LMDFREE - Freigeben eines LMDINIT
Funktion Freigeben einer mit LMDINIT angelegten LIST ID.
380
17 Dateiverarbeitung mit ISPF
Format ISPEXEC LMDFREE L I S T I D ( l i s t - i d ) Die mit dem dazugehörigen LMDINIT angelegte LIST ID wird frei gegeben.
17.1.23
MEMLIST - Member List Dialog Service
Mit dem MEMLIST Service wird ein Panel angezeigt, das die Members eines oder mehrerer PDS anzeigt. In dieser Anzeige können dann vor jedem Member Befehle eingegeben werden, wie sie auch in einer Member List nach einem M Line Command im Menü 3.4 des ISPF möglich sind. Der LMINIT Service muss vor dem Aufruf des MEMLIST Services ausgeführt worden sein. Format ISPEXEC MEMLIST D A T A I D ( d a t a - i d ) [MEMBER(pattern)] [CONFIRM(YESINO)] [PANEL(panel-name)] [FIELD(1|9)] DATAID(data-id) Angabe der DATAID aus dem zugehörigen LMINIT Service Aufruf. [MEMBER ( p a t t e r n ) ] Hier kann eine Maske für die Auswahl der anzuzeigenden Members vorgegeben werden. Wird keine Maske angegeben, kommen alle Members zur Anzeige. [CONFIRM(YES|NO)] Ist die Option YES aktiv, erscheint vor dem DELETE eines Members das Confirm Delete Panel. Anderenfalls wird das DELETE sofort ausgeführt. [PANEL(panel-name)] Hier kann der Name eines Panels angegeben werden, das statt des Standardpanels bei der Anzeige benutzt werden soll. [FIELD(1|9)] Definiert die Länge des Line Command Fields. Wird 1 angegeben, können nur einstellige Line Commands wie z.B. B, E, V usw. eingegeben werden. In dem folgenden Beispiel wird durch ALLOC und LMINIT der Zugriff auf eine Kette von zwei PDS eingerichtet. Bei der Anzeige in dem beim Aufruf von MEMLIST erscheinenden Panel werden die einzelnen Members bei ihrem erstmaligen Auftreten in der PDS Kette angezeigt. Beispiel 01 /* DOC: REXX MEMLIST 02 /* DOC: Erstellen und Anzeigen einer Member Liste aus einer Reihe 03 /* DOC: von CONCATENATED DATASETS
*/ */ */
381
17.1 Die LM Services 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18
/* (c) LANZT am: 21 Jan 2003 */ /*********************************************************************/ dsns =, " PROX. BUCH . REXX" , " PROX. LANZ. REXX" "alloc dd(in) dsn("dsns") shr reuse" address "ISPEXEC" "CONTROL ERRORS RETURN" "LMINIT DATAID (ID) DDNAME(IN) ENQ (SHR) " if rc > 0 then call ispf_error "MEMLIST DATAID (" id" ) " if rc > 0 then call ispf_error "LMFREE DATAID ("id") " if rc > 0 then call i_error exit
Programm 42 MEMLIST: Memberlisle aus verketteten Dateien erstellen
Beim Aufruf dieses Programms wird das folgende Panel angezeigt. In der Spalte Lib steht die Position des PDS innerhalb der Kette, in dem das Member zuerst gefunden wurde. Ist ein Member in einer weiter hinten liegenden Datei auch noch vorhanden, dann ist das von hier aus nicht zu erkennen. Menu
Functions
LIBRARY
Confirm
Utilities
Help
PROX.BUCH.REXX -=>
Name $CONPANL $CONREXX $DOC $PDSHIST $PDSSICH $SICHDAT $SICHNOT $SICHREC $TESTDSN $UPDTE #§MEM ttCOMMBOX #DB200 #ISPFB## #MACTT #PROF #SSUPDT #T #TSOB### #TT #XPEDA #XPEDC SSUBIND ACBCHP ACBCHT
Prompt
Lib 1 1 1 1 1 2 2 2 2 2 2 2 2 1 2 2 2 2 1 2 2 2 2 2 2
Size 11 15 44 105 64 207 12 9 12 31 35 30 60 36 13 18 25 15 52 35 12 13 10 266 266
Abbildung 117 Anzeigepanel des MEMLIST Services
Created 2003/05/27 2002/07/04 2004/04/26 2004/06/02 2004/06/02 2003/09/11 2003/09/11 2003/09/11 2002/01/23 1998/10/06 2002/03/07 2003/05/08 2002/12/09 2004/05/26 2002/01/23 2004/03/29 2003/03/07 2002/09/26 2004/05/15 2002/09/24 2002/12/04 2002/12/04 2002/09/02 2000/07/04 2000/07/03
Vol D1D101 Row 00001 of 00290 Scicol.L === > CSR ID Changed 2004/04/26 18 : 22: 34 LANZT 2004/04/26 18 : 22: 58 LANZT 2004/04/26 18 : 26::40 LANZT 2004/06/02 23:: 56::21 SQMTP 2004/06/02 23 : 56::21 SQMTP 2003/09/11 10 : 37::02 LANZT 2003/09/11 10:: 43::37 LANZT 2003/09/11 10 : 37::02 LANZT 2002/09/13 08:: 06::55 LANZT 2003/12/08 09:: 06::38 LANZT 2002/08/13 15:: 50::45 LANZT 2004/01/22 08:: 50:;20 LANZT 2002/12/10 12:: 58::37 LANZT 2004/05/26 23:: 56 22 : SQMTP 2002/09/18 08:: 50::15 LANZT 2004/03/29 18:: 28::21 LANZT 2003/03/07 15:: 49::52 LANZT 2004/03/29 15:: 37::47 LANZT SQMTP 2004/05/15 23:: 5622 : 2003/03/04 10:: 3022 : LANZT 2002/12/04 13:: 03 48 : LANZT 2002/12/04 13:: 28::09 LANZT 2002/09/02 18:: 16::12 LANZT 2004/04/01 15: 32: 35 LANZT 2002/08/08 09: 11: 16 LANZT
382
17 Dateiverarbeitung mit ISPF
Tipp Wenn man bei einem MEMLIST Aufruf eine Kette von PDS im ALLOC Statement benannt hat, dann sind einige Besonderheiten bei den Line Commands D und R zu beachten: Möchte man ein Member löschen, kann das nicht mit einem einfachen D vor dem Membernamen geschehen. Versucht man dies, dann bekommt man einen Return Code C13. Dieser Return Code bedeutet, dass man versucht hat, eine Kette von PDS mit OUTPUT zu öffnen. Da dies (wie wir weiter oben schon besprochen haben) natürlich nicht geht, erhält man diesen Abbruch. Das ISPF setzt das D Command aber intern so um. Man hat somit keinen Einfluss auf den Ablauf dieser Aktion. Man muss aber hier nicht verzweifeln, denn es gibt eine Alternative zu den Line Commands D und R. Wenn man statt D den TSO Befehl DELETE als Line Command eingibt, dann wird diese Aktion an das TSO weitergegeben. TSO erlaubt es aber, eine solche Aktion für die jeweils erste Datei einer Kette durchzuführen. Es erstellt intern einen Befehl der so aussieht: "DELETE dsn(member)". Und dieser Befehl wird ohne weiteres ausgeführt. Beim RENAME muss man etwas mehr Aufwand betreiben: Nach der Eingabe von RENAME vor einem Member verlangt das TSO jetzt die Eingabe von der Art DSN(MEMBER) für die neue Datei. Dabei muss man natürlich unbedingt darauf achten, dass man den gleichen DSN eingibt, wie er in der Kopfzeile der Anzeige von MEMLIST steht. Und zum Schluss noch eine wichtige Einschränkung: Beide Line Commands lassen sich nur auf Members anwenden, die in der ersten Datei der PDS Kette stehen. Es gibt noch weitere Einschränkungen, wenn man eine Kette von PDS beim Aufruf von MEMLIST ausgewählt hat. Es würde aber hier zu weit führen, alle Besonderheiten zu erforschen und zu erklären. Machen Sie Ihre eigenen Versuche!
17.2
Data Set Query Services
Man benötigt bei der Programmierung im TSO/ISPF Umfeld sehr häufig Informationen über Dateien. Schön wäre es, wenn es eine einzige Funktion geben würde, mit der man alle Informationen über eine Datei bekommen könnte. Dies ist aber leider nicht der Fall. Wenn man ALLE Informationen über eine Datei braucht, dann muss man sogar drei Services aufrufen. Ich stelle diese drei Services in der folgenden Tabelle vor: Funktion LMDLIST
System ISPF
DSINFO
ISPF
LISTDSI
REXX
Bemerkungen Dieser Service gibt als einziger die Information über den HSM Migrationstatus einer Datei aus. Gibt einen sehr umfassenden Überblick über die Charakteristik einer Datei. Gibt fast die gleichen Informationen aus wie DSINFO, aber einige der Informationen sind etwas besser zu gebrauchen.
Tabelle 31 Data Set Query Services
17.2 Data Set Query Services
383
Hinweis Alle Variablen sind nach dem Aufruf einer der genannten Services in dem aufrufenden REXX Programm unter den genannten Namen verfügbar. Die Rückgabe der Variablen, die keine brauchbaren Werte enthalten, ist von Funktion zu Funktion durchaus unterschiedlich.
17.2.1
LMDLIST - Data Set List Service
Dieser Service ist schon weiter vorne im Kapitel „LMDLIST - List Data Sets" ab Seite 378 beschrieben worden. Hier möchte ich jetzt in der folgenden Tabelle die Namen und den Inhalt der Variablen darstellen, die bereitgestellt werden, wenn man den Service mit der Option ST ATS(YES) aufruft. Variable ZDLVOL ZDLDEV ZDLDSORG ZDLRECFM ZDLLRECL ZDLBLKSZ ZDLSIZE ZDLUSED ZDLEXT ZDLCDATE ZDLEDATE ZDLRDATE ZDLMIGR ZDLDSNTP ZDLSPACU ZDLMVOL
Beschreibung Plattenname. (Volume serial) Gerätetyp. (Device type) Organisationsform der Datei. (Data set organization) Satzformat der Datei. (Record format) Länge eines Datensatzes. (Logical record length) Länge eines Datenblocks. (Block size) Größe der Datei in Anzahl Spuren. (Data set size in tracks) Füllgrad der Datei in % (PDSE). Anzahl der Datenblöcke dieser Datei. Erstelldatum. (Creation date) Ende Datum der Sperrfrist. (Expiration date) Datum des letzten Zugriffs. (Date last referenced) Gibt an, ob die Datei HSM migriert ist. (YES oder NO) Dateityp. ('PDS', 'LIBRARY', oder'') Einheiten der Größenangabe. (CYLINDERS, TRACKS, BLOCKS) Gibt an, ob sich diese Datei über mehrere Platten verteilt. (Y oder N)
Tabelle 32 Variable des LMDLIST Services
17.2.2
DSINFO - Data Set Information
Dieser Service ist erst vor einiger Zeit neu eingeführt worden. Er stellt im Wesentlichen die gleichen Informationen zur Verfugung wie die REXX Funktion LISTDSI. Format ISPEXEC DSINFO DATASET(dsname) [VOLUME(serial)]
384
17 Dateiverarbeitung mit ISPF
DATASET(dsname) dsname ist der Data Set Name, für den die Informationen eingeholt werden sollen. [VOLUME(serial)] serial ist die Volume Serial Number (Plattenname) auf der die Datei liegt. Dieser Parameter muss nur angegeben werden, wenn der Data Set nicht katalogisiert ist. Die folgende Tabelle enthält eine Aufstellung der Informationen, die vom DSINFO Service bereitgestellt werden. Variable ZDSVOL ZDS#VOLS ZDSDEVT ZDSORG ZDSRF ZDSLREC ZDSBLK ZDSSPC ZDS 1 EX ZDS2SPC ZDS2EX ZDSDSNT ZDSSEQ ZDSCDATE ZDSXDATE ZDSRDATE ZDSTOTA ZDSTOTU ZDSEXTA ZDSEXTU ZDSDIRA ZDSDIRU ZDSDIR ZDS#MEM ZDSPAGU ZDSPERU ZD SMC ZDSSC ZDSDC ZDSCB1 ZDSVTAB
Beschreibung Name der ersten oder einzigen Platte. Anzahl der Platten, über die sich die Datei erstreckt Gerätetyp Datei Organisationsform. Datensatzformat Satzlänge Blocklänge Einheiten der Größenangabe des primären Datenbereichs. Anzahl der Einheiten des primären Datenbereichs. Einheiten der Größenangabe des sekundären Datenbereichs. Anzahl der Einheiten des sekundären Datenbereichs. Dateityp Compressible YES/NO Erstelldatum. (Creation date) Ende Datum der Sperrfrist. (Expiration date) Datum des letzten Zugriffs. (Date last referenced) Zugeordnete Dateigröße Benutzte Größe Zugeordnete Dateibereiche Genutzte Dateibereiche Zugeordnete Verzeichnisblöcke Belegte Verzeichnisblöcke PDSE Verzeichnisblöcke (NOLIMIT) Anzahl der Members Anzahl der benutzten Pages eines PDSE Prozentsatz der benutzten Pages eines PDSE SMS - Management class SMS - Storage class SMS - Data class Format 1 data control block Namen aller Platten, auf denen sich Teile der Datei befinden
Tabelle 33 Variable des DSINFO
Services
17.2 Data Set Query Services Beispiele 1. PDS not SMS managed: Data Set : Content P0XYZ1 1 3390 PO VB 255 27998 CYLINDER 1 CYLINDER 1 PDS NO 2002/08/02 ***Perm*** 2004/06/08
0 3 NOLIMIT 12 0 0
P0XYZ1
LANZT. LOGON .CLIST Description Variable - > First or only volume ZDSVOL ZDS#VOLS - > Number of volumes ZDSDEVT - > Device type - > Data set organization ZDSORG ZDSRF - > Record format ZDSLREC - > Logical record length ZDSBLK - > Block size - > Primary space units ZDSSPC - > Primary space allocation ZDS1EX ZDS2SPC - > Secondary space units - > Secondary space allocation ZDS2EX ZDSDSNT - > Data set name type Compressible YES/NO ZDSSEQ -> ZDSCDATE - > Creation date ZDSXDATE - > Expiration date Referenced date ZDSRDATE - > Allocated space units ZDSTOTA - > Used space units ZDSTOTU - > Allocated extents ZDSEXTA - > Used extents ZDSEXTU - > ZDSDIRA - > Allocated directory blocks ZDSDIRU - > Used directory blocks ZDSDIR - > PDSE directory blocks ZDS#MEM - > Number of members ZDSPAGU - > Pages used (PDSE) ZDSPERU - > Percent used (PDSE) ZDSMC - > Management class - > Storage class ZDSSC - > Data class ZDSDC ZDSVTAB - > Volume table
2. PDSE SMS managed: Data Set: Content
LANZT.ISPF.PROFILE.LPRT Variable Description ZDSVOL -> First or only volume ZDS#VOLS -> Number of volumes ZDSDEVT -> Device type ZDS0R6 -> Data set organization ZDSRF -> Record format ZDSLREC -> Logical record length ZDSBLK -> Block size CYLINDER ZDSSPC -> Primary space units ZDS1EX -> Primary space allocation CYLINDER ZDS2SPC -> Secondary space units ZDS2EX -> Secondary space allocation ZDSDSNT -> Data set name type ZDSSEQ -> Compressible YES/NO 2002/10/08 ZDSCDATE -> Creation date ***Perm*** ZDSXDATE -> Expiration date 2004/06/08 ZDSRDATE -> Referenced date ZDSTOTA -> Allocated space units ZDSTOTU -> Used space units
385
386 l o 0 0 NOLIMIT 71 179 49 **None** T1NKPM00 **None** T1N011
17.2.3
17 Dateiverarbeitung mit ISPF ZDSEXTA ZDSEXTU ZDSDIRA ZDSDIRU ZDSDIR ZDS#MEM ZDSPA6U ZDSPERU ZDSMC ZDSSC ZDSDC ZDSVTAB
-> -> -> -> -> -> -> -> -> -> -> ->
Allocated extents Used extents Allocated directory blocks Used directory blocks PDSE directory blocks Number of members Pages used (PDSE) Percent used (PDSE) Management class Storage class Data class Volume table
Interessantes Problem im REXX
Wenn man die Funktion DSINFO benutzt, stößt man auf ein interessantes Problem im REXX. Mit diesem Problem musste ich mich erst kürzlich auseinandersetzen. Ich möchte es Ihnen nicht vorenthalten. Allerdings ist die Beschreibung etwas umfangreich. Es geht aber leider nicht kürzer. Wenn man die ISPF Funktion DSINFO aufruft, werden viele Variablen zurückgegeben, die Auskunft über die Datei geben, die man beim Aufruf angegeben hat. Darunter sind auch die drei Werte ZDSDC, ZDSSC und ZDSMC. Diese stehen für die SMS Definitionen „Data Class", „Storage Class" und „Management Class". Diese Felder sind acht Byte lang und enthalten normalerweise Texte, wie z.B. XXXPOOL. Wenn nun aber die Datei, die man mit DSINFO abfragt „NON SMS managed" ist, dann stehen in diesen Feldern nicht etwa Blanks, sondern acht Byte binär Null. Das Programm DSINFO gibt diese Felder an das rufende REXX Programm aber mit der REXX Typ Definition CHAR zurück. Wenn man jetzt im REXX mit dem Statement
if zdsdc = 0 then sms = "NO" abfragen will, ob die Werte besetzt sind, dann bekommt man ein falsches Ergebnis, denn REXX erwartet eine Null im REXX Sinn. Und das ist der Wert " F 0 " X . In einem solchen Fall kann man das Feld mit der REXX Funktion C2D in eine Dezimalzahl umwandeln. Dadurch sieht dann das obige Statement so aus:
if c2d(zdsdc) = 0 then sms = "NO" Diese Abfrage funktioniert auch so lange gut, so lange in dem Feld ZDSDC auch binär Null steht. Sobald aber eine DSINFO Abfrage auf einen „SMS managed" Data Set erfolgt, erhält man vom REXX bei der Ausfuhrung des IF Befehls die Fehlermeldung: „Incorrect call to Routine" für den Aufruf der Funktion C2D. Hier ist man zunächst ziemlich ratlos, denn die Funktion C2D ist ja gerade eine Konvertierungsfunktion, um ein CHAR Feld in eine Dezimalzahl umzuwandeln. Die Ursache des Fehlers liegt in diesem Fall wo anders: REXX arbeitet standardmäßig mit maximal neunstelligen Dezimalzahlen. Sobald nun ein achtstelliges Textfeld in eine Dezimalzahl umgewandelt werden soll, ist das Ergebnis eine
17.2 Data Set Query Services
387
Zahl die weit mehr als neun Stellen hat. Zum Beispiel ergibt der Text XXXPOOL die 17stellige Zahl 65275702564804307. Die Fehlermeldung „Incorrect call to Routine" ist an dieser Stelle eine ziemlich gemeine Sache, denn man kann mit Hilfe dieser Meldung den Fehler nicht erkennen. Wie sieht aber nun die Lösung des Problems aus? Zum Glück gibt es im REXX die Möglichkeit die Anzahl Dezimalstellen, mit denen REXX arbeitet, festzulegen. Dies geschieht mit dem Befehl: numeric digits nn wobei nn die Anzahl der Dezimalstellen des Zahlenraums angibt, in dem REXX arbeiten kann. Also wäre im obigen Fall der Befehl numeric digits 30 angebracht. Damit sieht dann die IF Abfrage so aus: numeric digits 30 if c2d(zdsdc) = 0 then sms = "NO" numeric digits 9 Hinweis Man sollte die Numeric Digits wieder zurücksetzen, da sonst alle Rechenoperationen im REXX mit dieser Zahlenbreite durchgeführt werden und das kostet Rechenzeit. Außerdem kann eine große NUMERIC DIGITS Angabe auch Speicherplatz kosten. Dazu folgendes Beispiel numeric digits 70 a = 2/3 say a Ergibt: 0.6666666666666666666666666666666666666666666666666666666666666666666667 Diese Zahl muss intern mit den ganzen 72 Zeichen abgespeichert werden! Es gibt aber noch eine andere Möglichkeit, ein Feld das binär Null enthält, abzufragen. Man muss nur die Vergleichskonstante als binär Null definieren. Damit sieht die Abfrage dann so if substr(zdsdc,1,1) = "00"x then sms = 0 oder auch if zdsdc = "0000000000000000"x then sms = 0 Beide Abfragen erzeugen das gleiche Ergebnis. Welchen Typ man wählt, ist hier Geschmacksache. Tipp Wenn Sie also einmal den DSINFO Service benutzen und dabei die SMS Felder abfragen müssen, sollten Sie die beiden hier genannten Befehle benutzen. Dadurch vermeiden Sie den Ärger, der aus der internen Konvertierung der Felder entstehen kann.
388
17.2.4
17 Dateiverarbeitung mit ISPF
LISTDSI - List Data Set Information
Funktion LISTDSI ist eine TSO/REXX Funktion. Sie liefert, je nach Aufruf, unterschiedliche Informationen über Dateien. Format LISTDSI(data-set-name DD-Name FILE [location] [DIRECTORY] [REOALL] [SMSINFO]) data-set-name Wenn das Schlüsselwort FILE nicht angegeben ist, dann muss hier der DSN der Datei stehen, deren Werte man abfragen will. [location] Hier wird gesteuert, wie das System nach der Datei sucht. VOLUME (vol) bezeichnet die VOLSER der Platte, auf der die Datei liegt. Wird diese Option benutzt, dann unterbleibt die Suche über das Catalog Management des MVS. PREALLOC bedeutet, dass die Datei nicht durch einen Catalog Search gesucht wird, sondern durch die LISTDSI Funktion zugeordnet wird. Ist weder VOLUME noch PREALLOC angegeben, dann wird die Datei über das Catalog Management des MVS gesucht. Dies ist auch der Normalfall. Diese beiden Options werden normalerweise in der Praxis nicht benutzt. [DIRECTORY] Hier kann durch Eingabe des Wortes DIRECTORY angegeben werden, ob die Directory Informationen eines PDS/PDSE abgefragt und in die entsprechenden Variablen gespeichert werden. Wenn NODIRECTORY oder nichts angegeben ist, werden diese Informationen nicht zurückgegeben. DIRECTORY sollte man nur dann angeben, wenn die entsprechenden Informationen auch benötigt werden. Das Ermitteln der Directory Informationen benötigt viel Zeit. [RECALL] Durch die Eingabe des Wortes RECALL wird eine Datei, die HSM migriert ist, zwingend zurück geladen. NORECALL ist der Default Wert. DD-Name FILE Wenn die Informationen über eine Datei ermittelt werden sollen, die bereits zugeordnet ist, dann kann statt des DSN auch der DD-Name der Zuordnung angegeben werden. In diesem Fall muss hinter dem DD-Namen das Wort FILE geschrieben werden. Mit dieser Option kann man den DSN zu einer Datei ermitteln, der extern zum REXX Programm
17.2 Data Set Query Services
389
durch die JCL mittels DD-Statement zugeordnet wurde. Der DSN steht nach dem Aufruf der Funktion in der Variablen SYSDSNAME. [SMSINFO] Wenn man das Wort SMSINFO als Option eingibt, dann werden die SMS Informationen zu dieser Datei ermittelt und in den entsprechenden Variablen zurückgegeben. Da diese Option einen größeren Aufwand verursacht, sollte man sie nur einsetzen, wenn man sie benötigt. NOSMSINFO ist der Standardwert. Die folgende Tabelle zeigt die Variablen, die durch LISTDSI besetzt werden. Es handelt sich hierbei um einen Auszug aus der IBM Broschüre TSO/E REXX Reference. Bei VSAM Dateien werden nur die Variablen SYSVOLUME, SYSUNIT, and SYSDSORG besetzt. Alle anderen Variablen erhalten ein Fragezeichen (?). Variable name SYSDSNAME SYSVOLUME SYSUNIT SYSDSORG
SYSLRECL SYSBLKSIZE SYSKEYLEN SYSALLOC SYSUSED
SYSUSEDPAGES SYSPRIMARY SYSSECONDS SYSREASON SYSMSGLVL1 SYSMSGLVL2
Description Data set name. Volume serial ID. Generic device type on which volume resides, for example 3390. Data set organization: PS Physical sequential PSU Physical sequential unmovable DA Direct organization DAU Direct organization unmovable IS Indexed sequential ISU Indexed sequential unmovable PO Partitioned organization POU Partitioned organization unmovable VS VSAM ??? Unknown Logical record length. Block size. Key length. Allocation, in space units. Allocation used, in space units. For a partitioned data set extended (PDSE), 'N/A' will be returned see the description of the variable SYSUSEDPAGES for used space of a PDSE. The used space of a partitioned data set extended (PDSE) in 4K pages. Primary allocation in space units. Secondary allocation in space units. LISTDSI reason code. First-level message if an error occurred. Second-level message if an error occurred.
Tabelle 34 Variable des LISTDSI Services - Teil 1
390 Variable name SYSRECFM
SYSUNITS
SYSEXTENTS SYSCREATE SYSREFDATE SYSEXDATE SYSPASSWORD
SYSRACFA
SYSUPDATED
SYSTRKSCYL SYSBLKSTRK
17 Dateiverarbeitung mit ISPF Description Record format one to six character combination of the following: U Records of undefined length. F Records of fixed length. V Records of variable length. B Records blocked. S Records written as standard or spanned variable-length blocks. A Records contain ASCII control characters. M Records contain machine code control characters. ?????? Unknown Space units: CYLINDER Space units in cylinders. TRACK Space units in tracks. BLOCK Space units in blocks. ???????? Space units are unknown. Number of extents allocated. Creation date Year/day format, for example: 1990/102 Last referenced date in Year/day format, for example: 1990/107 (Specifying DIRECTORY causes the date to be updated) Expiration date in Year/day format, for example: 1990/365 Password indication: NONE No password protection. READ Password required to read. WRITE Password required to write. RACF indication: NONE No RACF protection. GENERIC Generic profile covers this data set. DISCRETE Discrete profile covers this data set. Change indicator: YES Data set has been updated. NO Data set has not been updated. Tracks per cylinder for the unit identified in the SYSUNIT variable. Blocks (whose size is given in variable SYSBLKSIZE) per track for the unit identified in the SYSUNIT variable. For a PDSE, the value "N/A" is returned because a block of size SYSBLKSIZE can 'span' a track in a PDSE. The value contained in SYSUSEDPAGES is a more meaningful measurement of space usage for a PDSE.
Tabelle 35 Variable des LISTDSI Services - Teil 2
17.2 Data Set Query Services Variable name SYSRACFA
SYSUPDATED
SYSTRKSCYL SYSBLKSTRK
SYSADIRBLK
SYSUDIRBLK
SYSMEMBERS SYSDSSMS
391
Description RACF indication: NONE No RACF protection. GENERIC Generic profile covers this data set. DISCRETE Discrete profile covers this data set. Change indicator: YES Data set has been updated. NO Data set has not been updated. Tracks per cylinder for the unit identified in the SYSUNIT variable. Blocks (whose size is given in variable SYSBLKSIZE) per track for the unit identified in the SYSUNIT variable. For a PDSE, the value "N/A" is returned because a block of size SYSBLKSIZE can 'span' a track in a PDSE. The value contained in SYSUSEDPAGES is a more meaningful measurement of space usage for a PDSE. For a partitioned data set (PDS) the number of directory blocks allocated will be returned. For a partitioned data set extended (PDSE), "NO LIM" will be returned because there is no static allocation for its directory. A value is returned only if DIRECTORY is specified on the LISTDSI statement. For a partitioned data set (PDS) the number of directory blocks used will be returned. For a partitioned data set extended (PDSE), "N/A" will be returned because it is not a static value. A value is returned only if DIRECTORY is specified on the LISTDSI statement. Number of members - returned only for partitioned data sets when DIRECTORY is specified. Contains information about the type of a data set, provided by DFSMS/MVS. If the SMS DSNTYPE information could not be retrieved, the SYSDSSMS variable contains: SEQ for a sequential data set. PDS for a partitioned data set. PDSE for a partitioned data set extended. If the data set is a PDSE and the SMS DSNTYPE information could be retrieved, the SYSDSSMS variable contains: LIBRARY for an empty PDSE. PROGRAM LIBRARY for a partitioned data set extended program library. DATA LIBRARY for a partitioned data set extended data library.
Tabelle 36 Variable des LISTDSI Services - Teil 3
392
17 Dateiverarbeitung mit ISPF
Variable name SYSDSSMS
Description Contains information about the type of a data set, provided by DFSMS/MVS. If the SMS DSNTYPE information could not be retrieved, the SYSDSSMS variable contains: SEQ for a sequential data set. PDS for a partitioned data set. PDSE for a partitioned data set extended. If the data set is a PDSE and the SMS DSNTYPE information could be retrieved, the SYSDSSMS variable contains: LIBRARY for an empty PDSE. PROGRAM LIBRARY for a partitioned data set extended program library. DATA LIBRARY for a partitioned data set extended data library. SYSDATACLASS The SMS data class name - returned only if SMSINFO is specified on the LISTDSI statement and the data set is managed by SMS. SYSSTORCLASS The SMS storage class name - returned only if SMSINFO is specified on the LISTDSI statement and the data set is managed by SMS. SYSMGMTCLASS The SMS management class name - returned only if SMSINFO is specified on the LISTDSI statement and the data set is managed by SMS. Tabelle 37 Variable des LISTDSI Services - Teil 4
Wenn bei dem Aufruf von LISTDSI Fehler entdeckt werden, oder wenn besondere Informationen zurückgegeben werden sollen, dann steht in der Variablen SYSREASON ein Reason Code als numerischer Wert. Die folgende Tabelle enthält die Beschreibung zu den einzelnen Reason Codes: Reason Code 1 2 3 4 5 6 7 8 9
Description error parsing LISTDSI statement. dynamic allocation (SVC 99) error. data set type prohibits its being processed. error extracting unit name. data set is not cataloged. error obtaining data set name from VTOC. error finding device type. data set is not on DASD. HSM migrated data set & NORECALL was specified.
Tabelle 38 Reason Codes des LISTDSI Services - Teil 1
17.2 Data Set Query Services
393
Reason Code Description Directory info was asked for but user ID has insufficient, access authority 11 for this data set. VSAM data set. 12 data set OPEN failed. 13 14 device type not found in UCB tables. ABEND occurred. 17 partial data set information obtained. 18 19 multi-volume data set. device type not found in EDT table. 20 21 catalog error prevented LOCATE completion. 22 volume not mounted. 23 I/O error during OBTAIN macro. 24 OBTAIN could not find data set in VTOC. 25 data set migrated off of DASD. 26 data set is on a mass storage device. 27 no volume serial number is allocated for this data set. 28 DD name is invalid, must be 1 to 8 characters. both data set name and filename were omitted on call. 29 30 Data set is not SMS-managed. 31 ISITMGD macro returned with bad return code and reason code. Return code and reason code can be found in message IKJ58431I, which is returned in variable &SYSMSGLVL2. 32 Unable to retrieve SMS information. DFSMS/MVS has incorrect level. 33 Unable to retrieve SMS information. DFSMS/MVS is not active. 34 Unable to retrieve SMS information. OPEN error. 35 Unexpected error from DFSMS/MVS internal service IGWFAM. 36 Unexpected error from the SMS service module. Tabelle 39 Reason Codes des LISTDSI Services - Teil 2
Tipp Da man die Funktion LISTDSI häufig benötigt, habe ich eine kleine REXX Prozedur mit dem Namen DSLSTRC geschrieben, die zu einem Reason Code den entsprechenden Fehlertext zurückgibt. Diese Prozedur befindet sich in den LANZ Utilities.
17.2.5
QBASELIB - Query DSN Information
Funktion Mit QBASELIB kann man innerhalb eines Programms feststellen, welche Dateinamen unter einem DD Namen zugeordnet sind. Das ist in folgenden Fällen sehr hilfreich:
394 • •
17 Dateiverarbeitung mit ISPF
Um in einem Programm, das im Batch läuft und bei dem die Dateien mittels DD Statement in der JCL definiert wurden, die DSNs zu ermitteln. Um den DSN zu einem Member festzustellen, das aus einer Kette von DSNs geladen wurde.
Format ISPEXEC QBASELIB d d - n a m e
[ID(id-var)]
dd-name Ein beliebiger DD Name zu dem die zugeordneten DSNs ermittelt werden sollen. [ID(id-var)] Hier kann der Name einer Variablen angegeben werden, in der nach dem Aufruf von QBASELIB die gefundenen DSNs stehen. Beispiel Das Programm ermittelt die DSNs zu dem eingegebenen DD Namen und gibt sie mit SAY aus. Der zurückgegebene String der DSNs hat die Form 'DSN1','DSN2'. Die Komma- und Hochkommazeichen werden mithilfe der TRANSLATE Funktion in Zeile 10 durch Blanks ersetzt. Dadurch enthält der String die DSNs als Worte. 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15
/ * DOC: REXX QBASELIB ************************************************/ / * DOC: Ermitteln der DSNs zu dem DD Namen ISPLLIB m i t t e l s */ / * DOC: ISPF Command QBASELIB */ /*********************************************************************/ arg ddname address "ISPEXEC" "CONTROL ERRORS RETURN" "QBASELIB "ddname" ID(DSN)" i f r c > 0 then c a l l i s p f _ e r r o r dsn = t r a n s l a t e ( d s n , " " , " ' , " ) /* Entfernen der 1 und , Zeichen */ say "DSNs f ü r den DD-Namen: "ddname do i = 1 to words(dsn) say word(dsn,i) end i exit
Programm 43 QBASELIB: Ermitteln der DSNs zu einem DD Namen
Ich habe das Programm mit der Eingabe SYSEXEC laufen lassen und folgende Ausgabe erhalten: DSNs f ü r den DD-Namen: SYSEXEC PROX.BUCH.CEXEC PROX. LANZ . CEXEC PROX.LOGON.CEXEC Beispiel für die Verwendung von QBASELIB in einem Batch Job Ich habe den folgenden Batch Job erstellt und laufen lassen. Da QBASELIB ein ISPF Service ist, muss hier der Batch Job so gebaut werden, dass innerhalb des REXX Programms auch
17.2 Data Set Query Services
395
ISPF Befehle ausgeführt werden können. Wir haben uns mit dem Thema ISPF in Batch Jobs ja schon ausführlich beschäftigt. 01 //LANZTU JOB (09101999,00000000,46100000),'LANZT ISPFB QBASELIB', 02 // NOTIFY=LANZT,MSGLEVEL=(1,1),MSGCLASS=H, 03 11 COND=(0,LT) ,TIME=NOLIMIT,USER=SQMTP,CLASS=A
04 //************************************************************* 05 II* ISPF AUSFUEHREN FUER: PROX.LANZ.REXX(QBASELIB)
06 //************************************************************* 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
//TSOISPF EXEC PGM=IKJEFT01,DYNAMNBR=99,REGION=OM //STEPLIB DD DISP=SHR,DSN=PROX. LOGON. LOAD // DD DISP=SHR,DSN=DB2P.ALIAS.DSNLOAD // DD DISP=SHR,DSN=SMQP.LOAD IISYSEXEC DD DISP=SHR,DSN=PROX. LANZ. REXX // DD DISP=SHR,DSN=PROX.LANZ.REXX // DD DISP=SHR,DSN=PROX.LOGON.REXX // DD DISP=SHR,DSN=SMQP. USER. CEXEC // DD DISP=SHR,DSN=SMQP. PROD. CEXEC //ISPSLIB DD DISP=SHR,DSN=SQMT.USER.SKEL II DD DISP=SHR,DSN=ISP.SISPSLIB //ISPPROF DD DISP=(,DELETE,DELETE) ,DSN=SSTEMPPROF, // DCB=(RECFM=FB,LRECL=80,BLKSIZE=3120), MUSS 3120! II SPACE=(TRK,(5,5,10),RLSE),UNIT=VIODA //ISPPLIB DD DISP=SHR,DSN=ISP.SISPPENU IIISPTLIB DD DISP=(SHR,PASS),DSN=*.ISPPROF,VOL=REF=*.ISPPROF II DD DISP=SHR,DSN=ISP.SISPTENU //ISPMLIB DD DISP=SHR,DSN=ISP.SISPMENU //ISPLOG DD SYSOUT=* ,DCB= (LRECL=121 ,RECFM=FB) IISYSPRINT DD SYSOUT=* //SYSTSPRT DD SYSOUT=* //SYSUDUMP DD DUMMY //SYSTSIN DD * PROFILE NOPREFIX EXECUTIL SEARCHDD (YES) ISPSTART CMD (%QBASELIB SYSEXEC) ISPSTART CMD (%QBASELIB ISPPROF) ISPSTART CMD (%QBASELIB STEPLIB)
In den Zeilen 32 bis 34 wird jeweils das ISPF gestartet und dabei gleich das REXX Programm QBASELIB mit einem DD Namen als Parameter aufgerufen. Bei der Ausführung des Jobs wurde folgende Liste über SYSTSPRT ausgegeben: READY PROFILE NOPREFIX READY EXECUTIL SEARCHDD(YES) READY ISPSTART CMD (%QBASELIB SYSEXEC) DSNs für den DD-Namen: SYSEXEC PROX.LANZ. REXX PROX.LANZ. REXX PROX. LOGON. REXX SMQP. USER. CEXEC SMQP.PROD.CEXEC READY
396
17 Dateiverarbeitung mit ISPF
ISPSTART CMD (%QBASELIB ISPPROF) DSNs für den DD-Namen: ISPPROF SYS04156.T144232.RA000.LANZTU.TEMPPROF.H04 READY ISPSTART CMD (%QBASELIB STEPLIB) DSNs für den DD-Namen: STEPLIB PROX.LOGON.LOAD DB2P.DD1A.DSNLOAD SMQP. LOAD READY END
17.2.6
QLIBDEF - Query LIBDEF Information
Funktion Mit QLIBDEF wird ermittelt, welche LIBDEF Kette für eine bestimmte ISPF Bibliothek vorhanden ist. Format ISPEXEC QLIBDEF d d - n a m e [TYPE(type-var)] [ID(id-var)] dd-name Hier wird der DD Name der ISPF Bibliothek, die abgefragt werden soll, angegeben. [TYPE(type-var)] t y p e - v a r ist eine Variable, in die der Service QLIBDEF den Definitionstyp der ursprünglichen LIBDEF Anweisung zurückgibt. [ID(id-var)] I D - v a r ist eine Variable, in die der Service QLIBDEF die DSNs der aktiven LIBDEF Anweisung speichert. Beispiel Das Programm fuhrt zunächst eine LIBDEF Anweisung für ISPSLIB (Skeletons) aus. Dann wird mit QLIBDEF die bestehende LIBDEF Kette für ISPSLIB abgefragt und ausgegeben. Danach wird noch die aktuelle Zuordnung für ISPSLIB mittels QBASELIB ermittelt und ebenfalls ausgegeben. 01 02 03 04 05 06 07 08 09 10
/* DOC: REXX QLIBDEF */ /* DOC: Beispiel für die Ausführung von QLIBDEF und QBASELIB zur */ /* DOC: Ermittlung aller DSNs, aus denen Skeletons geholt werden. */ /* (c) LANZT am: 4 Jun 2004 */ /*********************************************************************/ address ISPEXEC "CONTROL ERRORS RETURN" "LIBDEF ISPSLIB DATASET ID('PEVP.SKEL',", "'SMQP.PROD.SKEL',", "'SMQP.TEST.SKEL',">
397
17.2 D a t a S e t Q u e r y S e r v i c e s 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
"'SMQP.USER.SKEL',", " 1 SQMT.DB20.SKEL',", '" SQMT.DYNS.SKEL' "'SQMT.PILOT.SKEL'", "' SQMT . USER. SKEL ') " if rc > 0 then call ispf_error "QLIBDEF ISPSLIB TYPE(DEFTYP) ID(DSNS)" if rc > 0 then call ispf_error dsns = translate(dsns," ",",'") say "LIBDEF ISPSLIB Kette" do i = 1 to words(dsns) say word(dsns,i) end i "QBASELIB ISPSLIB ID(ISPS)" if rc > 0 then call ispf_error isps = translate(isps," ",",'") say say "Standard ISPSLIB Kette" do i = 1 to words(isps) say word(isps,i) end i "LIBDEF ISPSLIB" /* LIBDEF wieder zurücksetzen exit
*/
Programm 44 QLIBDEF: Ausfihrung des QLIBDEF Services
D i e A u s g a b e des P r o g r a m m s (nebeneinander gesetzt): LIBDEF ISPSLIB Kette PEVP.SKEL SMQP.PROD.SKEL SMQP.TEST.SKEL SMQP.USER.SKEL SQMT.DB20.SKEL SQMT . DYNS. SKEL SQMT.PILOT.SKEL SQMT.USER. SKEL
17.2.7
Standard ISPSLIB Kette DBT1.SDSQSLBE DBT1.DT1A.DSNSPFS SYST1.TSO.ISPSLIB ISP.SISPSLIB SYS1.D6TSLIB SYSPT . CAI. CAIISPS CBC. SCBCSKL ISP.SISPSENU
QUERYENQ - ENQs ermitteln
Funktion Mit Q U E R Y E N Q kann m a n feststellen, o b eine bestimmte Datei von irgendwelchen Benutzern gerade festgehalten wird. Format QUERYENQ
TABLE(table-name) QNAME(qname) RNAME(rname) REQ(pattern) WAIT LIMIT(limit) SAVE(list-id) XSYS
398
17 Dateiverarbeitung mit ISPF
table-name Ein frei gewählter Name fiir die ISPF Tabelle, in die dieser Service seine Informationen über die gefundenen ENQs speichert. Diese Tabelle wird dem Benutzer in geöffnetem Zustand zurückgegeben und sie darf vor dem Aufruf von QUERYENQ noch nicht existieren. Der Benutzer muss die Tabelle am Ende seines Programms selbst mit TBEND löschen. qname Hier muss der Name einer Variablen angegeben werden, in die der Benutzer vor dem Aufruf von QUERYENQ den Namen des Query Typs der Ressource gestellt hat, die abgefragt werden soll. Query Typen können sein: SYSDSN, SPFEDIT, SPFUSER usw. Normalerweise besetzt man diese Variable immer mit einem Stern (*). Dadurch werden alle Typen abgefragt. rname Hier muss der Name einer Variablen angegeben werden, in die der Benutzer vor dem Aufruf von QUERYENQ den Namen der Ressource gestellt hat, die abgefragt werden soll. Hier kann auch eine mit einem Sternzeichen endende Maske angegeben werden. pattern Die Beschreibung für diesen Wert ist sehr komplex. Ich verzichte an dieser Stelle darauf und empfehle Ihnen, hier immer die Zeichen %* einzugeben. Schauen Sie sich dazu das folgende Beispiel an. WAIT Wenn Sie diese Option angeben, werden nur die gerade anhängigen ENQ Contentions ausgegeben. Die Angaben in rname und qname haben dann keine Bedeutung. limit Hiermit kann man die Anzahl der Zeilen begrenzen, die von der Funktion zurückgegeben werden. Der Standardwert ist 5000. Die Angabe von Null (0) hebt das Limit auf. list-id Wenn Sie hier einen bis zu acht Stellen langen Namen eines DSN Qualifiers angeben, dann wird die vom QUERYENQ Service ermittelte Tabelle in eine Datei mit folgendem Namen geschrieben: prefix.userid.listid.ENQLIST. XSYS Wenn XSYS angegeben ist, dann wird beim Aufruf des hinter dem QUERYENQ Service stehenden Assembler Makros GQSCAN die Option XSYS=YES gesetzt. Diese Option bewirkt, dass alle verfugbaren LPARs nach der Ressource durchsucht werden, was möglicherweise einen großen Aufwand bedeutet. Wenn Sie sich für diese Option interessieren, dann sehen Sie sich bitte die Beschreibung zum GQSCAN Makro an. Arbeitsweise der Funktion QUERYENQ Die Funktion QUERYENQ erzeugt eine ISPF Table, deren Name durch den Parameter TABLE festgelegt wird. Nach erfolgreichem Aufruf von QUERYENQ befinden sich in der Tabelle Zeilen mit Angaben über die gefundenen ENQs.
17.2 Data Set Query Services
399
Die folgende Tabelle ist ein Auszug aus der englischen Broschüre ISPF Services Guide. Sie enthält die Spaltennamen, die in der zurückgegebenen ISPF Table auftauchen mit den dazugehörigen Beschreibungen: NAME ZENJOB ZENQNAME ZENRNAME ZENDISP ZENHOLD ZENSCOPE ZENSTEP ZENGLOBL ZENSYST ZENRESV
SIZE 8 8 255 5 4 7 7 6 8 7
DESCRIPTION Job or address space name holding or requesting the ENQ. Qname portion of the ENQ. Rname portion of the ENQ. SHARE or EXCLU. OWN or WAIT. SYSTEM or SYSTEMS. STEP or blank. GLOBAL or blank. System name. RESERVE or blank.
Tabelle 40 QUERYENQ: Variablenbeschreibung der ISPF Tabelle
Die Beschreibungen zu den Return Codes, die nach einem Aufruf von QUERYENQ auftreten können, habe ich ebenfalls der oben genannten Broschüre entnommen: RC 0
2 4 8 10
12 14 20
Description Table returned or data set written, but XSYS parameter was not specified and the system is running in STAR mode. The data returned may not reflect all ENQs on all systems. Table returned or data set written. Table returned but truncated due to limit. No ENQs satisfy the request. No ENQs satisfy the request, but XSYS parameter was not specified and the system is running in STAR mode. The data returned may not reflect all ENQs on all systems. Table creation error, parameter or other termination error. See messages for more detail. This includes services not available due to configuration table restrictions. The SAVE data set is in use by another user. Severe error, including TBADD error or data set creation errors.
Hinweis Beachten Sie bitte, dass auch bei einem R C > 0 durchaus brauchbare Ergebnisse zurückgemeldet werden können. Bei der Abfrage des RC müssen Sie immer berücksichtigen, welche der oben genannten Situationen eventuell vorliegen könnten. Beispiel Das folgende Programm untersucht, ob auf einer bestimmten Datei irgendwelche ENQs liegen.
400 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
17 Dateiverarbeitung mit ISPF
/* DOC: QUERYENQ REXX HAPRO /* DOC: Beispiel für das Anzeigen von ENQs mittels QUERYENQ /* DOC: QUERYENQ. /* 15 Apr 2004 /* COPYRIGHT LANZ GMBH, BEMPFLINGEN, GERMANY /* address "ISPEXEC" "CONTROL ERRORS RETURN" "TBEND TABI" marne = "PROX.LOGON.CEXEC" qname = "*" "QUERYENQ TABLE (TABI) RNAME (RNAME) QNAME (QNAME) REQ ( % * ) XSYS" if re > 2 then do say strip(zerrlm) exit end "TBQUERY TABI ROWNUM(RN)" /* Ermittle die Anzahl ROWS der Table */ if re > 4 then do say strip(zerrlm) exit end do i = 1 to rn "TBSKIP TABI" say "ZENQNAME = 'zenqname" 8 aufgetreten ist. Die beiden grau unterlegten Buchstaben in den Variablennamen sind dabei sehr wichtig: S Steht für SHORT. Das heißt in ZERRSM wird eine kurze Fehlermeldung mit 24 Zeichen zurückgegeben. L steht für LONG. Also wird in ZERRLM eine umfangreiche Fehlermeldung mit 512 Zeichen zurückgegeben. Diese Variablen kann man in einem Programm abfragen und entsprechende Maßnahmen zur eigenen Message Ausgabe treffen.
18.1 Fehlerbehandlung im ISPF
403
Hinweis Die Variablen werden immer in der oben genannten Länge ausgegeben. Vor der Benutzung dieser beiden Variablen sollte man also die überflüssigen BLANKS mithilfe der STRIP Funktion entfernen.
18.1.2
Ausgabe von Fehlermeldungen
Die eigenen und die vom ISPF kommenden Fehlermeldungen können auf verschiedene Arten ausgegeben werden: • •
Mit SAY Statements. Mit der ISPF Funktion SETMSG.
1. Fehlermeldungen mit dem SAY Statement ausgeben Die Ausgabe mit SAY Statements hat den Nachteil, dass das gerade in der Anzeige befindliche ISPF Panel komplett vom Bildschirm entfernt wird, um danach die Meldungen) von oben nach unten auszugeben. Dadurch kann man oft nicht mehr sehen, welche Eingabe am Bildschirm den Fehler verursacht hat. Außerdem ist das Ausblenden des ISPF Panels auch lästig. 2. Fehlermeldungen mit SETMSG ausgeben Mit SETMSG kann man Fehlermeldungen und sonstige Informationen so ausgeben, dass diese bei der Anzeige des nächsten Panels erscheinen. Das hat den unschätzbaren Vorteil, dass die Meldung auch dann noch erscheint, wenn das erzeugende Programm (z.B. wegen des aufgetretenen Fehlers) längst beendet wurde.
18.1.3
SETMSG - Set Next Message
Funktion Mit diesem Befehl können generell alle Messages unter ISPF Kontrolle ausgegeben werden. Format SETMSG MSG(msg-id) [COND] msg-id Hier muss die ID einer vom Programmierer definierten Message angegeben werden. Es gibt auch vordefinierte Message IDs, die man für die Ausgabe eigener Messages benutzen kann. Siehe hierzu das Kapitel „Das Standard Message Member ISRZ00" ab Seite 407. COND Dieser Parameter gibt an, dass diese Message nur ausgegeben wird, wenn nicht noch eine frühere SETMSG Ausgabe ansteht.
404
18.1.4
18 Messages - Definition, Rückgabe, Ausgabe
Definition von ISPF Messages
Messages werden in Message Members definiert, die dann zur Ausgabe der Message herangezogen werden. Die Definition von ISPF Messages ist etwas kompliziert. Das hängt damit zusammen, dass einerseits die Messages leicht über den Namen ihrer ID gefunden werden sollen, und andererseits nicht jede Message ein Member bilden sollte. Damit ergibt sich die Notwendigkeit, mehrere Messages in einem Member zusammenzufassen. Um Ihnen einen Eindruck über den Aufbau von Message Members zu vermitteln, habe ich das Member, das die Messages ISRZ000, ISRZ001, ISRZ002 und ISRZ003 definiert, hier eingefügt. BROWSE ISP.SISPMENU(ISRZOO) Line 00000000 Col 001 080 Command ===> Scroll = = > CSR ********************************* Top of Data ********************************** ISRZ000 'SZEDSMSG ' .ALARM = NO .HELP = ISR2MACR NOKANA 'SZEDLMSG' ISRZ001 'SZEDSMSG' .ALARM = YES .HELP = ISR2MACR NOKANA ' SZEDLMSG' 2 ' SZERRSM' .ALARM = SZERRALRM .HELP = &ZERRHM NOKANA ' SZERRLM' ISRZ003 'SZERRSM1 ,A=SZERRALRM ,H=SZERRHM ,T=SZERRTP ,W=SZERRWN NOKANA ' SZERRLM' /* 5645-001, 5655-042 (C) COPYRIGHT IBM CORP 1980, 1996 */ Abbildung 118 Message Ausgabe Member ISRZOO
Wie Sie sehen, können in den Definitionen der Message Zeilen auch Variable benutzt werden. Das sind die Namen, die mit einem &-Zeichen beginnen. Diese Variablen werden vor der Ausgabe der Message durch ihre Inhalte ersetzt. Im REXX Programm sind die Variablen natürlich ohne &-Zeichen anzugeben.
18.1.5
Namenskonvention der ISPF Message IDs
Bei der Ausgabe einer Message wird der Name der Message ID in den Members der Dateien der ISPMLIB Kette gesucht. Dabei stellt sich die Frage: Wie heißt das Member, in dem nach einer Message ID gesucht wird?
Regeln Der Name des Members ergibt sich, indem der Name der M e s s a g e ID nach dem zweiten numerischen Zeichen abgeschnitten wird. Beispiele zeigt die folgende Tabelle: Message ID G015 ISPE241 XYZ123A
Membernamen G01 ISPE24 XYZ12
18.1 Fehlerbehandlung im ISPF
405
Aus dieser Regel folgt auch, dass alle Message IDs immer mit dem Namen des Members, in dem sie definiert sind, beginnen müssen. Zudem muss die Message ID sowie der zugehörige Membername jeweils mindestens zwei numerischen Zeichen enthalten.
18.1.6
Definition der Messages
Das Kapitel über die Definition von Messages füllt in der IBM Broschüre ISPF Dialog Developers's Guide and Reference insgesamt 10 Seiten. Da ich die in diesen Seiten enthaltenen Informationen hier nicht alle darlegen kann, möchte ich Ihnen an Hand eines Beispiels die Message Definition erläutern. Im Message Member CR01 ist folgende Definition enthalCR017B 'Datum falsch' ,ALARM=YES 'Das eingegebene Expiration Date ist nicht in der Form JJJJ/MM/TT' + ' oder die eingegebenen Datumszahlen sind falsch'
Wenn diese Message mit der ID „CR017B" durch den Befehl "ISPEXEC SETMSG MSG(CR017B)"
aufgerufen wird, geschieht Folgendes: Kurze Meldung: Lange Meldung: Tonsignal:
Datum falsch Das eingegebene Expiration Date ist nicht in der Form JJJJ/MM/TT oder die eingegebenen Datumszahlen sind falsch JA
Die Definition einer Message in einem Message Member besteht aus zwei oder mehr Zeilen. Die folgende Aufstellung ist aus der oben genannten Broschüre. Sie beschreibt die generellen Möglichkeiten, die man bei der Definition von Messages hat. Line 1: msgid ['short message'][.HELP=panel|*][.ALARM=YES|NO] [NOKANA | KANA] [. WINDOW=RESP | NORESP | LRESP | LNORESP] [. TYPE=NOTIFY | WARNING | ACTION | CRITICAL] Line 2: 'long message' [+] Additional long message text lines - optional Line 3: ['long message' [+] ] Line 4: ['long message' [+] ] Line n: ['long message' ] Abbildung 119 Definition eines Message Members
Wie Sie sehen, gibt es hier eine Fülle von Optionen, die man nutzen kann, aber nicht muss! Was definitiv notwendig ist, habe ich grau unterlegt.
406
18 Messages - Definition, Rückgabe, Ausgabe
Um zu zeigen, wie man Messages definiert, habe ich ein Beispiel für ein Message Member entworfen, das man hier nachfolgend sieht: /* DOC: MSGS TT00 **********************************************, /* DOC: Beispiel zur Definition von ISPF Messages /* DOC: In der Long Message Definition ist angegeben, wie diese /* DOC: Message ausgegeben wird. /*******************************************************************, TT001 'Message: TT001, Ausgabefarbe: Weiss, Alarmton: NEIN' TT002
,ALARM=YES
'Message: TT002, Ausgabefarbe: Gelb,
Alarmton: JA'
TT003 ,ALARM=YES ,TYPE=ACTION 'Message: TT003, Ausgabefarbe: Rot, Alarmton: JA, 'Fortsetzungszeile eins. ' + 'Fortsetzungszeile zwei. ' + 'Fortsetzungszeile drei. ' TT004 'Kurze Meldung' .ALARM=YES .TYPE=ACTION 'Message: TT004, Ausgabefarbe: Rot, Programm 45 TT00: Message definition
1
+
Alarmton: JA, Kurze Meldung: JA'
member
Ich habe alle Messages jeweils einmal mit dem Befehl "ISPEXEC SETMSG MSG(TTOOx)" ausgegeben. Die Ergebnisse sehen Sie hier: i Message: TT001, Ausgabefarbe: Weiss, Alarmton: NEIN |
Message: TT002, Ausgabefarbe: Gelb,
Alarmton: JA | l
i | Message: TT003, Ausgabefarbe: Rot, Alarmton: JA, Fortsetzungszeile eins.| | Fortsetzungszeile zwei. Fortsetzungszeile drei. | I I
EDIT PROX. BUCH. REXX (MSGTEST) - 01.04 Kurze Meldung Command = = > Scroll ===> CSR ****** ***************************** Top of Data ****************************** 000001 /* DOC: REXX MSGTEST */ 000002 /* DOC: Testen von Messages */ 000003 /* (c) LÄNZT am: 25 May 2004 */ 000004 /*********************************************************************/ 000005 "ISPEXEC CONTROL ERRORS RETURN" 000006 "ISPEXEC SETMSG MSG(TT004)" 000007 exit ****** **************************** Bottom of Data ****************************
Message: TT004, Ausgabefarbe: Rot,
Alarmton: JA, Kurze Meldung: JA
18.1 Fehlerbehandlung im ISPF
407
Nachdem die „Kurze Meldung" ausgegeben worden war, habe ich die PF1 Taste gedrückt. Daraufhin wurde auch die „Lange Meldung" im unteren Bereich des Bildschirms angezeigt. Regeln • •
•
Wenn in der ersten Definitionszeile keine „Kurze Meldung" angegeben ist, wird sofort die „Lange Meldung" aus den Zeilen 2 bis n ausgegeben. Ist eine „Kurze Meldung" definiert, dann wird zunächst nur diese bei der Ausgabe in der obersten Zeile ganz rechts des Bildschirms ausgegeben. Um die „Lange Meldung" sehen zu können, muss dann die PF1 Taste gedrückt werden. Wenn .ALARM=YES gesetzt ist, wird bei der Ausgabe ein Signalton erzeugt.
Hinweis Soll die lange Meldung in einem POP Up Window erscheinen, dann muss dies im ISPF Settings Panel (Auswahl 0 im Primary Option Menü) in der Zeile / Long m e s s a g e i n p o p - u p auch so eingestellt sein. Andernfalls erscheint diese Message in der Message Line, die unmittelbar unterhalb der Command Line liegt, aber nur maximal 80 Zeichen darstellen kann. Andernfalls erscheinen Messages, die kürzer als 80 Zeichen sind in der Message Line, die unmittelbar unterhalb der Command Line liegt. Messages, die länger als 80 Zeichen sind, erscheinen immer in einem POP Up Menü. Tipp Man kann das umrahmte Message Feld mithilfe des Cursors innerhalb der verfugbaren Gesamtbildschirmanzeige verschieben. Dies ist vor allem dann sehr hilfreich, wenn das Message Feld solche Teile des umgebenden Panels, die man sich zusammen mit dem Message Text anschauen möchte, verdeckt. Das Verschieben geht so: Man stellt den Cursor auf eine Stelle der Umrahmung des Message Feldes und drückt dann ENTER. Daraufhin erscheint in der oberen rechten Ecke des Gesamtbildschirms der Text „Window move pending". Wenn man jetzt den Cursor an eine beliebige Stelle verschiebt und ENTER drückt, dann wird das gesamte Message Feld dorthin verschoben. Man kann mit dieser Methode unsichtbare Stellen des umgebenden Panels wieder sichtbar machen.
18.1.7
Das Standard Message Member ISRZ00
Nachdem Sie nun einem Überblick über die Technik der Message Ausgabe im ISPF erhalten haben, zeige ich Ihnen, wie man ganz einfach eigene Messages aus einem REXX Programm heraus ausgeben kann. Um diese Möglichkeit zu vereinfachen, wurde von der IBM dem ISPF ein Standard Message Member mitgegeben. Dieses befindet sich in der zum ISPF System gehörenden Message Library ISP.SISPMENU und heißt ISRZ00. Wenn man sich die Regeln für den Namensaufbau von Messages vergegenwärtigt, werden vermutlich in diesem Member Messages gespeichert sein, die mit ISRZ00 beginnen. Schauen wird uns dieses Member einmal an:
408 BROWSE Command
18 Messages - Definition, Rückgabe, Ausgabe
ISP.SISPMENU(ISRZOO) ==>
Line 00000000 Col 001 080 Scroll = = > CSR Top of Data ********************************** ' .ALARM = NO .HELP = ISR2MACR NOKANA
ISRZOOO &ZEDSMSG ' S ZEDLMSG ISRZ001 & ZEDSMSG' .ALARM = YES .HELP = ISR2MACR NOKANA ' S ZEDLMSG S ZERRSM' .ALARM = &ZERRALRM .HELP = & ZERRHM NOKANA ISRZ002 ' SZERRLM' &ZERRSM' ,A=SZERRALRM H=&ZERRHM . T=&ZERRTP ,W=SZERRWN NOKANA ISRZ003 1 SZERRLM' /* 5645-001, 5655-042 (C) COPYRIGHT IBM CORP 1980, 1996 Abbildung 120 Standard Message Member
*/
ISRZ00
Mithilfe der in diesem Member enthaltenen Message IDs haben Sie die Möglichkeit, beliebige Messages auszugeben. Wie man sieht, sind hier insgesamt vier Message IDs definiert. In allen diesen Message Definitionen sind die auszugebenden Texte als Variable angegeben. Das heißt, dass bei der Ausgabe der Messages die Inhalte dieser Variablen aus dem rufenden Programm übernommen und ausgegeben werden. Man muss nur die Variablen richtig besetzen und kann so die Message seiner Wahl ausgeben. Die Benutzung der Variablen im REXX Programm geschieht natürlich ohne das &-Zeichen. Hinweis Auch hier gilt: Wenn die Variable der „Kurzen Meldung" nicht definiert ist, oder einen Nullstring enthält, wird bei der Ausgabe sofort die „Lange Meldung" ausgegeben. Beschreibung der einzelnen Message IDs ISRZ000 Namen der Variablen: ZEDSMSG und ZEDLMSG. Diese Message ID wird benutzt, wenn man nur einen Hinweis ausgeben möchte. Die Ausgabe der „Langen Meldung" erscheint in weiß. ISRZ001 Namen der Variablen: ZEDSMSG und ZEDLMSG. Diese Message ID wird am häufigsten zur Ausgabe von Fehlermeldungen benutzt. Es wird ein Alarmton ausgegeben und die Message erscheint in gelb. ISRZ002 Namen der Variablen: ZERRSM, ZERRLM, ZERRALRM, ZERRHM. Hiermit können Sie direkt die vom ISPF im Fehlerfall zurückgegebenen Fehlermeldungen ausgeben, da das ISPF die Fehlermeldungen genau in den in dieser Message Defini-
18.1 Fehlerbehandlung im ISPF
409
tion benutzten Variablen zurückgibt. Abhängig vom Inhalt der Variablen ZERRALRM wird ein Signalton ausgegeben. Die Message erscheint in gelb. In der Variablen ZERRHM kann man den Namen eines HELP Panels mitgeben. Dieses Help Panel wird aufgerufen, wenn nach dem Erscheinen der Meldung die PF1 Taste gedrückt wird. ISRZ003 Namen der Variablen: ZERRSM, ZERRLM, ZERRALRM, ZERRHM, ZERRTP, ZERRWN. Hiermit haben Sie die gleichen Möglichkeiten wie mit der ID ISRZ002. Zusätzlich können Sie die Variablen ZERRTP, ZERRWN besetzen. Auf diese beiden Variablen möchte ich hier nicht näher eingehen, denn ich habe in der ISPF Literatur nirgendwo einen brauchbaren Hinweis dazu gefunden. Falls Sie sich dafür interessieren, empfehle ich Ihnen, einige Tests mit diesen Variablen zu machen. Ich habe diese Variablen bisher nicht benötigt. Beispiele aus einem Praxisprogrammen für die Benutzung des Message Members ISRZ00: 1. Beispiel: Ausschnitt aus einem REXX Programm. 14 if sysvar("SYSENV") = "FORE" then do 15 zedlmsg = "ISPF Fehler im Programm >"exname"< RC="rc, 16 "aus Statement:"copies(" ",60) srcline copies(" ",60) 17 if zerrIm "ZERRLM" then, 18 zedlmsg = zedlmsg" ISPF Fehlermeldung:" strip(zerrIm) 19 address "ISPEXEC" "SETMSG MSG(ISRZ001)" 20 end
Zeile 14 Mit dieser Abfrage wird festgelegt, dass die Message nur dann ausgegeben wird, wenn das REXX Programm im FOREGROUND (also online unter ISPF) läuft. Zeilen 15 und 16 Der „private" Text der Message wird in die Variable ZERRLM gestellt. Zeilen 17 und 18 Wenn ZERRLM vom ISPF besetzt wurde, dann wird diese Fehlermeldung an den bereits vorhandenen Message Text angehängt. Zeile 19 Die Message wird ausgegeben und erscheint bei der nächsten Bildschirmanzeige. 2. Beispiel: Ausschnitt aus einem Edit Macro. 67 if sysdsn(dsn) = "OK" then do 68 address "ISPEXEC" "EDIT DATASET("dsn")" 69 if rc > 4 then do 70 address "ISPEXEC" "SETMSG MSG(ISRZ002)"
410
18 Messages - Definition, Rückgabe, Ausgabe
71 "CURSOR = "cl cc 72 exit 73 end 74 end 75 eise do 76 zedsmsg = "Kein DSN" 77 zedlmsg = "Der DSN "dsn" konnte nicht gefunden werden." 78 address "ISPEXEC" "SETMSG MSG(ISRZ001)" 79 end
Zeile 70 Da der ISPF Befehl EDIT im Fehlerfall seine Meldungen in den Variablen ZERRSM und ZERRLM zurückgibt, kann hier die Message IDISRZ002 benutzt werden. Zeile 78 Bei dieser Ausgabe der Fehlermeldungen werden die Variablen ZEDSMSG und ZEDLMSG vorher besetzt. Deshalb wird hier ISRZ001 benutzt. Hinweis Das Programm, aus dem der obige Ausschnitt stammt ist ein Edit Makro. Deshalb müssen die Aufrufe von ISPF Befehlen mit Address "ISPEXEC" erfolgen. Hier kann man die einfache Form durch Voranstellen von ISPEXEC direkt im Befehl nicht benutzen, denn das würde der ISPF Edit Processor nicht akzeptieren. Die Form mit ISPEXEC vor dem ISPF Befehl versteht nur der TSO Command Processor!
18.1.8
Generelle ISPF Error Prozedur
Die im folgenden Quellkode enthaltene Prozedur I S P F E R R O R habe ich schon vor langer Zeit entwickelt. Ich kopiere sie immer in meine REXX Programme als internes Unterprogramm herein. Mit diesem kleinen Unterprogramm steht mir eine Standardroutine zur Verfugung, die ich bei allen ISPF Befehlen im Fehlerfall benutzen kann. Damit Sie die Funktion der Prozedur ISPF ERROR besser verstehen können, habe ich die bei der Entwicklung benutzte Testprozedur auch dargestellt. Der Quellkode des Unterprogramms ispf_error befindet sich unter dem Member Namen ISPERROR in den LANZ Utilities. Siehe hierzu das Kapitel „ISPERROR - ISPF Fehlermeldungen ausgeben" ab Seite 549. 01 /* DOC: REXX ISPFERRT ***********************************************/ 02 /* DOC: Beispiel für die ISPF Error Routine ISPF_ERROR */ 03 /* (c) LANZT am: 20 Jan 1994 */
04 /********************************************************************/ 05 06 07 08 09 10
parse source #sys #type exname #dd #dsn #exec #env #adr #tok "alloc dd(in) dsn(PROX.BUCH.REXX($doc)) shr reuse" "ISPEXEC CONTROL ERRORS RETURN" "ISPEXEC LMINIT DATAID(H) DDNAME (IN) ENQ(SHR)" if rc > 0 then call ispf_error rc exit
11 /********************************************************************/ 12 /* ispf_error 13
*/
/********************************************************************/
14 ispf_error:
411
18.1 Fehlerbehandlung im ISPF 15 16 17 18 19 20 20 21 22
23
arg rc instr = sigl-1 srcline = instr": "strip(sourceline (instr)) if sysvar("SYSENV") = "FORE" then do zedlmsg = "ISPF Fehler im Programm >"exname"< RC="rc, "aus Statement:"copies(" ",60) srcline copies(" ",60) if zerrIm "ZERRLM" then, zedlmsg = zedlmsg" ISPF Fehlermeldung:" strip(zerrlm)
address "ISPEXEC" "SETMSG MSG(ISRZ001)"
24 end 25 else do 26 say exname copies("-",68) 27 say exname "ISPF Fehler: RC="rc" aus Statement:" 28 say exname srcline 29 if zerrlm "ZERRLM" then, 30 say exname "ISPF Fehlermeldung:" strip(zerrlm) 31 say exname copies("-",68) 32 zispfrc = rc
33
address "ISPEXEC" "VPUT (ZISPFRC)"
34 end 35 exit(rc) 36
/*****************************************************************
/
Programm 46ISPFERRT: Test für das Unterprogramm ISPF ERROR
Beschreibung der Fehlerausgabeprozedur I S P F E R R O R : •
Der Befehl "ISPEXEC CONTROL ERRORS RETURN" in Zeile 07 ist hier entscheidend für den erfolgreichen Ablauf bei der Erfassung und Ausgabe der Fehlermeldungen. Er sorgt nämlich dafür, dass das ISPF bei Auftreten eines Fehlers nicht das ganze Programm abbricht, sondern die Fehler zurückmeldet.
•
Die Prozedur ISPF ERROR besteht aus einem Teil, der benutzt wird, wenn das aufrufende Programm online im Foreground abläuft (Zeilen 19 bis 23). Der andere Teil wird durchlaufen, wenn das Programm in einem Batch Job abläuft, denn dort würde die Ausgabe mit SETMSG nichts erbringen (Zeilen 26 bis 33). Dafür muss aber hier der Return Code ZISPFRC richtig gesetzt werden, damit der Step innerhalb des Jobs einen RC>0 ausweist. Beim Aufruf wird der vom ISPF Befehl gesetzte RC übergeben. Dieser wird dann in die Ausgabe der Fehlermeldung übernommen. Die Source Zeile des fehlerhaften ISPF Befehls wird mit SIGL und SOURCELINE ermittelt. In diesem Zusammenhang weise ich darauf hin, dass die Zeile 09 genauso geschrieben werden muss, wie sie da steht. SIGL bezieht sich immer auf Quellkode Zeilen. Deshalb muss der CALL zum Unterprogramm unbedingt in der Folgezeile des fehlerhaften Befehls stehen. Beachten Sie auch das PARSE SOURCE Statement. Dort wird der Name des Hauptprogramms automatisch in die Variable EXNAME gestellt. Das Unterprogramm ISPF ERROR bricht das Hauptprogramm ab. Es macht meiner Meinung nach keinen Sinn, ein Programm fortzusetzen, bei dessen Ablauf ein schwerwiegender ISPF Fehler aufgetreten ist.
•
• •
• •
412
18 Messages - Definition, Rückgabe, Ausgabe
Nachfolgend jetzt die Ausgabe eines Testlaufs. Und zwar einmal als Online Aufruf und einmal als Batch Job: Online erscheint folgende Fehlermeldung: ISPF Fehler im Programm >ISPFERRT< RC=12 aus Statement: 8: "ISPEXEC LMINIT DATAID (H) DDNAME (IN) ENQ(SHR)" ISPF Fehlermeldung: Ddname allocated to member of partitioned data set is not allowed.
Tipp Normalerweise schreibt der Befehl SETMSG den Ausgabetext hintereinander in den Kasten. Es gibt aber einen Trick, mit dem man erreichen kann, dass im Kasten einzelne Zeilen gebildet werden. Dies funktioniert so: Immer, wenn man einen nachfolgenden Text in einer neuen Zeile beginnen lassen möchte, muss man die vorhergehende Zeile mit so vielen Blanks auffüllen, dass 76 Zeichen überschritten werden. Der SETMSG Befehl schneidet dann die über 76 Zeichen hinausreichenden Blanks dieser Zeile ab und beginnt eine neue Zeile immer mit dem nächsten Wort des Ausgabetextes. Diesen Trick habe ich oben angewandt. Siehe hierzu die Zeile 20. Wenn man den Trick anwendet, muss man aber darauf achten, dass die Gesamtlänge des Textes in ZEDLMSG, also einschließlich aller „künstlichen" Blanks, nicht größer als 512 Zeichen wird, sonst fehlt am Ende vielleicht etwas Wichtiges. Beim Aufruf im Batch Job entsteht folgende Liste: ISPFERRT ISPFERRT ISPF Fehler: RC=12 aus Statement: ISPFERRT 8: "ISPEXEC LMINIT DATAID (H) DDNAME (IN) ENQ (SHR) " ISPFERRT ISPF Fehlermeldung: Ddname allocated to member of partitioned data set is not allowed ISPFERRT
Das Unterprogramm ISPF ERROR ist Bestandteil der LANZ Utilities. Sie können es von dort übernehmen und nach Belieben einsetzen.
19
Panels - Erstellen und nutzen
In diesem Kapitel erkläre ich Ihnen, wie Sie einfache ISPF Panels definieren und benutzen. Zur Steuerung von Anwendungen sind Panels wesentlich besser geeignet als einfache Abfragen mittels SAY und PULL. Deshalb sollte man schon die Erstellung und Benutzung von ISPF Panels beherrschen, wenn man im ISPF elegante Anwendungen erstellen will. Wenn jemand schon einmal Online Programme erstellt hat, kennt er sicherlich die etwas mühsame Aufgabe, die dazugehörigen Bildschirmmasken zu erstellen. Das ISPF bietet sehr einfache Methoden und Werkzeuge, um Bildschirmmasken zu erstellen und diese Masken in Programmen zu nutzen. Im ISPF werden Bildschirmmasken durchweg als Panels bezeichnet. Es gibt zwei Wege, um Panels zu erstellen: • •
Mithilfe der Dialog Tag Language (DTL). Mithilfe von Panel Definition Statements.
19.1
Die Dynamic Tag Language (DTL)
Die DTL wurde erst spät dem ISPF hinzugefugt. Damit hat man die Möglichkeit, das Panel in einer Beschreibungssprache zu definieren. Diese Definition wird dann durch das Panel Conversion Utility in einen ausfuhrbaren Code umgewandelt. Die DTL ist in der IBM Broschüre ISPF Dialog Tag Language Guide and Reference beschrieben. Dass es sich hierbei um ein sehr umfangreiches Werkzeug handelt, mögen Sie daran erkennen, dass es dafür eine extra Broschüre gibt. Da die DTL einerseits sehr umfangreich ist und wir andererseits für unsere Zwecke möglichst schnell eine Panel Definition erstellen wollen, werde ich in diesem Buch die DTL weder nutzen noch behandeln. Welche Vorteile die Firma IBM in der DTL sieht, möchte ich Ihnen nicht vorenthalten. Deshalb habe ich hier die entsprechende Passage aus der DTL Broschüre herein kopiert: Why the Dialog Tag Language (DTL)? If you are already familiar with a tag-based markup language, such as IBM Book Master*, you will find that DTL is very similar. We created DTL for many of the same reasons that we created Book Master:
414
19 Panels - Erstellen und nutzen
Markup tags are easy to use. Because tag names are short and relate directly to the structure of the dialog elements, they are also easy to remember. DTL lends flexibility to application development. Panels can be quickly changed without your having to tediously line up text andfields. This gives you greater control over application development and updates. DTL provides consistency when many programmers are working on the same application, or when programmers who are new to your company must update existing applications. Since each programmer is using the same tags, only minor adjustments may be needed to achieve complete uniformity. DTL techniques improve the way in which interactive programs, like ISPF applications, are developed. The language concentrates on the role of the various elements and their interrelationships, and ISPF takes care of their form and appearance at run time. DTL also enforces some formatting rules defined by the Systems Application Architecture* Common User Access (CUA), so you do not have to be familiar with all of the CUA formatting rules. Therefore, the CUA skills required by programmers who are developing CUA-conforming applications are significantly reduced. DTL enables National Language Support (NLS) and the conversion utility provides NLS translations for certain key words. In other words, if you are looking for an application development and system that is sophisticated, flexible, and easy to use, that's DTL.
maintenance
Falls Sie auf Grund der obigen Ausfuhrungen zu dem Schluss kommen, dass die DTL für Sie das richtige Werkzeug ist, um ISPF Panels zu entwickeln, dann können Sie die DTL natürlich benutzen, denn beim Aufruf der Panels gibt es keinen Unterschied zwischen den beiden Entwicklungsmethoden für Panels. Hinweis Da der gesamte Stoff für die Definition von Panels sehr umfangreich ist. Kann ich hier nur versuchen, Ihnen eine praxisorientierte Einführung zu geben, die normalerweise für die Arbeit zur optimalen Nutzung von ISPF mittels REXX Programmierung ausreicht. Sollten Sie umfangreichere Anwendungen für ISPF entwickeln wollen, empfehle ich Ihnen, die oben genannten Broschüren durchzuarbeiten. Ich werde meine Erläuterungen immer mit ausführlichen Beispielen aus der Praxis ergänzen.
19.2 Panel Typen im ISPF
19.2
415
Panel Typen im ISPF
Es gibt drei verschiedene Panel Typen: • • •
Standard Panel. HELP Panel. POP Up Panel.
Standard Panels Standard Panels im ISPF haben normalerweise eine Breite von 80 Stellen und bestehen aus bis zu 43 Zeilen. Wenn sie aufgerufen werden, ersetzen sie das gerade angezeigte Panel vollständig. Help Panels Help Panels werden durch die Anwendung bestimmter Anweisungen in der Panel Definition gebildet. Sie können eine beliebige Anzahl Zeilen enthalten und verfugen über einen eigenen Mechanismus zum Blättern innerhalb des Textes. POP Up Panels Die Abmessungen der POP Up Panels werden bei der Panel Definition bestimmt. Beim Aufruf werden sie in das gerade angezeigte Panel eingebettet. Dadurch bleibt der Rest des darunter liegenden Panels sichtbar. POP Up Panels können während der Anzeige auf dem Bildschirm mithilfe des Cursors verschoben werden.
19.3
Panels definieren
In den folgenden Kapiteln stelle ich Ihnen die wichtigsten Elemente der Panel Definition mithilfe der „Panel Definition Statements" vor. Ich werden dabei nur diejenigen Elemente besprechen, die ich selbst bei meinen Panels Definitionen ständig nutze. Die Panel Definition mithilfe von „Panel Definition Statements" ist in der IBM Broschüre ISPF Dialog Developer'« Guide and Reference beschrieben.
19.3.1
Die Struktur eines Panels
In einer Panel Definition unterscheidet man grundsätzlich drei Elemente: • • •
Die Attributzeichen. Die Textfelder. Die Datenfelder.
416
19 Panels - Erstellen u n d nutzen
1. Die Attributzeichen Attributzeichen belegen i m m e r nur ein Zeichen (Byte). Sie b e s t i m m e n die Charakteristik des dahinter lückenlos anschließenden Feldes. Die Attributzeichen können grundsätzlich aus beliebigen Zeichen bestehen.
Hinweis Ein Zeichen, das als Attributzeichen definiert wurde, darf im gesamten Panel Definitionstext nur als Attributzeichen benutzt werden. Oder anders ausgedrückt: Sobald innerhalb der ) B O D Y Section einer Panel Definition ein unter ) A T T R definiertes Attributzeichen auftaucht, wird es als Attributzeichen benutzt, und zwar u n a b h ä n g i g davon, ob dies gewollt ist oder nicht. W e n n Sie also z.B. innerhalb des im Panel dargestellten Textes einen Doppelpunkt v e r w e n d e n wollen, dürfen Sie diesen keinesfalls als Attributzeichen definieren. Eine Beschreibung zur Definition der Attributzeichen finden Sie unter „Die Attribute Sectio n " ab Seite 418.
2. Die Textfelder Sie enthalten feste Texte, die nicht überschrieben werden können. Textfelder können mithilfe von Attributzeichen farblich gestaltet werden.
3. Die Datenfelder Es gibt zwei Arten von Datenfeldern: •
Eingabe Felder: In diese Felder können bei der Verarbeitung des Panels Daten eingegeben werden. Eingabefelder können auch zur A u s g a b e benutzt werden.
•
A u s g a b e Felder: Hier können Daten ausgegeben werden. A u s g a b e f e l d e r können nicht auch zur Eingabe benutzt w e r d e n . D i e Art des Datenfeldes wird durch das Attributzeichen festgelegt.
19.3.2
Erstellung von Panels und deren Aufruf
ISPF Panels werden normalerweise mit d e m ISPF Editor erstellt. Dabei m u s s unbedingt darauf geachtet werden, dass bei den Edit Sitzungen zur Erstellung von ISPF Panels N U M B E R O F F gesetzt ist. W e n n eine Panel Definition rechts Z e i l e n n u m m e r n enthält, endet der Versuch, dieses Panel anzeigen zu lassen, mit einem Fehler. Panels werden so ausgeführt, w i e sie erstellt wurden. Ein C o m p i l e r V o r g a n g oder eine sonstige Konvertierung ist nicht notwendig. (Außer bei D T L Panels. A b e r diese wollen wir hier nicht besprechen). ISPF Panels müssen in einem P D S / P D S E erstellt werden, der bei der A u s f u h r u n g unter d e m D D - N a m e n ISPPLIB zugeordnet sein muss. Panels können mit den ISPF Services S E L E C T , D I S P L A Y oder T B D I S P L a u f g e r u f e n werden. Bei einem A u f r u f mittels T B D I S P L m u s s das Panel eine ) M O D E L Sektion enthalten.
417
19.3 Panels definieren ISPF Panels sollten die folgende Grundstruktur aufweisen: 1. Zeile: Panel ID, Title, Short Message Area 2. Zeile: A command/option field and Scroll Definition 1 1 Panel ID I 1
1 Command/Option 1
Title
i | Short Message i l | Scroll i
i | 1 | i
Die übrigen Zeilen können beliebig gestaltet werden. Die ISPF Short Messages werden immer am Ende der ersten Zeile von rechts nach links in ihrer aktuellen Länge angezeigt. Bei Bedarf werden dabei Teile vom TITLE rechts abgeschnitten. Long Messages werden, wenn dies im „ISPF Settings Menü" so definiert ist, immer am unteren Rand des Panels in einem Rahmen angezeigt. Die Definition der Panel Struktur erfolgt in der )BODY Sektion.
19.3.3
Die Panel Definition Sections
Eine Panel Definition besteht aus mehreren Abteilungen, den „Sections". Jede dieser Sektionen ist für einen ganz bestimmten Zweck bestimmt. In der folgenden Tabelle habe ich diejenigen Sektionen aufgeführt, die wir in diesem Buch behandeln wollen. Jede Sektion beginnt auf Spalte eins mit einem )-Zeichen, das von einem Schlüsselwort, das die Art der Sektion benennt, gefolgt wird. Section )ATTR
Beschreibung Attribute Sektion. Darin werden die Attribute Character der Felder des Panels definiert. )BODY Body Section. Definition des Panel Layouts. )MODEL Model Sektion. Definiert die Struktur für die Darstellung einer ISPF Tabelle in diesem Panel. )INIT Initialization Section. Diese Sektion wird durchlaufen, bevor das Panel ausgegeben wird. Hier können Anfangswerte festgelegt werden. )REINIT Relnit Section. Diese Sektion wird durchlaufen, wenn das Panel wiederholt ausgegeben wird. )PROC Procedure Section. Diese Sektion wird durchlaufen, wenn durch eine Eingabe die Panel Anzeige verlassen wird. Hier wird die Verarbeitung der Eingabewerte durchgeführt. Typischerweise werden hier Plausibilitätsprüfungen der Eingabewerte vorgenommen. )END End Sektion. Damit wird die Panel Definition beendet. Alle Daten, die hinter dieser Anweisung stehen, werden ignoriert. Tabelle 41 Panel Sections
418
19 Panels - Erstellen und nutzen
1. Die Attribute Section Die )ATTR Zeile ist normalerweise die erste Zeile einer Panel Definition. Sie ist aber nicht immer notwendig. Dies ist dann der Fall, wenn die Standard Attributzeichen für diese Panel Definition ausreichen. Die Standard Attributzeichen sind wie folgt festgelegt: % TYPE(TEXT) + TYPE(TEXT) TYPE(INPUT)
INTENS(HIGH) INTENS(LOW) INTENS(HIGH)
Man kann diese Standard Attributzeichen durch andere Zeichen ersetzen, indem man in der )ATTR Zeile die Option DEFAULT(xyz) benutzt. Beispiel )ATTR DEFAULT(?$§) Bei Benutzung dieser Anweisung gelten in dieser Panel Definition die folgenden Festlegungen fur die Standard Attributzeichen: ? TYPE(TEXT) $ TYPE(TEXT) § TYPE(INPUT)
INTENS(HIGH) INTENS(LOW) INTENS(HIGH)
Diese Standard Attributzeichen können aber auch in der )ATTR Section beliebig neu und ganz anders definiert werden. Die folgende Panel Definition zeigt dies: 01 02 03 04 05 06 07 08 09 10 11 12 13 14 is 16 17 18 19 20 21 22
)ATTR /* DOC: PANEL SKAT ***********************************************/ /* DOC: Gingabepanel für die Daten des Skatturniers */ /* (c) LANZT Erstellt: 12 Mar 2003 */ /*********************************************************************/ type(text) intens(low) skip(on) color(green) ß type(text) intens(low) skip(on) color(blue) # type(input) intens(high) caps(on) color(white) )BODY EXPAND(!!) ß!-! Eingabe der Skat Turnier Werte !-! + ßName - name + ß Punktetpunkte 't+ )INIT )REINIT )PROC 4prc = 0 if (.resp = END) &prc = 1 )END
Programm 47 SKAT: Panel Definition
419
19.3 Panels definieren
In der Zeile 06 wird das Standard Attributzeichen + neu definiert. Damit wird der vorherige Inhalt überschrieben. Ich habe hier alle in der Paneldefinition auftauchenden Attributzeichen grau unterlegt. Wenn man das Panel aufruft, erscheint folgende Anzeige: Eingabe der Skat Turnier Werte Name Punkte
Die folgende Tabelle stammt aus der IBM Broschüre ISPF Dialog Developer's Guide and Reference. Sie enthält die möglichen Definitionen fiir die Attributzeichen. Die für den täglichen Gebrauch wichtigsten habe ich grau unterlegt. Ich verzichte hier auf eine vollständige Beschreibung aller Optionen. Diese belegen in der oben genannten Broschüre ca. 30 Seiten. Ich empfehle Ihnen bei Bedarf dort nachzulesen. ATTRCHAR [ AREA (DYNAMIC) [EXTENT) (ON | OFF) ] [SCROLL (ON | OFF) ] [USERMOD(usermod-code)] [DATAMOD(datamod-code)] [AREA (GRAPHIC) [EXTEND (ON | OFF) ] ] [AREA (SCRL) [EXTEND (ON | OFF) ] ] [ATTN (ON | OFF) ] [CAPS(ON|OFF|IN|OUT] [CKBOX(ON|OFF)] [COLOR(value)] [CSRGRP (x) ] [COMBO(ON|OFF|name)] [CUADYN(value)] [DDLIST(ON|OFF|name)] [DEPTH (d) ] [FORMAT (EBCDIC | DBCS | MIX) ] [HILITE(value)] [GE (ON | OFF) ] [ INTENS (HIGH | LOW | NON) ] [JUST (LEFT j RIGHT | ASIS) ] [LISTBOX(ON|OFF|name)] [NOJUMP (ON | OFF) ] [NUMERIC(ON|OFF)] [OUTLINE ( [L] [R] [0] [U] | BOX | NONE) ] [PAD(char|NULLS|USER)] [PADC(char|NULLS|USER)] [PAS (ON | OFF)] [RADIO (ON | OFF) ] [REP (char) ] [SKIP(ON|OFF)] [TYPE(value)] [UNAVAIL(ON|OFF)] [WIDTH (w) ] Abbildung 121 Panel Attribute Character Definitions
420
19 Panels - Erstellen und nutzen
2. Die )BODY Section In der )BODY Sektion wird das Aussehen des Panels festgelegt. So wie man das Panel in der )BODY Sektion gestaltet, erscheint es nachher in der Anzeige. Man hat hier also einen gewissen WYSIWYG Effekt. Format ) BODY [KANA] [WINDOW(width,depth)] [CUD(field name)] [SMSG(field name)] [LMSG(field name)] [ASIS] [WIDTH(width)] [EXPAND(xy) ] [DEFAULT(defldef2def3)] [FORMAT (EBCDIC|DBCS|MIX) ] [OUTLINE ( [L] [R] [0] [U] | BOX |NONE) ] Abbildung 122 Panel)BODYSection
Definitions
Alle Angaben müssen in der )BODY Zeile stehen. Die grau unterlegten Optionen werden häufig benutzt. Diese werde ich hier erläutern. )BODY WINDOW
(50,20)
Mit dieser Anweisung wird ein POP Up Panel definiert, das 50 Spalten breit und 20 Zeilen hoch ist. Dabei muss unbedingt darauf geachtet werden, dass die in der )BODY Sektion definierten Spalten und Zeilen in den verfugbaren Rahmen passen. )BODY EXPAND
(!!)
Mit dieser Anweisung werden die Expandierungszeichen festgelegt. Mithilfe dieser Zeichen kann man Zeilen dynamisch mit Füllzeichen auffüllen lassen. Diesen Effekt kann man am SKAT Panel weiter oben sehen. Diese Definition steht dort in der Programmzeile 10. Hinweis Die Expansionszeichen müssen (genau wie die Attributzeichen) innerhalb der Panel Definition eindeutig sein. Man darf diese Zeichen also nur zur Definition von dynamischen Expansionen benutzen. 3. Die )INIT Sektion In der )INIT Sektion können alle Maßnahmen getroffen werden, die vor der Ausgabe des Panels notwendig sind. Solche Maßnahmen können sein: • •
Vorbelegung von Variablen mit Anfangswerten. Definition der Z Variablen mittels .ZVARS Anweisung.
421
19.3 Panels definieren • •
Festlegen der Cursor Position bei der erstmaligen Anzeige des Panels. Festlegen des Help Panels. Dieses Panel wird angezeigt, wenn die PF1 Taste gedrückt wird.
Beispiel ) INIT Äzcmd .zvars
= ' 1 = 1(fchars recfm dirblk lrecl blksize + prim sec units dsntp)1 .Cursor — newdsn .csrpos = 2 .help = CRPANT1 if (Sunits = TRACK) Sunits = TRACKS if (&units = CYLINDER) Sunits = CYLINDERS )REINIT In der .ZVARS Definition kann man sehen, wie bei Panel Definitionen Fortsetzungszeilen gebildet werden. 4. Die )PROC Section Die )PROC Sektion wird durchlaufen, wenn durch Drücken der ENTER oder einer PF Taste die Eingabe beendet wird. In der )PROC Sektion werden normalerweise Plausibilitätsprüfungen und eine gewisse Verarbeitung der Eingaben durchgeführt. Zu diesen Zwecken steht eine Reihe von Statements zur Verfügung, die genau auf diese Aufgaben zugeschnitten sind. In der Praxis werden vor allem folgende Anweisungstypen benutzt: variable = wert IF und ELSE VER VGET / VPUT
Zuweisung logische Abfrage Verify Schreiben und Lesen von ISPF Variablen
Bei Zuweisungen werden zur Ermittlung des Ergebnisses häufig folgende Funktionen eingesetzt: TRUNC TRANS PFK
-> abschneiden und Rest bilden übersetzen Funktionstasten
IF und ELSE: Da es hier kein THEN gibt, muss es eine anderweitige Regel geben, welche Befehle bei einem erfüllten IF ausgeführt werden. Diese Regel ist ganz einfach:
422
19 Panels - Erstellen und nutzen
Regel Wenn ein IF als erfüllt erkannt wird, dann werden alle Anweisungen ausgeführt, die hinter diesem IF mindestens um eine Spalte eingerückt stehen. Auch hier würde es den Umfang dieses Buches sprengen, die oben genannten Anweisungen und Funktionen ausführlich zu besprechen. Deshalb begnüge ich mich damit, hier ein etwas umfangreicheres Beispiel einer )PROC Sektion aus der Praxis zu zeigen. Ich werde nach den Definitionen zu den interessantesten Zeilen eine Erklärung anfügen: Das Panel CRPANP1 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17
30 31 32 33 34 35 36 37 38 39 40
)ATTR DEFAULT($+_) /*****************. /* DOC PANEL CRPANP1 ********************************** /* DOC Panel fuer die Funktion CR /* DOC Anlegen, kopieren und reorganisieren von Dateien /* DOC Autor: Franz Lanz, August 1994 /*************************************************** /********************* (C) COPYRIGHT LANZ GMBH 1994 + type(text) intens(low) color(blue) skip(on) § type(text) intens(low) color(red) skip(on) $ type(text) intens(high) color(white) skip(on) # type(output) caps(off) color(white) skip(on) ? Type(input) caps(on) intens(high) )BODY EXPAND(ßß) $ß-ß+Dataset Manager under ISPF / LANZ GmbH $ß-ß $ COMMAND ==>_ZCMD ß ß § Modell =#olddsn Neuer =?newdsn FUNKT =?z $< NO, YO, YB, RO, RB, CO, CB. ...+(siehe Help mit PF1) RECFM =?z + Reference Date =#zdsrdate -I- Creation Date =#zdscdate + Creator =#creator DIR =?z Blocks / Track =#blkstrk + LRECL =?z + DSORG =#zdldsorg +Anzahl Members =#members +Used Dir. Blks =#udirblk BLKSIZE =?z + Alloc. Dir. Blks =#adirblk + Space Used =#used PRIM =?z + Extents all/used =#extents + Unit Type =#unit SEC =?z +Allocated Trk/Cyl =#csize +Compressed =#zdsseq UNITS =?z + Datenmenge =#kbused DSNTYPE =?z +Trks fuer Dir =#dirtrk+44 Directory Blocks/Track VOLSER =?vol #vols +STORCLAS =?storclas+ DATACLAS =?dataclas+ MGMTCLAS =?mgmtclas + SMS =?sms+ $ YES+= SMS benutzen,$NO+= SMS nicht benutzen +Exp.Date =?zdsxdate $perm+oder$JJJJ/MM/TT+ Blank bewirkt ***NONE*** + + MSGl=#msglvll + MSG2=#msglvl2 + REASON—#reo #rctext + ENQs=#enqs $ ß-ß §Rote Felder sind Eingabefelder $ß-ß )INIT Szcmd = .zvars = '(fchars reefm dirblk lrecl blksize + prim sec units dsntp)' .cursor = newdsn .csrpos = .help = CRPANT1 if (&units = TRACK) Sunits = TRACKS if (&units = CYLINDER)
19.3 Panels definieren 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 00 01
423
(units = CYLINDERS )REINIT i f (.msg A = Sz) .attr(.cursor)='HILITE(REVERSE)' Spanrc = 1 .csrpos = 1 ) PROC i f ( S l r c > 0) . r e s p = END /* E x i t , wenn I r e b e r e i t s i n REXX CR g e s e t z t wurde * / i f ( . r e s p = ENTER) ver(Snewdsn,nb,dsname,msg=CR011A) ver(Sfchars,nb,list,NO,YO,YB,RO,RB,CO,CB,EX,msg=CR010A) Sfcharl = trunc(&fchars,1) &fchar2 = . t r a i l i f ( S f c h a r l A = C) ver(Srecfm,nb,list,U,F,FB,FA,FBA,FBM,VS,VB,VA,VBA,VBM,msg=CR012A) ver(Sdirblk,nb,range,0,10000,msg=CR015A) ver(Slrecl,nb,range,0,32767,msg=CR013A) ver(Sblksize,nb,range,20,32760,msg=CR014A) S u n i t s = t r a n s ( t r u n c ( S u n i t s , 1 ) T,TRACKS C,CYLINDERS B,BLOCK msg=CR018A Sdsntp = t r a n s ( t r u n c ( S d s n t p , l ) P,PDS L,LIBRARY V,VSAM S,SEQ msg=CR010B) v e r (&sms,nb,list,YES,NO,msg=CR014B) i f (Sunits = TRACKS) ver(Sprim,nb,range,1,65535,msg=CR016A) ver(Ssec,nb,range,0,65535,msg=CR017A) i f (Sunits = CYLINDERS) ver(Sprim,nb,range,1,4369,msg=CR016X) ver(Ssec,nb,range,0,4369,msg=CR017X) i f (Sfchars = EX) ver(Szdsxdate,stddate,msg=CR017B) else i f ( v e r ( S z d s x d a t e , s t d d a t e ) or ver(Szdsxdate,list,' ',***PERM***,***NONE***,NONE,PERM)) else .msg = CR013B i f ( S f c h a r l = R) i f (Senqs A = ' ' ) .msg = CR016B else i f (Solddsn = Snewdsn) .msg = CR019A i f ( S f c h a r l = C) i f (Solddsn = snewdsn) .msg = CR015B i f (Szdsxdate = 'PERM') Szdsxdate = '1999/12/31' i f (Szdsxdate = 'NONE') Szdsxdate = ' ' Spanrc = 0 i f ( . r e s p — END) Spanrc - 1 ) END
Programm 48 CRPAN1: Panel für die CR Funktion der LANZ Utilities
424
19 Panels - Erstellen und nutzen
Erläuterungen zu den Anweisungen in der )PROC Sektion: Zeilen 56 und57 Wenn in der aufrufenden Prozedur CR die Variable LRC auf größer Null gesetzt war, dann wird hier die Spezialvariable .RESP mit dem Text END gefüllt. Dies fuhrt dazu, dass am Ende in Zeile 99 auch die Variable PANRC auf 1 gesetzt wird. Wenn nach der Rückkehr aus dem Panel die Variable PANRC 1 ist, wird die Prozedur CR verlassen. Zeile 58 Wenn die Spezialvariable .RESP den Text ENTER enthält, werden die nachfolgenden Anweisungen ausgeführt. Ansonsten geht es direkt zur Zeile 99. Zeile 59 Es wird die Variable NEWDSN verifiziert. NB heißt, NEWDSN darf nicht Blank sein. DSNAME heißt, dass die Variable einen gültigen DSN enthalten muss. Ist eine dieser Bedingungen nicht erfüllt, dann wird die Message CR011A ausgegeben. Zeile 60 Es wird die Variable FCHARS verifiziert. FCHARS steht für Function Characters. NB heißt, FCHARS darf nicht Blank sein. LIST heißt, dass die Variable nur Werte aus den nach der LIST Option stehenden und durch Kommata getrennten Texten enthalten darf. Ist eine dieser Bedingungen nicht erfüllt, dann wird die Message CR010A ausgegeben. Zeile 62 In der Variablen FCHARS stehen immer zwei Zeichen. Daraus wird jetzt mithilfe der Funktion TRUNC das erste Zeichen in die Variable FCHAR1 extrahiert. Zeile 63 Nach der Anwendung der Funktion TRUNC steht in der Spezialvariablen .TRAIL immer der übrig gebliebene Rest. In diesem Fall steht dort immer der zweite Buchstabe aus der Variablen FCHARS. Dieser wird jetzt der Variablen FCHAR2 zugewiesen. Zeile 65 Wenn in der VER Funktion die Option RANGE angegeben ist, dann muss der eingegebene Wert numerisch sein und innerhalb der angegebenen Grenzen liegen. Zeile 68 Hier werden die Funktionen TRANS und TRUNC gemeinsam verwendet. Dies hat folgenden Sinn: Mit TRUNC wird das erste Zeichen der Variablen UNITS extrahiert. Dann wird mit TRANS das hinter dem Komma stehende Wort in die Variable UNITS gesetzt. Wenn der Inhalt der Variablen UNITS mit keinem der in der Liste angegebenen Buchstaben beginnt, wird die Message CR018A ausgegeben. Der Vorteil dieses Verfahrens liegt darin, dass man bei der Eingabe immer nur den ersten Buchstaben von CYLINDERS, TRACKS oder BLOCK eingeben muss.
19.3 Panels definieren
425
Zeilen 72 bis 74 Hier erfolgt die Plausibilitätsprüfung für die Anzahl der TRACKS der anzulegenden Datei. Wie bereits weiter oben in diesem Buch erwähnt, kann im MVS eine Datei nicht größer als 65535 Tracks sein. Während beim Primary Space mindestens 1 Track angegeben werden muss, kann der Secondary Space auch mit 0 Tracks definiert werden. In diesem Fall können keine weiteren Extents zu dieser Datei erzeugt werden. Zeilen 75 bis 77 Werden bei der Eingabe CYLINDERS eingegeben, dann läuft hier sinngemäß die gleiche Logik ab, wie bei der Eingabe von TRACKS. 4369 CYLINDERS entsprechen 65535 TRACKS. Zeilen 78 und 79 Bei Aufruf der Funktion EX wird nur das Expiration Date der Datei geändert. Deshalb wird hier mittels der VER Option STDDATE geprüft, ob das in der Variablen ZDSXDATE stehende Datum korrekt ist. Zeilen 99 und 100 Wenn bei der Anzeige des Panels ein END oder RETURN Befehl (PF3 oder PF4) eingegeben wird, dann wird die Spezialvariable .RESP mit dem Text END gefüllt. Hier wird dann in der Zeile 100 die Variable PANRC auf 1 gesetzt. Diese Variable wird in der rufenden REXX Prozedur CR nach der Rückkehr aus dem Panel abgefragt. Wenn sie auf 1 steht, wird die Prozedur verlassen.
19.3.4
Variablen in der Panel Definition
Hinter jedem Attributzeichen für ein Ein- oder Ausgabefeld muss eine Variable benannt werden. Der Variablenname kann aus bis zu acht alphanumerischen Zeichen bestehen. Überall dort in der Panel Definition, wo nur ein Variablenname stehen kann, muss kein &-Zeichen dem Variablennamen vorangestellt werden. Z.B. in der .ZVARS Anweisung. Regel Alle Variablen aus der Panel Definition und aus der das Panel aufrufenden REXX Prozedur sind wechselweise bekannt. Falls man Variable in der REXX Prozedur definiert, die später auch in Panels benutzt werden sollen, dann muss man unbedingt darauf achten, dass die Namen dieser Variablen nicht länger als ACHT Zeichen sind. Die Z-Variablen Wenn ein Datenfeld kürzer ist als der zugehörige Variablenname, dann kann man den Variablennamen nicht unmittelbar an der Stelle hinschreiben, an der die Daten im Panel erscheinen. Um diesem Handicap abzuhelfen, wurden die so genannten Z-Variablen eingeführt. Das funktioniert dann so: Immer, wenn hinter einem Attributzeichen für ein Ein- oder Ausgabe-
426
19 Panels - Erstellen und nutzen
feld nur ein Z steht, wird die zugehörige Variable in der . Z V A R S Zuweisung der Z Variablen den eigentlichen Variablennamen zugeordnet. Dabei werden die Z Variablen im Panel von oben nach unten und in den Zeilen von links nach rechts den entsprechenden Variablen im Zuweisungsstatement zugeordnet. Beispiel 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
)BODY EXPAND(ßß) $&-ß+Dataset Manager under ISPF / LANZ GmbH $ß-ß $ COMMAND ===>_ZCMD ß ß § + Modell =#olddsn + Neuer =?newdsn + + FUNKT =?z $< NO, YO, YB, RO, RB, CO, CB....+(siehe Help mit PF1) + RECEM =?z + Reference Date =#zdsrdate + Creation Date =#zdscda + DIR =?z + Blocks / Track =#blkstrk + Creator =#creato + LRECL =?z + DSORG =#zdldsorg +Anzahl Members =#member + BLKSIZE =?z + Alloc. Dir. Blks =#adirblk +Used Dir. Blks =#udirbl + PRIM =?z + Extents all/used =#extents + Space Used =#used + SEC =?z +Allocated Trk/Cyl =#csize + Unit Type =#unit + Datenmenge =#kbused +Compressed =#zdsseq + UNITS =?z + DSNTYPE =?z +Trks fuer Dir =#dirtrk+44 Directory Blocks/Track + VOLSER =?vol #vols +STORCLAS =?storclas+ DATACLAS =?dataclas+ MGMTCLAS =?mgmtcl + SMS =?sms+ $ YES+= SMS benutzen,$NO+= SMS nicht benutzen +Exp.Date =?zdsxdate $perm+oder$JJJJ/MM/TT+ Blank bewirkt ***NONE*** + + MSGl=#msglvl1 + MSG2=#msglvl2 + REASON=#rco #rctext + ENQs=#enqs $ ß-ß §Rote Felder sind Eingabefelder $ß-ß )INIT Szcmd = 1 ' .zvars = '(fchars recfm dirblk lrecl blksize + prim sec units dsntp)' . cursor = newdsn .csrpos = 2 .help = CRPANT1 if (&units = TRACK) &units = TRACKS if (iunits = CYLINDER) &units = CYLINDERS )REINIT
In d i e s e m Fall gibt es in jeder Zeile nur eine Z Variable. D i e Z Variablen werden in der R e i h e n f o l g e ihres Auftretens den in der . Z V A R S A n w e i s u n g stehenden Variablen zug e w i e s e n . W i e man an d i e s e m Beispiel sieht, kann man auch solche Variablen über die Z Variablen adressieren, deren N a m e für eine direkte Platzierung nicht zu lang wäre (z.B. PRIM, SEC, U N I T S ) . Hinweis D i e . Z V A R S A n w e i s u n g muss in der )INIT Sektion stehen. Wenn man während der Entwicklung des Panels in eine bestehende ) B O D Y Struktur weitere Z Variable einfügt oder
427
19.3 Panels definieren
entfernt, muss man unbedingt die .ZVARS Anweisung anpassen. Dabei muss auf die richtige Reihenfolge geachtet werden.
19.3.5
Panel Verarbeitung
Zum Aufruf von Panels stehen im ISPF mehrere Services zur Verfügung: • • •
Der DISPLAY Service. Der SELECT Service. Der TBDISPL Service.
Der DISPLAY Service Mit dem DISPLAY Service kann ein Panel aufgerufen werden. Es können zwar einige Option angegeben werden. Diese sind aber in der Praxis kaum von Bedeutung. 1. Beispiel: Aufruf eines Standard Panels. 2 4 6
/********************************************************************/
247 /* Schleife fuer Hauptverarbeitung: 248 /* Panel ausgeben und einlesen 249 /* Verarbeitung durchfuehren
*/ */ */
250 /********************************************************************/ 251 do ipanel = 1 252 panrc = 0 /* Panel return code for exit control */ 253 Ire = 0 /* Ausgang nur mit PF3 im Panel CRPANP1 */ 254 "DISPLAY PANEL(CRPANP1)" 255 if re > 8 then do 256 zedlmsg = left("Fehler bei Aufruf von Panel CRPANP1-3,", 257 "RC="RC,80) 258 if zerrlm "ZERRLM" then zedlmsg = zedlmsg zerrlm 259 "SETMSG MSG(ISRZ001)" 260 exit 261 end 262 if panrc = 1 then leave ipanel 374 end ipanel 375 EXIT
Das Beispiel zeigt diejenigen Teile aus der Prozedur CR, die sich mit dem Aufruf des Panels CRPANP1 befassen. Es ist auch die Steuerung zu sehen, mit deren Hilfe bei Drücken der PF3 Taste die Verarbeitung mithilfe der Variablen PANRC beendet wird. 2. Beispiel: Aufrufeines POP UP Panels. Wenn beim Kopieren von Dateien mithilfe der Funktion CR Datensätze abgeschnitten würden, wird durch ein POP UP Panel eine Warnung ausgegeben und der Bediener kann das Abschneiden bestätigen und fortfahren, oder die Verarbeitung wird abgebrochen. Hier zunächst der Aufruf des POP Up Panels in der Prozedur CR: 326 327 328
if fchar2 = "0" then do if lrecl < syslrecl then do oldrecl = syslrecl /* Diese werden in
*/
428
19 Panels - Erstellen und nutzen 329 330 331 332 333 334 335 336 337 338 339 340
newrecl = lrecl /* CRPANP2 benötigt */ "ADDPOP" "DISPLAY PANEL (CRPANP2) " "REMPOP" if comkz "J" then do zedlmsg = "Sie haben das Abschneiden der Datensätze", "nicht bestätigt. Es wurde nichts kopiert!" "SETMSG MSG(ISRZ001)" iterate ipanel end end end
Programm 49 Beispiel für den Aufruf eines POP Up Panels
Hier jetzt die Anzeige des POP Up Panels innerhalb des Panels CRPANP1: Dataset Manager under ISPF / LANZ GmbH LPRT
CR / Abfrage bei Zxel-LRECL zu klein
Quelle DSN: 'SMQP.TEST.PANEL' LRECL: 80 Ziel
DSN: ' SMQP.XXXX. PANEL' LRECL: 70
Die LRECL der Ziel-Datei ist kleiner als die LRECL der Quell-Datei. Beim Kopieren würden die Datensätze abgeschnitten.
PF1) 003/05/27 V185 % 390 O ack
Wollen Sie den Kopiervorgang fortsetzen? N (J/N) PFK 3 / END oder Enter ohne J bewirkt Abbruch MSG2= REASON= ENQs= Rote Felder sind Eingabefelder L_
Man kann ein POP Up Panel mithilfe des Cursors innerhalb der verfugbaren Gesamtbildschirmanzeige verschieben. Das geht so: Man stellt den Cursor auf eine Stelle der Umrahmung des POP Up Panels und drückt dann ENTER. Daraufhin erscheint in der oberen rechten Ecke des Gesamtbildschirms der Text „Window move pending". Wenn man jetzt den Cursor an eine beliebige Stelle verschiebt und ENTER drückt, dann wird das gesamte POP Up Panel dorthin verschoben. Man kann mit dieser Methode eventuell unsichtbare Stellen des umgebenden Panels sichtbar machen.
429
19.3 Panels definieren Der SELECT Service Regeln
Mit dem SELECT Service können nur so genannte „Selection Panels" aufgerufen werden. Selection Panels enthalten Selections für weitere Aufrufe von Panels, Programmen und Prozeduren. Mit dieser Methode werden normalerweise Anwendungen gestartet und betrieben, wie z.B. das SDSF. Beim Aufruf von Panels mithilfe des SELECT Service stehen mehrere Optionen zur Verfugung, die beim Aufruf von normalen Panels nicht vorhanden sind. Es kann z.B. mit NEWAPPL(name) eine neue APPLID benannt werden und es kann mit SCRNAME (name) ein Screen Name benannt werden. Der Screen Name erscheint dann beim Aufruf von SWAP LIST in der Zeile derjenigen ISPF Ebene, in der dieses Auswahlpanel aktiviert wurde. Der TBDISPL Service Mit dem TBDISPL Service wird nicht nur das betreffende Panel aufgerufen, sondern es wird auch noch die zugrunde liegende ISPF Table angezeigt. Siehe hierzu das Kapitel „Befehle der Table Services" ab Seite 441 sowie das Kapitel „Table Display Panels" ab Seite 430.
19.3.6
Help Panels
In der )INIT Sektion eines Panels kann der Name eines HELP Panels angegeben werden. Dieses Panel wird aufgerufen, wenn während der Anzeige des Verarbeitungspanels die PF1 Taste gedrückt wird. HELP Panels werden mit extra dafür vorgesehenen Anweisungen in der Panel Definition erstellt. Die grundsätzliche Struktur eines HELP Panels sieht wie folgt aus: ) attr # area(seri) extend(on) /* DOC: PANEL HELPMASK ***********************************************/ /* DOC: Maske zur Erstellung von Hilfe Panels */ /* DOC: Autor: Franz Lanz, August 1994 */ /********************* (c) COPYRIGHT LANZ GMBH 1994 ******************/ + type(text) intens(low) color(blue) skip(on) ? type(text) intens(low) color(red) skip(on) $ type(text) intens(high) color(yellow) skip(on) ö type(text) intens(high) color(white) skip(on) ! type(text) intens(high) color(green) skip(on) )body expand("") % TUTORIAL "-" Maske für ein Tutorial / Help Panel "-" %Befehl >_zcmd + %Ende mit PF3 oder PF15,+Blaettern mit$PFll >%Vorwaerts+mit$PF10 >%Rueckwaerts +Bei letzter Seite$B+eingeben und $ENTER+fuehrt wieder an den Anfang. #crhelp )area crhelp + Ab hier können beliebig viele Zeilen als Hilfe Text eingegeben werden. + Die oben definierten ATTR Zeichen können zur farblichen Ausgestaltung + benutzt werden. ) end Programm 50 HELPMASK: Vorlage für ein HELP Panel
#
430
19 Panels - Erstellen und nutzen
Die grau unterlegten Zeilen sind zur Definition eines HELP Panels erforderlich. Diese Vorlage benutze ich immer, wenn ich ein neues Help Panel erstellen muss. Das HELP Panel wird in der )INIT Sektion der Panel Definition wie folgt eingetragen: .help = name
19.3.7
Table Display Panels
Mit den Table Display Panels werden ISPF Tables angezeigt und bearbeitet. ISPF Tables sind zweidimensionale Tabellen, die mithilfe von ISPF Table Services erstellt und mit Daten gefüllt werden. Siehe hierzu auch das Kapitel „Befehle der Table Services" ab Seite 441. Ein Table Display Panel enthält eine )MODEL Anweisung, in der diejenigen Variablen aus der ISPF Table angegeben werden, die mit diesem Panel angezeigt werden sollen. Beispiel Dieses Panel zeigt jeweils in einer Zeile die zuletzt editierten Dateien an. In der ersten Spalte kann man einen Bearbeitungskode eingeben. 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
/* /* /* /*
DOC: DOC: DOC: DOC:
PANEL LASTED ***********************************************/ Verarbeitungspanel fuer die Prozedur "LASTED" */ */ Es wird die ISPF Table $LElpar bearbeitet. Autor: Franz Lanz am 13 Sep 1994 */
# type(text) intens(low) skip(on) color(red) % type(text) intens(low) skip(on) color(white) + type(text) intens(low) skip(on) color(green) * type(text) intens(high) skip(on) color(yellow) ( type(output) intens(high) skip(on) color(white) just(left) ; type(output) intens(high) skip(on) color(blue) just(left) ? type (input) intens (low) caps (on) color (turq) just (left) ! type(input) intens(high) caps(on) color(yellow) pad(_) )BODY expand(//) ;ZSYSID +Tabelle mit den zuletzt editierten Dateien anzeigen % COMMAND ===>_ZCMD / / % SCROLL ===>_ZSCR+ + +Sort:%D+= Date+or%N+= Name?z+ Maximale Zeilen:?maxz + *C#Letzte DSN in Edit #Datum #/-/ )MODEL !z(dsn ,'datum )INIT .zvars = '(lesort funktion)' .help = LASTEDT1 .csrrow = &zeile )PROC &zeile = .CSRROW if (.resp = END) Sprc = 1 if (.resp = ENTER) Sprc = 0 VER(Smaxz,NB,NUM) VER(SLESORT,LIST,D,N)
Zeit ;zeit
431
19.3 Panels definieren 38 VPUT 39 )END
(LESORT) PROFILE
Programm 51 LASTED: Panel fiir die Prozedur LASTED
Diese ISPF Table wird in der Prozedur # I M A C R 0 2 mit folgendem Statement definiert: "TBCREATE "tabname" KEYS(DSN) NAMES(FUNKTION,DATUM,ZEIT)"
Wie man sieht, besteht die Table aus insgesamt vier Spalten, wobei die Spalte mit dem Namen DSN als Key definiert ist. Sie finden die Namen dieser Spalten in der )MODEL Anweisung der obigen Panel Definition. Die Anzeige der ISPF Tabelle erfolgt in der Prozedur LASTED mit folgendem Statement: "TBDISPL "tabname" PANEL (LASTED) AUTOSEL(NO)"
Das folgende Bild zeigt eine Anzeige des obigen Panels, wie sie beim Aufruf der Prozedur LASTED erscheint: LPRT Tabelle mit den zuletzt editierten Dateien anzeigen ROH 54 to 8 6 of 8 6 COMMAND = > SCROLL = = > CSR Sort: D = Date or N = Name D
Maximale Zeilen: 8 6
C Letzte DSN in Edit
Datum
Zeit
_ PROX. UTIL. REXX (ALIAS) _ PROX.UTIL.REXX(#SU) PROX. UTIL. REXX (#SPL J) _ PROX.UTIL.REXX(#BIND) _ PROX.BUCH.REXX(X2B) _ PROX.BUCH.REXX(LMMSTATS) _ PROX.BUCH.REXX(LMMLIST)
04/08/13
15:32
49
04/08/13
15:32
20
04/08/13
15:32
06
04/08/13
15:28
05
04/08/13
15:26
50
04/08/13
15:23
50
04/08/13
15:23
37
Bottom of data ******************************** Abbildung 123 Anzeige des Panels LASTED
Merksätze zu Table Display Panels • • • • • •
Hinter der )MODEL Anweisung können bis zu acht Model Lines definiert werden. Die Table Display Panels sind automatisch SCROLLABLE. Das heißt, man kann beliebig lange ISPF Tabellen darstellen. Geblättert wird mit den PF Tasten 7 und 8. PF7 Rückwärts, PF8 Vorwärts. Die Anzeigen können nur in 80 Spalten erfolgen. Wenn man in den Tabellen auch Verarbeitungen durchfuhren will, sollte man die erste Spalte als Eingabefeld für die Operationskodes definieren. Siehe hierzu das obige Panel. In den Zeilen hinter der )MODEL Zeile müssen nicht alle Namen einer ISPF Tabelle aufgeführt werden. Es können also auch nur einige Spalten der ISPF Tabelle angezeigt werden.
20
Skeletons - Aufbau und Einsatz
In diesem Kapitel lernen Sie, wie man mithilfe von ISPF Skeletons auf elegante Art JCL Members und andere Daten erstellen kann, indem man aus Maskendefinitionen (Skeletons) und den dazugehörigen Aktualdaten Ergebnisdateien erstellt. ISPF Skeletons sind Members in einem PDS/PDSE, die mit dem Editor erstellt werden. Sie stellen Masken zur Aufbereitung von beliebigen Datenstrukturen dar. Skeleton Member bestehen aus Basis Text, Skeleton Control Statements und Variablennamen. Die Variablennamen werden bei der Verarbeitung eines Skeletons mittels des ISPF File Tailoring Services durch die in der verarbeitenden REXX Prozedur zugewiesenen Aktualwerte ersetzt. Genau wie bei den Panels, dürfen die Variablennamen auch hier nicht länger als acht Zeichen sein.
20.1
Die Erstellung von Skeletons
Bei der Erstellung von Skeletons stehen folgende Skeleton Anweisungen zur Verfügung: Anweisung )BLANK )CM
Funktion )BLANK 5 fugt fünf Leerzeilen in den Ausgabefile ein. Mit )CM können Kommentarzeilen im Skeleton definiert werden. Diese Zeilen werden nicht in den Ausgabebestand übernommen. Zur Steuerung der Skeleton Verarbeitung sind standardmäßig sieben )DEFAULT Sonderzeichen reserviert. Dies sind die Zeichen: ), &, ?, !, . Mit )DEFAULT kann man diese Zeichen temporär verändern. )DOT )END- Mit diesen beiden Anweisungen kann eine Schleife gebildet werden. DOT )IM Mit dieser Anweisung kann ein weiterer Skeleton hereingeholt, aufgelöst und dem Ausgabebestand hinzugefügt werden. )SEL Mit )SEL kann eine Bedingung abgefragt werden. Wenn diese Bedin)ENDSEL gung erfüllt ist, werden alle Zeilen bis zum nächsten )ENDSEL verarbeitet. )SET Mit dieser Anweisung können Zuweisungen vorgenommen werden. )TB, )TBA Mit diesen Anweisungen können Tabulatoren gesetzt werden. Tabelle 42 Skeleton Befehle
434
20 Skeletons - Aufbau und Einsatz
Auch hier möchte ich Sie nicht mit umfangreichen theoretischen Erklärungen nerven, sondern gleich an einem praktischen Beispiel zeigen, wie die Skeleton Verarbeitung funktioniert. Der folgende Skeleton fügt in einen größeren Job einen Step ein, der für DB2 BIND PACKAGE Anweisungen ausfuhrt. Die BIND PACKAGE Anweisungen werden hierbei nicht direkt ausgeführt, sonder dies besorgt die aufgerufene REXX Prozedur VINTPAC. 02 //* DOC: AUSFUEHREN DER BIND PACKAGE ANWEISUNGEN
03 //********************************************************************* 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
//&STEPN EXEC PGM=IKJEFT01,REGION=4M //STEPLIB DD DISP=SHR,DSN=SDSNEXIT // DD DISP=SHR,DSN=&DSNLOAD II DD DISP=SHR,DSN=&VERLOAD IISYSPROC DD DISP=SHR,DSN=&VERREXX0 II DD DISP=SHR,DSN=&VERREXX1 ) IM $ISPFDD NT //DBRMLIB DD DISP=SHR,DSN=SDBRMLIB IIRUNLIB DD DISP=SHR,DSN=&DB2RUN //BGFILE DD DISP=SHR,DSN=&BGFILE //STAT DD DISP=MOD,DSN=SPACKSTAT. . &DB2SYS //FEHL DD DISP=MOD,FREE=CLOSE, // DSN=SDB2FEHL..&DB2SYS..SGRP //SYSIN DD ONIT=VIODA,SPACE=(CYL,(10,10)), // DSORG=PS,RECFM=FB,LRECL=80,BLKSIZE=27920 //SYSPRINT DD UNIT=VIODA, SPACE= (CYL, (5 ,5) ) ,DSORG=PS, // RECFM=FBA,LRECL=133,BLKSIZE=27950 //LISTE DD SYSOUT=* //SYSTSPRT DD SYSOUT=* //SYSTSIN DD * PROFILE NOPREFIX NOMSGID ISPSTART CMD(%VINTPAC SDB2SYS SSYST SPACKZEIT) END //INMEM DD *
Abbildung 124 Definition eines Skeleton
Anmerkungen Alle für eine Skeleton Definition relevanten Stellen habe ich grau unterlegt. In der Zeile 10 wird der Skeleton SISPFDD hereingeholt. Dieser Skeleton enthält die für die Ausführung von REXX Prozeduren in einer ISPF Batch Umgebung notwendigen DD Anweisungen. Wenn bei der Verarbeitung eines Skeletons eine Skeleton Variable hinten mit einem Literal verbunden werden soll, wird dazu ein Punkt als Verkettungszeichen benutzt. In den Zeilen 14 und 16 werden DSN dynamisch zusammengebaut. Da hier die einzelnen Qualifier mit einem Punkt unterteilt werden müssen, kommen hier zwei Punkte vor. Einer als Verkettungsoperator und einer wird als Literal zusätzlich eingefügt.
20.1 Die Erstellung von Skeletons
435
Hier nun die Statements aus der REXX Prozedur VINTSN, die diesen Skeleton verarbeitet: 3209 3210 3211 3212 3213 3214 3215 3216 3217 3218 3219 3220 3221 3222
/* Werte für SKEL VINTPAC aus LOKATIONEN lesen /* say exname time() "Beginn Step PACAUSF" dsnexit = lesen_lokation("VPROD"syst "DSNEXIT") dsnload = lesen_lokation("VPROD"syst "DSNLOAD") dbrmlib = lesen_lokation("VPROD"syst "DBR") db2run = lesen_lokation("VPROD"syst "DB2RUNLIB") bgfile = bgut db2sys = lesen_lokation("VPROD"syst "DB2SYS") bnderr = lesen_lokation("VPROD"syst "BNDERR") packzeit= packcalc("PAC") /* Laufzeitberechnung für BIND */ stepn = "PACAUSF" /* Dieser Name wird auch in BNDERR benutzt. "FTINCL VINTPAC" if rc > 0 then call ispf_error rc " aus FTINCL VINTPAC"
*/ */
*/
Abbildung 125 Verarbeitung eines Skeleton
In diesem Teil des Programms werden die meisten der im Skeleton stehenden Variablen mit Werten besetzt. Einige sind schon weiter vorne in der Prozedur besetzt worden. Bei der Ausführung der Anweisung FTINCL VINTPAC in Zeile 3221 geschieht folgendes: Das Member VINTPAC wird in der Dateikette, die unter dem DD Namen ISPSLIB zugeordnet ist, gesucht und in einen internen Bereich eingelesen. Danach wird der File Tailoring Service aufgerufen. Dieser arbeitet den Skeleton zeilenweise durch. Dabei werden die Inhalte der Variablen aus dem REXX/ISPF Variablenpool entnommen und anstelle der Variablen eingesetzt. Eventuell vorhandene File Tailoring Anweisungen werden ausgeführt. In diesem Skeleton ist nur ein )IM Statement vorhanden. Das dort genannte Member wird ebenfalls unter dem DD Namen ISPSLIB gesucht und eingefugt, wobei auch hier die eventuell vorhandenen Variablen durch die Aktualwerte ersetzt werden. Wenn der File Tailoring Service alle Verarbeitungen durchgeführt hat, wird das Ergebnis an den internen Datenstrom, der mit der Anweisung FTOPEN geöffnet wurde, angefügt. Erstellung des JCL Members Wenn in der Prozedur VINTSN alle File Tailoring Arbeiten, die zur Bildung eines JCL Members notwendig sind, beendet sind, wird mit der Anweisung FTCLOSE NAME(name) das erstellte Member gesichert. Der durch den File Tailoring Service erstellte Job Step sieht dann wie folgt aus: 195 196 197 198 199 200 201 202 203
//* DOC: SKEL VINTPAC ************************************************ //* DOC: AUSFUEHREN DER BIND PACKAGE ANWEISUNGEN //********************************************************************* //PACAUSF EXEC PGM=IKJEFT01 ,REGION=4M //STEPLIB DD DISP=SHR,DSN=DB2P .ALIAS .DSNEXIT // DD DISP=SHR,DSN=DB2P.ALIAS.DSNLOAD // DD DISP=SHR,DSN=PROX. LOÄD //SYSPROC DD DISP=SHR,DSN=PROX. CEXEC // DD DISP=SHR,DSN=PROX. CEXEC
436 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221
222 223 224 225 226 227 228 229 230
20 Skeletons - Aufbau und Einsatz / / * DOC: SKEL $ISPFDD ****************** //ISPMLIB DD DISP=SHR,DSN=ISP.SISPMENU //ISPPLIB DD DISP=SHR,DSN=ISP.SISPPENO //ISPSLIB DD DISP=SHR,DSN=ISP.SISPSENU //ISPPROF DD DISP=(NEW,PASS),DCB=(RECFM=FB,LRECL=80,BLKSIZE=3120), // SPACE=(TRK,(5,5,10),RLSE),UNIT=VIODA //ISPTLIB DD DISP=(SHR,PASS),DSN=*.ISPPROF,VOL=REF=*.ISPPROF // DD DISP=SHR,DSN—ISP.SISPTENU //ISPLOG DD DUMMY //****** ENDE $ISPFDD ****************** //DBRMLIB DD DISP=SHR,DSN=PRDXX.DBRMLIB DD DISP=SHR,DSN^DB2P.ALIAS.RUNLIB.LOAD //RUNLIB DD DISP=SHR,DSN=PRDXX.DB2PACK //BGFILE DD DISP=MOD,DSN= PACKSTAT .DB2P //STAT //FEHL DD DISP=MOD,FREE=CLOSE, DSN=PROX. DB2BIND .ERROR. DB2P. PAC // DD UNIT=VIODA,SPACE=(CYL, (10,10)) , //SYSIN // DSORG=PS,RECFM=FB,LRECL=8 0,BLKSIZE=2 7920 //SYSPRINT DD UNIT=VIODA,SPACE=(CYL,(5,5)),DSORG=PS, // RECFM=FBA,LRECL=133,BLKSIZE=27950 //LISTE DD SYSOUT=* //SYSTSPRT DD SYSOUT=* DD * //SYSTSIN PROFILE NOPREFIX NOMSGID ISPSTART CMD(%VINTPAC DB2P 0 91; 47) END DD * //INMEM
Abbildung 126 Ergebnis einer Skeleton
Verarbeitung
In dem vorhergehenden Bild habe ich alle Stellen, an denen Werte durch Variablenersetzung eingefugt wurden, sowie alle eingefugten Zeilen grau markiert.
20.2
Schritte bei der Skeleton Benutzung
Um den File Tailoring Service zu nutzen, muss man folgendermaßen vorgehen: 1. Man erstellt mit dem ISPF Editor ein Member in einem PDS, welcher nachher bei der Verarbeitung des Skeletons durch eine REXX Prozedur unter dem DD Namen ISPSLIB zugeordnet wird. 2. Man erstellt eine REXX Prozedur, in der die Variablen, die im Skeleton definiert sind mit Aktualwerten gefüllt werden und ruft darin dann die Anweisungen auf, um mit Hilfe von einem oder mehrerer Skeletons einen kompletten Batch Job zu erzeugen. Tipp Man kann mit dem File Tailoring Service natürlich jeden Datenbestand erzeugen. Das muss nicht immer nur ein JCL Member sein.
20.3 Erstellung von JCL mithilfe von Skeletons
20.3
437
Erstellung von JCL mithilfe von Skeletons
In der REXX Prozedur, die mithilfe von Skeletons ein JCL Member erstellen soll, müssen die folgenden Befehle in der angegebenen Reichenfolge benutzt werden: 1. ISPFILE zuordnen 3605 3606 3607 3608 3609 3610 3611 3612 3613 3614 3615 3616 3617 3618 3619 3620
/*****************************************************************/ /** Alloc des Files ISPFILE zur Erstellung der Jobs */ /*****************************************************************/ alloc_ispfile : "CONTROL ERRORS RETURN" "FTCLOSE" /* Sicherheits-Close */ STATUS = MSG("OFF") address "TSO" "FREE F(ISPFILE)" /* Sicherheits FREE */ STATUS = MSG ("ON") address "TSO" "ALLOC F(ISPFILE) DA('"jobsorg"') SHR REUSE" if rc 0 then call ispf_error rc " aus ALLOC DD(ISPFILE)" if testkz then , say exname time() "Alloc ISPFILE auf "jobsorg" erfolgt" "FTOPEN" /* Leeren File Tailoring Puffer beginnen */ if rc > 0 then call ispf_error rc " aus FTOPEN" return
Hinweis Der FTOPEN Befehl endet mit einem Fehler, wenn keine Zuordnung für den DD Namen ISPFILE existiert. 2. Skeleton aufrufen "FTINCL
Skelname"
Siehe hierzu die Anmerkungen weiter oben. 3. Member in den PDS schreiben " FTCLOSE NAME ("memname " ) " Hier werden jetzt alle durch ein- oder mehrere FTINCL Statements erzeugten Zeilen unter dem angegebenen Membernamen in den PDS, der unter ISPFILE zugeordnet ist, geschrieben.
21
Tables - Erstellen und bearbeiten
Hier lernen Sie, wie Sie ISPF Tabellen erstellen, bearbeiten und anzeigen. Dieser ISPF Service bietet die Möglichkeit, Datenbestände, die man zur Steuerung seiner täglichen Arbeit benötigt, einfach zu erstellen und zu benutzen. ISPF Tabellen sind zweidimensionale sequentielle Tabellen, die vom ISPF verwaltet werden. Man kann sie nur mit den Befehlen des „ISPF Table Service" bearbeiten und nutzen. Eine Zeile in einer ISPF Tabelle besteht aus Spalten, die durch ISPF Variable benannt werden. Die einzelnen Zeilen können mithilfe von ISPF Table Service Befehlen adressiert werden. Nach der Durchfuhrung eines solchen Befehls sind die Namen der Variablen in der verarbeitenden Prozedur bekannt.
21.1
Speicherorte für Tabellen
Tabellen können entweder temporär oder permanent angelegt werden. Eine temporäre Tabelle existiert nur im Hauptspeicher. Sie kann nicht in eine permanente Datei gesichert werden. Zur Verarbeitung befindet sich die GANZE Tabelle immer im virtuellen Speicher. Das heißt, dass eine ISPF Tabelle in ihrer Größe durch den verfugbaren virtuellen Speicher begrenzt ist. Normalerweise werden Tabellen im Speicher oberhalb der 16-megayte-line gespeichert. Dadurch können ISPF Tabellen ziemlich groß werden.
21.2
Lesen von ISPF Tabellen
Eine Tabelle wird mit dem TBOPEN Statement in den Speicher gelesen oder dort temporär angelegt. Wird eine Tabelle von der Tabelleneingabedatei ISPTLIB mit der Option WRITE gelesen, dann wird auf das Member, in dem diese Tabelle steht ein ENQ gesetzt. Damit wird verhindert, dass diese Tabelle ein zweites Mal gelesen werden kann. Der ENQ wird aufgehoben, wenn die Tabelle mit TBCLOSE geschlossen wird. Beim Lesen mit der Option NOWRITE besteht der ENQ nur während des Lesevorgangs.
440
21 Tables - Erstellen und bearbeiten
Unter dem DD Namen ISPTLIB sind normalerweise mehrere PDS/PDSE zugeordnet. Wenn ein TBOPEN ausgeführt wird, dann wird in dieser Dateikette nach dem im TBOPEN genannten Member gesucht. Das zuerst gefundene Member des gesuchten Namens wird gela-
21.3
Schreiben von ISPF Tabellen
Beim Schreiben von ISPF Tabellen Members kann man natürlich nicht den zum Lesen benutzten DD-Namen ISPTLIB verwenden, denn unter dem DD Namen ISPTLIB ist normalerweise eine Kette von PDS/PDSE zugeordnet. Und wir haben weiter oben schon gelernt, dass man auf einen Concatenated Data Set nicht schreiben kann. Deshalb wird beim Schreiben von Tabellen Members der DD Name ISPTABL benutzt, wobei dem DD Namen ISPTABL immer nur ein PDS zugeordnet werden darf. Wenn man sich diesen Sachverhalt etwas genauer überlegt, entsteht natürlich die Frage: „Wie kann ich denn eine Tabelle verändern und pflegen, wenn ich sie nicht dahin zurückschreiben kann, woher ich sie geladen habe?" Um dieses Problem zu lösen, hat man einen kleinen „Trick" erfunden: • • •
Über den DD Namen ISPTLIB kann man alle Tabellen lesen, die in dieser Concatenation von PDS/PDSE enthalten sind. Zurückschreiben kann man die Tabellen aber nur in die eine Datei, die unter dem DD Namen ISPTABL zugeordnet ist. Wenn man nun die Datei, die unter ISPTABL für das Schreiben von Tabellen zugeordnet ist, als erste Datei in der ISPTLIB Kette zuordnet, dann wird eine mindestens einmal zurückgeschriebene Tabelle immer wieder mit ihrem aktuellen Inhalt geladen.
Diese Zuordnung sieht in der Praxis in meinem TSO User dann so aus: T1T105
SHR,KEEP
T1T105 PLPRT1 PLPRT1 OSTOA9 T1S001 OSTOA9 OSTOA9 OSTOA9 OSTOA9
SHR,KEEP SHR,KEEP SHR,KEEP SHR,KEEP SHR,KEEP SHR,KEEP SHR,KEEP SHR,KEEP SHR,KEEP
> > > >
> > >
> > > >
ISPTABL ISPTLIB
LANZT.ISPF.TLIBTAB.LPRT LANZT. ISPF. TLIBTAB. LPRT SYST1.TSO.ISPTLIB SYST1.JCLPLUS.ISPTLIB SYS1.DGTTLIB SYSPT.CAI.CAIISPT ISP.SISPTENU ISF.SISFTLIB SYS1. SBPXTENU EOY.SEOYTENU
Regel Wenn ich eine Tabelle schreibe (egal ob neu oder vorher eingelesen), dann wird sie über ISPTABL in die Datei LANZT.ISPF.TLIBTAB.LPRT geschrieben. Wenn ich sie danach neu einlese, wird sie zuerst in der gleichen physischen Datei unter dem DD Namen
21.4 Befehle der Table Services
441
ISPTLIB gefunden und von dort gelesen. Damit ist die fortlaufende Pflege einer Tabelle gewährleistet.
21.4
Befehle der Table Services
Im ISPF steht eine ganze Reihe von Befehlen zur Bearbeitung von Tabellen bereit. Dabei unterscheiden wir die Befehle, die sich auf ganze Tabellen beziehen und solche, die sich auf die Bearbeitung innerhalb der Tabellen beziehen. Die folgende Tabelle zeigt die Befehle der Tabellenverarbeitung: Befehl TBCLOSE TBCREATE TBEND TBERASE TBOPEN TBQUERY TBSAVE TBSORT TBSTATS Befehl TB ADD TBBOTTOM TBDELETE TBEXIST TBGET TBMOD TBPUT TBSARG TBSCAN TBSKIP TBTOP TBVCLEAR
Beschreibung der Befehle, die sich auf die ganze Tabelle beziehen. Schließt eine Tabelle und sichert sie in die Ausgabedatei, falls sie vorher gelesen worden war. Erstellt eine neue Tabelle und öffnet sie für die Verarbeitung. Schließt eine Tabelle ohne sie zu sichern. Löscht ein Tabellen Member in der ISPTABL Datei. Öffnet eine existierende Tabelle für die Verarbeitung. Stellt Informationen über eine Tabelle zur Verfügung. Sichert eine Tabelle in das Member in ISPTABL ohne die Tabelle zu schließen. Sortiert eine Tabelle. Stellt Statistik Informationen über die Tabelle zur Verfügung. Beschreibung der Befehle, die sich auf einzelne Zeilen beziehen. Fügt eine neue Zeile der Tabelle hinzu. Setzt den CRP (Current Row Pointer) auf die letzte Zeile der Tabelle. Löscht eine Zeile aus der Tabelle. Testet, ob eine Zeile mit einem bestimmten Schlüssel existiert. Stellt die Inhalte der Current Row in die zugehörigen Variablen. Ändert die Inhalte einer existierenden Zeile bzw. addiert eine neue Zeile. Ändert die Inhalte einer existierenden Zeile, wenn sie existiert und wenn der Key übereinstimmt. Setzt ein Suchargument für einen nachfolgenden TBSCAN oder TBDISPL auf. Sucht in der Tabelle nach einer Zeile entsprechend den mitgegebenen Argumenten. Verschiebt den CRP um eine angegebene Anzahl Zeilen vor oder zurück und stellt die Werte aus der adressierten Zeile in die Variablen. Setzt den CRP an den Anfang der Tabelle. Füllt alle Variablen der Tabelle mit Null Valúes.
Tabelle 43 Bearbeitungsbefehle fiir Tabellen
442
21 Tables - Erstellen und bearbeiten
Auch hier werde ich darauf verzichten, die oben genannten Befehle ausfuhrlich zu beschreiben. Stattdessen zeige ich Ihnen in dem folgenden Beispiel, wie man eine Tabellenverarbeitung gestaltet.
21.5
Beispiel für die Tabellenverarbeitung
Wie ich schon mehrfach erwähnte, habe ich eine kleine ISPF Anwendung geschrieben, welche die zuletzt editierten Dateien in einem Panel anzeigt. In diesem Panel kann man dann die dort stehenden Dateinamen benutzen, um weitere Aktionen mit diesen Dateien durchzuführen. Die Eintragung der Dateinamen erfolgt im Edit Makro #IMACR02. Hier nun der Abschnitt aus dem Edit Makro #IMACR02, in dem der Eintrag der Dateinamen vorgenommen wird: 192 193 194 195 196 197 198 199
/*********************************************************************/ /* Name der editierten Datei in die LE Tabelle eintragen */ /*********************************************************************/ in_tab_ein: if edmem "" then dsn = eddsn"("edmem")" eise dsn = eddsn /* */ /* Edit DSN mit Edit Datum in Table eintragen und wegschreiben */
201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224
address "ISPEXEC" "VGET (ZSYSID) SHARED" tabname = "$LE"zsysid "TBOPEN "tabname" LIBRARY(ISPTABL) WRITE SHARE" openrc = rc funktion = ""; datum = date("0"); zeit = time(); select when openrc = 0 then do "TBMOD "tabname" ORDER" "TBSORT "tabname" FIELDS(DATUM,C,D,ZEIT,C,D)" "TBCLOSE "tabname" LIBRARY(ISPTABL) REPLCOPY PAD(100)" end when openrc = 8 then do "TBCREATE "tabname" KEYS(DSN) NAMES(FUNKTION,DATUM,ZEIT)" "TBADD "tabname" ORDER" "TBCLOSE "tabname" LIBRARY(ISPTABL) REPLCOPY PAD(100)" end when openrc > 8 then do zedlmsg = zerrlm address "ISPEXEC" "SETMSG MSG(ISRZ001)" end otherwise nop end /* select */ return
200 / *
Abbildung 127 Beispiel einer
*/
Tabellenverarbeitung
21.6 Tabellenverarbeitung am Beispiel des Programms LASTED
443
Erklärung zu dem obigen Programmsegment: Zeile 203 Der Name der ISPF Tabelle wird festgelegt. Da diese Prozedur in mehreren LPARs parallel laufen muss, deren Tabellenobjekte gegenseitig bekannt sind, besteht der Name der Tabelle aus dem festen Text „$LE" und dem Namen der LP AR, der mittels der ISPF Variablen ZSYSID hinzugefügt wird. Zeile 204 Die Tabelle wird mit den Option WRITE (kann zurückgeschrieben werden) und SHARE (Tabelle kann zwischen einzelnen ISPF Split Screens „shared" werden) geöffnet. Zeile 208 bis 212 Wenn der RC aus dem OPEN Null war, dann existiert die Tabelle bereits. Mit TBMOD wird jetzt die aktuelle Zeile eingetragen. TBMOD trägt auch neue Zeilen ein, wenn diese noch nicht vorhanden sind. Die Variablen DSN, FUNKTION, DATUM und ZEIT wurden weiter vorne mit Daten gefüllt (Zeilen 196 und 197, Zeile 206). Mit TBSORT wird die Tabelle nach DATUM und ZEIT absteigend sortiert. Dadurch wird erreicht, dass die zuletzt editierte Datei an oberster Stelle steht. Danach wird mit TBCLOSE die Tabelle unter dem Membernamen, der in „tabname" steht, in die Datei ISPTABL zurückgeschrieben. Die Option REPLCOPY heißt, dass ein eventuell bereits vorhandenes Member gleichen Namens überschrieben wird. Die Option PAD(IOO) heißt, dass in dem Member ein Reservebereich von 100 Zeilen angelegt wird. Zeilen 213 bis 217 Wenn der RC = 8 ist, existiert das Member für diese Tabelle noch nicht und muss deshalb neu angelegt werden. Mit TBCREATE wird jetzt die Tabelle neu erstellt. Sie enthält als Key die Variable DSN und als Datenfelder die Variablen FUNKTION, DATUM und ZEIT. Mit TBADD wird jetzt die erste Datenzeile in die Tabelle eingetragen. Sie wird danach mit TBCLOSE gespeichert und geschlossen.
21.6
Tabellenverarbeitung am Beispiel des Programms LASTED
Um die Tabellenverarbeitung möglichst umfassend beispielhaft zu beschreiben, habe ich auf den folgenden Seiten alle Elemente aus der Anwendung „Last Edit Files" eingefugt, die notwendig sind, um die Anwendung zu betreiben. Dies sind:
444 • • • •
21 Tables - Erstellen und bearbeiten
Ein Ausdruck der Panelanzeige, wenn das Programm LASTED aufgerufen wird. Dort sehen Sie alle Felder, wie sie bei der Arbeit mit dieser Anwendung erscheinen. Den Ausdruck der Hilfetexte, wie sie beim Drücken der PF 1 Taste angezeigt werden. Einen Ausdruck des Quellkodes des Programms LASTED. Eine Beschreibung der für die Tabellenverarbeitung relevanten Programmteile des Programms LASTED.
21.6.1
Die Paneldefinition des Panels LASTED
Ol )ATTR 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
/* /* /* /*
DOC: DOC: Verarbeitungspanel fuer die Prozedur "LASTED" DOC: Es wird die ISPF Table $LElpar bearbeitet. DOC: Autor: Franz Lanz am 13 Sep 1994
# type(text) intens(low) skip(on) color(red) % type(text) intens(low) skip (on) color(white) + type(text) intens(low) skip(on) color(green) * type(text) intens(high) skip (on) color(yellow) ( type(output) intens(high) skip(on) color(white) just(left) ; type(output) intens(high) skip(on) color(blue) just(left) ? type(input) intens(low) caps(on) color(turq) just(left) ! type(input) intens(high) caps(on) color(yellow) pad(_) )BODY expand(//) ;ZSYSID +Tabelle mit den zuletzt editierten Dateien anzeigen %COMMAND ===>_ZCMD / / % SCROLL ===>_ZSCR+ + +Sort:%D+= Date+or%N+= Name?z+ Maximale Zeilen:?maxz + *C#Letzte DSN in Edit #Datum #/-/ )MODEL !z(dsn ;datum )INIT .zvars = 1(lesort funktion)' .help = LASTEDT1 .csrrow = Szeile )PROC &zeile = .CSRROW if (.resp = END) &prc = 1 if (.resp = ENTER) Sprc = 0 VER(&maxz,NB,NUM) VER (SLESORT, LIST, D,N) VPÜT (LESORT) PROFILE )END
Programm 52 LASTED: Panel Definition
*/ */ * /
Zeit ;zeit
445
21.6 Tabellenverarbeitung am Beispiel des Programms LASTED
21.6.2
Panelanzeige der Funktion LASTED
LASTED Tabelle mit den zuletzt editierten Dateien anzeigen COMMAND = > Sort: D = Date or N = Name D
Maximale Zeilen: 26 Datum
Letzte DSN in Edit PR0X.LOGON.REXX(LASTED) PROX. LOGON. REXX ( # IMACR02 ) PROX.BUCH.REXX(ALTLIB3) PROX. BUCH. REXX (ALTLIB) PROX.LOGON.REXX(#TS0B) PROX. LOGON. REXX (#ISPFB) PROX. LOGON. REXX ( ## ) PROX. LOGON. PANEL ( LASTED ) PROX. LOGON. PANEL (HELPMASK)
Row 1 to 26 of 26 SCROLL = > CSR
Zeit
04/07/12 07;: 46::25 04/07/09 17:: 18::04 04/07/09 14:: 22::01 04/07/09 10:: 30::55 04/07/09 09:: 02::14 04/07/09 09:: 01::40 04/07/08 18:: 27::40 04/07/07 15:: 19 46 : 04/07/07 14:: 24::31 Bottom of data ********************************
Abbildung 128 Anzeige des Programms LASTED
Die grau unterlegten Felder sind Ein- und Ausgabefelder.
21.6.3
Die Hilfetexte der Anwendung LASTED
Damit ich die Funktionen des Programms LASTED nicht extra erklären muss, sehen sie zunächst die Seiten des Help Textes. Dieser Text wird ausgegeben, wenn während der Anzeige des Panels die PF1 Taste gedrückt wird. Sie können diesem Text entnehmen, welche Funktionen man mit dem Programm LASTED durchfuhren kann. TUTORIAL Befehl = >
Tabelle mit den zuletzt editierten Dateien anzeigen
Ende mit PF3 oder PF15, Blättern mit ENTER. Bei letzter Seite B eingeben und ENTER führt wieder an den Anfang. More: + Mit diesem Panel werden die zuletzt editierten Dateien in einer Tabelle angezeigt. Diese Anzeige kann dann dazu benutzt werden, um die dort stehenden Dateien erneut zu editieren. Es können folgende Eingaben gemacht werden. 1. unter C — > —> —> —> —> —>
S M E B V D
—> —> —> —> —> —>
Anzeigen der Datei mit MEMLIST und EINER Eingabespalte Anzeigen der Datei mit MEMLIST und NEUN Eingabespalten Editieren dieser Datei oder des Members. Browse dieser Datei oder des Members. View dieser Datei oder des Members. Aufruf des in der Zeile genannten DSN mit Memberliste im Edit. — > L --> Löschen dieser Zeile (auch mehrere möglich!) — > I — > Anzeigen der Datei Informationen.
2. In dem Feld Maximale Zeilen ist die Anzahl der Zeilen der Tabelle angegeben. Wenn man dort eine kleinere Zahl eingibt und dann 'ENTER' drückt, wird die Tabelle auf diese Anzahl Zeilen reduziert.
446
21 Tables - Erstellen u n d bearbeiten
3. Hinter COMMAND können folgende Eingaben gemacht werden: a) £ name > Es wird nach dem Text name in der DSN Spalte gesucht. name ist immer OHNE Hochkommata einzugeben. b) sort dsn > Die DSN Spalte wird aufsteigend sortiert dargestellt. Diese Sortierung wird mit dem nächsten Aufruf einer Zeile wieder auf Datum und Zeit zurück genommen. Die Sortierung kann auch durch Eingabe des Zeichens # in irgendeiner Zeile erreicht werden. In beiden Fällen gilt die Sortierung nach Namen nur für die nächste Auswahl. 4. Hinter Sort: D = Date or N = Name kann die Sortierung angegeben werden: a) D > Es wird permanent nach Datum und Uhrzeit sortiert. b) N > Es wird permanent nach dem DSN sortiert. Achtung: Wenn man nur eine Datei editieren will, dann genügt es, den Cursor in dieser Zeile zu positionieren und ENTER zu drücken. Da beim Aufruf der Cursor immer vor der obersten Datei steht und diese die zuletzt editierte Datei ist, kann man mit dem Aufruf von 'LASTED' und dann ENTER immer die zuletzt editierte Datei wieder neu editieren. Member oder Datei ist nicht mehr da: Wird eine Datei ausgewählt, die nicht mehr existiert, dann wird diese Zeile aus der Tabelle gelöscht und die Anzeige wird wiederholt. Edit Recovery: Bei jedem Aufruf und auch während der Benutzung wird jedes mal nachgesehen, ob ein Edit Recovery anhängig ist. Wenn ja, dann wird das Standard Panel für das Edit Recovery aufgerufen. Die weitere Vorgehensweise ist dann wie gewohnt. REXX Compiles: Wenn ein Member aus einer Datei mit dem Last Qualifier REXX mit Änderungen mit PF3 verlassen wird, dann wird durch ein POP UP Panel nachgefragt, ob diese REXX Prozedur in die Standard CEXEC Datei kompiliert werden soll. Wenn ja, dann wird ein Batch Job zum Kompilieren submitted. End of Text Abbildung 129 Hilfe Text zum Programm LASTED
21.6.4
Der Quellkode des Programms LASTED
M i t d e m f o l g e n d e n P r o g r a m m w i r d die Tabelle verarbeitet. Alle Zeilen, die für die Tabellenv e r a r b e i t u n g r e l e v a n t sind, h a b e ich g r a u u n t e r l e g t . Z e i l e n , d i e f ü r d i e L o g i k d e r T a b e l l e n v e r a r b e i t u n g u n w e s e n t l i c h sind, h a b e ich e n t f e r n t . D i e s e T e i l e s i n d m i t e i n e r g e p u n k t e t e n Zeile gekennzeichnet. N a c h d e m A u s d r u c k der P r o g r a m m z e i l e n folgt eine detaillierte Beschreibung der wesentlichen Statements. 001 002 003 004 005 006 007 008 009
/* REXX LASTED *****************************************************/ /* DOC: Prozedur zur Anzeige der letzten editierten Dateien und */ /* DOC: Auswahl für verschiedene Aufrufe zur Bearbeitung */ /* (c) Franz Lanz am: 13 Sep 1994 */ /*********************************************************************/ parse source #sys #type exname #dd #dsn #exec #env #adr #tok address "ISPEXEC" "CONTROL ERRORS RETURN" "VGET (ZSYS1D) SHARED"
21.6 Tabellenverarbeitung am Beispiel des Programms LASTED
447
010 tabname = "$LE"zsysid Oil do k = 1 062 063 064 065 066 067 068 069 070 071 072 073 074 075 076 077 078 079 080 081 082 083 084 085 086 087 088 089 090 091 092 093 094 095 096 097 098 099 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118
/* */ /* Tabelle mit DSN(MEMBER) Zeilen öffnen */ /* */ "TBOPEN "tabname" LIBRARY(ISPTABL) WRITE SHARE" if rc > 0 then do; zedlmsg = "Achtung: Die TABLE "tabname" konnte nicht geöffnet", "werden. Dies kann folgende Ursachen haben: 1. In", "diesem TSO User ist bisher noch nicht das Edit Macro", "#IMACR02 bei einem Edit benutzt worden. 2. Das Member", tabname" ist aus der ISPTLIB entfernt worden. 3. Die", "ISPTLIB ist nicht allokiert.", "Hinweis: Die Table "tabname" wird im Edit", "Macro #IMACR02 angelegt und NICHT hier!" address "ISPEXEC" "SETMSG MSG(ISRZ001)" exit end "TBQUERY "tabname" ROWNUM(MAXX)" if rc > 0 then do; call i_error "TBQUERY"; exit; end; maxz = maxx + 0; maxc = maxx + 0 zeile = 1 /* Cursor beim 1. Aufruf auf Zeile 1 der Table */ /* */ /* Tabelle nach DSN sortieren, wenn SORT DSN in Panel */ /* oder durch Zeilenzeichen # eingegeben */ /* */ "VGET (LESORT) PROFILE" if rc > 0 then lesort = "D" if zcmd = "SORT DSN" then do "TBSORT "tabname" FIELDS(DSN,C,A)" end else do if lesort = "D" then do "TBSORT "tabname" FIELDS(DATUM,C,D,ZEIT,C,D)" end if lesort = "N" then do "TBSORT "tabname" FIELDS(DSN,C,A)" end end /* */ /* Tabelle mit DSN(MEMBER) Zeilen anzeigen */ /* */ "TBTOP "tabname "TBDISPL "tabname" PANEL(LASTED) AUTOSEL(NO)" if pre = 1 then exit if rc > 4 then do; call i_error "TBDISPL"; exit; end; if maxz < maxc then do schlanz = maxc - maxz do lp = 1 to schlanz "TBBOTTOM "tabname "TBDELETE "tabname end lp "TBCLOSE "tabname "LIBRARY (ISPTABL) REPLCOPY PAD (100)" if rc > 0 then do; call i_error "TBCLOSE"; exit; end; iterate k end if word(zcmd,1) = "F" then do ir = 1 do is = 1 to maxx "TBSKIP "tabname" ROW("IS")"
448 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178
21 Tables - Erstellen und bearbeiten if pos(word(zcmd,2),dsn) > 0 then do "TBDISPL "tabname" PANEL(LASTED) AUTOSEL(NO)" if pre — 1 then exit if rc > 4 then do; call i_error "TBDISPL"; exit; end; if word(zcmd,l) = "F" then iterate is else leave ir end end is zedsmsg = "Search Error" zedlmsg = "Der Text "word(zcmd,2)" konnte in der Tabelle nicht", "gefunden werden" "SETMSG MSG(ISRZ001)" iterate k end ir /* */ /* Wenn mit keinem Buchstaben selektiert, dann diejenige Zeile, */ /* in der der Cursor steht, positionieren. */ /* Die Variable ZEILE wird in der PROC Section des Panels LASTED */ /* auf die Cursor Row positioniert — > Szeile = .CSRROW */ /* */ if ztdsels = 0 & zeile > 0 then do "TBTOP "tabname "TBSKIP "tabname" NUMBER("zeile")" ztdsels = 1 /* Eine ausgewählte Zeile simulieren */ funktion = "E" end /* */ /* Alle selektierten Zeilen abarbeiten. */ /* */ do isels = 1 to ztdsels if verify(funktion,"MSDBVEI") = 0 then do datei = dsn if sysdsnC" "datei" 1 ") "OK" then do zedsmsg = "Dataset nicht da" zedlmsg = "Die Zeile " datei" wird deshalb sofort aus", "der Tabelle der Dateien gelöscht" address "ISPEXEC" "SETMSG MSG(ISRZ001)" "TBDELETE "tabname "TBCLOSE "tabname, "LIBRARY(ISPTABL) REPLCOPY PAD(IOO)' "TBDISPL "tabname iterate isels end end /* */ /* Screen Name für SWAP LIST Anzeige setzen. */ /* */ quals = translate(dsn," ","()-") zscrname = word(quals,words(quals)) /* Setze Member Name */ if pos(funktion,"MSI") > 0 then, zscrname = word(quals,words(quals)-1) /* Setze Last Qualif */ "VPUT (ZSCRNAME) " /* */ /* Funktionen entsprechend dem Selection Character ausführen. */ /* */ select when funktion = "E" then do "EDIT DATASETC"datei"')" if rc > 4 then call i_error "EDIT" end
21.6 Tabellenverarbeitung am Beispiel des Programms LASTED 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238
when funktion = "D" then do datei = word (translate (dsn," ","()"),1) "EDIT DATASET('"datei"')" if rc > 4 then call i_error "EDIT" end when funktion = "B" then do "BROWSE DATASET ( ' "datei" ' ) " if rc > 0 then call i_error "BROWSE" end when funktion = "V" then do "VIEW DATASET('"datei"')" if rc > 0 then call i_error "VIEW" end when funktion = "I" then do dsname = word (translate (dsn," ","()"),1) "CONTROL DISPLAY SAVE" call whohas call lastedi "CONTROL DISPLAY RESTORE" end when funktion = "M" then do datei = word (translate (dsn, " ","()"), 1) "LMINIT DATAID(ID) DATASET('"datei"') ENQ(SHR)" if rc > 0 then call i_error, "IMINIT DATAID(ID) DATASET('"datei"') ENQ(SHR)" "MEMLIST DATAID("id")" if rc > 0 then call i_error "MEMLIST Datei: "datei "LMFREE DATAID ("id") " if rc > 0 then call i_error end when funktion = "S" then do datei = word (translate (dsn," ","()"), 1) "LMINIT DATAID (ID) DATASET ("'datei"') ENQ(SHR) " if rc > 0 then call i_error, "LMINIT DATAID(ID) DATASET('"datei"') ENQ(SHR)" "MEMLIST DATAID ("id") FIELD (1) " if rc > 0 then call i_error "MEMLIST Datei: "datei "LMFREE DATAID ("id") " end when funktion = "L" then do "TBDELETE "tabname do kk = 1 to ztdsels-1 "TBDISPL "tabname if funktion = "L" then "TBDELETE "tabname end kk "TBCLOSE "tabname "LIBRARY(ISPTABL) REPLCOPY PAD(100)" iterate k end when funktion = "#" then do zcmd= "SORT DSN" iterate k end otherwise do zedsmsg = "Falsche Auswahl" zedlmsg = "Es können nur die Zeichen B,E,S,D,M,L,I,V", "eingegeben werden"copies(" ",30), "Beschreibung siehe HELP mit PF1." address "ISPEXEC" "SETMSG MSG(ISRZ001)" iterate isels end
449
450
21 Tables - Erstellen und bearbeiten
239 end /* select */ 240 241 if ztdsels > 1 then "TBDISPL "tabname 242 end isels 243 funktion = "" 244 end k 245 exit Programm
21.6.5
LASTED: Quellkode des Last Edit Programms
Die Beschreibung des Programms LASTED
Zeile 10 Der Tabellenname wird festgelegt, wobei der Namen der LP AR als Suffix benutzt wird. Zeileil Die hier beginnende DO Schleife ist die Verarbeitungsschleife für die Verarbeitung einer oder mehrerer Auswahlzeilen der Tabelle. Die Schleife wurde als DO Schleife angelegt, damit sie mittels LEAVE K gezielt verlassen werden kann. Zeile 65 Öffnen der Tabelle. Das Member „tabname" wird aus der Datei mit dem DD Namen ISPTABL gelesen und die Tabelle wird im virtuellen Speicher aufgebaut. Die Option WRITE bedeutet, dass die Tabelle nach der Verarbeitung wieder zurückgeschrieben werden kann. Die Option SHARE erlaubt es, die Tabelle in mehreren ISPF Screens gleichzeitig zu benutzen. Zeile 78 Mit TBQUERY wird die Anzahl ROWS der Tabelle ermittelt. Der zurückgegebene Wert wird als 8-stellige Zahl mit führenden Nullen in die Variable MAXX geschrieben. Zeile 80 Die Anzahl der Zeilen wird in den Variablen MAXZ und MAXC gesichert, wobei durch die Addition von Null die führenden Nullen entfernt werden. Zeilen 83 bis 98 Die Variable LESORT gibt an, nach welchen Spalten die Tabelle sortiert werden soll. Diese Variable wird im Panel LASTED in den Profile Pool des Users geschrieben. Wenn als Befehl im Panel der Text 'SORT DSN' eingegeben wurde, dann wird die Tabelle nach dem Key Feld DSN sortiert, ansonsten nach dem in der Variablen LESORT stehenden Begriff. Zeile 102 Der CRP (Current Row Pointer) wird auf die erste Zeile gesetzt.
21.6 Tabellenverarbeitung am Beispiel des Programms LASTED
451
Zeile 103 Die Tabelle wird mithilfe des Panels LASTED angezeigt. Zeile 104 Wenn bei der Anzeige des Panels die PF3 Taste gedrückt wurde, wird bei der Verarbeitung der Eingabewerte die Variable PRC auf eins gesetzt. Dadurch wird dann hier die Anwendung verlassen. Zeilen 106 bis 115 Da die Tabelle durch Aufrufe von Edit Sitzungen mit neuen DSN immer weiter anwachsen würde, habe ich eine Möglichkeit eingebaut, die Anzahl Zeilen der Tabelle zu reduzieren. Das geht dann so: Wenn im Panel der Wert MAXZ kleiner eingegeben wird, als die gegenwärtige Anzahl Zeilen angibt, dann werden vom Ende der Tabelle her so viele Zeilen gelöscht, bis der angegebene Wert erreicht ist. Zeilen 166 bis 132 Wenn man in der Command Line einen FIND Befehl eingibt (z.B. F HUGO), dann wird nach dem dort angegebenen Text gesucht und wenn der Text gefunden wurde, wird diese Zeile als oberste Zeile angezeigt. Zeilen 133 bis 144 Wenn keine Zeile ausgewählt wurde, dann wird der CRP auf die erste Zeile der Tabelle positioniert und die dort angegebene Datei wird im Edit aufgerufen. Zeile 148 Der TBDISPL Service besetzt die Variable ZTDSELS mit der Anzahl der ausgewählten Zeilen. Diese Variable wird jetzt dazu benutzt, die ausgewählten Zeilen einzeln abzuarbeiten. Dabei gilt Folgendes: Immer wenn ein Aufruf von TBDISPL nur mit der Angabe des Tabellennamens erfolgt (Zeile 159), wird die nächste ausgewählte Zeile adressiert und der Wert von ZTDSELS wird um eins reduziert. Zeilen 171 bis 217 Hier werden, abhängig vom Funktionskode in der ausgewählten Zeile, die entsprechenden Funktionen ausgeführt. Zeilen 218 bis 226 Durch die Eingabe von L in einer Zeile kann man diese Zeile explizit aus der Tabelle löschen. Falls mehrere L eingegeben wurden, werden diese Zeilen alle in dieser Schleife gelöscht. Zeile 241 So lange ZTDSELS größer eins ist, sind noch nicht alle ausgewählten Zeilen abgearbeitet. Hier wird auf die nächste ausgewählte Zeile weiter geschaltet.
22
Variables - Definieren und nutzen
In diesem Kapitel lernen Sie, wie Sie ISPF Variable definieren und nutzen. ISPF Variable sind in REXX Programmen entweder automatisch bekannt oder sie können dort bekannt gemacht werden. Hinweis Wenn Sie die Absicht haben, eine im REXX Quellkode definierte Variable auch in den aufgerufenen ISPF Services zu nutzen, dann dürfen die Variablennamen nicht länger als ACHT Zeichen sein. Der Variablen Service des les sind die hauptsächliche ten des ISPF. Programme, sam die Variablen aus den sind: • • • •
ISPF ist ein wichtiger Bestandteil dieses Systems. Dialog VariabKommunikationseinrichtung zwischen den einzelnen KomponenProzeduren, Panels, Tabellen und Skeletons können alle gemeindrei ISPF Variablen Pools nutzen. Die drei ISPF Variablen Pools
Function Pool für definierte Variable (gibt es nicht bei Benutzung von REXX) Function Pool für implizite Variable Shared Pool Profile Pool
Die Variablen sind in Gruppen, die einem bestimmten Service zugeordnet sind zusammen gefasst. Viele Variable werden durch bestimmte Services erst gesetzt. Andere Variable müssen vor dem Aufruf einer Service Funktion mit den richtigen Werten gefüllt sein, damit diese Funktion richtig arbeiten kann. Jeder Variablen Pool ist einer gestarteten ISPF Application ID zugeordnet.
22.1
Variablen Pools
Wie oben bereits erwähnt, sind die ISPF Variablen in Variablen Pools angeordnet. Dabei gibt es die folgende Unterteilung:
454
22.1.1
22 Variables - Definieren und nutzen
Function Pool
Diese Variablen sind nur für die aktuell laufende Funktion oder Gruppe von Prozeduren bekannt. Dazu gehören z.B. alle Variablen einer REXX Prozedur, deren Namen nicht länger als acht Zeichen sind, sowie die Variablen eines Panels, eines Skeletons usw. Diese Variablen nennt man „Function Variables". Jede Funktion hat ihren eigenen Satz von Variablen. Wenn eine Funktion innerhalb des ISPF in verschiedenen Ebenen parallel gestartet wird, dann existieren deren Variable mit den gleichen Namen mehrfach, aber mit unterschiedlichen Inhalten. Diese Variablen können nur dann mit anderen Funktionen ausgetauscht werden, wenn man sie in der einen Funktion in den Shared Pool schreibt und in der anderen Funktion von dort wieder liest. Wenn eine neue Funktion gestartet wird, dann kreiert das ISPF einen Function Pool für diese Funktion. Dieser Pool von Variablen wird bei Beendigung der Funktion wieder gelöscht. Eine Funktion ist ein Programm oder eine Prozedur, die mit dem SELECT Service aufgerufen werden. Das heißt, dass man Variable zwischen diesen Programmen oder Prozeduren nur über den Shared oder den Profile Pool austauschen kann.
22.1.2
Shared Pool
Im Shared Pool stehen diejenigen Variablen, die innerhalb einer Anwendung benutzt werden. Eine Variable in diesem Pool nennt man eine „Shared Variable". Der SELECT Service kreiert einen Shared Pool, wenn er die Befehle ISPSTART oder ISPF ausführt. Das Gleiche geschieht, wenn ein SELECT mit den Optionen NEWAPPL oder NEWPOOL ausgeführt wird. Eine Funktion kann Function Variables mit dem VPUT Service in den Shared Pool kopieren und eine andere Funktion in der gleichen Anwendung kann diese Variablen mit dem VGET Service wieder lesen, um sie zu benutzen.
22.1.3
Profile Pool
Die Variablen in diesem Pool werden von Sitzung zu Sitzung für jede Anwendung weiter gereicht. Das heißt, das dieser Anwendung zugeordnete Member wird beim Verlassen der Anwendung in die Datei der Profile Variablen geschrieben. Wenn die Anwendung dann später wieder gestartet wird, wird das entsprechende Member erneut eingelesen. Wenn man diese Variablen in einer Funktion benötigt, muss man sie mithilfe des VGET Service einlesen. Um sie so zu sichern, dass sie beim nächsten Start einer Funktion wieder verfügbar sind, müssen sie vor dem Verlassen der Funktion wieder mit VPUT in den Profile Pool geschrieben werden. Damit die Variablen des Profile Pools von Sitzung zu Sitzung und von Anwendung zu Anwendung verfügbar gemacht werden können, muss natürlich eine Datei existieren, in der diese Variablen gesichert werden. Diese Datei muss vor dem Start des ISPF unter dem DD Na-
455
22.2 Sicherung der Profile Members
men ISPPROF als PDS zugeordnet sein. Wenn diese Datei nicht zugeordnet ist, kann das ISPF nicht gestartet werden. Wie oben bereits erwähnt, werden die Variablen des Profile Pools anwendungsbezogen gesichert. Daraus ergibt sich auch der Membername eines Profile Members. Dieser wird wie folgt gebildet: xxxxPROF, wobei xxxx der bis zu vier Stellen lange Name der Anwendung ist. Das folgende Bild zeigt einen Ausschnitt aus der Memberliste der ISPPROF Datei meines TSO Users: BROWSE LÄNZT.ISPF.PROFILE.XYZ1 Command = > Name Prompt Size . BKMPROF . BSSEDIT . BSSEDRT . BSSPROF . CA7EDIT . CA7PROF . ISFEDIT - ISFPROF . ISPPROF . ISREDIT . ISRPERT . ISRPLIST . ISRPROF . ISRRLIST . QWIKPROF . QWRFPROF **End**
Created
Row 00001 of 00029 Scroll = = > CSR Changed ID
Abbildung 130 Members der ISPF Profile Datei
Ich habe die Profile Member grau unterlegt. Die Profile Member werden als ISPF Tabellen angelegt und verarbeitet.
22.2
Sicherung der Profile Members
Immer wenn eine Anwendung verlassen wird, wird das zugehörige Profile Member in die Profile Datei zurückgeschrieben. Das Member ISPPROF wird erst dann zurückgeschrieben, wenn das ISPF selbst beendet wird. Hinweis Falls das ISPF, aus welchem Grund auch immer, nicht ordnungsgemäß beendet werden kann oder abbricht, werden die gerade aktiven Profile Member nicht zurückgeschrieben. Dies bedeutet, dass nach einem Neustart des ISPF die vor dem Abbruch gemachten Änderungen in den Profilen nicht mehr vorhanden sind. Das Gleiche gilt, wenn eine einzelne Anwendung abbricht. In diesem Fall wird deren Profil Member nicht gesichert.
456
22.3
22 Variables - Definieren und nutzen
Die Erstellung eines Profile Members
Wenn das ISPF gestartet wird oder eine neue Anwendung aufgerufen wird, dann sucht das ISPF nach einem Profile Member wie folgt: 1. Zuerst wird der User Profile, der mit dem DD Namen ISPPROF zugeordnet ist, nach dem Member xxxxPROF durchsucht. Wenn das Member dort gefunden wird, dann wird es geladen und die darin enthaltenen Profile Variablen stehen der Anwendung zur Verfügung. Das heißt, sie können jetzt mit VGET gelesen und mit VPUT wieder zurückgeschrieben werden. 2. Wenn das Profile Member nicht gefunden wird, dann wird der Table Input File mit dem DD Namen ISPTLIB nach dem Member durchsucht. Wird es dort gefunden, dann wird es auch verwendet und beim Schließen der Anwendung oder des ISPF in die ISPPROF Datei zurückgeschrieben. 3. Wird auch über ISPTLIB kein zur gestarteten Anwendung passendes Member gefunden, dann wird der Inhalt des Standard Profile Members ISPPROF gelesen und in den Variablen Pool für diese Anwendung kopiert. Beim Schließen der Anwendung wird dann das Member mit dem zur Anwendung passenden Namen in die ISPPROF Datei zurückgeschrieben. Hinweis Wie wir bereits im vorderen Teil dieses Buches besprochen haben, wird am Ende der LOGON Prozedur das ISPF aufgerufen. Dies kann mit drei verschiedenen Befehlen geschehen: 1. ISPSTART PANEL(name) NEWAPPL(appl) 2. PDF 3. ISPF. Erfolgt der Aufruf mit PDF oder ISPF, dann wird intern der folgende Befehl abgesetzt: ISPSTART PANEL(ISP@PRIM) NEWAPPL(ISR). Diese Art des Aufrufs des ISPF führt dazu, dass die Standard APPLID des ISPF die ID ISR ist. Das bedeutet, dass das Member ISRPROF als Standard ISPF Profile Member benutzt wird. Falls Sie also Ihr ISPF mit der APPLID ISP betreiben wollen, dann müssten Sie Ihr ISPF mit folgendem Befehl aufrufen: ISPSTART PANEL(ISP@PRIM) NEWAPPL(ISP).
22.4
SWAP LIST - Anzeige der aktiven Anwendungen
Ich habe in meinem TSO User einige Anwendungen im ISPF gestartet. Daraufhin habe ich nachgesehen, welche Profile Members jetzt geladen sind. Hier zunächst die Anzeige über die gestarteten Anwendungen. Diese Anzeige habe ich mit dem ISPF Befehl SWAP LIST erzeugt.
22.4 SWAP LIST - Anzeige der aktiven Anwendungen Menu I |
Options
I | I
Start a new screen Start a new application Application Name ID 1 2 3 45* 6
457
View
Utilities Compilers Help ISPF Task List Active ISPF Logical Sessions
Name SDSF ISRDDN
Panelid ISFPCU41 ISRDENQG PG92PRIM QWIKREFD ISRUDSLO EQ2MMENU
$ LANZT SMQPROD
Applid ISF I SR BSS QWIK ISR SMQP
Session Type 3270 3270 3270 3270 3270 3270
Abbildung 131 Liste der offenen ISPF Ebenen nach Aufruf des Befehls SWAP LIST
Wenn diese Anwendungen gestartet sind, dann müssen auch alle zu diesen Anwendungen gehörenden Profile geladen sein. Dies kann man sehr leicht überprüfen, indem man nachschaut, welche ENQs auf die Datei mit den Profile Members existieren. Am Einfachsten ist das mit dem Utility ISRDDN zu ermitteln. Ich habe also ISRDDN aufgerufen, dann in der Command Line ENQ eingegeben. In dem dann erscheinenden Panel habe ich in der Zeile Minor name prefix den Dateinamen meiner Profile Datei LANZT.ISPF.PROFILE . LPRT angegeben und ENTER gedrückt. Danach wurden folgende ENQs angezeigt: System ENQ Status
Command = = > Scroll Major name prefix . Minor name prefix . Address id prefix . System prefix Major Minor SPFEDIT SPFEDIT SPFEDIT SPFEDIT SPFEDIT SPFEDIT SPFEDIT SPFEDIT SPFEDIT SPFEDIT SPFEDIT SYSDSN
| | | | | | | | | | | ]
LANZT LANZT LANZT LANZT LANZT LANZT LANZT LANZT LANZT LANZT LANZT LANZT
Row 1 of 12 Scroll = > CSR
LEFT or RIGHT to see type or system name. . . (SYSDSN, SPFEDIT, etc) . . LANZT.ISPF.PROFILE.LPRT . . (Job name, User id, etc) (System name)
ISPF ISPF ISPF ISPF ISPF ISPF ISPF ISPF ISPF ISPF ISPF ISPF
PROFILE PROFILE PROFILE PROFILE PROFILE PROFILE PROFILE PROFILE PROFILE PROFILE PROFILE PROFILE
Abbildung 132 ENQ Display with ISRDDN
LPRT LPRT LPRT LPRT LPRT LPRT LPRT LPRT LPRT LPRT LPRT LPRT
BSSPROF ISFPROF ISPPROF ISPSPROF ISREDIT ISREDRT ISRLLIST ISRPLIST ISRPROF SMQPPROF QWIKPROF
(dsn etc) Job Name LANZT LANZT LANZT LANZT LANZT LANZT LANZT LANZT LANZT LANZT LANZT LANZT
458
22 Variables - Definieren und nutzen
Wie Sie sehen, sind für alle geöffneten Anwendungen die dazugehörigen Profile Member geladen.
22.5
Der System Profile Pool
Das ISPF enthält eigene Variable, die vom Benutzer zwar benutzt, aber nicht überschrieben werden können. Diese Variablen sind immer vorhanden. Sie sind in dem Member ISPSPROF gespeichert. Dieses Member wird beim Start des ISPF immer geladen. Der System Profile Pool ist hinter dem Standard ISPF Profile Pool angeordnet. Wenn man also eine Variable aus dem System Profile Pool liest, kann man sie in den Standard Profile Pool zurückschreiben. Allerdings muss man dabei folgendes beachten: Tipp Wenn man eine Variable aus dem System Profile Pool gelesen und verändert in den Standard Profile Pool zurückgeschrieben hat, kommt man an die ursprüngliche Variable im System Profile Pool so lang nicht mehr heran, bis man diese Variable aus dem Standard Profile Pool mit VERASE gelöscht hat. Hinweis In der IBM Broschüre ISPF Dialog Developers's Guide and Reference gibt es verschiedene Anhänge, in denen sämtliche Standard ISPF Variablen beschrieben sind.
22.5.1
Häufig benötigte ISPF Variable
Wie bereits weiter oben erwähnt, gibt es viele ISPF Variable, die erst beim Aufruf bestimmter Services zur Verfügung gestellt werden. Diese Variablen sind bei der Beschreibung der jeweiligen Services zu finden. Es gibt aber eine ganze Reihe von ISPF Variablen, die man bei der Erstellung von Anwendungen im ISPF immer wieder gut gebrauchen kann. Wenn Sie diese Variablen in einem REXX Programm verwenden wollen, dann müssen Sie die entsprechenden Variablen mit dem Befehl „ISPEXEC VGET (namel, name2, ...)" einlesen. Siehe hierzu das Kapitel „ISPF Variable verarbeiten" ab Seite 460. Ich habe in den beiden folgenden Tabellen eine Auswahl der ISPF Systemvariablen aufgelistet, die man am häufigsten benutzt:
22.5 Der System Profile Pool
459
Allgemeine Variable: Variable Z ZCMD
Typ Char Char
ZAPPLID ZDEL ZENVIR ZISPFRC
Char Char Char Num
ZLANG ZLOGON ZPANELID ZPREFIX ZSCREENW ZSCREENC ZSCREENI
Char Char Char Char Num Num Char
Länge Inhalt 0 Null Variable. Wird sehr häufig zum Vergleichen benutzt. 256 Enthält den in der Command Line eines ISPF Panels eingegebenen Befehl, falls es sich dabei nicht um einen ISPF Befehl handelt, um zu einem bestimmten Panel zu verzweigen (Z.B. 3.14). 8 Name der Anwendung. 1 Trennzeichen für Befehlsverkettungen im ISPF. 32 ISPF Environment Beschreibung. 8 Dient zur Übergabe des Return Codes beim Verlassen einer ISPF Funktion. 8 Enthält die Sitzungssprache. 8 Step Name der TSO Logon Prozedur. 8 Name des gerade angezeigten Panels. 8 TSO User Präfix. 4 Breite einer Zeile der Panel-Anzeige. 5 Position des Cursors innerhalb des Strings ZSCREENI. ? String des gesamten sichtbaren Fensters.
Tabelle 44 Allgemeine Z Variable
System Variable, die Datum und Uhrzeit enthalten: Variable ZDATE
Typ Char
ZDATEF ZDATEFD ZDATESTD ZDAYOFWK ZDAY ZJDATE ZJ4DATE ZMONTH ZSTDYEAR ZTIME ZTIMEL ZYEAR
Char Char Char Char Char Char Char Char Char Char Char Char
Länge Inhalt 8 Gegenwärtiges Datum in der Form, wie es durch ZDATEF und ZDATEFD bestimmt ist. 8 Gegenwärtiges Datumsformat. 8 Das Datumsformat im nationalen Sprachformat. 8 Datum mit vierstelliger Jahreszahl. 8 Wochentag. 2 Tag im Monat. 6 Tag im Jahr (Julian Day) in der Form JJ.DDD. 8 Tag im Jahr (Julian Day) in der Form JJJJ.DDD. 2 Monat. 4 Jahr vierstellig. 5 Zeit in der Form HH:MM. 11 Tageszeit in der Forma HH:MM:SS:zz. zz=l/100 Sek. 2 Jahr.
Tabelle 45 Z Variable fiir Datum und Uhrzeit
460
22 Variables - Definieren und nutzen
22.5.2
ISPF Variable verarbeiten
Es gibt nur genau drei Befehle, mit denen man ISPF Variable mit REXX bearbeiten kann. Dies sind: VGET VPUT VERASE
-> Variable lesen. Variable schreiben. Variable löschen.
Als einziger Parameter kann noch angegeben werden, in welchem Pool die Manipulation der genannten Variablen erfolgen soll. Formate der drei Befehle VGET
(name-list) ASIS | SHARED | PROFILE
ASIS Die Variable wird zunächst im SHARED Pool gesucht. Wenn sie dort nicht gefunden wird, erfolgt die Suche im Profile Pool. SHARED Die Variable wird nur im SHARED Pool gesucht. Wenn sie dort nicht gefunden wird, endet der Befehl mit einem RC = 8. PROFILE Die Variable wird nur im PROFILE Pool gesucht. Wenn sie dort nicht gefunden wird, endet der Befehl mit einem RC = 8 und eine gleichnamige Variable im SHARED Pool wird gelöscht. VPUT
(name-list) ASIS | SHARED | PROFILE
ASIS Die Variable wird in den Pool geschrieben, in dem sie bereits existiert. Wenn sie noch nirgends vorhanden ist, wird sie in den SHARED Pool geschrieben. Wenn sie sowohl im SHARED Pool als auch im PROFILE Pool schon vorhanden ist, wird sie nur im SHARED Pool geändert. SHARED Die Variable wird nur in den SHARED Pool geschrieben. PROFILE Die Variable wird nur in den PROFILE Pool geschrieben. Eine gleichnamige Variable im SHARED Pool wird gelöscht. VERASE
(name-list) ASIS
| SHARED
| PROFILE
| BOTH
ASIS Die Variable wird aus dem SHARED Pool gelöscht. Wenn sie dort nicht vorhanden ist, wird versucht, sie aus dem PROFILE Pool zu löschen.
22.5 Der System Profile Pool
461
SHARED Die Variable wird aus d e m S H A R E D Pool gelöscht.
PROFILE Die Variable wird aus d e m P R O F I L E Pool gelöscht.
BOTH D i e V a r i a b l e w i r d s o w o h l a u s d e m S H A R E D als a u c h a u s d e m P R O F I L E P o o l g e l ö s c h t . Hinweis A l l e R E X X V a r i a b l e , d e r e n N a m e n i c h t m e h r als a c h t Z e i c h e n h a b e n , s i n d i m F u n c t i o n P o o l a u t o m a t i s c h b e k a n n t . Will m a n e i n e V a r i a b l e in d e n S H A R E D o d e r P R O F I L E P o o l schreiben, dann m u s s dies explizit mit e i n e m V P U T Befehl geschehen. Beispiel U m e i n i g e d e r I S P F V a r i a b l e n a n z u z e i g e n , h a b e ich e i n e k l e i n e R E X X P r o z e d u r g e s c h r i e -
01 02 03 04 05 06 07 08
/* DOC: REXX ZVARS */ /* DOC: Ausdruck einiger Z Variablen aus dem ISPF Variablenpool */ /* (c) LANZT am: 13 Jul 2004 */ /*********************************************************************/ address "ISPEXEC" "VGET (ZDATE ZDATE ZDATEF ZDATEFD ZDATESTD ZDAYOFHK ZDAY ZJDATE", "ZJ4DATE ZMONTH ZSTDYEAR ZTIME ZTIMEL ZYEAR ZUSER ZLOGON "ZSYSID ZAPPLID ZDEL ZENVIR ZLANG ZPANELID ZPFEFIX) "
10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
say say say say say say say say say say say say say say say say say say say say say say
" ZDATE "ZDATEF "ZDATEFD "ZDATESTD "ZDAYOFHK " ZDAY "ZJDATE "ZJ4DATE "ZMONTH "ZSTDYEAR "ZTIME "ZTIMEL "ZYEAR "ZUSER "ZLOGON "ZSYSID "ZAPPLID " ZDEL "ZENVIR "ZLANG "ZPANELID "ZPREFIX
= "ZDATE =
= =
= = =
= = = = = = = = = = = = = = =
"ZDATEF "ZDATEFD "ZDATESTD "ZDAYOFHK "ZDAY "ZJDATE "ZJ4DATE "ZMONTH "ZSTDYEAR "ZTIME "ZTIMEL "ZYEAR "ZUSER "ZLOGON "ZSYSID "ZAPPLID " ZDEL "ZENVIR "ZLANG "ZPANELID "ZPREFIX
Programm 54 ZVARS: Anzeigen von Z Variablen
462
2 2 Variables - Definieren und nutzen
Ich habe diese Prozedur ausgeführt und folgendes Ergebnis erhalten: ZDATE ZDATEF ZDATEFD ZDATESTD ZDAYOFWK ZDAY ZJDATE ZJ4DATE ZMONTH ZSTDYEAR ZTIME ZTIMEL ZYEAR ZUSER ZLOGON ZSYSID ZAPPLID ZDEL ZENVIR ZLANG ZPANELID ZPREFIX
= = = = = =
= = = = = = = = = = = = =
04/07/13 YY/MM/DD YY/MM/DD 2004/07/13 Tuesday 13 04.195 2004.195 07 2004 14:58 14:58:12.66 04 LANZT LOGONXX LPRT ISR
ISPF 5.2MVS ENGLISH = ISREDDE4 =
=
23
Edit Makros - Einführung
In diesem Kapitel lernen Sie, wie man Edit Makros erstellt und benutzt. Mit Edit Makros kann man immer wiederkehrende Arbeiten schnell und elegant erledigen. Zur optimalen Nutzung des ISPF Editors sind Edit Makros meiner Meinung nach unverzichtbar. Nachdem wird uns im ersten Teil dieses Buches bereits ausfuhrlich mit der Bedienung des ISPF Editors beschäftigt haben, wollen wir nun einen weiteren, sehr interessanten Teil des ISPF Editors kennen lernen. Es gibt viele Tätigkeiten im ISPF, bei denen man sich eine gewisse Automatisierung wünscht. Dies sind zum Beispiel die Aufbereitung und der SUBMIT von Batch Jobs, die Bearbeitung von Ausgabelisten usw. Für solche Aufgaben ist die Verwendung von Edit Makros eine sehr schöne Hilfe, die so manche Arbeit extrem erleichtern und beschleunigen kann. In den diesem Buch beiliegenden LANZ Utilities ist eine ganze Reihe von solchen nützlichen Makros enthalten. In der Literatursammlung zum ISPF gibt es eine Broschüre, in welcher neben der Beschreibung der Bedienung des Editors auch die Erstellung von Edit Makros beschrieben ist. Diese Broschüre heißt: ISPF Edit and Edit Macros. Die Broschüre hat ungefähr 450 Seiten, ca. 150 Seiten davon behandeln die Programmierung von Makros. Daran können Sie erkennen, dass ich jetzt die Aufgabe habe, Ihnen eine möglichst kompakte Einfuhrung in die Erstellung von Edit Makros zu geben. Damit dies gelingt, werde ich auch in diesem Fall, wie in den vorherigen Kapiteln, versuchen, Ihnen an Hand von anschaulichen Beispielen die Makro Programmierung schmackhaft zu machen.
23.1
Was ist ein Edit Makro?
Ein Edit Makro ist eine REXX Prozedur, die neben den REXX Befehlen auch spezielle Befehle für den ISPF Editor enthält. Diese Edit Befehle werden unter dem ADDRESS Label ISREDIT an den ISPF Editor zur Ausführung übergeben. Selbstverständlich können in einem Edit Makro auch alle anderen Befehle, die in REXX Prozeduren möglich sind, vorkommen. Edit Makros können folgendermaßen zur Ausführung kommen: •
Indem man in der Command Line des ISPF Editors den Namen der Edit Makro Prozedur eingibt. Dies ist die normale Art, Edit Makros auszuführen.
464
23 Edit Makros - Einführung
•
Durch das ISPF Statement "EDIT DATASET(dsn) MACRO(name)" innerhalb einer REXX Prozedur.
•
Indem man für den Aufruf des ISPF Editors Initial- und End-Makros definiert.
Tipp Edit Makros zu schreiben, ist eine der anspruchvollsten Aufgaben bei der Erstellung von REXX Prozeduren im ISPF Umfeld. Deshalb gebe ich Ihnen hier eine Empfehlung mit, die ich von einem von mir sehr geschätzten Kollegen in der IBM Schule bekommen habe, als ich begann, meine ersten Edit Makros zu schreiben. Er sagte: „Du musst zuerst alle Befehle Deines Makros online im ISPF Editor an einer Beispieldatei von Hand eingeben und so Dein Makro durchspielen!" Ich kann Ihnen nur empfehlen, diesem Rat genau so zu folgen, wie ich es bisher immer tue. Ich habe damit die besten Erfahrungen gemacht.
23.1.1
Namenskonventionen für Edit Makros
Die Namen von Edit Makros müssen lediglich denjenigen von REXX Prozeduren entsprechen. Ich habe aber im Laufe meiner Arbeit im ISPF festgestellt, dass es durchaus von Vorteil sein kann, wenn man für die Edit Makros eine Namenskonvention festlegt. Der Vorteil liegt nämlich darin, dass man die Edit Makros schon von ihrem Namen her von den übrigen REXX Prozeduren unterscheiden kann. Ich lasse die Namen meiner Edit Makros immer mit dem #-Zeichen beginnen. Das hat den Vorteil, dass alle meine Edit Makros in der REXX Prozeduren Datei direkt hintereinander stehen. Falls ich einmal eine Vorlage für ein neues Makro suche, dann brauche ich nur in den Members nachzuschauen, die mit #-Zeichen beginnen. Außerdem ist damit auch völlig klar, dass man Prozeduren, die mit dem #-Zeichen beginnen, niemals wie eine „normale" Prozedur aufrufen darf, denn die Befehle, die an den Editor gerichtet sind, können vom REXX Prozessor nicht weitergereicht werden, weil der Editor ja gar nicht aktiv ist. Falls ein Edit Makro innerhalb einer REXX Prozedur mit dem Befehl EDIT aufgerufen wird, nenne ich es genauso, wie die aufrufende REXX Prozedur. Ich erzeuge bei der Erstellung des Makros den Makronamen aus dem Namen der zugehörigen REXX Prozedur, indem ich lediglich ein #-Zeichen voran stelle.
23.1.2
Beispiel eines Edit Makros
Bevor wir in die Einzelheiten der Edit Makro Programmierung einsteigen, möchte ich Ihnen anhand eines einfachen Beispiels zeigen, was ein Edit Makro leisten kann. Beispiel Wir haben im vorderen Teil des Buches über die ISPF Funktion SRCHFOR gesprochen. Diese Funktion kann man nutzen, um in einer angezeigten DSLISTe alle dort stehenden DSN nach beliebigen Begriffen zu durchsuchen. Wenn die Suche erfolgreich war, dann wird eine Liste der Ergebnisse im VIEW Mode angezeigt. Diese Liste ist mir etwas zu sehr mit überflüssigen Zeilen durchsetzt. Das führt dazu,
465
23.1 Was ist ein Edit Makro?
dass die Liste unübersichtlich ist. Da mich das schon vor langer Zeit gestört hat, habe ich damals bereits ein Edit Makro geschrieben, das die überflüssigen Zeilen entfernt. Hier zunächst eine kleine Liste wie sie vom Super Search Programm ISRSUPC erzeugt wird: 01 02
ISRSUPC MVS/PDF FILE/LINE/WORD/BYTE/SFOR COMPARE UTILITY- ISPF F LINE-# SOURCE SECTION SRCH DSN: PEVX.BUCH.REXX
05 06 07 08
$PDSHIST
10
CHANGET
STRING (S) FOUND
15 WILLI 211 WILLI
01.00 NEW LANZT PEVX. $040426 . $235608 .BUCH.REXX 01.00 DEL STRING (S) FOUND
11
12 13 14 15 16 17 18 19 20 21 22 46 48 49 50 51 52
6 7 8
say "1. >"change("Hugo und Willi sind da","Willi","Albert")""change("Hugo und Willi sind da","Willi","Herbert","un say "3. >"change("Hugo und Willi sind da","Willi","Herbert","sc
OVERLAY
STRING (S) FOUND
6 7 8 9
say say say say
»"overlay("Albert","Hugo »"overlay("Albert","Hugo »"overlay("Albert","Hugo »"overlay("Albert","Hugo
SKELTST 58 59
und und und und
Willi Willi Willi Willi
sind da",10)" 0 then leave i 47 "(cl,cc) = cursor" 48 if cc > 1 then "shift ( .zcsr "cc-1 49 "(Z) = LINE .ZCSR" 50 "LINE .ZCSR = "'strip(z) copies ("*",60) "'" 51 "LABEL .ZCSR = .A"
467
23.1 Was ist ein Edit Makro? 52 53 54 55 56 57 58 59 60 61 62 63 64
cl = ol + 1 "(NZ) = LINE "cl if word(nz,l) = "SRCHFOR" then do "LABEL "cl" = .B" "DELETE .A .B" "CURSOR = "cl-2 CC end else "RESET LABEL" end i "RESET" "CURSOR = 1 1 " "FIND 'SRCH DSN:'" exit 1 /* Cursor steht in der Command Line
*/
Programm 55 #SS: Edit Makro zur Listenbereinigung
Beschreibung der einzelnen Statements: Zeile 11 Durch die Anweisung "ISPEXEC CONTROL ERRORS RETURN" wird erreicht, dass das ISPF eventuell auftretende Fehler zurückmeldet. Zeile 12 Es wird das Address Fenster dauerhaft auf ISREDIT gesetzt, da ich in dieser REXX Prozedur nur externe Befehle zum Edit Makro Prozessor schicken möchte. Zeile 13 Der MACRO Befehl muss abgesetzt werden, bevor irgendein anderer Edit Makro Befehl auftaucht. Natürlich können vor dem MACRO Befehl beliebige andere REXX Befehle stehen. Zeilen 17 bis 21 Alle Zeilen, die gelöscht werden sollen, werden EXCLUDED. Zeile 22 Alle ausgeschlossenen Zeilen werden gelöscht. Zeilen 25 bis 30 Die Zeilen, in denen der Schlüsselbegriff „LINES-FOUND" steht, werden einzeln gesucht. Bei jedem Auffinden einer solchen Zeile, werden diese Zeile und die darauf folgende Zeile gelöscht. Zeilen 34 bis 38 Am Beginn des editierten Textes wird ein kleiner Rahmen eingefugt, der darauf hinweist, dass dieser Text vom Makro #SS verändert worden ist.
468
23 Edit Makros - Einführung
Zeilen 44 bis 60 Die Zeilen mit dem Text SRCH DSN: werden so bearbeitet, dass nur solche Einträge von Members übrig bleiben, in denen der Suchbegriff gefunden wurde. Zeile 62 Der Cursor wird auf die erste Zeile der Datei gesetzt. Zeile 63 Dieser FIND Befehl sorgt dafür, dass alle Zeilen, die den Text SRCH DSN: enthalten, invers dargestellt werden. Dadurch kann man in der Liste leicht erkennen, wo ein neuer DSN beginnt und endet. In der Ergebnisliste weiter unten sind die inversen Stellen grau unterlegt. Zeile 64 Wenn man ein Edit Makro mit EXIT 1 verlässt, dann steht der Cursor nach dem Makro Aufruf in der Command Line des Edit Panels. Hier nun die Liste, nachdem das Makro #SS sie bearbeitet hat: 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
************************************************************************ * List Datei wurde vom Makro #SS optimiert * ************************************************************************ SRCH DSN: PEVX.BUCH.REXX *********************************************** $PDSHIST 15 WILLI 01.00 NEW LANZT PEVX.$040426.$235608.BUCH.REXX 211 WILLI 01.00 DEL CHANGET 6 say "1. >"change("Hugo und Willi sind da","Willi","Albert")""change("Hugo und Willi sind da","Willi","Herbert","un 8 say "3. >"change("Hugo und Willi sind da","Willi","Herbert","sc OVERLAY 6 say "1. >"overlay("Albert","Hugo und Willi sind da",10)""overlay("Albert","Hugo und Willi sind da")""overlay("Albert","Hugo und Willi sind da",10,12)""overlay("Albert","Hugo und Willi sind da",10,15,"*")" QUICKSRT 8 "HEINRICH WILLI HUGO HORST ULLA FRITZ FRANZ HEINZ THOMAS" VALUE 7 val2 = "WILLI" SRCH DSN: PEVX.BUCH.REXX *********************************************** SRCH DSN: PEVX.LANZ.REXX *********************************************** SKELTST 58 nn = "WILLI"ls 59 "FTCLOSE NAME(WILLI"ls")" SRCH DSN: PEVX.LANZ.REXX ***********************************************
Wie Sie sehen können, hat die Liste jetzt statt 60 nur noch 26 Zeilen und sie ist auch übersichtlicher geworden. Sie haben in diesem Beispiel schon einen guten Einblick in die Art und Weise gewonnen, wie man Edit Makros schreibt und wofür sie nützlich sein können.
469
23.2 Tabelle der Edit Makro Befehle
23.2
Tabelle der Edit Makro Befehle
Befehle AUTOLIST [ON ] [OFF] (varname) = AUTOLIST AUTONUM [ON ] [OFF] (varname) = AUTONUM AUTOSAVE [ON] [OFF PROMPT ] [OFF NOPROMPT] (varl,var2) = AUTOSAVE (varname) = BLKSIZE BOUNDS [left-col right-col] (varl,var2) = BOUNDS BROWSE member BUILTIN cmdname
CANCEL CAPS [ON ] [OFF] (varname) = CAPS CHANGE string-1 string-2 [label-range] [X] [NX] [ALL] [NEXT] [CHARS] [coll col2] [PREFIX] [SUFFIX] [FIRST] [LAST] [WORD] [PREV] (varl,var2) = CHANGE_COUNTS.
COMPARE {dsn|NEXT|SESSION|*} [{EXCLUDE} {SAVE} {SYSIN}] COPY member {AFTER} lptr [1inenum-range] (member) {BEFORE} dsn CREATE member lptr-range (member) {range} dataset(member) {range}
Beschreibung Schaltet die AUTOLIST Option ein oder aus bzw. stellt deren Status in varname. Schaltet die AUTONUM Option ein oder aus bzw. stellt deren Status in varname. Setzt den AUTOSAVE Modus bzw. gibt dessen Status zurück. Stellt die Block Size der editierten Datei in varname. Setzt die linke und rechte Textbegrenzung bzw. stellt diese Grenzen zur Verfügung. Ruft ein im gleichen PDS stehendes Member im BROWSE auf. Führt einen Makro Befehl in seiner Originalform aus, auch wenn er mittels DEFINE xxx ALIAS auf einen anderen Namen umgesetzt wurde. Beendet eine Edit Sitzung ohne die Daten zu sichern. Setzt den CAPS Modus bzw. stellt dessen Status in die Variable varname. Ändert Daten.
Gibt die Anzahl der durch das zuletzt ausgeführte CHANGE erfolgreichen (varl) und nicht erfolgreichen (var2) Änderungen zurück. Vergleicht eine andere Datei mit der gerade editierten. Kopiert ein Member oder eine Datei in die gerade editierte Datei. Erstellt eine neue Datei aus der gerade editierten Datei.
Tabelle 46 Edit Makro Befehle - Teil 1: A UTOLIST - CREA TE
470
23 Edit Makros - Einfuhrung
Beschreibung Setzt Zeile und Spalte der Cursor Position in zwei Variable bzw. setzt den Cursor an eine bestimmte Stelle. CUT [lptr-range] Kopiert einen ausgewählte Anzahl Zeilen in [DEFAULT | clipboardname] die Edit Zwischenablage. [REPLACE | APPEND] (varname) = DATA_CHANGED Stellt den DATA CHANGED Status (YES | NO) in eine Variable. (varname) = DATA_WIDTH Stellt die Datenbreite der editierten Datei bereit. (varname) = DATAID Stellt die DATAID der temporären internen Datei des Editors bereit. (varl,var2,var3) = DATASET Stellt den DSN der editierten Datei bereit. DEFINE name {MACRO CMD } • Ordnet einen ALIAS zu einem Makro {MACRO PGM } oder Befehl zu. {ALIAS name-2} • Blockiert die Nutzung eines Makros oder {NOP } Befehls. {RESET } • Setzt einen Makro Namen einem Befehl {DISABLED } gleich. • Identifiziert Makros als solche. DELETE {ALL X|NX [lptr-range]} Löscht eine Anzahl Zeilen. {[ALL] X|NX lptr-range} {lptr} {lptr-range} (varl,var2) = DISPLAY_COLS Gibt die erste und letzte Spalte im Panel zurück. (varl,var2) = DISPLAY_LINES Ermittelt die erste und letzte Zeile wenn ein Makro endet. DOWN amt Verschiebt den Cursor nach unten. EDIT member Editiert ein weiteres Member aus dem gleichen PDS. END Beendet die Edit Sitzung und sichert dabei die Datei. EXCLUDE string [label-range] Macht die ausgewählten Zeilen unsichtbar. [NEXT ] [CHARS ] Diese können dann mit der Option X [col—1 [col-2]] (=excluded) in Bearbeitungsbefehlen ange[ALL] [PREFIX] [SUFFIX] sprochen werden. [FIRST] [LAST] [WORD] (varl,var2) = EXCLUDE_COUNTS Ermittelt die Anzahl der ausgeschlossenen Zeilengruppen (varl) und die Anzahl der ausgeschlossenen Zeilen (var2). Befehle (varl,var2) = CURSOR CURSOR = lptr [col]
Tabelle 47 Edit Makro Befehle - Teil 2: CURSOR -
EXCLUDE^COUNTS
471
23.2 Tabelle der Edit Makro Befehle Befehle FIND string [label-range] [NEXT] [ALL] [X] [NX] [CHARS] [col—1 [col-2]] [PREFIX] [SUFFIX] [FIRST] [LAST ] [WORD] [PREV] (varl,var2) = FIND_COUNTS
FLIP
[label-range]
(varl,var2) = FLOW_COUNTS HEX [ON DATA] [ON VERT] [OFF] (varl,var2) = HEX HILITE [ON] [AUTO] [RESET] [PAREN] [FIND] [CURSOR] [SEARCH] [DISABLED] [OFF] [DEFAULT] [LOGIC] [OTHER] [IFLOGIC] [ASM] [DOLOGIC] [BOOK] [NOLOGIC] [C] [COBOL] [DTL] [JCL] [PANEL] [PASCAL] [PLI] [REXX] [SKEL] IMACRO {name | NONE} (varname) = IMACRO INSERT lptr [numlines]
Beschreibung Sucht nach den in STRING angegebenen Daten. Falls solche Daten in excluded Lines gefunden werden, werden diese Lines included. Der SEEK Befehl sucht dagegen nur in den sichtbaren Zeilen. Ermittelt nach einem FIND oder RFIND die Anzahl der gefundenen Werte insgesamt (varl) und die Anzahl Zeilen, in denen Werte gefunden wurden (var2). Schaltet zwischen den Anzeigen mit ausgeschlossenen und sichtbaren Zeilen hin und her. Gibt die Werte der letzten TFLOW Anweisung zurück. Setzt den Hexadezimal Mode oder gibt dessen gegenwärtigen Status zurück. Setzen der HILITE Charakteristik. Hiermit wird der COLORED CODE für den Editor gesetzt. Die hiermit definierte Charakteristik bezieht sich auf alle Dateien mit dem gleichen LLQ.
Setzen oder ermitteln des Initial Makros.
Setzen von numlines Leerzeilen für die Eingabe von Daten. LABEL lptr = labelname [level] Setzen oder ermitteln der Werte für Line (varl,var2) = LABEL lptr Pointer. LEFT amt Panel nach links verschieben. LEVEL num Setzen oder ermitteln des Modification Le(varname) = LEVEL vel der Datei. LINE lptr = data Ersetzen einer Zeile oder übertragen der Da(varname) = LINE lptr ten einer Zeile in eine Variable. LINE_AFTER lptr = [DATALINE] Eine Zeile hinter einer vorhandenen Zeile data einfügen. [INFOLINE] [MSGLINE ] [NOTELINE] LINE_BEFORE lptr = [DATALINE] Eine Zeile vor einer vorhandenen Zeile eindata [INFOLINE] [MSGLINE ] fügen. [NOTELINE] Tabelle 48 Edit Makro Befehle - Teil 3: FIND - LINE BEFORE
472 Befehle (varname) = LINE_STATUS lptr (varname) = LINENUM label LOCATE lptr LOCATE lptr-range] {CHANGE} {COMMAND} [NEXT] {ERROR} [PREV] [LAST] [FIRST] {EXCLUDED} {LABEL} {SPECIAL} {INFOLINE} {MSGLINE} {NOTELINE} (varname) = LRECL MACRO [(varl [, var2,...])] [PROCESS] [NOPROCESS] (varname) = MACRO LEVEL
23 Edit Makros - Einfuhrung Beschreibung Ermitteln des Zeilen-Status. Ermittelt die Zeilennummer zu einer Zeilenadresse. Setzt den CURSOR auf den Anfang einer durch die Operanden ausgewählten Zeile.
Gibt die LRECL der editierten Datei zurück. Startet die Makro Verarbeitung in einer REXX Prozedur. Ermittelt die Staffelungstiefe der aufgerufenen Makros. MASKLINE = data Setzt oder ermittelt die Struktur einer Mas(varname) = MASKLINE kenzeile. (varname) = MEMBER Ermittelt den Namen des Members, das gerade editiert wird. MODEL model-name [qualifier] Kopiert ein Dialog Model in die editierte {AFTER } {BEFORE} lptr [NOTES] Datei. [NONOTES] MODEL CLASS class-name MOVE member {AFTER} {BEFORE} Verschiebt eine externe Datei in die editierte lptr (member)|data set name| Datei. data.set.name(member) NONUMBER Schaltet die Zeilennummerierung aus. NOTES [ON ] [OFF] Setzt oder ermittelt den NOTES Mode. (varname) = NOTES NULLS [ON STD] [ON ALL] [OFF] Setzt oder ermittelt den NULLS Mode. (varl,var2) = NULLS NUMBER [ON] [OFF] [STD] Setzt oder ermittelt den NUMBER Mode. [DISPLAY] [COBOL] [STD COBOL] [NOSTD] [NOCOBOL] [NOSTD NOCOBOL] (varl,var2) = NUMBER PACK [ON] [OFF] Setzt oder ermittelt den PACK Mode. (varname) = PACK PASTE [AFTER] lptr Kopiert oder verschiebt Daten aus der Zwi[clipboardname] [BEFORE][KEEP] schenablage in die editierte Datei. PRESERVE [ON] [OFF] Setzt oder ermittelt den PRESERVE Mode. (varname) = PRESERVE Tabelle 49 Edit Makro Befehle - Teil 4: LINEJSTA TUS - PRESER VE
473
23.2 Tabelle der Edit Makro Befehle Befehle PROCESS [DEST] [RANGE cmdl [cmd2]] PROFILE [name] [number] PROFILE {LOCK | UNLOCK) RESET (varl,var2) = PROFILE (varname) = RANGE CMD RCHANGE (varname) = RECFM RECOVERY [ON ] [OFF [WARN]] [OFF [NOWARN]] (varname) = RECOVERY RENUM [ON] [STD] [DISPLAY] [COBOL] [STD COBOL] REPLACE member lptr-range REPLACE (member) lptr-range REPLACE dataset lptr-range REPLACE dataset(member) lptrrange RESET [CHANGE ] [lptr-range] [COMMAND ] [ERROR ] [EXCLUDED] [FIND ] [LABEL ] [SPECIAL ] RFIND
Beschreibung Legt fest, wann die eingegebenen Daten eingepflegt werden. Setzt oder ermittelt Werte in den Profilen.
Identifiziert ein Line Command, das von einem Makro verarbeitet wurde. Wiederholt einen CHANGE Befehl. Ermittelt die RECFM zu dem editierten Data Set. Setzt oder ermittelt den RECOVERY Mode.
Schaltet den Nummerierungsmode ein und nummeriert neu. Ersetzt eine Datei oder Member durch den gerade editierten Datenbestand.
Setzt den Status des editierten Datenbestands zurück.
Wiederholt einen FIND Befehl zu einem vorher abgesetzten SEEK, FIND, oder CHANGE Befehl. Verschiebt den Bildschirm nach rechts. Ermittelt oder setzt das Macro dieser Edit Sitzung. Sichert den editierten Datenbestand. Ermittelt oder setzt die Datenlänge für die Sicherung in einen VB File. Schaltet den SCAN Mode ein oder aus bzw. ermittelt dessen Status. Sucht nach dem angegebenen String, aber nicht in EXCLUDED Lines.
RIGHT amt RMACRO {name | NONE} (varname) = RMACRO SAVE (varname) = SAVE LENGTH .lptr SAVEJLENGTH .lptr = value SCAN [ON ] [OFF] (varname) = SCAN SEEK string [label-range] [NEXT ] [CHARS ] [X ] [col-1 [col-2]] [ALL] [PREFIX] [NX] [FIRST] [SUFFIX] [LAST] [WORD] [PREV] (varl,var2) = SEEK_COUNTS Ermittelt die Werte des letzten SEEK Befehls. Tabelle 50 Edit Makro Befehle - Teil 5: PROCESS -
SEEK_COUNTS
474 Befehle (varl,var2) = SESSION
23 Edit Makros - Einfuhrung Beschreibung Identifiziert den Sitzungstyp, in dem ein Makro läuft. Verschiebt Spalten nach links. Verschiebt Spalten nach rechts. Verschiebt Daten nach links. Verschiebt Daten nach rechts. Sortiert den editierten Datenbestand.
SHIFT ( lptr [n] [2] SHIFT ) lptr [n] [2] SHIFT < lptr [n] [2] SHIFT > lptr [n] [2] SORT [sort-fieldl ... sortfield5] [label-range] [X] [NX] STATS [ON ] [OFF] Schaltet den STATS Mode ein oder aus bzw. (varname) = STATS ermittelt dessen Status. SUBMIT [lptr-range] Submittet den editierten Datenbestand zur Ausfuhrung als Batch Job. TABS [ON ] [STD] [OFF] [ALL] Schaltet den TABS Mode ein oder aus bzw. [tab-character] ermittelt dessen Status. (varl,var2) = TABS TABSLINE = data Setzt die TABSLINE bzw. ermittelt deren (varname) = TABSLINE Inhalt. TENTER lptr [numlines] Schaltet auf die Masseneingabe um. TFLOW lptr [col] Restrukturiert Paragraphen. TSPLIT [lptr col] Teilt Zeilen für die Dateneingabe auf. UNNUMBER Entfernt Zeilennummern und setzt den Modus NUMBER OFF. UP amt Verschiebt den Cursor nach oben. (varname) = USER_STATE Sichert oder lädt den User Status. USER STATE = (varname) VERSION = num Setzt oder ermittelt die Versionsnummer der VERSION num editierten Datei. (varname) = VERSION VIEW member Ruft ein anderes Member aus dem editierten PDS im VIEW Mode auf. (varl,var2) = VOLUME Ermittelt den oder die Plattennamen sowie die Anzahl der Platten auf denen die editierte Datei liegt. XSTATUS lptr = X | NX Setzt oder ermittelt den EXCLUDE Status (varname) = XSTATUS lptr einer Zeile. Tabelle 51 Edit Makro Befehle - Teil 6: SESSION - XSTA TUS
Ich werde auch hier wieder darauf verzichten, Ihnen jeden Befehl einzeln und ausführlich vorzustellen. Wenn Sie etwas Übung in der Makro Programmierung haben, kommen Sie vermutlich mit der obigen Kurzbeschreibung der Makro Befehle aus. Ich werde Ihnen auf den folgenden Seiten einige typische Aufgaben bei der Makro Programmierung vorstellen und Ihnen dabei erklären, worauf Sie bei den einzelnen Aufgaben achten sollten.
23.2 Tabelle der Edit Makro Befehle
23.2.1
475
Abkürzungen in den Edit Makro Befehlen
Um Ihnen die Arbeit mit den Makro Befehlen wie sie in der obigen Tabelle aufgeführt sind zu erleichtern, fuge ich hier eine kurze Beschreibung derjenigen Operandenabkürzungen ein, die vom Namen her nicht ohne weiteres selbsterklärend sind: Operanden (varl,var2,..) (vamame)
[FIRST] [LAST1 [NEXT] [PREV] [PREFIX] [SUFFIX1 [x] [nx] ALL amt col-1 col-2 coll col2 data labelname label-range
linenum-range lptr col lptr-range string
Bedeutung Hier werden, je nach Funktion, mehrere Variable angegeben. Hier muss der Name einer Variablen angegeben werden. Dieser Namen darf nicht länger als 8 Zeichen sein. Wenn der (varname) links in einer Zuweisung steht, wird vom Editor ein Wert hineingestellt. Wenn (varname) rechts in einer Zuweisung steht, muss der Wert vorher vom REXX Programm mit einem Inhalt gefüllt worden sein. Es wird nach dem ersten bzw. letzten Auftreten eines Textes in der Datei gesucht. Diese Operation soll nur bis zum nächsten bzw. bis zum vorigen Auftreten der Bedingung durchgeführt werden. Der angegebene Text wird bei der Suche als PREFIX oder als SUFFIX betrachtet. Die betreffende Operation wird nur für EXCLUDED Zeilen (x) oder für die NOT EXCLUDED Zeilen (nx) ausgeführt. Diese Operation soll alle Zeilen der Datei betreffen. Zahl, die eine relative Verschiebung angibt. Zwei ganze Zahlen, die eine Operation auf die bezeichneten Spalten beschränkt. Bezeichnet einen in Hochkommata eingeschlossenen Text. Name einer bezeichneten Zeile. Besteht aus zwei Edit Labels von der Form .LA und .LB. Dies können entweder Standard Labels sein, wie z.B. .ZF und .ZL oder selbst definierte Edit Labels. Die Zeichen hinter dem Punkt dürfen nur Buchstaben sein. Zwei ganzzahlige Variable oder Konstante, die eine Anfangs- und eine Endezeile für eine Operation bezeichnen. Ganze Zahlen, die eine Zeilennummer und eine Spaltennummer enthalten. Zwei ganze Zahlen, die die erste und letzte Zeile für eine Operation angeben. Text, der nicht in Hochkommata eingeschlossen sein muss.
Tabelle 52 Edit Makros: Erklärung der Operanden
476
23 Edit Makros - Einfuhrung
23.3
Testhilfen bei der Makro Erstellung
In diesem Kapitel stelle ich Ihnen die Testmöglichkeiten vor, die Sie bei der Erstellung von Edit Makros nutzen können.
23.3.1
Makro-Simulation durch Prototyping online im Editor
Wie ich bereits oben schon erwähnte, sollten Sie die Befehle eines Makro in einer Art „Prototyping" vor oder parallel zum Schreiben des Makros direkt online in einer Edit Sitzung ausprobieren. Dies ist der erste Schritt, die Erstellung des Makros zu beschleunigen. Dabei können Sie sehen, ob die Befehle genau das Ergebnis bringen, das Sie sich vorgestellt haben. Tipp Leider gibt es für den ISPF Editor keine Makro Aufzeichnungseinrichtung. Deshalb sollten Sie die Prototyping Befehle, nach dem Sie gesehen haben, dass das Ergebnis stimmt, in einer 2. Datei über die Zwischenablage sammeln, um dann aus dieser Sammlung das Edit Makro zu erstellen.
23.3.2
Der REXX TRACE Befehl als Makro Testhilfe
Die zweifellos nützlichste Unterstützungseinrichtung bei der Erstellung von Edit Makros ist die TRACE Einrichtung der REXX Sprache. Hier ist vor allem die Variante des TRACE Befehls mit der Option '?? hilfreich. Denn sie liefert die komplette Entwicklung der Variablen Inhalte bei der Ausfuhrung eines REXX Befehls. Durch die Angabe des '?' haben Sie den REXX Interpreter angewiesen, nach jedem Befehl anzuhalten. Dadurch ergibt sich die Möglichkeit, weiter Befehle an dieser Stelle von Hand einzugeben, um sich weitere Inhalte anzeigen zu lassen. Beispiel Das folgende Beispielmakro ermittelt einige Werte mittels Makro Befehlen. Ich habe zu Beginn eine TRACE ?I eingefugt. Dadurch wird die Entwicklung der Variablen Inhalte ausgegeben und das Makro hält hinter jedem Befehl an. 01 /* DOC: REXX #TT1 02 /* DOC: Beispielprogramm für Edit Makros 03 /* (c) LÄNZT
04 /**************************************** 05 06 07 08 09 10 11 12 13
trace ?i address "MACRO" 1 (DSN) 1 (MEM) (B1,B2) 1 (L,C) "(ZEILE) exit
'ISREDIT" = DATASET" = BOUNDS" = CURSOR" = LINE .ZCSR"
*/ */
19 Jul 2004 */ **************/
23.3 Testhilfen bei der Makro Erstellung
477
Hier der Ablauf des Makros. Ich habe bei einigen Stopps noch weitere Makro Befehle von Hand eingegeben (grau unterlegt). Natürlich können Sie hier auch jeden anderen REXX Befehl eingeben. +++ Interactive trace.
TRACE OFF to end debug, ENTER to continue. +++
6 *-* address "ISREDIT" 7 *-* "MACRO" >L> "MACRO" 8 *-* " (DSN) = DATASET" >L> "(DSN) = DATASET" say dsn PROX.UTIL.REXX 9 *-* " (MEM) = MEMBER" >L> " (MEM) = MEMBER" say mem $DOC 10 *-* "(B1,B2) = BOUNDS" >L> "(B1,B2) = BOUNDS" say bl b2 00001 00080 11 *-* "(L,C) = CURSOR" >L> "(L,C) = CURSOR" say 1 c 00000004 00010 12 *-* "(ZEILE) = LINE .ZCSR" >L> "(ZEILE) = LINE .ZCSR" say zeile * DOC: am 26 May 2004 um 10:57:50 " (im) = imacro" say im #IMACROI 13 *-* exit * * *
Die grau unterlegten Befehle habe ich während der Stopps von Hand eingegeben.
23.3.3
Das Programm ISREMSPY
Das Programm ISREMSPY können Sie während des Ablaufs des Makros einsetzen, um sich den zu diesem Zeitpunkt bestehenden Zustand Ihrer Edit Datei anzuschauen. Das Programm ist rein formal ein TSO Programm. Deshalb muss es auch unter ADDRESS TSO ausgeführt werden. Es ist nur innerhalb einer Edit Sitzung oder während der Ausfuhrung eines Edit Makros benutzbar. Um die Anwendung dieses Programms zu zeigen, habe ich das folgende kleine Makro geschrieben.
478
01 02 03 04 05 06 07 08 09 10 11 12 13
23 Edit Makros - Einführung
/* DOC: REXX #TT2 */ /* DOC: Beispielprogramm für Edit Makros */ /* (c) LANZT am: 19 Jul 2004 */ /*********************************************************************/ address "ISREDIT" "MACRO" "FIND 'Dataset' ALL" address TSO "ISREMSPY" "CHANGE '*' '#' ALL" address TSO "ISREMSPY" "EXCLUDE 'DOC:' ALL" address TSO "ISREMSPY" exit
I c h h a b e d i e s e s M a k r o in der Edit S i t z u n g der f o l g e n d e n D a t e i a u f g e r u f e n . A u f den d a n a c h f o l g e n d e n S e i t e n finden S i e die e i n z e l n e n B i l d s c h i r m a u s g a b e n , die durch den A u f r u f des P r o g r a m m s I S R E M S P Y erzeugt w u r d e n : EDIT PROX.UTIL.REXX($DOC) - 01.02 Columns 00001 00072 Command = = > #tt Scroll = > CSR ****** ***************************** Top of Data ****************************** 000001 ************************************************************************ 000002 * 000003 * DOC: Inhaltsbeschreibung dieses PDS. Erzeugt durch 'DOC' 000004 * DOC: am 26 May 2004 um 10:57:50 000005 * 000006 * Dataset Name : PROX.UTIL.REXX 000007 * Anzahl Members: 2 000008
*
000009 ************************************************************************ 000010 ISPERROR 000011 ISPF_ERROR: Unterprogramm zur Ausgabe von ISPF Fehlern ****** **************************** Bottom of Data ****************************
W ä h r e n d der A u s f u h r u n g des M a k r o s erhielt ich dann die f o l g e n d e n
Bildschirmanzeigen
n a c h e i n a n d e r . J e w e i l s in der grau unterlegten ersten Z e i l e s e h e n S i e I n f o r m a t i o n e n , die das P r o g r a m m I S R E M S P Y dort e i n g e f u g t hat. D a r a n k a n n m a n e r k e n n e n , d a s s d i e s e P a n e l s v o m P r o g r a m m I S R E M S P Y s t a m m e n . D i e s e A n z e i g e n h a b e ich j e w e i l s m i t P F 3 v e r l a s s e n . Command: FIND 'DATASET' ALL EDIT Command = 000002 000003 000004 000005 > 000007 000008 000009 000010 000011 ******
PROX.UTIL.REXX($DOC) - 01.02
ISREMSPY
LINE 0 OF 11 Columns 00001 00072 Scroll = > PAGE
* * DOC: Inhaltsbeschreibung dieses PDS. Erzeugt durch 'DOC' * DOC: am 26 May 2004 um 10:57:50 * * Dataset Name : PROX.UTIL.REXX * Anzahl Members: 2 * ************************************************************************ ISPERROR ISPF_ERROR: Unterprogramm zur Ausgabe von ISPF Fehlern **************************** Bottom of Data ****************************
23.4 System Variable des Editors
Command: CHANGE '*' '#' ALL
479
ISREMSPY
LINE 0 OF 11
EDIT PROX.UTIL.REXX($DOC) - 01.02 Columns 00001 00072 Command ===> Scroll ===> PAGE ****** ***************************** Top of Data ****************************** = C H G > ######################################################################## ==CHG> # = C H G > # DOC: Inhaltsbeschreibung dieses PDS. Erzeugt durch 'DOC' ==CHG> # DOC: am 26 May 2004 um 10:57:50 ==CHG> # = C H G > # Dataset Name : PROX.UTIL.REXX ==CHG> # Anzahl Members: 2 =CHG> # ==CHG> ######################################################################## 000010 ISPERROR 000011 ISPF_ERROR: Unterprogramm zur Ausgabe von ISPF Fehlern ****** **************************** Bottom of Data ****************************
Command: EXCLUDE 'DOC: ' ALL
ISREMSPY
LINE 0 OF 11
EDIT PROX.UTIL.REXX($DOC) - 01.02 Columns 00001 00072 Command ===> Scroll ===> PAGE ****** ***************************** Top of Data ****************************** ==CHG> ######################################################################## =CHG> # - - - - - - — - - - - - - - - - - - - 2 Line(s) not Displayed ==CHG> # ==CHG> # Dataset Name : PROX.UTIL.REXX ==CHG> # Anzahl Members: 2 ==CHG> # = C H G > ######################################################################## 000010 ISPERROR 000011 ISPF_ERROR: Unterprogramm zur Ausgabe von ISPF Fehlern ****** **************************** Bottom of Data ****************************
23.4
System Variable des Editors
Gerade bei der Erstellung eines Edit Makros kann man einige System Variable, die speziell im Editor zur Verfugung stehen, oft gut gebrauchen. Diese Variablen werden bei ihrer Verwendung im Quellkode des Makros immer mit einem vorangestellten Punkt benutzt, denn es sind in Wirklichkeit Labels des Editors. Diese Variablen habe ich in der folgenden Tabelle zusammengestellt: ZCSR .ZFIRST .ZLAST
Enthält die Zeilennummer, in der sich der Cursor gerade befindet. Enthält die Zeilennummer der ersten Datenzeile. Kann mit .ZF abgekürzt werden. Enthält die Zeilennummer der letzten Datenzeile. Kann mit .ZL abgekürzt werden.
Tabelle 53 System Variable des Editors
480
23.5
23 Edit Makros - Einführung
Parameterübergabe an Makros
Wenn an ein Makro Aufrufparameter übergeben werden sollen, dann muss man den MACRO Befehl mit einer Parameterliste definieren. Beispiel MACRO
(parml,parm2)
Die Variablennamen in Makroparametern dürfen nicht länger als 8 Zeichen sein. Als Beispiel für die Implementierung von Übergabeparametern sehen Sie nachfolgend den Anfang eines meiner produktiven Edit Makros. 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
/* REXX #2 HAPRO */ /* DOC: Edit Macro zum absetzen von SQL Anweisungen für DB2 */ /* DOC: Tabellen und Ausgeben des Ergebnisses in eine Datei mit */ /* DOC: anschliessendem Browse dieser Datei. */ /* DOC: DB2 Zugriffe mittels des Programms CAFPROGR. Es werden */ /* DOC: mehrere SQL Anweisungen in einem Aufruf bearbeitet. */ /* BEM: Aufrufparameter: */ /* BEM: 1. T=DBT1, D=DB2P — > MUSS Parameter */ /* BEM: 2. L=Letzte Liste --> KANN Parameter */ /* (c) Franz Lanz am: 25 Jun 1999 */ /*********************************************************************/ address "ISREDIT" "MACRO (SYS,LIST)" " (DSN) = DATASET" " (MEM) = MEMBER" "(ZEILEN) = LINENUM . ZL" sys = translate(strip(sys)) parmchk = "T D" parmsys = "DBT1 DB2P" pn = wordpos(sys,parmchk) if pn = 0 then do zedlmsg = "Der beim Aufruf benötigte Parameter ist weder >T< für", "die Ausführung unter DBT1 noch >D< für", "die Ausführung unter DB2P." address "ISPEXEC" "SETMSG MSG(ISRZOOl) COND" exit end : db2sys = word(parmsys,pn)
Zeilen 07 bis 09 In diesen Kommentarzeilen werden die Eingabeparameter beschrieben. Zeile 13 In der MACRO Definition werden die beiden möglichen Parameter definiert. Erst in der Programmlogik wird festgelegt, welche Parameter als MUSS Parameter einzugeben sind.
481
23.6 Beispiel für den SUBMIT eines Batch Jobs Zeilen 20 und 21 Der Mussparameter wird auf Vorhandensein und Korrektheit überprüft. Zeile 28 Der erste Parameter wird zur Festlegung des DB2 Subsystemnamens benutzt. Tipp
Gehen Sie bei der Erstellung von Edit Makros sparsam mit der Definition von Eingabeparametern um. Denken Sie daran, dass der Bediener die Parameterwerte bei jedem Makroaufruf von Hand eingeben muss.
23.6
Beispiel für den SUBMIT eines Batch Jobs
Edit Makros werden häufig benutzt, um einen Batch Job mithilfe des Makros zu erstellen und zu submitten. Das folgende Beispiel soll diese Technik zeigen. Dieses Programm läuft mit dem generellen ADDRESS Fenster zu TSO. Deshalb sind alle Befehle an ISREDIT und ISPEXEC mit deren Präfix versehen. Diese Prozedur ist ein Beispiel dafür, wie man vorgehen muss, um eine Prozedur sowohl als Edit Makro als auch als normale Prozedur nutzen zu können.
23.6.1 REXX DOC: DOC: DOC: DOC: DOC: DOC: (c)
Die Prozedur #DPR
01 02 03 04 05 06 07 08
/* /* /* /* /* /* /* /*
#DPR *****************************************************/ Prozedur zum Drucken. Ausgabe auf SYSOUT=A,DEST=N39R297 */ Diese Prozedur kann wie folgt aufgerufen werden: */ l. Als Edit Macro zum Drucken der im Edit befindlichen Datei */ 2. Im Menü 3.4 vor dem Namen einer Datei. */ 3. im Menü 3.4/M vor dem Namen eines Members. */ 4. Als TSO Command mit einem DSN als Parameter. */ LANZT am: 12 Mar 1998 */
10 11 12 13
"ISREDIT MACRO" macrorc — rc select when macrorc = 0 then do /* Aufruf als Makro
09 /*********************************************************************/
14
*/
/******************************************************************/
15
/* Übertragen der Zeilen des Edit Datenbestandes in den Stern OUT. */
17 18 19 20 21 22 23
"ISREDIT (ZL) = LINENUM .ZL" do i = 1 to zl "ISREDIT (ZEILE) = LINE "i out.i = " "zeile end i /******************************************************************/ /* Erstellen der Arbeitsdatei, von der aus gedruckt wird. */
25
"ISPEXEC VGET (ZSCREEN ZUSER) SHARED"
16
24
/******************************************************************/
/****************************************************************** j
482 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
23 Edit Makros - Einführung ldsn = "'"zuser".ZTEMP"zscreen".DPR'" ddname = "DPR"zscreen if sysdsn(ldsn) = "OK" then, "alloc dd("ddname") dsn("ldsn") old reuse" else "alloc dd("ddname") dsn("ldsn") new reuse", "space(15) tracks recfm(v b a) lrecl(133)" "execio "zl" diskw "ddname" (stem out. finis" "free dd("ddname")"
end /* Aufruf vor einem DSN otherwise do arg ldsn zuser = userid() end end /* select */ /****************** /* Einlesen der aktuellen Job Suffix Nummer /*******************************************
*/
*/
"ISPEXEC VGET (JSNUM) PROFILE" if rc > 0 then do jsnum = 1 "ISPEXEC VPUT (JSNUM) PROFILE" end jsuff = substr("9876543210ZYXWVUTSRQPONMLKJIHGFEDCBA",jsnum,1) jsnum = jsnum + 1 if jsnum > 36 then jsnum = 1 "ISPEXEC VPUT (JSNUM) PROFILE" jn = zuser!!jsuff "DELSTACK" /*************************************************************, / Erstellen des Jobs /**** * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * / queue //"left(jn,8)" JOB (09101999,00000000,46100000),'#DPR: "zuser"'," CLASS=I,MSGCLASS=H,MSGLEVEL=(1,1),NOTIFY="zuser"," queue // REGION=OM,USER="zuser",TYPRUN=HOLD" queue // queue / / IEBGENER EXEC PGM=IEBGENER" queue //SYSPRINT DD SYSOUT=*" DD DUMMY" queue "//SYSIN DD DISP=SHR,DSN="strip(ldsn,,"'") queue "//SYSUT1 DD SYSOUT=V,DEST=N39R297," queue "//SYSUT2 DCB= (RECFM=A,LRECL=133) " queue queue "XX" x = outtrap(text.) "SUBMIT * END(XX)" x = outtrap("OFF") do i = 2 to text.0; say text.i; end i exit
Programm 56 UDPR: Druckjob submitten
Zeile 10 Absetzen des Makro Befehls. Wenn der Makro Prozessor nicht gestartet werden kann, weil die Edit Umgebung fehlt, dann wird ein RC = 20 zurückgegeben. Dies ist dann ein sicherer Hinweis, dass der Aufruf nicht als Makro erfolgte, sondern als TSO Prozedur.
23.6 Beispiel fur den SUBMIT eines Batch Jobs
483
Zeile 13 Wenn der Aufruf als Edit Makro erfolgte, dann werden die Befehle der hier beginnenden DO Gruppe ausgeführt. Zeile 17 Ermitteln der Anzahl Zeilen der editierten Datei und Speichern dieser Zahl in die Variable ZL. Zeilen 18 bis 21 DO Schleife zur Übertragung der Zeilen der editierten Datei in den Stern OUT. Zeile 25 Einlesen der SCREEN Nummer und der User ID aus dem SHARED Pool des ISPF. Die SCREEN Nummer wird dazu benutzt, im Namen der Hilfsdatei irgendwo die Nummer der ISPF Ebene unterzubringen, damit der Dateiname eindeutig einer ISPF Ebene zugeordnet ist und keine gleichzeitige Benutzung der Hilfsdatei aus anderen ISPF Ebenen vorkommen kann. Zeilen 28 und 29 Wenn die Hilfsdatei schon existiert, dann diese benutzen, indem sie lediglich zugeordnet wird. Zeilen 30 und 31 Die Hilfsdatei existiert noch nicht. Deshalb wird sie hier neu angelegt. Zeile 32 Die Zeilen der editierten Datei werden in die Hilfsdatei geschrieben. Zeilen 35 bis 38 Der Aufruf erfolgte als Prozedur. Da in diesem Fall die als Parameter angegebene Datei direkt im Batch Job eingetragen werden kann, muss deren Name hier nur als Argument übernommen werden. Die Variable ZUSER wird mit der USERID() besetzt. Zeilen 43 bis 52 Der Job Name des Druckjobs wird aus der User ID und einem weiteren Zeichen gebildet. Die Zeichen werden der Zeichenkette, die als Text in der SUBSTR Funktion der Zeile 48 definiert ist, entnommen, und zwar in absteigender Sortierfolge der Zahlen und Buchstaben. Dadurch erscheinen die Jobs in der Anzeige im SDSF so, dass immer der zuletzt ausgeführte Job ganz oben steht, falls dort (wie bei mir praktiziert) die Anzeige nach Jobnamen absteigend sortiert ist. Zeilen 57 bis 66 Die JCL Statements werden in den Stack geschrieben, wobei die Aktualwerte der Variablen eingefügt werden. Da in der Variablen LDSN der DSN mit Hochkommata an beiden Enden steht, müssen die Hochkommata für den Eintrag des DSN in das JCL Statement entfernt werden.
484
23 Edit Makros - Einfuhrung
Zeile 67 Der nachfolgende SUBMIT Befehl gibt immer mehrere Zeilen aus. Damit diese Zeilen nicht alle auf dem Bildschirm erscheinen, werden sie durch das Setzen der OUTTRAP Funktion zunächst in den dort angegebenen STEM TEXT, geschrieben. Zeile 68 Die im Stack stehende JCL wird submitted. Das Ende des Datenstroms wird an einer Zeile, die auf den ersten beiden Spalten XX stehen hat, erkannt. Zeile 69 Die OUTTRAP Funktion wird abgeschaltet. Zeile 70 Die zweite Zeile des STEMs TEXT, wird ausgegeben. Dort steht normalerweise der Text für den erfolgreichen SUBMIT des Jobs. Dieser Text könnte so aussehen:
JOB LANZT6(JOB08204) SUBMITTED Ich habe diese Prozedur als Makro bei einer Edit Sitzung aufgerufen. Dabei wurde der folgenden Job erzeugt und submitted. 01 02 03 04 05 06 07 08 09
//LANZTJ JOB (09101999,00000000,46100000),'LANZT', // CLASS=I,MSGCLASS=H,MSGLEVEL=(1,1),NOTIFY=LANZT, // REGION=OM, USER=LANZT, TYPRUN=HOLD //IEBGENER EXEC PGM=IEBGENER //SYSPRINT DD SYSOUT=* //SYSIN DD DUMMY //SYSUT1 DD DISP=SHR,DSN= 1 LANZT. ZTEMPI .DPR' //SYSUT2 DD SYSOUT=V,DEST=N39R297, // DCB=(RECFM=A,LRECL=133)
Merksätze zur Makro Programmierung •
• •
•
Falls Sie noch nicht über große Erfahrung in der Programmierung von Makros verfügen, denken Sie daran, die komplexen Statements durch vorheriges Testen von Hand in einer Edit Sitzung zu entwickeln. Nutzen Sie zum Testen des Makros den REXX TRACE und das Testprogramm ISREMSPY. Nutzen Sie die Möglichkeiten, die in der EXCLUDE Anweisung stecken. Die meisten Makro Befehle kann man nämlich sowohl auf die „excludet lines" (mit der Option X) als auch auf die noch „sichtbaren" Zeilen (mit der Option NX) ansetzen. Wenn eine Befehlsfolge nicht den gewünschten Erfolg hat, kann es vielleicht daran liegen, dass der CURSOR falsch positioniert ist. Diesen Fall können Sie in der Regel damit lösen, dass Sie die fehlerhafte Stelle mit einem TRACE ?I Durchlauf untersuchen, indem Sie von Hand die Position des Cursors wie folgt ermitteln:
"ISREDIT (LI,C1) = CURSOR" SAY LI C1
24
Die LANZISPF Utilities
In diesem Kapitel stelle ich Ihnen Programme vor, die ich selbst häufig benutze. Sie erleichtern und beschleunigen meine tägliche Arbeit und ich möchte sie nicht mehr missen. Schauen Sie also, ob das eine oder andere Programm auch für Sie nützlich sein kann. Seit nunmehr 20 Jahren arbeite ich als Berater, Dozent, Programmierer und Systemintegrator in verschiedenen Firmen im In- und Ausland. Dabei hatte ich immer wieder sehr intensiv mit den Subsystemen TSO/ISPF unter MVS zu tun. Um diese Systeme optimal nutzen zu können, habe ich während dieser ganzen Zeit zwei Strategien verfolgt: •
•
In regelmäßigen Abständen versuche ich herauszufinden, ob es in den von mir benutzten Systemen Neuerungen gibt. Dabei interessiert mich vor allem, ob diese Neuerungen nützlich für meine Arbeit sein können. Dabei ist es schon öfters vorgekommen, dass IBM bisher fehlende Funktionen, die ich mir zunächst selbst programmiert hatte, plötzlich „nachgeliefert" hat. Beispielhaft seien hier das Utility ISRDDN und der ISPF Service QUERYENQ genannt. Immer, wenn es mir sinnvoll erschien, habe ich versucht, durch die Entwicklung von zusätzlichen Funktionen meine Arbeit zu beschleunigen.
Durch konsequente Verfolgung dieser Strategien habe ich mir einerseits gute Kenntnisse im TSO/ISPF angeeignet, andererseits ist dabei eine ganze Reihe von Utilities entstanden, die für die tägliche Arbeit im TSO/ISPF Umfeld sehr nützlich sein können.
24.1
Utilities im Internet
Heute können Sie im Internet eine große Menge von Programmen finden, die von gut meinenden Leuten kostenlos bereitgestellt werden. Ich habe bisher daraus einige gute Ideen entnehmen können, aber bis jetzt dort kein Programm gefunden, dass mir nützlich erschien und dass ich ohne erhebliche Änderungen hätte direkt einsetzen können. Dies soll Sie aber nicht davon abhalten, selbst im Internet nach nützlichen Utilities zu suchen. Um Ihnen den Einstieg zu erleichtern möchte ich Ihnen hier einige Adressen nennen:
486
24 Die LANZ ISPF Utilities
www.tsotimes.com/currentarticles.html Diese Page wird von der Firma Chicago Soft unterhalten. In der rechten Spalte auf der ersten Page finden Sie weitere Links zum Thema TSO und ISPF. Eine weitere sehr interessante Seite mit vielen Informationen und Programmen zum MVS finden Sie unter: http://www.sillvsot.com/mvs/ Dort finden Sie z.B. das Programm VCURSOR. Dieses diente mir als Grundlage zur Entwicklung des Programms XCURSOR der LANZ Utilities. http://www-306.ibm.com/software/awdtools/ispf/ Hier finden Sie Tools und Informationen zum ISPF von der Firma IBM. Tipp Wenn Sie in einer Internet Suchmaschine die Begriffe ISPF oder TSO eingeben, dann werden Sie staunen, was dort alles zu finden ist. Meine Empfehlung: Schauen Sie doch mal dort nach!
24.2
Inhalt der CD Rom
Diesem Buch liegt eine CD Rom bei, auf der Sie alle im Buch benutzten Beispiele und die hier beschriebenen Programmelemente finden. Die folgende Tabelle enthält eine Aufstellung der Verzeichnisse der CD Rom und eine Beschreibung von deren Inhalt. Verzeichnis UTIL REXX UTIL PANEL UTIL MSGS UTIL TABL BUCHREXX
Inhalt Alle REXX Programme, die in diesem Kapitel beschrieben sind. Alle PANELS, die in diesem Kapitel beschrieben sind. Alle Message Members, die in diesem Kapitel beschrieben sind. Einige Command Table Members, wie z.B. ISPCMDS. Alle REXX Programme, die für dieses Buch als Beispiele entwickelt wurden und die nicht zu den Utilities gehören. Alle diese Programme sind aber lauffähig und getestet.
Tabelle 54 Verzeichnisse auf der CD ROM der LANZ Utilities
Die REXX Programme sind in zwei Gruppen aufgeteilt: 1. UTIL REXX Dies sind die REXX Prozeduren, die den Kern der LANZ Utilities bilden. Die Prozeduren sind in diesem Buch einzeln und in ihrem Zusammenwirken ausführlich beschrieben.
24.3 Installation der Utility Programmelemente
487
2. B U C H R E X X In Dieser Datei sind zwei Typen von REXX Programmen enthalten: • •
Sämtliche Beispielprogramme, die in diesem Buch zur Erläuterung einzelner Funktionen entwickelt wurden. Weitere nützliche Programme, die man als Vorlage benutzen oder auch direkt einsetzen kann.
Die Programme im Verzeichnis BUCH REXX sind hier im Buch nicht explizit beschrieben, sondern nur in einer Tabelle aufgeführt, in der eine kurze Funktionsbeschreibung enthalten ist. Wenn Sie diese Programme benutzen wollen, empfehle ich Ihnen, sich die Beschreibung in den einzelnen Programmen anzuschauen.
24.3
Installation der Utility Programmelemente
Die LANZ Utility Programmelemente bestehen aus den folgenden Typen von ISPF Programmelementen: • • • •
REXX Prozeduren Panels Messages Tables
Für die Installation der LANZ Utilities benötigen Sie keine Programmierkenntnisse. Sie sollten aber im ISPF den Wissensstand haben, der im ersten Teil dieses Buches vermittelt wird. Um die Programmelemente nutzen zu können, müssen Sie dafür sorgen, dass diese entweder in bei Ihnen bereits vorhandene Bibliotheken des entsprechenden Typs oder in neu angelegte Bibliotheken kopiert werden. Wenn Sie die Members in neue Bibliotheken kopieren, dann müssen Sie diese Bibliotheken in Ihrer Logon Prozedur entsprechend einbinden. Hinweis Sie dürfen die REXX Prozeduren, Panels und Messages keinesfalls alle in die gleiche Bibliothek kopieren. Dies geht deshalb nicht, weil die REXX Programme und die zugehörigen Panels oftmals den gleichen Namen haben. Bei der Einrichtung Ihrer TSO/ISPF Umgebung sind folgende Szenarien denkbar: 1. Kopieren in vorhandene Bibliotheken Sie können die Programmelemente (REXX, PANELS, MSGS) in bei Ihnen bereits vorhandene Bibliotheken des jeweiligen Typs kopieren. Dies ist der einfachste Fall, denn nach dem Kopieren stehen Ihnen die LANZ Utilities sofort zur Verfügung.
488
24 Die LANZISPF Utilities
2. Sie haben eine eigene Logon Prozedur Wenn Sie eine eigene Logon Prozedur benutzen können, legen Sie die benötigten Bibliotheken an, kopieren die Programmelemente dort hinein und binden die Bibliotheken in Ihre Logon Prozedur ein. Hier können Sie auch die zu den LANZ Utilities gehörende Logon Prozedur „LOGON" einsetzen. 3. Beim Verlassen des ISPF landen Sie im TSO Sie landen beim Verlassen des ISPF auf der TSO Ebene. Dann können Sie folgende Technik anwenden: •
• •
Kopieren Sie das Member CDLANZ aus dem Verzeichnis UTIL REXX in irgendeinen Ihrer PDS. Editieren Sie dieses Member und tragen dort die Dateinamen ein, die Sie für die entsprechenden Programmelemente benutzen wollen. Verlassen Sie dann das ISPF, so dass die T S O READY Zeile ganz oben auf Ihrem Bildschirm steht. Geben Sie dann folgenden TSO Befehl ein: EX ' dataset (CDLANZ) ' und drücken Sie dann ENTER. da taset ist der DSN, in den Sie das Member CDLANZ kopiert und angepasst haben. Daraufhin wird die Prozedur CDLANZ ausgeführt, wobei Ihre zusätzlichen Bibliotheken an erster Stelle verkettet werden. Bevor Sie ENTER drücken, muss das Bild auf Ihrem TSO Bildschirm so aussehen: a & Ü EX ' d a t a s e t ( C D L A N Z ) ' Den Dateinamen müssen Sie entsprechend einsetzen. Tipp Diese Methode können Sie vor allem dann benutzen, wenn bei Ihnen keine privaten Logon Prozeduren zugelassen oder vorgesehen sind und Sie auch keine Schreibrechte auf die ISPF Bibliotheken haben, die Sie schon jetzt benutzen.
4. Beim Verlassen des ISPF erfolgt sofort LOGOFF im TSO Wenn Sie keine der oben beschriebenen Möglichkeiten nutzen können und beim Verlassen des ISPF auch sofort das TSO verlassen wird, ohne dass Sie den TSC) READY Bildschirm zu sehen bekommen, ist es schwierig, mit eigenen Mitteln eine sinnvolle Einbindung der LANZ Utilities in Ihren TSO User zu gestalten. Sie sollten sich in diesem Fall an Ihren Vorgesetzten wenden, um über diesen die ISPF Systemtechnik zu veranlassen, für Sie eines der oben beschriebenen Verfahren zugänglich zu machen.
24.4 Beschreibung der REXX Prozeduren
24.4
489
Beschreibung der REXX Prozeduren
Hier finden Sie Kurzbeschreibungen zu den REXX Prozeduren. Diese Kurzbeschreibungen sind wie folgt hierher gelangt: •
• •
Die $DOC Members in den beiden Bibliotheken der Beispiele und Utilities wurden mit dem Programm DOCTEXT bearbeitet. Dieses Programm erstellt aus den $DOC Members eine sequentielle Datei, die so formatiert ist, dass nach der Übertragung in ein Word Dokument, daraus direkt eine Tabelle erstellt werden kann. Als Spaltentrennzeichen für die Formatierung der Word Tabellen wird das Semikolon (;) benutzt. Danach wurden die Dateien auf die C Platte des PC Übertragen. Die Dateien wurden in Word mit DATEI/EINFÜGEN hereingeholt und mit TABELLE/ TEXT IN TABELLE UMWANDELN bearbeitet.
Tipp Ich habe diese Beschreibung hier eingefügt, damit Sie eine Anleitung haben, wenn Sie Ihre eigenen SDOC Member einmal in MS Word oder eine andere Textbearbeitungssoftware auf dem PC einbinden wollen.
24.4.1
Programmtypen der LANZ Utilities
Diese Tabellen sind in drei Spalten eingeteilt, die folgende Inhalte haben: Die Spalten Name und Beschreibung enthalten Informationen entsprechend ihrer Überschrift. Die Spalte Programmtyp enthält folgende Informationen: HAPRO
Dieses Programm ist direkt ausfuhrbar.
MAKRO Dieses Programm kann nur als Edit Makro ausgeführt werden. UPRO
Dieses Programm kann nur als Unterprogramm ausgeführt werden. Man kann diese Programme auch in den Quellkode eines Hauptprogramms kopieren, um es dann als internes Unterprogramm auszuführen.
COPY
Dieses Member kann in ein Programm kopiert werden, um es als internes Programm auszuführen.
In den Tabellen sind die Programme in aufsteigender Reihenfolge ihres Namens aufgeführt.
24.4.2
Tabelle der Beispielprogramme
Die folgende Tabelle enthält eine Kurzbeschreibung der Beispielprogramme, die im Verzeichnis BUCH REXX enthalten sind. Wie weiter oben bereits erwähnt, sind diese Programme außer in dieser Tabelle im Buch nicht weiter beschrieben. Einen Teil dieser Beispielprogramme habe ich allerdings im Buch zur Veranschaulichung des Stoffes benutzt.
490
24 Die LANZISPF Utilities
Member $PDSHIST SPDSSICH STESTDSN $UPDTE #BIND
Typ Steuerung Data Steuerung JCL MAKRO
#UNNUM
MAKRO
ADDRESS
HAPRO
ALIAS ALIASPR
HAPRO HAPRO
ALTLANZ
HAPRO
ALTLIB1
HAPRO
ALTLIB2
HAPRO
ALTLIB3
HAPRO
ARGTEST BINSUCH1
HAPRO HAPRO
BINSUCH2
HAPRO
BUBBSTEM BUBBWORD CHANGET CMDLIST COMP
HAPRO HAPRO HAPRO HAPRO HAPRO
COMPRESS
HAPRO
CONCATD
HAPRO
Beschreibung Member Historie der inkrementellen Sicherung. Datensicherung vom 19 Aug 2004 um 23:55:59. Steuermember für vorhandene Test Ebene. JOB ZUM AUFRUF VON JCLUPDTE FÜR EINEN PDS. Edit Macro zur Ausfuhrung von BIND Befehlen im DB2 und Anzeigen des Ergebnisses im BROWSE. Macro zum Setzen des NUMBER OFF Status. Wenn UNNUMBER nicht geht, dann wird NUM ON STD und UNNUM durchgeführt. Test für Address Befehl. In dieser Testprozedur werden die verschiedenen Möglichkeiten des ADDRESS Befehls gezeigt. Setzen eines Alias Eintrages. Prozedur zum Erzeugen einer Liste mit den Alias Einträgen zu einem Catalog. Aufruf im 3.4 vor dem Catalog. Ausgabe in userid().PEVP.catalogname.ALIASE. Prozedur für die dynamische Zuordnung der Bibliotheken der LANZ Utilities. Test Beispiele für den TSO Befehl ALTLIB. Teil 1: ALTLIB für User Level EXEC (SYSUEXEC). Test Beispiele für den TSO Befehl ALTLIB. Teil 2: Schrittweise Anwendung von ALTLIB. Test Beispiele für den TSO Befehl ALTLIB. Teil 3: Anwendung von DISPLAY QUIET und Ausgabe der in den IKJADMn Variablen stehenden Informationen. Beispiele für die Parameterübergabe innerhalb von REXX. Beispiel für eine Binärsuch-Routine im REXX. Version für Suchen in einem Stem. Beispiel für eine Binärsuch-Routine im REXX. Version für Binärsuchen eines Wortes in einem String. Beispiel für Bubble Sort eines REXX Sterns. Beispiel für Bubble Sort eines REXX Strings von Worten. Beispiele für die Anwendung der CHANGE Funktion. Erstellen einer Datei aus der Tabelle ISPCMDS. Erstellen und SUBMIT eines Compress Jobs mithilfe des Skeletons COMPRESS. Aufruf in einem DSLIST Panel vor dem DSN. Erzeugen und SUBMIT eines Compress Jobs für einen PDS. Aufruf in einem DSLIST Panel vor dem DSN. Beispiele für das zusätzliche Zuordnen von ISPF Bibliotheken mithilfe des Befehls CONCATD und der Option BEFORE. Diese Prozedur kann nicht unter ISPF ausgeführt werden, sondern nur im TSO vor dem Start von ISPF.
Tabelle 55 Die REXX Beispielprogramme - Teil 1
24.4 Beschreibung der REXX Prozeduren Member C2D C2X DATE DB2REXX1
Typ HAPRO HAPRO HAPRO HAPRO
DB2REXX2
HAPRO
DELDAT
HAPRO
DELGDG DELGDGJ
HAPRO HAPRO
DP
HAPRO
DSINFOTT
HAPRO
DSLSTRC
UPRO
D2C D2X EXECIO FTCLOSE GETVARS
HAPRO HAPRO HAPRO HAPRO HAPRO
ISPERROR
COPY
ISPFERRT
HAPRO
ISREMSPY
MAKRO
JOBNREXX
UPRO
JULDATE
HAPRO
JUSTIFY LIBDEF LIBOFF LIBON
HAPRO HAPRO HAPRO HAPRO
491
Beschreibung Beispiele für Konvertierungsfunktion C2D. Beispiele für Konvertierungsfunktion C2X. Beispiele für Datumsberechnungen mit der DATE Funktion. 1. Beispiel für die Durchfuhrung von DB2 SQL Befehlen mittels REXX 2. Beispiel für die Durchführung von DB2 SQL Befehlen mittels REXX Prozedur zum Löschen von Dateien, die aus einer DSLISTe erzeugt und gespeichert wurden. Aufruf: in einem DSLIST Panel vor dem DSN mit der erzeugten Liste. Prozedur zum Löschen aller Dateien eines GDG. Prozedur zur Erzeugung eines Jobs, um alle Dateien eines GDG zu löschen. Aufruf in einem DSLIST Panel vor dem Namen des GDG. Löschen von Dateien mit Verfallsdatum mit der Option PURGE. Testprozedur für die ISPF Funktion DSINFO. Aufruf vor dem DSN in einem DSLIST Panel. Diese Prozedur gibt zu einem SYSREASON aus dem Aufruf von LISTDSI den Klartext aus. Beispiele für die Konvertierungsfunktion D2C. Beispiele für die Konvertierungsfunktion D2X. Beispiel für die Anwendung des I/O Befehls EXECIO. FTCLOSE Durchführen. Beispiele für das Auslesen von verschiedenen Variablen aus dem ISPF Profile Pool und Ausgeben mit SAY. Ausgeben von ISPF Fehlermeldungen sowohl ONLINE als auch in einem Batch Job. Beispiel für die Anwendung des Unterprogramms ISPF ERROR. Beispiel für die Anwendung des Edit Makro Test Utilities ISREMSPY. Ermittelt den Jobnamen mit REXX native. Diese Routine kann auch unter TSO native laufen! Beispiele für die Berechnung des Julian Date durch: 1. Verwendung der DATE Funktion. 2. Verwendung von REXX Befehlen. Beispiele für die Anwendung der REXX Funktion JUSTIFY. Beispiele für die Anwendung des LIBDEF Services im ISPF. Zurücksetzen einer temporären ISPF Library. Voranstellen einer ISPF Library vor die vorhandene Verkettung mittels LIBDEF.
Tabelle 56 Die REXX Beispielprogramme
- Teil 2
492
24 Die LANZISPF Utilities
Member LISTDS LISTDSI
Typ HAPRO HAPRO
LMCOPY
HAPRO
LMDDISP
HAPRO
LMGET
HAPRO
LMMFIND
HAPRO
LMMLIST
HAPRO
LMMSTATS
HAPRO
LMOPEN LMPUT
HAPRO HAPRO
LOTTO
HAPRO
MEMDEL NULLSET NULLSTR NUMERIC
HAPRO HAPRO HAPRO HAPRO
OVERLAY PANCLONE
HAPRO HAPRO
PARSE 1 PARSE2
HAPRO HAPRO
PARSRC
UPRO
PRODMOVE
HAPRO
Beschreibung Beispiele für die Anwendung des TSO Befehls LISTDS. Anzeigen der Datei Charakteristiken mittels LISTDSI. Aufruf in einem DSLIST Panel vor dem DSN. Beispiel für das Kopieren von Members und sequentiellen Dateien mittels ISPF Services. Beispiel für die Anwendung der ISPF Services LMDINIT und LMDDISP. Beispiel für das Lesen eines Members aus einem Data Set mit RECFM=VB. Beispiel für die ISPF Funktion LMMFIND bei der Verarbeitung von Concatenated Data Sets. Beispiel für die Anwendung des ISPF Services LMMLIST: Ausgeben der Member Liste aus mehreren verketteten PDS. Verkettung mehrerer Bibliotheken. Bis zu 16 möglich! Eintragen der Statistics für ein Member. Aufruf im Menü 3.4/M vor einem Member. Falls schon Statistik Werte zu dem Member vorhanden sind, werden diese vor dem Neusetzen gelöscht. Beispiel für die Anwendung des ISPF Services LMOPEN. Beispiel für das Schreiben eines Members mit Erstellung der Statistik Informationen. Programm zum Ausdrucken von Lottozahlen mit 6 aus 49 plus Zusatzzahl. Löschen eines Members aus einem PDS. Beispiel für das Nullsetzen von Variablen mittels PARSE. Beispiele für das Setzen von Nullstrings im REXX. Beispiele für die Anwendung von NUMERIC DIGITS und NUMERIC FUZZ im REXX. Beispiele für die Anwendung der OVERLAY Funktion. Erstellen einer neuen Panvalet Datei aus einer vorhandenen mit Veränderungsmöglichkeit der Parameter mittels eines Panels. Es werden die Panels PANCLONE und PANCLON1 aufgerufen. Beispiel für PARSE VAR mit verschiedener Separierung. Beispiel für die Anwendung des Befehls PARSE SOURCE beim Aufruf eines Unterprogramms. Teil 1: Hauptprogramm. Beispiel für die Anwendung des Befehls PARSE SOURCE beim Aufruf eines Unterprogramms. Teil 2: Unterprogramm. Programme von der Test- in die Produktionsebene verschieben.
Tabelle 57 Die REXXBeispielprogramme
- Teil 3
24.4 Beschreibung der REXX Prozeduren Member QBASELIB
Typ HAPRO
QENQISPF
HAPRO
QLIBDEF
HAPRO
QUICKSRT
HAPRO
RANDOM SETMSG
HAPRO HAPRO
SKAT
HAPRO
SLEEP
HAPRO
STACK
HAPRO
STATS STORAGE
HAPRO HAPRO
STRUKTTT
HAPRO
SUBALL
HAPRO
SUBALLW
HAPRO
SUBSTR TIME TRANSLAT VALDSN VALDSNT VALUE
HAPRO HAPRO HAPRO UPRO HAPRO HAPRO
493
Beschreibung Ermitteln der DSNs zu dem DD Namen ISPLLIB mittels ISPF Befehl QBASELIB. Verschiedene Beispiele für das Anzeigen von ENQs mittels QUERYENQ. Beispiel für die Ausführung von QLIBDEF und QBASELIB zur Ermittlung aller DSNs, aus denen Skeletons geholt werden. Beispiel für die Anwendung eines Quicksort Unterprogramms zum Sortieren eines REXX Sterns. Beispiele für die Erzeugung von Zufallszahlen im REXX. Beispiel für die Anwendung des SETMSG Services zur Ausgabe von Meldungen im ISPF. Programm für die im Buch dargestellte Skatturnier Anwendung. Beispiel für die Anwendung des aus der OS/390 OpenEdition stammende SLEEP Befehls. Beispiel für den Datenaustausch zwischen Haupt- und Unterprogramm über den Data Stack. Diese Art des Datenaustausches kann auch bei externen Unterprogrammen genutzt werden. Erzeugen der ISPF Statistics für alle Member eines PDS. Beispiele für die Anwendung der REXX Funktion STORAGE: Ermitteln des Job Namens aus der CVT (Common Vector Table) des z/OS. Beispiele für die Anwendung des REXX Unterprogramms STRUKTT. Submitten aller Jobs aus einer JCL Datei. Aufruf in einem DSLIST Panel vor dem DSN. Wird beim Aufruf ein Jobname Suffix Buchstabe (nur einer!) mitgegeben, dann werden die Jobs alle mit dem gleichen Namen userid()jsuff submitted. Es werden nur solche Member submitted, die im 1. Zeichen kein $ haben. Prozedur für den Submit aller Members eines PDS. Der Submit der einzelnen Jobs erfolgt jeweils mit einer zeitlichen Verzögerung. Beispiele für die Anwendung der Funktion SUBSTR. Beispiele für die Anwendung der Funktion TIME. Beispiele für die Anwendung der Funktion TRANSLATE. Prozedur zur Validierung von DSNs (auch mit Member). Beispiele für die Anwendung des Unterprogramms VALDSN. Beispiele für die Anwendung der Funktion VALUE.
Tabelle 58 Die REXX Beispielprogramme
- Teil 4
494
24 Die LANZ ISPF Utilities
Member VAREDIT
Typ HAPRO
XPRIM
HAPRO
XRANGE X2B X2C ZVARSI
HAPRO HAPRO HAPRO HAPRO
ZVARS2
HAPRO
Beschreibung Aufruf des Variablenzuweisungsprogramms VARDAT mittels ISPF Befehl VARLOAD. Beispiel für die Berechnung von Primzahlen mithilfe von REXX. Beispiele für die Anwendung der Funktion XRANGE. Beispiele für die Anwendung der Funktion X2B. Beispiele fiir die Anwendung der Funktion X2C. Beispiele zur Ausgabe einiger Z Variablen, die mit Standardwerten besetzt sind. Ausdruck einiger Z Variablen aus dem ISPF Variablen pool.
Tabelle 59 Die REXX Beispielprogramme - Teil 5
24.4.3
Tabelle der Utility Programme
Diese Programme werden in den folgenden Kapiteln ausfuhrlich beschrieben. Manche Programme bilden zusammen eine kleine Anwendung. Member SPDSHIST
Typ Data
$PDSSICH ##
Data MAKRO
#ALTXT
MAKRO
#ASM
MAKRO
#CM
MAKRO
#DISP
MAKRO
Beschreibung Member Historie der inkrementellen Sicherung begonnen am 10 Aug 2004 um 23:56:08 Dataset: PROX.UTIL.REXX. Datensicherung vom 19 Aug 2004 um 23:56:00. Edit Macro fur den direkten Aufruf von REXX Prozeduren in der Command Line einer PDF Edit Session. Es kann ein Parameter mitgegeben werden, der an die auszuführende REXX Prozedur übergeben wird. Edit Macro zur Neuformatierung von Texten innerhalb vorgegebener Spalten. Beschreibung mit Aufruf: #ALTXT ? Compile Link und Test von Assembler Programmen. Das Edit Macro "#ASM" kann in einer Edit Session aufgerufen werden, um einen Batch ASSEMBLER Umwandlungsjob mit dem gerade editierten Member als Eingabedaten zu submitten. Zusätzlich kann ein Test Step angehängt werden. Erzeugt einen Kommentarblock an der Stelle des Cursors. Als Parameter kann die Anzahl der Leerzeilen im Block angegeben werden. Umbau einer DD Zeile in einer JCL dahingehend, dass der DISP=xxx Parameter immer direkt hinter dem DD zuerst kommt. Der Cursor muss in einer DD Zeile stehen, in der ein DISP= und ein DSN= als Parameter vorkommen.
Tabelle 60 Die LANZ Utility Programme - Teil 1
24.4 Beschreibung der REXX Prozeduren Member #EDMEM
Typ MAKRO
#IMACROA
MAKRO
#IMACROI
MAKRO
#IMACR01
MAKRO
#IMACR02
MAKRO
#ISPFB
MAKRO
#PAN
MAKRO
#PROF
MAKRO
#RC
MAKRO
495
Beschreibung Edit Aufruf eines Members, dessen Name als erstes Wort in einer Zeile einer editierten Datei steht. Die editierte Datei kann aus folgenden Quellen stammen: 1. Eine Listausgabe der Prozedur SS. 2. Eine Listausgabe der ISPF Funktion SRCHFOR in DSLISTen. 3. Das Member $DOC in einem PDS. Beim Aufruf muss der Cursor in einer Zeile stehen, die als erstes Wort einen Membernamen enthält. Allgemeines Edit Makro. Dieses Makro wird bei jedem Edit Aufruf ausgeführt, bevor das Initial Makro ausgeführt wird, und zwar auch dann, wenn kein Initial Makro für diesen Dataset definiert ist. Andern der Lastedit Einstellung. Ändern der Einstellung für das Macro #IMACR02, ob alle Edit Dateien in die Last Edit Tabelle eingetragen werden, oder nur diejenigen, die geändert wurden. Einfügung von DOC:-Zeilen. EDIT Makro zur Einfügung von DOC-Zeilen mit einer Inhalts- oder Funktionsbeschreibung der editierten Datei. Enthält die editierte Datei in den ersten 20 Zeilen bereits DOC: Zeilen, dann wird das Makro verlassen. Editierte Datei in Tabelle $LElpar eintragen. Edit Makro, das aufgerufen wird, wenn eine Edit Session endet, die beim Aufruf durch das I-Makro #IMACR01 gelaufen ist. REXX Programm im ISPF Batch ausführen. Edit Makro für den Submit eines Batch Jobs, der das REXX Programm im ISPF Batch ausführt. Beim Makro Aufruf kann ein String als Parameter an das REXX Programm übergeben werden. ISPF Edit Macro zum schnellen Testen von Panels direkt aus der Edit Sitzung heraus. Es wird direkt die Funktion 7.2 aufgerufen und das Panel angezeigt. Einfügen der ISPF Edit Profile Values als NOTELINES am Beginn der editierten Datei. REXX Prozeduren im Batch kompilieren. Zusammenbau und SUBMIT eines Jobs, um eine REXX Prozedur zu kompilieren.
Tabelle 61 Die LANZ Utility Programme - Teil 2
496
24 Die LANZ ISPF Utilities
Member #RCLOAD
Typ MAKRO
#R0
MAKRO
#R3390
MAKRO
#SPLJ
#ss
MAKRO MAKRO
#su
MAKRO
#TSOB
MAKRO
CHANGE
UPRO
CMDSMOD
HAPRO
CR
HAPRO
Beschreibung Lademodul aus REXX Programm erzeugen. Zusammenbau und SUBMIT eines Jobs, um eine REXX Prozedur zu kompilieren und einen Lademodul oder einen CALL Modul zu erzeugen. Online compile einer REXX Prozedur mit Erstellung der Cross Reference Informationen EPQMS.CROSS1. Das Programm kann TRACE Anweisungen enthalten. In diesem Fall wird keine Cross Reference erstellt. Blocksize für Disk 3390 berechnen. Dieses Makro berechnet die optimale Blocksize und die Anzahl benötigter Tracks für eine Datei, die auf dem Plattentyp 3390 angelegt werden soll. Aufruf: #R3390 recfm lrecl anzrecs Edit Makro fur Split und Join Funktion über PF Taste. Liste aus Super Search bereinigen. Löschen aller unnötigen Zeilen in der mit Super Search erzeugten Liste. Dieses Makro wird von der Prozedur "SS" als Initial-Makro aufgerufen. Es kann auch von Hand aufgerufen werden, wenn eine von der ISPF Funktion SRCHFOR erzeugte Liste in der VIEW Anzeige steht. Submitten einer JCL, die kein Job Statement enthält. Das Job Statement wird vor dem Submit mit den in diesem ISPF User mittels VARDAT gespeicherten Parametern versehen vorangestellt. #SU kann an folgenden Stellen aufgerufen werden: Als Edit Macro. Im ISPF Menü 3.4/M vor einem Membernamen. REXX Programm im TSO Batch ausfuhren. Edit Makro für den Submit eines Batch Jobs, der das REXX Programm im TSO Batch ausführt. Beim Makro Aufruf kann ein String als Parameter an das REXX Programm übergeben werden. CHANGE in REXX Texten durchführen. Mithilfe der Funktion CHANGE kann man in REXX Programmen Änderungen in Texten vornehmen. Bearbeiten von ISPF Command Tables. Beim Aufruf kann die APPLID mitgegeben werden. Default ist die aktive APPLID. Wenn das Panel CMDSMOD angezeigt wird, kann durch Eingabe des Primary Commands SAVELIST die Command Table in eine Datei ausgegeben werden. Management von Dateien. Funktionen: Siehe Hilfe Panel CRTU01
Tabelle 62 Die LANZ Utility Programme - Teil 3
24.4 Beschreibung der REXX Prozeduren Member DATEALL
Typ UPRO
DATUMOK
UPRO
DOC
HAPRO
DOCTEXT
HAPRO
EXABGL
HAPRO
EXNAME
COPY
ISPERROR
COPY
JD
HAPRO
JOBSUFF
UPRO
JULDATE
UPRO
LASTED
HAPRO
497
Beschreibung Universelle Funktion für Datumsberechnungen aller Art. DATEALL bietet folgende Berechnungsfunktion für Datumswerte: 3. Berechnung eines neuen Datums von einem gegebenen aus durch Angabe einer Differenz von Tagen. 4. Berechnung der Differenz in Tagen zwischen zwei Datumswerten. 5. Berechnung des Wochentags zu dem angegebenen Datum. 6. Berechnung des Datums des Ostersonntags in einem Jahr. 7. Rückgabe der Daten aller Feiertage eines Jahres. 8. Festellen, ob das angegebene Jahr ein Schaltjahr ist. Datum auf Korrektheit prüfen. Feststellen, ob ein Datum die richtige Form hat UND gültig ist. Erstellen der Dokumentation. Erstellen eines Inhaltsverzeichnisses mit Beschreibung der Memberinhalte auf Grund der DOC: Eintragungen eines Members und Erzeugung des Members $DOC im gleichen PDS/PDSE. Aufruf in einem DSLIST Panel vor dem DSN. Sequentielle Datei erstellen. Erstellen einer sequentiellen Datei aus einem $DOC Member zur Übertragung auf den PC zur Bildung einer Tabelle in MS Word. Member Abgleich zwischen REXX und CEXEC Datei. Entfernen aller Member aus einer CEXEC Datei, die nicht in der dazugehörigen REXX Datei enthalten sind. Aufruf in einer DSLIST vor dem DSN der REXX Quellkode Datei Einfügen der 'Start Programm' Meldung mit Programmname, wenn Ausführung im Batch erfolgt. Allgemeines Copy Member zur Ausgabe von ISPF Fehlermeldungen. Datum zu julianischem Datum ermitteln. Anzeige von Wochentag und Datum zu einem julianischen Datum, das in der Form JJJJ.DDD auf dem ISPF Bildschirm steht. Job Suffix Buchstaben bereitstellen. Bereitstellen eines fortlaufenden Job Suffix Buchstabens für die dynamische Bildung eines Jobnamens. Julian Date Umrechnungen. Funktion zur Umrechnung vom normalen Datumsformat in das Julian Date und umgekehrt. Zuletzt editierte Dateien bearbeiten. Prozedur zur Anzeige der letzten editierten Dateien und Auswahl für verschiedene Aufrufe zur Bearbeitung dieser Dateien.
Tabelle 63 Die LANZ Utility Programme - Teil 4
24 Die LANZ ISPF Utilities
498 Member LI
Typ HAPRO
LMGREAD
COPY
LOGONDSN
DATA
LOGON
HAPRO
MACROALL
HAPRO
MEMAB
HAPRO
MEMSLIST
UPRO
MEMVERJ
HAPRO
PDSREST PDSSICH
HAPRO HAPRO
REXXCL REXXLIBC
JCL HAPRO
SCHALTJ
UPRO
SS
HAPRO
Beschreibung Erzeugen eines IDCAMS LISTCAT einer Datei und Browse der Ausgabeliste. Aufruf in einer DSLIST vor dem DSN der Datei. Daten mit ISPF schnell lesen. Copy Member zum Lesen von Datensätzen mittels LMGET. Steuerdatei für das LOGON Verfahren. Die hier genannten Dateien werden jeweils vor die bereits vorhandenen Dateien oder zusätzlich zugeordnet. User Logon Prozedur, die die zusätzlichen DSNs aus einer Steuerdatei entnimmt. Die Steuerdatei mit dem Membernamen LOGONDSN muss in dem PDS userid.LOGON.CLIST vorhanden sein. Ausfuhren eines Edit Makros für alle Member eines PDS. Aufruf in einer DSLIST vor dem DSN in der Form: macroall / mname - Mname ist der Name des auszuführenden Makros. Abgleich der Members zwischen zwei PDS, indem alle Member im 1. PDS gelöscht werden, wenn sie im 2. ebenfalls enthalten sind. Beim Batch Aufruf sind die DD-Namen ERSTE und ZWEITE zu benutzen. Aufruf in einer DSLIST vor dem DSN der 1. Datei. Memberliste mehrerer PDS ausgeben. Externe REXX Prozedur zum Erzeugen einer Memberliste in einem Return-String. Die Eingabe einer Verkettung von bis zu 16 PDS ist möglich. Die DSN der PDS müssen beim Aufruf in einem String übergeben werden. Die DSN dürfen dabei nicht in Hochkommata eingeschlossen sein. Memberliste zweier PDS vergleichen. Es werden diejenigen Membernamen angezeigt, die in dem jeweils anderen PDS NICHT enthalten sind. Achtung: Diese Prozedur kann nur mit einem TSO Batch Job ausgeführt werden. ISPF Services werden nicht aufgerufen. Zurückladen aus dem PDS Sicherungspool. PDS Sicherung: Sicherungsprozedur. Prozedur zum Sichern der geänderten Members eines PDS mittels IEBCOPY in eine IEBCOPY Unload Datei. STUB für die Erstellung von REXX Lade Modulen. Feststellen, ob die REXX Library vorhanden ist. Diese wird in der LPA benötigt, um kompilierte REXX Programme laufen lassen zu können. Feststellen, ob JJJJ ein Schaltjahr ist. Gibt 1 zurück, wenn das angegebene Jahr ein Schaltjahr ist. Gibt 0 zurück, wenn das angegebene Jahr kein Schaltjahr ist. Aufruf von Super-Search in einer DSLIST vor einem DSN. Hierzu gehört das Edit Makro "#SS".
Tabelle 64 Die LANZ Utility Programme - Teil 5
24.5 Die Programme DOC und LASTED Member STRUKTR
Typ UPRO
TASID VARDAT
HAPRO HAPRO
VOLINF
HAPRO
XCURSOR
HAPRO
XEXTRACT
UPRO
499
Beschreibung Strukturieren großer Zahlen mithilfe von REXX. Strukturieren von großen Zahlen in eine Form mit Unterteilungen in Tausenderzahlen mit einem Trennzeichen. 12345678.55 wird z.B. zu 12.345.678,55. Als zweiter Parameter kann das Trennzeichen eingegeben werden. Wird kein Trennzeichen eingegeben, dann wird automatisch ein Blank als Trennzeichen benutzt. Aufruf des TASID Systems. Umgebungsvariablen speichern. Prozedur zum Festlegen und Abspeichern der Umgebungsvariablen für die TSO/ISPF Umgebung. Anzeige der Belegung von Disk Volumes. Ermittlung der Werte mittels IDCAMS DCOLLECT (VRecords). DSN Extraktion auf einem ISPF Bildschirm. Aufrufen einer Datei mit EDIT, VIEW, BROWSE, MEMLIST oder ausgeben der Data Set Information durch Positionieren des Cursor an irgendeiner Stelle des DSN auf dem Bildschirm. Der Bildschirm muss ein ISPF Bildschirm sein. Sonst gibt es keine Einschränkungen. Extrakt aus ISPF Bildschirm filtern. Funktion für das Extrahieren einer Zeichenkette aus einem ISPF Bildschirm.
Tabelle 65 Die LANZ Utility Programme - Teil 6
In den folgenden Kapiteln finden Sie die Beschreibungen zu den LANZ Utilities. Diese Beschreibungen sind wie folgt aufgeteilt: • • • • •
Die Die Die Die Die
Anwendungen, die jeweils aus mehreren Programmen bestehen. Edit Makros. REXX Programme. REXX Unterprogramme. REXX Copy Member.
Panels und Messages, die zu einzelnen Programmen gehören, sind beim jeweiligen Programm beschrieben.
24.5
Die Programme DOC und LASTED
Wenn man laufend in einer ISPF Umgebung einzelne Programmelemente, wie REXX Prozeduren, Panels, JCL usw. erstellt, hat man meistens das Problem, dass nach einiger Zeit der Überblick über die einzelnen Programmelemente verloren geht. Man fragt sich dann oft:
500
24 Die LANZ ISPF Utilities
„Wo habe ich diese Funktion schon einmal verwendet?" oder „Was macht eigentlich dieses oder jenes Programm?". In dieser Situation wäre es doch schön, wenn es irgendwo eine Datei gäbe, in der man Antworten auf diesbezügliche Fragen bekäme. Die hier beschriebenen Programme DOC und LASTED schaffen die Grundlagen, um eine solche Informationsquelle automatisch und mit geringem Aufwand zu erstellen. Diese Anwendung besteht nicht nur aus den beiden oben genannten Programmen. Es gehören auch noch weitere Programme und Edit Makros dazu. Alle Elemente zusammen bilden eine Anwendung, welche folgende zwei Aufgaben erfüllt: • •
Sie organisiert automatisch die Erstellung von Beschreibungen zu jedem Programmelement und sammelt diese Beschreibungen in jedem PDS im Member $DOC. Sie merkt sich jede Datei, die der Benutzer editiert hat, in einer ISPF Tabelle und bietet auf Wunsch mithilfe dieser Tabelle die einmal editierten Dateien zur wiederholten Verarbeitung an. Bei dieser Verarbeitung stehen mehrere Funktionen zur Verfugung.
Die Anwendung nutzt dabei die Möglichkeiten, die der ISPF Editor mit der Einrichtung von Initialmakros anbietet. Mithilfe dieser Einrichtung kann man den Ablauf von Edit Sitzungen so steuern, dass bei jeder Erstellung eines neuen Members der Benutzer aufgefordert wird, Dokumentationszeilen einzugeben. Definition der Dokumentationszeilen Alle im ISPF benutzten Programmelemente, wie z.B. REXX Prozeduren, Panels, Skeletons usw. erlauben es, Kommentarzeilen im Quellkode zu definieren. Diese Eigenschaft wird in dieser Anwendung dazu benutzt, den einzelnen Programmelementen einen Dokumentationskopf voranzustellen. Da die Dokumentationszeilen in den verschiedenen Programmelementen mit unterschiedlichen Kommentarzeichen beginnen, habe ich das jeweils zweite Wort einer solchen Dokumentationszeile dazu ausersehen, diese als spezielle Dokumentationszeile für den Dokumentationskopf zu erkennen. Eine Dokumentationszeile für die Programmdokumentation wird so definiert, dass das zweite Wort den Text DOC: enthält. Hier einige Beispiele für Programmdokumentationszeilen: REXX:
/ * DOC: Das ist ein Dokumentationstext
Panel:
/ * DOC: Das ist ein Dokumentationstext
JCL:
/ / * DOC: Das ist ein Dokumentationstext
Skeletons:
)CM DOC: Das ist ein Dokumentationstext
DB2-SQL
—
DOC: Das ist ein Dokumentationstext
*/
24.5 Die Programme DOC und LASTED
24.5.1
501
Beschreibung der Komponenten
Zunächst finden Sie hier die Beschreibung der Programmelemente, die zum Betrieb der Anwendung erforderlich sind. Die Überschriften beziehen sich immer nur auf das entsprechende REXX Programm. Die benutzten Panels sind jeweils bei dem Programm beschrieben, das die Panels aufruft. #IMACROA - Allgemeines Edit Macro. Dieses Makro wird bei jedem Edit Aufruf ausgeführt, bevor das Initial Makro zur Ausfuhrung kommt, und zwar auch dann, wenn kein Initial Makro für diese Datei definiert ist. Damit dieses Makro bei jedem Edit Aufruf aufgerufen wird, muss man dies einmalig in einer Edit Sitzung einstellen. Dies geschieht wie folgt: Man ruft eine Edit Session mit einer beliebigen Datei auf und gibt dort als Primary Command EDITSET ein und drückt ENTER. Daraufhin erscheint das folgende Panel, das man entsprechend ausfüllt, ENTER drückt und dann mithilfe der PF3 Taste verlässt: i
i
| ISREDSET Edit and View Settings I Command = = > | | Settings for current and future Edit and View sessions:
| | | |
More:
+
User session initial macro SIMACROA Maximum initial storage allowed for Edit and View . . 0 Target line for Find/Change/Exclude string 5 Enter "/" to select option Always position Find/Change/Exclude string to target line / Remove action bars in ISPF edit and view panels Force ISRE776 if RCHANGE passed arguments CUT default . . 1
1. Append 2. Replace
PASTE default . . 1
1. Delete 2. Keep
Settings for future sessions. Select Apply Setting Immediately for the setting to affect the current session as well. Enter "/" to select option / Confirm Cancel/Move/Replace Preserve VB record length
/ /
Apply Setting Immediately Apply Setting Immediately
Abbildung 133 Edit and View Settings Panel
Das grau unterlegte Feld muss mit dem Namen des „User session initial macro", wie zu sehen, gefüllt werden. Das dort eingetragene Makro wird bei jedem Editor Aufruf geladen und ausgeführt. Damit hat man die Voraussetzungen geschaffen, dass kein Editor Aufruf mehr möglich ist, ohne dass unsere Anwendung davon erfahrt und entsprechende Aktionen einleitet.
502
24 Die LANZ ISPF Utilities
Das Makro #IMACROA hat folgende Funktionen: •
•
Wenn für diesen DSN noch kein Initial Makro definiert ist, dann wird im Edit Profile die Option IMACRO auf #IMACR01 gesetzt. Bei folgenden Dateien wird nichts gesetzt: • Panvalet Edit Files • Work Files Es muss verhindert werden, dass PDSEs von mehreren LPARs aus editiert werden können. Dazu ist, nur bei Dateien vom Typ LIBRARY, folgende Logik implementiert: Wenn der HLQ mit PRO beginnt, kann der Edit nur in der LPAR erfolgen, in der die Zahl hinter PRO zu der LPAR passt. Z.B. PROO geht nur in LPRT, PROl nur in XYZ1 usw. Alle anderen PDSEs, die auf den in VOLS genannten VOLSERs liegen, können nur in LPRT editiert werden.
Tipp Wenn Sie dieses Makro installieren, müssen Sie wahrscheinlich die Logik mit der Bearbeitung der PDSEs anpassen. Sie können diese auch als Kommentar definieren. Falls Sie aber PDSEs benutzen und die Gefahr besteht, dass Sie PDSEs aus Versehen in mehreren LPARs editieren könnten, dann sollten Sie diese Logik an Ihre Gegebenheiten anpassen.
#IMACROI - Ändern der Lastedit Einstellung. Ändern der Einstellung für das Macro #IMACR02 für die Entscheidung, ob alle Edit Dateien in die Last Edit Tabelle eingetragen werden, oder nur diejenigen, die geändert wurden. Dieses Makro können sie von Hand aufrufen, um die Einstellung für die Aufnahme von Edit Dateien in die Tabelle der zuletzt editierten Dateien zu bestimmen. Wenn Sie in der Command Line einer Edit Sitzung eingeben: # IMACROI ALL
->
Werden künftig die Namen aller editierten Dateien in die Tabelle eingetragen.
# IMACROI CHANGE
->
Werden künftig nur die Namen der im Edit geänderten Dateien eingetragen.
Bei Aufrufen ohne Parametereingabe wird der jetzige Inhalt der Profilvariablen IMACROI angezeigt. Abgefragt wird die Variable IMACROI im Makro #IMACR02, das beim Verlassen einer Edit Sitzung aufgerufen wird und das die Eintragungen in die Tabelle der zuletzt editierten Dateien vornimmt. Hinweis Diese Möglichkeit der Steuerung, ob alle oder nur die editierten Dateien in die Tabelle eingetragen werden sollen, habe ich eingeführt, nachdem sich meine Tabelle durch viele Dateien gefüllt hatte, in denen ich aber nichts geändert hatte.
24.5 Die Programme DOC und LASTED
503
# I M A C R 0 1 - Einfügung von DOC-Zeilen. Funktionen • • •
EDIT Makro zur Einfügung von DOC Zeilen mit einer Inhalts- oder Funktionsbeschreibung der editierten Datei. Enthält die editierte Datei in den ersten 20 Zeilen bereits DOC: Zeilen, dann wird das Makro verlassen. Falls beim Durchsuchen der editierten Datei keine DOC: Zeilen gefunden werden, dann wird das Panel IMPANEL aufgerufen. Mithilfe dieses Panels können dann DOC: Zeilen erstellt werden, die an den Anfang des editierten Members gestellt werden. Dieses Panel wird aufgerufen wenn: • Die zu editierende Datei neu ist. • Die zu editierende Datei in den ersten 20 Zeilen keine DOC: Zeilen enthält.
Panels: IMACROI 1, IMACROI2 Beispiel Es wird eine neue Datei editiert. Daraufhin erscheint das folgende Panel: IMPANEL COMMAND ===>
Eingabe von DOC-Zeilen in (neue) Member
PF1 = Help, PF3 = Abbruch Datum = 16 AUG 2004 Data-Set-Name = PROX.UTIL.REXX(HUGO) Comment-Prefix = /* Comment-Suffix = */_ (z.B. * oder /* oder //* bzw */) Caps = OFF umsetzen in Grossbuchstaben ON oder OFF Datei-Typ = REXX_ z.B. REXX, JCL, PANEL usw. Funktionstyp = HAPRO z.B. MAKRO, HAPRO, COPY, UPRO Füllzeichen = * z.B. * (Stern), - (Bindestrich), (X'BF') Die DOC- und BEM-Zeilen werden am Beginn des neuen Members eingefügt Autor = COPYRIGHT LANZ GMBH, BEMPFLINGEN, GERMANY 1. DOC = Erste Zeile der Dokumentation DOC = Zweite Zeile DOC = Dritte DOC = DOC = 2.
BEM BEM BEM BEM BEM
= Erste Zeile der Bemerkung = Zweite = = =
Abbildung 134 Panel IMPANEL zur Eingabe der DOC Zeilen
Wenn man das obige Panel, wie zu sehen, ausgefüllt hat und ENTER drückt, erscheint der folgende Bildschirm der Edit Sitzung.
504
24 Die LANZ ISPF Utilities
ISREDDE4 PROX.UTIL.REXX(HUGO) - 01.02 Columns 00001 00072 Command = > Scroll = > CSR ****** ***************************** j 0 p 0 f Data ****************************** 000001 /* DOC: HUGO REXX HAPRO */ 000002 /* DOC: Erste Zeile der Dokumentation */ 000003 /* DOC: Zweite Zeile */ 000004 /* DOC: D r i t t e */ 000005 /* */ 000006 /* COPYRIGHT LANZ GMBH, BEMPFLINGEN, GERMANY 16 Aug 2004 */ 000007 /*********************************************************************/ 000008 /* BEM: Erste Zeile der Bemerkung */ 000009 /* BEM: Zweite */ 000010 / * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * / ****** **************************** Bottom of Data **************************** Wie Sie sehen, wurde jetzt ein kompletter Dokumentationskopf für ein REXX Programm erstellt. Die DOC: Zeilen aller Member eines PDS werden später durch einen Aufruf des Programms DOC in einer DSLISTe vor dem Namen dieses PDS gesammelt und unter dem Membernamen $DOC in den PDS geschrieben. Durch die gewissenhafte Nutzung dieser Funktionen, erhält man so, mit sehr geringem Aufwand, nach und nach eine komplette Dokumentation für alle Members eines PDS. Hinweis Ich habe die Zahl der möglichen Kommentar- und Bemerkungszeilen bewusst jeweils auf fünf beschränkt, denn hier soll ja nur eine kurze Funktionsbeschreibung des Programmelements erfolgen. Sie können natürlich diese Dokumentationszeilen beliebig nach Ihren Bedürfnissen auf bis zu 200 Zeilen erweitern. # I M A C R 0 2 - Editierte Datei in Tabelle SLElpar eintragen. Edit Makro, das aufgerufen wird, wenn eine Edit Session endet, die beim Aufruf durch das Initialmakro #IMACR01 gelaufen ist. Panels: IMACR021, IMACR022 Das Makro führt folgende Funktionen aus: • •
•
•
Eintragen des Namens der editierten Datei in die Tabelle SLElpar, wenn die ISPF PROFILE Variable IMACROI auf ALL geschaltet wurde. Eintragen des Namens der editierten Datei in die Tabelle SLElpar, wenn die ISPF PROFILE Variable IMACROI auf CHANGE geschaltet wurde und wenn: • Die Datei neu ist. • Die Datei während der Edit Session verändert wurde. Wenn das editierte Member ein REXX Programm ist und es verändert wurde, dann wird ein Panel aufgerufen, das anfragt, ob für das Member ein Compile Job submitted werden soll. Wenn zu dieser Datei eine parallele Ebene (Test oder Produktion) definiert ist und das Member auch in der Paralleldatei vorhanden ist, dann wird nachgefragt, ob auch das Member in der parallelen Ebene editiert werden soll. Die parallele Ebene wird in dem
505
24.5 Die Programme DOC und LASTED
Member STESTDSN des gleichen PDS definiert, aus dem heraus der Edit Aufruf erfolgte. Wenn das Member $TESTDSN nicht existiert, erfolgt auch keine Abfrage. Diese Einrichtung soll daran erinnern, dass sich ein Programm, sowohl in der Testebene als auch in der Produktionsebene befindet und man die gemachten Änderungen eventuell auch in der jeweils anderen Ebene nachziehen muss. Beispiele für die Ausgabe der möglichen Panels: 1. Beispiel: Frage, ob das Programm umgewandelt werden soll. i
| LASTEDI
Compile von REXX Prozeduren
| Sie haben die REXX Prozedur JULDATE
1
| j
geaendert.
Fuer die REXX Datei: PROX. UTIL REXX existiert die Datei: PROX UTIL .CEXEC | als Datei fuer compiled REXX Prozeduren. | Wollen Sie diese Prozedur jetzt kompilieren? | J
(J/N)
| PFK 3 / END bewirkt Abbruch I
Wenn man hier nur ENTER drückt, dann wird der Compiler Job submittet. Mit Drücken der PF3 Taste erfolgt keine Kompilierung. 2. Beispiel: Frage, ob das in der Test- bzw. Produktionsbibliothek stehende Member ebenfalls editiert werden soll. i | LPRT
1 Member auf Alternativebene
|
| Sie haben das Member
|
| PROX.LANZ. REXX (HUGO)
|
| editiert und dabei veraendert.
j
| Dieses Member existiert auch noch auf der | Alternativebene in der Datei:
| j
| PROX. LOGON. REXX | Wollen Sie dieses Member jetzt editieren?
| |
I _ (J/N)
|
| PFK 3 / END bewirkt Abbruch
|
506
24 Die LANZ ISPF Utilities
Tipp Diese Einrichtung hat mich schon sehr oft darauf hingewiesen, dass das gleiche Programm auch noch in der Test- bzw. Produktionsebene existiert und ich mich darum kümmern muss, was jetzt mit diesem Member geschehen soll. Durch eine solche Prüfung kann man sich manchen Ärger ersparen! DOC - Erstellen der Dokumentation. Erstellen eines Inhaltsverzeichnisses mit Beschreibung der Memberinhalte aufgrund der DOC: Eintragungen eines Members und Erzeugung des Members $DOC im gleichen PDS. Aufruf in einer DSLISTe vor dem DSN. Funktionen: •
•
• •
Diese Prozedur durchsucht alle Members eines PDS nach Zeilen, die als zweites Wort den Text 'DOC:' tragen. Die in diesen Zeilen vorhandene Dokumentation wird zusammen mit dem Membernamen in ein Member des gleichen PDS mit dem Namen $DOC geschrieben. Es werden maximal 200 Zeilen vom Anfang des Members her durchsucht. Wenn bis dahin keine DOC: Zeilen gefunden wurden, wird nur der Membername in das $DOC Member eingetragen. Die im String 'NMEM' des Programms DOC stehenden Members werden nicht durchsucht. Wenn mindestens eine DOC: gefunden ist und es kommen fünf Zeilen hintereinander, in denen kein DOC: steht, dann wird das weitere Durchsuchen beendet und die bis dahin gefundenen DOC: Zeilen werden für dieses Programm in das $DOC Member übernommen. Diese Maßnahme soll verhindern, dass weit hinten im Programm stehende DOC: Zeilen ebenfalls erfasst werden, obwohl sie nicht zur eigentlichen Programmdokumentation gehören.
Das folgende Beispiel zeigt einen Ausschnitt aus einem $DOC Member: ISREDDE4 PROX.UTIL.REXX($DOC) - 01.02 Columns 00001 00072 Command = > Scroll = - = > C S R ****** ***************************** Top of D a t a ****************************** 000001 ************************************************************************ 000002 * DOC: $DOC Steuermember 000003 * DOC: Inhaltsbeschreibung dieses PDS. E r z e u g t durch 'DOC' 000004 * DOC: a m 16 A u g 2004 u m 16:31:45 000005 * 000006 * D a t a s e t Name : PROX.UTIL.REXX 000007 * Anzahl Members: 81 000008 * 000009 ************************************************************************ 000010 ## 000011 ## REXX MAKRO 000012 E d i t M a c r o für d e n direkten A u f r u f v o n R E X X Prozeduren in 000013 d e r C o m m a n d Line einer P D F E d i t Session. Es k a n n ein 000014 Parameter m i t g e g e b e n werden, der a n die auszuführende R E X X 000015 Prozedur übergeben wird. 000016 #ALTXT 000017 #ALTXT REXX M A K R O
24.5 Die Programme DOC und LASTED 000018 000019 000020 000021 000022 000023 000024 000025 000026 000027 000028 000029 000030 000031 000032 000033 000034 000035 000036 000037 000038 000039
507
Edit Macro zur Neuformatierung von Texten innerhalb vorgegebener Spalten. Beschreibung mit Aufruf: #ALTXT ? #ASM #ASM REXX MAKRO Das Edit-Macro "#ASM" kann in einer Edit-Session aufgerufen werden, um einen Batch-ASSEMBLER-tAnwandlungsjob mit dem gerade editierten Member als Eingabedaten zu submitten. Es kann ein Test-Step angehängt werden. #CM #CM REXX MAKRO Erzeugt einen Kommentarblock an der Stelle des Cursors Als Parameter kann die Anzahl der Leerzeilen im Block angegeben werden. #DISP #DISP REXX MAKRO Umbau einer DD Zeile in einer JCL dahingehend, dass der DISP=xxx Parameter immer direkt hinter dem DD zuerst kommt. Der Cursor muss in einer DD Zeile stehen, in der ein DISP= und ein DSN= als Parameter vorkommen. #DPR #DPR
REXX MAKRO
DOCTEXT - Sequentielle Datei erstellen Erstellen einer sequentiellen Datei aus einem $DOC Member zur Übertragung in MS Word oder ein anderes Textbearbeitungssystem auf dem PC, um dort eine Tabelle zu bilden. Funktionsbeschreibung: Diese Prozedur erstellt aus dem $DOC Member eines PDS eine sequentielle Datei mit folgender Struktur: Member Name;Typ Untertyp;DOC Zeilen Diese Datei kann dann auf einen PC transferiert werden, um in einem Textverarbeitungssystem wie z.B. MS WORD aus dem Text schnell eine Tabelle mit drei Spalten zu erstellen. Durch das Einfügen der Semikolons sind die Steuerzeichen zum Erstellen der Tabelle mit einem Textverarbeitungswerkzeug schon vorhanden. Der Name der Ausgabedatei wird wie folgt gebildet: Name des PDS mit Suffix
.$DOC
Hinweis Beim File Transfer zum PC muss die "Download Translation Table" in der 3270Emulation auf Standard IBM eingestellt sein, sonst werden die Umlaute eventuell falsch übertragen. Mit diesem Verfahren wurden die hier zu findenden Tabellen der Programmbeschreibungen erstellt.
508
24 Die LANZ ISPF Utilities
LASTED - Zuletzt editierte Dateien bearbeiten Prozedur zur Anzeige der letzten editierten Dateien und Auswahl für verschiedene Aufrufe zur Bearbeitung dieser Dateien. Zugehörige Panels: LASTED, LASTEDI. Diese Prozedur zeigt ein Panel, das die Namen der zuletzt editierten Dateien enthält. In jeder Zeile der Anzeige können verschiedene Auswahlkodes zur Bearbeitung der entsprechenden Datei eingegeben werden. Die Darstellung kann in zwei Sortierungen erfolgen. Ebenso kann die Anzahl der Zeilen in der Tabelle reduziert werden. Beispiel einer Anzeige: LPRT Tabelle mit den zuletzt editierten Dateien anzeigen Row 54 to 86 of 86 COMMAND = > SCROLL = = > CSR Sort: D - Date or N = Name D
Maximale Zeilen: 86 Datum
C Letzte DSN in Edit PROX. UTIL. RE XX (ALIAS) PROX. UTIL . REXX (#SU) PROX.UTIL.REXX(#SPLJ) PROX.UTIL.REXX(#BIND) PROX. BUCH. REXX (LMMLIST) PROX.BUCH.REXX(LISTDS) PROX. BUCH. REXX (BUBBWORD) _ PROX. BUCH. REXX (BINSUCH1) *******************************
Bottom of data
Zeit
04/08/13 15:32 49 04/08/13 15:32 20 04/08/13 15:32 06 04/08/13 15:28 05 04/08/13 15:23 37 04/08/13 15:22 50 04/08/13 15:20 45 04/08/13 15:20 17 ********************************
Die Verarbeitungsmöglichkeiten, die in diesem Panel bestehen, entnehmen Sie bitte dem Hilfetext, der durch Drücken der PF 1 Taste erscheint. Hinweis Wenn Sie das Programm LASTED aufrufen und es ist ein „Edit Recovery" anhängig, dann wird dieses zuerst durchgeführt. Dabei arbeitet das Programm LASTED genau so, wie der Editor selbst in einem solchen Fall.
24.6
Das Member Save- und Restore System
Sie haben sich vielleicht auch schon einmal darüber geärgert, dass Ihnen eine frühere Version eines Programms nicht mehr zur Verfügung stand. Manchmal möchte man nachschauen, wie diese Version des Programms gearbeitet hat. Außerdem interessiert es einen auch, wann ein Programm aus einer bestimmten Datei gelöscht wurde. Die Standardsicherungen der MVS Systeme reichen oft nur ca. vier Wochen zurück, so dass man hier bei solchen Fragen meist nicht fündig wird.
24.6 Das Member Save- und Restore System
509
Aus all diesen Gründen hab ich mir für meine eigenen Partitioned Data Sets ein Sicherungssystem geschrieben, dass folgende Möglichkeiten bietet: Ich kann jederzeit sehen, was mit einem Member in einem PDS seit der letzten Sicherung geschehen ist. Und zwar: • • •
Ob das Member NEU ist. Ob das Member geändert wurde. Ob das Member gelöscht wurde.
Diese Informationen stehen in dem vom Sicherungsprogramm fortlaufend gepflegten Statistik Member $PDSHIST im PDS selbst. Das Statistik Member wird bei einer erstmaligen Sicherung in diesem PDS automatisch angelegt und es wird auch zum Zurückladen benutzt. PDSSICH - PDS Sicherung: Sicherungsprozedur Funktion Prozedur zum Sichern der geänderten Members eines PDS mittels IEBCOPY in eine IEBCOPY „Unload" Datei. Diese Prozedur kann ONLINE in einer DSLISTe vor dem Namen eines PDS aufgerufen werden. Sie kann auch in einem TSO/ISPF Batch Job benutzt werden. Sie erkennt dabei automatisch die Art des Aufrufs. Online: Batch:
Die Prozedur muss im ISPF Menü 3.4 oder einer DSLIST vor dem DSN eines PDS aufgerufen werden. Es wird nur dieser eine PDS verarbeitet. Der Aufruf erfolgt innerhalb eines Batch Jobs in einem TSO/ISPF Step. Es können dabei mehrere Dateien in einem Durchlauf gesichert werden. Die Namen der Dateien werden über das DD Statement PDSSICH eingelesen.
Bei Batch Verarbeitung wird ein Protokoll über SYSTSPRT ausgegeben. Meldungen • •
Bei einem Batch Aufruf werden die Meldungen über SYSTSPRT mit Hilfe von SAY ausgegeben. Bei der ONLINE Verarbeitung werden die Meldungen über den ISPF Message Service durch Verwendung der Variablen ZEDLMSG mithilfe von SETMSG ausgegeben.
Die Namen der Sicherungsdateien werden wie folgt gebildet: HLQ.$JJMMTT.$HHMMSS.XXX Es bedeuten: HLQ $ JJMMTT $HHMMSS XXX
High Level Qualifier des zu sichernden DSN. Datum der Ausfuhrung. Uhrzeit der Ausführung. 2. bis n-ter Qualifier des DSN.
510
24 Die LANZISPF Utilities
Daraus ergibt sich, dass die Namen der zu sichernden Dateien nicht länger als 28 Zeichen sein dürfen, denn der fixe Teil, um den ein DSN erweitert wird, ist 16 Zeichen lang. Es werden nur solche Member gesichert, die sich seit der letzten Sicherung verändert haben. Um die Änderungen zu erkennen, wird bei jedem Ablauf dieser Prozedur das Member SPDSSICH erstellt. In diesem Member werden die Membernamen, die VV.MM Information aus der Statistikzeile und das Datum der letzten Sicherung gespeichert. Beispiel des Members SPDSSICH * DOC: DATENSICHERUNG VOM 20 May 2003 um 14:54:13
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
ACBCHP ACBCHT ALIAS PR ALLJBN ALLLLIB
01.37 01.17 01.09 01.08 01.06
2003/05/20-14 2003/05/20-14 2003/05/20-14 2003/05/20-14 2003/05/20-14
54:13 54:13 54:13 54:13 54:13
Beim Ablauf der Prozedur wird verglichen, ob sich das Modify Datum eines Members seit der letzten Sicherung geändert hat. Wenn ja, dann wird dieses Member gesichert und die Eintragung VV.MM und das Datum werden im Member SPDSSICH nachgezogen. Ein Member wird nicht gesichert, wenn • •
sich das Modify Date seit der letzten Sicherung nicht geändert hat. für das Member keine Statistik Informationen vorhanden sind.
Sicherungs-Historie im Member SPDSHIST: Damit man verfolgen kann, welche Member wann und in welcher Datei gesichert wurden, wird in jedem von dem Sicherungsprogramm verarbeiteten PDS das Member SPDSHIST automatisch gespeichert und bei jeder Sicherung gepflegt. Darin ist eingetragen, welche Member bei einem Sicherungslauf gesichert wurden, sowie der Name der Datei, in der die jeweilige Sicherung steht. Dieses Member wird immer mit gesichert, wenn mindestens ein reguläres Member gesichert wird. Sein Name wird aber im Member selbst nicht jedes Mal mit aufgeführt. Ferner werden in SPDSHIST noch folgende Informationen in der 3. Spalte eingetragen: UPD
Das Member war vor dem vorherigen Sicherungslauf schon in der Datei enthalten, ist inzwischen geändert worden und wird deshalb in die Sicherungsdatei übernommen.
NEW
Das Member war zum Zeitpunkt des vorigen Sicherungslaufs noch nicht in der Datei enthalten und wird jetzt zum ersten Mal gesichert.
DEL
Das Member war beim vorherigen Sicherungslauf noch in der Datei enthalten und ist jetzt nicht mehr vorhanden.
24.6 Das Member Save- und Restore System
511
Beispiel des Members SPDSHIST * DOC: Member-Historie der inkrementellen Sicherung * DOC: Begonnen am 21 May 2003 um 13:13:51 * DOC: Dataset: PROX.LANZ.TTTT CAFREXXT 01.07 NEW PROX.$030521.$131351.LANZ.TTTT COMPPP1 01.02 NEW PROX. $030521. $131351. LÄNZ. TTTT DYNTEST 01.03 NEW PROX.$030521.$131351.LÄNZ.TTTT #T #TT AA ACBCHT COMPPP1
01.08 01.04 01.04 01.13 01.03
NEW NEW NEW NEW UPD
PROX.$030521.$131604.LANZ.TTTT PROX.$030521.$131604.LANZ.TTTT PROX.$030521.$131604.LANZ.TTTT PROX.$030521.$131604.LANZ.TTTT PROX.$030521.$131604.LANZ.TTTT
#T AA #TT
01.09 UPD PROX.$030521.$131726.LANZ.TTTT 01.05 UPD PROX.$030521.$131726.LANZ.TTTT 01.04 DEL
PDSREST - Zurückladen aus dem PDS Sicherungspool Panels: PDSREST Mit PDSREST können Members, die mit PDSSICH gesichert wurden, aus den Sicherungsdateien zurück geladen werden. Dabei kann entweder die ganze Datei oder auch nur ein ausgewähltes Member zurück geladen werden. Die Prozedur PDSREST wird vor dem Namen eines PDS im Menü 3.4 aufgerufen. Die Prozedur stellt zunächst fest, ob dieser PDS schon jemals von PDSSICH gesichert wurde. Wenn ja, dann wird das Member SPDSHIST gelesen, in eine ISPF Tabelle umgespeichert und mithilfe des Panels PDSREST angezeigt. Beispiel Ich habe vor dem PDS PROX.BUCH.REXX den Aufruf PDSREST eingegeben und daraufhin folgende Anzeige erhalten:
512
24 Die LANZ ISPF Utilities
LPRT Zurückladen aus der PDS-Datensicherung COMMAND = = >
Row 1 from 447 SCROLL = = > CSR
R in Spalte C: Zurückladen der in dieser Zeile stehenden Sicherungsdatei. Wenn mehrere Zeilen ein R enthalten, wird nur die ERSTE Auswahl ausgeführt. Auswahl Member Storclas = T1WKPOOL RETPD = 10 Laden Member _____ ALLE oder Blank. Bei Blank wird nur ein Member geladen C Member W . M M Dis User Sicherungs-Dataset COMPRESS 01.,19 NEW LANZT PROX. $040426. $235608 . BUCH.REXX LMMSTATS 01..01 NEW LANZT PROX. $040528,.$235615 .BUCH .REXX ADRTEST 01.,03 UPD LANZT PROX. $040602..$235620 .BUCH,.REXX STRUKTRT 01..01 UPD LANZT PROX. $040602,.$235620 .BUCH .REXX TTT 01..03 UPD LANZT PROX. $040602,.$235620 .BUCH .REXX LMDDISP
01.,00 NEW LANZT PROX. $040603,.$235626 .BUCH REXX
' #TTT USERSTAT 01..01 UPD LANZT PROX. $040607,.$235610 .BUCH..REXX 01.,00 NEW SQMTP PROX. $040607,.$235610 .BUCH..REXX ALTLIB Die Anzeige
01..02 UPD LANZT PROX. $040708. $235609 .BUCH,.REXX ist ab hier
abgeschnitten
Die grau unterlegten Felder sind Eingabefelder. Ich habe dann in dem Eingabefeld „Auswahl Member" den Text COM* eingegeben und ENTER gedrückt. Diese Aktion brachte folgenden Bildschirm zur Anzeige: LPRT Zurückladen aus der PDS-Datensicherung COMMAND = = >
Row 135 from 447 SCROLL = > CSR
R in Spalte C: Zurückladen der in dieser Zeile stehenden Sicherungsdatei. Wenn mehrere Zeilen ein R enthalten, wird nur die ERSTE Auswahl ausgeführt. Auswahl Member COM* Storclas = T1WKPOOL RETPD = 10 Laden Member ALLE oder Blank. Bei Blank wird nur ein Member geladen C Member W . M M Dis User Sicherungs-Dataset _ COMP 01.04 UPD SQMTP PROX. $040813 . $235612 .BUCH. REXX _ COMP 01.02 UPD LANZT PROX.$040811.$235609.BUCH.REXX _ COMP 01.01 NEW LANZT PROX.$040804.$235602.BUCH.REXX _ COMPRESS 01.24 NEW LANZT PROX.$040816.$235607.BUCH.REXX _ COMPRESS 01.19 UPD LANZT PROX.$040510.$235622.BUCH.REXX _ COMPRESS 01.19 NEW LANZT PROX. $040426. $235608 .BUCH .REXX _ COMPRESS 01.19 DEL ******************************* Bottom of data ***********
Es wurden jetzt alle Member angezeigt, die mit COM Beginnen. Wie man sieht, wurde das Member COMP am 04.08.2004 zum ersten Mal gesichert. Das Member COMPRESS wurde zweimal in den PDS gebracht und ist inzwischen aber nicht mehr vorhanden. Der DSN der zurück geladenen Datei wird dadurch gebildet, dass die in der Sicherungsdatei vor den Qualifiers zwei und drei stehenden $-Zeichen durch #-Zeichen ersetzt werden. Wenn bei einem erneuten Zurückladen aus derselben Sicherungsdatei die vorher schon einmal an-
24.7 LOGON - Die eigene Logon Prozedur
513
gelegte Restore Datei noch vorhanden ist, dann werden die zurück geladenen Members in die bereits vorhandene Datei geschrieben. Beispieljob beim Zurückladen in eine neue Datei //LÄNZTRES JOB (09101999,00000000,46100000),'PDS RESTORE JOB', // NOTIFY=LANZT,MSGLEVEL=(1,1),MSGCLASS=H, // CLASS=A,REGION=OM,USER=SQMTP //************************************************** //IEBCOPY EXEC PGM=IEBCOPY,REGION=20M IISYSPRINT DD SYSOUT=* / /SYSUT1 DD DISP=SHR,DSN=PROX. $040813. $235612. BUCH. REXX //SYSUT2 DD DISP=(NEW,CATLG,DELETE),RETPD=10, // SPACE=(TRK,(1000,100,10),RLSE), II STORCLAS=TlWKPOOL,DSNTYPE=LIBRARY, II DSN=PROX.#040813.#235612.BUCH.REXX //SYSIN DD * COPY INDD=SYSUTl,OUTDD=SYSUT2 SELECT MEMBER=ALTLIB1 Beispieljob beim Zurückladen in eine bereits vorhandene Datei //LÄNZTRES JOB (09101999,00000000,46100000),'PDS RESTORE JOB', // NOTIFY=LANZT,MSGLEVEL= (1,1) ,MSGCLASS=H, // CLASS=A,REGION=0M,USER=SQMTP //************************************************** //IEBCOPY EXEC PGM=IEBCOPY,REGION=20M //SYSPRINT DD SYSOUT=* //SYSUT1 DD DISP=SHR,DSN=PROX.$040813.$235612.BUCH.REXX //SYSUT2 DD DISP=SHR,DSN=PROX.#040813.#235612.BUCH.REXX //SYSIN DD * COPY INDD=SYSUTl,OUTDD=SYSUT2 SELECT MEMBER=COMP Wie Sie sehen, wird jetzt die bereits vorhandene Datei als Ausgabedatei benutzt.
24.7
LOGON - Die eigene Logon Prozedur
Sehen Sie hierzu auch die Beschreibung der LOGON Prozedur im Kapitel „Das TSO/ISPF Logon Verfahren" ab Seite 35. L O G O N - Die Logon Prozedur Die LOGON Prozedur der LANZ Utilities arbeitet wie folgt: •
Die bestehenden Zuordnungen werden erfasst und für die spätere Benutzung intern gespeichert.
•
Das Member LOGONDSN wird gelesen und die dort eingetragenen Anweisungen für zusätzliche Zuordnungen werden ebenfalls gespeichert.
•
Es wird geprüft, ob die im Member LOGONDSN genannten Dateien existieren. Wenn eine Datei nicht existiert, dann wird eine Meldung erzeugt und diese eine Datei wird bei der neuen Zuordnung nicht berücksichtigt.
514 •
24 Die LANZ ISPF Utilities
Dann werden neue Zuordnungen so erstellt, dass die im Member LOGONDSN genannten DSNs vor den bereits vorher vorhandenen DSNs in den einzelnen DSN Ketten gestellt werden. Wenn für einen bestimmten DD Namen vorher keine Zuordnung existierte, dann wird diese neu angelegt.
Durch diese Vorgehensweise entstehen folgende Vorteile gegenüber herkömmlichen Logon Verfahren: • • • •
Der TSO Benutzer kann völlig selbständig und auf einfache Art bestimmen, welche Dateien in welcher Reihenfolge vor den Standard Zuordnungen stehen sollen. Der TSO Benutzer benötigt keine Programmierkenntnisse. Der Befehl CONCATD wird nicht benötigt. Wenn eine im Member LOGONDSN genannte Datei nicht existiert, dann wird das Logon Verfahren trotzdem vollständig durchgeführt, so dass der TSO Benutzer immer ein bedienfähiges ISPF System erhält.
LOGONDSN - Datei der Logon Data Sets In diesem Member werden die DSNs angegeben, die zusätzlich vor die bereits vorhandenen DSN Ketten zugeordnet werden sollen.
Beispiel der Datei LOGONDSN 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
* DOC: REXX LOGONDSN DATA * DOC: Steuerdatei für das LOGON Verfahren. Die hier genannten * DOC: Dateien werden jeweils vor die bereits vorhandenen Dateien * DOC: oder zusätzlich allokiert. ********************************************************************** * Bern: Diese Datei wird von der LOGON Prozedur benutzt. * Bern: Wenn sie fehlt, ist keine Zuordnung von privaten Bibliotheken * Bern: möglich. * Bern: Zeilen mit einem Stern auf Spalte 1 werden von der Prozedur * Bern: LOGON überlesen. * * Diese Tabelle hat folgenden Aufbau: * * DDNAMEN1 DSN1 [ONLY] * DSN2 * DSN3 * DDNAMEN2 DSN1 * DSN2 * DSN3 * * Wenn in der gleichen Zeile, in der der DDNAMEx steht als 3. Wort der * Text ONLY steht, dann werden alle bisherigen Verkettungen unter * diesem DDNAMEN bei der Neuzuordnung weggelassen und nur die hier * stehenden DSNs werden allokiert. ********************************************************************** *SYSPROC LANZT.LOGON.CLIST SYSEXEC PROX. BUCH . CEXEC ONLY PROX. UTIL. CEXEC PROX. LANZ. CEXEC PROX. LOGON. CEXEC
24.7 LOGON - Die eigene Logon Prozedur 31 32 33 34 35 36 37 38 39 40 41 42 43
ISPPLIB
ISPMLIB
ISPTLIB ISPLLIB
ISPTABL
515
PROX.SQMT.CEXEC PROX.BUCH.PANEL PROX.UTIL.PANEL PROX.LANZ.PANEL PROX.LOGON.PANEL PROX.BUCH. MSGS PROX. UTIL. MSGS PROX.LOGON.MSGS LANZT.ISPF.TLIBTAB PROX. LANZ. LOAD PROX.LOGON.LOAD SYS1. SADMMOD LANZT. ISPF. TLIBTAB
Programm 57 LOGONDSN: DSN Datei fir das LOGON Verfahren
In dem Beispiel finden Sie alle Information zur Benutzung dieser Datei. Hier jetzt ein Beispiel vom Beginn des Ausdrucks beim Ablauf der LOGON Prozedur: 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19
Private Logon Prozedur im User LANZT gestartet LPAR: LPRT DDNAME: SYSEXEC is freed due to ONLY Parameter FILE ISPTABL NOT FREED, IS NOT ALLOCATED SYSEXEC OK PROX.BUCH.CEXEC OK PROX. UTIL. CEXEC OK PROX. LANZ . CEXEC OK PROX.LOGON.CEXEC OK PROX. SQMT.CEXEC ISPPLIB OK PROX.BUCH. PANEL OK PROX. UTIL. PANEL OK PROX. LANZ. PANEL OK PROX. LOGON. PANEL ISPMLIB OK PROX.BUCH.MSGS Not-found PROX.UTIL.MSGS OK PROX.LOGON.MSGS OK SYST1.PDSFAST.CNTLLIB OK SYST1. JCLPLUS . ISPMLIB OK SYST1.TSO.ISPMLIB
Erklärungen Zeile 03 Durch die Angabe des ONLY Parameters in der Definition für SYSEXEC wird durch die LOGON Prozedur ein FREE durchgeführt. Die alte Definition für SYSEXEC wird aber nicht gespeichert, da ja nur die neue Definition gelten soll. Zeile 15 Die Datei PROX.UTIL.MSGS ist im Member LOGONDSN für die Zuordnung unter ISPMLIB angegeben. Da diese Datei aber noch nicht existiert, wird nur der Hinweis ausgegeben, die übrige Zuordnung für ISPMLIB aber durchgeführt.
516
24 Die LANZ ISPF Utilities
24.8
Eigene Variable in den Profile stellen
Schon vor langer Zeit habe ich begonnen, meine Jobs in der Job JCL Bibliothek ohne Job Statement zu speichern. Wenn ich einen Job submitten will, benutze ich dann das Makro #SU. Siehe hierzu das Kapitel „#SU - Jobs submitten" ab Seite 529. Dieses Makro erstellt ein passendes Job Statement vor den übrigen JCL Statements der Datei und submittet dann den Job. Was ist der Vorteil eines solchen Verfahrens? • • •
•
Die Jobnamen werden automatisch mit einem Suffix, der sich von Submit zu Submit (ebenfalls automatisch) ändert, versehen. Die Angaben über MSGLEVEL, MSGCLASS, ACCOUNT und Userid für den NOTIFY und USER Parameter sind immer richtig. Die JCL kann von mehreren Benutzern ohne Änderungen benutzt werden. Diese müssen lediglich die Prozedur VARDAT mit ihren spezifischen Werten bestücken und einmal ausführen. Wenn ich meine Utilities bei einem anderen Kunden installiere, muss ich die Daten nur einmal in der Prozedur VARDAT eintragen, diese laufen lassen und kann sofort meine mitgebrachte JCL und alle Programme benutzen, die diese Werte benötigen.
VARDAT - Umgebungsvariablen speichern Prozedur zum Festlegen und Abspeichern der Umgebungsvariablen für die TSO/ISPF Umgebung. Hier meine z.Zt. gültige Prozedur VARDAT: 01 02 03 04 05 06 07 08 09 10
11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
/* DOC: VARDAT REXX */ /* DOC: Umgebungsvariablen speichern. */ /* DOC: Prozedur zum Festlegen und Abspeichern der Umgebungsvariablen*/ /* DOC: für die TSO/ISPF Umgebung. */ /* */ /* COPYRIGHT LANZ GMBH, BEMPFLINGEN, GERMANY 13 Sep 1994 */ /*********************************************************************/ /* Diese Prozedur kann mit dem ISPF Command VARdat in den EDIT */ /* geholt werden. */ / * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /
/* Laden der für eine bestimmte Installation gültigen VAR Umgebung. */ /* Diese Werte werden von verschiedenen Prozeduren eingelesen */ /* Falls in dieser Prozedur Änderungen vorgenommen wurden, muss die */ /* Prozedur direkt mit dem Edit Macro >##< ausgeführt werden. */ /* Diese Prozedur sollte für jeden TSO User in dessen EXEC Datei */ /* gespeichert werden, damit sich die einzelnen User nicht gegen*/ /* seitig Daten überschreiben. */ /*********************************************************************/ anfang: /* Hier beginnen die Zuweisungen. Diese Zeile muss bleiben */ account = "09101999,00000000,46100000" /* Account Nummer */ jobclass = "A" /* Job Run Class */ msgclass = "H" /* Job Message Class */ maclib =2 /* Anzahl Maclibs */ sysproc = 0 /* Anzahl SYSPROCs */ sysexec = 4 /* Anzahl SYSEXECs */
24.8 Eigene Variable in den Profile stellen 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
517
steplib = 3 /* Anzahl STEPLIBs */ ispslib = 1 /* Anzahl Skel-Libs */ db2sys = "DB2P" /* Standard DB2 Server */ storclas = "DPPOOL" /* Standard Storage Class */ mgmtclas = "MlTSOOl" /* Standard Management Class */ dataclas = " " /* Standard Data Class */ maclibl = "SYS1.MACLIB" /* Assembler Maclib Nr. 1 */ maclib2 = "SYS1.MODGEN" /* Assembler Maclib Nr. 2 */ sortiib = "SYS1.LINKLIB" /* SORT Linklib */ userlnk = "PXXO.LANZ.LOAD" /* User Linklib */ sortunit = "VIODA" /* SORT Workfile Unit */ sysexecl = "PROX.LANZ.REXX" /* Execs */ sysexec2 = " PROX. LOGON. REXX" /* Execs */ sysexec3 = "SMQP.USER.CEXEC" /* Execs */ */ sysexec4 = "SMQP.PROD.CEXEC" /* Execs steplibl = "PROX.LOGON.LOAD" /* Steplibs */ steplib2 = "DB2P.ALIAS.DSNLOAD" /* Steplibs */ steplib3 = "SMQP.LOAD" /* Steplibs */ ispslibl = "SQMT.USER.SKEL" /* Slibs */ usrcntl = usrpre".CNTL" /* CNTL Datei */ ende: /* Hier enden die Zuweisungen. Diese Zeile muss bleiben */ /*********************************************************************/
48 /* Die definierten Variablen in den User Profile schreiben. */ 49 /*********************************************************************/ 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65
do k = 1 to 1000 zeile = sourceline(k) if word(zeile,1) = "anfang:" then leave k end k ispfvars = "" "CLRSCRN" do i = k+1 to 1000 zeile = sourceline(i) if word(zeile,1) = "ende:" then leave i ispfvars = ispfvars translate(word(zeile,1)) interpret "hugo = " word(zeile,1) say left(word(zeile,1),12) "=" hugo end i address "ISPEXEC" "VPUT ("ispfvars") PROFILE" if rc > 0 then "SETMSG MSG(ISRZ002)"
Programm 58 VARDA T: Umgebungsvariable definieren und speichern
Zeile 19 Der hier definierte Label besagt, dass mit dem danach folgenden Statement die Zuweisung der Variablen beginnt. Zwischen dieser Zeile und der Zeile mit dem Label ende: dürfen nur Zuweisungen stehen. Jede Zeile darf nur eine Zuweisung enthalten. Zeilen 23 bis 27 In diesen Variablen wird die Anzahl der für eine Verkettung definierten DSNs angegeben. Diese Zahl muss natürlich mit den entsprechenden Definitionen der DSNs weiter unten übereinstimmen. Eine Plausibilitätsprüfung dieser Übereinstimmung findet hier nicht statt.
518
24 Die LANZ ISPF Utilities
Zeilen 28 bis 45 Hier werden den einzelnen Variablen Werte zugewiesen. Zeile 46 Hiervor enden die Variablenzuweisungen. Zeilen 50 bis 53 In dieser Schleife wird der Labelanfang gesucht. Zeilen 56 bis 62 Sammeln der Variablennamen im String „ISPFVARS" und ausgeben der Variableninhalte mit SAY als Echoprint. Zeile 64 Ausgeben der im String ISPFVARS gesammelten Variablen in den User Profile Pool. Diese Variablen werden in den folgenden Makros und Programmen benötigt: #ASM #DPR #ISPFB #RC #RCLOAD #SU #TSOB CR PDSREST
Submit Assembler Compile Job. Submit Print Data Set Job. Submit ISPF Batch Job zur Ausführung einer REXX Prozedur. Submit REXX Compiler Job für CEXEC Kompilierung. Submit REXX Compiler Job fur LOAD Kompilierung. Submit allgemeinen Batch Job aus JCL Bibliothek. Submit TSO Batch Job zur Ausführung einer REXX Prozedur. Data Set Management Utility. Submit Restore Job.
Tipp Wenn Sie also eines dieser Utilities nutzen wollen, müssen Sie zuerst Ihren Variablen Pool mithilfe der oben beschriebenen Prozedur VARDAT laden.
24.9
Die Makros
Diese Makros habe ich im Laufe der Zeit für alle möglichen Zwecke entwickelt. Ich benutze Sie sehr oft, denn sie beschleunigen meine Arbeit bei der Entwicklung und Pflege von ISPF Programmelementen ganz erheblich.
24.9 Die Makros
24.9.1
519
## - REXX Prozedur direkt im Edit ausführen
Funktion Direktes Ausfuhren einer REXX Prozedur in einer Editor Sitzung. Beschreibung Dies ist das von mir am meisten benutzte Makro. Wenn man eine REXX Prozedur im Editor erstellt und bearbeitet, kann man in der Command Line einfach ## eingeben und schon wird die Prozedur ausgeführt. Dabei kann ein Parameter mitgegeben werden, der an die auszuführende REXX Prozedur übergeben wird. Regeln • •
•
Der Inhalt des im Edit befindlichen Members wird unter dem Membernamen in eine temporäre VIO Datei geschrieben und dann sofort als REXX Prozedur ausgeführt. Da kein Editor SA VE Befehl erfolgt, bleibt der UNDO Status der Edit Sitzung erhalten. Man kann also jederzeit Änderungen mit UNDO zurücknehmen, obwohl man die Prozedur schön des Öfteren ausgeführt hat. Die temporäre Datei wird unter dem DD Namen ##DD angelegt. Man kann sie mithilfe des Befehls DDLIST finden.
Hinweis Wenn Sie ein Edit Makro entwickeln, können Sie dieses natürlich nicht mit ## ausführen lassen. Der Grund liegt darin, dass das Makro ## die im Edit stehende Datei ja als Prozedur aufruft. In einer mit EXEC aufgerufenen Prozedur darf aber kein MACRO Befehl vorkommen. Außerdem erwartet das Makro, dass es in einer Edit Sitzung die dort vorhandenen Daten verarbeiten soll. Da sich aber Ihr eigenes Makro in der Edit Sitzung befindet, wäre es nicht sonderlich hilfreich, das Makro mit diesen Daten zu testen.
24.9.2
#PAN - Panels direkt im Editor testen
Funktion Direkter Aufruf eines in der Edit Sitzung befindlichen Panels. Beschreibung Wenn man Panels entwickelt, ist es oft etwas mühsam, diese schnell zu testen. Mit diesem Makro können Sie in einer Edit Sitzung zur Entwicklung eines Panels eine PF Taste mit dem folgenden Text belegen: #PANß2ßß. Ich benutze dafür die PF 14 Taste. Wenn Sie nun ein Panel im Editor stehen haben, brauchen Sie nur die PF14 Taste zu drücken und schon wird Ihr Panel aufgerufen.
520
24.9.3
24 Die LANZ ISPF Utilities
#RO - REXX Prozeduren direkt im Editor umwandeln
Die drei Makros #RO, #RC und #RCLOAD sind für Sie nur interessant, wenn Sie mit kompilierten REXX Prozeduren arbeiten. Hinweis I Wenn Sie sich mit dem REXX Compiler beschäftigen wollen, sollten Sie sich die IBM Broschüre IBM Compiler and Library for SAA REXX/370: User's Guide and Reference beschaffen. Dort finden Sie alles zum Thema Compiler für REXX. Funktion Online Kompilierung einer REXX Prozedur. Beschreibung Diese Prozedur kann nur als Edit Makro aufgerufen werden. Nach dem Aufruf wird die im Edit befindliche REXX Prozedur in eine VIO Datei geschrieben, die dann beim Online Aufruf des REXX Compilers als SYSIN Datei benutzt wird. Durch die Anwendung dieser Technik bleibt der Change Status der Edit Sitzung erhalten. Der UNDO Befehl ist also nach einer Kompilierung immer noch benutzbar. Ausgabe Datei: Der Name der Ausgabedatei, die das Compiler Ergebnis aufnimmt, wird dadurch gebildet, dass der LETZTE Qualifier der Eingabedatei durch 'CEXEC' ersetzt wird. Beispiel:
Eingabedatei Ausgabedatei
PROX.LOGON.REXX PROX. LOGON. CEXEC
Plausibilitätsprüfungen: Bei Auftreten folgender Sachverhalte wird eine Fehlermeldung erzeugt und der Compile nicht durchgeführt: • • •
Wenn in der 1. Zeile des zu kompilierenden Quellkodes nicht der Text REXX oder rexx enthalten ist. Wenn die Ausgabedatei nicht existiert. Wenn der Compiler mit einem RC > 0 endet.
Wenn der Compiler Step einen RC > 0 zurückgegeben hat, dann wird die SYSPRINT Ausgabe des REXX Compilers in eine sequentielle Datei geschrieben, deren Name wie folgt aufgebaut ist: DSN des Quellkodes mit .LISTE und dem Membernamen als angehängte Qualifiers.
521
24.9 Die Makros Standard Parameterangaben beim Aufruf des Compilers REXXCOMP: XREF(S) Cexec LC(0) NOC(W) F(I) SLINE
Es wird eine Cross Referenz Liste ohne Konstanten und Befehlen erzeugt. Es wird eine CEXEC Ausgabe erzeugt. Das heißt, diese Ausgabe ist direkt mit Hilfe der LIBRARY ausführbar. Es werden keine Seitenwechsel in die Ausgabeliste eingefugt. Schon bei Auftreten von Warnings wird kein CEXEC Member erzeugt. Es werden alle Meldungen erzeugt. Der Quellkode wird in die kompilierte Ausgabe mit übernommen. Dadurch können auch in kompilierten Programmen die SIGL und SOURCELINE Befehle korrekt ausgegeben werden.
Weitere Compiler Optionen können beim Aufruf, jeweils durch ein Blank getrennt, als Parameter mitgegeben werden. Hinweis Wenn in einer Zeile des Quellkodes die Anweisung TRACE als erstes Wort auftaucht, dann wird automatisch die TRACE Option für den Compiler gesetzt. Ohne diese Option und mit TRACE Anweisungen im Quellkode würde der Compiler mit einem RC=4 enden und es würde kein CEXEC Member erstellt. Nach erfolgter Kompilierung erscheint die folgende Nachricht auf dem Bildschirm: i
| I | |
I
REXX Compile succesfully finshed. CEXEC: PROG.BUCH.CEXEC(CHANGET) Trace option was set, No Cross Reference produced. The Compile Listing is in: PROG.BUCH.REXX.LISTE.CHANGET
24.9.4
1
| j | |
I
#RC - REXX Programm im Batch kompilieren
Funktion Zusammenbau und SUBMIT eines Jobs, um eine REXX Prozedur zu kompilieren. Beschreibung Diese Prozedur wird wie folgt aufgerufen bzw. automatisch ausgeführt: •
• •
Aufruf als Edit Makro in der Command Line des Editors. In diesem Fall wird die im Edit befindliche REXX Prozedur mit SAVE gesichert und anschließend der Compiler Job submitted. Aufruf im Menü 3.4/M vor einem Member, das eine REXX Prozedur enthält. Aufruf im Menü 3.4/M oder einer DSLIST/M in der Command Line, um alle oder eine generisch ausgewählte Gruppe der in diesem PDS enthaltenen Members zu kompilieren. Z.B. würden mit der Selektion ' s e i a b * # r c ' in der Command Line alle Member, die mit 'AB' beginnen, kompiliert. Bei den Aufrufen über 3.4/M werden keine
522
•
24 Die LANZISPF Utilities
NOTIFY=userid() Angaben in die Job Karte eingefugt, um massenhafte NOTIFY Meldungen auf dem TSO Bildschirm zu vermeiden. Automatisch durch das Edit Exit Macro #IMACR02, wenn eine Edit Session einer REXX Prozedur verlassen wird und die Abfrage in dem dort von IMACR02 eingeblendeten Panel mit J beantwortet wird.
Wenn dieses Edit Makro als Makro aufgerufen wird, dann erfolgt zunächst ein SA VE des im Edit befindlichen Members. Beim Aufruf des REXX Compilers im Batch Job wird dann dieses Member als SYSIN Datei benutzt. Das Makro #RC sollte man also dann benutzen, wenn das Testen einer REXX Prozedur oder eines Edit Makros abgeschlossen ist und man diese Version des Programms speichern möchte. Bei allen anderen Aufrufarten wird die originale Datei als SYSIN Datei benutzt. Ausgabedatei: Der Name der Ausgabedatei, die das Compiler Ergebnis aufnimmt, wird dadurch gebildet, dass der letzte Qualifier der Eingabedatei durch 'CEXEC' ersetzt wird. Beispiel:
Eingabedatei Ausgabedatei
PROX. LOGON. REXX PROX. LOGON. CEXEC
Plausibilitätsprüfungen: Bei Auftreten folgender Sachverhalte wird eine Fehlermeldung erzeugt und der Compiler Job nicht submittet: • •
Wenn in der 1. Zeile des zu kompilierenden Quellkodes nicht mindestens einer der Texte REXX oder rexx enthalten ist. Wenn die Ausgabedatei nicht existiert.
Hinweis Wenn der Compiler Step einen RC > 0 hat, dann wird kein CEXEC Member erstellt, aber es wird der Step PRINTOUT aufgerufen. Dieser IEBGENER Step kopiert den List Output des Compiler Steps nach SYSOUT=*. Dadurch kann der Fehler in der Liste im SDSF gesucht werden. Standard Parameterangaben beim Aufruf des Compilers REXXCOMP: XREF(S) Cexec LC(0) NOC(W) F(I) SLINE
Es wird eine Cross Referenz Liste ohne Konstanten und Befehle erzeugt. Es wird eine CEXEC Ausgabe erzeugt. Das heißt, diese Ausgabe ist direkt mit Hilfe der LIBRARY ausführbar. Es werden keine Seitenwechsel in die Ausgabeliste eingefugt. Schon bei Auftreten von Warnings wird kein CEXEC Member erzeugt. Es werden alle Meldungen erzeugt. Der Quellkode wird in die kompilierte Ausgabe mit übernommen. Dadurch können auch in kompilierten Programmen die SIGL und SOURCELINE Befehle korrekt ausgegeben werden.
523
24.9 Die Makros Hinweis
Diese Compiler Optionen sind fest eingestellt. Sie können beim Aufruf von #RC nicht mehr verändert werden. Es bleibt Ihnen aber unbenommen, die Prozedur #RC Ihren eigenen Wünschen und Bedürfnissen anzupassen.
24.9.5
#RCLOAD - Aus REXX Programm Lademodul erzeugen
Wenn REXX Programme kompiliert werden, kann man verschiedene Typen von ausfuhrbaren Modulen erzeugen: CEXEC Modul
Dieser Modultyp muss, genau wie das originale REXX Programm, unter TSO ausgeführt werden. Diese Art der Kompilierung benutze ich meistens. Die Makros #RO und #RC erstellen ausschließlich diese Art von kompilierten REXX Programmen.
EXEC Modul
Dieser Modultyp wird durch einen speziellen „Compile and Link" Prozess in eine MVS Ladebibliothek gespeichert und kann von dort mit dem normalen JCL Statement „EXEC PGM=name" ausgeführt werden. Die Parameterübergabe erfolgt nach dem MVS JCL Standard. Um ein Programm dieses Modultyps zu erzeugen, kann man das Makro #RCLOAD benutzen.
CALL Modul
Dieser Modultyp wird ähnlich wie der EXEC Module erzeugt. Es wird lediglich eine andere Compile Option benutzt. Es ist ein Lade-Modul, der in eine REXX „Function Package Library" aufgenommen werden muss und der von dort nur als Unterprogramm aufgerufen werden kann. Um ein Programm dieses Modultyps zu erzeugen, kann man das Makro #RCLOAD benutzen.
Beschreibung des Makros #RCLOAD: Funktion Zusammenbau und SUBMIT eines Jobs, um eine REXX Prozedur zu kompilieren und einen Lade Modul oder einen CALL Modul zu erzeugen. Beschreibung Es können zwei verschiedene Typen von Lademodulen erzeugt werden: • Ein Lademodul, der direkt im MVS mit EXEC PGM=name ausgeführt werden kann (EXEC Typ). In diesem Fall muss im REXX Quellkode folgende Kommentarzeile vorhanden sein: /* STUB: MVS */. • Ein Lademodul, der in eine „Function Package Library" aufgenommen werden muss und dann mit CALL aufrufbar ist (CALL Typ). In diesem Fall muss im REXX Quellkode folgende Kommentarzeile gefunden werden: /* STUB: EFPL */. Nach der Erzeugung des Lademoduls vom CALL Typ muss dieser noch in ein „Function Package" implemen-
524
24 Die LANZISPF Utilities
tiert werden. Siehe dazu die IBM Broschüre TSO/E REXX Reference. Wenn man versucht, ein mit EFPL kompiliertes Programm direkt auszuführen, dann endet dieser Programmaufruf mit einem System Abend 0C4. Wenn keine der beiden Optionen im Quellkode gefunden werden kann, dann wird STUB: MVS angenommen. Link Library: Eine REXX Prozedur, die zu einem ausfuhrbaren Lademodul gelinkt werden soll, muss eine Kommentarzeile enthalten, welche die Load Library benennt, in die der Lademodul gelinkt werden soll. Diese Kommentarzeile muss wie folgt aufgebaut sein: / * LNK: DSN der Load Library */ Beispiel / * LNK: PROX.LANZ.LOAD
*/
Wenn keine solche Zeile gefunden wird, erfolgt kein Compile des REXX Programms. Diese Prozedur kann nur als Edit Makro aufgerufen werden. Plausibilitätsprüfungen: Bei Auftreten folgender Sachverhalte wird eine Fehlermeldung erzeugt und der Compile Job nicht submittet: • Wenn in der 1. Zeile des zu kompilierenden Quellkodes der Text REXX oder rexx fehlt. • Wenn die Ausgabedatei nicht existiert. • Wenn keine Zeile mit dem LNK: Parameter gefunden wird. Die Parameterangaben beim Aufruf des Compilers REXXCOMP sind die gleichen wie bei dem Makro #RC.
24.9.6
#ALTXT - Text neu ausrichten
Vielleicht ist Ihnen auch schon öfters das folgende Problem begegnet: Sie müssen in einen umfangreichen Kommentartext einen Satz oder einige Worte einfügen oder einen Satz umbauen. Dadurch wird aber das Schriftbild zerstückelt und sieht dann unschön aus. Um wieder ein schönes und gleichmäßiges Schriftbild zu erhalten, müssten Sie viele Zeilen von Hand neu anordnen, was einen erheblichen Aufwand bedeuten würde. Dieses Problem können Sie mit dem Makro #ALTXT leicht lösen. Funktion Edit Makro zur Neuformatierung von Texten innerhalb vorgegebener Spalten. Beschreibung Mit diesem Edit Makro kann man Texte neu strukturieren. Beim Aufruf werden Spaltenpaare angegeben:
525
24.9 Die Makros 1. Paar: Aus diesen Spalten werden die Texte entnommen. 2. Paar: Innerhalb dieser Spalten werden die Texte neu formatiert.
Das Programm nimmt die durch das erste Spaltenpaar und das Block Zeilenkommando CC markierten Texte und formt sie innerhalb der durch das zweite Spaltenpaar gegebenen Spalten neu. Danach werden die umgeformten Zeilen vor das erste CC gesetzt. Es erfolgt keine Silbentrennung. Die Trennung erfolgt nur an Blanks zwischen einzelnen Worten. Beispiel #ALTXT 3 6 8 1 0
60
Die Texte der durch das Block Kommando CC markierten Zeilen, die innerhalb der Spalten 3 bis 68 stehen, werden innerhalb der Spalten 10 bis 60 neu formiert und vor das erste CC eingefugt. Hinweis Wenn beim Aufruf nur das erste Spaltenpaar angegeben wird, dann wird der Text innerhalb dieser Grenzen neu formatiert.
24.9.7
#CM - Kommentarbox im Edit einfügen
Funktion Erzeugt in einem REXX Programm einen Kommentarblock an der Stelle des Cursors. Als Parameter kann die Anzahl der Leerzeilen im Block angegeben werden.
24.9.8
#SPLJ - Zeilen aufsplittern und zusammensetzen
Funktion Edit Makro für Split und Join Funktion über PF-Taste. Beschreibung Dies ist eines der von mir sehr oft benutzten Makros. Man kann damit: • •
Eine Zeile an einer Stelle trennen, so dass aus dem ab dem Cursor stehenden Teil der Zeile eine neue Zeile dahinter erstellt wird (Split Funktion). Eine Folgezeile an der Stelle einer Zeile anhängen, an der Cursor steht (Join Funktion).
Ob die Split oder die Join Funktion ausgeführt wird, erkennt das Makro automatisch an folgenden Kriterien: • •
Wenn ab der Stelle des Cursors in dieser Zeile noch Zeichen ungleich Blank stehen, wird aus diesen Zeichen eine neue Zeile erzeugt. Wenn ab der Stelle des Cursors in dieser Zeile nur noch Blanks stehen, wird die Folgezeile ab der Cursor Position eingefügt. Dabei werden Zeichen, die nicht mehr in die Zeile passen, bei LRECL abgeschnitten.
526
24 Die LANZISPF Utilities
Tipp Ich habe den Aufruf des Makros #SPLJ auf die PF4 Taste gelegt, denn den dort standardmäßig stehenden Befehl RETURN brauche ich sehr selten, dafür aber #SPLJ umso häufiger.
24.9.9
#EDMEM - Members direkt aus Listen editieren
Funktion Edit Aufruf eines Members, dessen Name als erstes Wort in einer Zeile einer editierten Datei steht. Beschreibung Die editierte Datei kann aus folgenden Quellen stammen: • • •
Eine Listausgabe der Prozedur SS. Eine Listausgabe der ISPF Funktion SRCHFOR in DSLISTen. Das Member $DOC in einem PDS.
Beim Aufruf muss der Cursor in einer Zeile stehen, die als erstes Wort einen Membernamen enthält. Das Makro kann in folgenden Dateien angewendet werden: • •
Listdateien, die mit SRCHFOR oder SS erzeugt wurden und mit dem Makro #SS bearbeitet wurden. $DOC Members.
24.9.10
#DISP - DISP Parameter im DD Statement an erste Stelle setzen
Funktion Umbau einer DD Zeile in einer JCL dahingehend, dass der DISP=xxx Parameter immer direkt hinter dem DD zuerst kommt. Der Cursor muss in einer DD Zeile stehen, in der ein DISP= und ein DSN= als Parameter vorkommen.
24.9.11
#PROF - Anzeigen der ISPF Edit Profile Values als NOTELINES
Funktion Einfügen der ISPF Edit Profile Values als NOTELINES am Beginn der editierten Datei.
2 4 . 9 D i e Makros
527
Beschreibung W e n n eine Edit Sitzung begonnen wird, lädt der ISPF Editor eine ISPF Tabelle namens ISREDIT. In dieser Tabelle sind die Profile Werte des Editors für diese Sitzung gespeichert. D i e Inhalte dieser Tabelle werden mit diesem Makro als N O T E L I N E S an den Beginn der editierten Datei gestellt. Beispiel EDIT PROX.LANZ.REXX(COMPLPRT) - 01.02 Columns 00001 00072 Command = > Scroll = > CSR ****** ***************************** T 0 p 0 f pata ****************************** =NOTE= R0452281 1996 V =NOTE= R0452291 1996 V F =NOTE= LIST1 133 # IMACROI =NOTE= R0480316 1996 V =NOTE= R0413580 1996 V =NOTE= TEST 132 F # IMACROI =NOTE= R0434967 1996 V =NOTE= LIST 132 F # IMACROI =NOTE= $DOC 1996 V # IMACROI =NOTE= CEXEC V # IMACROI 251 =NOTE= R0463415 1996 V =NOTE= R0463420 1996 V =NOTE= SKEL F 80 «IMACROI =NOTE= R0418553 1996 V =NOTE= PANEL 80 F «IMACROI =NOTE= R0453725 1996 V =NOTE= R0459107 1996 V =NOTE= R0459227 1996 V =NOTE= CLPBOARD 80 V =NOTE= R0465558 1996 V =NOTE= R0470074 1996 V =NOTE= CLIST 251 V «IMACROI =NOTE= JCL 80 F «IMACROI =NOTE= CMD F 80 «IMACROI =NOTE= REXX 80 F «IMACROI =MSG> 000001 /* DOC: REXX COMPLPRT ************************************************/ 000002 /* DOC: Beispiel für das Kompilieren eines REXX Programms */ 000003 /* DOC: Version für den Stress-Test */ 000004 /* LNK: PROX.LANZ.LOAD */ 000005 /* (c) LANZT am: 15 Nov 2002 */ 000006 /*********************************************************************/ 000007 arg 11 000008 say "COMPLPRT: eingegebener Parameter:" 11 000009 exit ****** **************************** Bottom of Data ****************************
24.9.12
#R3390 - Optimale Blocksize berechnen
Vielleicht ist es Ihnen auch schon einmal so gegangen: Sie erstellen gerade ein D D Statement in einer JCL oder eine A L L O C A n w e i s u n g in R E X X , mit dem eine neue Plattendatei angelegt werden soll. D a die Datei eine R E C F M von FB hat, müssen Sie die optimale Blocksize ermitteln. D i e s e Aufgabe erledigt das Makro # R 3 3 9 0 schnell.
528
24 Die LANZISPF Utilities
Funktion Blocksize für Disk 3390 berechnen. Beschreibung Dieses Makro berechnet die optimale Blocksize und die Anzahl benötigter Tracks flir eine Datei, die auf dem Plattentyp 3390 angelegt werden soll. Aufruf: #R3390 r e c f m l r e c l
anzrecs
Beispiel In einer Edit Sitzung wird gerade ein DD Statement zur Erzeugung einer neuen Datei definiert. EDIT SQMT. JCL (IEBGENER) - 01.05 Columns 00001 00072 Command = = > # r 3 3 9 0 f 240 10000 Scroll = > CSR 000012 //SYSIN DD DUMMY 000013 //OUTPUT DD DISP=(NEW,CATLG,DELETE) ,DSN=PROX.LANZ .TEST, 000014 // DCB=(RECFM=FB,LRECL=240,BLKZIZE= ****** **************************** Bottom of Data *************************** Abbildung 135 Aufruf des Makros UR3390
Um die optimale BLKSIZE zu erhalten, wird das Makro #R3390, wie oben zu sehen, aufgerufen. Nach dem ENTER erscheint folgende Anzeige: i
1
I
I
| BLKSIZE=27840, TRACKS=44, RECS/TRACK=232 |
Die BLKSIZE Angabe kann jetzt in den BLKSIZE Parameter der JCL übertragen werden. Die TRACKS Angabe kann für den SPACE Wert benutzt werden.
24.9.13
#SS - Super Search Liste bereinigen
Funktion Liste aus Super Search bereinigen. Beschreibung Löschen aller unnötigen Zeilen in der mit Super Search erzeugten Liste. Dieses Makro wird von der Prozedur „SS" als Initial-Makro aufgerufen. Es kann auch von Hand aufgerufen werden, wenn eine von der ISPF Funktion SRCHFOR erzeugte Liste in der VIEW Anzeige steht.
24.9 Die Makros
24.9.14
529
#SU - Jobs submitten
Funktion Submitten einer JCL, die kein Job Statement enthält. Beschreibung Das Job Statement wird vor dem Submit mit den in diesem ISPF User mittels VARDAT gespeicherten Parametern versehen vorangestellt. #SU kann an folgenden Stellen aufgerufen werden: • •
Als Edit Macro. Im 3.4/M vor einem Membernamen.
24.9.15
#TSOB - REXX Programm im TSO Batch ausfuhren
Wie wir in einem vorherigen Kapitel bereits besprochen haben, kann man REXX Programme auch in einem Batch Job ausfuhren lassen. Mit diesem Makro können Sie das Programm, das Sie gerade editieren, in einem TSO Batch Job ausführen. Funktion REXX Programm im TSO Batch ausfuhren. Edit Makro für den Submit eines Batch Jobs, der das REXX Programm im TSO Batch ausfuhrt. Beim Makro Aufruf kann ein String als Parameter an das REXX Programm übergeben werden. Beschreibung Der im Editor befindliche Quellkode des REXX Programms wird unter dem Membernamen #TSOB$$$ in den gerade im Editor stehenden PDS geschrieben. Dann wird der TSO Batch Job zusammengebaut, wobei das Member #TSOB$$$ als auszuführendes Member eingetragen ist. Durch die Benutzung eines neutralen Membernamen muss das editierte Member nicht mit SAVE zurückgeschrieben werden. Dieser Ablauf bringt folgende Vorteile: • •
Dadurch, dass der SAVE Befehl in der Editor Sitzung vermieden wird, bleibt der CHANGE Status erhalten und der UNDO Befehl kann uneingeschränkt benutzt werden. Man kann verschiedene Programmversionen testen, ohne bei jeder Änderung die Originalversion überschreiben zu müssen.
Das Member #TSOB$$$ wird am Ende des TSO Batch wieder gelöscht. Beispiel eines erzeugten TSO Batch Jobs: 01 //LANZTS JOB (09101999,00000000,46100000),'#TSOB: DATE',CLASS=A, 02 // NOTIFY=LANZT,MSGLEVEL=(0,0) ,MSGCLASS=H,
530
24 Die LANZISPF Utilities
03 //
COND=(0,LT),TIME=100,USER=SQMTP
05 //*
TSO-BATCH AUS: PROX.BUCH.REXX(DATE)
04 //**************************************< 06 //*************************************** 07 08 09 10 11 12 13 14 15 16 17 18 19 20 22 23 24 25 26 27 28 29 30
//TSOBATCH EXEC PGM=IKJEFT01,REGION=80M,DYNAMNBR=99 //STEPLIB DD DISP=SHR,DSN=PROX. LOGON. LOAD DD DISP=SHR,DSN=DB2P. ALIAS .DSNLOAD // DD DISP=SHR,DSN=SMQP. LOAD // DD DISP=SHR,DSN=PROX.BUCH.REXX //DELDSN //SYSEXEC DD DISP=SHR, DSN=PROX. BUCH . REXX DD DISP=SHR, DSN=PROX. LANZ . REXX // DD DISP=SHR, DSN=PROX. LOGON. REXX // DD DISP=SHR, DSN=SMQP. USER. CEXEC // DD DISP=SHR, DSN=SMQP. PROD. CEXEC // //SYSPRINT DD SYSOUT=* //SYSTSPRT DD SYSOUT=* //DUMP DD DUMMY //SYSUDUMP DD DUMMY //SYSOUT DD SYSOUT=* //SYSTSIN DD * PROFILE NOPREFIX NOMSGID ALTLIB ACTIVATE APPLICATION (EXEC) + DATASET (PROX. BUCH. REXX) /* AUSGEFÜHRTES REXX PROGRAMM: PROX. BUCH . REXX (DATE) %#TSOB$$$ ALTLIB DEACT APPLICATION (EXEC) DELETE PROX.BUCH.REXX(#TSOB$$$) + FILE (DELDSN)
Programm 59 Beispiel eines durch #TSOB erzeugten TSO Batch Jobs
Wenn Sie ein Member mit dem TSO/IDCAMS Befehl DELETE dsn (member) löschen wollen und die Datei dsn ist anderweitig schon zugeordnet, dann können Sie das Statement nicht in dieser Form benutzen. Begründung: Der TSO Befehl DELETE dsn (mem) wird intern an das Programm IDCAMS weiter gegeben, welches solche Befehle wie folgt ausfuhrt: Um das Member löschen zu können, setzt IDCAMS zunächst intern eine Zuordnung auf die Datei dsn mit der Disposition O L D ab. Eine solche Zuordnung kann aber auf eine Datei, die anderweitig schon zugeordnet ist, nicht erfolgreich ausgeführt werden. Deshalb kann der Befehl DELETE dsn (mem) hier nicht so einfach benutzt werden. Diese Arbeitsweise des Programms IDCAMS kann man aber umgehen, indem man den DELETE Befehl mit der Option FILE (ddname) benutzt. Voraussetzung dafür ist aber, dass man eine Zuordnung auf die Datei mit der Disposition SHR durchgeführt hat. In einem Batch Job geht das einfach mit dem Statement: //DELDSN DD DISP=SHR,DSN=dsn. Das dazugehörige DELETE Statement im TSO sieht dann so aus: DELETE dsn (mem) FILE (DELDSN)
24.9 Die Makros
24.9.16
531
#ISPFB - REXX Programm im ISPF Batch ausfuhren
Dieses Edit Makro arbeitet genau so, wie das Makro #TSOB, nur mit dem Unterschied, dass das REXX Programm unter ISPF ausgeführt wird und somit in dem Programm auch ISPF Services benutzt werden können.
Beispiel eines durch #ISPFB erzeugten Jobs 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
//LANZTO JOB (09101999,00000000,46100000),'#TSOB: C2X',CLASS=A, // NOTIFY=LANZT,MSGLEVEL= (0,0) ,MSGCLASS=H, II COND=(0,LT),TIME=100,USER=SQMTP //************************************************************* H * ISPF-BATCH AUS: PROX.BUCH.REXX(C2X) //************************************************************* //ISPF EXEC PGM=IKJEFT01,REGION=80M,DYNAMNBR=99 //STEPLIB DD DISP=SHR,DSN=PROX.LOGON.LOAD // DD DISP=SHR,DSN=DB2P.ALIAS.DSNLOAD // DD DISP=SHR,DSN=SMQP.LOAD //DELDSN DD DISP=SHR,DSN=PROX. BUCH. REXX //SYSEXEC DD DISP=SHR,DSN=PROX.BUCH.REXX // DD DISP=SHR, DSN=PROX. LANZ . REXX // DD DISP=SHR,DSN=PROX.LOGON.REXX // DD DISP=SHR,DSN=SMQP.USER. CEXEC // DD DISP=SHR,DSN=SMQP. PROD. CEXEC //ISPSLIB DD DISP=SHR,DSN=SQMT .USER. SKEL // DD DISP=SHR,DSN=ISP.SISPSLIB //ISPPROF DD DISP=(,DELETE,DELETE),DSN=4«TEMPPROF, // DCB=(RECFM=FB,LRECL=80,BLKSIZE=3120), MUSS 3120! // SPACE=(TRK,(5,5,10),RLSE),UNIT=VIODA //ISPPLIB DD DISP=SHR,DSN=ISP.SISPPENU //ISPTLIB DD DISP=(SHR,PASS),DSN=*.ISPPROF,VOL=REF=*.ISPPROF // DD DISP=SHR,DSN=ISP.SISPTENU //ISPMLIB DD DISP=SHR,DSN=ISP.SISPMENU //ISPLOG DD SYSOUT=*,DCB=(LRECL=121,RECBM=FB) //SYSPRINT DD SYSOUT=* //SYSTSPRT DD SYSOUT=* / / SYSUDUMP DD DUMMY //SYSTSIN DD * PROFILE NOPREFIX NOMSGID ALTLIB ACTIVATE APPLICATION (EXEC) + DATASET (PROX.BUCH.REXX) I* AUSGEFÜHRTES REXX PROGRAMM: PROX.BUCH.REXX(C2X) ISPSTART CMD(%#ISPFB$$ ) ALTLIB DEACT APPLICATION (EXEC) DELETE PROX.BUCH.REXX(#ISPFB$$) + FILE (DELDSN)
Programm 60 Beispiel eines durch UISPFB erzeugten ISPF Batch Jobs
532
24.9.17
24 Die LANZ ISPF Utilities
#ASM - Assembler Compile, Link und Test
Vermutlich haben Sie schon Ihre eigenen Verfahren, um Umwandlungen von Programmen durchzuführen und die Programme nach der Umwandlung zu testen. Ich stelle Ihnen hier das EDIT Makro #ASM vor, mit dem ich meine Assembler Umwandlungen durchführe und die Programme auch gleich teste. Dieses Makro lässt sich natürlich für alle anderen Programmiersprachen auch benutzen. Sie müssen nur die für die jeweilige Programmiersprache notwendigen JCL Statements einbauen bzw. die vorhandenen Statements ändern. Funktion Compile, Link und Test von Assembler Programmen. Beschreibung Das Edit Makro #ASM kann in einer Edit Session aufgerufen werden, um einen BatchASSEMBLER Umwandlungsjob mit dem gerade editierten Member als Eingabedaten zu submitten. Zusätzlich kann ein Test Step angehängt werden. Achtung Der Assembler Quellkode wird durch dieses Makro nicht gesichert. Das heißt, auch der UNDO Status bleibt unverändert. Spezielle Kommentarzeilen zur Steuerung des Job Aufbaues: Angabe der LINK Library. Test Step, der an den Compiler Job angehängt wird. Hinter diese Zeile wird bei jedem Aufruf vom #ASM eine Protokollzeile eingefügt Wenn eine der oben angegebenen Kommentarzeilen im Assembler Quellkode gefunden wird, dann wird diese Aktion ausgeführt. * LNK: dsn * TST: dsn (member) * DAT:
Angabe der Link Library: In dem Assembler Member kann eine Zeile mit dem Namen der Link Library angegeben werden, in die der Lademodul, der aus dem Programm entsteht, gelinkt wird. Ist keine solche Zeile vorhanden, dann wird nur ein Compiler Lauf ausgeführt. Die Zeile, welche die Link Library benennt, muss wie folgt aussehen: * LNK: dsn Angabe eines Test Steps: Wenn in dem editierten Assembler Quellkode eine Zeile mit dem DSN für einen Testausführungsstep enthalten ist, dann wird diese Datei eingelesen und an das Ende des Compiler Jobs gehängt. Diese Zeile muss wie folgt aussehen: * TST: dsn(member)
533
24.10 Die Programme Eintragung der durchgeführten Umwandlungen:
Damit man erkennen kann, wann und durch welchen User ein Compile dieses Quellkodes durchgeführt wurde, wird hinter die Zeile mit * DAT: bei jedem Aufruf von #ASM eine Zeile eingefügt, die z.B. wie folgt aussehen könnte: * ASM:
8 DEC 2 0 0 3 1 0 : 3 5 : 2 3 / LANZT /
SQMT.LOAD
Tipp Wenn Sie schon lange nach einer optimalen Compile, Link und Test Prozedur gesucht haben, dann schauen Sie sich die Möglichkeiten, die sich Ihnen mit dem hier gezeigten #ASM Makro bieten, sorgfältig an und erstellen Sie sich Ihre eigenen Verfahren.
24.10
Die Programme
Die hier beschriebenen REXX Programme sind in meiner langjährigen Praxis bei der Arbeit mit TSO/ISPF entstanden. Viele der Programme benutze ich täglich.
24.10.1
CR - Universelles Datei Utility
Wahrscheinlich gibt es in Ihrem MVS System schon ein so genanntes Klone Utility, um Dateien zu klonen. Die Klone Utilities, die ich bisher bei meinen Kunden vorgefunden habe, erfüllten aber nicht meine Ansprüche an so ein Hilfsmittel. Deshalb habe ich schon vor langer Zeit begonnen, ein eigenes Utility zum Klonen von Dateien zu entwickeln. Dieses hat nun einen gewissen Reifegrad erreicht und es fallt mir keine Funktion mehr ein, die ich dem Utility noch hinzufügen könnte. Funktion: Verschiedene Funktionen zur Bearbeitung von Dateien. Beschreibung Die folgende Tabelle zeigt die Funktionen, die Sie mit dem CR Utility ausführen können:
534
24 Die LANZISPF Utilities
Funktion NO YO YB RO RB CO CB EX
Beschreibung Neue Datei online anlegen. Neue Datei online anlegen und die Daten online kopieren. Neue Datei batch anlegen und die Daten batch kopieren. Datei online restrukturieren. Datei batch restrukturieren. Beim Restrukturieren können Werte wie SPACE usw. geändert werden. Datei online in eine andere kopieren. Datei batch in eine andere kopieren. Für die Modell Datei ein neues Expiration Date festlegen.
Tabelle 66 Beschreibung der Funktionskodes des Programms CR
Hinweis Beim Kopieren von Dateien muss die Ausgabedatei bereits existieren. Vor dem Aufruf der Kopierprogramme finden keine Plausibilitätsprüfungen bezüglich der Kompatibilität der beiden Dateien statt. Die Funktionskodes sind im Panel CRPANP1 hinter 'FUNKT' einzutragen. Es steht eine umfangreiche Beschreibung der Funktionen und der Arbeitsweise des Utilities CR im Hilfe Panel zur Verfugung, das Sie mithilfe der PF1 Taste aufrufen können. CR kann ausschließlich in einer DSLIST (Menü 3.4) vor einem DSN aufgerufen werden. Die Attribute dieser Datei werden gelesen und in dem unten stehenden Panel angezeigt. Wie Sie sehen, wird die Datei, vor deren Namen der Aufruf von CR erfolgte, sowohl als 'Modell' als auch unter 'Neuer' eingetragen. Sie können jetzt den neuen DSN ändern und als Funktionskode z.B. YB eintragen und ENTER drücken und schon wird ein Batch Job submitted, der die neue Datei anlegt und die Daten aus der alten Datei dort hinein kopiert. Ob Sie die Arbeit online oder im Batch ausführen lassen, bestimmt der zweite Buchstabe des Funktionskodes: O online, B ~> Batch. Tipp Dieses Programm sollten Sie sich gut merken, denn damit können Sie fast alle Manipulationen an Dateien vornehmen. Zusätzlich eignet es sich auch hervorragend, um sich die Attribute einer Datei einfach nur anzusehen.
535
24.10 Die Programme
Dataset Manager under ISPF / LANZ GmbH COMMAND
= >
Modell Neuer FUNKT RECFM DIR LRECL BLKSIZE PRIM SEC UNITS DSNTYPE VOLSER STORCLAS SMS Exp.Date
= = = = = = = = = = = = = = =
PROX.UTIL.REXX PROX.UTIL.REXX NO < NO, YO, YB, RO, RB, CO, CB (siehe Help mit PF1) FB Reference Date = 2004/08/19 Creation Date = 2004/05/26 17 Blocks / Track = N/A Creator = LANZT 80 DSORG = PO-E Anzahl Members = 75 27920 Alloc. Dir. Blks = 0 Used Dir. Blks = 0 10 Extents all/used = 1/0 Space Used = 13% 10 Allocated Trk/Cyl = 150/10 Unit Type = 3390 CYLINDERS Datenmenge = 958.46 KB Compressed = NO LIBRARY Trks für Dir = N/A 44 Directory Blocks/Track D1D142 DPPOOL DATACLAS = MGMTCLAS = YES YES = SMS benutzen, NO = SMS nicht benutzen ***NONE*** perm oder JJJJ/MM/TT Blank bewirkt ***NONE***
MSG1= MSG2= REASON= ENQs= LANZT Rote Felder sind Eingabefelder Abbildung 136 Panel der CR Funktion
Hinweise Wenn hinter ENQs Eintragungen vorhanden sind, dann heißt das, dass andere User oder Sie selbst einen ENQ auf diese Datei gesetzt haben. Das kann z.B. dadurch erfolgt sein, dass Sie in einer weiteren ISPF Ebene eines der Member der Datei gerade editieren. In einem solchen Fall können Sie diese Datei natürlich NICHT restrukturieren. Beim Restrukturieren kann man einen PDS in einen PDSE verwandeln und natürlich auch umgekehrt. Sequentielle Dateien können nicht in ein Member eines PDS/PDSE kopiert werden.
24.10.2
CMDSMOD - Bearbeiten von ISPF Command Tables
Mit diesem Programm können Sie Ihre ISPF Command Tables bearbeiten. Die Beschreibung, was damit möglich ist, finden Sie im Kapitel „ISPF Command Tables" ab Seite 79.
24.10.3
EXABGL - Abgleich zwischen REXX und CEXEC Datei
Funktion Member Abgleich zwischen REXX und CEXEC Datei. Entfernen aller Member aus einer CEXEC Datei, die nicht in der dazugehörigen REXX Datei enthalten sind.
536
24 Die LANZ ISPF Utilities
Aufruf in einer DSLIST vor dem DSN der REXX Quellkode Datei. Beschreibung Wenn man mit kompilierten REXX Programmen vom Typ CEXEC arbeitet, kann es vorkommen, dass sich in der CEXEC Datei im Laufe der Zeit Member befinden, für die es in der zugehörigen REXX Datei keinen Quellkode mehr gibt. Um von Zeit zu Zeit diese Member aufzuräumen, kann man dieses Utility benutzen.
24.10.4
LI - Listcat einer Datei in Browse anzeigen
Funktion Erzeugen eines IDCAMS LISTCAT für eine Datei und Browse der Ausgabeliste. Aufruf in einer DSLIST vor dem DSN der Datei. Beispiel Es soll festgestellt werden, ob zu einer Datei ein Alias Eintrag vorhanden ist. Dazu rufe ich LI vor dem DSN der Datei in einer DSLIST auf und erhalte dann folgende Liste angezeigt: BROWSE SYS04232.TO93927.RA000.LANZT.R0433235 Line 00000000 Col 001 080 Command = > Scroll = > CSR ********************************* Top of Data ********************************** NONVSAM PRXXD. PLMA. LOAD IN-CAT UCATT. PROSYOl HISTORY DATASET-OWNER (NULL) CREATION 2003 .260 RELEASE 2 EXPIRATION 1999.365 ACCOUNT- INFO (NULL) SMSDATA STORAGECLASS T1NKPOOL MANAGEMENTCLAS S (NULL) DATACLASS (NULL) LBACKUP 0000.000.0000 VOLUMES VOLSER T1N155 DEVTYPE X'3010200F' FSEQN ASSOCIATIONS ALIAS PRXD . PLM ATTRIBUTES ******************************** Bottom of Data ******************************** Abbildung 137 Anzeige der LISTCA T Ausgabe des Programms LI
Wie man sieht, existiert zur Datei PRXXD.PLMA.LOAD ein Alias Eintrag mit dem Namen PRXD.PLM.
24.10.5
MACRO ALL - Ausführen eines Makros für alle Members eines PDS
Manchmal möchte man in allen Members eines PDS Änderungen vornehmen, die am besten durch ein Edit Makro erledigt werden können. Damit man nun nicht alle Members im Editor
24.10 Die Programme
537
aufrufen muss, um dann jeweils dort das Makro ausfuhren zu können, habe ich dieses Programm entwickelt. Funktion Ausfuhren eines Edit Makros für alle Member einer Datei. Beschreibung Aufruf in einer DSLIST vor dem DSN in der Form: macroall
/ mname - Mname ist der Name des auszuführenden Makros.
24.10.6
MEMAB - PDS Member abgleichen
Um zu vermeiden, dass ein Member in mehreren PDS vorhanden ist, kann man dieses Makro zum Abgleich der Members von zwei PDS benutzen. Funktion Abgleich der Members zwischen zwei PDS, indem alle Member im 1. PDS gelöscht werden, wenn sie im 2. ebenfalls enthalten sind. Beschreibung Dieses Programm kann sowohl online als auch in einem ISPF Batch Job verwendet werden. Online:
Aufruf in einer DSLIST vor dem DSN der 1. Datei.
Batch:
Beim Batch Aufruf sind die DD-Namen ERSTE und ZWEITE zu benutzen.
24.10.7
MEMVERJ - PDS Directories mittels Batch Job vergleichen
Funktion Memberliste zweier PDS vergleichen. Es werden diejenigen Membernamen angezeigt, die in dem jeweils anderen PDS NICHT enthalten sind. Achtung: Diese Prozedur kann nur mit einem TSO Batch Job ausgeführt werden. ISPF Services werden nicht aufgerufen. Beschreibung Die Memberlisten der beiden PDS werden verglichen. In der Ausgabeliste werden zwei Spalten gedruckt, die jeweils die Namen der Member enthalten, die in dem jeweils anderen PDS NICHT enthalten sind.
538
24 Die LANZISPF Utilities
Eingabe der beiden DSN über die DD Statements DATEI 1 und DATEI2 im Job. Ausgabe über DD Statement LISTE. Beispiel einer JCL: //MEMABGL EXEC PGM=IKJEFTO 1, REGI0N=2 OM, DYNAMNBR=99 //SYSPROC DD DISP=SHR,DSN=PROX.UTIL.CEXEC //DATEII DD DISP=SHR,DSN=PROX.BUCH.REXX //DATEI2 DD DISP=SHR,DSN=PROX.BUCH.CEXEC //LISTE DD SYSOUT=* //SYSTSPRT DD SYSOUT=* //SYSTSIN DD * PROFILE NOPREFIX %MEMVERJ END
Hier die Liste, die der obige Job erzeugt hat: MEMVERJ: MEMVERJ: MEMVERJ: MEMVERJ:
Abgleich der Membernamen zweier PDS Durchführungszeit: 30 Aug 2004 / 15:10:45 Unter dem DSN werden diejenigen Membernamen aufgeführt, die in der jeweils anderen n i c h t enthalten sind
PROX. BUCH. REXX $CONPANL 5CONREXX $DOC $PDSHIST $PDSSICH
$SICHDAT $SICHNOT $SICHREC $TESTDSN
PROX. BUCH. CEXEC #TT #TTT
ADRTEST ALTLIB CHANGE NSORT TT
$UPDTE
ADDRESS ALIAS ALIAS PR
24.10.8
REXXLIBC - Feststellen, ob die REXX Library vorhanden ist
Wenn Sie mit kompilierten REXX Prozeduren vom CEXEC Typ arbeiten wollen, dann muss in der LP AR Ihres MVS Systems das Programm EAGRTPRQ vorhanden sein. Ob dies der Fall ist, wird mit diesem Programm festgestellt. Falls bei einem Aufruf von REXXLIBC in Ihrem MVS System der Text IBM Library for SAA REXX/370 is NOT available at System: "XXXX Compiled REXX Programs can NOT used."
ausgegeben wird, dann wenden Sie sich an Ihre Systemtechnik.
24.10 Die Programme
24.10.9
539
SS - Super Search in einer Datei
Sie kennen sicher die Super Search Funktion im Utility Menü des ISPF. Damit ich nicht immer in das Utility Menü des ISPF wechseln muss, wenn ich einen Super Search nur für eine Datei durchfuhren will, habe ich dieses Programm geschrieben. Funktion Aufruf von Super Search in einer DSLIST vor einem DSN. Hierzu gehört das Edit Makro #SS. Aufruf • •
In einer DSLIST vor dem DSN: s s s u c h w o r t . Es wird nur nach einem einzigen Text gesucht. Dieser ist unmittelbar hinter ss OHNE Hochkomma anzugeben. In einer DSLIST nur mit s s vor dem DSN. Es wird ein Eingabe-Panel angezeigt, in dem man bis zu 14 Suchbegriffe angeben kann.
Besonderheiten Damit die Prozedur SS auch parallel in mehreren ISPF Fenstern aufgerufen werden kann, wird nach dem Aufruf des Search Utilities die Ergebnisdatei des Files OUTDD in eine Datei mit dem DD-Namen SSzscreen umkopiert und die DD-Namen SYSIN NEWDD OUTDD werden vor dem Edit Aufruf der Ergebnisdatei freigegeben. Siehe hierzu auch das Kapitel „Die Befehle MEMBER und SRCHFOR" ab Seite 99.
24.10.10 TASID - Systeminformationen anzeigen Siehe hierzu die Beschreibung des Programms TASID im Kapitel „Das Programm TASID" ab Seite 202.
24.10.11 JD - Wochentag und Datum zu einem julianischen Datum anzeigen Manchmal kommt es vor, dass man zu einem auf dem ISPF Bildschirm stehenden julianischen Datum der Form JJJJ.TTT das Datum in der Form TT MMM JJJJ erfahren möchte. Diese Information können Sie mit JD bekommen. Funktion Datum zu julianischem Datum ermitteln und anzeigen. Anzeige von Wochentag und Datum zu einem julianischen Datum, das in der Form JJJJ.DDD auf dem ISPF Bildschirm steht.
540
24 Die LANZ ISPF Utilities
Aufruf Man gibt in der Command Line TSO %JD ein und stellt dann den Cursor in einem ISPF Bildschirm in ein Feld, das ein julianisches Datum in der Form JJJJ.DDD enthält und drückt dann ENTER. Zur Extraktion des Textes des julianischen Datums vom Bildschirm wird das REXX Programm XEXTRACT aufgerufen. Hinweis Die DATE Funktion, die in diesem Programm zur Berechnung benutzt wird, kann solche Berechnungen nur innerhalb eines Fenster von 100 Jahren durchfuhren. Dieses Fenster berechnet sich wie folgt: (jetziges Jahr - 50) unteres Ende des Fensters (jetziges Jahr + 49) oberes Ende des Fensters
24.10.12 VOLINF - Plattenbelegungen anzeigen Manchmal ist es sehr hilfreich zu wissen, wie viel Platz noch auf bestimmten Plattenlaufwerken oder auch einer ganzen Gruppe von Laufwerken frei ist. Um dies zu ermitteln, habe ich dieses Programm geschrieben. Funktion Plattenbelegung anzeigen. Ermittlung der Werte mittels IDCAMS DCOLLECT (V-Rekords). Beispiel Hier ein Beispiel für einen Aufruf von VOLINF: — Row 1 to 6 of 6 Scroll = CSR Avg Use
74 % of
53.418 Cyls, Free
Volser
%U
Free Cyls
Largest Cyls
P0XÏZ1 P0XYZ2 P0XYZ3 P0XÏZ4 P0XYZ5 P0XYZ6
93 81 66 46 90 77
226 1.894 3.371 5.372 983 2.288
100 899
1.000
3.100 944 1.999
Fragm Index
14.134 Cyls Free Exts
246 157 158 117 24 42 End of List
44 13 16 7 10 6
Volume StoGroup Device Cyls Name Type
ADDR
3.338 10.016 10.016 10.016 10.016 10.016
67B3 6746 6747 6748 6749 674A
33903 33909 33909 33909 33909 33909
Abbildung 138 Anzeigen der Plattenbelegung mit dem Programm VOLINF
Hinter „Volser Mask" können Sie einen generischen Namen für die Gruppe von VOLSERs eingeben, für die Sie die Information anzeigen lassen wollen.
24.10 Die Programme
541
Hinweis Für die Ermittlung der Daten wird intern das Programm IDCAMS mit dem Befehl DCOLLECT aufgerufen. Falls Sie für die Ausfuhrung des DCOLLECT Befehls keine RACF Berechtigung haben, können Sie dieses Programm nicht nutzen. Wenden Sie sich in einem solchen Fall an Ihren Vorgesetzten, um sich die notwendigen Berechtigungen einrichten zu lassen.
24.10.13 XCURSOR - Dateien von überall im Bildschirm aufrufen Zugehöriges Panel: XCURSOR Funktion DSN Extraktion auf einem ISPF Bildschirm. Aufrufen einer Datei mit EDIT, VIEW, BROWSE, MEMLIST oder Data Set Information durch Positionieren des Cursors an irgendeiner Stelle des DSN auf dem Bildschirm. Der Bildschirm muss ein ISPF Bildschirm sein. Sonst gibt es keine Einschränkungen. Beschreibung Der DSN kann - auch mit Member - in allen ISPF Anzeigen vorkommen: • • • • • •
In einem EDIT Panel. In einem BROWSE Panel. In der SDSF Anzeige. In der Beta92 Anzeige. In irgendeiner Datei. In einem POPUP Panel.
Damit ich dieses Programm jederzeit schnell aufrufen kann, habe ich meine PF23 Taste in allen meinen ISPF Anwendungen wie folgt belegt: t s o % x c u r s o r . Wenn ich jetzt den Cursor in einen DSN irgendwo auf dem Bildschirm stelle und die PF23 Taste drücke, dann wird mir der Auswahlbildschirm des Programms XCURSOR angezeigt. Beispiel Ich habe die folgende Druckliste im SDSF am Bildschirm stehen und möchte nun die dort zu sehende Datei PROX.UTIL.CEXEC anschauen. Ich positioniere den Cursor irgendwo in diesem DSN und drücke dann die PF23 Taste.
542
24 Die LANZ ISPF Utilities
Display
Filter
View
Print
Options
Help
SDSF OUTPUT DISPLAY LANZT756 JOB04299 DSID 107 LINE 9 COLUMNS 02- 81 COMMAND INPUT = > SCROLL = > CSR PDF0363I ENQ WAITING FOR MAJOR: SPFDSN, MINOR: PROX.UTIL.CEXEC, SCOPE: SYSTEMS, PDF0111I PDS COPY: SYSUT1 DSN=SYS04232 .T105956 .RA000 . LANZT756 .CREXX. H04 VOL PDF0112I SYSUT2 DSN=PROX.UTIL.CEXEC V0L=D1D132(PDSE) PDF0314I IGW01552I MEMBER #ALTXT HAS BEEN COPIED AND REPLACED PDF0314I IGW01550I 1 OF 1 MEMBERS WERE COPIED PDF0189I END OF COPY STEP 1 - RC(0) PDF0120P JOB PERFORMANCE: .43 ELAPSED, .04 TCB CPU, 0 EXCPS PDF0199I END OF PDSFAST EXECUTION - RC(0) READY ISPSTART CMD (%LMMSTATS #ALTXT LANZT) NULLFILE was preallocated (no free was done). READY END ******************************** BOTTOM OF DATA
Daraufhin erscheint folgendes POP UP Panel:
XCURSOR DSN:
Select Call Type
'PROX.UTIL.CEXEC'
Select action: 4 1. Edit 2. View 3. Browse 4. Memlist 5. Data Set Information Press END to cancel this action.
Abbildung 139 POP Up Panel des Programms
XCURSOR
Wenn ich jetzt, wie oben zu sehen, die Zahl 4 eingebe und ENTER drücke, dann erscheint die Member Liste der Datei PROX.UTIL.CEXEC. Menu
Functions
LIBRARY Command
Confirm
Utilities
Help
PROX.UTIL.CEXEC Name ##
Prompt
#ALTXT #ASM #BIND #CM #DISP Anzeige ab hier abgeschnitten.
Size 56 86 156 58 34 49
Created 2004/08/13 2004/08/19 2004/08/13 2004/08/13 2004/08/13 2004/08/13
Vol D1D132 Row 00001 of 00090 Scroll == > PAGE ID Changed LANZT 2004/08/13 08:: 38 04 : 2004/08/19 10:; 59 59 LANZT : LANZT : 2004/08/13 08:: 38 04 LANZT 2004/08/13 08:: 38 04 : LANZT 2004/08/13 08:: 38 05 : LANZT 2004/08/13 08:: 38 05 :
24.11 Die Unterprogramme
24.11
543
Die Unterprogramme
Diese Programme können nur als Unterprogramme aufgerufen werden. Dabei können Sie zwischen zwei Verwendungsarten wählen: • •
Sie können die Programme als externe Unterprogramme aufrufen. Sie können den Quellkode eines Unterprogramms aber auch in den Quellkode des Hauptprogramms kopieren und das Programm als internes Unterprogramm benutzen. Dies ist vor allem dann sinnvoll, wenn Ihr Hauptprogramm das Unterprogramm sehr häufig aufruft.
24.11.1
CHANGE - Change Funktion im REXX
Da es in den Standard Funktionen des REXX bisher keine CHANGE Funktion gibt, habe ich mir schon vor langer Zeit eine eigene Change Funktion fur REXX geschrieben. Funktion CHANGE in REXX Texten durchführen. Beschreibung Mithilfe der Funktion CHANGE kann man in REXX Programmen Änderungen in Texten vornehmen. Aufrufe result result input target new only
= change(input,target[,new][,only]) Ergebnistext Eingabetext Suchbegriff Ersatztext, der den Suchbegriff ersetzt. Die Änderungen werden nur durchgeführt, wenn dieser Text auch im Eingabetext vorkommt.
Der Ersatztext kann länger oder kürzer als der Suchbegriff sein. Wird der Ersatztext weggelassen, dann wird der Suchbegriff aus dem Eingabetext entfernt.
24.11.2
JOBSUFF - Job Suffix Buchstaben holen
Funktion Job Suffix Buchstaben bereitstellen. Bereitstellen eines fortlaufenden Job Suffix Buchstabens für die Bildung eines benutzerbezogenen Jobnamens bei der Erstellung einer JCL für einen Batch Job.
544
24 Die LANZ ISPF Utilities
Beschreibung Dieses Unterprogramm fuhrt folgendes aus: • • •
Die Positionsnummer für die Auswahl des Job Suffix Buchstabens wird aus dem ISPF Profile gelesen. Der Suffix Buchstabe wird aus den Ziffern und Buchstaben ausgewählt. Die Positionsnummer wird um eins erhöht und wieder in den ISPF Profile zurückgeschrieben.
Der Suffix Buchstabe wird als Funktionswert zurückgegeben. Diese Funktion wird in den folgenden Makros und Programmen zur Bildung eines dynamischen Jobnamens benutzt: #ASM, #ISPFB, #SU, #TSOB, CR
24.11.3
MEMSLIST - Memberliste mehrerer DSNs
Funktion Memberliste verketteter DSNs ausgeben. Externe REXX Prozedur zum Erzeugen einer Memberliste in einem Return String. Beschreibung Die Eingabe einer Verkettung von bis zu 16 PDS ist möglich. Die DSNs müssen beim Aufruf in einem String übergeben werden. Die einzelnen DSNs dürfen dabei NICHT in Hochkommata eingeschlossen sein. Wenn ein Member in mehreren Libs vorhanden ist, wird es nur einmal ausgewiesen.
24.11.4
STRUKTR - Zahlen strukturieren
Funktion Strukturieren großer Zahlen im REXX. Beschreibung Strukturieren von großen Zahlen in REXX in die Form mit Unterteilungen in Tausendergruppen mit einem Trennzeichen. Eine Zahl wie z.B. 12345678.55 wird zu 12.345.678,55. Als zweiter Parameter kann das Trennzeichen eingegeben werden. Wird kein Trennzeichen eingegeben, dann wird automatisch ein Blank als Trennzeichen benutzt.
545
24.11 Die Unterprogramme Hinweis
Es können auch Zahlen mit Dezimalpunkt eingegeben werden. In diesem Fall wird der ursprüngliche Dezimalpunkt in ein Komma geändert, damit er nicht mit den Dezimalpunkten der strukturierten Zahl verwechselt werden kann.
24.11.5
DATEALL - Datumsberechnungen aller Art
Funktion Universelle Datums-Berechnungsfunktion. DATEALL bietet folgende Berechnungsfunktionen für Datumswerte: • Berechnung eines neuen Datums von einem gegebenen Tag aus durch Angabe einer Differenz von Tagen. • Berechnung der Differenz in Tagen zwischen zwei Datumswerten. • Berechnung des Wochentags zu dem angegebenen Datum. • Berechnung des Datums des Ostersonntags in einem Jahr. • Rückgabe der Daten aller Feiertage eines Jahres. • Festellen, ob das angegebene Jahr ein Schaltjahr ist. Beschreibung Der Aufruf ist wie folgt durchzufuhren: DATEALL ( " f u n c " " p l "
"p2"
"p3")
Alle Parameter sind immer in Hochkommata zu setzen. Je nach Funktion sind ein bis drei Parameter anzugeben. Hier die verschiedenen Möglichkeiten der Funktionsaufrufe: DATEALL("NEU" " t t . m m . j j j j " " n n n " "WTAG") Berechnung eines neuen Datums von einem gegebenen aus. nnn ist eine positive oder negative Zahl, die angibt, um wie viele Tage vorwärts oder rückwärts gerechnet werden soll. Wird als 3. Parameter noch WTAG angegeben, dann wird auch noch der Wochentag des berechneten Datums zurückgegeben. DATEALL("DIFF" " t t . m m . j j j j " " t t . m m . j j j j " ) Berechnung der Differenz in Tagen zwischen zwei Datumswerten. DATEALL("WTAG" " t t . m m . j j j j " ) Berechnung des Wochentags zu dem angegebenen Datum. DATEALL("OSO" " j j j j " ) Berechnung des Datums des Ostersonntags im Jahr jjjj. DATEALL("FTAG" " j j j j " ) Berechnung und Rückgabe aller Feiertage dieses Jahres.
546
2 4 Die L A N Z ISPF Utilities
DATEALL("SJ"
"jjjj")
F e s t e l l e n , o b d a s a n g e g e b e n e J a h r e i n S c h a l t j a h r ist. W e n n d a s J a h r e i n S c h a l t j a h r ist, w i r d e i n e 1 z u r ü c k g e g e b e n , s o n s t e i n e 0. Rückgabewerte aus Dateall E s w i r d i m m e r ein S t r i n g z u r ü c k g e g e b e n , d e s s e n 1. W o r t d e n R C d e r F u n k t i o n D A T E A L L enthält. Es wird eine Null (0) zurückgegeben, w e n n die restlichen Werte O K sind. Ansonsten wird ein W e r t > 0 z u s a m m e n mit einer F e h l e r m e l d u n g zurückgegeben. N a c h d i e s e m R C sind in d e m R ü c k g a b e t e x t , j e n a c h A u f r u f , d i e E r g e b n i s s e z u f i n d e n . Beispiel Ich habe das folgende Beispielprogramm zur Darstellung der Funktionalität des P r o g r a m m s D A T E A L L geschrieben: /* DOC: DATEALLT REXX HAPRO /* DOC: Beispielprogramm für die Funktion DATEALL. /*
/* COPYRIGHT LANZ GMBH, BEMPFLINGEN, GERMANY
*/ */ */
15 Sep 2004 */
/ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /
say DATEALL("NEU" "11.08.2004" "-23820" "WTAG") say DATEALL("DIFF" "25.05.1939" "11.08.2004") say DATEALL("WTAG" "25.05.1939") say DATEALL("OSO" "2004") say DATEALL ("SJ" "2004") t = DATEALL("FTAG" "2004") do i = 2 to words(t) by 2 say word(t,i) word(t,i+l) end i exit Programm 61 DATEALLT: Beispiel fiir den Aufruf des Unterprogramms DATEALL
D a s obige P r o g r a m m erzeugt die f o l g e n d e A u s g a b e : 0 25.05.1939 Donnerstag 0 23820 0 Donnerstag 0 11.04.2004 0 1 01.01.2004 Neujahr 06.01.2004 3_König 09.04.2004 Karfreitag 11.04.2004 Ostersonntag 12.04.2004 Ostermontag 01.05.2004 Tag_der_Arbeit 20.05.2004 Christi_Hiromelfahrt 30.05.2004 Pfingstsonntag 31.05.2004 Pfingstmontag 10.06.2004 Fronleichnam 15.08.2004 Maria_Himmelfahrt 03.10.2004 Tag_der_Einheit 25.12.2004 1.Weihnachtstag 26.12.2004 2.Weihnachtstag
24.11 Die Unterprogramme
24.11.6
547
DATUMOK - Plausibilitätsprüfung für ein Datum
Funktion Datum auf Korrektheit prüfen. Feststellen, ob ein Datum die richtige Form hat UND gültig ist. Beschreibung Eingabe: t t . mm. j j j j Ausgabe: „OK" oder entsprechende Fehlermeldung.
24.11.7
SCHALTJ - Schaltjahr ermitteln
Funktion Feststellen, ob JJJJ ein Schaltjahr ist. Beschreibung • •
Gibt 1 zurück, wenn das angegebene Jahr ein Schaltjahr ist. Gibt 0 zurück, wenn das angegebene Jahr kein Schaltjahr ist.
24.11.8
JULDATE - Julian Date Berechnungen
Funktion Julian Date Umrechnungen. Funktion zur Umrechnung vom normalen Datumsformat in das Julian Date und umgekehrt. Beschreibung Eingabe: "JJJJ/TTT"
Ausgabe: JJJJ/MM/TT
Eingabe: "JJJJ/MM/TT"
Ausgabe: JJJJ/TTT
Bei falschem Eingabeformat wird die Zahl 999 zurückgegeben. Tipp Wenn die Eingabedaten als Literale eingegeben werden, dann müssen diese unbedingt in Hochkommata gesetzt werden, da der Schrägstrich sonst vom REXX bei der Übergabe der Parameterliste als Divisionszeichen aufgefasst wird.
24.11.9
XEXTRACT - Text vom ISPF Bildschirm extrahieren
Wie wir bereits beim Programm XCURSOR gesehen haben, bietet das ISPF die Möglichkeit, beliebige Texte aus einem ISPF Bildschirm zu extrahieren. XEXTRACT können Sie in einem Programm nutzen, um solche Texte zu extrahieren.
548
24 Die LANZISPF Utilities
Funktion Extrakt aus ISPF Bildschirm filtern. Funktion für das Extrahieren einer Zeichenkette aus einem ISPF Bildschirm. Beschreibung Als Parameter können Begrenzungstexte eingegeben werden, die den zu extrahierenden Text vorne bzw. hinten begrenzen. Die Begrenzungstexte dürfen keine Blanks enthalten und sie müssen durch mindestens ein Blank getrennt eingegeben werden. Wenn die Begrenzungstexte fehlen, dann wird immer 1 Blank als Begrenzung angenommen. Wenn ein Begrenzungstext nicht gefunden wird, dann extrahiert das Programm immer vom Anfang bzw. bis zum Ende des gesamten Bildschirms, je nachdem, welcher Text nicht gefunden wurde.
24.12
REXX Copy Member
Copy Member sind Programmteile, die man normalerweise in höheren Programmiersprachen dazu benutzt, um Datenstrukturen bereit zu stellen. Aber auch bei der Programmierung im REXX ist es manchmal sinnvoll, Copy Member einzusetzen. Dies hat folgende Gründe: • •
•
•
Wenn in einem Unterprogramm die SOURCELINE Funktion benutzt werden soll, dann MUSS dieses Unterprogramm im Quellkode des Hauptprogramms integriert sein. Wenn zwischen einem Haupt- und einem Unterprogramm Datenfelder in Form von STEMS ausgetauscht werden sollen, dann geht das nur, wenn das Unterprogramm im Quellkode des Hauptprogramms enthalten ist. Wenn ein Unterprogramm zwar in verschiedenen Hauptprogrammen aufgerufen wird, aber die Aufrufhäufigkeit sehr hoch ist, dann sollte man das Unterprogramm ebenfalls als internes Unterprogramm ins Hauptprogramm legen. Denn der Aufruf von externen Unterprogrammen ist im REXX sehr aufwändig und damit sehr langsam. Wenn man standardisierte Kodes für immer wiederkehrende Aufgaben einsetzt, wie z.B. Fehlerbehandlungsprogramme.
Die nachfolgend aufgeführten REXX Quellkodes gehören alle zu einer der beschriebenen Kategorien von Copy Members. Leider gibt es im REXX keine Einrichtung, die vor dem Starten eines Programms die darin definierten Copy Member in das Programm holen könnte. Deshalb müssen Sie diese Copy Member stets selbst mithilfe des Editors in den Quellkode Ihres Programms implementieren.
549
24.12 REXX Copy Member
24.12.1
ISPERROR - ISPF Fehlermeldungen ausgeben
Funktion Ausgeben von ISPF Fehlermeldungen. Die Meldungen werden artgerecht für Online und Batch aufbereitet und ausgegeben. Beschreibung ISPERROR enthält das Unterprogramm ispf_error zur Ausgabe der vom ISPF im Fehlerfall bereitgestellten Fehlermeldungen. Das Programm erkennt selbst, ob es im Batch oder online abläuft und gibt die Fehlermeldungen dann immer mit dem geeigneten Medium aus (SAY im Batch und SETMSG online). Hier der Quellkode von ISPERROR: 01 /* DOC: ISPERROR REXX COPY
*/
02 /*********************************************************************/ 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
ispf_error: arg rc instr = sigl-1 srcline = instr": "strip(sourceline(instr)) if sysvar("SYSENV") = "FORE" then do zedlmsg = "ISPF Fehler im Programm >"exname"< RC="rc, "aus Statement:"copies(" ",60) srcline copies(" ",60) if zerrlm "ZERRLM" then, zedlmsg = zedlmsg" ISPF Fehlermeldung:" strip(zerrlm) address "ISPEXEC" "SETMSG MSG(ISRZ001)" end else do say exname copies("-",68) say exname "ISPF Fehler: RC="rc" aus Statement:" say exname srcline if zerrlm "ZERRLM" then, say exname "ISPF Fehlermeldung:" strip(zerrlm) say exname copies("-",68) zispfrc = rc address "ISPEXEC" "VPUT (ZISPFRC)" end exit(rc) /*******************.********.*********.*****************************/
Programm 62 ISPF ERROR: Ausgeben von ISPF Fehlermeldungen
In der Zeile 07 wird abgefragt, ob das Programm im FOREGROUND (also online) oder im BACKGROUND (also im Batch) läuft. Entsprechend dem Ergebnis dieser Abfrage werden die entsprechenden Befehle zur Ausgabe der Fehlermeldungen benutzt.
24.12.2
EXNAME - Programm Start Member
Funktion Programmkopf fur REXX Programme bereitstellen.
550
24 Die LANZISPF Utilities
Beschreibung EXNAME ist ein so genanntes Programm Start Member, das man immer an den Beginn eines Programms stellen kann, um verschiedene Funktionen zu automatisieren. Hier zunächst die Programmliste: 01 02 03 04 05 06 07 08 09
/* DOC: EXNAME REXX COPY */ /* DOC: Einfügen der 'Start Programm' Meldung mit Programmname, wenn */ /* DOC: Ausführung im Batch erfolgt. */ sysdate = "NOT"; /*%sysdate*/ systime = "COMPILED"; /*%systime*/ parse source #sys #type exname #dd #dsn #exec #env #adr #tok exname = right(exname,8) if sysvar("SYSENV") = "BACK" then, say exname" Start Programm" time() "Compiled: "sysdate systime
Programm 63 EXNAME: Programmkopf fir REXX Programme
Zeilen 04 und 05 Diese Zeilen werden dann besonders interessant, wenn das Programm kompiliert und dann ausgeführt wird. Der Compiler stellt in die Compiler Systemvariablen SYSDATE und SYSTIME die entsprechenden Werte zum Kompilierungszeitpunkt. Wenn das Programm in der unkompilierten Form läuft, dann stehen dort die Werte „NOT" und „COMPILED" wie ich sie vorher zugewiesen habe. Zeile 06 Durch diese PARSE Anweisung wird der Name des Programms in die Variable EXNAME gestellt. Diese Variable benutze ich immer dann im Programm, wenn ich den Programmnamen benötige, wie z.B. bei der Ausgabe von Fehlermeldungen. Zeilen 08 und 09 Wenn das Programm im Batch ausgeführt wird, erscheint immer eine Programmstartmeldung über SYSTSPRT. Ich habe das Programm EXNAME zweimal im Batch ausgeführt, und zwar einmal unkompiliert und einmal in kompilierter Form. Hier die beiden SAY Ausgabezeilen: EXNAME Start Programm 14:19:37 Compiled: NOT COMPILED EXNAME Start Programm 14:22:15 Compiled: 19 Aug 2004 14:21:24
24.12.3
LMGREAD - Copy Member zum Lesen von Datensätzen mittels LMGET
Wie ich bereits in einem vorhergehenden Kapitel erwähnte, sind Datei Ein- und Ausgaben mittels EXECIO sehr langsam. Um nun bei umfangreichen Dateiverarbeitungen mit REXX unter ISPF auf einfache Art die schnelle ISPF I/O Technik nutzen zu können, habe ich das Copy Member LMGREAD entwickelt.
24.12 REXX Copy Member
551
Funktion Daten mit ISPF schnell lesen. Copy Member zum Lesen von Datensätzen mittels LMGET. Beschreibung Diese Prozedur kann nicht extern aufgerufen werden. Sie muss als interne Prozedur eingebunden werden, da ein Stem zurückgegeben wird. Aufrufe Daten einer sequentiellen Datei oder eines Members mit Hilfe von LMGET einlesen. Call Daten_lesen_lmget "DSN=dsn,STEM=stem,MEM=mem" oder Call Daten_lesen_lmget "DD=ddn,STEM=stem,MEM=mem" Beschreibung der Parameter dsn Data Set Name. ddn DD-Name (muss unbedingt schon zugeordnet sein), mem Membername (Optional). stem Name des Sterns, der die Datensätze enthalten soll. Ausgabe Datensätze in stem., und stem.O enthält die Anzahl Sätze. 1. Beispiel Lesen aus einer sequentiellen Datei: c a l l daten_lesen_lmget "DSN=LANZT.EPQMS.TLOKATIO,STEM=LOK" Danach stehen die Datensätze im Stem LOK., und LOK.O enthält die Anzahl der Sätze. 2. Beispiel Lesen der Daten eines Members: c a l l daten_lesen_lmget "DSN=PROX.REXX,MEM=TT,STEM=INS" Danach stehen die Datensätze des Members PROX.REXX(TT) im Stem INS., und INS.O enthält die Anzahl der Sätze. 3. Beispiel Lesen der Daten eines Members mit bereits zugeordnetem DD- Namen: c a l l daten_lesen_lmget "DD=INDD,MEM=TT,STEM=INS" Wenn die Datei PROX.REXX vorher unter dem DDNAME INDD zugeordnet war, stehen die Datensätze des Members PROX.REXX(TT) im Stem INS., und INS.O enthält die Anzahl der Sätze. Tipp Falls Sie ein ähnliches Programm für die Ausgabe von Dateien benötigen, fällt es Ihnen sicherlich leicht, aus dem Quellkode von LMGREAD ein entsprechendes Unterprogramm für die Ausgabe von Dateien zu gestalten.
Abbildungsverzeichnis Abbildung 1 Literatur für z/OS MVS im Internet
8
Abbildung 2 Internetseite für die ISPF Literatur von IBM
9
Abbildung 3 Aufstellung der ISPF Broschüren im Internet
10
Abbildung 4 Aufruf des Book Managers in einem ISPF Panel
11
Abbildung 5 ISPF Broschüren im Book Manager unter ISPF
12
Abbildung 6 ISPF HELP Index Panel
17
Abbildung 7 Index - T Panel im ISPF Help
18
Abbildung 8 ISPF Command Summary Abbildung 9 Tutorial Panel zum DSLIST Command
19 19
Abbildung 10 Eingangsmenü zum LOOKAT im Internet Abbildung 11 SDSF Primary Option Menu
20 21
Abbildung 12 Anzeige der Data Set Information eines PDS Abbildung 13 Anzeige der Data Set Information eines PDSE
29 30
Abbildung 14 Definition von Concatenated Data Sets mittels JCL
33
Abbildung 15 Eigenschaften von einem 3270-Emulationsbildschirm
36
Abbildung 16 VT AM Login Menü Abbildung 17 VTAM - TPX Eingabemenü
38 39
Abbildung 18 TPX Auswahlmenü Abbildung 19 TPX Benutzerverwaltung
40 41
Abbildung 20 TPX Befehlspräfix und Befehlstaste Abbildung 21 TPX Befehle Abbildung 22 Wartung von individuellen TPX Benutzern
42 42 43
Abbildung 23 Autostart für einzelne TPX Benutzer einstellen Abbildung 24 TSO Logon Panel
44 45
Abbildung 25 TSO LOGON Job
45
Abbildung Abbildung Abbildung Abbildung
48 49 55 56
26 Zuordnung von ISPTLIB und ISPTABL 27 Dateiattribute der ISPF Profile Datei 28 Die Logon Steuerdatei LOGONDSN 29 Anzeige der ISPF Dateiketten
554
Abbildungsverzeichnis
Abbildung 30 Einstellungsanzeige der VT AM Verbindung zum Host
58
Abbildung 31 Sitzungsparameter - 3270-Host
59
Abbildung 32 Kommunikationsanpassung bestätigen
59
Abbildung 33 Praktikable Einstellungen der ISPF Settings
60
Abbildung 34 POP UP Panel mit View Warning
63
Abbildung 35 Primary Option Menu mit CUA Zeile
64
Abbildung 36 Status Pull Down Menu des ISPF Primary Option Menus
65
Abbildung 37 Calendar Anzeige im Primary Option Menu
65
Abbildung 38 ISPF Task List mit insgesamt acht ISPF Ebenen
68
Abbildung 39 Function Key Definition Panel
70
Abbildung 40 Bildschirm mit Anzeige der PF Tasten Belegung
71
Abbildung 41 Anzeige der aktuellen Keylist
73
Abbildung 42 Keylist Edit Panel
74
Abbildung 43 PF Tastenbelegung für das SDSF
75
Abbildung 44 MVS QuickRef Auswahl Anzeige
77
Abbildung 45 Command Table Utility
80
Abbildung 46 ISPCONF: ISPF Customization Member (Ausschnitt)
81
Abbildung 47 Suchergebnis fur die Members ISRCMDS und ISPCMDS
82
Abbildung 48 Member List des ISPTABL Dateien
83
Abbildung 49 Anzeige der ISPF Command Table ISPCMDS im Menü 3.9
84
Abbildung 50 Anzeige der ISPF Command Table ISFCMDS im Menü 3.9
85
Abbildung 51 Bearbeitungsmenü des Programms CMDSMOD
86
Abbildung 52 Beispiel für die Erzeugung einer Liste der Command Table ISPCMDS
89
Abbildung 53 Das Dataset List Utility Panel (Option 3.4)
92
Abbildung 54 Das RefList Pull Down Menu
93
Abbildung 55 Das Personal Data Set Lists Panel
93
Abbildung 56 Die DSLIST Primary Commands
99
Abbildung 57 Suchen eines Members in einer DSLIST Anzeige
100
Abbildung 58 Beispiel für eine Suche nach Text Strings mit SRCHFOR
100
Abbildung 59 Ergebnisanzeige nach einer Textsuche mit SRCHFOR
101
Abbildung 60 Die DSLIST Line Commands
102
Abbildung 61 Das DSLIST Action Panel
103
Abbildung 62 Aufruf einer Prozedur im DSLIST Panel
104
Abbildung 63 Das Pull Down Menu „Options" im DSLIST Panel
105
Abbildung 64 Bildschirm zur Einstellung der DSLIST Optionen
105
Abbildung 65 Das Edit/View Entry Panel
107
Abbildung 66 Auswahl der Members für eine RS Aktion
108
Abbildung 67 Definition der Member Statistics
108
Abbildung 68 Anzeige der neuen Member Statistics
109
Abbildungsverzeichnis
555
Abbildung 69 Member List mit eingeschalteter „Enhanced Display Option"
109
Abbildung 70 Member List mit ausgeschalteter „Enhanced Display Option"
110
Abbildung 71 Das Confirm Member Delete Panel
110
Abbildung 72 Erstellen und Ändern von DSLISTen
112
Abbildung 73 Anzeige der DSLIST „REFLIST"
113
Abbildung 74 Erstellen einer neuen DSLIST
113
Abbildung 75 Anzeige der neuen DSLISTe
114
Abbildung 76 Aufrufmöglichkeiten für DSLISTen
115
Abbildung 77 Aufruf einer DSLIST in der Command Line des ISPF
115
Abbildung 78 Aufruf von DSLISTen durch den Befehl DSLIST
116
Abbildung 79 Anzeige der offenen ISPF Ebenen durch den Befehl SWAP LIST
117
Abbildung 80 Benutzung des „Volume Serial" Feldes im DSLIST Panel
117
Abbildung 81 DSLIST Beispiel meines TSO Users LANZT
120
Abbildung 82 Das ISPF Workplace Panel
124
Abbildung 83 Aufruf einer DSLIST vom ISPF Workplace aus
128
Abbildung 84 Aufruf des DSLIST Editors für eine DSLIST vom Workplace Panel aus .... 129 Abbildung 85 Auswahl eines DSN aus dem DSLIST Editor Panel
129
Abbildung 86 Anzeige der Member List eines PDS aus dem Workplace heraus
130
Abbildung 87 Anzeige der Data Set Information eines DSN aus der Workplace heraus
130
Abbildung 88 Edit and View Settings
142
Abbildung 89 Edit Profile Anzeige Panel
144
Abbildung 90 Das Einstellungspanel fur Colored Code
148
Abbildung 91 Vorschläge für Last Level Qualifiers
151
Abbildung 92 Beispiel für die Erzeugung einer Dateiliste aus einem DSLIST Panel
166
Abbildung 93 Confirm Panel beim Kopieren inkonsistenter Dateien
171
Abbildung 94 Kopieren von REXX Quellkode aus einem PC Fenster
177
Abbildung 95 Die CUT and PASTE Standardeinstellungen mittels EDSET setzen
181
Abbildung 96 Clipboard Manager Panel
!
Abbildung 97 Anzeige des Programms ISRDDN
182 186
Abbildung 98 Aufruf des Programms ISRDDN
188
Abbildung 99 Suchen nach einem Member mithilfe des Programms ISRDDN
188
Abbildung 100 Gefundene Members nach einem Suchvorgang mittels ISRDDN
189
Abbildung 101 ENQs mithilfe von ISRDDN ermitteln
190
Abbildung 102 Datei mithilfe von ISRDDN freigeben
190
Abbildung 103 Warnung bei inkonsistenten Datei strukturen durch ISRDDN
191
Abbildung 104 Anzeige der ISPSLIB Kette mit der Anzeige Option SHORT
192
Abbildung 105 Member List eines Concatenated Data Set
193
Abbildung 106 Anzeige der ISPSLIB Kette mit der Anzeige Option LONG
193
Abbildung 107 Anzeige der Parmlib Dateien
194
556
Abbildungsverzeichnis
Abbildung 108 BROWSE des Parmlib Members ALLOCOO
195
Abbildung 109 Anzeige der LINKLIST Kette mithilfe des Programms ISRDDN Abbildung 110 Beschreibung des Programms CONCATD
196 199
Abbildung 111 Aufruf des Programms ISRDSLST in einem REXX Programm
201
Abbildung 112 Anzeige Panel des Befehls SWAP LIST Abbildung 113 REXX Prozedur zum Aufruf des Programms TASID
202 203
Abbildung 114 TASID Option Menu
204
Abbildung 115 Anzeige der Z-Variablen
334
Abbildung 116 ISPF LIBDEF DISPLAY Panel
341
Abbildung 117 Anzeigepanel des MEMLIST Services
381
Abbildung 118 Message Ausgabe Member ISRZ00 Abbildung 119 Definition eines Message Members
404 405
Abbildung 120 Standard Message Member ISRZ00 Abbildung 121 Panel Attribute Character Definitions
408 419
Abbildung 122 Panel )BODY Section Definitions
420
Abbildung 123 Anzeige des Panels LASTED Abbildung 124 Definition eines Skeleton Abbildung 125 Verarbeitung eines Skeleton
431 434 435
Abbildung 126 Ergebnis einer Skeleton Verarbeitung
436
Abbildung 127 Beispiel einer Tabellenverarbeitung Abbildung 128 Anzeige des Programms LASTED Abbildung 129 Hilfe Text zum Programm LASTED
442 445 446
Abbildung 130 Members der ISPF Profile Datei Abbildung 131 Liste der offenen ISPF Ebenen nach Aufruf des Befehls SWAP LIST
455 457
Abbildung Abbildung Abbildung Abbildung Abbildung Abbildung Abbildung
457 501 503 528 535 536 540
132 ENQ Display with ISRDDN 133 Edit and View Settings Panel 134 Panel IMPANEL zur Eingabe der DOC Zeilen 135 Aufruf des Makros #R3390 136 Panel der CR Funktion 137 Anzeige der LISTCAT Ausgabe des Programms LI 138 Anzeigen der Plattenbelegung mit dem Programm VOLINF
Abbildung 139 POP Up Panel des Programms XCURSOR
542
Tabellenverzeichnis Tabelle 1 ISPF Services
14
Tabelle 2 Abkürzungen englischer Begriffe
34
Tabelle 3 Die erforderlichen ISPF DD Namen
48
Tabelle 4 ISPF Start Befehle
51
Tabelle 5 Darstellungsmöglichkeiten am 3270-Bildschirm Tabelle 6 Definitionsbeispiele von DSLIST Masken
57 97
Tabelle 7 Action Line Commands im DSLIST Panel
103
Tabelle 8 Empfohlene Präfixe für Aufrufe von DSLISTen
120
Tabelle 9 Action Commands zur Steuerung der Anzeige im Workplace Panel Tabelle 10 Action Befehle des Workplace
126 127
Tabelle 11 Edit Primary Commands - Teil 1
135
Tabelle 12 Edit Primary Commands - Teil 2 Tabelle 13 Edit Primary Commands - Teil 3
136 137
Tabelle 14 Edit Primary Commands - Teil 4
138
Tabelle 15 Edit: Abkürzungen der Operanden Tabelle 16 Edit Line Commands - Teil 1
139 140
Tabelle 17 Edit Line Commands - Teil 2
141
Tabelle 18 Definition der Picture Strings bei FIND und CHANGE Tabelle 19 Line Commands des Programms ISRDDN
158 187
Tabelle 20 Arithmetische REXX Operatoren Tabelle 21 Vergleichsoperatoren im REXX
214 215
Tabelle 22 Logische Operatoren im REXX Tabelle 23 REXX Host Command Environments - Teil 1
216 226
Tabelle 24 REXX Host Command Environments - Teil 2 Tabelle 25: Varianten des PARSE Befehls
227 247
Tabelle 26 Optionen der DATE Funktion Tabelle 27 Optionen der TIME Funktion
270 275
Tabelle 28 Suchreihenfolge in den Prozedurenbibliotheken Tabelle 29 Data Set Services des ISPF - Teil 1
343 350
558
Tabellenverzeichnis
Tabelle 30 Data Set Services des ISPF - Teil 2
351
Tabelle 31 Data Set Query Services
382
Tabelle 32 Variable des LMDLIST Services
383
Tabelle 33 Variable des DSINFO Services Tabelle 34 Variable des LISTDSI Services - Teil 1
384 389
Tabelle 35 Variable des LISTDSI Services - Teil 2
390
Tabelle 36 Variable des LISTDSI Services - Teil 3
391
Tabelle 37 Variable des LISTDSI Services - Teil 4
392
Tabelle 38 Reason Codes des LISTDSI Services - Teil 1
392
Tabelle 39 Reason Codes des LISTDSI Services - Teil 2
393
Tabelle 40 QUERYENQ: Variablenbeschreibung der ISPF Tabelle
399
Tabelle 41 Panel Sections
417
Tabelle 42 Skeleton Befehle Tabelle 43 Bearbeitungsbefehle für Tabellen
433 441
Tabelle 44 Allgemeine Z Variable
459
Tabelle 45 Z Variable für Datum und Uhrzeit Tabelle 46 Edit Makro Befehle - Teil 1: AUTOLIST - CREATE
459 469
Tabelle 47 Edit Makro Befehle - Teil 2: CURSOR - EXCLUDE COUNTS
470
Tabelle 48 Edit Makro Befehle - Teil 3: FIND - LINE BEFORE Tabelle 49 Edit Makro Befehle - Teil 4: LINE_STATUS - PRESERVE
471 472
Tabelle 50 Edit Makro Befehle - Teil 5: PROCESS - SEEK_COUNTS
473
Tabelle 51 Edit Makro Befehle - Teil 6: SESSION - XSTATUS Tabelle 52 Edit Makros: Erklärung der Operanden
474 475
Tabelle Tabelle Tabelle Tabelle
479 486 490 491
53 System Variable des Editors 54 Verzeichnisse auf der CD ROM der LANZ Utilities 55 Die REXX Beispielprogramme - Teil 1 56 Die REXX Beispielprogramme - Teil 2
Tabelle 57 Die REXX Beispielprogramme - Teil 3 Tabelle 58 Die REXX Beispielprogramme - Teil 4 Tabelle 59 Die REXX Beispielprogramme - Teil 5
492 493 494
Tabelle 60 Die LANZ Utility Programme - Teil 1 Tabelle 61 Die LANZ Utility Programme - Teil 2 Tabelle 62 Die LANZ Utility Programme - Teil 3
494 495 496
Tabelle Tabelle Tabelle Tabelle
497 498 499 534
63 64 65 66
Die LANZ Utility Programme - Teil 4 Die LANZ Utility Programme - Teil 5 Die LANZ Utility Programme - Teil 6 Beschreibung der Funktionskodes des Programms CR
Programmverzeichnis Programm 1 Die TSO Logon Prozedur LOGONXX
46
Programm 2 ISPFLOGO: Allgemeine TSO/ISPF Logon Prozedur
52
Programm 3 LOGON: Standard Logon Prozedur
53
Programm 4 JD2: Rechnen mit Vergleichsoperatoren
216
Programm 5 SKAT: REXX Prozedur für das Skat Turnier
217
Programm 6 ARGTEST: Beispiele für Parameterübernahme
228
Programm 7 LMGREAD: Lesen mittels ISPF I/O Technik
232
Programm 8 PARSE1: Anwendung des PARSE VALUE Befehls Programm 9 COMPRESS: Submit eines Compress Jobs
249 256
Programm 10 LOTTO: Lottozahlen berechnen Programm 11 NAMSORT: Hauptprogramm für Sort Beispiel
257 258
Programm 12 NSORT: Unterprogramm für Sort Beispiel
259
Programm 13 JULDATE: Berechnung des julianischen Tags im Jahr Programm 14 RANDOM: Berechnen von Zufallszahlen
272 280
Programm 15 JOBNTSO: Beispiel für die STORAGE Funktion
284
Programm 16 CHANGE: Funktion für Textänderungen Programm 17 VALDSN: Validierung von DSNs
296 302
Programm 18 LISTDS: Beispiel für den Aufruf der Funktion LISTDS Programm 19 PROGNAME: Ermitteln des Programmnamens in einem JOB Step
309 312
Programm 20 EXECIOT: Beispiel für die Ausführung einer EXECIO Operation
315
Programm 21 JCL eines TSO Batch Jobs Programm 22 JCL eines ISPF Batch Jobs Programm 23 $ISPFDD: Skeleton Definition
320 322 323
Programm 24 INCLUDE des Members $ISPFDD in einen ISPF Batch Job Programm 25 SSPANEL1: Panel Definition
324 329
Programm 26 INPUTPANEL: DISPLAY PANEL Beispiel Programm 27 VINTPAC: Skeleton Definition Programm 28 LIBDEF: Beispiele für die Anwendung des LIBDEF Befehls
329 331 340
Programm 29 ALTLIB1: Beispiel für die Anwendung des ALTLIB Befehls Programm 30 ALTLIB2: Beispiele für die Stapelung von ALTLIB Anweisungen
344 345
Programm 31 ALTLIB3: Anwendung der QUIET Option
347
560
Programmverzeichnis
Programm 32 LMOPEN: Beispiel fur die Durchfuhrung eines LNOPEN
355
Programm 33 LMMFIND: Suchen von Members in verketteten Bibliotheken
357
Programm 34 LMGET: Lesen einer Datei mithilfe der ISPF Services Programm 35 LMPUT: Anwendung des LMPUT Services
361 363
Programm 36 LMCOPY: Kopieren von Members
365
Programm 37 LMMSTATS: Setzen der Member Statistics
369
Programm 38 LMMLIST: Anwendung des LMMLIST Services
372
Programm 39 LMMDISP: Anwendung des LMMDISP Services Programm 40 LMDDISP: Anwendung des LMDDISP Services
375 377
Programm 41 LMDLIST: Anwendung des LMDLIST Services
379
Programm 42 MEMLIST: Memberliste aus verketteten Dateien erstellen Programm 43 QBASELIB: Ermitteln der DSNs zu einem DD Namen
381 394
Programm 44 QLIBDEF: Ausfuhrung des QLIBDEF Services Programm 45 TT00: Message définition member
397 406
Programm 46 ISPFERRT: Test für das Unterprogramm ISPF_ERROR Programm 47 SKAT: Panel Definition
411 418
Programm 48 CRPAN1 : Panel fur die CR Funktion der LANZ Utilities Programm 49 Beispiel für den Aufruf eines POP Up Panels Programm 50 HELPMASK: Vorlage für ein HELP Panel
423 428 429
Programm 51 LASTED: Panel für die Prozedur LASTED Programm 52 LASTED: Panel Definition
431 444
Programm 53 LASTED: Quellkode des Last Edit Programms Programm 54 ZVARS: Anzeigen von Z Variablen
450 461
Programm 55 #SS: Edit Makro zur Listenbereinigung Programm 56 #DPR: Druckjob submitten
467 482
Programm Programm Programm Programm Programm Programm Programm
515 517 530 531 546 549 550
57 LOGONDSN: DSN Datei fur das LOGON Verfahren 58 VARDAT: Umgebungsvariable definieren und speichern 59 Beispiel eines durch #TSOB erzeugten TSO Batch Jobs 60 Beispiel eines durch #ISPFB erzeugten ISPF Batch Jobs 61 DATEALLT: Beispiel für den Aufruf des Unterprogramms DATEALL 62 ISPF ERROR: Ausgeben von ISPF Fehlermeldungen 63 EXNAME: Programmkopf fur REXX Programme
Index .ZF
479
502
.ZFIRST
479
#IMACROA
501
.ZL
479
#IMEXECE
522
.ZLAST
479
#ISPFB
544
.ZVARS
426
#SPLJ
526
3270 Mode
#ASM #IMACR02
532, 544
#SS
539
#SU
516, 544
#TSOB #TSOB$$$ Member $DOC SISPFDD $LElpar
3390 Platten
528
Abbildungsverzeichnis
553
544
Abkürzungen
529
Active Host Command Environment
223
ADDPOP
428
ADDRESS
221
504, 507, 526 324, 434 504
Beispiel ADDRESS ISPEXEC
SPDSHIST
509, 510
SPDSSICH
510
ALLOC
)AREA
429
)BLANK
433
)CM
433
)DEFAULT
433
ALTLIB Beispiel 1 Beispiel 2 Beispiel 3 QUIET Option Stapelung Suchreihenfolge Unter ISPF Unter TSO
)DOT
433
)ENDDOT
433
)ENDSEL )IM
16
433 433, 434
Always show split line
3, 34
223 224 27,317 47 343 343 343 346 345 343 344 342 61
)MODEL
430
Anfanger
)SEL
433
Anlegen eines PDSE
317 120
)SET
433
APPEND
)TB
433
APPLICATION
.BCH
36
.HELP
430
.MSG
423
.ZCSR
479
Beispiele $DOC SISPFDD in JCL einbinden )IM .MSG
2
15 506 324 434 423
562 .ZVARS ABS ADDPOP ADDRESS ALLOC ALLOC ISPFILE ALTLIB ALTLIB ACT ALTLIB DISPLAY ALTLIB RESET ARG Bubble Sort C2D C2X CHANGE COPIES D2C D2X DATATYPE DATE DELSTR DIGITS DISPLAY PANEL DSINFO EXECIO EXECIO mit QUEUEDO FORM FORMAT FREE FTCLOSE FTINCL FTOPEN FUZZ IEBGENER IF Befehl IKJADM INSERT INTERPRET ISPF Batch Job ISPLIBD Panel ISPLLIB JUSTIFY LEFT LIBDEF LISTDS LMCLOSE LMCOPY LMDDISP LMDLIST LMFREE
Index 426 279 262, 428 232 262, 336 437 343 343, 347 344 344 269 257 285 286 297 290 287 287 283 270 294 246, 279 262, 427 385 224,314, 336 257 279 291 336 437 435 437 246, 279 482 239 347 295 232, 240, 242 322, 324, 395 341 224 292 482 224 309 337,355 365 377 379 336
LMGET LMINIT LMMDISP LMMFIND LMMLIST LMMREP LMMREP LMM STATS LMOPEN LMPUT MEMLIST Message Ausgabe MSG MSG(ISRZOOl) NUMERIC DIGITS NUMERIC DIGITS 70 NUMERIC FUZZ OUTTRAP OVERLAY Panel SSPANELI PARSE NUMERIC NUMS PARSE SOURCE PARSE VAR PROCEDURE EXPOSE Programm NULLSTR Prozedur JD2 PULL QBASELIB QLIBDEF QUERYENQ QUEUE QUEUED RANDOM REMPOP RIGHT SELECT SETMSG Skeleton Skeleton SOURCELINE STORAGE STRIP STRUKTR SUBMIT* SUBMIT * END(XX) SUBSTR SYSDSN SYSEXEC SYSVAR Tabellen verarbeiten
232, 360 232, 336, 353 374 232, 360 372 362 337 369 232, 336,355 337, 362 381 338 307 338 279 245 279 256,308, 482 298 328 279 252 231 254 218 216 263 232, 347, 394 396 399 256 263 257, 280 262, 428 293 261 338 434 331 276 312 299 291 256 482 300, 482 232,310 353 224,311,357 442
563
Index T B ADD TBCLOSE TBCREATE TBDISPL TBMOD TBOPEN TBSORT TBTOP TIME TRACE ?1 TRANS TRANSLATE TSO Batch Job TSO Commands Umgebungsvariable einlesen Unterprogramm CHANGE Unterprogramm ISPF ERROR Unterprogramm NSORT VALUE VER VERIFY VGET VINTPAC Step Wort Funktionen X2C X2D ZISPFRC setzen Beispielprogramme #2 Makro (Auszug) #DPR Makro #TT1 Makro #TT2 Makro ADDRESS ALLOCJSPFILE ALTLIB1 ALTLIB2 ALTLIB3 ARGTEST C2D COMPRESS CRP AN 1 Paneldefinition DATEALLT EXECIOT EXIT HELPMASK Paneldefinition ISPFERRT JOBNTSO JULDATE LASTED LASTED Paneldefinition
333 333 333 333 333 333 333 333 275 264 423 301 320 317 278 296 253 259 277 423 302 256 435 306 288 289 238 480 481 476 478 223 437 344 345 346 227 285 256 422 546 314 237 429 410 284 272 446 430
LIBDEF LISTDS LMCOPY LMDDISP LMDLIST LMGET LMGREAD LMMDISP LMMFIND LMMLIST LMMSTATS LMOPEN LMPUT LOTTO MEMLIST MSGTEST NAMSORT PARSE 1 POTENZ2 QBASELIB QLIBDEF QUERYENQ RANDOM SKAT SKAT Panel TT00 - Message Member VALDSN WORDFUNK X2D ZVARS Benutzung des Buches Blättern im HELP Book Manager BOUNDS BROWSE Beschreibung
340 309 365 377 379 360 231 374 356 372 368 355 362 257 381 406 258 249 264 394 396 400 280 217 418 406 302 306 289 335,461 3 17 6, 10, 12 476 126 133
CALL Modul
523
CEXEC Modul
523
CHANGE CLRSCRN Clear Screen
478
CMDSMOD Colored Code Coloring einheitliche LLQs einrichten Highlight cursor phrase
517 86, 88, 119 149 150 148 150
564
Index
Highlight FIND strings HILITE Language LLQ Parentheses matching REXX Was ist das?
149 148 149 149 149 148 147
Sequential Concatenated Data Sets
33
Dateigröße PDS/PDSE
28
Dateistruktur PDS/PDSE
28
Dateitypen
26
DB2 Datenbanken
31
DD
317
COMMAND
14
Command line at bottom
61
Command Summary
19
Command Tables
79
DIALOG
14
28, 256
Directory
27
COMPRESS CONCATD
53,54, 197, 198
CONFIRM
Ill
Confirm Member Delete
111
DD Statement DELETE DEQ
27 530 35
DISPLAY
416
DISPLAY PANEL
217
DISPLAY Service
427
CONTROL DISPLAY RESTORE 449 DISPLAY SAVE 449 ERRORS RETURN 231, 278, 340,401, 402
DL
CR
544
DO UNTIL
236
110, 155
DO WHILE
236
CREATE CUA CURSOR CUT DISPLAY Einstellungen Darstellung
16 476 155, 179 182 181 4
DATA IN VIRTUAL
29
Data Set List
91
Data Set Query DSINFO LISTDSI LMDLIST QBASELIB QLIBDEF DATASET DATE Formattabelle DATEALL Dateien Concatenated Data Sets inkonsistente maximale Größe Partitioned Concatenated Data Sets
383 388 383 394 396 476, 480 270 545, 546 32 191 32 33
Aufruf der Workplace DO mit LEAVE
DOC Zeilen einfügen DSINFO Variablen Tabelle DSLIST Action bar Action Commands Aufruf durch Command Table Aufruf mit DSLIST Aufruf mit DSLIST name aufrufen Command Table Beispiel Command Table Namen Command Tables nutzen Commands Confirm member delete Dsname Level Edit/View Entry Panel Einführung Enhanced member list Include Additional Qualifiers ISPF Command Table ISPF Workplace Line Commands MEMBER Command Merksätze
123 235
503 382,383 384 35,92, 123 92 103 116 116 115 114 119 119 118 98 110 96 107 91 107,109 95 112 112 102 99 121
565
Index MO, CO, RS Actions neu erstellen Panel Panel 3.4 Panel fields Personal Data Set Lists Prozeduraufruf. REFLIST Settings Settings Main Panel SRCHFOR Command Volume Serial DSN DTL DYNAMNBR Edit #IMACROA ==CHG =ERR =BNDS =COLS =MASK =PROF =TABS Beschreibung BLOCK SHIFT LEFT BNDS Broschüre der Befehle CAPS CHANGE Character strings Colored Code Command Syntax Commands CUT CUT & PASTE DELETE Einführung EXCLUDE FIND Hex Strings HILITE HILITE LLQ IMACRO initial Makro ISREDRT LLQ MSG NOTE
108 113 96, 98 92 94 111 104 93,94, 112 105 106 100 118 25, 35 413 46, 320 126 142 146, 165 146 146 146 146 146 146 133 168 164, 169 134 145 155 160 147 134 135 143,176, 179 176, 179 168 133 155, 160, 168 155, 168 158 145, 148, 150 150 145 142 152 150 146 146
NULLS NULLS OFF NUMBER OVERLAY PASTE Picture Strings PROFILE PROFILE LOCK RECOVERY Recovery Data Set RESET RETRIEVE SETUNDO SHIFT STORAGE Suchtexte Text strings UNDO Edit Commands Abkürzungen der Operanden AUTONUM AUTOSAVE BOUNDS BROWSE CANCEL CAPS CHANGE COPY CREATE CUT DELETE EDIT EDITSET, EDSET END EXCLUDE FIND FLIP HEX HILITE IMACRO LOCATE MODE MOVE NONUMBER NOTES NULLS NUMBER PACK PASTE PRESERVE
143,
144,
145,
151,
145 164 145 162,165 176,180 158 143,146 145,147 151, 153 151 174 173 151, 153 162 153 157 159 153, 155 139 135 135 135 135 135 135 135 135 135 135 135 136 136 136 136 136 136 136 136 136 136 137 137 137 137 137 137 137 137 137
566
Index
PROFILE RCHANGE RECOVERY RENUM REPLACE RESET RFIND SAVE SETUNDO SORT STATS SUBMIT Tabelle der Line Commands TABS UNDO UNNUMBER VIEW EDIT DATASET Edit Makro #SS Ausfuhren AUTOLIST AUTONUM AUTOS AVE Befehlstabellen Beispiel Beispiel #DPR BLKSIZE BOUNDS BROWSE BUILTIN CANCEL CANGECOUNTS CAPS CHANGE COMPARE COPY CREATE CURSOR CUT D ATA_CH ANGED DATAWIDTH DATAID DATASET DEFINE DELETE DISPLAYCOLS DISPLAYLINES DOWN
137 137 137 138 138 138 138 138 138 138 138 138 140 138 138 138 138
225, 409, 448, 464 469 465, 466 463 469 469 469 469 464 481 469 469, 476 469 469 469 469 469 469, 478 469 469 469 470,476 470 470 470 470 476, 480 470 470 470 470 470
EDIT END EXCLUDE EXCLUDECOUNTS FIND FINDCOUNTS FLIP FLOW_COUNTS HEX HILITE IMACRO INSERT LABEL LEFT LEVEL LINE LINE .ZCSR LINE_AFTER LINE BEFORE LINESTATUS LINENUM LOCATE LRECL MACRO MACROLEVEL MASKLINE MEMBER Message ausgeben MODEL MOVE Namenskonventionen NONUMBER NOTES NULLS NUMBER PACK Parameterübergabe PASTE PRESERVE PROCESS PROFILE RANGECMD RCHANGE RECFM RECOVERY RENUM REPLACE RESET RFIND RIGHT
470 470 470, 478 470 471,478 471 471 471 471 471 471 471 471 471 471 471 476 471 471 472 480 472 472 472, 480 472 472 472, 476, 480 410 472 472 464 472 472 472 472 472 480 472 472 473 473 473 473 473 473 473 473 473 473 473
Index
567
RMACRO SAVE SAVE_LENGTH SCAN SEEK SEEKCOUNTS SESSION SHIFT SORT STATS SUBMIT Systemvariable Tabelle der Operanden TABS TABSLINE TENDER Testhilfen Testprogramm ISREMPSY TFLOW TRACE nutzen TSPLIT UNNUMBER UP USER_STATE VERSION VIEW VOLUME XSTATUS EDITSET EDSET CUT & PASTE
473 473 473 473 473 473 474 474 474 474 474 479 475 474 474 474 476 477 474 476 474 474 474 474 474 474 474 474 141,501 141 180
Einleitung
V
englische Fachbegriffe
5
Enhanced member list ENQ EXCLUDE
109 35, 399,439, 535 160, 478
EXEC Modul
523
EXNAME
550
Extended Format Data Sets EXTENTS externe Programme Fachbegriffe Abkürzungen englische im Internet File Tailoring Service
31 27,28 233 3 35 35 34 433
FIND FTCLOSE
478 435,437
FTINCL
435
FTOPEN
435,437
FUNCTION
14
Function Key Definition Panel
70
Function Pool
453,454
Funktionstasten
69
Größe von Plattendateien
32
GUI Mode
16
Help
16
High Level Qualifier (HLQ)
26
HILITE
234
Hinweis #ALTXT Spaltenauswahl .ZVARS Anweisung ADDRESS Environments Address ISPEXEC in Edit Makros ADDRESS ohne Operanden Anzahl TPX Bildschirme Attributzeichen verwenden Beispiele zu ISPF Services Besetzung der Skeleton Variablen C2D und NUMERIC DIGITS Command Definition Commands in ISPCMDS Compare Befehl Compiler Fehler Liste CONTROL ERRORS RETURN Datumskonvertierungen mit DATE Dezimalpunkt in STRUKTR DO Anweisung DSLIST Panel Commands Einfuhrung in REXX Einstellung der Compiler Optionen Erklärung von Begriffen Erklärung zur Application EXECUTIL Expansionszeichen verwenden Fehlerabfrage nach ISPF Funktionen FTOPEN Command und ISPFILE Geltungsbereich der LIBDEF Interne Darstellung von Zahlen ISPF Settings Panel ISPF und die Dateiverarbeitung ISPLIBD benutzen
525 426 227 410 222 37 416 352 331 285 88 83 282 522 401 271 545 234 99 207 523 15 15 317 420 363 437 341 387 61 337 341
568
Index
ISPTABL/ISPTLIB beim Start 49 ISREDIT und ISPEXEC benutzen 226 Keine Blanks in DSN 340 Länge eines Eintrags im Stack 255 LANZ Programmelemente 487 LASTED und Edit Recovery 508 Laufwerke RESERVED 355 Leerlassen des Short Message Feldes 338 List Data Set 167 LMGREAD 233 LMMLIST in Schleife aufrufen 371 Long Message Position 407 Makro nicht mit ## ausführen 519 Member in Dateiketten 375 NUMERIC DIGITS setzen 245 0 0 und MM Blocks benutzen 175 Option STACK benutzen 340 Optionen beim ISPF Start 456 Panel Definition 414 Parameter durch Blanks trennen 227 Parameter übergeben 230 PARSE Befehl 249 PF Tasten für SWAP 66 QWSDSF Aufruf 76 RACF fur DCOLLECT 541 RC=4 bei LMMADD 359 RC=8 bei LMMREP 359 REXX Compiler 520 REXX Performance 210 REXX Variable in ISPF Pools 461 453 REXX Variable in ISPF Services SCLM 7 Suchreihenfolge fur Commands 81 TRACE und Compiler 521 TSO/E REXX Commands 313 Umlaute beim Download von MVS 507 umschalten in BROWSE 133 Unterdrückung der Short Message 408 Unterschied X2D und C2D 289 Variable nach Funktionsaufrufen 383 Varianten des ADDRESS 241 Weggelassene LMINIT Operanden 353 X2D und NUMERIC DIGITS 289 Zeitfenster der DATE Funktion 540 ZERRSM und ZERRLM ausgeben 403 zuletzt editierte Dateien 502 Zurückschreiben der Profile Members ...455 Host Command Environment
222, 223
IDCAMS DCOLLECT
540
IEBGENER
482
IF Befehl Beispiele IKJADM
239 347
IKJEFTO1
319
IMACROI
504
Profile Variable IMPANEL Include Additional Qualifiers
502 503 94, 96, 118
INCLUDE in JCL
324
Initial Edit Macro
155
Initial View
118
interne Unterprogramme
233
INTERPRET Beispiele ISF ISFCMDS
239, 241,242 83 84, 85
ISFPROF
455
ISP@PRIM
456
ISPCMDS Liste erzeugen ISPCONF ISPERROR ISPEXEC ISPF acht Ebenen active keylist Anzeige Formate Batch Job BLKSIZE für ISPPROF Broschüren Calendar CMDSMOD Command Delimiter Command Summary Command Table ändern Command Table Eintrag Command Tables Dateien Dateien im BATCH Dateiketten DD-Namen Ebenen
82, 84, 85 88 81 549 225 50, 52, 456 67 73 57 322, 324, 395 50 326 65 86, 88 62 19 85 87 79 47 322 56 47 66
Index eigene Commands erstellen Files Funktionstasten HELP Index Panel Help Panels im Batch ausführen Index - T Panel im ISPF Help Interaction ISPCMDS ISPCMDS Liste ISPFALC ISPPROF ISPTABL ISPTLIB ISRCMDS KEYLIST Kommunikation anpassen LIBDEF LIBDEF Service LIBDEF Utility ISPLIBD Literatur LM Services LMCLOSE LMFREE LMINIT LMMREP LMOPEN LMPUT LOGON LOGON Prozedur LOGONDSN Menü 3.9 Messages Online Help Facility optimale LOGON Prozedur Optionen Panels PF Tasten Anzeige PF Tasten Merksätze PF Tasten ohne Keylist PFSHOW ON/OFF POP Up Windows Primary Commands Primary Option Menu private Logon Prozedur Programmiersprachen QWSDSF Aufruf. Screen splitting Settings Skeletons
569 84 326 69 17 63 321 18 15 82, 84 88 51 49 48 81 82, 83 72 58 340 339 341 6, 10 349 337 337 336 337 336 336 35 53 55 79 327 16 54 60 62, 326 70 75 74 71 63 79 64 52 325 76 66 60 327
Split Screen Steuerung Start Commands starten Subsysteme Tabellen Schreiben Tabellen Service Tables Task List Task List Panel TBADD TBCLOSE TBCREATE TBMOD TBOPEN TBSORT Tutorial User Profile Library Variables Workplace Z-Variable ISPFALC ISPFWORK ISPPLIB ISPPROF BLKSIZE ISPSPROF ISPSTART
67 50 47 21 440 48 327 67 457 333 333 333 333 333 333 17 49, 50 327 121 334 51 123, 131 416 49, 50,51,53,455 49 458 50, 456
ISPTABL
82, 85,440,442
ISPTLIB
48, 82, 85,439
ISRCMDS
82
ISRDDN 56, 82, 185,485 Aufruf. 186 Bedienung 186 Befehle 187 Bemerkungen 185 CHECKOFF 191 CHECK Option 191 ENQ 190 inkonsistente Dateien 191 Member gefunden 189 Member suchen 187, 188 Panel 186 Parmlib Member anzeigen 194 SHORT und LONG Anzeige 192 System ENQ Status Panel 190 Zuordnung freigeben 189 ISRDSLST
119, 197, 201
570 ISREDIT
Index 225, 463
ISREMSPY Makro Testhilfe
478
ISREMSPY
478
ISRPROF
455
ISRZ00
404, 407, 409
ISRZ001
211
JCL submitten
529
JCLLIB Statement in JCL
324
Julian Date Formel
216
Julian Date, Berechnung
274
Katalogauszug
317
KEY
69
KEYLIST
69
KEYLIST ON/OFF Lademodul LANZ Utilities ## Makro #ALTXT Makro #ASM Makro #CM Makro #CMDSMOD #DISP Makro #EDMEM Makro #IMACR02 #IMACROA #IMACROI #ISPFB Makro #PAN Makro #PROF Makro #R3390 Makro #RC Makro #RCLOAD Makro #RO Makro #SPLJ Makro #SS Makro #SU Makro #TSOB Makro SDOC CHANGE CR CR Funktionskodes DATEALL DATUMOK DOC DOC und LASTED
72 523 519 524 532 525 535 526 526 502, 504 501 502 531 519 526 528 521 523 520 525 528 529 529 506 543 533 533 545 547 506 500
Einfuhrung EXABGL EXNAME IMACROI Inhalt der CD ROM Installation ISPERROR JD JOBSUFF JULDATE Kopieren LI LMGREAD LOGON LOGON Printout LOGONDSN MACROALL Makro ## Member SPDSHIST Member LOGDSN MEMSLIST MEMVERJ Programm DOCTEXT Programm LASTED Programm LOGON Programm PDSREST Programm PDSSICH Programm VARDAT Programmtypen REXX COPY REXX HAPRO REXX MAKRO REXX UPRO REXXLIBC SCHALTJ SS STRUKTR TASID Unterteilung VOLINF XCURSOR XEXTRACT Last Level Qualifier LASTED Hilfetext Quellkode LIBDEF LINE Line Commands
485 535 550 503 486 487 549 539 543 547 487 536 551 54 515 54,55 537 518 510 514 544 537 507 508 513 511 509 516 489 489 489 489 489 538 547 539 544 539 499 540 541 548 26 508 445 446 47,339 476 16
571
Index LINENUM
480
Link Library
524
LINKLIB
47
LOGON Schritte LOGONDSN
35 39 56,514
LISTALC
185
Long message in pop-up
LISTCAT
317
Long Messages
417
LISTDSI Reason Codes Variablen Tabellen
382 393 389
MACRO
476
Makro Testhilfe ISREMSPY
478
Literatur Beschaffung Book Manager ISPF im Internet Quellen z/OS im Internet
5 6, 7 10 9 6 7
Membernamen
LLQ LLQs LM Services Begründung warum LMCLOSE LMCOMP LMCOPY LMDDISP LMDFREE LMDINIT LMDLIST LMDLIST Beispiel LMFREE LMGET LMINIT LMMADD LMMDEL LMMDISP LMMDISP Beispiel LMMFIND LMMLIST LMMLIST Beispiel LMMOVE LMMREN LMMREP LMMSTATS LMMSTATS Beispiel LMOPEN LMPUT MEMLIST MEMLIST Beispiel LMDLIST Variablen Tabelle
26, 35,147 150 349 355 351,370 350,364 351,376 380 376 378, 383 379 225,354 350, 360 225,352 359 351,366 373 374 350, 356 351,371 372 351,366 351,366 350,358 225,351,367 368 354 350, 361 351,380 380 382 383
MEMBER
61
121,476,480 27
MEMLIST
449
Merksätze Benutzung PDS/PDSE Code & HILITE EXCLUDED Zeilen Makro Programmierung PF Tastenbenutzung Workplace Panel zu Edit Profilen zu Table Display Panels zum DO Befehl zum Thema DSLISTen
31 150 161 484 75 131 146 431 236 120
Messages Ausgabe strukturieren Beispiel Definition Member ISRZ00 DISPLAY... ISPF Fehlerrückgabe ISPFLOG ISRZ000 ISRZ001 ISRZ002 ISRZ003 Member definieren Membernamen MSGTEST Rahmen verschieben SETMSG SETMSG MSG(TT004) Standard Member ISRZ00 TBDISPL ZERRLM ZERRSM
412 405 404 401 402 401 408 408 408 409 406 404 406 407 401,403 406 407 401 402 402
MOVE
155
MSG ISRZOOl
337
MVS
572 LPAR MVS/QuickRef
Index 39 23, 76
mvsvar
51
Namenskonventionen der Dateien
25
Navigationshilfen im Buch
3
NOTELINES
527
NOWRITE
439
NUMERIC DIGITS
244, 387
POP Up Panel Sections SELECT Service Standard Panel Struktur Table Display TBDISPL Service Typen Verarbeitung WINDOW Z Variablen
415 417 429 415 62 430 429 415 427 420 425
NUMERIC FUZZ
245
Object Name
123
PARM
16
PARSE
246
PARSE VAR
251
PARSE Varianten
247
Online Help Facility Organisation des Inhalts OUTTRAP
2 317
320
Partitioned Data Set
27
Panel Kommunikation anpassen Sitzungsparameter
58 58
Partitioned Data Set Extended
27
Partitioned Data Sets
27
Panel display CUA mode
61
PASTE AFTER label BEFORE label clipboardname DELETE Einstellungen KEEP
Panel ID Panels )ATTR )ATTR DEFAULT )ATTR Section )BODY )BODY Section )END )INIT )INIT Section Beispiel )INIT Sektion )MODEL )PROC )PROC Section )REINIT Attribut Optionen Beispiel POP Up Panel Beispiel Standard Panel DTL EXPAND Felder im Panel Grundstruktur HELP HELP Panel LASTED LASTED3 LASTEDI Merksätze
417 417 418 418 417 420 417 417 421 420 417 417 421 417 419 427 427 413 420 416 417 63,429 415 430, 508 504 508 431
,
PASTE name PCS PCS Bildschirme PDF PDS DSORG LRECL RECFM PDSE anlegen Beispiel Merksätze Nachteile Vorteile
180 180 180 180 181 180 183 35, 57 37 50, 456 27,31,35, 126 28 28 28 29, 30,35, 53 317 30 31 30 30
PDSFAST
27
PDSREST Lade Job
511 513
Personal Data Set Lists
111
Personal Data Set Lists Panel
93
Index
573
PF1 Taste 16, 167, 186, 196, 338, 407, 409, 4 2 1 , 4 2 9 , 4 4 4 , 445, 508, 534 PF 10/11 Tasten
17, 98, 99
PF 11 Taste
108, 186, 369
PF12 Taste
41, 173
PF 14 Taste
519
# # Makro
519
A D D R E S S Besonderheiten
225
A L T L I B unter ISPF
344
beim Call Aufruf C M D S M O D Bedienung
233 87
Concatenated Data Sets D A T A T Y P E Test DATE Konvertierungen
32 283 271
PF 15 Taste
66
PF 16 Taste
76
Datenablage in R E X X DO WHILE und DO UNTIL
244 236
PF 19 Taste
102
Erkennen R E X X Programm
208
PF2 Taste PF23 Taste
66, 67 541
PF3 Taste63, 67, 70, 74, 86, 124, 126, 130, 135, 136, 143, 149, 374, 425, 427, 451, 478, 501,505 PF4 Taste
425, 526
PF6 Taste
137
PF7/8 Tasten
113,431
PF9 Taste
66, 67
PFSHOW
70,71
Plattentypen 3390-3
32
3390-9
32
Präfixe von Kommentarzeilen Praktiker
500 2
Primary Command
16
Primary Option Menu
64
Produktionsebene
53
Profile Pool Program Function Keys
453, 454 4
EXECIO
313
Host IF in ISPF ISPF
223 422 66 404
Command Environment Panel Definitionen Ebenen Message Member
ISPF Tabellen schreiben LMINIT
440 353
Message Ausgabe P A R S E Befehl P A R S E Restzeichen Picture Strings PROCEDURE Option SELECT Selection Panels
407 247 248 159 254 260 429
S T E M Index Null Texte zuweisen in R E X X Variablen in Paneldefinitionen Variablen in R E X X Zuweisung des Datentyps
219 213 425 212 213
REGION
320
REMPOP
428
REPLACE
155
RESET
155
Programmiersprachen im ISPF
325
Resource Access Control Facility (RACF).. 26
Programmnamen ermitteln
252
Return Kode bei ISPF Batch
QBASELIB QLIBDEF
344, 393 396
Querverweise
3
QUERYENQ
397, 400, 485
QUEUE RACF RefList REFRESH Regeln
256 26 92, 112 120
238
REXX Allgemeine Funktionen ALTLIB Arithmetische Funktionen Arithmetische Operatoren Befehle
268 209 279 214 221
Binäre Literale BLANKS CHAR Datentyp Compiler Prozeduren Datenkonvertierungen Datentypen
211 213 212 209 284 212
574
Index
Einführung EXECIO EXECUTIL Externe Befehle Formatierungsfunktionen Formel für Julian Day Fortsetzungszeilen Hex Literale im ISPF ausfuhren im TSO ausfuhren ISPEXEC Präfix ISREDIT Präfix Kommentare Konvertierungsfunktionen Leerzeilen Logische Operatoren Namensdefinition NetREXX Nullstring in STEMs Nullstrings NUM Datentyp Object REXX Operatoren Parameter übergeben Performance PROCEDURE EXPOSE Programm erkennen Schaltjahr berechnen Stems 216,218,219, Stringfunktionen Stringoperatoren Syntax SYSEXEC SYSPROC Systemfunktionen Text Literale TSO ALLOC TSO Data Stack TSO FREE Variablendefinition Variableninhalt Vergleich exakt Vergleich normal Vergleichsergebnis Vergleichsoperatoren Verkettung Wortfunktionen ZISPFRC setzen REXX Befehle ADDRESS
205 219 209 224 290 216 211 211 209 208 225 225 211 284 211 216 207 206 218 213 212 206 213 230 210 254 208 238 220 293 214 210 209 209 307 211 219 255 219 212 212 215 215 215 215 213 304 238
221, 328
ARG CALL DO DO Merksätze EXECIO EXIT IF INTERPRET NOP NUMERIC PARSE ARG PARSE SOURCE PARSE VALUE PARSE VALUE ... WITH PARSE VAR PROCEDURE PROCEDURE EXPOSE PULL QUEUE SAY SELECT SIGNAL SUBMIT TRACE REXX Funktionen ABS ADDRESS ARG C2D C2X CENTER CHANGE COMPARE COPIES D2C D2X DATATYPE DATE DELSTR DIGITS FORMAT FUZZ INSERT JUSTIFY LEFT LENGTH MAX MIN MSG OUTTRAP
228 233 234 236 255 237 238 239 263 244 228, 248 251 228 248 251 253 228 255, 263 254 260 260 265 255 264 279 268 268 285 286 290 295 281 290 286 287 282 269 294 279 291 279 294 292 292 297 280 280 307 308
575
Index OVERLAY POS QUEUED RANDOM RIGHT SIGN SOURCELINE STORAGE STRIP SUBSTR SYSVAR TIME TRANSLATE USERID VALUE VERIFY WORD WORDINDEX WORDLENGTH WORDPOS WORDS X2B X2C
297 298 276 280 293 281 276 311 299 300 311 275 300 277 277 301 304 305 305 305 306 288 288
REXX im ISPF
325
REXXCOMP
524
SAVELIST Schlüsselwortparameter übergeben übernehmen Screen Splitting SCRNAME SDSF Primary Option Menu
Sequential Data Set SETMSG SETUNDO STG Shared Pool
66
Split Screen Modus
66
SRCHFOR
121,464, 526
SSP ANELI
328
Standard ISPF Profile Pool
458
START
65, 66
Strukturieren großer Zahlen
291
STUB EFPL
524
Super Search
526
SWAP SWAP LIST
66 66, 429, 448,456
SWAP NEXT
66, 67
SYS1.PROCLIB
45 47,319
SYSNAME
51 47,319
System Profile Pool
458
SYSTSIN
319
66
SYSTSPRT
260,319, 509
116,429
SYSVAR SYSENV SYSISPF
409 224,311 311,321
77,416
Sequential Concatenated Data Sets
Split Screen Indication Line
SYSPROC
181
SELECT
65
230 231
21 21
SJ Command
411
SPLIT NEW
88
7
433 434 437 437 434 434
SOURCELINE
SYSEXEC
231
SCLM
Befehle Beispiel ISPFILE zuordnen Member ausgeben verarbeiten Werte zuweisen
195 31, 126
211,337,403 153 453, 454
Short Messages
417
Skeletons Anwendung aufrufen
433 436 437
Tab to action bar choices Tab to point-and-shoot
61 fields
61
Tabellenverzeichnis
557
Tables Befehle für die ganze Tabelle Befehle für die Tabellenverarbeitung Programm LASTED
441 441 445
TASID TB ADD TBBOTTOM TBCLOSE
197, 202 441 441, 447 439, 441,442
576
Index
TBCREATE
431,441,442
TBDELETE
441,447
TBDISPL
416, 429, 431, 448
TB END
441
TBERASE
441
TBEXIST
441
TBGET
441
TBMOD
441,442
TBOPEN
439, 441,447
TBPUT TBQUERY
441 400,441,447
TBSARG
441
TBSAVE
441
TBSCAN
441
TBSKIP
441,447
TBSORT
441, 442
TB STATS TBTBADD TBTOP TBVCLEAR Testebene Teuffel, Michael TIME Formattabelle Time Sharing Option Tipp #EDSS Makro $DOC herunter laden abschließender QUEUE ALTLIB DISPLAY QUIET BLKSIZE für ISPPROF Command Delimiter Confirm Member Delete Data Stack leeren DSLIST Commands DSN strippen Einfügen bei kleiner Schrift Eingabe bei Funktion DATEALL Empfehlung zu DSLISTen EXCLUDED Lines File Tailoring Anwendung HILITE Dialog Hinweise zu Tipp
441 442 441,447 441 53 2, 16 46 275 2 102 489 259 348 50 62 110 263 98 299 178 547 121 161 436 148 4
Include Additional Qualifiers 96, 118 ISPEXEC und ISREDIT benutzen 226 ISPF aufrufen 488 ISPF und TSO im Internet 486 ISPPROF Member 50 Kette von Dateien 34 KEYLIST ON/OFF 72 Line Commands in MEMLIST 382 LISTDSI Reason Codes 393 LMGREAD als Ausgabeprogramm 551 LMMREP benutzen 359 LMMREP statt LMMADD 370 Logon Panel 44 Makro Aufzeichnung 476 Makro Parameter 481 Message Feld verschieben 407 MSG Text strukturieren 412 Nichtdarstellbare Zeichen 159 NUMERIC FUZZ 246 optimale Compiler Prozedur 533 Optimaler Bildschirm 59 Optimales Werkzeug 196 Originalliteratur 24 PDSE in mehreren LPARs 502 PF Taste für #SPLJ Makro 526 PF15 Taste mit SWAP LIST 69 PF9 mit SWAP NEXT 67 POP Up Panel verschieben 428 Programm in mehreren Dateien 506 Prüfung END Statements 149 Rechnen in IF Befehlen 283 Rechnen mit großen Zahlen 387 Recovery Data Set 152 Reset BNDS 170 REXX Programme beschleunigen 210 Schreiben von EDIT Makros 464 Select Sequenz 263 Show status 109 Split Screen reparieren 66 Super Utility CR 534 SYSPROC, SYSEXEC 192 TSO Delete Besonderheiten 530 Unterschiede PDS/PDSE 31 224 Variable in ADDRESS Variable laden 518 Variablenzugriff in Profile Pools 458 Vorteil der Workplace 124 TN3270A.WS
37
TPX
39
577
Index Auswahlmenü automatisches LOGON Autostart einstellen Befehle Befehle absetzen Befehlspräfix Befehlstaste Benutzerverwaltung Eingabe-Panel PF12 Taste Steuerung Steuerzeichen
39 43 44 42 41 42 42 41 39 41 40 41
TRANS
423
TSO ALLOC BATCH Batch Job Beispiel Data Stack DYNAMNBR EXECIO FREE ISRDDN LOGON Ablauf. LOGON Job Logon Panel LOGON Panel LOGON Prozedur starten TIME
336 319 320 255 46 336 336 186 46 45 45 44 45 44 46
TSO/E REXX Commands ALTLIB DELSTACK DROPBUF EXECIO EXECUTIL
342 316 316 313 317
UNDO URL IBMs Terminology ISPF Literatur von IBM ISPF Utilities der IBM LOOKATbei IBM MVS Utilities MVS/QuickRef. NETREXX REXX bei IBM REXX Utilities REXXLA User Commands
520, 529 34 9 486 19 486 22 207 206 486 206 79
User Profile Library userid
50 51
VARDAT
516
Variables aktive Profile allgemeine Function Pool Pools Profile Member Profile Member erstellen Profile Pool Shared Pool Verarbeiten VERASE VGET VPUT ZAPPLID ZDATE ZDAY ZDAYOFWK ZJ4DATE ZJDATE ZTIME Z-Variable
456 459 454 453 455 456 454 454 460 460 460 460 334 334 334 334 335 335 335 461
Verarbeitungsstruktur
14
VERASE
460
VGET
460
VIEW Beschreibung VOLSER Volume Serial Vorkenntnisse VPUT
133 35, 124 124 2 460
VSAM Dateien
31
VTAM Anmeldename
57
VTOC Workplace Action Commands Actions Aufruf Aufruf über Command Table Bedienung Beispiele Bemerkungen Objekte Panel
124 123,124 126, 127 125 123 125 125 128 131 125 124
578
Index
XCURSOR
541
ZERRLM
404,409,411
XXXCMDS
85
ZERRSM
404
6
ZERRTP
404
z/OS Collection ZEDLMSG
211,337, 404,409,411
ZEDSMSG
337,404
Ziel dieses Buches ZISPFRC
V 238,411
Zeitmessung mit TIME
275
ZSCRMAX
ZERRALRM
404
ZSCRNAME
448
66
ZERRHM
404
ZTDSELS
448