275 88 57MB
German Pages 319 [313] Year 2005
REXX Grundlagen für die z/OS Praxis von
Johann
Deuring
Oldenbourg Verlag München Wien
Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Internet
Nationalbibliografie; detaillierte bibliografische Daten sind im über abrufbar.
© 2005 Oldenbourg Wissenschaftsverlag GmbH Rosenheimer Straße 145, D-81671 München Telefon: (089)45051-0
www.oldenbourg.de Das Werk einschließlich aller Abbildungen ist urheberrechtlich geschützt. Jede Verwertung außerhalb der Grenzen des Urheberrechtsgesetzes ist ohne Zustimmung des Verlages unzulässig und strafbar. Das gilt insbesondere für Vervielfältigungen, Übersetzungen, Mikroverfilmungen und die Einspeicherung und Bearbeitung in elektronischen Systemen.
Lektorat:
Stephanie Schumacher-Gebler 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-20025-9
Inhalt 1.1
' Einleitung Ziel des Buchs.1
1.2
Feedback erwünscht.1
1.3
Verwendete
2
5 Einführung in REXX Entstehung und Verbreitung von REXX.5 Verwendung.5 Einsatzgebiete.6 Wer programmiert in REXX?.7
1
2.1 2.2 2.2.1 2.2.2 3 3.1
3.2 3.2.1 3.2.2 3.2.3 3.2.4 3.2.5 4 4.1 4.2 4.2.1 4.2.2 4.2.3 4.2.4
Syntax-Notationen.2
9 Sprachaufbau Formatfreiheit.10
Bestandteile einer REXX-Exec.10
Token-Klassen.11
String.12 Symbole, Variablen, Zahlen.13 Arten
von
Clauses.17
Expression.19 21 Speicherung und Aufruf Speicherung eines REXX-Programms.22 Aufruf eines REXX-Programms.23 Expliziter Aufruf.23 Impliziter Aufruf.25 Die Bibliotheksverkettung beim TSO-Logon.27 REXX-Exec-Ausfuhrung im Batch (Background).29
5.1
31 Dialog SAY.31
5.2
PARSE
5
Erster
EXTERNAL.32
VI
Inhalt
5.3
5.4
DROP.33 EXIT.35
6
PARSE
6.1
Zerlegbare Speicherbereiche.38
6.2 6.2.1 6.2.2 6.2.3 6.2.4 6.2.5 6.2.6 6.2.7 6.2.8
Template.41 Zerlegen nach Wörtern (Blank-Zerlegung).42 Zerlegen nach Argumenten (Komma-Zerlegung).44
7
Programmablauf verfolgen
7.1
TRACE.51
7.2
TRACE-Aktivierung durch den Benutzer.53
7.3
TRACE Output.54
8
Arithmetik, Vergleiche, Logik, Verkettungen
8.1 8.1.1 8.1.2 8.1.3
Arithmetik.57
8.2 8.2.1 8.2.2 8.2.3
Vergleiche.62 Vergleichsoperatoren für Standard-Vergleiche.62 NUMERIC FUZZ.66
8.3
Logik (Boole'sche Algebra).68
8.4
Verkettungen.70
8.5
Gemischte Ausdrücke.71
9
Programmsteuerung
9.1 9.1.1 9.1.2
Verzweigungen.73
37
Das
Zerlegen nach Trennzeichen.45 Zerlegen nach Komma (als Argument und Trennzeichen).46 Zerlegen nach Spalten mit absoluten Angaben.47 Zerlegen nach Spalten mit relativen Angaben (Offset).48
Trennzeichen in Variablen.49
Kombinationen.49 51
57
Arithmetische Operatoren.57 NUMERIC DIGITS.59 NUMERIC FORM.60
Vergleichsoperatoren für Exakt-Vergleiche.64
73
9.2
IF.73 SELECT.75 SIGNAL.77
9.3 9.3.1
DO-Gruppen und -Schleifen.79 Simple DO Group.81
VII
Inhalt 9.3.2 9.3.3 9.3.4 9.3.5 9.3.6 9.3.7 9.3.8 9.3.9
Simple Repetitive DO Loop.83 Repetitive Loop (Iteration).85 LEAVE.89 ITERATE.90
Controlled
Conditional Loop mit DO WHILE.91 Conditional Loop mit DO UNTIL.92 DO FOREVER.93
Loop-Mischformen.94
95 Unterprogramme 10.1 Subroutines.95 10.1.1 CALL.95 10.1.2 RETURN und RESULT.98 10.2 Functions.100 Interne Routinen.102 10.3 Externe Routinen.102 10.4
10
10.5
10.6 10.6.1 10.6.2 10.6.3 10.6.4 10.6.5 10.6.6 10.6.7 10.6.8
10.7 10.7.1 10.7.2 10.7.3 10.7.4 10.7.5 10.7.6 10.7.7 10.7.8 10.7.9 10.7.10 10.7.11
10.7.12 10.7.13 10.7.14 10.7.15
Variablentransparenz.102 Das Merken der Programmeinstellungen beim Upro-Aufruf.106
Status von DO-Schleifen und anderen Strukturen.106
TRACE-Status.106
NUMERIC-Einstellungen.106 ADDRESS-Einstellungen.107 Condition Traps.107 Zeitmessungen mit TIME('R') und TIME('E').107 OPTIONS-Einstellungen.107 Schachtelungstiefe von Unterroutinen.107 Builtin Functions.108
ABBREV.108 ABS.109 ADDRESS.110 ARG.111 BITAND.113 BITOR.114 BITXOR.115 B2X.116 CENTER.117 COMPARE.118 CONDITION.119 COPIES. 121 C2D.122 C2X.124 DATATYPE.125
VIII
Inhalt
10.7.16 DATE.127 10.7.17 DBCS-Builtin Functions.131 10.7.18 DELSTR.133 10.7.19 DELWORD.134 10.7.20 DIGITS.136 10.7.21 D2C.136 10.7.22 D2X.138 10.7.23 ERRORTEXT.139 10.7.24 EXTERNALS.140 10.7.25 FIND.140 10.7.26 FORM.141 10.7.27 FORMAT.142 10.7.28 FUZZ.145 10.7.29 GETMSG.146 10.7.30 INDEX.150 10.7.31 INSERT.152 10.7.32 JUSTIFY.154 10.7.33 LASTPOS.155 10.7.34 LEFT.156 10.7.35 LENGTH.157 10.7.36 LINESIZE.158 10.7.37 LISTDSI.159 10.7.38 MAX.170 10.7.39 MIN.171 10.7.40 MSG.172 10.7.41 MVSVAR.173 10.7.42 OUTTRAP.176 10.7.43 OVERLAY.180 10.7.44 POS.181 10.7.45 PROMPT.183 10.7.46 QUEUED.184 10.7.47 RANDOM.185 10.7.48 REVERSE.187 10.7.49 RIGHT.188 10.7.50 SETLANG.189 10.7.51 SIGN.191 10.7.52 SOURCELINE.192 10.7.53 SPACE.193 10.7.54 STORAGE.194 10.7.55 STRIP.197 10.7.56 SUBSTR.199 10.7.57 SUBWORD.200 10.7.58 SYMBOL.201 10.7.59 SYSCPUS.202 10.7.60 SYSDSN.203
_IX
Inhalt
10.7.61 10.7.62 10.7.63 10.7.64 10.7.65 10.7.66 10.7.67 10.7.68 10.7.69
SYSVAR.205 TIME.209 TRACE.211 TRANSLATE.212 TRUNC.213 USERID.214 VALUE.215 VERIFY.216 WORD.217
10.7.70 10.7.71 10.7.72 10.7.73 10.7.74 10.7.75 10.7.76
WORDINDEX.219 WORDLENGTH.220 WORDPOS.221 WORDS.222 XRANGE.223 X2B.224 X2D.225
10.8
Suchfolge beim Aufruf von Unterroutinen.227
11
TSO/E
Commands & Utilities
229
-
11.1 11.2
11.2.1
Command-Übersicht.229 Häufig verwendete TSO-Commands.231 EXECUTIL.231
11.3
PROFILE.232
11.4
ALLOC.232
11.5
ALLOC und FREE.233
11.6
ALTLIB.234
11.7
11.9
DELETE-/DEFINE-Cluster.234 LISTC.234 LISTDS.235
11.10
REPRO.235
11.11
IEBGENER.235
11.12
SMCOPY.236
11.13
SUBMIT.236
11.14
PERMIT.236
11.15
TRANSMIT.237
11.16
RECEIVE.237
11.17
SEND.237
11.8
Inhalt
X
239
12
ISPF-Panels
12.1
Äußerer Aufbau.239
12.2
Panel
Ein
Coding
Beispiel.240
-
12.4
Aufbau.241 Panel-Aufruf aus einer REXX-Exec.243
13
SUBCOM
245
14
Stack-Verarbeitung
247
14.1
QUEUE.247
14.2
PUSH.248 LIFO und FIFO.248 PARSE PULL.249 MAKEBUF.250 DROPBUF.251
12.3
14.3 14.4 14.5 14.6
Innerer
14.8
QBUF.252 QELEM.253
14.9
NEWSTACK.254
14.10
QSTACK.255
14.11
DELSTACK.256
15
Dateiverarbeitung mit EXECIO
15.1
Allgemeines.258
15.2 15.2.1 15.2.2 15.2.3 15.2.4
Massenlesen in den Stack.259 Massenlesen in Compound-Variablen.260 Einzellesen in eine Variable.261 Einzellesen in den Stack.262
14.7
15.3 15.3.1 15.3.2 15.3.3 15.3.4 15.3.5 15.3.6
257
DI SKR.258
DISKW.262 Massenschreiben Massenschreiben
aus
dem Data Stack.263
von
Compound-Variablen.264
Massenschreiben auf neue PS-Datei.265 Einzelschreiben auf Member einer neuen PO-Datei.267 Rewrite mit DISKRU + DISKW.268 Sonderfall: Partielles Lesen.268
Inhalt
XI
16
INTERPRET
269
17
Anhang
271
17.1
EBCDIC Code-Tabelle.271
17.2
Wurzel-Routine.280
17.3
Literaturverzeichnis/Verwandte Publikationen.282
17.4
z/Series- und z/OS-Abkürzungsverzeichnis.283
18
Stichwortverzeichnis
303
1
Einleitung
Li
Ziel des Buchs
Mit diesem Buch über REXX habe ich mir die Aufgabe gestellt, ein lehrbegleitendes Buch für all diejenigen zu schreiben, die sich im Studium, Selbststudium oder im Rahmen eines Seminars in die Programmierwelt der IBM-Großrechner vortasten. Sie können das erworbene Wissen anschließend im Rechenzentrum, der Produktionssteuerung, der klassischen Anwendungsentwicklung, aber auch in der Internetprogrammierung und nicht zuletzt in der Systemprogrammierung einsetzen. Darüber hinaus ist dieses Buch als arbeitsbegleitendes Werk für Praktiker gedacht. Die vielen Beispiele sollen zum einen die Theorie verständlich machen, zum anderen Anregung für viele neue Anwendungen sein.
1.2
Feedback erwünscht
Wenn Ihnen beim Lesen Fehler oder Ungenauigkeiten auffallen, wenn Sie Verbesserungsund Erweiterungsvorschläge haben, aber auch wenn Ihnen das Buch einfach gefällt, dann schreiben Sie ihre Bemerkungen einfach an [email protected].
1
2
Verwendete
1.3
Syntax-Notationen
Erklärung der verwendeten Syntax (1)
Statement-Beginn: »-
Statement wird
fortgesetzt in der nächsten Zeile:
>
Beginn der Fortsetzungszeile: -
Statement-Ende:
Muss- Angaben erscheinen auf dem
Hauptstrang:
>-STATEMENT -Muss-Angabe -
Kann-Angaben erscheinen unterhalb des Hauptstrangs >-STATEMENT
-,-
-Kann-Angabe
3
Muss-Auswahl bei 2 oder mehr Möglichkeiten: >-STATEMENT -rMuss-Angabel
.Muss-Angabe2 Kann-Auswahl bei 2 oder mehr Möglichkeiten: >-STATEMENT -
-Kann-Angabel -Kann-Angabe 2
Einleitung
1.3 Verwendete
Syntax-Notationen
3
Erklärung der verwendeten Syntax (2) Angabe über dem Hauptstrang ist Default-Wert
pDefault-Angabe STATEMENT
Kann-Angabe1
LKann-Angabe2 Wiederholbare Angabe -STATEMENT
Wiederhol-Angabe
Statement-Fragment-Einleitung: -| Stmt Fragment
-STATEMENT
-
Statement-Fragment-Beschreibung Schlüsselwörter sind in Großbuchstaben, variable Angaben, die der Programmiewählen kann, in Kleinbuchstaben geschrieben. Die Angabe expr erlaubt den Einsatz einer Expression (siehe Definition). Sonderzeichen (z.B. Klammern und Kommata) müssen als Teil der Syntax anrer
gegeben werden:
-MIN
(
i
expr
2
Einführung in REXX
2.1
Entstehung und Verbreitung von REXX
Am 20. März 2004 feierte die Computersprache REXX (Restructured Extended Executor Language), die von Mike Cowlishaw in den IBM-Laboratories in England entwickelt wurde, ihr 25-jähriges Jubiläum. Mitte der 80er Jahre wurde REXX von IBM auf dem MVS-Markt als Alternative zur Sprache CLIST (Command List) angeboten. MVS (Multiple Virtual Storage) war damals das mächtigste, kommerziell genutzte Betriebssystem der IBM, gebaut für die Verwaltung der ganz großen Unternehmen und Behörden. Dieses Betriebssystem wurde Ende der 90er Jahre von OS/390 (OS/390 Open System der Generation 390) abgelöst, welches janusköpfig sowohl die bisherige MVS-Architektur fortführte als auch ein UNIX-Derivat mit dem Namen USS (UNIX System Services) besaß. Als die IBM im Jahr 2002 die Architektur wechselte und das 31-Bit-basierte OS/390 mit dem 64-BitBetriebssystem z/OS ersetzte, war REXX auf IBMs Big Servern längst etabliert. =
-
2.2
-
Verwendung
Einsatz von Rexx-Prozeduren unter z/OS
2
6
2.2.1
Einführung in REXX
Einsatzgebiete
REXX
gehört systematisch zu den Sprachen der 4. Generation, basiert auf der strukturierten Programmierung und wurde zunächst als plattformunabhängige, nicht-kompilierbare Interpreter-Sprache im Rahmen der IBM-SAA (System Application Architecture) entwickelt. Mittlerweile gibt es auch REXX-Compiler. Für die Anhänger objektorientierter Sprachen am PC bietet IBM seit Mitte der 90er Jahre ObjectREXX an. Der Einsatzschwerpunkt unter dem MVS der 80er Jahre lag von Anfang an auf dem TSO/E (Time Sharing Option/Extended) und dem ISPF (Interactive System Productivity Facility), das als menügesteuerte Full-Screen-Oberfläche mit seinem mächtigen Editor und den vielen Utilities das TSO überhaupt erst vernünftig bedienbar macht. REXX-Routinen dienen hier als Command Procedures der Anpassung des TSO/E und des ISPF an die Firmenbedürfnisse. Gerade die DMS (Dialog Management Services) des ISPF sowie SCLM (Software Configuration and Library Management) basieren auf REXX-Routinen und tauschen mit ihnen ihre Variablen aus. Im ISPF-Editor werden in REXX geschriebene Programme als Edit-Makros eingesetzt. Die alte und wegen ihrer mangelnden String- und Arithmetikelemente leistungsschwächere CLIST, ist heute, obwohl im TSO als zweiter Interpreter aktiv, keine ernstzunehmende Alternative mehr. REXX dient den
IT-Spezialisten nicht ausschließlich unter IKJEFT01 (Programmname des REXX-Routinen lassen sich im Batch auch unter dem Programm IRXJCL (Name des TSO). REXX-Interpreters) ausführen, unterliegen dann allerdings der Einschränkung, keine TSOund ISPF-Befehle benutzen zu können. Um den Datenbankzugriff zu DB2 (DB2=Database 2) zu gewährleisten, hat IBM die Schnittstelle DSNREXX eingerichtet. Bis auf ganz wenige Ausnahmen sind damit sämtliche SQLStatements für DB2 möglich.
Kommunikationsüberwachung setzen die IT-Spezialisten REXX-Routinen von NETVIEW ein. Sogar für das CICS (Customer Information Control System) können Transaktionen in REXX geschrieben werden. REXX wird nicht nur unter z/OS-TSO, sondern auch unter z/OS-USS interpretiert und dient hier als UNIX-Shell-Script-Sprache der Ablaufoptimierung und Erstellung maßgeschneiderter Anwendungen des Rechenzentrums und der IT-Entwicklungsabteilungen. Damit kann jede Firma ihren Großrechner-Script-Standard bei REXX belassen und muss nicht auch noch PERL oder andere UNIX-Script-Sprachen neu hinzunehmen. Setzt man in einer REXXIm Bereich der
zur
Optimierung
Routine UNIX-Commands wie CP, einen FTP-Aufruf oder MVS-Commands wie OCOPY ein, dann dienen sie als „Mixed Application" dem Austausch von Informationen über die Betriebssystem-Plattformen hinweg.
Interessant für Programmierer ist es, REXX-Routinen als CGI-Scripts (Common Gateway Interface) im Internet oder Intranet unter IBMs http-Server einzusetzen. Bei einer extrem hohen Entwicklungsgeschwindigkeit und mit direktem Zugriff auf die DB2-Datenbanken des Hosts lassen sich Erfassungs- und Ausgabemasken, Formulare genannt, in HTML unter Einsatz von CSS (Cascading Style Sheet) erstellen. Diese Technik erlaubt es, große Teile des
2.2
7
Verwendung
bisherigen CICS-, TSO- und ISPF- Geschäfts ins Intranet zu verlagern. Jedoch müssen dann von Anfang an die im Großrechnerbereich besonders hohen Sicherheitsansprüche berücksichtigt werden.
Wer programmiert in REXX?
2.2.2 Von der
Arbeitsvorbereitung über die Anwendungsentwicklung bis hin zur Systemprogrammierung ist REXX das Werkzeug für IT-Personal, um TSO-, UNIX-Shell-Scripts und ITinterne Verwaltungsanwendungen zu schreiben. Aber auch für kleinere und mittlere Großrechneranwendungen ist die leicht erlernbare Sprache ideal gerade in Verbindung mit den Dialog Management Services des ISPF. Auf Windows-Plattformen kommen alle objektorientierten Programmierer auf ihre Kosten mit ObjectREXX. Ein riesiges Potential tut sich bei der Internet-/Intranet-Programmierung auf. Wer den ressourcenaufwändigen Informationsfluss über das „3-tiered" Kaskadensystem z/OS-DatabaseServer Unix-Application-Server PC-Client vermeiden möchte, findet mit REXX-CGIScripts in Verbindung mit HTML und CSS eine schnelle und kostengünstige Alternative, weil hier die Application-Server-Plattform eingespart wird. Insoweit rentiert es sich für In-
-
-
terneWIntranet-Entwickler, einen Blick über den Großrechnerzaun zu werfen.
Sprachaufbau
3 Beispiel: ©I /*
Schleife mit Zeilendialog und
Upro-Aufruf als Funktion Beginn Hauptprogramm*/
REXX
say 'Hallo,
lieber' useridO
ich errechne den',
1 -
'3-prozentigen Provisions-Betrag 'Dir
einem von',
eingegebenen Gesamtbetrag (incl. Prov.)' /*Endlos-Schleife
do forever
©
aus
say 'Bitte
gib Gesamtbetrag
*/
oder "ENDE" ein'
parse upper external zl
/*Eingabe
if zl
/»Verlassen des Loops*/
if
=
then leave
'ENDE'
else say
upl(zl)
*/
/*wenn Eingabe numerisch,*/
datatype(zl)='NUM' then say
abholen
/*dann Ausgabe UPI-Ergebnis*/
'Wert falsch'
/*sonst Fehlermeldung*/
end
/*Schleifenende
exit
/*Ende d. Haupt-Pgms */
O
upl: procedure
/*Unterroutine UPI
©
parse arg ges
©
prov
o
return prov
Dieses
=
ges
/ 103
Programm besteht aus
*
3
*/
*/
/»Berechnen Provision */ /»Rückkehr mit Rückgabewert*/
10 Clauses der
Hauptroutine und 4 Clauses der Unterroutine.
3
10
3.1
Sprachaufbau
Formatfreiheit
Die Sprache REXX ist formatfrei. Einrückungen, Leerzeichen (Blanks) und Leerzeilen sind bis auf seltene Ausnahmen überall erlaubt. Statements und Variablennamen sind caseinsensitive, das heißt, sie können großbuchstabig, kleinbuchstabig oder gemischt geschrieben werden.
3.2
Bestandteile einer REXX-Exec
Ein REXX-Programm ist eine Ansammlung von 1-n Clauses (siehe © bis ® und O bis ©), die ihrerseits zusammengesetzt sind aus 1-n Blanks, einer Abfolge von Token, 1-n Blanks und einem Semikolon, das in den meisten Fällen weggelassen werden kann, weil es implizit durch das Zeilenende oder den Doppelpunkt eines Labels unterstellt wird. REXX-Exec REXX-Exec oder kurz Exec ist die Bezeichnung für ein REXX-Programm. Häufig spricht man auch ganz allgemein von einer REXX-Prozedur. REXX-Unterprogramme unterscheidet man je nach Art des Aufrufs in die Typen Subroutine und Function. Standardisierte Functions des Herstellers nennt man Builtin Functions.
Clause Jede REXX-Exec besteht aus 1-n Clauses (Clause Statement). Es gibt 3 Grundtypen von Leerzeile oder ganzzeiliger Comment), Labels Clauses: Null Clauses (Null Clause und Instructions. Instructions sind wiederum unterteilt in Assignments (Zu(Sprungmarke) Instructions und Commands. Eine Clause kann zusätzlich aus 1-n weisungen), Keyword Comments sowie führenden, eingebetteten und nachfolgenden Blanks bestehen. Erstreckt sich eine Clause über mehr als eine Zeile, ist als Fortsetzungszeichen das Komma zu verwenden (siehe (D). Teilen sich hingegen mehrere Clauses eine Zeile, dient als Trennzeichen der Strichpunkt. =
=
Token Eine Clause, in seine Einzelteile zerlegt, besteht aus 0 (dann Null-Clause) bis chen) sowie optionalen Comments und Blanks (Leerzeichen).
n
Token
(Zei-
Comment Ein Comment (Kommentar) besteht aus einer beliebigen Zeichenfolge, beginnend mit „/*" und endend mit „*/". Ein Kommentar in der 1. Zeile, in dem das Wort REXX vorkommt, wird REXX-Identifier genannt. Dieser „missbrauchte" Kommentar dient der Sprachidentifikation und verhindert im z/OS die Interpretation des Codings durch den CLIST-Interpreter.
1 1
3.2 Bestandteile einer REXX-Exec
Token-Klassen
3.2.1 Token teilt
man
ihrer Funktion nach in
folgende Klassen ein:
Klasse
Variante
erlaubte Zeichen
String
Literal
beliebige CharcterZeichen, eingekleidet in
String
Beispiel
0-n
Hochkommata oder Gänsefüßchen
Hex
String
Number
'Abc 1' "Abc 1"
0-9 und A-F und Kombinationen daraus, eingekleidet in' oder", gefolgt von einem x/X
Binary String Binärziffern (0, 1) in Gruppen von 4 (Nibble) oder 8 (Byte), einge-
Symbol
(Null-String)
''
'
01 'x
"C1828340F1"X
"l"b '
00000001'B
kleidet in ' oder ", gefolgt von einem b/B
'1100 0001'B
Variable
A-Z
Pnr
Label
@#$e\!2?
Integer
0-9 und die Vorz.
a-z
0-9
=
Tab.i.j
call UPRO#01 17
+ -
Dezimalzahl
Dezimalpunkt.
negative Zahl Exponentiale
Blank nach
3.4
erlaubt
+
-135.020
-
E und die Vorz.
1.2E+3
+ -
Operator
Arithmetik
Vergleich
a =
= o
\=
=
if
b
+
x
"dl" ("ml")
'
"
1RZ.P.DATA(PERS01)
Expressions. Ein
häufig
auftretender Begriff in der REXX-Syntax ist die „Expression". Eine Expression (Ausdruck) umfasst 1-n Token. Expressions findet man häufig als Bestandteile von Keyword Instructions, als Teil eines Assignments rechts vom Gleichheitszeichen, manchmal aber auch als ganze Commands.
Beispiel: Keyword Instruction
I
say 'Heute ist der1 date(1E1)
Beispiel: Assignment a
=
b
=
c
=
17 4
(a
+
b)/3
/* Ergebnis:
7
*/
3
20
Sprachaufbau
Beispiel: TSO-Command cmd "DELETE" datei "'RZ.TEST.DATA'" cmd datei =
=
/*
DELETE
1RZ.TEST.DATA'*/
Expressions können Sie schachteln: UHRZEIT
=
substr(time('N'),7,2)
/*10:28:59 ->
59
*/
Beispiel ist die Builtin Function time(...) die Expression, deren Resultat von der Function substr(...) ab Stelle 7 in Länge 2 ermittelt und nach UHRZEIT übertragen wird: In UHRZEIT steht anschließend die Sekundenangabe. In diesem
4
Speicherung und Aufruf
P108
ISPF TSC)
REXX
Interpreter
4
22
Speicherung und Aufruf
Speicherung eines REXX-Programms
4.1
REXX-Programme werden im z/OS als Members in Bibliotheken (PO-Dateien) gespeichert. Die logische Satzlänge solcher Bibliotheken kann bis zu 255 Bytes sein, das Satzformat fix oder variabel geblockt (FB oder VB). In der Praxis werden meist Bibliotheken mit 80stelligen, geblockten Sätzen verwendet. Die neuere PDSE-Technik ist grundsätzlich der bisherigen PDS-Technik vorzuziehen. PO-PDSE-Bibliotheken sind nicht so störungsanfällig, ihre Directory-Größe ist unlimitiert und sie können dynamischer wachsen, als POBibliotheken. PDSE-Bibliotheken entstehen bei der Allocation durch DSN-Type-Parameter LIBRARY. Bei der Online Allocation mit ISPF 3.2 ist das Feld „Data set name type" mit dem Wert LIBRARY auszufüllen, bei der Batch Allocation verwenden Sie in der Job Control Language den DD-Statement-Parameter //
DSNTYPE=LIBRARY.
Der Dateiname (DSN) einer REXX-Bibliothek sollte immer mit dem dem Wort EXEC den, z.B.: RZ T EXEC oder Ul2 3 4 5 6 MUC PROD EXEC. .
.
en-
.
.
.
Für Dateien am z/OS gilt generell: Sie haben nicht einfach irgendeinen Namen. Zum einen sind die Restriktionen des Herstellers zu beachten: Die max. DSN-Länge beträgt 44 Stellen, spätestens nach 8 Zeichen kommt ein Punkt, die so entstehenden Namensteile (Qualifier), beginnen alphabetisch und setzen sich alphanumerisch fort. Zum anderen legen aufbau- und ablauforganisatorisch bedingte Namenskonventionen einer Firma fest, wie ein DSN heißen muss. Der First Level Qualifier (FLQ) gibt Auskunft über den/die Datei-Verantwortlichen. Das ist entweder ein RACF-User oder der Name einer RACF-Gruppe. Der Second Level Qualifier (SLQ) und weitere Qualifier stehen der Namensvergabe einer Abteilung zur freien Verfügung, während der Last Level Qualifier (LLQ) bei Programm-Bibliotheken auf deren Inhalt rückschließen lässt. Hier ein
Auszug von LLQs, die weltweit üblich sind:
LLQ
Inhalt
LLQ
Inhalt
EXEC
REXX-Prozeduren
CNTL
Job Control
PANELS
ISPF-Panels
ASM
Assembler Source
MSGS
ISPF-Messages
COB
Cobol Source
SKELS
ISPF-Skeletons
PLI
PLI-Source
TABLES
ISPF-Tables
LOAD
Gebundene Lademodule
4.2 Aufruf eines
4.2 Es
23
REXX-Programms
Aufruf eines
REXX-Programms
gibt zwei verschiedene Arten des Aufrufs von
REXX-Routinen unter TSO/1SPF: Explizit den Aufruf mit dem TSO-Command „EXEC", dagegen implizit, wenn einfach der Member-Name als Command dient. nennt
man
Expliziter Aufruf
4.2.1 Syntax »-EXEC
-pdsn
[ dsn(membe7TL
parameters
TT
-M
CLIST
I—EXEC
Beispiel Variante 1: Unconditional
1RZ.T.EXEC(HUGO)1
EXEC
EXEC
Variante 2: Conditional
EXEC
Mit Suffix: EXEC
'RZ.T.EXEC(HUGO)'
Ohne Suffix (Default: CLIST)
Region HUGO
HUGO
a=17
a=17
b=4
b=4
say '_ say a + b exit
say say
/*
REXX
'_ a
+
b
exit
ISPF
ISPF
TSO
TSO
REXX
TSO-Cmd
CLIST
Interpreter
Interpreter
Interpreter
^
REXX
TSO-Cmd
CLIST
Interpreter
Interpreter
Interpreter
4
24
Speicherung und Aufruf
Mit dem TSO-Command EXEC lassen sich CLIST- und REXX-Programme sowohl im TSO-Ready-Mode als auch in ISPF 6 (ISPF Command Shell) ausführen. Unter Voranstellung des Wortes „TSO" ist der Aufruf in jeder Panel Command Line möglich. Explizit nennt man diesen Aufruf deshalb, weil der User das zu interpretierende Objekt, sei es ein einzelner sequentieller Dataset oder ein PO-Member, ausdrücklich benennen muss.
empfiehlt sich, das Objekt immer in Hochkommata zu kleiden, z.B.: EXEC 'RZ.T.EXEC(HUGO)' EXEC Wenn Sie die Hochkommata weglassen, unterstellt TSO den TSO-Prefix als FLQ. Der TSOEs
Prefix ist bei den meisten Installationen die TSO-Userld des Aufrufers.
Bei einer angenommenen Userld „RZ01" bewirkt der Aufruf EXEC Ergebnis: EXEC 'RZ01 .T.EXEC(HUGO)' EXEC.
T(HUGO) EX folgendes
Die Erklärung liegt im Defaultverhalten: Der FLQ RZ01 wird bei allen DSN-Angaben ohne Hochkommata als DSN-Prefix generiert. Der Suffix „EX" ist die Kurzschreibweise von EXEC. Er ruft nicht nur den REXX-lnterpreter, der das Coding des Objekts ausführen soll, sondern substituiert auch den LLQ, wenn das Objekt nicht in Hochkommata gekleidet ist. Der Aufruf EXEC T(HUGO) CLIST wird folgendermaßen interpretiert:
EXEC
'RZOl.T.CLIST(HUGO)' CLIST.
Somit ist der EXEC-Suffix nicht nur ausschlaggebend für die Wahl des Interpreters, sondern auch für die Bildung des Dataset-Namens, in dem das Member HUGO zu suchen ist. Der Defaultwert ist CLIST. EXEC T(HUGO) erzeugt deshalb: EXEC 'RZOl.T.CLIST(HUGO)' CLIST. Fehlt also die Interpreterangabe, wird immer zuerst der CLIST-Interpreter bemüht. Unterstellen wir, dass es die Bibliothek „RZ01.TEST.CLIST" gibt und HUGO in der CLIST-Sprache codiert ist, so wird die Routine ausgeführt. Ist jedoch HUGO ein REXX-Programm, bringt der scheiternde CLIST-Interpreter folgende Fehlermeldung: IKJ56479I COMMAND IKJ56479I SUPPLY
.NOT FOUND OR REXX IDENTIFIER MISSING REXX */ AS THE FIRST RECORD
'/*
Um diesen Fehler zu vermeiden, codieren Sie in Zeile 1 ihres Members: /* REXX */ Daraufhin tritt der CLIST-Interpreter zurück und übergibt die Kontrolle an den REXX-
lnterpreter.
Das Gleiche geschieht, wenn Sie unter ISPF im Directory einer REXX-Bibliothek ein „EX" einem Member-Namen eingeben. Dieser „quick-and-dirty"-Aufruf erfordert im gerufenen Member zwingend einen REXX-Identifier.
vor
4.2 Aufrufeines
25
REXX-Programms
Impliziter Aufruf
4.2.2 Syntax
> —member
LTparameters
Beispiele Aufruf-Variante
Aufruf:
im TSO READY oder im ISPF Command
HUGO
Shell
(ISPF 6).
Suche
von
TSO Command Processors,
REXX- und CLIST-Members.
im TSO READY oder im ISPF Command Shell (ISPF 6).
%HUGO
Suche eingeschränkt auf REXX- und CLIST-Members.
in der Command-Line Panels.
irgendeines ISPF-
TSO %HUGO
Suche eingeschränkt auf REXX- und CLIST-Members.
in der Command-Line Panels.
irgendeines
ISPF-
TSO %HUGO 17
Suche eingeschränkt auf REXX- und CLIST-Members. mit
Parameterübergabe an die EXEC.
Ein impliziter Aufruf liegt vor, wenn Sie ein REXX-Programm so aufrufen wie ein beliebiges TSO-Command, indem Sie einfach den Member-Namen eingeben. Das kann entweder direkt unter TSO (im READY-Mode) geschehen oder in der ISPF-Command-Shell, aber auch in der Command Line jedes ISPF-Panels unter Voranstellung des Wortes TSO.
4
26
Speicherung und Aufruf
Um die vorrangige Suche nach einem gleichnamigen TSO-Command-Prozessor (TSOCommand in Lademodulform auf einer der Systembibliotheken gespeichert) zu vermeiden, setzen Sie unmittelbar vor den Member-Namen das Prozentzeichen (%).
Übergabeparameter können Sie
durch Blank vom Member-Namen getrennt mitgeben. Im Aufruf entfällt das Einkleiden der Parameter in Hochkommata. Gegensatz expliziten man im nennt Übergabeparameter REXX-Jargon „Argumente". Im Programm werden Armit der Instruction PARSE ARG gumente Keyword abgeholt und als Variablen im Function Pool gespeichert. -
-
zum
...
Dass das „richtige" REXX-Member geladen und interpretiert wird, setzt voraus, dass zuvor die entsprechende Bibliothek dem TSO-Adressraum bereitgestellt worden ist. Dies geschieht im TSO mit dem Command ALLOC: ALLOC
DD(SYSEXEC)
SHR REUSE
DSN(ISPF.EXEC 'RZ.TEST.EXEC')
Beim Aufruf wird zuerst die in der Verkettung (Concatenation) erstgenannte Bibliothek nach dem Member durchsucht, falls es nicht gefunden wird, die zweite usw. Bei gleichnamigen Members in unterschiedlichen Bibliotheken kommt nur das Member zur Ausführung, das zuerst gefunden wird.
Mit ALLOC können Sie bis zu 114 PDSE-Bibliotheken verketten. Falls bei der Verkettung alte PDS-Bibliotheken im Spiel sind, gilt folgende Sonderregel: Die Anzahl der Extents aller PDS-Dateien addiert mit der Anzahl der PDSE-Dateien darf 120 nicht übersteigen. So könnten Sie beispielsweise 7 PDS zu je 16 Extents (112 Extents) plus 8 PDSE concatenieren. Das macht deshalb 120 Extents aus, weil das Betriebssystem eine PDSE-Bibliothek so sieht, als bestünde sie aus einem einzigen Extent.' Der DD-Name SYSEXEC ist ein reservierter Name, der
zuständig
ist für REXX-Biblio-
theken, so wie der DD-Name SYSPROC der Allocation von CLISTs dient. Dass in manchen Unternehmen unter dem DD-Namen SYSPROC auch REXX-Bibliotheken neben den CLIST-Bibliotheken concateniert werden, ist auf mangelnde IT-Organisation zurückzuführen. Sprachtrennung ist so wie die Modularisierung und andere Vereinfachungstechniken die Voraussetzung für eine transparente und damit beherrschbare IT. -
1
z/OS V1R3.0 DFSMS:
Using Datasets 3.7.8.2
-
4.2 Aufruf eines
REXX-Programms
Die
4.2.3
27
Bibliotheksverkettung beim TSO-Logon
TSO-Logon-Bildschirm -TSO/E Enter LOGON
Userid Password Procedure Acct Nmbr Size Perform Command Enter
an
LOGON-
parameters below: RZ01 ******** >
> >
LOGONRZ 4712 8192
\__
===> ===>
'S1
before each
-Nomail
option desired below: -Nonitice -Reconnect
SYSl.PROCLIB(LOGONRZ) //LOGON1 PROC EXEC PGM=IKJEFT01,DYNAMNBR=250,TIME=1439, //SI PARM='EXEC '1SYS1.EXEC(STARTRZ)11 EXEC // DD DISP=SHR,DSN=RZ.TEST.LOAD //STEPLIB DD DISP=SHR,DSN=SYS1.HELP //SYSHELP DD TERM=TS //SYSIN //SYSPRINT DD TERM=TS //
SYS 1. EXEC(ST A RTRZ) "ALLOC "ALLOC
DD(SYSEXEC) SHR DD(ISPPLIB) SHR
REU REU
DSN(ISPF.EXEC 1RZ.TEST.EXEC' DSN(ISPF.PANELS RZ TEST PANELS 11, 1SYS1.PANELS ) " •
'
.
.
1
/* weitere
Allocs ISPMLIB,ISPSLIB,ISPTLIB,ISPTABL,u.a. "ALLOC DD(ISPPROF OLD REU DSN(ISPF.PROFILE "RECEIVE" / get messages */ "ISPF" */ / ISPF-Start
7 ) "
4
28
Speicherung und Aufruf
Beim TSO-Logon eines Users werden diesem die Programmbibliotheken zugeordnet, die er während seiner TSO-Sitzung benötigt. Die zu verwendenden DD-Namen dafür sind wie folgt
festgelegt:
DD-Name
für
kann/
Bibliotheks-Inhalt
muss
(kompilierte und gebundene Programme)
STEPLIB
TSO
kann
Lademodule
SYSEXEC
TSO
kann
REXX-Routinen
SYSPROC
TSO
kann
CLISTs
SYSHELP
TSO
kann
TSO
ISPPROF
ISPF
muss
ISPF-Profile
ISPPLIB
ISPF
muss
ISPF Panels
ISPMLIB
ISPF
muss
ISPF
ISPSLIB
ISPF
muss
ISPFILE
ISPF
kann
ISPF File Tailoring Output
ISPTLIB
ISPF
muss
ISPTABL
ISPF
muss
ISPLLIB
ISPF
kann
ISPF-Tabellen-Input (wird zum Lesen benutzt) ISPF-Tabellen-Output (wird zum Schreiben benutzt) ISPF-Lademodule (kompilierte und gebundene Programme)
Help
Messages ISPF File Tailoring Input (Skeletons)
Daneben werden noch andere Dateien für besondere Software.
bereitgestellt,
z.B. Arbeitsdateien oder Bibliotheken
TSO-Logon-Vorgang wird für alle TSO-User von TCAS (Terminal Control Address Space) gesteuert. Er ist es, der von RACF die benutzerspezifischen Eigenschaften (Name der Logon-Prozedur, Region Size, Accounting Info etc.) beschafft. Nachdem der User die RACF-Zugangskontrolle passiert hat, richtet TCAS einen Adressraum ein und übergibt an JES die Job Control aus der Logon-Prozedur. Diese befindet sich auf der SYS1.PROCLIB oder einer anderen JES-Prozedur-Bibliothek. Die UserlD wird (bis zum Logoff) zum Adressraum-Namen (Jobname). Mit EXEC PGM=IKJEFT01 wird das TSO geladen und führt, noch Der
bevor der Benutzer die Kontrolle über Tastatur und Bildschirm erhält, den Befehl aus, der hinter PARM=... steht. Hier kommt die Start-REXX-Exec (früher Start-CLIST) zum Einsatz. Erst diese Routine Benutzer maßgeschneiderte Zuordnung von Programm-Bibliotheken und Dateien.
ermöglicht eine auf den Die beim
Logon unter SYSEXEC verketteten Bibliotheken ermöglichen dem Benutzer den bequemen impliziten Aufruf von REXX-Routinen sowie die flexible Verteilung von Unterroutinen auf die „von speziell nach allgemein" (User- vor Group- vor Sys-DSN) verketteten Bibliotheken.
4.2 Aufruf eines
29
REXX-Programms
REXX-Exec-Ausführung im Batch (Background)
4.2.4
Die Ausführung einer REXX-Exec im Batch ist auf zwei verschiedene Arten möglich. Sie können den TSO-unabhängigen REXX-Interpreter aufrufen und diesem entweder im Wege der Aufrufparametrierung oder über SYSIN die auszuführende REXX-Exec angeben. IRXJCL + Expliziter Aufruf über PARM
RZ.REXX.CNTL(RZ56) JOB 4712,,CLASS=A,MSGCLASS=T,NOTIFY=&SYSUID //RZ1742 Aufruf HUGO + Übergabe-Argument EXEC PGM=IRXJCL, //SI '17 4' EXEC PARM='EXEC ''RZ.T.EXEC(HUGO)'' // //* //SYSTSPRT DD SYSOUT=* Bezugnahme auf MSGCLASS-Angabe DD Unbenutzt DUMMY //SYSTSIN //
Hier wird das Member HUGO aus der Bibliothek RZ.T.EXEC explizit aufgerufen und ein Übergabe-Argument ('17 4' ) ausgegeben. Die Programmausgabe erfolgt über das DDStatement SYSTSPRT (Terminal Output). Auf den alternativ möglichen Aufruf über SYSTSIN (Terminal Input) wird hier (Dummy-Angabe) verzichtet. Wegen des expliziten Aufrufs ist eine Bereitstellung der REXX-Bibliothek über SYSEXEC nicht nötig. IRXJCL
+
Expliziter und Impliziter Aufruf über SYSTSIN
RZ.REXX.CNTL(RZ59) JOB 4712,,CLASS=A,MSGCLASS=T,NOTIFY=&SYSUID //RZ1742 EXEC PGM=IRXJCL //SI DD DISP=SHR,DSN=RZ.PROD.EXEC //SYSEXEC //SYSTSPRT DD SYSOUT=* Bezugnahme auf MSGCLASS-Angabe * DD //SYSTSIN EXEC
'RZ.T.EXEC(HUGO)'
117 4'
EXEC
%HUGO 17 4
/* // und anschließend RZ.PROD.EXEC(HUGO) voraus, dass die Bibliothek, auf der sich die REXX-Exec befindet, mit dem DD-Statement SYSEXEC bereitgestellt wird. DISP=SHR besagt, dass andere Adressräume (Batch und TSO-User) parallel auf die genannte Bibliothek zugreifen dürfen, sofern sie ihrerseits mit DISP=SHR arbeiten.
RZ.T.EXEC(HUGO) explizit implizit aufgerufen. Der implizite Aufruf setzt
Hier wird zuerst
4
30
Speicherung und Aufruf
REXX-Execs unter IRXJCL dürfen keine Commands und keine External Functions verwenden, die TSO-spezifisch sind. Das schränkt die Flexibilität einer Exec unter z/OS stark ein! IKJEFT01
Expliziter Aufruf über PARM
+
RZ.REXX.CNTL(RZ94) JOB 4712,,CLASS=A,MSGCLASS=T,NOTIFY=&SYSUID //RZ1742 EXEC PGM=IKJEFT01,DYNAMNBR=250, //Sl PARM='EXEC ''RZ.T.EXEC(HUGO)11 '17 4' EXEC // DD Unbenutzt DUMMY //SYSEXEC //SYSTSPRT DD SYSOUT=* Bezugnahme auf MSGCLASS-Angabe DD DUMMY Unbenutzt //SYSTSIN //
des TSO/E und ist standardmäßig mit einem Eine REXX-Exec wird unter TSO-Batch ausgeführt, wenn REXX-Interpreter ausgestattet. SYSTSIN und SYSTSPRT an Ressourcen, die Batch üblich sind, geknüpft sind. Unter IKJEFT01 gerufene REXX-Programme können eine Vielzahl von TSO-Commands und -Functions verwenden, was den programmiertechnischen Spielraum und damit die Mächtigkeit solcher Execs erheblich ausweitet. Die JCL-Angaben, insbesondere die DD-Namen sind wie bei IRXJCL. Mit dem Parameter DYNAMNBR kann man Hauptspeicher für eine bestimmte Menge von ALLOCs, die später in REXX-Execs erfolgen, reservieren, hier für bis zu 250 ALLOCs. 1KJEFT01 ist der wahre
IKJEFT01
+
Programmname
Expliziter und Impliziter Aufruf über SYSTSIN
RZ.REXX.CNTL(RZ97) JOB 4712,,CLASS=A,MSGCLASS=T,NOTIFY=&SYSUID //RZ1742 EXEC PGM=IKJEFT01 //SI DD DISP=SHR,DSN=RZ.PROD.EXEC //SYSEXEC //SYSTSPRT DD SYSOUT=* Bezugnahme auf MSGCLASS-Angabe * DD //SYSTSIN EXEC
1RZ.T.EXEC(HUGO)'
%HUGO 17 4
/* //
'17 4'
EXEC
5
Erster Dialog
5.1
SAY
Bedeutung Ausgabe einer Bildschirmzeile. Syntax »-SAY
Default Fehlt eine
—1-1-M I—expr —I
Expression, dann Ausgabe einer Leerzeile.
Beispiele /*
REXX
*/
say 'Addition' say say 'gib 2 Zahlen ein1 parse external zl z2 zl + z2 erg =
say
'Ergebnis 'und'
z2
zl, ist' erg
von' 1
5 Erster
32
Dialog
SAY ist eine Keyword Instruction, die auf simple Weise einen Zeilen-Output am Bildschirm ermöglicht. Bei IBM-3270-Terminals erzeugt jeder SAY eine Ausgabezeile. Dabei wird die als SAY-Parameter anzugebende Expression zuerst aufgelöst und dann ausgegeben. Falls Sie REXX als CGI-Scriptsprache unter dem z/OS http-Server verwenden, geben Sie hinter SAY HTML-Tags zusammen mit Daten aus und erzeugen auf diese Weise sehr bequem und schnell Web-Seiten und Web-Dialoge.
Beispiel: satz
SAY für
HTML-Ausgabe
'Hallo das ist Text in der Hoehe 1
=
'
say "" say "" say "" !! satz say "" say "
5.2
!!
""
PARSE EXTERNAL
Bedeutung Lesen und
Übertragen der Benutzer-Eingabe in den Variablenpool. Nach dem Parsing ist der
Bildschirmpuffer wieder leer. Die im Pattern angegebene(n) Empfangsvariable(n) nehmen den Pufferinhalt entsprechend der Trennzeichen-/Trennspalten-Angaben, die zwischen ihnen codiert sind, auf. Syntax »-PARSE
—|-1-EXTERNAL -,-1—I —J
I—UPPER
l—pattern
-EXIT —i-r-1-1-M
I—expr —1
I— —f ;
Default
Maximum 2**31-1 Minimum .2**31
Beispiele /*
REXX
*/
say 'Addition' say 'gib 2 Zahlen ein' parse external zl z2 11 if zl then exit =
erg say
=
zl
+
A
gib
2 Zahlen ein
17 4
Ergebnis
von
17 und 4
ist 21
z2
'Ergebnis 'und'
Addition
z2
von' '
zl,
ist' erg
exit
ftyyyyyy^^ !3Haacoäär^
afp
5 Erster
36
Dialog
Die Keyword Instruction EXIT beendet das Programm unmittelbar an der Stelle, wo es codiert steht. EXIT sollte in der Regel das letzte Statement des Programms sein. Es kann aber auch mitten im Programm eingesetzt werden, zum Beispiel im Rahmen einer IF-Abfrage. von EXIT am Programmende ist unschädlich, da der Interpreter endet, wenn er mehr zu interpretieren hat, ähnlich wie in der Job Control Language, wo ein Statement kein alleinstehendes „//" zum Zeichen von Jobende nicht codiert sein muss.
Das Fehlen
Unbedingt nötig ist EXIT erst, wenn mindestens eine interne Unterroutine im selben Member codiert wird. Diese muss nämlich nach dem EXIT der Hauptroutine programmiert sein, eingeleitet durch ein Label, das ihren Namen darstellt. So eine Unterroutine kehrt mit der Keyword Instruction RETURN zur rufenden Routine zurück. EXIT im internen Unterprogramm würde das Unterprogramm samt rufendem Programm sofort beenden. EXIT kann als Expression eine Ganzzahl beigeordnet bekommen. Sie bildet den Return Code des Programms. Falls Sie in einem REXX-Programm ein anderes REXX-Programm nicht mit CALL, sondern als Command rufen (was eher ungewöhnlich wäre), dann steht nach Ablauf des als TSO-Command gerufenen „Upros" in der Systemvariable RC des rufenden Programms der Rückgabewert.
PGM101 SELECT when RC 0 then when RC 1 then OTHERWISE END =
/*
REXX
*/
=
if
...
then EXIT 1 else EXIT 2
exit exit 0
Wie gesagt, das ist ungewöhnlich. In der Praxis wird der Aufruf mit CALL PGM 101 bevorzugt. Näheres dazu bei der Erläuterung der Keyword Instruction CALL. Wenn Sie ein REXX-Programm im Wege des Funktionsaufrufs als externe Funktion rufen z.B.: X=PGM101(...) -, so muss dieses bei Rückkehr mit EXIT eine Zahl zurückgeben. Mit CALL gerufene Routinen brauchen das nicht. Beachten Sie aber, dass Unterroutinen grundsätzlich mit RETURN zu verlassen sind und deren Beendigung mit EXIT nur in Ausnahme-
-
situationen angemessen ist.
6
PARSE
Bedeutung eines Speicherbereichs (woher) nach einer Zerlegevorgabe der so entstehenden Einzelteile in Empfangsvariablen (wohin).
Zerlegen
(wie)
und
Übertragen
Syntax parse
-arg
template 7'
-external
lupper
numeric —
-pull
-source -value
l-var
L-expr —I
-with —
varname
I—vers i on
Zerlegen
bei
gleichzeitiger
Übersetzung von
...
Klein- in Großbuchstaben ...
Woher
Wohin
(zerlegbarer Speicherbereich)
(Empfangsvariablen) + Wie
(Zerlegevorgabe)
-M
6 PARSE
38
Zerlegbare Speicherbereiche
6.1 Die che.
Keyword
Instruction PARSE erlaubt die
Zerlegung
verschiedener
Hauptspeicherberei-
READY
%P1 577 Chaplin,Ch. Gib was ein 578 Hardy,Oli
Zerlegbare Speicherbereiche PI
Variablenpool parse upper arg vi say 'Gib was ein' parse external v2 parse numeric v3 queue '579 Laurel,Stan' parse pull v4 v5 parse source parse value timeO with v6 .
x
=
'007
.
Name
Inhalt
VI
577
CHAPLIN,CH.
V2
578
Hardy,Oli
V3
9 0 SCIENTIFIC 579 PI
V6
17:34:21
.
007
Moore,Roger' V7A
parse var x v7a v7b parse version v8 578
Moore,Roger
007
Moore,Roger V8
EXTERNAL
Laurel,Stan
V5
REXX
3.48
01
May
1992
Hardy,Oli 579
Laurel,Stan >
Stack
etc.
NUMERIC
9 0 SCIENTIFIC
VERSION
REXX 3.48
SOURCE
TSO COMMAND PI SYSEXEC ?
01
May
1992
ARG
? TSO
TSO-User-Adressraum
577
Chaplin,Ch.
TSO/E
?
6.1
39
Zerlegbare Speicherbereiche
zu deutsch „zerlegen", ist eine Technik von REXX, mit der in einem einzigen Befehl ein Hauptspeicherbereich in mehrere Variablen aufgeteilt werden kann. Die Abholung der Daten aus dem Zerlegebereich erfolgt entweder durch die Copy-Technik d.h., der Zerlegebereich bleibt erhalten und kann anschließend erneut zerlegt werden oder durch die Move-Technik, die den Zerlegebereich leert.
Parsing,
-
-
Woher
Abholung Bemerkung
ARG
copy
Argumente-Bereich. Dieser Bereich ist ein Null-String, wenn beim Programmaufruf kein Argument mitgegeben worden ist. Wird eine REXX-Exec als Command gerufen egal ob implizit oder explizit und es werden Übergabewerte durch Kommata getrennt übergeben, dann besteht der ARG-Bereich dennoch aus genau 1 Argument. Kommata haben hier Text-Bedeutung. Aufruf implizit: -
-
%P1 577
Chaplin,C.
Aufruf explizit: EX 'RZ.T.EXEC(PI)'
'577
Chaplin,C.'
EX
Wird eine REXX-Exec als Unterroutine gerufen egal ob durch CALL oder per Funktionsaufruf- und werden Übergabewerte durch Kommata getrennt übergeben, dann besteht der ARG-Bereich aus so vielen Argumenten, wie Daten durch Kommata voneinander getrennt übergeben wurden. Kommata haben hier Argumente trennende Be-
deutung.
Aufruf mit CALL: call PI 577
Chaplin,Ch.
Funktionsaufruf: x=Pl(577 Chaplin,Ch.) Max. Anzahl der Argumente: 20 (19
Kommata)
Anmerkung: Fehlt vor ARG das Keyword PARSE, wird PARSE UPPER ARG unterstellt!
EXTERNAL
move
Benutzereingabe über Tastatur (TSO-Foreground) bzw. Input Stream von DD-Statement SYSTSIN (TSO-Batch). PARSE EXTERNAL im Foreground hält das Programm solange an, bis die Enter-Taste (Datenfreigabe-Taste) gedrückt wird. Damit ein User weiß, dass von ihm jetzt eine Eingabe erwartet wird, ist davor ein SAY mit unmissverständlicher Aufforderung zur Eingabe zu codieren. Nach einem PARSE EXTERNAL ist der EXTERNAL-Bereich leer, da die Abholung per Move erfolgt.
6 PARSE
40
Ein erneuter PARSE EXTERNAL bedarf also eines weiteren vorausgehenden SAY, da der Benutzer sonst nicht weiß, dass eine weitere Eingabe verlangt wird. Gibt der Benutzer keine Daten ein, sondern drückt nur die Enter-Taste, enthält der EXTERNAL-Bereich einen Null-
String. NUMERIC
copy
Ein aus 3 Wörtern bestehender, reservierter Bereich, der die aktuelle NUMERIC-Einstellungen enthält: 1. Wort: DIGITS-Einstellung (Defaultwert: 9). 2. Wort: FUZZ-Einstellung (Defaultwert: 0). 3. Wort: FORM-Einstellung (Defaultwert: SCIENTIFICI).
PULL
move
Oberstes Element der External Data Queue, die unter TSO als Data Stack (Stack) implementiert ist. Ist der Stack leer entweder weil er zuvor nicht gefüllt wurde (siehe Befehle QUEUE und PUSH) oder weil er zwar gefüllt worden war, aber inzwischen so oft mit PARSE PULL ausgelesen wurde, dass sich nun kein Element mehr in ihm befindet -, dann schwenkt REXX um und eine Benutzereingabe per Tastatur ist erforderlich (siehe -
EXTERNAL).
Weiß der Programmierer also, dass der Stack leer ist, kann er einen Dialog mit dem User über SAY und PULL genauso führen wie über SAY und EXTERNAL. Eindeutiger allerdings ist die Methode mit EXTERNAL.
Fehlt vor PULL das Keyword PARSE UPPER PULL unterstellt!
Anmerkung: SOURCE
copy
PARSE, wird
Ein aus 9 Wörtern bestehender, reservierter Bereich, der Auskunft über die aktuell laufende REXX-Exec gibt. 1. Wort: TSO (Name der Systemumgebung. Läuft z.B. ObjectREXX unter Win2000, dann: WinNT). 2. Wort: COMMAND (Hauptprogramm, z.B. durch impliziten oder expliziten Aufruf) SUBROUTINE (Upro-Aufruf mit CALL) FUNCTION (Upro-Aufruf mit Funktionsaufruf). 3. Wort: Member-Name der gerade laufenden REXX-Exec in Großbuchstaben. Bei Extender Exec-Namen (ab APAR OW28404), die, z.B. wegen UNIX-HFS-Pfaden, länger sein dürfen, als 8 Stellen: Vollständiger Name ohne ausdrückliche Umsetzung in Großbuchstaben.
6.2 Das
41
Template
(DD-Name, von wo das Member geladen wurde) oder z.B. SYS00025 (wenn wegen expliziten Aufrufs der DD-Name durch Dynalloc vergeben wurde). „?", wenn der Aufruf implizit erfolgte bzw.
4. Wort: SYSEXEC
5. Wort:
6. Wort:
7. Wort:
8. Wort:
9. Wort:
VALUE WITH
expr copy
DSN der REXX-Bibliothek ohne Hochkomma nach einem expliziten Aufruf. Name der REXX-Exec, wie sie gerufen wurde (z.B. kleinbuchstabig) oder, wenn nicht feststellbar oder aufgrund von Extended Member Names, dann ein „?". TSO (Name des Default Initial Host Command Environment) bzw. MVS (wenn statt unter IKJEFT01 unter IRXJCL, dem Batch-REXX, gearbeitet wird. Großbuchstabiger Name des AdressraumBereichs, der Träger der REXX-Exec ist. Bei Aufruf im READY ist das: „TSO/E", bei Aufruf unter ISPF ist das „ISPF". ? bzw. ein 8-stelliger Begriff, der vom TSOSystemprogrammierer bei der Implementation im Feld PARSETOK des Parameter Modules eingetragen werden kann.
String, der sich nach Auflösung einer Expression ergibt. Anmerkung: Da auch eine Variable unter den Begriff „Expression" fällt, kann zum Beispiel der Inhalt einer Variable namens ARTNR sowohl mit PARSE VAR artnr als auch mit PARSE VALUE artnr WITH zerlegt werden. ...
VAR
varname
VERSION
copy
Eine mit Namen
copy
Ein Bereich, der mit 5 Wörtern Auskunft über die mentierte REXX-System-Version gibt, z.B.:
anzugebende Variable.
REXX370 3.48 Ol
6.2
Das
...
May
imple-
1992
Template
Die Frage nach dem „Wohin" und „Wie" ein Bereich zu zerlegen ist, klärt das Template, eine Kombination aus Zerlegevorgaben und Empfangsvariablen. Man kann sagen: Jeder Zerlegevorgabe folgt der Name einer Empfangsvariable. Gab es eine bei PARSE verwendete
6 PARSE
42
Empfangsvariable vorher nicht, so wird sie im Variablenpool neu angelegt, gab es sie bereits, wird sie durch PARSE überschrieben. Als Empfangsvariablen sind neben den normalen Variablen auch Compound-Variablen zulässig. Die Zerlegevorgabe kann gegliedert werden in: • Zerlegen nach Wörtern (Blank-Zerlegung), • Zerlegen nach Argumenten (Komma-Zerlegung bei PARSE ARG im • Zerlegen nach Trennzeichen, • Zerlegen nach Spalten (absolut und relativ).
6.2.1
Unterprogramm),
Zerlegen nach Wörtern (Blank-Zerlegung)
Syntax »-parse
Lupper J
-woher
-M
I
Blank
Beispiele 'Gib 3 Zahlen ein' parse pull vi v2 v3 say 'Wertl>'vi''v2'14.5< Wert3>22
< Wert3>22
'ekv'< 'EK-Cent>'ekn'
7654< Art-Bel>Disk< Art-Be2>72 0 0rpm
152< EK-Cent>50
'kto''bem''kto''eu1'bem'6530< Euro >03 0.5 0
'bem'1
say say say say
'PNN>1 'PVN>1
'Ber>1
'Alt>'
pnn pvn ber alt Abt>IT< PNN>Thoma< PVN>Joe
Beruf:Programmierer Alt>52
' say say say say
Spaltenangaben
'PNN>'
'PVN>' 'Ber>1
'Alt>'
pnn pvn ber alt
52'
pvn 'Beruf:' ber 34 alt
Abt>IT< PNN>Thoma< PVN>Joe < Ber Programmierer
Alt>52
>>
"1"
*-*
then
*-*
say
9
*
*-*
*
5
*-*
eingäbe*i
end
-
1 /* ohne TO-Angabe: endlos*/ zahl ein oder "END" 'gib say "gib zahl ein oder "END"
do i
>>>
gib
'NUM1
"5"
>>>
4
=
=
'
"
zahl ein oder "END" 6
*-*
parse upper external
eingäbe
END
"END"
>>>
7
*-*
if
>>>
eingab
eingab
=
'END1
=
'END'
"0"
="END'
7
*-*
>>>
*
*
if
eingab "1"
then
-
*-*
leave
4*-*doi=l/* * * *
ohne
TO-Angabe: endlos*/
Programmablauf verfolgen
8
Arithmetik, Vergleiche, Logik,
Verkettungen 8.1
Arithmetik
REXX unterstützt die
wichtigsten betriebswirtschaftlich nötigen Rechenoperationen. Einen für Wurzelbildung kennt REXX leider nicht. Auch ist die Exponentiation nur mit Operator Ganzzahlen erlaubt und dem Programmierer somit der Umweg über „hoch Vi" für die zweite, „hoch 'A" für die dritte Wurzel etc. abgeschnitten. Eine Builtin Function SQRT gibt es vom Hersteller IBM auch nicht. Sie müssen sich bei Bedarf selbst eine Function schreiben.
8.1.1 OP
//
Arithmeti sehe
Operatoren
Bedeutung
Beispiel
Addition
x=
7 +4
11
Subtraktion
x=4-7
-3
Multiplikation
x=7*4
28
Division: dezimales
x=19/7
2 .71428571
x=19%7
2
x=19//7
5
x=4**7
16348 1 84467441E+19 0.001 -1000
Ergebnis Division: Ganzzahl- Ergebnis Division: Restwert- Ergebnis Exponentiation
Mischoperationen
x=2**64 x=10**-3 x=-10**3 a=200; b= 16
x=a*(100+b)/100
Ergebnis
.
232
Ausdrücke in runden Klammern werden vor ungeklammerten aufgelöst. Klammern können beliebig geschachtelt werden. Die Auflösung erfolgt dann von innen nach außen.
8
58
File
Edit_Settings
Edit
Arithmetik, Vergleiche, Logik, Verkettungen Compilers
Utilities
Menu
Help
Member SQRT1 saved
DEURING.VI.EXEC(SQRT1)
EDIT
Test
Scroll
Command
===>
HALF ******
************************
000001
/*REXX-PROZEDUR
000002 000003 000004 000005 000006 000007 000008 000009 000010 000011 000012 000013 000014 000015 000016
Top of
Data
**********************
*******
»/
ZUM ERRECHNEN der 2.WURZEL
Aufrufbeispiel: 2.
1.
Vom Benutzer als Command Von einer EXEC mit Funktionsaufruf
3.
Von einer EXEC
mit CALL
TSO %SQRT 121,3 say SQRT(121,3) call SORT 121,3 say result
Übergabe-Argumente: AUF y NACHKOMMASTELLEN GENAU WIRD GERECHNET
"I Parse
source
typ
if typ
=
'COMMAND'
if y
=
''
then Parse ARG w ',' y else Parse ARG w y 2 /* Defaultwert fuer then y
.
.
,
=
Nachkommast*/
select when datatype(w) 1 CHAR1 ! 000017 datatype(y) 1 CHAR' then return ant(typ,'Parameter bitte nur numerisch') 000018 0 ! y < 0 when w < 0 ! 000019 then return ant(typ,'Werte bitte nicht negativ1) 000020 0 ! w 000021 1 when w /* Wurzel aus 0/1 ist IMMER 0 / 1 then return ant(typ,FORMAT(w,,y)) 000022 000023 otherwise nop 000024 end 1 000025 g IE-1!! y w 000026 v 000027 NUMERIC DIGITS LENGTH(w)+y w ! v**2-w
\> A
=
anz
+
1
0 then return
sum/anz
zur Durchschnittsberechnung. Dem Beispiel können Sie eine Variante einer selbstgebauten hier internen AVG-Function entnehmen, die unter Verwendung der Arg-Builtin Function die einzelnen Eingabewerte ermittelt und den Durchschnitt zurückgibt, wenn mindestens ein Wert eine Zahl war.
REXX bietet keine Builtin Function
-
-
113
10.7 Builtin Functions
BITAND
10.7.5
Bedeutung Ermittlung des logischen Ergebnisses zweier bitweise
mit UND
verknüpfter („geUNDeter")
Werte.
Syntax
Defaults str2 : Null-String (String in der
Länge 0)
Rückgabe
„GeUNDeter" Wert in der Länge des längeren der beiden Strings.
Beispiele
Coding /*REXX*/ lang='AFFE 1X; f say
=
'
kurz='E2'X
96 'X
bitand(lang,kurz)
Beim binären „UNDen" werden die beiden Werte bitweise mit einem logischen UND verknüpft, mit der Folge, dass 1 UND 1 eine 1 ergeben. Alle anderen Kombinationen ergeben 0.
/*REXX */ wl=1GRossWirdKLEIN1 fw='BF'X
erg=bitand(wl,,fw) /* Ergebnis: grosswirdklein */
10
114
10.7.6
Unterprogramme
BITOR
Bedeutung Ermittlung des logischen Ergebnisses („geODERter") Werte.
zweier bitweise, inklusive mit ODER
verknüpfter
Syntax BITOR(strl
-M '
Defaults str2 : Null-String (String in der
L_str2 JL ,pad Länge 0)
Rückgabe Inklusive „geODERter" Wert in der Länge des längeren der beiden Strings. Beispiele
Coding /*REXX*/ lang ='6 981'X kurz ='53'X say bitor(lang,kurz)
Verarbeitung: bitweise von links nach rechts in der Länge des längeren Strings. Fehlt pad, zur Länge des kürzeren Strings geODERt, dann der Rest des längeren angehängt.
wird bis
/*REXX */ wl=1KleinwirdGross' fw=140'X
erg=bitor(wl,,fw) /* Ergebnis: KLEINWIRDGROSS
*/
115
10.7 Builtin Functions
10.7.7
BITXOR
Bedeutung Ermittlung des logischen Ergebnisses zweier bitweise, exklusive mit („geODERter") Werte.
ODER
verknüpfter
Syntax »-BITXOR(strl '
Defaults str2 : Null-String
TZ str2 TT
/
pad
3
(String in der Länge 0)
Rückgabe Exklusiv „geODERter" Wert in der Länge des längeren der beiden Strings.
Beispiele
Coding /*REXX*/ lang 1 8714 =
'X
kurz ='46D0'X say bitxor(lang,kurz)
Verarbeitung: bitweise von links nach rechts in der Länge des längeren Strings. Fehlt pad, wird bis zur Länge des kürzeren Strings geODERt, dann der Rest des längeren angehängt.
10
116
10.7.8
Unterprogramme
B2X
Bedeutung Ermittlung des Hexadezimalwerts eines Strings.
beliebig langen -
binär -
angegebenen
Character
Syntax »-B2X(bwert)
-M
Defaults
Rückgabe
Hexadezimale
Darstellung (großbuchstabig) des übergebenen Werts.
B2X löst den Wert halbbyteweise von rechts nach links auf. Blanks sind nur zwischen HalbBytes erlaubt, nicht aber als leading/trailing Blanks. Besteht der Übergabewert aus einer
nicht durch 4 teilbaren Anzahl
von
0 und 1, werden führende Nullen angenommen.
117
10.7 Builtin Functions
10.7.9
CENTER
Bedeutung
Rückgabe des Übergabewerts als zentrierten String. Syntax CENTER(expr,len
LT ,pad It
Defaults : Blank
pad
Rückgabe Expression in der Länge len, links und rechts aufgefüllt mit dem pad-Zeichen.
Zentrierte
Beispiele
Coding
Auflösung
/*REXX*/ t=1 Inventar-Liste' L=20
Titell=center(t,L) Titel2=center(t,20 'Titel3=center(t,19,'Titel4=center(t,11) ,
Inventar-Liste 1-Inventar-Liste'--Inventar-Liste-1 'nventar-Lis1
'
Statt CENTER ist auch CENTRE erlaubt. Das verringert Fehler, indem sowohl die amerikanische als auch die britische Rechtschreibung berücksichtigt ist.
Die Längenangabe muss eine Ganzzahl sein, die größer oder gleich 0 ist. Ist sie größer als die tatsächliche Länge der Expression, wird links und rechts mit dem pad-Zeichen aufgefüllt bei ungerader Differenz auf der rechten Seite um eins mehr. Ist sie kürzer, werden links und rechts Zeichen gekürzt bei ungerader Differenz auf der rechten Seite um eins mehr.
-
-
10
118
10.7.10
Unterprogramme
COMPARE
Bedeutung Ermittelt, ob zwei Expressions identischen Inhalt haben.
Syntax
Defaults pad : Blank
Rückgabe
0 oder die Positionsnummer des ersten
ungleichen Zeichens (von links nach rechts).
Beispiele F#COMPAR
/*REXX*/ say 'Pers.Nr.?' parse external pi say 'Pers.Nr. wiederholen parse external p2 x
=
compare(pi,p2
if x 0 then call verarb else say 'ungleich ab Pos.' x exit =
Die kürzere
Expression wird vor dem Vergleich, falls nötig, (Füllzeichen) bis zur Länge der längeren Expression ergänzt.
rechts mit dem
pad
10.7 Builtin Functions
119
CONDITION
10.7.11 Bedeutung
Informiert über aktuelle Einstellungen, die für eine gelten (siehe CALL ON bzw. SIGNAL ON).
gerade festgestellte
Ausnahmesituation
Syntax >-CONDITION (
-)
—|-
1—option
—M
—I
Defaults
option
:
I
Rückgabe wenn option.
dann:
Bedeutung ...
ConditionName ERROR, FAILURE, HALT, NOVALUE oder SYNTAX bzw. Null-String, wenn aktuell gar keine Ausnahmebedingung eingetreten ist. I)
Description
Der String, der zuletzt die Condition verursachte z.B. die Variable, die angesprochen wurde -, aber nicht existiert (bei NOVALUE) oder der String, der zum Syntaxfehler führte (bei ERROR), bzw. Null-String, wenn aktuell gar keine Ausnahmebedingung eingetreten ist. -
Instruction
CALL oder SIGNAL, je nachdem was eingestellt ist, oder Null-String, wenn aktuell gar keine Ausnahmebedingung eingetreten ist.
Status
ON, wenn für die aktuelle Ausnahmebedingung ein CALL
ON bzw. SIGNAL ON eingestellt ist. OFF, wenn für die aktuelle Ausnahmebedingung ein CALL OFF bzw. SIGNAL OFF eingestellt ist. DELAY, wenn für jedes weitere Auftreten derselben Ausnahme die Condition verzögert oder ignoriert wird. Null-String, wenn aktuell gar keine Ausnahmebedingung eingetreten ist.
10
120
Unterprogramme
Beispiele F#CONDIT
/*REXX*/
x=msg(OFF)/*no message*/ trace o /*no trace*/ CALL ON FAILURE name F
"frie exit
DD(eingäbe)"
FAILURE 11
f rie DD
(eingäbe)
in Zeile 5
F:
say condition('C') say condition(1D') say 'in Zeile' sigl return
rödöäö^
BEBT
CONDITION ist eine in der Praxis eher selten gebrauchte Funktion. Das anderen programmiererfreundlichen Systemdefaults, wie beispielsweise:
x=MSG(ON) würde dafür matisch
am
sorgen, dass im Bildschirm erscheinen würde:
vorliegenden
Fall
liegt an folgenden
folgende Fehlermeldung auto-
IKJ5650 0I COMMAND FRIE NOT FOUND
TRACE N würde dafür sorgen, dass beim Verwenden des unbekannten Commands diese Fehlermeldung automatisch am Bildschirm erscheinen würde: 5
*-*
"frie
+++
RC(-3)
„frie ..."
DD(eingäbe)" +++
Daraus können Sie entnehmen, dass der Fehler in Zeile 5 auftrat, ohne dass Sie auf die reservierte Systemvariable SIGL zurückgreifen. SIGL enthält jene Zeilennummer, die den Sprung mit CALL bzw. SIGNAL verursachte.
10.7 Builtin Functions
10.7.12
121
COPIES
Bedeutung
Gibt den
Übergabewert als verketteten Sting in n-facher Kopie zurück.
Syntax COPIES(expr,n)
M
Defaults
Rückgabe String, der die n-fache Wiederholung des Übergabe-Arguments ist. Beispiele F#COPIES
/*REXX*/ say copies('News ',4) x
=
y
=
'
0
1
!!
1
copies(x,9)
*
s zw
=
1000000000 ********************
20
say copies(s,zw) exit
n muss
eine positive Ganzzahl oder 0 sein.
Sie zur Erzeugung von Überschriften, zum Auffüllen Generierung von Zahlen (z.B. Anhängen von Nullen) verwenden.
Copies können zur
von
Sätzen, aber auch
10
122
10.7.13
Unterprogramme
C2D
Bedeutung
Ermittlung des Dezimalwerts, der sich aus dem Binärwert eines bis zu 250-stelligen CharacStrings berechnet.
ter
Syntax »-C2D(expr
—r---J-)
-M
Defaults
Rückgabe Darstellung des Binärwerts des übergebenen Character Strings.
Dezimale
Beispiele F#C2D
Um die
Dezimaldarstellung entsprechend erhöhen.
sehr hoher Werte
darzulegen,
müssen Sie NUMERIC DIGITS
Wenn Sie bei der Funktion C2D (Character to Decimal) als Übergabewert nur expr angeben, wird dieser Ausdruck als vorzeichenlose Binärzahl verarbeitet. Der Wert '00'X würde wie auch '000000'X als 0 zurückgegeben. Der Wert 'FF'X käme als 255, der Wert 'FF FF'X als 65535 und der Wert 'FF FF FF'X käme als 16777215 zurück.
123
10.7 Builtin Functions
Die
Übergabe eines Null-Strings bringt als Ergebnis immer 0.
Sollten Sie jedoch als zweites Argument eine Ganzzahl angeben, nimmt das System an, dass expr ein Binärwert mit Vorzeichen ist, und zwar in der Länge n. Dabei entscheidet das erste Bit von Links über positiv (wenn 0) oder negativ (wenn 1).
Längenangabe 0 bringt unabhängig vom Wert der übergebenen Expression immer 0. Der folgenden Tabelle können Sie die Generierung vorzeichenbehafteter Zahlen entnehmen. Die
Character to Decimal
C2D -
Aufruf und
Übergabe
Rück-
Aufruf und
Übergabe
gabe
gabe
c2d('00 00'X,2)
Rück-
0
c2d('00 01'X,2)
C2d('FF FF'X,2)
C2d('00 02'X,2)
C2d('FF FE'X,2)
c2d(100 03'X,2)
C2d('FF FD'X,2;
c2d('00 04'X,2)
C2d('FF FC'X,2;
C2d('00 05'X,2)
c2d('FF FB'X,2)
c2d(100 FB'X,2)
251
C2d('FF 05'X,2)
-251
C2d(100 FC'X,2)
252
c2d('FF 04'X,2)
-252
c2d('00 FD'X,2)
253
c2d('FF 03'X,2)
-253
c2d(100 FE'X,2)
254
c2d('FF 02'X,2)
-254
C2d('00 FF'X,2)
255
c2d('FF 01'X,2)
-255
c2d(1OOFFFF'X,3) usw.
65535
C2d('FF0001'X,3) usw.
-65565
124
10.7.14
10
Unterprogramme
C2X
Bedeutung Ermittlung des Hexadezimalwerts eines beliebig langen Character Strings. Syntax > -C2X(expr)
-M
Defaults
Rückgabe Hexadezimale
Darstellung (großbuchstabig) des übergebenen Werts.
Beispiele F#C2X
C2X (Character to HeXadecimal) gibt genau zweimal so viele Zeichen zurück wie übergeben wurden, da die hexadezimale Darstellung eines 1-Byte-EBCDIC-Character-Zeichens immer in einem Wert zwischen '00'X und 'FF'X mündet. Die zur Hex-Darstellung verwendeten Buchstaben A-F (Bedeutung: A=10, B=ll, C=12, D=13, E=14, F=15) werden großbuchstabig zurückgegeben. Ein übergebener Null-String führt zu einer Null-String-
Rückgabe.
127
10.7 Builtin Functions
DATE
10.7.16 Bedeutung
Ermittlung des aktuellen Datums bzw. der umgewandelten Form eines fiktiven Datums. Syntax -DATE
(
L-ausgf ormat
1^7
ktdatum
ktformat
,fiktdatum ktformat
1
Defaults N
ausgformat
Rückgabe Datumsangabe gemäß ausgformat.
Beispiele F#DATE
/*REXX
am
1.3.2005*/
say date() say date('E') say date('S') heute date('B') say heute dl='20040930 ' =
n=heute-date('B',dl,'S1) say 'Rechnung ist seit', n
exit
'Tagen offen'
1 Mar 2005
01/03/05 20050301 732005
731853
Rechnung ist
seit 152 Tagen offen
128
10
Unterprogramme
DATE liefert als
Rückgabe einen Datumswert. Fehlen die Argumente fiktdatum und fiktformat, wird immer ein Datumswert zurückgegeben, der sich auf das aktuelle (heutige) lokale Datum bezieht. Die erlaubten For-
Angaben für ausgformat sind:
steht für.
Bedeutung
Beispiel beim aktuellen Maschinendatum: 1.3.2005
mat
Base
Anzahl der abgelaufenen Tage (ohne den aktuellen Tag) seit und inklusive des Basisdatums, des 1. Januars 0001 im Format dddddd ohne führende
t#pcn=date('B') */ / Rückgabe: /*732005 */
„0"oder Blanks.
Century
Anzahl der abgelaufenen Tage des aktuellen Jahrhunderts inkl. des 1. Januars des letzten durch 100 teilbaren Jahres und des aktuellen Tages.
Days
European
f='C
t#cen=date(f)
/ Rückgabe: /*1886
*/ */
Anzahl der Tage des laufenden Jahres inkl. des aktuellen Tages, im Format ddd ohne führende „0" oder Blanks.
t#jhr=date('D' ) */ / Rückgabe:
Tag in der Form tt/mm/jj.
t#eur=date('E1)
/ 732005
*/
/ Rückgabe:
Tag in der Form jjttt (auch bekannt als Industrietag).
Julian
1: Leider bietet REXX kein Format des aber so lösen:
/ / 01/03/05 / t#jul=date('J') / / Rückgabe: / 05060 /
Anmerkung
Typs tt.mm.jjjj. Jahr. Sie könnten das Problem
parse value date('S') WITH 1 datum tt1 1 mm' 'jjjj =
.
jjjj
5
mm
7 tt
.
Anmerkung 2:
C, M, und W können nur das aktuelle Datum liefern, nicht aber die umgewandelte Form eines fiktiven Datums.
10.7 Builtin Functions
10.7.15
125
DATATYPE
Bedeutung Feststellung, ob der übergebene Wert numerisch Datentypus entspricht oder nicht.
ist oder nicht bzw. ob
er
einem bestimmten
Syntax >+-DATATYPE
(expr -,-,-)
L,typ
J
-M
Defaults
Rückgabe Ist nur expr angegeben, dann entweder NUM oder CHAR. Ist auch
typ angegeben, dann 1, wenn wahr und 0, wenn unwahr.
Beispiele F#C2D
/*REXX*/ wl='
if
234.67
1
-
datatype(wl)='NUM' then say wl*2
say datatype(1.5E-3) say datatype(1,332) say datatype('') say datatype(1.234,'N' say datatype(1.234 , 1W say datatype('klein' exit ,
DATATYPE ist eine sehr
wichtige Funktion bei Plausibilitätsprüfungen. Sie wird u.a. zur Expressions eingesetzt, die als Operanden einer arithmetischen Operation verwendet werden sollen. Das verhindert schon im Vorfeld unangenehme Programmabbrüche des Typs „bad arithmetic conversion". Prüfung
von
10
126
Die erlaubten TYP
Unterprogramme
Angaben für „typ" sind:
steht für..
Beispiel:
Rückgabewert =1, wenn expr aus folgenden Eigenschaften
Zeichen mit
besteht:
A
'Artikel4712
A-Z, 0-9
Alphanumeric
a-z,
Binary
0 oder
0000 0001'B
SBCS/DBSS
Gemischter String aus Single Byte Character String und Double Byte Character String
81820E42C10F'X
DBCS
only
Double
Byte Character String
42CT'X
Lowercase
a-z
klein'
M
Mixed Case
a-z, A-Z
Tron
N
Number
REXX-Zahl
1
234.67 IE + 3
Symbol-Schreibweise entsprechen
Symbol
der
Uppercase
A-Z
1
234
-
stellung. Hexadecimal
Anfang#12 IBM
Whole Number Ganzzahl aufgrund der aktuellen NUMERIC DIGITS EinX
-
0-9, a-f, A-F oder Null-String
94 89 f6'X
Anmerkung zu DBCS-Strings:
DBCS-Zeichen braucht man nur in Sprachen, die mehr als 8 Bit zur Zeichendarstellung benötigen, wie z.B. das koreanische Hangeul oder das japanische Kanji. Die Keyword Instruction OPTIONS 'ETMODE' bzw. 'EXMODE' muss als erste Anweisung einer REXX-Exec codiert sein, um DBCS-Strings verarbeiten zu können. Jedes DBCS-Zeichen besteht aus 2 Bytes. Die Großbuchstaben ABC würden statt 'C1C2C3'X so codiert sein: '42C1 42C2 42C3'. Bei einer Mischung von SBCS- und DBCS-Zeichen muss der DBCS-Teil mit 'OE'X (Shift Out) eingeleitet und mit 'OF'X
(Shift In) beendet werden, z.B.:
a=
'ABC
!!
'
0E 42C1 42C2 42C3
0F'
10.7 Builtin Functions
Die erlaubten For-
Angaben für ausgformat sind:
steht für
Beispiel beim aktuellen
Bedeutung ...
mat
M
129
Month
Maschinendatum: 1.3.2005
englischer Monatsname, z.B. May
Monat=date(1M')
*/ /
/ Rückgabe: / March N
Normal
Tag in der Form t mon jj. (Default);
/ Rückgabe:
Tag in der Form jj/mm/dd
datum=date(1O')
Tag in der Form jjjjmmdd
/ 050301 / datum=date('S1)
=
Ordered
datum=date('N')
wobei: t ohne fuhrende O/Blanks und mon englische Monatskürzel
/ l
/ /
Mar 2 005
*/
/ Rückgabe: Sorted
/ /
/ Rückgabe: / 20050301 U
USA
Tag in der Form mm/dd/jj
datum=date('U')
/ Rückgabe: / 03/01/05 W
Weekday englischer Wochentag
/ /
datum=date {'VI')
/ Rückgabe:
/
/ Tuesday_ / Die Funktion Date können Sie auch benutzen, indem Sie ihr „eigenes", fiktives Datum mitgeben, um sich daraus ein anderes Format generieren zu lassen. Sie müssen nur zusätzlich zum gewünschten Ausgabeformat 2 weitere Argumente, das fiktive Datum und das Format, in dem Sie dieses Datum übergeben, nennen. 010011 'J') x=date('B' x=date('B' 99/01/01 'O') x=date('B' 20130513 -INDEX (heuhauf en, nadel
-:-:—)
-M
I—, start Defaults 1
statt
Rückgabe
Übereinstimmung, d.h., „Nadel im Heuhaufen nicht gefunden".
0
keine
n
Eine positive Ganzzahl n bedeutet, dass der Nadel-String ab Stelle Heuhaufen-String vorkommt.
n
(von links) im
Beispiele F#INDEX
/*
REXX
heuhl= x
=
x
=
x
=
x
=
*/ 'Art
=
2356 Bl
=
index(heuhl,'Ar') index(heuhl,'ar') index(heuhl,'B') index(heuhl,'B',13)
Fahrrad B2
/* /* /* /*
1 35 12 25
=
28" Farbe
=
gelb'
*/ */ */ */
exit
erlaubt, in einem String (z.B. in einem gelesenen Datensatz) nach einem oder mehreZeichen zu suchen. Von der Default-Startposition 1 können Sie abweichen, wenn Sie nach Mehrfachvorkommnissen desselben Nadel-Strings suchen. INDEX
ren
Ein der
positiver, ganzzahliger Rückgabewert bedeutet Übereinstimmung ab Spalte n. Dabei ist Bezugspunkt immer Spalte 1 und nicht etwa die Start-Spalte. 0 wird zurückgegeben,
wenn
„nadel" nicht in „heuhaufen" vorkommt.
151
10.7 Builtin Functions
Beispiel:
Mehrfachsuche nach einem bestimmten
Begriff in einem Satz
F#INDEX1
/*
REXX
*/
-82999-BEIERBRUNN' '102375-SEPP MEIER -LEIERKASTENMANN n 'EIER' s 0 */ /* Startspalte vorbelegen 1' wo */ /* Fundort vorbelegen anz= 0 */ /* Zähler vorbelegen do until s 0 */ /* mindestens 1 Durchlauf s index(h,n,s+1) */ /* Suche ab Stelle s + 1 in nadel heuhaufen if s > 0 then do /* gefunden */ wo !! s Stelle merken wo */ /* 1,'
h
=
=
=
=
=
=
=
anz
end else
s
=
anz
=
0
/* Zähler erhöhen
+1
/*
Ende
zwar
an
von
DO UNTIL vorher.
*/ */
end say n 'in' h say anz 'mal gefunden' if anz > 0 then say 'und exit
folgender/n Stelle(n):'
wo
(besser noch: POS) können Sie einsetzen, um zum Beispiel in einer Datei die Anzahl Vorkommnisse eines bestimmten Suchbegriffs zu ermitteln. Beachten Sie, dass INDEX die Argumente in der Reihenfolge „heuhaufen, nadel, ..." verlangt, während das portablere POS INDEX
mit „nadel, heuhaufen, ..."
zu
rufen ist.
10
152
10.7.31
Unterprogramme
INSERT
Bedeutung
Gibt einen Gesamt-String zurück, der aus dem übergebenen Quell-String alt besteht, in den nach der Stelle n in der Länge len ein neuer String neu eingefügt wurde.
Syntax »-INSERT
(neu, alt
r
'
T7~X
Lien -I L,pad -I
Defaults n
0
len
Länge des Strings neu
pad
Blank
Rückgabe Gesamt-String, bestehend aus: String neu in String alt nach Stelle n mit Länge len eingefügt und aufgefüllt mit Zeichen pad, sofern die Längenangabe len größer ist als die tatsächliche Länge von neu. Beispiele F#INSERT
/*
REXX
alt
=
neu
=
*/ 'TOMATENKÄFER' 'U'
Beruf Beruf Beruf
Tier exit
=
=
=
=
insert(neu,alt,9) /*TOMATENKÄUFER */ insert('Au',Beruf) /*AUTOMATENKÄUFER */ insert('ver',Beruf,9,4) /*AuTOMATENver-KÄUFER*/ insert('pe','Rau',4,6,1+1) /*Rau+pe++++ */
153
10.7 Builtin Functions
INSERT wird verwendet, um bestehende Sätze ab einer bestimmten Stelle zu erweitern. Nach dem Lesen wird in einer Schleife Satz für Satz mit INSERT erweitert und anschließend
weggeschrieben: F#INSERT
/* REXX */ /* Eingabe
*/
"alloc dd(ein) shr reu dsn(1RZ.KUND.STAMM(REGION1)1)" "execio * diskr ein (stem satz. finis)"/*alle lesen "free dd(ein)"
*/
/* Verarbeitung
*/
1
=
ns
=10
do i
=
/* 3 Blanks /* nach Sp.
'
neu
*/ 10
einfügen */
/* soviele Sätze gelesen wurden */ */ insert(neu,satz.i,ns) /* Erweiterung /* Spalten ab 80 kappen */ left(satz.i,80)
1 to satz.O
satz.i satz.i
=
=
end
*/
/* Ausgabe "alloc dd(aus) shr reu dsn(1RZ.KUND.STAMM(REGIONIN)1)" "execio" i-1 "diskw aus (stem satz. finis)" "free dd(aus)" EXIT
Im vorangehenden Beispiel wird zunächst die zu lesende Datei allociert (bereitgestellt), dann mit dem Command EXECIO alle Sätze dieser Datei in die Compound-Variablen satz. 1 bis satz.n übertragen. Zudem stellt das System nach satz.O die Gesamtzahl eingelesener Sätze. Mit FREE wird die Allocation der Datei aufgehoben.
Anschließend werden alle Sätze ab Spalte 11 um 3 Blanks erweitert. Die ist nun Spalte 14. Mit Hilfe von LEFT wird Satz für Satz von links Inhalt in der Länge 80 überschrieben. -
vorherige Spalte 11 mit dem eigenen -
Dan erfolgt die Ausgabe aller Sätze. Die Expression i-1 beim DISKW legt fest, wie viele Sätze das sind. Beachten Sie, dass wegen der vorherigen Do-Schleife i um 1 höher ist, als die Anzahl der gelesenen Sätze.
154
10.7.32
10
Unterprogramme
von
Füllzeichen zwi-
JUSTIFY
Bedeutung Non-SAA-Function
Rückgabe des Übergabewerts als zentrierten String unter Verwendung schen den Wörtern.
Syntax >-JUSTIFY
(expr, len
—|-1-) L,pad —I
-M
Defaults Blank
pad
Rückgabe Zentrierte
Expression der Länge len, zwischen den Wörtern aufgefüllt mit dem Zeichen pad.
Beispiele JUSTIFY
JUSTIFY
Coding
Auflösung
/*REXX*/ t='Inventar Liste L=25
2005
Liste 2005' Inventar-Liste-2005 ' 1Inventar++Liste' 'Inventar+Liste'
Titell=justify(t,L) Titel2 justify(t,24, '-') Titel3=justify(t,15,'+') Titel3=justify(t,14,'+')
'Inventar '
=
Die Rückgabe des Übergabe-Strings erfolgt in der Länge len, die eine positive Ganzzahl oder 0 sein muss. Zuerst werden alle Mehrfach-Blanks sowie führende und nachfolgende Blanks aus dem Übergabe-String entfernt. Dann wird der Füllcharakter pad gleichmäßig von links nach rechts die bisherigen Blanks ersetzend eingefügt, bis die Gesamtlänge len erreicht ist. Ist len kleiner als die tatsächliche Länge des Übergabe-Strings, wird er nach dem Entfernen der Mehrfach-Blanks rechts abgeschnitten. Sollten dabei rechts Blanks überbleiben, werden diese entfernt. Erst danach erfolgt das gleichmäßige Auffüllen. -
-
10.7 Builtin Functions
10.7.33
155
LASTPOS
Bedeutung Ermittlung derjenigen Stelle des Heuhaufen-Strings, an Nadel-String beginnt. Suchfolge von rechts nach links.
der die
Übereinstimmung
mit dem
Syntax_ * -LASTPOS
(nadel, heuhaufen
—,-1—) —J
L,start
-M
Defaults Letzter Character des
start
Rückgabe 0
...
n
n-te
der
String „nadel" Null-String ist.
wenn
del" ein
Heuhaufen-Strings. im
String „heuhaufen" nicht vorkommt oder wenn „na-
Stelle, ab der die Übereinstimmung beginnt.
Beispiele Coding /*REXX*/ h='//EIN
DD DSN=RZ.T.EIN1'
n=1 EIN'
x=lastpos(n,h) x=lastpos(n,h,18) x=lastpos(1EIN11,h, 18) LASTPOS sucht von hinten beginnend nach der nächsten Übereinstimmung zwischen Nadel- und Heuhaufen-String. Der Rückgabewert ist entweder 0 fur „Stecknadel nicht in heuhaufen" oder eine positive Ganzzahl, die jene Stelle (von links aus gezählt) des Heuhaufen-Strings identifiziert, ab der die Übereinstimmung mit dem Nadel-String beginnt.
10
156
10.7.34
Unterprogramme
LEFT
Bedeutung
Ermittlung und Rückgabe des linken Teils des Übergabe-Strings. Syntax > -LEFT
(expr, len
—,-1-) L,Pad —I
-M
Defaults
pad
Blank
Rückgabe Linker Teil-String des Zeichen pad.
Übergabe-Strings
in der
Länge len, ggf. rechts aufgefüllt mit dem
Beispiele F#LEFT
LEFT wird
häufig in Verbindung mit den Functions RIGHT und Einzel-Strings spaltengerecht zu Datensätzen zusammenzustellen,
FORMAT eingesetzt, um die anschließend auf eine
157
10.7 Builtin Functions wie z.B. ein Member, eine schrieben werden.
Datenhaltung
Hier ein einfaches
sequentielle
Datei oder eine DB2-Table wegge-
Beispiel für die Zusammenstellung eines Ausgabesatzes:
F#LEFT1
/*REXX */ say 'Gib Artnr Bez Menge', und Preis ein' parse external nr bz me pr satz.l=nr,
Gib Artnr Bez Menge und Preis ein 7654 Bohrhammer 100 234.88
left(bz,15),
right(me,4,101), format(pr,5,2) exit
Nach dem
Assignment steht in Satz
7654Bohrhammer
^010^0 234.8,6
15
10.7.35
1:
5
Vorkomma-,
LENGTH
Bedeutung Ermittlung und Rückgabe der Länge des Übergabe-Strings. Syntax
2 Dezimalstellen
10
158
Unterprogramme
Defaults
Rückgabe Länge des Übergabe-Strings. Beispiele F#LENGTH
/*REXX */ x.
1=
'
1
10.7.36
LINESIZE
Bedeutung Non-SAA-Function
Ermittlung und Rückgabe der für die Datenausgabe maximal tenzahl des aktuellen 3270-Bildschirms.
zur
Verfügung stehenden Spal-
Syntax »-LINESIZE ()
-M
159
10.7 Builtin Functions Defaults
Rückgabe Bildschirmbreite -1 (z.B. bei Emulation 132-spaltigem Terminal: 131).
von
80-spaltigem Terminal: 79; bei
Emulation
von
Beispiele F#LINESZ
LISTDSI
10.7.37 Bedeutung
TSO/E External Function
Erzeugung von reservierten Variablen mit Informationen über den Zustand einer Datei.
Voraussetzungen Die Datei muss sequentiell DD-Name
muss
sie
zuvor
oder partitioned auf Platte existieren. Im Fall einer Angabe über mit dem TSO-Command ALLOC bereitgestellt worden sein.
160
10
Unterprogramme
Syntax »-LISTDSI (
dsn
I-ermittlunq .ttlung —T
ddname
rectory
-fileordsn
—I Lrecall —I I—smsinfo —T
)
-M
Defaults
ermittlung
Ermittlung des DSN über den Catalog.
fileordsn
LISTDSI erwartet eine
directory
NODIRECTORY
recall
HSM-Recall nur,
smsinfo
NOSMSINFO
wenn
DSN-Angabe und keinen die Datei auf DASD
DD-Namen.
migriert ist.
Rückgabe Return Code
0 4
16
Beschreibung LISTDSI erfolgreich. DSN-Informationen in SYS-Variablen gespeichert. LISTDSI erfolgreich. DSN-Informationen teilweise gespeichert. Alle Infos, außer PO-Directory-Angaben sind gültig. LISTDSI nicht erfolgreich. Keine SYS-Variable außer SYSREASON ist gültig. SYSREASON enthält den Reason Code. -
-
10.7 Builtin Functions
161
Beispiel F#LSTDSI
/*REXX */ fc=listdsi(1RZ.TEST.CNTL
DIRECTORY
RECALL SMSINFO
Ausgabe: say sysdsname say sysvolume say sysunit say sysdsorg say sysrecfm say syslrecl say sysblksize say syskeylen say sysalloc say sysused say sysusedpages say sysprimary say sysseconds say sysunits say sysextents say syscreate say sysrefdate say sysexdate say syspassword say sysracfa say sysupdated say systrkscyl say sysblkstrk say sysadirblk say sysudirblk say sysmembers say sysreason say sysmsglvll say sysmsglvl2 say sysdssms say
say say
sysdataclass sysstorclass sysmgmtclass
RZ.TEST.CNTL USER0 5 3390 PO FB
80 27920 0 18
N/A 208 14 15 TRACK 4
2001/082 2004/239 0 NONE GENERIC YES 15
N/A "I
"NO_LIM N/A
©
111_ 0000
DATA_LIBRARY
C-x BASE STANDARD
©
)
10
162
Die LISTDSI-Parameter steuern die Suche der Datei sowie die
Unterprogramme
Menge der Informationen.
LISTDSI-Parameter: Angaben
Parameter
dsn oder 'RZ01.T.CNTL' oder T.CNTL
ermittlung
Bedeutung MVS-Dataset-Name. Fehlt er, müssen die Parameter ddname und fileordsn gefüllt sein. Bei Angabe ohne Einkleidung in Hochkommata wird als First Level Qualifier der TSOPrefix benutzt. Das ist auf den meisten Installationen die TSO-UserlD des Benutzers. ...
bezieht sich
nur
auf Parameter dsn.
DSN wird über den
Catalog ermittelt.
VOLUME(volser)
DSN-Ermittlung über die Volume Serial Number.
angegebene
PREALLOC
DSN-Ermittlung statt über Catalog Search über vorherige Allocation. -
-
DD-Name einer
ddname oder
z.
B.
EIN
fileordsn
oder FILE
directory
mit ALLOC
bereitge-
stellten Datei. Fehlt die Angabe, muss Parameter dsn angegeben sein und fileordsn darf nicht mit gefüllt sein. muss immer gefüllt sein, wenn ddname mitgegeben wurde; bleibt ungefüllt, wenn Parameter dsn mitgegeben wurde. ...
DIRECTORY
Mit PO-Directory-Info (Offnet die PO-Datei und ist somit weniger performant.).
NODIRECTORY
Ohne
PO-Directory-Info.
RECALL
migriert: Recall nur von DASD. Falls Datei migriert: Kein Recall. Falls Datei migriert: Recall.
NOSMSINF
Ohne SMS-Info.
SMSINFO
Mit SMS-Info.
recall
Falls Datei NORECALL
smsinfo
zuvor
10.7 Builtin Functions
163
LISTDSI erzeugt bis zu 33 reservierte Variablen im Variablenpool und füllt sie mit Informazur weiteren Administration bedeutsam sind. Alle erzeugten Variablen beginnen mit dem Prefix SYS.
tionen, die
Von LISTDSI erzeugte Variablen (1): Variable
Bedeutung
SYSDSNAME
DSN der mit LISTDSI untersuchten Datei
SYSVOLUME
Name des
SYSUNIT
Einheitentyp (Üblicherweise wegen 3390-Emulation: 3390).
SYSDSORC
Dataset-Organisation: PS Physical Sequential PSU Physical Sequential DA Direct Access Org. DAU Direct Access Org. IS Indexed Sequential ISU Indexed Sequential PO Partitioned Organized POU Partitioned Organized VS ???
SYSRECFM
Platten-Volumes, auf dem die Datei residiert.
U F V FB FBA FBM FBS VB VBA VBM VBS ?????
-
unmovable unmovable
unmovable
(hier die gängigsten Formate)
Undefined Length Records (f. Load Modules); Fixed Length Records; Variable Length Records; Fixed Length Records Blocked (f. Quellcode); wie FB, aber 1. Byte ist ANSI-Vorschub*'; wie FB, aber 1. Byte ist Machinecode-Vorschub; wie FB, aber mit Spanned Records; Variable Length Records Blocked; wie VB, aber 1. Byte ist ANSI-Vorschub; wie VB, aber 1. Byte ist Machinecode-Vorschub; -
-
wie
VB, aber mit Spanned Records;
Unbekannt.
Bedeutung: blank =
unmovable
VSAM Unbekannt
Record-Format:
'
(ohne Hochkomma).
3
Zeilen,
+
=
=
1 Zeile
Vorschub, 0 2 Zeilen, =
Vorschubunterdrückung,
1
=
Neue Seite;
10
164
Unterprogramme
Von LISTDSI erzeugte Variablen (2): Variable
Bedeutung
SYSLRECL
Logical Record Lenth (Logische Satzlänge). Bei Quellcode-Dateien: meist 80, bei Lademodul-Dateien: 0. Ist das Record-Format variabel, stehen dem Programmierer die ersten 4 Bytes jedes Satzes nicht für Daten zur Verfügung. Die sind für das RDW (Record Descriptor Word) reserviert und geben Auskunft über die aktuelle Satzlänge.
SYSBLKSIZE
Blocksize (Physische Satzlänge) nur bei geblockten Sätzen. Die ideale Blocksize, in Abhängigkeit von der LRECL und UNIT, wird heute beim Neuanlegen meist vom System automatisch ermittelt. Wird sie explizit angegeben, so darf sie die 32-KB-Grenze nicht überschreiten. Sie ist bei FB-Sätzen ein exaktes Vielfaches der LRECL und bei VB-Sätzen ein Vielfaches von LRECL + 4 (für das Block Descriptor Word zur Blocklängenbeschreibung). -
SYSKEYLEN
Länge des Schlüssels.
SYSALLOC
Allocierter Platz z.B.: 18.
SYSUSED
Tatsächlich benutzter Platz, z.B.: 16. Bei PO-PDSE-Bibliotheken kommt: „N/A", da deren Platzbelegung in Pages gemessen wird. Siehe SYSUSEDPAGES.
SYSUSEDPAGES
Tatsächlich benutzter Platz in
SYSPRIMARY
Primary Allocation (in Space Units), z.B.:
SYSSECONDS
Secondary Allocation (in Space Units), z.B.:
SYSUNITS
Space Units: CYLINDER TRACK BLOCK ???????
SYSEXTENTS
(in Space Units, herkömmlich in TRACKS)
Pages zu je 4096 KB, z.B.: 208. 14. 15.
1 CYLINDER 15 TRACKs 1 TRACK 56.664 Bytes (3390-3) Angabe in Blöcken =
=
Unbekannt
Anzahl allocierter Extents (bei PS und PO maximal 16; bei PDSE und VSAM maximal 123, wenn Single-Volume-DSN und bis zu 255, wenn Multiple-Volume-DSN).
10.7 Builtin Functions
165
Von LISTDSI erzeugte Variablen
(3):
Variable
Bedeutung
SYSCREATE
Erstellungsdatum in der Form jjjj/ttt, wobei ttt= von 001-366.
SYSREFDATE
Tag der letzten Benutzung in der Form jjjj/ttt.
SYSEXDATE
Verfalldatum in der Form jjjj/ttt. Beachten Sie, dass das Verfalldatum kein automatisches Löschen nach sich zieht, sondern nur den Sonderparameter PURGE verlangt, wenn vor dem Verfalldatum gelöscht wird.
Beispiel:
SYSPASSWORD
"DELETE
'A.B.C
PURGE"
Passwort-Indikator; bei RACF-geschützten Dateien immer:
„NONE". Andere Optionen wären „READ" bzw. „WRITE", je nachdem, ob ein Lese- oder Schreibpasswort verlangt wird. SYSRACFA
Dateischutz-Indikator des RACF:
GENERIC
Schutz durch
generisches Profil.
(heute üblich; 1 Profil für n DSN) Schutz durch diskretes Profil.
DISCRETE
(zu aufwendig; 1 Profil für 1 DSN) NONE SYSUPDATED
Kein RACF-Schutz.
Change-Indikator: YES für DSN
updated; NO für DSN not updated.
SYSTRKSCYL
Tracks pro Cylinder. Bei 3390 Modellen: 15. Ältere Modelle werden heute kaum emuliert.
SYSBLKSTRK
Blöcke pro Track. Bei PDSE: „N/A", da Blocksize ein Track überspannen kann.
SYSADIRBLK
Nur bei LISTDSI-Parameter-Angabe „DIRECTORY". Allocierte Directory-Blöcke (zu je 256 Bytes). Bei PDSE: „NO LIM", da dynamische Verwaltung.
SYSUDIRBLK
Nur bei LISTDSI-Parameter-Angabe „DIRECTORY". Tatsächlich benutzte Directory-Blöcke (zu je 256 Bytes). Bei PDSE: „N/A", da dynamische Verwaltung.
SYSMEMBERS
Nur bei LISTDSI-Parameter-Angabe „DIRECTORY". Anzahl der Members, wenn DSN eine PO-Datei ist.
10
166 Von LISTDSI
Unterprogramme
erzeugte Variablen (4): Bedeutung
Variable
code. Siehe Reason Code Tabelle.
SYSREASON
LISTDSI
SYSMSGLVL1
Bei LISTDSI-Fehler:
First-Level-Message.
SYSMSGLVL2
Bei LISTDSI-Fehler:
Second-Level-Message.
SYSDSSMS
SMS-Angabe über die Datei: Wenn die DSNTYPE-Angabe nicht vorhanden ist:
reason
PS-Datei PO-PDS-Datei PO PDSE-Datei
SEQ PDS PDSE
(Partitioned DataSet Extended)
ansonsten:
leere PDSE-Datei LIBRARY PROGRAM LIBRARY PDSE-Program-Library DATA LIBRARY PDSE-Data-Library SYSDATACLASS
Nur bei LISTDSI-Parameter-Angabe „SMSINFO". Name der Data Class, die der Datei im Catalog zugeordnet ist. Hinter dem Namen verbergen sich, insbesondere die für die
Datei
(DCB ACB
geltenden, DCB-/ACB- und Space-Angaben.
Data Control Block: LRECL, RECFM, BLKSIZE, Access Control Block; Aufbau bei VSAM-Dateien )
=
=
SYSSTORCLASS
Nur bei LISTDSI-Parameter-Angabe „SMSINFO". Name der Storage Class, die der Datei im Catalog zugeordnet ist. Hinter dem Namen verbergen sich, insbesondere die für die Datei geltenden, Anforderungen an das Speichermedium, z.B. die Direct Respons Time. Über die Storage Class wird die Verbindung zur Storage Group hergestellt, wo die zu verwendenden Device Units aufgeschlüsselt sind.
SYSMGMTCLASS
Nur bei LISTDSI-Parameter-Angabe „SMSINFO". Name der Management Class, die der Datei im Catalog zugeordnet ist. Hinter dem Namen verbergen sich, insbesondere die für die Datei geltenden, Backup- und Migrationsregeln.
167
10.7 Builtin Functions
Endet LISTDS1, wird in SYSREASON ein Code gespeichert, der Auskunft über den Erfolg oder die Art des Fehlers gibt. SYSMSGLVL2 wird auf die System-Message IKJ584xxI gesetzt, wobei xx der Reason Code ist. LISTDSI-Reason-Code-Tabelle (1): Reason
Bedeutung
Code
Normales Ende. Error:
Parsing (Syntax).
Error:
Dynamic Allocation.
Error:
Dataset-Typ kann nicht verarbeitet werden.
Error: UNIT kann nicht
Error: DSN nicht
festgestellt werden.
katalogisiert.
Error: Dateiname kann nicht ermittelt werden. Error: Device
Type kann nicht gefunden werden.
Error: DSN residiert nicht auf einem DAS D-Volume. Error: DSN ist
migriert, aber „NORECALL" wurde angegeben.
11
Error: DIRECTORY wurde
12
Error: VSAM-DSN werden nicht unterstützt.
13
Error:
14
Error: Device
17
Error:
18
Error: DSN-Info konnte
19
Error: DSN residiert auf mehrere Volumes verteilt
20
Error: Device
angegeben, aber Berechtigung fehlt.
Open Error. Type im UCB nicht gefunden. System- oder User-AbEnd (Abnormal End) aufgetreten.
Type in
nur
EDT
teilweise zur Verfügung gestellt werden.
(Multi-Volume-DSN)
(Eligible Device Table) nicht gefunden.
168
10 Unterprogramme
LISTDSI-Reason-Code-Tabelle (2): Reason
Bedeutung
Code
21
Error:
22
Error: Volume ist nicht gemounted.
23
Error: Permanenter I/O Error auf dem Volume.
24
Error: Dataset nicht gefunden
25
Error: DSN auf Non-DASD
(Direct Acces Storage Device) migriert.
26
Error: DSN auf MSS (Mass
Storage Device).
27
Error: Keine Volume-Serial-Nummer ist für den DSN allociert.
28
Error: DD-Name falsch (1-8 Zeichen,
29
Error: Weder DD-Name noch DSN
30
Error: DSN ist nicht SMS
31
Error: ISITMGD-Macro-Fehler. Genaueres in SYSMSGLVL2.
32
Error: DFSMS/MVS hat inkorrektes Level. Keine SMS-Info
33 34
Catalog Error.
(Haben Sie sich vertippt?).
Beginn: alpha, Rest: alphanum).
angegeben.
managed.
möglich. Error: DFSMS/MVS ist nicht aktiv. Keine SMS-Info möglich. Error: DFSMS/MVS Open Error. Keine SMS-Info möglich.
35
Error: DFSMS/MVS. Unerwarteter Fehler vom Service IGWFAMS.
36
Error: DFSMS/MVS. Unerwarteter Fehler vom SMS Service Modul.
Anmerkung Die Dokumentation der Fehlermeldungen vom Typ „IKJ584xxI" ist im IBM-Handbuch „z/OS TSO/E Messages" detailliert beschrieben.
unter
Anhand
folgenden Szenarios sei die praktische Bedeutung von LISTDSI demonstriert:
Jede Nacht soll ein REXX-Programm laufen, das eine besonders häufig zugegriffene CobolPO-Bibliothek auf ihren Füllungsgrad prüft und gegebenenfalls reorganisiert. Denn am nächsten Tag sollen die Programmierer ohne technische Probleme damit weiterarbeiten. DerEinfachheit halber sei angenommen, die Cobol-Datei sei eine PDSE-Bibliothek, so dass
10.7 Builtin Functions
169
„Compress" und eine Prüfung auf SYSUDIRBLK (used directory blocks) entfällt. Reorganisieren soll hier bedeuten, dass eine neue Datei mit mehr Platz angelegt wird, alle Members der alten Datei herüberkopiert, die alte Datei anschließend gelöscht und die neue auf den Namen der alten PO-Bibliothek umbenannt wird. Das Coding könnte so aussehen: ein
POREORG
/*
REXX
alte
*/
"'RZ.TEST.COBOL'" neue "'RZ.TEST.COBOL.TEMP 1 " c=listdsi(alte 'DIRECTORY' 'SMSINFO') if c 0 then do if sysextents >= 5 then call reorg else say 'Reorganisation unnoetig. Extents=' sysextents end else say 'LISTDSI' c sysreason sysmsglvll sysmsglvl2 exit =
=
=
reorg:
="storclas("sysstorclass")" /* regelt UNIT,VOL */ ="mgmtclas("sysmgmtclass")" /* regelt Migration+Backup*/ dc ="dataclas("sysdataclass")" /* regelt SPACE und DCB */ pri= sysprimary+(sysextents-1)*sysseconds /*neu primary */ sec= sysseconds*2 /*neu sekondary*/ "ALLOC DD(SYSIN) REU DUMMY" /*Dflt:Copy all*/ REU DSN(*)" "ALLOC DD(SYSPRINT) /*Protok.: 3270*/ sc
mc
DD(SYSUTl)
"ALLOC
if
re
=
SHR REU DSN("alte")" 0 then "ALLOC DD(SYSUT2) NEW CATALOG REU", "DSNC'neue") " sc mc de "DSNTYPE (LIBRARY)
" ,
"SPACEC'pri sec")" sysalloc if if if if if
rc
=
rc
=
rc
=
rc
=
rc
=
0 0 0 0 0
return rc
then then then then then else
/*Kopiert
"IEBCOPY" "FREE
SYSUT1 nach
SYSUT2*/
DD(SYSIN SYSPRINT SYSUT1 SYSUT2)"
"DELETE" "RENAME"
alte neue
alte
say 'Reorganisation erfolgreich' say 'Fehler bei TSO-Command' sysvar(syspcmd)
10
170
Unterprogramme
MAX
10.7.38
Bedeutung größte der als Übergabe-Argumente mitgegebenen Zahlen zurück.
Gibt die
Syntax
Rückgabe Die größte
als
Argument übergebene Zahl. Maßstab ist die Zahlengerade. -
-
Maximum Nur bis zu 20 numerische, durch Komma getrennte doch besteht die Möglichkeit der Schachtelung.
Beispiel F#MAX
/*REXX*/ Zl=0.2;z2=-45.7;z3=5.324 say max(zl,z2,z3)
5 324
z4
93
=
2;z5 93;z6 =
=
-80 8
say max(zl,z2,z3
.
,
,
max(z4,z5,z6)) say max(zl*10,length(z3)) exit
.
5
Argumente sind
pro MAX erlaubt. Je-
171
10.7 Builtin Functions
MIN
10.7.39 Bedeutung
Gibt die kleinste der als
Übergabe-Argumente mitgegebenen Zahlen zurück.
Syntax MIN (
Rückgabe
Die kleinste
i als
expr
-L-)
+4
Argument übergebene Zahl. Maßstab ist die Zahlengerade. -
-
Maximum Nur bis zu 20 numerische, durch Komma getrennte besteht die Möglichkeit der Schachtelung.
Argumente sind pro MIN erlaubt. Jedoch
Beispiel F#MAX
/*REXX*/ -4 5.7;z3 min(zl,z2,z3) say
zl 0.2 ; z2 =
z4
=
2;z5 93;z6 say min ( zl, z2 =
=
=
,
=
5 3 24 .
c
-80 8 z3 , , .
min(z4,z5,z6)) say min(zl*10,length (z3)) exit
-45.7
-80 8 2
.
10
172
Unterprogramme
MSG
10.7.40 Bedeutung
TSO/E External Function
Steuert, ob TSO/E Messages
gibt den
vorherigen
Status als
TSO/E-Commands Rückgabewert zurück von
am
Bildschirm
angezeigt werden
und
Syntax * -MSG(
—-r—)
'—option Rückgabe ON
Wenn
-M
-I
umgeschaltet wurde. Wenn von OFF auf ON umgeschaltet wurde.
OFF
von
ON auf OFF
Beispiele F#MSG
/* x
REXX =
*/
msg('OFF')
/*Ab jetzt: Keine Messages
x:
ON
*/
-
"DELETE
=
"
diese Datei käme: "DATASET RZ.TEMP.DATA DELETED" sie nicht käme: "DATASET RZ.TEMP.DATA NOT FOUND"*/ x: OFF*/ /*Ab jetzt: Wieder Messages msg(x)
/*Gab gab x
'RZ.TEMP.DATA1
es
es
-
exit
Option können Sie entweder ON, OFF oder einen Null-String übergeben. ON schaltet Messaging um, OFF schaltet Messaging aus. Rückgabewert ist der vorherige Zustand. Null-String verändert nichts, gibt aber den aktuellen Zustand zurück. MSG(OFF) verwenden Sie kurz vor einem TSO-Command, das Meldungen ausgibt, die der Benutzer nicht sehen soll oder will, wie z.B. die Message: „DATASET x.y.z DELETED", die vom DELETE-Command verursacht wird gerade wenn es sich nur um eine gelöschte Arbeitsdatei handelt. Aber auch Meldungen von LISTDSI(...) und anderen TSO/E-Commands und TSO/E-Functions können Sie damit verhindern. Ein Umschalten ist jederzeit möglich. Als auf Ein
-
173
10.7 Builtin Functions
10.7.41
MVSVAR
Bedeutung TSO/E External Function
(auch in Non-TSO-Adressräumen aufrufbar)
Ermittlung und Rückgabe von Informationen über TSO, MVS und die aktuelle TSO-Session. Syntax >>_MVSVAR(thema)
Rückgabe
Informationen
zu
einer bestimmten
MVS-Einstellung; siehe Tabelle MVSVAR-Argumente.
Beispiele F#MVSVAR
/*
REXX
if
mvsvar(sysname)
*/
'MVST1' then do 'Ich laufe say gerade auf dem System' mvsvar(sysname) 'Version' mvsvar(SYSOPSYS)'/*z/OS 01.01.00 JBB7713*/ say =
end
exit
Die Function MVSVAR liefert bis zu 11 themenabhängige Informationen, die sowohl zur Information des Benutzers als auch zur REXX-Exec-Ablaufsteuerung eingesetzt werden. MVSVAR ist nicht nur unter IKJEFT01, sondern auch in Non-TSO-Address-Spaces, wie z.B. unter IRXJCL, einsetzbar.
174 Die
10
Unterprogramme
folgenden Argumente können übergeben werden:
MVSVAR-Tabelle(l): Argument SYSAPPCLU
Bedeutung
Name der APPC/MVS LU, die den TSO/E-Adressraum identi-
fiziert.
(APPC Advanced Program to Program Communication =
Multiple Virtual Storage Logical Unit) Rückgabe: LU-Name als Character String ohen leading/trailing Blanks. Nullstring, wenn keine APPC-Aktivität im Adressraum MVS LU
=
=
herrscht oder kein LU-Name Services verwendet wird. SYSDFP
von
Level des MVS/DFP. Format:
den Advanced TP Callable
cc.vv.rr.mm
(DFP Product) Komponente (00: pre-DFSMS/MVS; höhere Zahl: DFSMS) vv Version; rr Release; mm Modification Level. =
cc
Data Facility
=
=
=
=
Beispiel: 03.01.05.00. SYSMVS
Level des MVS BCP. Format: ccn.n.n gemäß Feld CVTPRODN in der CVT. (BCP Base Control Program; das eigentliche MVS CVT Common Vector Table) Beispiel: SP7.0.5 für z/OS 1.5. =
=
SYSNAME
Name des Systems, auf dem die REXX-Exec gerade läuft, so wie er verwendet wird in einem Multi System GRS (Global Resouce Serialisation); einem MCS (Multiple System Console); SYSLOG. Beispiel: SYS1. ...
...
...
10.7 Builtin Functions
175
MVSVAR-Tabelle (2): Argument
Bedeutung Informationen über das z/OS. Format: name vv.rr.mm FMID. (vv Version; rr Release; mm Modification Level; FMID=Function Modification Identifier) Beispiel: z/OS 01.05.00 HBB7708. Anmerkung: SYSOPSYS wurde erst ab TSO/E 2.5 mit APAR OW17844 eingeführt. Bei älteren TSO-Ständen ist der Rückgabewert ein Null-String.
SYSOPSYS
=
SYSSECLAB
=
Name des
=
RACF-Security-Labels der TSO-Session. Fehlt die
Information, z.B. weil RACF nicht installiert ist, ist der Rück-
gabewert ein Nullstring. SYSSMFID
Identifikation des Systems, auf dem SMF aktiv ist. Die Angabe entspricht dem SID-Eintrag in „SYSl.PARMLIB(SMFPRMxx)" und ist häufig derselbe Name wie in SYSNAME.
SYSSMS
Indikator, der Auskunft gibt, ob DFSMS/MVS available ist: ACTIVE SMS steht zur Verfügung und ist aktiv. INACTIVE SMS ist grundsätzlich available, aber nicht aktiv. UNAVAILABLE steht dem System gar nicht zur Verfügung. =
=
=
SYSCLONE
1-2-Byte Kurzform des Betriebssystem-Namens in einem SYSPLEX (System Complex), wie er im SYSCLONE-Eintrag von „SYSl.PARMLIB(IEASYSxx)" festgelegt wurde, z.B: Sl. Ohne SYSCLONE-Eintrag ist die Rückgabe ein Null-String.
SYSPLEX
Name des MVS-Sysplex, wie er in „SYS 1 .PARMLIB(LOADxx)" bzw. in „SYSl.PARMLIB(COUPLExx)" eingetragen ist (max. 8 Characters). Fehlt der Eintrag, ist die Rückgabe ein Null-
String. Beispiel: '
SYMDEF1
,def
EDUCMVS.
Werte, wie sie in „SYSl.PARMLIB(IEASYMxx)" mit SYSDEF bzw. SYMDEF firmenspezifisch festgelegt wurden. Der Aufruf: ...
x
MVSVAR('SYMDEF', 'SYSRES') könnte beispielsweise den Wert VOL017 nach x übertragen.
=
...
Anmerkung:
SYSCLONE, SYSPLEX und SYMDEF setzen einen SYSPLEX und MVS ab SP5.2.0
voraus,
ohne die MVSVAR mit einem
entsprechenden Fehler abbricht.
176
10.7.42
10
Unterprogramme
OUTTRAP
Bedeutung TSO/E External Function
Zeilenweises Abfangen von Terminal Output, der von TSO-Commands normalerweise auf den Bildschirm ausgegeben wird. Jede Zeile wird in eine (Compound-) Variable umgelenkt.
Syntax »-OUTTRAP (
r-OFF stem
max
-I
1—
concat
—1
Defaults max
999.999.999. Ist max größer, werden die überschüssigen Zeilen nicht in Variablen übertragen, sondern gehen als Output auf den Bildschirm.
concat
CONCAT
Rückgabe Name des Werts in stem bzw. des Werts OFF.
Wie auch bei anderen TSO/E External Functions liegt bei OUTTRAP die Hauptaufgabe nicht im Beschaffen des Rückgabewerts, der an die Stelle des Funktionsaufrufs tritt, sondern im Erzeugen von Variablen. Anders als bei LISTDSI sind es aber keine reservierten Variablen mit fest vorgegebenem Namen, sondern vom Benutzer über die Angabe in stem festgelegte Variablennamen. Darüber hinaus bleibt eine einmal aufgestellte BildschirmausgabeFalle (Trap Falle) solange aktiv, bis sie mit OUTTRAP('OFF') „entschärft" wird. OUTTRAP ermöglicht, Informationen, die mit Hilfe des PUTLINE-Makros erzeugt werden, =
im Programm weiter zu verarbeiten. Das ist eine der Grundlagen für die Massenverarbeitung in der Systemadministration und überall dort, wo Datenbanken, Dateien, Members erzeugt, gelöscht, umbenannt, gedruckt, versandt oder inhaltlich verändert werden.
10.7 Builtin Functions
177
Der Parameter stem ist entweder ein Compound-Variablen-Stem (zum Beispiel: ZE1) oder nur ein Variablen-Präfix (zum Beispiel: ZEI). Ein abgefangener TSO-Command-Output wird Zeile für Zeile in Variablen gestellt, deren Präfix der stem und deren Suffix eine ab 1 fortlaufend hochgezählte Zahl ist. Es ist sehr ratsam, für den Parameter stem einen tatsächlichen Stem-Namen (Name, der mit einem Punkt endet) anzugeben, da die Weiterverarbeitung mit Laufvariablen weit angenehmer ist, als bei normalen Variablen. Als stem-Angabe OFF zu verwenden ist nicht ratsam, da OFF immer als Outtrap-Abschalte-Anweisung interpretiert wird.
Ist der Parameter NOCONCAT angegeben, wird im Falle der Ausführung mehrerer TSOCommands hintereinander pro TSO-Command ab 1 neu gezählt. Das kann unerwünschte Ergebnisse bringen, berücksichtigt man, dass als zusätzlicher Service in der Variable mit dem Suffix 0 die Gesamtzahl der gerade abgefangenen Zeilen gespeichert wird. Besser und in der Praxis meist angewandt ist das Verwenden von CONCAT. Dabei wird der Output von hintereinander abgesetzten TSO-Commands kumuliert und die Gesamtsumme der abgefangenen Zeilen in die Variable mit Suffix 0 gestellt. -
-
Beispiele F#OUTTRl
/* x
*/ outtrap('zei. )
REXX
1
=
ENTRIES('RZ.KSDS.ARTIKEL 1) outtrap(1 OFF 1)
"LISTC x
=
do I
=
ALL"
1 to zei.O
.../* Analyse zeilenweise und anschl. Weiterverarbeitung*/
end exit
Auf den Parameter max kann man normalerweise verzichten. Eine Zahl anzugeben, die das Abfangen auf eine bestimmte Menge Zeilen begrenzt, würde den Output teilweise ausgeben und teilweise speichern. Das tut man nur in besonderen (Test-) Fällen. OUTTRAP fängt neben TSO-Command-Processor-Output auch solchen ab, der durch REXX-Execs mit SAY erzeugt wird: -
F#OUTTR2
/* x
*/ outtrap('zei.'
REXX =
"%P1234" x
=
exit
outtrap(1 OFF 1)
Command-Output
-
P1234
/*
REXX
say say say
exit
*/
00345 Schraube 00346 Stift 00347 Mutter... .
.
.
10
178 Anhand des
Unterprogramme
folgenden Massen-Change sei die Mächtigkeit von REXX demonstriert:
F#OUTTR3
/*
*/
REXX
say 'Aendern aller Libraries mit diesem DSN-Level:' parse upper external lev say 'Bitte gib alten Begriff an:' external alt parse
say 'Bitte gib neuen Begriff an:' external neu parse address ispexec "vput ("alt neu") x
outtrap(zei.)
=
"liste lvlC'lev")" x
outtrap(off)
=
do i
=
1 to zei.O
by
2
shared" /*Vars sichern */ /*DSN-Falle aufstellen */ /*Bringt alle DSN mit best. Level */ /*DSN-Falle aus */ Zeile im 2. 3. Wort... */ /*In jeder
datei zei.i parse "'"datei"'" /*...den DSN in Hochkomma kleiden */ dateiq call memver dateiq /*...und ab zur Einzelverarbeitung*/ end var
.
.
=
exit
procedure dateiq x outtrap(zei.) "listds" dateiq "st h m" /*Wenn PO, x outtrap(off)
MEMVER:
parse upper arg =
ab Z.7:
1.
Membername*/
=
if zei.O
>
6 then do i
=
7 to zei.O
=strip(zei.i) /*leading/trailing Blanks entfernen*/ dsnq=strip(dateiq,'T',"'")!!"("!!mem!!")'" /*'DSN(MEM)'*/ address 'ISPEXEC' "EDIT dataset("dsnq") macro(AENDERN)"
mem
end
/*
pro Member: Editoraufruf mit
Initial-Macro-Verarb.*/
return
AENDERN
/*
REXX
address
*/ 'ISREDIT'
"MACRO"
address "C" alt "END" EXIT
'ISPEXEC "ALL"
neu
/* Adress-Env.: Interpreter des Editor */ /* Kennzeichnung einer Exec als Macro */ "VGET (alt neu) SHARED" /* Var. abholen*/ /* Change all von altem auf neuen Wert */ */ /* PF3 incl Abspeichern: Vorsicht!!! !!! /* Wegen "END" vollautomatisch */
179
10.7 Builtin Functions
Erläuterung des obigen Beispiels: Nach der Erfassung des DSN-Levels (Level:
1 bis n DSN-Qualifier ohne Last Level QualiLVL Dataset-Namen nicht akzeptiert), werden gleich der alte einen ganzen fier, da LISTC und der neue Data String erfasst. Auf die Data Strings wird das Edit-Makro AENDERN zurückgreifen. Da eine Parameterweiterreichung vom Hauptprogramm an das Makro (via Upro MEMVER, und dem ISPF-Editor) am Editor scheitert, werden die Variablen „alt" und „neu" von der Hauptroutine F#OUTTR3 mit VGET in den ISPF-eigenen SHARED Pool
kopiert. Das aufgerufene LISTC-Command produziert Output, der z.B. so aussieht:
normalerweise pro DSN einen
zweizeiligen
NONVS7AM-RZ. TEST. COBOL -U.CAT01 IN-CAT NONVSAM-RZ TEST CNTL IN-CAT -U.CAT01 .
.
Mit einem schleifengesteuerten PARSE wird aus jeder ungeraden Zeile das 3.Wort, nämlich der DSN, gefiltert. Nachdem er, in Hochkommata gekleidet, für das TSO-Command LISTDS (nicht zu verwechseln mit der Function LISTDSI) präpariert ist, erfolgt der Aufruf an das Upro MEMVER, an welches der DSN als Argument übergeben wird.
MEMVER, das pro DSN gerufen wird,
setzt nach Abholen des DSN aus dem ARG-Bereich das TSO-Command LISTDS ab nicht ohne zuvor OUTTRAP aktiviert zu haben. Sie sollten wissen, dass der Output dann größer als 6 Zeilen wird, wenn die LISTDS-Parameter ST(atus) H(istory) M(embers) angegeben wurden, die Datei tatsächlich eine Bibliothek ist und mindestens mit einem Member bestückt ist. Deshalb: IF zei.O > 6 then do i 7 to zei.O. -
=
Pro Member wird nun der Editor gerufen. Das darf nicht mit dem TSO-Command EDIT, sondern muss mit dem ISPEXEC-Command EDIT geschehen, deshalb ist Präfix ADDRESS 'ISPEXEC nötig. Der Automatisierungstrick gelingt, indem die REXX-Exec AENDERN beim Editor-Aufruf als Edit-(Initial-)Macro angegeben wird. Jedes Initial Makro läuft ab, bevor der Benutzer die Kontrolle erhält. Und es kann alle Primary- und Line-Commands absetzen auch den ISPF Primary Command END, der normalerweise über die PF3-Taste eingegeben wird. Das allerdings führt zum Speichern und anschließenden Beendigen des Editors. Der Benutzer bekommt damit vom ganzen Editor-Aufruf nichts mehr mit, da der Editor noch vor der Benutzer-Kontrolle bereits beendet ist. Ohne „END" würde der Benutzer jedes geänderte Member am Bildschirm sehen und könnte mit der PF3-Taste bzw. der Eingabe von CANCEL selbst bestimmen, ob die Änderungen so bleiben sollen oder nicht. -
Beachten Sie, dass eine solche Massen-Anwendung wegen der enormen Auswirkungen gefährlich sein kann. Nur die Eingrenzung über das Level und natürlich die Beschränkungen des RACF bilden die Grenzen. Das gilt erst recht, wenn statt des Edit-/Edit-Macro-Aufrufs die TSO-Commands RENAME oder DELETE verwendet werden.
180
10
Unterprogramme
OVERLAY
10.7.43 Bedeutung
Gibt einen Gesamt-String zurück, der aus dem übergebenen Quell-String alt besteht, der durch den String neu ab Stelle n in der Länge len überlagert wird.
Syntax
Defaults n
1
len
Länge des Strings neu
pad
Blank
Rückgabe Gesamt-String,
bestehend aus: String neu, der String alt ab Stelle n überlagert. Betroffen sind n alte Zeichen. Aufgefüllt wird mit pad, sofern die Längenangabe len größer ist als die tatsächliche Länge von neu.
Beispiele F#OVER
/* REXX */ alt='//EIN
DD DSN=RZ.EKM'
say alt
llq= '.SICH(+1)1 sl overlay(llq,alt,20) =
say sl
slq=
'1'
s2
overlay(slq,sl,18)
=
//EIN //EIN //EIN
DD DSN=RZ.EKM DD
DD
DSN=RZ.EKM.SICH(+1) DSN=RZ.EGM.SICH(+1)
13:44:57
say s2 say overlay(113',time()) exit
r
f f (T ff
irirnnmr^
rtr~r~ii .
181
10.7 Builtin Functions
Einsatz,
Expressions (typischerweise eingelesene Sätze oder Funktionsergebnisse) ab einer bestimmten Stelle mit einem neuen Inhalt belegt werden sollen. Wenn Sie n nicht angeben, wird ab Stelle 1 überschrieben; lassen Sie len weg, erfolgt die
OVERLAY kommt
zum
wenn
Überlagerung in der Länge von neu.
len muss 0 oder eine positive Ganzzahl sein. 1st die Länge von neu größer als len, wird neu rechts abgeschnitten, bevor es über alt gelagert wird. Ist die Länge von neu jedoch kleiner als die Angabe in len, werden len Stellen von alt ersetzt und die Differenz mit dem (gegebenenfalls wiederholt verwendeten) Pad Character ersetzt. Das kann auch zu einer Verlängerung des ursprünglichen alt-Strings führen, wenn OVERLAY am Ende von alt durchgeführt wird: x
=
OVERLAY(101
,
'256 13
'
.
,7,5
' ,
0
'
) /* 256.1300000 */
(Natürlich wäre hier die Builtin Function FORMAT eine leichter nachvollziehbare Alternative.)
10.7.44
POS
Bedeutung Gibt die Position der Stelle im del-String herrscht.
Heuhaufen-String an,
ab der
Übereinstimmung mit dem Na-
Syntax > -POS
(nadel, heuhauf en
-1-1-) |_ start J
-M
,
Defaults 1
start
Rückgabe
keine Übereinstimmung, d.h., „Nadel im Heuhaufen nicht gefunden", Eine positive Ganzzahl n bedeutet, dass der Nadel-String ab Stelle n (von Heuhaufen-String vorkommt.
0 n
links) im
Beispiele F#POSl
/*
REXX
heuhl= x
=
x
=
x
=
x
=
exit
*/ 'Art
=
2356 Bl
pos('Ar',heuhl) pos('ar',heuhl) pos('B',heuhl) pos('B',heuhl,13)
=
/* /* /* /*
Fahrrad B2 1 35 12
25
*/ */ */ */
=
28"
Farbe
=
gelb'
182
10
Unterprogramme
POS erlaubt, in einem String (z.B. in einem gelesenen Datensatz) nach einem oder mehreren Zeichen zu suchen. Von der Default-Startposition 1 können Sie abweichen, wenn Sie nach Mehrfachvorkommnissen desselben Nadel-Strings suchen. Ein positiver, ganzzahliger Rückgabewert bedeutet Übereinstimmung ab Spalte n. Dabei ist der Bezugspunkt immer Spalte 1 und nicht etwa die Start-Spalte. Der Wert 0 wird zurückgegeben, wenn „nadel" nicht in „heuhaufen" vorkommt.
Hier ein
Beispiel für die Mehrfachsuche nach einem bestimmten Begriff in einem Satz:
F#POS2
/* h
=
n
=
S
=
wo
REXX */ '102375-SEPP MEIER 'EIER' 0 =
anz=
1
0
do until s
s
/* Startspalte vorbelegen
/*
0
=
/*
pos(n,h,s+1)
=
-
/* /*
'
/* if
s
>
0 then do wo !! ','s
wo
=
anz
=
anz
=
0
end else
s
+
1
82999-BEIERBRUNN'
-LEIERKASTENMANN
/* /* /*
/* Ende
von
DO UNTIL vorher.
end wo
=
strip(wo,'L1)
/* Führendes
Komma entfernen
say 'String-->' n say anz 'mal gefunden' if anz > 0 then say
exit
'Spalte(n):'
wo
*/
Fundort vorbelegen */ Zähler vorbelegen */ mindestens 1 Durchlauf */ Suche: Im 1. Lauf: Stelle 1, */ sonst 1 nach Fundort */ nadel in heuhaufen gefunden */ Stelle merken */ Zähler erhöhen */
String--> EIER 3 mal gefunden Spalte(n): 14,21,44
*/
183
10.7 Builtin Functions
10.7.45
PROMPT
Bedeutung
TSO/E External Function
Steuert, ob der Benutzer zu Ergänzungs-/Korrektureingaben aufgefordert werden soll,
ein TSO/E-Command in der REXX-Exec terbereich codiert wurde.
unvollständig
wenn
oder mit einem Fehler im Parame-
Syntax
Rückgabe
Wenn
von
ON auf OFF
OFF Wenn
von
OFF auf ON umgeschaltet wurde.
ON
umgeschaltet wurde.
Beispiele F#PROMPT
/* x
REXX =
*/
PROMPT('ON')
"LISTDS" x
=
exit
PROMPT(x)
/*Ab jetzt: Rückfrage
durch System ohne und andere Parms DSN /*Coding /*Ab jetzt: Zustand vor PROMPT(ON):
*/ */ OFF*/
Option können Sie entweder ON, OFF oder einen Null-String übergeben. ON schaltet auf Prompting um, OFF schaltet es aus. Rückgabewert ist der vorherige Zustand. Ein Null-String verändert nichts, gibt aber den aktuellen Zustand zurück. Ein Umschalten ist jederzeit möglich. Vorsicht ist geboten, wenn Sie Prompting aktivieren und der Datastack gefüllt ist. Denn dann holt das System die Benutzereingabe vorrangig vom Stack, statt vom Terminal. Hier könnten Sie mit dem Stackbefehl „NEWSTACK" entgegenwirken. Prompting wird auf dreierlei Weisen erreicht: Durch das TSO-Command PROFILE PROMPT (Gegenteil: NOPROMPT). Als Parameter beim expliziten Aufruf: EXEC 'X..Y.EXEC(P1) 'parm' PROMPT EXEC. Durch die Builtin Function: x=PROMPT('ON') (Gegenteil: OFF). Die Prompt-Einstellung via Function ist spezieller als die über den EXEC-Parameter und dieser spezieller als die allgemeine TSO-Profil-Einstellung. In
•
• •
184
10
10.7.46
Unterprogramme
QUEUED
Bedeutung Ermittelt die Gesamtzahl der Elemente des aktuellen Stacks.
Syntax »-QUEUED ()
-m
Defaults
Rückgabe n
Anzahl der Elemente des aktuellen Stacks.
Beispiele F#QUEUED
/*
REXX
queue queue queue
*/
'PGM00017 OP-Liste Debitoren plfegen 'PGM00019 Mahnungen schreiben 'PGM00025 Konsolidierung
Peter Jacob1 Ludwig Boeck1 Willi Hexamer'
185
10.7 Builtin Functions
10.7.47
RANDOM
Bedeutung Ermittelt eine
nicht-negative Zufallszahl und gibt sie zurück.
Syntax »-RANDOM ( max
X
min
Lmax _l L,seed _|
Defaults 0 min 999 max
Rückgabe
Nicht-negative Ganzzahl zwischen min und max. Beispiele F#RANDOM
/*
REXX
*/
say 'Ihre Glueckszahlen:' w=
'
'
do I w
1 to 6
=
=
end say w exit
w
random(1,49)
10
186
Unterprogramme
RANDOM dient der Generierung von Zufallszahlen. Wenn Sie min und max angeben, dürfen die beiden positiven Ganzzahlen um nicht mehr als 100.000 voneinander abweichen. Erlaubt ist 1,100001 genauso wie 1234,101234 oder 1000000,1100000. Negative oder dezimale Angaben sind unzulässig und fuhren zu einem Fehler. Um eine wiederholbare Sequenz von Ergebnissen einzuleiten, wird der Parameter seed angegeben. Er muss zwischen 0 und 999 999 999 liegen, seed geben Sie nur im ersten von mehreren aufeinanderfolgenden RAN DOM-Aufrufen an:
F#RAND01
/*
*/ random(1,6,12345) /*Einleitung der Wiederholbarkeit */ 1 to 9 do i /*Weitere 9 Versuche, reproduzierbar*/
x
REXX
=
=
immer wieder herstellbar, wenn derselbe seed-Wert Wert entstehen andere, wiederholbare Zufallszahlen. Beachten Sie, dass ein im Hauptprogramm gesetzter seed-Wert zwar für alle im Programm folgenden RANDOM-Aufrufe die Basis ist, nicht aber von RANDOM-Aufrufen in internen Unterroutinen übernommen wird.
Zufallszahlen-Generierung ist angegeben wird. Bei einem anderen Diese
10.7 Builtin Functions
187
REVERSE
10.7.48 Bedeutung Gibt den
Übergabewert, von rückwärts gelesen, zurück.
Syntax »-REVERSE
(expr)
-M
Defaults
Rückgabe sträwkcür noisserpxE
expr
Beispiele F#REVERS
/*
REXX 1
=
s.2
=
s
.
1
*/ Rudi Karber'
'STRESSED'
say reverse(s.l) say reverse(s.2) say reverse(time()) exit
rebraK iduR DESSERTS 15:92:90
10
188
10.7.49
Unterprogramme
RIGHT
Bedeutung Ermittlung und Rückgabe des rechten Teils des Übergabe-Strings. Syntax »-RIGHT
(expr, len
-M
L,Pad
Defaults
pad
Blank
Rückgabe Rechter Teil-String des Zeichen.
Übergabe-Strings
in der
Länge len, ggf.
links
aufgefüllt
mit
pad-
Beispiele F#RIGHT
/*REXX */ was='19.56'
say say say
right(was,6) right(was,6, '0 right('',6,'0')
'
19.56 019.56 000000
exit
/zDBBlIP RIGHT wird
OBB1
häufig in Verbindung mit den Functions LEFT und FORMAT eingesetzt, um Einzel-Strings spaltengerecht zu Datensätzen zusammenzustellen, die anschließend auf eine Datenhaltung, wie z.B. ein Member, eine sequentielle Datei oder eine DB2-Table wegge-
schrieben werden.
189
10.7 Builtin Functions Hier ein einfaches
Beispiel für die Zusammenstellung eines Ausgabesatzes:
F#RIGHT1
Nach dem
Assignment steht in satz. 1:
765401000000234 88 .
Menge
10.7.50
J
Preis
SETLANG
Bedeutung TSO/E External Function Steuert bzw. informiert über die
Syntax
Defaults
Sprache, in der REXX-Messages angezeigt werden.
10
190
Rückgabe
Zustand vor Veränderung bzw.
wenn
Unterprogramme
spra nicht angegeben ist, Info über aktuelle
Einstellung.
Beispiele F#RIGHT
SETLANG erlaubt, die REXX-Messages (meist Syntax-Fehlermeldungen) sprachlich zu steuern. Als Übergabeparameter erwartet SETLANG einen Sprachcode, um in der Folge Messages des REXX in der entsprechenden Sprache auszugeben. Return-Wert ist in diesem Fall die vorherige Einstellung. Fehlt die Angabe des Sprachcodes, erfolgt nur die Rückgabe der aktuellen Einstellung.
SETLANG-Sprachcode-Tabelle: Sprachcode CHS CHT DAN
DEU
Bedeutung
Chinesisch, simplified Chinesisch, traditional Dänisch Deutsch
ESP
Englisch (alles großbuchstabig) Englisch (klein- und großbuchstabig) Spanisch
FRA
Französisch
JPN
Japanisch
KOR
Koreanisch
PTB
Brasilianisch, Portugiesisch
ENP ENU
191
10.7 Builtin Functions
REXX-Message-Spracheinstellung nichts mit der TSO-Primary- bzw. (TSO-User Profile Table) zu tun hat. Der Einheitlichkeit -Secondary-Language wegen sollten Sie aber erwägen, die REXX-Messages in derselben Sprache zu wählen, wie Beachten Sie, dass die
der UPT
die TSO-Primary-Language. Die TSO-Primary-Language erfahren Sie entweder über das TSO-Command „PROFILE" oder die Function SYSVAR('SYSPLANG'). Der Defaultwert der REXX-Message-Spracheinstellung wird bei der Installation im Parameterblock des Parametermoduls unter dem Feldnamen LANGUAGE festgelegt. Details dazu finden Sie im Kapitel Characteristics of a Language Processor Environment" im TSO/E REXX-Reference der IBM.
10.7.51
SIGN
Bedeutung
Ermittelt, ob der übergebene Zahlenwert kleiner, gleich oder größer 0 ist.
Syntax »-sign(expr)
-H
Defaults
Rückgabe 0 -1 1
Übergabewert war 0. Übergabewert war eine negative Zahl. Übergabewert war eine positive Zahl.
10
192
Unterprogramme
Beispiele F#REVERS
/*
REXX */ 12 3 z.2 -5.07 z.3 0 000 1
z
=
.
.
=
=
.
say sign(z.l) say sign(z.2) say sign(z.3) exit
10.7.52 Bedeutung Liefert den
SOURCELINE
Quellcode einer bestimmten Zeile des gerade interpretierten REXX-Members.
Syntax
Defaults
Rückgabe Quellcode einer bestimmten Zeile bzw. 0, wenn ein Zugriff darauf nicht erlaubt ist. Fehlt das Argument n, dann wird immer die Nummer der letzte Programmzeile zurückgegeben
195
10.7 Builtin Functions
Defaults 1 len
Rückgabe Bisheriger Hauptspeicherinhalt ab Adresse addr. Im Fehlerfall: Null-String. Beispiel
CVT_2ASCB AS CBINHALT ASCB2ASXB ASXBADDR ASXBINHALT ASXB2ACEE ACEEADDR ACEEINHALT USERID DFLTGRP CGRPADDR CONN-GRP CONN-GRP CONN-GRP
Dieses
Ergebnis entstand
.
00F76900 ASCB F7696C 008FDE88 ASXB 8FDF50 008FF380 ACEE
RZ01 RZ 008FF500 SYS1 IT
SP
10
196
...
durch dieses
Unterprogramme
Beispiel:
F#STOR /*
REXX
*/
/*
NUMERIC DIGITS 15 ASCBA
ASCBI
=C2X(STORAGE(00000224,4)) =C2X(STORAGE(ASCBA,4))
FÜR HOHE ADRESSBEREICHE
;SAY 'CVT_2ASCB ;SAY 1ASCBINHALT
1
ASCBA
1
X2C(ASCBI)
ASCB2ASXB=D2X(X2D(ASCBA) + 108) ASXBA =C2X(STORAGE(ASCB2ASXB,4)) ASXBI =C2X(STORAGE(ASXBA,4))
SAY
'ASCB2ASXB
1
ASCB2ASXB
SAY
1ASXBADDR
1
ASXBA
SAY
'ASXBINHALT
1
X2C(ASXBI)
ASXB2ACEE=D2X(X2D(ASXBA) + 200) ACEEA =C2X(STORAGE(ASXB2ACEE,4)) ACEEI =C2X(STORAGE(ACEEA,4 ))
SAY
1ASXB2ACEE
'
ASXB2ACEE
SAY
1ACEEADDR
1
ACEEA
SAY
1ACEEINHALT
1
X2C(ACEEI)
SAY
'USERID
1
SAY
'DFLTGRP
1
STRIP(X2C(C2X(STORAGE(D2X(X2D(ACEEA) STRIP(X2C(C2X(STORAGE(D2X(X2D(ACEEA)
/*;SAY 'ACEE2CGRP ACEE2CGRP=D2X(X2D(ACEEA) + 116) ;SAY 'CGRPADDR CGRPA =C2X(STORAGE(ACEE2CGRP,4)) CGRPI /*;SAY 'CGRPINHALT =C2X(STORAGE(CGRPA,4 )) SAY
'CONN-GRP
1'
SAY
'CONN-GRP
2'
SAY
1CONN-GRP
3'
STRIP(X2C(C2X(STORAGE(D2X(X2D(CGRPA) STRIP(X2C(C2X(STORAGE(D2X(X2D(CGRPA) STRIP(X2C(C2X(STORAGE(D2X(X2D(CGRPA)
+
21
+
30
),8)))) ),8))))
1
ACEE2CGRP
1
CGRPA
'
X2C(CGRPI)
+
32
+
56
+
80
*/
*/
*/
),8)))) ),8)))) ),8))))
exit
STORAGE ist vor allem für Systemprogrammierer eine wirksame Builtin Function, wenn es darum geht, virtuelle Hauptspeicherbereiche ab einer bestimmten Hexadezimal-Adresse in einer bestimmten Länge zu analysieren. Beim Speicher ist zu unterscheiden in fetch protected, update protected oder nicht als gültige Adresse definierter Bereich. Das
Ändern durch Angabe des Arguments
führen. Deshalb seien Sie bitte Attribut SPECIAL ausgestattet sind.
raum
neu kann zu Speicherfehlern im eigenen Adressvorsichtig, insbesondere, wenn Sie mit dem RACF-
Systemprogrammierer finden im IBM-Manual „z/OS MVS Data entsprechenden Informationen über Speicheraufbau und Pointer-Verknüpfungen. Interessierte
Areas" die
10.7 Builtin Functions
10.7.55
STRIP
Bedeutung
Gibt den
197
am
Rand
um
ein bestimmtes Zeichen
abgestreiften Übergabewert zurück.
Syntax -STRIP(expr
)
Lwo —1
L
,
—M
J
zch
Defaults wo
B
zch
Blank
Rückgabe
entkleideter
Übergabewert
Beispiele F#STRIP
/* 1 x.2 x.
REXX =
=
*/
1
AI Bundy '00123.456000'
say '>'x.1''strip(x.1)''strip(x.1,'L' say '>'strip(x.1,'T1 ' say strip(x.2,, '0 ) exit
>
Al
Bundy
Bundy< >A1 Bundy > Al Bundy< >A1
123.456
STRIP erlaubt die Entfernung von Zeichen links, rechts oder pression. Im „Wo"-Argument können Sie das entscheiden: L (rechts) und B Both Sides. B ist Defaultwert. =
0 then, say 'Fehler auf'
sp,
substr(s,sp,1) end
exit
/ VERIFY erlaubt Ihnen eine beliebige Expression auf Vorhandensein bzw. Abwesenheit von bestimmten Zeichen zu prüfen. Aufgrund des opt-Werts N gibt die Function eine 0 zurück, wenn es kein Nomatch war, d.h., wenn alle Zeichen der zu prüfenden Expression expr auch
217
10.7 Builtin Functions in der Kontrollreferenz ref vorhanden sind. Eine positive Ganzzahl würde expr identifizieren, die ein unreferenziertes Zeichen beinhaltet.
diejenige Stelle in
Wenn Sie mit dem opt-Wert M prüfen, liefert die Function eine 0, wenn kein Match war und eine positive Ganzzahl, die jene Stelle in expr identifiziert, die als erste ein Zeichen, das in ref enthalten ist, aufweist. Wenn Sie keine Start-Stelle ab Stelle 1 per Default.
10.7.69
angeben,
ab der expr
überprüft werden soll, erfolgt die Prüfung
WORD
Bedeutung Ermittlung und Rückgabe
des n-ten Worts im mit der Builtin Function WORDS.
Übergabe-Argument; häufig
in
Verbindung
Syntax ^_WORD (expr, n)
_M
Defaults
Rückgabe das n-te Wort in expr
Beispiele F#WORD
/*
REXX
Gib Personaldaten ein
*/
say 'Gib Personaldaten ein1 parse external satz 1 to words(satz) do i =
say word(satz i) ,
end
77425 Kramer Gerd Schichtleiter 77425 Kramer
Gerd
Schichtleiter
10 Unterprogramme
218
WORD ermittelt einzelne Wörter (durch mindestens 1 Blank vom Nachbarn getrennte TeilStrings einer Gesamt-Expression). Wort im Sinne von REXX kann jedes Non-Blank-Gebilde sein: eine Zahl, ein Name, aber auch ein Punkt oder ein sonstiges Zeichen. Um zum Beispiel eine Durchschnittsberechnung in einer Unterroutine durchzuführen, die ihrerseits mit Funktionsaufruf gerufen wird, könnte das Coding so aussehen:
F#DURCH
/*REXX*/
ich parse source say 'Durchschnittsrechnung mit' ich do forever say 'Gib Zahlen durch Blank getrennt oder "END" ein' parse upper external eingäbe 'END' then leave ...if eingäbe say 'Durchschnitt von1 eingäbe 'ist' avg(eingabe) end say 'Es war mir ein Vergnuegen' exit .
.
.
=
AVG
/*REXX*/ parse arg sum
=
anz
=
do i if
eingäbe
0 0 =
1 to words(eingäbe) /*sooft wie Wörter in Eingabe*/ 'NUM' then do datatype(word(eingäbe,i)) sum + word(eingäbe,i) sum =
=
anz
=
anz
+
1
end end if anz > 0 then return sum/anz else return 'nicht berechenbar,
Durchschnittsrechnung
da kein Wert numerisch1
mit F#DURCH
Gib Zahlen durch Blank getrennt oder "END" ein 7 2.5 -6.5 Esel 9
Durchschnitt
von
7 2.5
-6.5 Esel
9 ist 3
Gib Zahlen durch Blank getrennt oder "END" ein end Es
war
mir ein Vergnuegen
219
10.7 Builtin Functions
WORD INDEX
10.7.70 Bedeutung
Ermittlung
und
Rückgabe derjenigen Argument beginnt.
Stelle
(Spalte),
an
der das n-te Wort im
Übergabe-
Syntax »-WORDINDEX
(expr,n)
-H
Defaults
Rückgabe Nummer der
Spalte, auf der das n-te Wort in expr beginnt.
Beispiele
WORDINDEX ermittelt die Position einzelner Wörter eines Strings. Die Function bereitet Werte vor, die später, z.B. beim Parsing nach Spalten und zur Steuerung anderer Functions wie SUBSTR, einfließen. Ist n größer als die Anzahl tatsächlicher Wörter kommt 0 zurück.
220
10
10.7.71
Unterprogramme
WORDLENGTH
Bedeutung Ermittlung und Rückgabe der Länge des n-ten Wortes im Übergabe-Argument. Syntax »-WORDLENGTH(expr,n)
_
Defaults
Rückgabe Länge des n-ten Wortes in expr.
Beispiele
If
F#WORDLN
Gib Personaldaten ein
/*
REXX
*/
say 'Gib Personaldaten ein parse external satz do i 1 to words(satz) =
say
64258 Dandl Konrad HCP -8.9 5
5 6
wordlength(satz,i)
end exit
WORDLENGTH ermittelt die Länge einzelner Wörter eines Strings. Die Function bereitet Werte vor, die später zur Steuerung anderer Functions, wie z.B. SUBSTR, einfließen. Ist n größer als die Anzahl tatsächlicher Wörter, wird 0 zurückgegeben.
221
10.7 Builtin Functions
10.7.72
WORDPOS
Bedeutung
Rückgabe der Position des Wortes, pression expr übereinstimmt.
ab dem die Phrase
phra mit
der
zu
untersuchenden Ex-
Syntax M-WORDPOS
(phra, expr
—,-r)
I—.,start —I
-M
start.
Defaults start
1
Rückgabe
Wort-Position, ab der phra in expr beginnt.
Beispiele
F#WORDPO_ /* REXX */ x=1 to be or not to be p='to be'
or
say wordpos(p,x) say wordpos(p,x,2) say wordpos('or',x,5) say wordpos('or not',x,5 exit
WORDPOS ermittelt die Position einzelner Phrasen (Wort oder Wortkombinationen) in einem String. Die Function bereitet Werte vor, die später zur Steuerung anderer Functions, wie z.B. SUBSTR, einfließen. Ist start (Wortposition ab der ermittelt wird) nicht angegeben, gilt der Defaultwert 1. Der Start-Wert muss, wenn er mitgegeben wird, eine positive Ganzzahl sein.
10
222
10.7.73
Unterprogramme
WORDS
Bedeutung
Ermittlung und Rückgabe der Anzahl Wörter im Übergabe-Argument.
Syntax
Defaults
Rückgabe
Anzahl der Wörter des Übergabe-Arguments.
Beispiele F#WORDS
/*
Gib Zahlen ein
REXX
*/
44433 12 17 8 -26
say 'Gib Zahlen ein' parse external ein sum
44444
0
=
do i
Summe:
=
words(ein)
1 to
sum=sum+word(ein,i) end say
1
Summe:
'
sum
WORDS ermittelt die Anzahl der Wörter eines Strings. Die Function bereitet Werte vor, die später zur Steuerung von Schleifen und anderen Functions einfließen (siehe Builtin Function
WORD). Ist die
zu
untersuchende
Rückgabewert 0.
Expression ein Null-String oder besteht sie aus lauter Blanks,
ist der
225
10.7 Builtin Functions
10.7.76
X2D
Bedeutung
Ermittlung
eines
Strings
im Dezimalformat, der sich
aus
Übergabe-String expr ergibt.
dem hexadezimal
angegebenen
Syntax -X2D(expr
-M
Defaults Fehlt n, wird die hexadezimale expr als vorzeichenlose Binärzahl verarbeitet.
n
Rückgabe Dezimale Darstellung des als Hex-Wert angegebenen Übergabe-Strings expr in der Länge n.
Beispiele F#X2D
/*REXX*/ W=1F081
'
say x2d(1811) say x2d('FF') say x2d(w) say x2d(w,4) say x2d(w,3) say x2d(w,2) say x2d(w,1) exit
/* 8*16+1*/
129
255 61569
/* /* /* /*
F081 081 81 1
*/ */ */ */
-3967 129 -127
Bei sehr großen Rückgabewerten muss NUMERIC DIGITS erhöht werden, da als Rückgabewert nur Ganzzahlen erlaubt sind. Andernfalls gibt es eine Fehlermeldung und die Funktion bricht ab.
10
226
Unterprogramme
Wenn Sie n angeben, werden von rechts aus berechnet nur n Zeichen konvertiert. Das erste Bit der zu konvertierenden Halb-Bytes von links ist vorzeichengebend: 1 bedeutet eine negative Zahl und Behandlung in Komplementär-Notation, 0 bedeutet eine positive Zahl. -
-
Beispiele F#X2B1
Berechnung 1) Konvertierung in Länge 4 2) 1. Bit ist an: Negative Zahl 3) F081: 1111 0000 1000 0001 4) Folglich: -
1000 0000 0000 0000 -32768 111 0000 1000 0001 +28801 3967 -
F#X2B2
Berechnung Konvertierung in Länge 2 1. Bit ist an: Negative Zahl 1000 0001
81:
Folglich: 1000 0000 0000 0001
128 -
+
_1
-
127
Anmerkung: eine Hex-to-Decimal-Konvertierung Rückgabewert 0.
in
Länge
0
(n ist 0) bringt immer den
10.7 Builtin Functions
10.7.74
223
XRANGE
Bedeutung Ermittlung und Rückgabe eines Strings, der aus hexadezimal-aufsteigenden Zeichen besteht.
Syntax
Defaults start
'OO'X
ende
'FF'X
Rückgabe
String, der byteweise hexadezimal aufsteigend ab „Start" beginnt und mit „ende" endet. Beispiele F#XRANGE
XRANGE bietet eine elegante Möglichkeit, byteweise aufsteigende Strings zu generieren, die häufig zum Vergleich, insbesondere im Rahmen anderer Funktionen, wie z.B. VERIFY, herangezogen werden. Beachten Sie, dass XRANGE auf EBCDIC-Betriebssystemen andere Zeichenreihenfolgen generiert wie unter ASCII-basierenden Betriebssystemen (EBCDICFolge: Klein-, Großbuchstaben, Ziffern 0-9; ASCII-Folge: Groß-, Kleinbuchstaben, Ziffern
0-9).
10
224
10.7.75
Unterprogramme
X2B
Bedeutung Ermittlung des Binärwerts eines beliebig langen, hexadezimal angegebenen Character
Strings. Syntax »-X2B(xwert)
-H
Defaults
Rückgabe Binäre Darstellung des übergebenen Werts. Beispiele F#X2B
X2B löst den Wert halbbyteweise auf. Pro Halb-Byte entsteht ein String aus 4 binären Ziffern. Blanks sind zwischen einzelnen Bytes der Übersicht wegen erlaubt, nicht aber als leading/trailing Blanks.
10.8
Suchfolge beim Aufruf von Unterroutinen
Suchfolge beim Aufruf von Unterroutinen
10.8 Beim
227
Unterprogrammaufruf sucht das System in dieser Reihenfolge: Bemerkungen:
z.
B.
x='UPRO'(a,b)
N
1. Intern
Intern
2. Builtin
Builtin Routinen als Function oder via CALL gerufen.
=
im selben Member
Start Extern Lademodule können aus Performance-Gründen zu Function Packages gruppiert werden. Mit EXECUTIL RENAME wird das Function Package Directory
X 3. User Packages 4. Local Packages 5.
System Packages
gewartet. Das Function Search Order Flag ist standardmäßig auf „0". Das
heißt, vor REXX-Programmen
6. Load Libs
6. REXX-Exec
7. REXX-Exec
7. Load Libs
wird ein Lademodul auf folgenden Bibliotheken gesucht: • Job Pack Area • ISPLLIB • Task-Libraries • STEPLIB • LPA (Link Pack Area) • Link Library
10 Unterprogramme
228
Bemerkungen:
Start REXX-Exec
Hauptroutine explizit gerufen war, wird das Upro auf derselben Datei gesucht. Falls die
DD-Name der rufenden Exec
N
Ende
Statt unter TSO/E (IKJEFTO1) könnte eine Exec auch unter IRXJCL (Batch REXX-only) laufen. In diesem Fall ist hier bei „notfound" das Ende der Suche. Die Hauptroutine bricht ab mit der Meldung: „Routine not found". Mit dem TSO-Command ALTLIB können vor bestehende SYSEXEC- und SYSPROCVerkettungen weitere REXX/CLIST-Libraries verkettet werden.
9. Mit ALTLIB verkettete Bibliotheken
NO
Mit dem TSO-Command EXECUTIL SEARCHDD(YES) sorgen Sie dafür, dass immer zuerst
SYSEXEC-verkettete
Libraries vor den SYSPROCBibliotheken durchsucht werden. YES 10. SYSEXEC
1 l.SYSPROC
Ende
EXECUTIL SEARCHDD(NO) unterbindet die Suche in
SYSEXEC-Libraries ganz.
11
TSO/E
-
Commands & Utilities
gerade IT-Spezialisten REXX zur System-, Netz-, Datei-, oder Benutzerverwaltung an den bequemen Schnittstellen zu anderen Interpretern, insbesondere zum TSO Command Environment, welches die Default-Addressumgebung für REXX unter TSO/E (Time Sharing Option/Extended) ist. Wenn der REXX-Interpreter eine Clause als Keyword Instruction oder Assignment nicht interpretieren kann, schickt er sie automatisch an den TSO Command Interpreter weiter, als stünde vor der Clause die Instruktion ADDRESS TSO. Wenn Sie TSO-Commands in einer REXX-Exec codieren, sollten diejenigen Bestandteile der Clause, die nicht der Variablenrestitution unterliegen, in Gänsefüßchen („...") geschrieben werden. Grund: Einheitliche Schreibweise im Hinblick auf TSOCommands, die ihrerseits in Hochkommata gekleidete Parameter erwarten, wie z.B. ALLOC. Warum
einsetzen, liegt
11.1
Command-Übersicht
Für die Basis-Arbeit unter TSO/E stehen zur Verfügung: LOGON zum Anmelden. • LOGOFF zum Abmelden. • PROFILE zum Setzen der TSO-Grundeinstellungen für Ihre UserlD. • ACCOUNT zum Verwalten der UserlDs (heute selten, da RACF-verwaltet). • EXEC zum expliziten Aufruf von REXX- bzw. CLIST-Programmen. • END zum Beenden von CLISTEN, die mit CONTROL NOMALN arbeiten. • EXECUTIL zum Einstellen, wie REXX-Programme unter TSO/E ablaufen. • HELP zur Information über die TSO-Commands. In jeder ISPF-Command-Line: TSO H. Genauere Information über ein TSO-Command mit: TSO H commandname. Hilfe zum Help mit dem Command: TSO H HELP. • TERMINAL zum Einstellen der Terminal-Charakteristika. • TSOLIB zum Wechseln der Load-Module-Bibliothek in einer TSO-Session. •
Die • • • •
Gruppe der Commands zur Kommunikation und zum Datenaustausch besteht aus: SEND zum Senden von Kurznachrichten an andere TSO-Users oder die Console. TRANSMIT zum Versenden von Nachrichten/Dateien an andere TSO-Users (via JES). RECEIVE zum Abholen der mit TRANSMIT gesendeten Nachrichten/Dateien. LISTBC zum Anzeigen von Broadcast Messages (allgemeine Nachrichten).
Commands & Utilities
11 TSO/E
230
-
Für das Arbeiten mit Dateien und Katalogen stehen unter TSO fast alle IDCAMSUtility-Befehle (IDC Access Method Services) und einige Sonderbefehle zur Verfügung: • ALLOC zum Erzeugen von Non-VSAM-Dateien (PS, PO-PDS, PO-PDSE, HFS u.a.) und/ oder zum Bereitstellen unter einem bestimmten DD-Namen für die spätere Verarbei-
tung. •
•
• • • •
•
ATTRIB zum Generieren von Datei-Attributen für Non-VSAM-Dateien (kann anschließend bei ALLOC verwendet werden, ist aber heute nicht mehr sehr gebräuchlich). OUTDES zum Generieren von JES-Outlist Attributen für Listen (kann anschließend bei ALLOC verwendet werden). FREE zum Auflösen einer vorherigen Allocation. DEFINE zum Erzeugen von VSAM-Dateien, -Katalogen und Katalogeinträgen. ALTER zum nachträglichen Ändern von DEFINE-Attributen und zum Umbenennen. EDIT zum Editieren. Vorsicht, diesen TSO-Line-Editor auf keinen Fall mit dem hochkomfortablen ISPF-Editor (Name ISREDIT) verwechseln. Falls Sie ihn aus Versehen einmal aufrufen, können Sie ihn mit dem Subcommand END wieder verlassen. LISTC, LISTDS zum Überprüfen der Attribute, des Füllungsgrades und des Plattenplatzes.
• • •
• • •
• •
RENAME zum Umbenennen von Non-VSAM-Dateien und Members von PO-Dateien. REPRO zum Kopieren von VSAM-/Non-VSAM-Dateien und Members. EXPORT zum Sichern/Kopieren von VSAM-Dateien und Katalogen inklusive Struktur. IMPORT zum Importieren von zuvor exportierten VSAM-Dateien und Katalogen. SMCOPY zum Kopieren einzelner Dateien/Members/Session Manager Data Streams. PRINT und PRINTDS zum Drucken. DELETE zum Löschen. FTP, IEBCOPY, IEBGENER, IEBCOPY, SORT und andere Hilfsprogramme.
Zur Verarbeitung von Data Streams gibt es: • SMCOPY zum Kopieren von Data Streams. • SMFIND zum Suchen eines Strings innerhalb eines Data Streams. • SMPUT zum Einfügen eines Strings in einen Data Stream. Für das Arbeiten mit konventionellen Quell- und Lade-Modulen in Assembler, Cobol, C, Fortran oder PL1 steht folgende Gruppe von TSO-Commands zur Verfügung: • CALL zum Laden und Ausführen eines Lademoduls. • RUN zum Kompilieren, Binden und Ausführen von Programmen. • LINK zum Aufruf des Binders (ehemals bekannt als Linkage Editor). • LOADGO zum Laden eines kompilierten/assemblierten Programms in den Speicher und anschließenden Ausführen. • TEST zum Debugging von Lademodulen und Analyse des eigenen TSO/E-Address-
Space.
•
TSOEXEC
zum
Ausführen autorisierter Programme in einem unautorisierten Environ-
ment. •
WHEN
zum
Return
Code-abhängigen Agieren, nach dem Ende eines Load-Modules.
11.2
Häufig verwendete TSO-Commands
231
Eine weitere Gruppe bilden die TSO-Commands, die in Verbindung zum JES arbeiten: SUBMIT zum Übertragen von Job Control Language Coding an das JES. • STATUS zum Anzeigen des Status eines submittierten Jobs. • CANCEL zum Abbrechen eines submitteten Jobs. • OUTPUT zum Anzeigen der JOB-Output-Listen. •
Die für die RACF-Administration bedeutsamen RACF-Commands sind: • AG Add Group Profile • ALG Alter Group Profile • LG List Group Profile • DG Delete Group Profile • AU Add User Profile • ALU Alter User Profile • LU List User Profile • DU Delete User Profile • AD Add Dataset Profile • ALD Alter Dataset Profile • LD List Dataset Profile • DD Delete Dataset Profile • RDEF Add General Resource Profile • RALT Alter General Resource Profile • RLIST List General Resource Profile • RDEL Delete General Resource Profile • SETROPTS Ändern von RACF-Einstellungen • CO Connect a User to any Group • PE Permit Access to a Resource -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
Daneben gibt es eine Reihe von Software-abhängigen Sonderbefehle, nicht MVS-Console-Befehle in Verbindung mit der Builtin Function GETMSG System-Verarbeitungskomplexe über REXX steuern lassen.
11.2
Häufig verwendete TSO-Commands
11.2.1
EXECUTIL
EXECUTIL: Steuern der
Suchreihenfolge und der TRACE-Optionen.
"EXECUTIL SEARCHDD(YES) "EXECUTIL TS"
"%HUGO"
vergessen die (s.o.), die ganze
zu
/* SYSEXEC vor SYSPROC suchen*/ */ /* Aktivieren von TRACE ?R /* Laden von SYSEXEC + Trace*/
Commands & Utilities
11 TSO/E
232
-
PROFILE
11.3 PROFILE:
TSO-User-Grundeinstellungen festlegen.
"PROF NOPREF" */ /*kein DSN-Prefix hier Arbeit mit ohne Hochkommata und trotzdem ab DSN /* wird kein FLQ in den DSN eingesteuert */ "PROF PREF (11 !! userid () !! ")" /*Prefix= TSO-UserlD*/
ALLOC
11.4 ALLOC
(1): Erzeugen + Bereitstellen
datei
einer SMS-verwalteten PO-PDSE-Datei,
"'RZ.EK2 0 0 6.MAWI.CNTL'" "ALLOC DD (AUS) NEW CATALOG REUSE 11, 11 DSN ("datei") MGMTCLAS (TGLSICH) , " DATACLAS(PO0 0 8 0FB) STORCLAS(FASTO01)", 11 " DSNTYPE (LIBRARY)
IF rc 0 then do RC:' rc say 'Fehler bei ALLOC DD(AUS) =
/* PDSE*/
-
exit end
ALLOC
(2): Erzeugen + Bereitstellen einer Non-SMS-verwalteten PO-PDS-Datei.
datei "ALLOC
"'RZ.EK2006.ANLA.CNTL1"
=
DD(AUS) NEW CATALOG REUSE ", DSN("datei") UNIT(SYSDA) ", LRECL(80) RECFM (F, B) BLKSIZE (2 792 0 ) 11 SPACE(15,5) TRACKS DIR(30)
,
IF
0 then do bei ALLOC DD(AUS) 'Fehler say exit rc
RC:'
rc
-
end
Beachten
Sie, dass die ALLOC-Angaben
von
der JCL-Schreibweise
abweichen:
RECFM (F, B) oder RECFM (F B) sind erlaubt, nicht aber RECFM (FB); CATALOG und nicht CATLG. Auch ist die Schreibweise für Space Allocation anders. TRACKS bzw. CYL
und DIR(n), welche die Anzahl der Parameter.
Directory-Blöcke regeln,
sind
eigene
ALLOC-
11.5 ALLOC und FREE ALLOC
233
(3): Erzeugen + Bereitstellen einer PO-PDS-Datei mit ihrem
RZ EK2006 ANLA. DATA (HALLE07) "ALLOC DD(AUS) NEW CATALOG REUSE
datei
'
.
1,1
.
",
DSN("datei") UNIT(SYSDA) LRECL(80) RECFM(F,B) BLKSIZE(27920) SPACE(15,5) TRACKS DIR(30)
"
IF
"
=
rc
1. Member.
",
0 then do
say 'Fehler bei ALLOC DD(AUS)
exit
RC:'
rc
-
end
Anmerkung: Weil zugleich ein Member-Name angegeben ist, könnte nach dem ALLOC mit dem Füllen dieses Members begonnen werden. Dazu später im Kapitel „EXECIO". ALLOC (4): datei
Erzeugen + Bereitstellen einer Non-SMS-verwalteten PS-Datei.
"'RZ.EK2006.LIEF4432.UMSATZ'" "DEL" datei /* evtl. bestehende alte Datei "ALLOC DD(AUS) NEW CATALOG REUSE =
löschen*/ ",
DSN("datei") UNIT(SYSDA) LRECL(5500) RECFM(F,B) BLKSIZE(27500)", SPACE(10,5) CYL DIR(O)
"
0 then do say 'Fehler bei ALLOC DD(AUS) exit
IF rc
RC:'
rc
-
end
ALLOC und FREE
11.5
FREE: Aufheben einer Allocation nach der Verarbeitung. dateil "ALLOC
=
"'RZ.EK2006.LIEF4432.UMSATZ'"
DD(AUS) NEW CATALOG REUSE ", DSN("dateil") UNIT(SYSDA) LRECL(5500) RECFM(F,B) BLKSIZE(27500)", SPACE(10,5) CYL DIR(0) DD(EIN) SHR REUSE DSN('RZ.EK2006.LIEF4432.UALT')"
"ALLOC Ab hier
/*
"FREE
Verarbeitung (z.
B.
Kopieren
DD(EIN,AUS)" /*Freigabe=Auflösen
v.
der
EIN
n.
AUS)*/
Allocation*/
234
11 TSO/E
Commands & Utilities -
11.6
ALTLIB
ALTLIB: Neue REXX-Bibliothek vor SYSEXEC ketten, dann REXX-Exec-Aufruf. "ALTLIB ACTIVATE
APPLICATION(EXEC) DATASET('RZ.Y.EXEC)' von RZ.Y.EXEC */ /»Aufhebung */
"%HUGO" /* Laden " ALTLIB DEACTIVATE APPLICATION(EXEC)"
11.7
DELETEVDEFINE-Cluster
DEL/DEF: Löschen datei
=
+
Anlegen eines VSAM-KSDS-Clusters (Index-sequ. Datei).
"'RZ.EK2006.STAMMDAT
x=msg('OFF')
/*DEL-Msgs ausschalten*/
"DEL" datei
x=msg(x) DEF CL(
"
NAME("datei")
RECORDS(250000,100)" RECORDSIZE(750,750)" if
INDEXED SPEED 0 then
rc
11.8
KEYS(4,0)
"
)
"
/*1. Angst-Löschen */ /*Zurück auf ON */ 1*2. Neu anlegen */ /*Clustername */ /*Platz: prim,secondary*/
/*Satzlänge: Fixed 750 */ /*Key,-Länge:4,Offset:0 */ /* Schnelles Laden
/ Feheierbearbeitung
...
*/ */
LISTC
LISTC ENTRY:
Anzeige der techn. Info eines Katalogeintrags (z.B.: DSN).
"PROF NOPREF"
dat.l dat.3 do i
"M.CAT"; dat.2
"U.CAT01" " "RZ01" ; dat.4 SYS1. PARMLIB" 1 to 5 "LISTC ENTC'dat.i") ALL" /*Alle Infos darüber end =
=
=
=
=
Zu LISTC LVL siehe Builtin Function OUTTRAP -
zeigen*/
Beispiel F#OUTTR3.
235
11.9 LISTDS
LISTDS
11.9
Zu LISTDS siehe Builtin Function OUTTRAP
Beispiel F#OUTTR3. -
REPRO
11.10 REPRO:
Kopieren einer PS-Datei. DD(EIN)
SHR REUSE DSN('RZ.EK2006.LIEF4432.UALT')" "'RZ.EK2006.LIEF4432.UNEU'" "ALLOC DD(AUS) NEW CATALOG REUSE
"ALLOC
datei
=
DSN("datei") LRECL(5500) SPACE(10,5) "REPRO INFILE(EIN) "FREE DD(EIN,AUS)"
UNIT(SYSDA) RECFM(F,B) BLKSIZE(27500)", CYL DIR(0) OUTFILE(AUS)" /*Freigabe=Auflösen der Allocation*/ /* RC-Prüfungen nach jedem Command!!! (0, wenn OK) Hier nur der Übersichtlichkeit wegen nicht geprüft */ "
REPRO:
Kopieren eines PO-Members.
"ALLOC DD(EIN) SHR REUSE DSN(1RZ.TEST.COB(HUGO)')" "ALLOC DD(AUS) SHR REUSE DSN(1RZ.PROD.COB(HUGO)')" "REPRO INFILE(EIN) OUTFILE(AUS)" "FREE
DD(EIN,AUS)"
11.11
IEBGENER
IEBGENER:
Kopieren eines PO-Members.
"ALLOC "ALLOC "ALLOC
DD(SYSUTl) SHR DD(SYSUT2) SHR DD(SYSIN) DD(SYSPRINT)
"ALLOC "IEBGENER" "FREE
REU
DSN(1RZ.TEST.COB(HUGO)')"
REU DSN(1RZ.PROD.COB(HUGO)')" REU DUMMY /* Unterdrückung */ REU DUMMY /* Unterdrückung */
DD(SYSUT1,SYSUT2,SYSIN,SYSPRINT)"
Commands & Utilities
11 TSO/E
236
-
SMCOPY
11.12 SMCOPY:
I
Kopieren eines PO-Members.
"SMCOPY
11.13
FDS('RZ.T.COB(HUGO)1) TDS('RZ.P.COB(HUGO)1)
SUBMIT
SUBMIT
(1): Übertragen von JCL-Members an JES.
/* Submit der Members PERS01 bis PERS99 */ do i 1 to 99 memsuff right(i,2,'0') /* Suffix 2-stellig "SUB 'RZ.TEST.CNTL(PERS" !! memsuff !! ")'" end =
=
SUBMIT
(2): Übertragen von Datastack an JES. "//RZ01JOB5 JOB ,,CLASS=A,MSGCLASS=T,NOTIFY=RZ01" EXEC PGM=IEBGENER "//STEP1 DD DISP=SHR,DSN=RZ.TEST.PL1(PGM001)" "//SYSUT1 DD DISP=SHR,DSN=RZ.PROD.PL1(PGM001)" "//SYSUT2 DD DUMMY "//SYSIN "//SYSPRINT DD DUMMY "$$"
queue queue queue queue queue queue queue
" "
*
"SUB
11.14
END($$)"
PERMIT
PERMIT: Lese-Erlaubnis für alle Datasets, die
I
"PE
*/
'RZ.T.**1
Anmerkung:
vom
Profil „RZ.T.**"
geschützt sind.
ID(VE17) ACCESS(READ)"/*User VE17: lesen*/
RACF-Permits erteilt
man
pro DSN-Profile
an
Gruppen/User
NONE, EXECUTE, READ, UPDATE, CONNTROL oder ALTER.
in den Stufen
11.15 TRANSMIT
11.15
TRANSMIT
TRANSMIT:
I
237
Hinaus-Kopieren eines PO-Members ans JES durch RZ01.
"TRANSMIT MVSP1.VE17
11.16
DSNAME('RZO1.TEST.COB')" /*PO-PDS*/
RECEIVE
RECEIVE:
Herein-Kopieren eines PO-Members vom JES durch VE17.
/* Receive würde so prompten: */ /* Dataset RZ01.TEST.COB from RZ01 on MVSP1 */ /* Enter restore parameters or 'DELETE' or 'END' */ /* darauf müsste der Empfänger die Enter-Taste drücken*/ /* ...und genau das nimmt queue */ vorweg. ""
queue
""
"RECEIVE"
/*
VE17.TEST.COB wird
angelegt
und
gefüllt
*/
Anmerkung: Wer zwar anderen Usern den Zugriff auf die Members seiner Bibliothek gewäh-
will, aber einen RACF-READ-Permit vermeiden möchte, hat mit TRANSMIT/RECEIVE das ideale Werkzeug. Wermutstropfen: Anfang 2005 war eine Übertragung von PO-PDSELibraries noch nicht möglich (PO-PDS-Bibliotheken machen keine Probleme). ren
11.17
SEND
SEND: Senden msg
=
15
Uhr, Zi.
2412'
'RZ51,RZ54'
=
=
"SE
1 to 3 '"
!!
msg
!!
"'
LOGON" /* Wer nicht MSG beim nächsten LOGON*/
user("u.i")
angeloggt ist, erhält die end
um
'RZ20,RZ22,RZ23,RZ25,RZ26'
=
do i
Kurzmeldungen an TSO-User.
'Juhu, Fred feiert heute 'RZ11,RZ12,RZ15,RZ17'
=
u.l u.2 u.3
von
12
ISPF-Panels
12.1
Äußerer Aufbau
Unter den verschiedenen ISPF-Paneltypen ist das DISPLAY-Panel das wichtigste, um Daten zu erfassen. Im ISPF wurden schon früh Standards für den Full-Screen-Aufbau eingeführt, mit der Idee, allen Benutzern eine leicht wiedererkennbare Oberfläche zu gestalten. Dadurch wird nicht zuletzt auch deren Produktivität gesteigert.
12 ISPF-Panels
240
12.2
Panel
Coding
Ein -
Beispiel
(ISPF-Bildschirmmaske) wird in einem 80-spaltigen Member auf einer Bibliothek gespeichert, die dem TSO-User-Adressraum unter dem DD-Namen ISPPLIB bereitzustellen ist. Das geschieht in der Regel bereits im LOGON-Prozess, kann aber auch im TSO-READY (vor ISPF-Start) mit ALLOC erfolgen. Panels werden in der ISPF-Panel-Sprache codiert. Ein Panel
Panel-Member ERF01 )ATTR DEFAULT(%+_) # TYPE(OUTPUT) color(blue) )BODY EXPAND)//) %/ /Geräte Verwaltung/ / +Command
===>
ZCMD +Inventar Nr.
%Gerät
Mat.
+
EK
+
n
(EUR)
===>_ekn ===>_kdat
am
Abschreibung +Abt.
Mitarb. ab
vorauss.
bis
vorauss.
ttzstdyear
+-#ztime
) INIT .zvars
(invnr,abschr)1
) PROC
(Stinvnr, ver(&ibez, ver(&ekn, ver(&kdat, ver
ver(&abschr
ver(&abt,
nb,num) nb
nb,enum)
pict,'99.99.9999' range,1,5 nb,list,EK,VE,RW,PA,IT
ver(&edatvon,nb,pict,'99.99.99991 ver(&edatbis, pict,199.99.99991 ) END
+
===>_ibez
Gekauft
%Einsatzort
===>_z
Bez.
===>_z+
===>_abt + ===>_mitarb ===>_edatvon ===>
+Enter
edatbis
=
Erfassen,
PF3
Ende
12.3 Innerer Aufbau
12.3
241
Innerer Aufbau
Das Panel Coding ist in Sections (Abschnitte) eingeteilt. Jede Section wird eingeleitet mit dem Section Header Statement, welches mit dem Präfix-Zeichen „)" auf Spalte 1 beginnt, unmittelbar gefolgt vom Header-Namen. Danach können Header-Parameter folgen. Die Reihenfolge in der die Sections zu codieren sind, ist festgelegt. Nicht immer müssen der Reihe nach alle Sections codiert werden, denn je nach Paneltyp (Display Panel, Table Display Panel, Selection Panel, Help Panel) und Benutzerfreundlichkeit ist die Zusammensetzung der Sections unterschiedlich. Beispielsweise braucht man nur in Table Display Panels eine MODEL-Section oder nur dann eine HELP-Section, wenn man dem Benutzer Field Level Help als besondere Benutzerfreundlichkeit bieten möchte.
Die für einfachere Arbeiten überwiegend codierten Sections eines
Display Panels sind:
Panel Sections (1):
CodingFolge 1
Section
Bedeutung
Header
)ATTR
Interpretation
Festlegung der Steuer-Bytes (Attribut-Bytes) und der mit ihnen verbundenen Eigenschaften. Diese werden in der BODY-Section benötigt. Beispiele:
2
TYPE(INPUT/OUTPUT/TEXT) INTENS(HIGH/LOW/NONE) HILITE(USCORE/REVERSE) CAPS(ON/OFF) etc.
Folgende 3 Default-Atribut-Bytes sind vorgegeben und bedeuten später in der BODY-Section: % TYPE(TEXT) INTENS(HIGH) +
2
)BODY
TYPE(TEXT) INTENS(LOW) TYPE(INPUT) CAPS(ON)
Maskenkörper, wie er auf Terminal ausgegeben wird. Attribut-Bytes steuern, ob es sich bei den ihnen folgenden Zeichen um Ein- oder Ausgabevariablen handelt oder nur um konstanten Text. Dabei leitet jedes Attribut-Byte Bildschirm-Eigenschaften ein, die solange gelten, bis das nächste Attribut-Byte oder das Section-Ende auftauchen.
3
242
12 ISPF-Panels
Panel Sections CodingFolge
(2):
Section Header
)INIT
Bedeutung Für Voreinstellungen, bevor der Benutzer den Bildschirm angezeigt bekommt. Kommen im Body Ein-/ Ausgabefelder vor, deren Name länger ist als der erlaubte Inhalt, wird dort das Platzhalterzeichen „Z" verwendet. In der INIT-Section ist infolgedessen mit .ZVARS '(...,...,.• )' positioneil der wahre Variablenname der Zs (ihrer Reihenfolge im BODY von links oben nach rechts unten) anzugeben. =
)PROC
Nachdem der Benutzer die Enter- oder PF-3-Taste gedrückt hat, werden hier die Input-Variablen auf formale Plausibilität geprüft. Sind alle Eingaben des Benutzers fehlerlos und hat der User Enter gedrückt, steht einer Rückkehr zur rufenden REXX-EXEC nichts im Wege. Der RC ist hier 0. Bei Eingabefehlern sorgt ISPF für ein erneutes Panel-Re-Display inklusive Fehlermeldung (Short-/Long-Message). Nur bei PF3 (END) wird immer an die Exec zurückgesprungen. Der RC ist hier 8. Die wichtigsten Verify-Prüfarten sind: NB für: Eingabezwang (auch zusammen mit anderen Eigenschaften erlaubt) für: Eingabe numerisch ganzzahlig NUM für: Eingabe numerisch ganz/dezimal ENUM für: Liste erlaubter Werte LIST PICT für: Eingabemuster (9=Ziffer, C=Char, Sonderzeichen bedeuten sich selbst) u.a.
)END
Ende des Panels
(Letztes Panel Statement)
Anmerkung: Das minimalste Panel Coding besteht aus einem Body (Header Statement nur optional) und der END-Section, die nur aus dem Section Header besteht. Beachten
Sie, dass Variablen in den Sections INIT und PROC mit einem „&" als Prefix zu kennzeichnen sind. Das gilt auch für die ca 250, mit Z beginnenden ISPF-Systemvariablen. Klein- wie Großschreibung ist bei Anweisungen und Variablennamen zulässig.
12.4 Panel-Aufruf aus einer REXX-Exec
243
Panel-Aufruf aus einer REXX-Exec
12.4
Panels werden zum Zweck der Erfassung und der Benutzer-Information aus einer REXX-Exec mit dem Command DISPLAY aufgerufen. Zwischen Exec und Panel herrscht volle Transparenz bei Benutzer-Variablen. Da es sich beim DISPLAY um kein TSO-, sondern ein ISPF-Command handelt, darf das REXX-Programm nur im TSO-ISPF aufgerufen werden und nicht im READY-Mode des TSO.
Display
ISPF-Command mit der Keyword Instruction ADDRESS ISPEXEC eingeleitet werden. Steht ADDRESS ISPEXEC alleine in einer Clause, werden in der Folge alle Non-REXX-Befehle zum ISPF-Interpreter (und nicht wie per Default zum TSOCommand Interpreter) weitergeleitet. Dies gilt bis zum nächsten ADDRESS-Befehl. Mit ADDRESS TSO wird auf den TSO-Command Interpreter zurückgestellt. Neben den Command Environments TSO und ISPEXEC gibt es ISREDIT fur Edit Macro-Befehle, DSNREXX für DB2-SQL-Befehle, CONSOLE für Operator Commands und andere. Wer nur für die Dauer von einer Clause, also temporär, eine bestimmte Adressumgebung benötigt, codiert in derselben Zeile vor das Command die entsprechende ADDRESS Instruction.
Außerdem
muss
jedes
-
-
REXX-Membername: ERFASS address 1ISPEXEC' do i 1 /* unendlich... bis LEAVE hinausspringt*/ "DISPLAY PANEL(ERFASS)" /* zeigt das Panel an */ if rc 8 then leave /* User hat PF3 gedrückt */ 0 bei Enter /* RC */ satz.i right(invnr,6,'0'), =
=
=
=
! !
left(ibez,20)
! ! ! !
right(ekn,09),
! ! ! ! ! ! !! !! !!
,
left(kdat,10) left(abschr,1), left(abt,2) left(mitarb,25) left(edatvon,10), left(edatbis,10), leftC',6) ,
,
,
/* Filier: 6 Blanks end "alloc dd(aus) mod reu dsn('RZ.GERAETE.DATA')" /* MOD schreibt eine sequentielle Datei fort "EXECIO" i-1 "DISKW aus (STEM satz. FINIS)" /*DISKW: i-1 Sätze schreiben. FINIS: CLOSE am Ende "free dd(aus)"
exit
*/ */ */
13
SUBCOM
Bedeutung
Feststellen, ob ein Command Environment im Moment überhaupt zur Verfügung steht.
Syntax >-" SUBCOM
envname
"-H
Rückgabe RC: 0 Environment existiert und ist zur Interpretation bereit. 1 Environment existiert nicht.
Beispiel SUBCOM17
/*REXX*/ "SUBCOM ISPEXEC" rc 1 then do
if
READY
=
say 'Diese
'geht
Anwendung', nur
im ISPF'
exit end ADDRESS 'ISPEXEC "DISPLAY PANEL(PERS01)"
/*Ab hier Verarbeitung*/
%SUBCOM17
Diese
Anwendung geht
nur
im ISPF
14
Stack-Verarbeitung
Jede REXX-Exec besitzt von Anfang an den leeren System-Stack. Ein Stack ist ein Hauptspeicherbereich mit 0 bis n variabel langen, namenlosen Elementen, für deren Schreib- und Leseweise sehr simple und starre Regeln gelten. Ein wesentlicher Vorteil des Stacks gegenüber Compound-Variablen ist, dass er auch in Unterprogrammen, wo keine Variablentransparenz herrscht, gefüllt und gelesen werden kann, ohne irgendwelche ÜbergabeArgumente oder andere „Klimmzüge". Stack und (Compound-)Variablen sind die Speicherbereiche der REXX-Exec, die beim Lesen und Schreiben mit EXECIO übertragen werden. Es gibt zwei Keyword Instructions zum Schreiben und eine zum Lesen eines StackElements. Am besten, Sie stellen sich den Stack wie einen Tellerspender vor, der sowohl von oben, als auch von unten mit frischen Tellern befüllt werden kann. Will ein Gast jedoch einen Teller vom Stapel nehmen, darf er das nur „von oben".
14.1
QUEUE
Bedeutung Hinzufügen (Schreiben) eines Elements in den Stack „von unten". Syntax »—QUEUE
-M
c expr 1
Defaults expr Null-String
Beispiele queue 'Jürgen' queue 'Astrid' queue 'Hans' queue time()
Jürgen 11:53:32
A
1.
Element; Länge: 6
4.
Element; Länge:
8
14
248
Stack-Verarbeitung
PUSH
14.2
Bedeutung Hinzufügen (Schreiben) eines Elements in den Stack „von oben".
Syntax
Defaults expr
Null-String
Beispiele
22:53:32
push 'Jürgen' push 'Astrid' push 'Hans' push time()
14.3
Jürgen
LIFO und FIFO
Wenn wegen der starren Regelung ausschließlich „von oben" gelesen werden darf, kann man jetzt schon sagen, dass das Füllen mit QUEUE immer dazu führt, dass das erste ge-queue-te Element auch das erste sein wird, das beim Lesen dran kommt. Die englische Bezeichnung dafür lautet „FIRST IN, FIRST OUT", kurz FIFO. Man nennt einen Stack, der ausschließlich mit QUEUE-Befehlen gefüllt wurde, einen FIFO-Stack.
Anders ist es beim Füllen mit PUSH, da jeweils das zuletzt geschriebene Element oben auf dem Stack landet. Hier spricht man von einem LIFO-Stack, da „LAST IN FIRST OUT" gilt.
14.4 PARSE PULL
14.4
249
PARSE PULL
Bedeutung
Lesen des obersten Elements eines Stacks. Siehe dazu:
Kapitel „Parsing"
Syntax »-PARSE
- -1—PULL —I
LuPPER
M
-i-1-
I—template—I
Defaults
template
Lesen, ohne in eine Empfangsvariable zu übertragen (wie Löschen).
Beispiele
Variablen-Pool
queue 'Jürgen' queue 'Astrid' queue 'Hans' queue time() parse pull n.l
Name
Inhalt
N.l
Jürgen
neues
1. Element
Astrid 11 -.53 -.32
Wird statt PARSE PULL nur PULL codiert,
entspricht dies einem PARSE UPPER PULL.
Da PARSE PULL nicht kopiert, sondern verschiebt, ist der Stack nach einem PULL um das oberste Element „ärmer". Würde man im Template keine Empfangsvariable angeben (z.B. so: PARSE PULL), dann ginge der Inhalt des obersten Elements in den „elektronischen Abfalleimer". Ist das letzte Element
gelesen, ist der Stack leer. Ein anschließender PARSE PULL würde auf den Terminal Input ausweichen und auf das Enter-Drücken des TSO-Users warten. Der wiederum weiß ohne einen vorherigen SAY gar nichts von der Notwendigkeit einer Eingabe. Die Exec steht und wartet. Um diesem Patt vorzubeugen und ein exaktes Abarbeiten des Stacks zu gewährleisten, gibt es die Builtin Function QUEUED(). nun
Neben den
Keyword-Instruktionen QUEUE, PUSH und PARSE PULL sowie der Funktion QUEUED() gibt es einige REXX-Commands (RC abfragbar!) zur Stack-Organisation und -Verwaltung, die in der Praxis eher selten eingesetzt werden, wie die im Folgenden beschriebenen MAKEBUF, DROPBUF, QBUF, NEWSTACK, DELSTACK und QSTACK.
250
14.5
14
Stack-Verarbeitung
MAKEBUF
Bedeutung
Einziehen einer virtuellen fügt werden.
Pufferlinie, oberhalb derer mit QUEUE
neue
Elemente
Syntax »-"MAKEBUF "
Defaults
Beispiele RZ01 14
Z queue 'Jürgen' queue 'Astrid' queue 'Hans' queue time() "MAKEBUF" queue 'Andrea' queue 'Sabine' "MAKEBUF" queue useridO queue 2*7
Andrea
Sabine
Z
Beim 3. PARSE PULL würde die
Jürgen Astrid Hans 11:53 :32
Puffergrenze aufgelöst und „Andrea" abgeholt.
hinzuge-
14.6 DROPBUF
14.6
251
DROPBUF
Bedeutung
Löschen eines Puffers samt der darüberliegenden Puffer.
Syntax
Defaults der oberste Puffer
n
Beispiele Buffer 2 queue 'Jürgen' queue 'Astrid' queue 'Hans' queue time() "MAKEBUF" queue 'Andrea'
Buffer 1
queue 'Sabine' "MAKEBUF"
queue useridO queue 2*7
Buffer 0 "DROPBUF 1"
Anmerkung: „DROPBUF 0" löscht immer alle Puffer und damit alle Elemente eines Stacks.
252
14
14.7
Stack-Verarbeitung
QBUF
Bedeutung
Ermittelt die Puffer und
gibt die höchste Puffernummer in der Systemvariable RC zurück.
Syntax »-" QBUF"
-M
Defaults
Beispiele Buffer 2
queue Jürgen' queue 'Astrid' queue 'Hans' queue time() "MAKEBUF" queue 'Andrea' queue 'Sabine' "MAKEBUF" queue useridO queue 2*7
Buffer 1
"QBUF"
Buffer 0
1
do i=RC to 0
by-1
"DROPBUF"
end Element
14.8
253
QELEM
QELEM
14.8 Bedeutung
Ermittelt die Elemente des aktuellen
(obersten) Puffers und gibt die Zahl in RC zurück.
Syntax
Defaults
Beispiele Buffer 2
queue 'Jürgen' queue 'Astrid' queue 'Hans' queue time() "MAKEBUF" 'Andrea'
queue queue
uffer 1
'Sabine'
"MAKEBUF"
queue useridO queue 2*7
"QBUF" do i=RC to 0 by-1 if i=l then do
"QELEM" n.
0
do
=
j=l
rc
to n.O
pull n.j end end else "DROPBUF" end
Variablen-PooT Name
Inhalt
N.I
ANDREA
N.2
SABINE
254
14
14.9
Stack-Verarbeitung
NEWSTACK
Bedeutung Erzeugen eines „gestackt".
Stacks. Der vorher aktuelle Stack wird derweilen
privaten
neuen -
-
Syntax »-"newstack"-m
Defaults
Beispiele
Durch Lesen aller Elemente des aktuellen Stacks wird dieser nicht aufgelöst, sondern bleibt als leerer Stack erhalten. Ein nachträglicher PARSE PULL würde deshalb auf einen Terminal-Input vom User warten.
Achtung:
14.10
255
QSTACK
QSTACK
14.10 Bedeutung
Ermittelt die Anzahl der Stacks und gibt den Wert in der
Systemvariable RC zurück.
Syntax
Defaults
Beispiele Stack 1 queue 'Jürgen' queue 'Astrid' queue 'Hans 1 queue time()
(System-Stack)
"NEWSTACK"
queue 'Andrea' queue 'Sabine'
Stack 2
"NEWSTACK"
queue useridO queue 2*7
"QSTACK" say
rc
Stack 3
'Stacks'
Wenn beim Beenden einer REXX-Exec noch Stack-Elemente existieren, werden sie nach Beendigung der Exec (Element für Element) als Terminal Input durch den User behandelt. Entsprechen die Element-Inhalte TSO-Commands oder REXX-Member-Namen (z.B.: LISTC), werden diese Programme ausgeführt! Andernfalls führt der Programmaufruf zur Message „COMMAND NOT FOUND".
Achtung:
14
256
Stack-Verarbeitung
DELSTACK
14.11 Bedeutung
Löscht den aktuellen Stack. Handelt
es
sich
um
den
System-Stack, wird er anschließend neu
angelegt und ist leer. Syntax > -"DELSTACK" -M
Defaults
Beispiele queue Jürgen' queue 'Astrid' queue 'Hans' queue time() 1
"NEWSTACK" 'Andrea'
queue queue
'Sabine'
"NEWSTACK"
queue useridO queue 2*7
"QSTACK" do rc ..."DELSTACK end
exit
Wenn Sie mehrere Stacks benutzen, sollten Sie am Ende ihrer Exec sicherstellen, dass alle Stack-Elemente gelöscht sind. Dazu fragen Sie zunächst mit QSTACK die Anzahl der existierenden Stacks ab und löschen dann entsprechend oft mit DELSTACK.
Dateiverarbeitung mit EXECIO
15
Mit dem REXX-Command EXECIO können PS-Datasets und PO-Members gelesen und geschrieben werden. Datenbankzugriffe zum DB2 werden dagegen mit SQL-Befehlen unter ADDRESS DSNREXX durchgeführt. Für reine VSAM-Zugriffe oder die IMS-DatenbankVerarbeitung brauchen Sie gesonderte Schnittstellen. EXECIO ist ein Sammelbefehl, über dessen Parameter Sie steuern, ob Sie lesen, schreiben oder einen Satz überschreiben wollen. Darüber hinaus können Sie einstellen, ob Sie Einzelsatz- oder Massen-Verarbeitung oder gar nur einen File-Open bzw. -Close möchten.
Syntax
L* _I-p—diskw
execio r-anz
—ddname.
l_ | wparm I ZT
-pDISKR -pddname-i-1—i—
LdISKRuJ
LstartJ L
rparm|
Syntax für |rparm| (Read-Parameter)
TT
.FIFO
open
"IT finis J Lskip J L) J
.LIFO .STEM
varname
J
Syntax für |wparm| (Write-Parameter)
TT
I STEM
varname
J LqpeN —I J LFINIS II UlNT.qJ OPF1N
T7T
-M
15 Datei Verarbeitung mit EXEC 10
258
Defaults bei DISKR start:
1
FIFO Defaults bei DISKW 1 STACK:
15.1
Allgemeines
Um beim Read bzw. Write das richtige File (PS-Datei oder PO-Member) zu verwenden, muss EXECIO auf einen DD-Namen Bezug nehmen, unter dessen Namen das File zuvor für den Adressraum bereitgestellt wurde. Das geschieht in der Regel kurz vorher durch das TSOCommand ALLOC. Der DD-Name des ALLOC muss identisch mit dem DD-Namen des EXECIO sein. Zum Lesen einer PS-Datei sowie zum Lesen oder Schreiben eines POMembers einer bestehenden PO-Datei sollten Sie die Disposition SHR verwenden. Das erlaubt grundsätzlich parallele Dateiverarbeitung durch mehrere User. Eine DispositionsAngabe wirkt immer auf den DSN, nicht auf ein einzelnes Member. Ein einzelnes Member wird im Falle des Open for Output sowieso durch einen ENQ bis zum Close geschützt. Verwenden Sie OLD nur bei PS-Dateien, wenn Sie auf diese schreiben wollen. Da EXECIO ein REXX-Command ist, empfiehlt es sich, die Clause in Gänsefüßchen zu kleiden. Das verhindert Missinterpretationen der Klammern. Wo variable Expressions in den EXECIO einfließen müssen, weichen Sie die starre Literalisierung einfach auf.
15.2
DISKR
Der EXECIO-Parameter DISKR dient dem
sequentiellen Lesen. Zum Einzelsatzlesen geben Sätze mit einem EXECIO lesen, geben Sie für anz
Sie für anz eine 1, wollen Sie mehrere eine Ganzzahl größer 1 an. Zum Lesen aller Sätze des Files benutzen Sie „*". Da das Massenlesen den Ihrem TSO-Adressraum zur Verfügung stehenden Speicherplatz überbeanspruchen könnte (ABEND 878 bzw. 80A), sollten Sie die Lesetechnik angemessen auswählen oder die Region Size erhöhen.
Beim EXECIO brauchen Sie OPEN nicht explizit angeben, da das System per Default vor dem Lesen des 1. Satzes ein implizites Open durchführt, falls die Datei nicht geöffnet ist. Unter OPEN versteht man das Einrichten eines Puffers in der Größe der Blocksize einer zuvor allocierten Datei. Beim Open for Input (wegen DISKR) wird nur während der kurzen Zeit des Opens ein ENQ (Blockade auf das File für andere Adressräume) gesetzt, der nach Einrichtung des Pufferbereichs mit DEQ systemseitig aufgehoben wird. Das ermöglicht einen parallelen Zugriff von mehreren Adressräumen.
259
15.2 DISKR
Für den Sonderfall, dass Sie eine Datei nicht ab dem 1. Satz lesen wollen, können sie als Start-Parameter eine positive Ganzzahl angeben, die festlegt, welches der erste zu lesende Satz sein soll. Der Defaultwert dafür ist 1. Für die anschließenden
Read-Beispiele sei folgendes File mit 55-stelligen Sätzen gegeben:
Sequentielles File mit 7 Sätzen: 1.
0803Dierck 13 04Mueller-Volbehr 1339Schildknecht
Insolvenzrecht Ralf Arbeitsrecht Gerd Alexander Informatikrecht Steuerrecht Urs
2312Schlemper
Antje
Int.Vertragsrecht
3301Gossel
Hans
Strafrecht
4221Papier
Juergen
Verfassungsrecht
1322Petz
Massenlesen in den Stack
15.2.1 EXECIO
MUC MUC MUC MUC DUB HAN KAR
(1):
File ist eine PS-Datei
datei "'RZ.JUS.STAMMPS'" if sysdsn(datei) 1 OK1 then "alloc dd(ein) shr reuse dsn if rc 0 then "execio * diskr ein (FINIS)" =
=
...
DD(EIN)"
"FREE
do i 1 to queued() 5 nn 2 5 parse pull nn vn nr say end exit
/*Datei existiert
,
1
!!
datei !!
/
")"
/ eigene Fehlerbehandlg */
/*liest alles,dann Close*/ / Auflösen des Alloc */
=
.
vn
35
Dierck
Ralf
Mueller-Volbehr
Gerd
Petz
Alexander
Schildknecht
Urs
Schlemper
Ant j
Gossel
Hans
Papier
Juergen
e
260
15
Massenlesen in
15.2.2 EXECIO
(2):
Dateiverarbeitung mit EXECIO
Compound-Variablen
File ist eine PS-Datei
datei "1RZ.JUS.STAMMPS'" if sysdsn(datei)='OK' then /*Datei existiert "alloc dd(ein) shr reuse dsn(" !! datei !! ")" if rc 0 then /*Fehlerbehandlung "execio * diskr ein (STEM satz. FINIS)" "FREE DD(EIN)" / Auflösen des Alloc do i 1 to satz.0 /* Anz. gelesener Sätze var satz.i nn vn 5 25 35 parse say nn vn nr end exit =
,
...
=
.
*/ */ */ */
.
EXECIO schreibt beim Non-StackRead die Anzahl gelesener Sätze in varnameO.
Tipp: Geben Sie für varname möglichst einen Stem-Namen (Punkt als letztes Zeichen) an. Das erleichtert Ihnen das iterative Abarbeiten der entstehenden Variablen. Andernfalls müssten Sie auf die INTERPRET-Instruktion zurückgreifen. EXECIO
(2a):
Variante: File ist ein PO-Member
datei "'RZ.PERS.STAMMPO(JUS)'" if sysdsn(datei)='OK' then /*Datei existiert "alloc dd(ein) shr reuse dsn(" !! datei !! ")" if rc 0 then ^Fehlerbehandlung "execio * diskr ein (STEM satz. FINIS)" "FREE DD(EIN)" /*Auflösen des Alloc do i 1 to satz.O /* Anz. gelesener Sätze 5 nn 25 vn 35 parse var satz.i say nn vn nr =
,
...
=
.
end
exit
.
*/ */
*/ */
15.2 DISKR
261
Einzellesen in eine Variable
15.2.3 EXECIO
File ist eine PS-Datei
(3):
datei "'RZ.JUS.STAMMPS'" if sysdsn(datei)='OK' then /*Datei existiert */ "alloc dd(ein) shr reuse dsn(" !! datei !! ")" if rc 0 then */ ^Fehlerbehandlung DO i 1 /*Endlos (bei EOF:LEAVE)*/ "execio 1 diskr ein (STEM satz )" /*kein Close*/ if rc 2 then leave RC 2 EOF /* */ 5 nn 25 vn 35 parse var satzl say nn vn nr end "execio 0 diskr ein (STEM satz FINIS)" =
,
...
=
=
=
.
"FREE
DD(EIN)
.
"
Einzellesen ist die konventionelle Read-Methode, die bei großen Satzmengen den Hauptspeicher nicht belastet. Dafür ist die Datei länger OPEN.
,_
Dierck
Mueller-Volbehr Petz
Schildknecht
Schlemper Gossel
Papier Beachten Sie, dass beim Einzellesen kein FINIS codiert sein darf. Das würde zu einem Endlos-Loop führen, da die EOF-Bedingung nie eintritt. Sie würden immer von neuem den ersten Satz lesen und anschließend einen CLOSE absetzen. EXECIO returniert in diesem Fall immer mit 0 (erfolgreich gelesen + geschlossen). Wenn der
gewollte Loop wegen des
ßend ein extra EXECIO mit dem
Return Codes „2"
(EOF) verlassen wird,
muss
abschlie-
Auftrag, 0 Sätze zu lesen und dann zu schließen, codiert werden, da sonst ein FREE nicht möglich wäre (Fehlermeldung: DATASET NOT FREED DATASET IS
OPEN).
-
15
262
Einzellesen in den Stack
15.2.4 EXECIO
Dateiverarbeitung mit EXECIO
(4):
File ist eine PS-Datei
datei "'RZ.JUS.STAMMPS1" if sysdsn(datei)='OK1 then "alloc dd(ein) shr reuse dsn( if rc 0 then 1 DO i " "execio 1 diskr ein () if rc 2 then leave =
,
...
=
=
5 parse pull say nn vn nr .
nn
25
vn
/*Datei existiert !! datei
!!
/
")"
/ Fehlerbehandlung
*/ / Endlos (bei EOF:LEAVE)*/ / FIFO, kein Close */ EOF / RC 2 / =
35
end
"execio 0 diskr ein (FINIS)" "FREE
DD(EIN)"
Beim Einzellesen in den Stack ist unerheblich, ob Sie mit FIFO (Füllen mit QUEUE) oder LIFO (Füllen mit PUSH) arbeiten, da mit PARSE PULL das einzige Element des Stacks gleich wieder entnommen wird, um es in Variablen es
zerlegen. Wenn der gewollte Loop wegen des Return Codes „2" (EOF) verlassen wird, muss abschließend ein extra EXECIO mit dem Auftrag, 0 Sätze zu lesen und dann zu schließen, codiert werden, da sonst ein FREE nicht möglich wäre (Fehlermeldung: DATASET NOT FREED DATASET IS OPEN). Anmerkung: Wenn Sie Daten im Stack ablegen, sollten Sie beachten, dass im Abbruchfall der Stack nicht wie der Variablenpool gelöscht wird. Das ungewollte Abarbeiten des Stacks zu
-
nach Ende der REXX-Exec verhindern Sie mit einem abschließenden DELSTACK. Wie DELSTACK im Fehlerfall eingesetzt werden kann, sehen Sie im Beispiel „EXECIO (1)".
15.3
DISKW
Der EXECIO-Parameter DISKW dient dem sequentiellen Schreiben. Wie bei DISKR kann man auch bei DISKW zwischen Massen- und Einzelverarbeitung wählen. Zum Einzelsatzschreiben geben Sie für anz eine 1, wollen Sie mehrere Sätze mit einem EXECIO schreiben, geben Sie für anz eine Ganzzahl größer 1 an. Zum Schreiben aller Sätze im Hauptspeicher benutzen Sie „*". Nicht selten ergibt es sich, dass aufgrund vorheriger Programmabläufe die
263
15.3 DISKW
Anzahl der zu schreibenden Sätze berechenbar ist. Dann könnte der anz-Parameter als arithmetische Operation formuliert sein. Dazu weichen Sie die als Literal String formulierte EXECIO-Expression an der zu berechnenden Stelle auf:
„EXECIO" i-1 „DISKW AUS (STEM satz. FINIS)" Beim EXECIO mit DISKW brauchen Sie OPEN nicht explizit angeben. Das System führt per Default vor dem Schreiben des 1. Satzes ein implizites Open durch, falls die Datei nicht geöffnet ist. Der Befehl zum abschließenden CLOSE (FINIS) kann beim EXECIO für Massenschreiben gleich mitgegeben werden. Beim Einzelschreiben ist es empfehlenswert, ganz zum Schluss einen letzten EXECIO zu codieren, der 0 Sätze verarbeitet und mit dem Parameter FINIS ausgestattet ist.
15.3.1 EXECIO
Massenschreiben (5):
aus
dem Data Stack
Kopieren Eingabe: PS-Datei, Ausgabe: PO-Member -
edatei "'RZ.JUS.STAMMPS1"; adatei "'rz.jus.stammpo(sichOl)'" if sysdsn(eing)='OK1 & sysdsn(ausg) 'OK' then do "alloc dd(ein) shr reuse dsn(" !! edatei !! ")" if rc 0 then */ /*eigene Fehlerbehandlg "alloc dd(aus) shr reuse dsn(" !! adatei !! ")" if rc 0 then /*eigene Fehlerbehandlg */ "execio * diskr ein (FINIS)" /*Lesen mit FIFO-Verfahren*/ QUEUE 11 /*Nullstring als letztes Element wirkt als EOF*/ "execio * diskw aus (FINIS)" =
=
=
...
...
"FREE
DD(EIN,AUS)"
end
Anmerkung: Fehlt dem Interpreter beim Schreiben vom Stack ein EOF (hier richtiger: End of Stack), will er nach dem letzten Stack-Element vom Terminal-Puffer weitermachen. Um das zu verhindern, ist ein Null-String als letztes Element hinzuzufügen (künstliches EOF).
Eine Alternative des Massenschreibens vom Data Stack ist jene, bei der statt des „*" die Builtin Function QUEUED() verwendet wird, um die exakte Anzahl der Schreibaktionen zu ermitteln. Damit erübrigt sich eine künstliche EOF-Erzeugung mit QUEUE ".
Anmerkung: Aus Gründen der Übersichtlichkeit wird ab hier nur noch rudimentär sonst nötigen Fehlerprüfungen und -behandlungen (z.B. RC-Abfragen) eingegangen.
auf die
15
264
EXECIO
Dateiverarbeitung mit EXECIO
(5a): Kopieren Verwendung von QUEUED() -
edatei "'rz.jus.stammps'" adatei "'rz.jus.stammpsl'" /* Bestehende PS-Datei */ "alloc dd(ein) shr reuse dsn("edatei")" "alloc dd(aus) mod reuse dsn("adatei")" /*Fortschreiben*/ "execio * diskr ein (FINIS)" /*Lesen mit FIFO-Verfahren*/ "execio diskw" queued() "aus (FINIS)" =
=
DD(EIN,AUS)"
"FREE
Massenschreiben von Compound-Variablen
15.3.2 EXECIO
(6):
Kopieren Eingabe: PO-Member, Ausgabe: PO-Member -
edatei adatei
=
"'RZ.JUS.STAMMPO(SICH01)'" /*Klein/Groß: egal*/
"'rz.jus.stammpo(sich02)'" /*Ausgangslage: Member SICH01 existiert. =
Existiert SICH02 nicht, wird es automatisch angelegt, existiert es, wird es überschrieben(MOD unanwendbar) "alloc dd(ein) shr reuse dsn("edatei")" "alloc dd(aus)
shr
reuse
*/
dsn("adatei")"
"execio * diskr ein (STEM zei. FINIS)" "execio" zei.0 "diskw aus (STEM zei. FINIS)" "FREE
Hier
DD(EIN,AUS)"
ergibt sich die Anzahl der zu schreibenden Zeilen (Sätze) aus dem Inhalt der Compound-Variable zei.O, in der beim Massenlesen die Gesamtzahl gelesener Sätze automatisch gespeichert wird.
265
15.3 DISKW
Massenschreiben auf neue PS-Datei
15.3.3 EXECIO (7):
Erfassen -
Eingabe: Panel, Ausgabe: Neue PS-Datei
adatei "'RZ.PERS.TESTDAT1" if sysdsn(adatei) 'OK' then do =
=
/* PTJTLINE-Messages unterdrücken */ /* Falls 'alte' Datei existiert: Löschen*/ /* PUTLINE-Messages wieder zulassen */
MSG ('OFF') "DEL" adatei
x
=
x
=
MSG('ON')
end sl 100 "alloc dd(aus) =
catalog
new
reuse
dsn("adatei")",
unit(SYSDA) space(20,10) CYLDIR(O) lrecl("sl") recfm(f,b)
"
",
if rc 0 then */ ^Fehlerbehandlung 1 do i /* unendlich... bis LEAVE hinausspringt*/ "DISPLAY PANEL(ERFASS)" /* zeigt das Panel an */ if rc 8 then leave /* User hat PF3 gedrückt */ 0 bei Enter /* RC */ .
.
.
=
=
=
satz.i ! ! ! ! !!
=
right(pnr,06,'0') left(pnn,20) left(pvn,20) right(geh,08,'0'),
,
,
,
!! !! !!
left(eda,10), left(abt,04), left(ort,20),
!!
left('
',12)
/* Filler:
12 Blanks
*/
end
"execio" i-1 "diskw aus (stem satz. ADDRESS TSO "FREE DD(AUS)"
finis)"
exit
Beim Erfassen rein sequentieller Daten (ein Satz nach dem anderen) ist Duplicate Key auf eindeutige Personalnummer) zu aufwändig. Plausibilitätsprüfungen auf sogenannte „Unique Keys" werden von den Datenverwaltungssystemen ISPF-Key-Tables, VSAM-KSDS, IMS-DB und DB2 übernommen.
Checking (z.B. Das
Coding des Panels ERFASS finden Sie im Anschluss.
15
266
Dateiverarbeitung mit EXECIO
EXECIO (7a): Panel-Member ERP ASS )BODY EXPAND(//) %/ /Personal Erfassung/ / +Command ===>_ZCMD +
%Mitarbeiter
+Personal Nr.
+
Name
+
Vorname
+
Gehalt
+
Einstellungsdatum
===>_pnr
6
+
===>_pnn
===>jpvn n
(EUR)
===>_geh ===>_eda
+
20
+
20
8
+
10
+
+
%Einsatzort
+Abt.
===>_abt
Ort
+
+
===>
ort
+Enter
=
4
+ +
Erfassen,
PF3
=
20
Ende
) PROC
ver(&pnr,nb,num msg=meld010) ver(&pnn,nb, msg=meld011) ver(&pvn,nb, msg=meld011) msg=meld012) ver(&geh,nb,enum, ver(&eda,nb,pict,'99.99.9999',msg=meld014) ver{&abt,nb, msg=meld011) msg=meld011) ver(&ort,nb, ,
)
END
EXECIO (7b):
Message-Member MELD01
'Wert nicht numerisch1 'Numerisch ist ein Wert, der aus Ziffern 0-9 besteht' MELD011 'Bitte Wert eingeben1 MELD010
'Nu mach schon...' MELD012 'Wert nicht
numerisch/dez'
'Ganzzahl oder Dezimalzahl (NKST durch Punkt MELD014 'Datumsform: tt.mm.jjjj' 'z.
B.:
getrennt)
01.07.2010'
Anmerkung: Private (Non-System) Messages befinden sich auf Membern einer PO-Datei, die den Message-Präfix bilden. Die Bibliothek muss unter dem DD-Namen ISPMLIB an den TSO-User-Adressraum (mit-)allociert sein.
15.3 DISKW
267
15.3.4
Einzelschreiben auf Member einer neuen PO-Datei
EXECIO (8):
Erfassen
Eingabe: Panel, Ausgabe: Member einer neuen PO-Datei -
adatei x
"'RZ.PERS.NEU(WERK10)" MSG('OFF') /* PUTLINE-Messages unterdrücken
=
"DEL x
=
'RZ.PERS.NEU'
/*"Angst-Löschen"
vor
ALLOC
...
/* PUTLINE-Messages wieder zulassen
MSG('ON')
=
"
sl 100 "alloc dd(aus)
*/ NEW*/ */
=
catalog
new
reuse
dsn("adatei")",
unit(SYSDA) space(20,10) CYLDIR(l) " lrecl("sl") recfm(f,b) dsntype(library)" durch DSNTYPE(LIBRARY) wird DIR(...) überschrieben /*
/*
aus
Konsistenzgründen
mit BATCH-JCL dennoch
if rc 0 then /»Fehlerbehandlung do forever /* unendlich... bis LEAVE hinausspringt "DISPLAY PANEL(ERFASS)" /* zeigt das Panel an if rc 8 then leave /* User hat PF3 gedrückt 0 bei Enter /* RC ...
=
=
satz.l
=
! ! ! ! !! ! ! ! ! ! ! !!
"execio 1
*/
DIR-Angabe*/ */ */ */ */ */
right(pnr,06,'0'), left(pnn,20) left(pvn,20) right(geh,08, '0 ) left(eda,10), left(abt,04) left(ort,20) , ,
'
,
, ,
',12) /* Filier: 12 Blanks */ diskw aus (stem satz.)"/* Einzel-Schreiben */ left('
end "execio 0 diskw
(stem satz. FINIS)" /* CLOSE DD(AUS)"
aus
ADDRESS TSO "FREE EXIT
*/
268
15
Dateiverarbeitung mit EXECIO
Rewrite mit DISKRU + DISKW
15.3.5 EXECIO (9):
Update EhWAusgabe: PS-Datei -
eadatei
"'RZ.PERS.GEHALT"
=
/* Gegeben sei: Satzlänge 100, Gehalt ab Stelle 4 7 in mit führenden 8 Nullen und 2 Dezimalstellen. Länge =
der
Zur Zeit höchster Wert: 09999.99 */ "alloc dd(ea) old reu dsn("eadatei")" if rc 0 then ^Fehlerbehandlung */ do forever /* unendlich... bis LEAVE hinausspringt*/ "execio 1 diskru ea (stem satz.)" /*Satzzeiger bleibt */ if RC 2 then leave /* EOF erreicht */ var satz.l 1 prefix 47 gehalt 55 suffix parse gehalt gehalt * 1.05 /* 5% Gehaltserhöhung */ .
.
.
=
=
satz.1
=
prefix!!right(format(gehalt,,2),8,'0')!!suffix
"execio 1 diskw ea (stem satz.)" /* Zurückschreiben /* Erst beim DISKW wird der Satzzeiger um 1 erhöht.
end "execio 0 diskw
ea
(stem
satz.
*/ */
finis)"
"FREE DD(ea)"
exit
DISKRU liest den nächsten Satz, ohne den Satzzeiger automatisch auf den Nachfolger einzustellen. Man kann sagen: Er wartet auf den zugehörigen DISKW. Der nachfolgende DISKW überschreibt den aktuellen Satz, auf den der Satzzeiger gerade zeigt. Dann wird der
Satzzeiger weitergezählt.
15.3.6
Sonderfall: Partielles Lesen
EXECIO (10):
Partielles Lesen
eadatei "'RZ.PERS.GEHALT" "alloc dd(ein) old reu dsn("eadatei")" "execio 200 diskr ein 501(stem satz. finis)" /*Ab 501.Satz: 200 Sätze lesen */ if RC=2 then say 'EOF vorzeitig vor dem 200. Satz erreicht' =
DD(ein)"
"FREE
do i
=
1 to satz.0
/* Verarbeitung der (tatsächlich) gelesenen Sätze
end exit
*/
16
INTERPRET
Bedeutung
Verarbeitet Instruktionen, die ihrerseits standen sind.
dynamisch
durch
Auflösung
einer
Expression
ent-
Syntax INTERPRET expr ;
Beispiele INTERPl
/*
REXX
*/
Zunächst wird die Expression (hier Variable x) aufgelöst. Das schließend interpretiert, als wäre es an dieser Stelle codiert.
aufgelöste Ergebnis wird an-
16 INTERPRET
270
Anwendung mit INTERPRET:
Der Taschenrechner
INTERP2
/*
REXX
*/
do forever 1 Gib arithmetische Operation oder "END"' say parse upper external eingäbe if eingäbe 'END' then leave interpret 'SAY' eingäbe =
sich Befehle oder Variablen selbst in Variablen „verstecken", ist Interpret das für die Auflösung solcher Ausdrücke. Mit Interpret können auch InterpretWerkzeug Instruktionen geschachtelt werden!
Immer,
wenn
Neben der Missbrauchsgefahr ist der wichtigste Grund, sehr sparsam mit INTERPRET umzugehen, die schwierige Lesbarkeit des Codings. Ein Außenstehender tut sich sehr schwer und braucht deshalb lange Zeit, um das Programm zu pflegen. Vorteilhaft jedoch bleibt, dass INTERPRET für Spezialanwendungen wie Programmgeneratoren ein unverzichtbarer Befehl ist.
17
Anhang
17.1
EBCDIC Code-Tabelle
EBCDIC-Hexadecimal Codes United States 3age 037 Zeh Hex Beschreibung NUL SOH STX ETX
273 Zeh
Germany, Austria
Beschreibung_ NUL SOH STX ETX
SEL HT
HT
RNL
RNL
DEL
DEL
GE
GE SPS RPT
SPS RPT VT
SEL
VT
FF
FF
CR
CR
SO DBCS shift out
SO DBCS shift out SI DBCS shift in
SI DBCS shift in
Anmerkung. X'00' bis X'3F' sowie X'FF' dienen als Steuerzeichen. Die restlichen HexKombinationen sind alphabetische, numerische oder Sonderzeichen.
272
17 EBCDIC-Hexadecimal Codes United States Page 037 Hex
Zeh
Beschreibung DLE
DC1
273 Zeh
Germany, Austria
Beschreibung_ DLE
DC2 DC3
DC1 DC2 DC3
RES/ENP
RES/ENP
NL
NL
BS
BS
POC CAN EM
POC CAN EM
UBS CU1
UBS CU1 IFS IGS IRS
IFS IGS IRS
ITB/IUS
ITB/IUS
DS
DS
SOS
SOS FS
FS WUS
WUS
BYP/INP
BYP/INP
LF_
LF_
ETB ESC
ETB
ESC
SA_
SA_
SFE
SFE
SM/SW
SM/SW
CSP MFA
MF A
CSP
ENQ
ENQ
ACK
ACK BEL
BEL
Anhang
273
17.1 EBCDIC Code-Tabelle
EBCDIC-Hexadecimal Codes United States 5age 037 Hex
0 1 2 3 4
5 6 7 8 9 A B
C D E
Zeh
273 Zeh
Beschreibung
Germany, Austria
Beschreibung_ SYN
SYN IR PP TRN NBS EOT SBS IT RFF CU3 DC4 NAK
IR PP
TRN
NBS EOT SBS IT
RFF CU3 DC4 NAK SUB
0 1
SUB blank (SP) blank (RSP)
2
a
3 4 5 6 7 8 9
a
e
a
grave
a
a
acute
a
a
tilde
a
a
open cedilla tilde
a
A(N)
cent sign period
F
B
C D
E
F(N)
c n
blank (SP) blank (RSP) a circonflex geschw. Kl. auf
caret
c n
less than left parenthesis
plus sign or bar/ log,
or
grave aigu tilde offen
cedile tilde
Umlaut A Punkt kleiner als runde Klammer auf Plus Rufez./log. Oder
Anmerkung: Mit (N) gekennzeichnete Hex-Werte sind „National Use Characters". Auf z.B. das „!" als Zeichen für das Das des deutsche anstelle verwenden. zu „!!" dient anstelle des U.S.Oder „|" logische amerikanischen „| |" als Verkettungsoperator.
den
Betriebssystemen mit deutschem Zeichensatz ist
274
17 EBCDIC-Hexadecimal Codes United States 'age 037 Zeh
Hex 0 1
273 Zeh
Beschreibung
ampersand/lg e
acute
2 3 4 5 6 7
e
caret
e
e
8 9 A (N)
AND
Anhang
Germany, Austria
Beschreibung logisches Und e
aigu circonflex Umlaut e e
e
e
grave i acute l
caret
l
e
grave aigu i circonflex i Umlaut
l
grave
l
l
ss
grave Tilde U Umlaut Dollar
C
exclamation dollar sign asterisk
D
right parenthesis
runde Klammer
E
semicolon
F(N)
logical
0
dash slash
Strichpunkt logisches Nicht Bindestrich/Minus Schrägstrich
B(N)
l_
1 2 3 4
Stern/Malzeichen
A caret A e
A
A grave A acute
A
A grave A aigu
A
A tilde
A_
A tilde
7 8
A_ Q_
9
N
A open C cedilla N tilde
splitvbar
A
circonflex
A_ Ä
A_
(N)
U
not
5 6
A B
point
eckige
Kl. auf
A offen N
C cedile N tilde o
Umlaut
Komma
C
percent sign
Prozent
D
underscore greater than question mark
Unterstrich größer als
E F
Fragezeichen
zu
17.1 EBCDIC Code-Tabelle
275
EBCDIC-Hexadecimal Codes United States 3age 037 Hex
0 1 2 3 4 5 6 7 8
9(N) A
B(N) C(N)
Beschreibung o
scand.
E acute E caret
sign single quote
E
equal
at
F(N)
double quote
0
0 scand.
1
a lowercase b lowercase
3 4 5 6 7
8 9 A B C D E F
lowercase d lowercase e lowercase f lowercase c
g lowercase h lowercase i lowercase
0
o
skand.
E
aigu
Beschreibung
E Umlaut
I
circonflex
I Umlaut
e
I grave grave colon Hash, number
Germany, Austria
E grave I aigu
I acute I caret
I
273 Zeh
E circonflex
E e E grave
D
2
8 8 8 8 8 8 8 8
Zeh
I grave Accent grave
Doppelpunkt
sign
Nummernzeichen
Paragraph Hochkomma ist gleich Gänsefüßchen O skand. a klein b klein c klein d klein e klein f klein g klein h klein i klein
open dqf close dqf eth
Anführungsz. Anführungsz.
y acute thorn
y aigu thorn
plusminus
plusminus
eth
auf zu
17
276 EBCDIC-Hexadecimal Codes
3age 037 Hex
9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9
Zeh
United States
273
Beschreibung degree j lowercase
Zeh
Germany, Austria Beschreibung Grad j klein k klein 1 klein m klein
0 1 2 3 4 5 6 7 8 9
k lowercase 1 lowercase m lowercase n lowercase o lowercase p lowercase q lowercase r lowercase
A
a
us
a
B C
o
us
o
cedilla
E
Aelig
A 0
Cedile R
currency mu,
klein o klein p klein q klein r klein n
hochgestellt hochgestellt ae Ligatur
aelig
D F
n
micro
Ligatur Währung
AE
my,
micro
A B
tilde s lowercase t lowercase u lowercase v lowercase w lowercase x lowercase y lowercase z lowercase inverse exclam.mk inverse quest, mk
A C
Destroke, Eth
invers Fragezch. invers Destroke, Eth
A D
Y acute
Y
A E
Thorn
Thorn
A F
registered
A
KN)
A 2 A 3 A 4
A 5 A 6 A 7 A 8 A 9 A A
TM
sz
(langes s)
klein t klein u klein v klein w klein x klein y klein z klein Ausrufez. s
aigu
eingetr.
Warenz.
Anhang
17.1 EBCDIC Code-Tabelle
277
EBCDIC-Hexadecimal Codes United States 'age 037
273 Zeh
Germany, Austria Beschreibung
B
Beschreibung hat, logical not Pound Sterling
B
Yen
Yen
B
multiply dot copyright
Multipl.-Punkt copyright
B
section
B
paragraph fractal 1/4 fractal 1/2 fractal 3/4
at, Klammeraffe Absatzmarke Bruch 1/4 Bruch 1/2 Bruch 3/4
Hex B
B
B
B 8 B 9
Zeh
Cent
Pfund
Sterling
left bracket right bracket overline umlaut
vertikaler Balken Uberstrich
E
acute
Accent
F
multiply
B A B B B C D
0(N)
left bracelet
1 2 3 4 5 6
A uppercase B uppercase
7
logisches Umlaut
aigu Multipl. Zeichen Umlaut
A
A B
C uppercase D uppercase
D
E uppercase F uppercase
E F
G uppercase H uppercase
G H I
B
I uppercase SHY (subtract o caret
8 9 A
not
C
hw)
a
groß groß groß groß groß groß groß groß großl
subtract halfword circonflex
o
C
o
e
splitvbar
D
o
grave
o
E
o
acute
o
grave aigu
F
o
tilde
o
tilde
17
278 EBCDIC-Hexadecimal Codes United States Page 037 Hex
0(N) 1 2 3 4 5 6 7
Zeh
Beschreibung right bracelet J uppercase K uppercase L uppercase M uppercase N uppercase 0 uppercase
273 Zeh
Germany, Austria
u
u
Beschreibung_ Umlaut
groß groß L groß M groß N groß 0 groß P groß Q groß R groß J K
8 9 A
P uppercase Q uppercase R uppercase sup 1
B
u
caret
C
u
e
geschw.
D
u
grave
u
E
u
acute
u
F
y e backslash
E 0(N) E 1 2 3 4 5 6 7 E 8 E 9 E A E B E C E D E E E F
divided
hoch 1 u
circonflex Klamm,
grave aigu y Umlaut O Umlaut
Z
geteilt S groß T groß U groß V groß W groß X groß Y groß Z groß
0
hoch 2 O circonflex backslash
S uppercase T uppercase U uppercase V uppercase W
uppercase
X uppercase Y uppercase
uppercase sup 2 0 caret e
O grave O acute 0 tilde
Anhang
O grave 0 aigu O tilde
zu
17.1 EBCDIC Code-Tabelle
279
EBCDIC-Hexadecimal Codes United States 3age 037 Hex 0
Zeh
Beschreibung
273 Zeh
Germany, Austria
0
Ziffer 0 Ziffer 1 Ziffer 2 Ziffer 3 Ziffer 4 Ziffer 5 Ziffer 6 Ziffer 7 Ziffer Ziffer 9 hoch 3 U circonflex eckige Klammer
Beschreibung
9
numeral numeral numeral numeral numeral numeral numeral numeral numeral numeral
A
sup 3
B
U caret
C
U
D E
U grave U acute
U grave U aigu
F
eight
Hex
1 2 3 4 5 6 7 8
0 1 2 3 4 5 6 7 8 9
e
ones
'FF'
zu
280
17
Wurzel-Routine
17.2 File
Anhang
Edit
EDIT
Edit_Settings
Compilers
Utilities
Menu
Test
01.01
DEURING.VI.EXEC(SQRT)
Help
Member SQRT saved
-
Command
= = =
Scroll
>
= = =
>
HALF
******
**************************
000001
/*REXX-PROZEDUR
000002
/*_
Top of
Data
****************************
_
000003 000004 000005
000006
*/
ZUM ERRECHNEN EINER WURZEL
Aufrufbeispiel: 1.
Vom Benutzer als Command
2.
Von einer EXEC mit
: TSO %SQRT 121,2,3 Funktionsaufruf: erg= SQRT(121,2,3) 3. Von einer EXEC mit CALL : call SQRT 121,2,3
erg= say result
000007 000008
Übergabe-Argumente:
000009
w
DER
000010
x
DIE x-TE WURZEL WIRD BERECHNET
0 00011
y
AUF y NACHKOMMASTELLEN GENAU WIRD GERECHNET
000012
_*/
000013 Parse 000014 if
Wert, DESSEN x-TE WURZEL BERECHNET WERDEN SOLL
typ
source
typ
.
.
'COMMAND'
=
000015 000016 if y
=
000017 if
=
x
''
then Parse ARG
w
','
x
else Parse ARG
w
,
x
then y then x
1'
=
2
=
2
',' y ,
y
/* Default fuer Nachkommastellen /* Default fuer x-te Wurzel
*/ */
000018 select
datatype(w) datatype(y)='CHAR' 000019
when
then return
000020
000021
when w
HALF
===>
_
000030 DO A=l TO 000031
y+1 SCHRITTWEITE=1*10**(-1*A+1)
000032
DO WHILE I