REXX Grundlagen für die z/OS Praxis 9783486598759, 9783486200256

Das Buch bringt IT-Experten und Studenten mit z/OS Grundkenntnissen die z/OS Sprache REXX in Theorie und Praxis nahe. Du

242 58 57MB

German Pages 319 [313] Year 2005

Report DMCA / Copyright

DOWNLOAD FILE

Polecaj historie

REXX Grundlagen für die z/OS Praxis
 9783486598759, 9783486200256

Citation preview

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
>>

"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