Kapitel 3 - Syntaxbeschreibung

295

Kapitel 3 - Syntaxbeschreibung

So geht's

296

REXX unter OS/2

Kapitel 3 - Syntaxbeschreibung

297

Lesehilfe für Syntaxdiagramme Bevor wir uns mit der Syntax der Befehle und Funktionen auseinandersetzen, möchte ich anhand einiger Beispiele eine kleine Lesehilfe für die Syntaxbeschreibung liefern. Grundsätzlich kann bei der Interpretation der syntaktischen Möglichkeiten immer dem Linienverlauf gefolgt werden. Sehen wir uns zu den verschiedenen Variationen je ein Beispiel an:

befehl

Ein Befehl wird ohne Parameter kodiert.

befehl

zwingender parameter

An einen Befehl geknüpft muß ein Parameter zwingend angegeben werden.

befehl

einer dieser Parameter muß angegeben werden einer dieser Parameter muß angegeben werden einer dieser Parameter muß angegeben werden

Unter mehreren möglichen Parametern muß einer zwingend angegeben werden.

befehl

Unter mehreren möglichen Parametern kann einer wahlfrei angegeben werden.

befehl

dieser Parameter kann wiederholt werden

Die wiederholte Angabe eines Parameters ist möglich.

Lesehilfe für Syntaxdiagramme

einer dieser Parameter kann angegeben werden einer dieser Parameter kann angegeben werden

298

REXX unter OS/2

Lesehilfe für Syntaxdiagramme Wie diese Regel in einem komplexeren Diagramm ausgelegt wird, soll das nachfolgende Beispiel verdeutlichen:

befehl kann_1 kann_1.1 kann_1.2 kann_2 kann_3 kann_4

kann/muß_4.3 kann_4.1 kann_4.2

kann_5

kann_5.1.mehrmals

Unter mehreren möglichen Parametern kann zunächst einer ausgewählt werden. Neben Parameter2 oder 3 kann keine weitere Angabe erfolgen. Hinter Parameter1 kann einer von zwei möglichen Subparametern angegeben werden. Die Angabe des Subparameters ist aber nicht zwingend. Wird Parameter4 kodiert, ist die Angabe eines der beiden Unterparameter (4.1 oder 4.2) möglich. Gleichgültig, ob einer der beiden Unterparameter angegeben wurde oder nicht, die Angabe des Parameters 4.3 ist zwingend. Wird der fünfte Parameter kodiert, ist ein Subparameter mit anzugeben. Der Subparameter kann beliebig oft wiederholt werden.

Lesehilfe für Syntaxdiagramme

Darüber hinaus gilt innerhalb der Diagramme folgende Regelung:

GROSSBUCHSTABEN



sind als feste Bestandteile des Befehles unverändert zu übernehmen

kleinbuchstaben



haben eine Stellvertreterfunktion und sind durch entsprechende Werte zu ersetzen

Klammern()



sind als feste Bestandteile des Befehles zu kodieren

UNTERSTRICHENES



stellt einen Defaultwert dar, der angenommen wird, wenn keine Parameterangabe erfolgt

299

ABBREV() ABBREV(string1,string2

Liebe Leser....

Kapitel 3 - Syntaxbeschreibung

) ,länge

Übergibt eine 1, wenn string2 identisch mit dem Beginn von string1 ist und die Länge von string2 nicht größer der angegebenen Länge ist. Wird diese Bedingung nicht erfüllt, erfolgt die Rückmeldung von 0. string1 Zeichenfolge, die geprüft werden soll. string2 Zeichenfolge, die als Grundlage für die Prüfung eingesetzt wird. länge Maximale inhaltliche Länge, die bei der Püfung von string2 berücksichtigt wird.

Beispiele: SAY ABBREV('Print','Pri') SAY ABBREV('PRINT','Pri') SAY ABBREV('PRINT','P',1)

1 0 1 REXX-Funktion

/**REXX*****************************/ PARSE UPPER ARG TEST . IF ABBREV(TEST,'T',1) THEN TRACE '?R'

300

REXX unter OS/2

ABS() ABS(zahl)

Übergibt den absoluten Wert einer Zahl ohne Rücksicht auf das Vorzeichen. zahl

REXX-Funktion

Die Zahl, deren absoluter Wert übergeben werden soll.

Beispiele: SAY ABS('5.95') SAY ABS('-6.04')

5.95 6.04

Kapitel 3 - Syntaxbeschreibung

301

ADDRESS ADDRESS umgebung ausdruck ausdruck1 wert

Mit ADDRESS wird die Systemumgebung benannt, an die ein Befehl zu übergeben ist. Unter OS/2-REXX sind folgende Umgebungen erreichbar: CMD Der OS/2-Befehlsprozessor PMREXX Die PrEsentation Manager Umgebung oder jede andere durch ADDRESS eingestellte Umgebung (wie ISREDIT unter SPF/2) umgebung Name des Environments, an das Befehle zur Ausführung übergeben werden sollen. ausdruck Befehl für das Environment. Der Befehl kann als Literal oder in einer Variablen übergeben werden. Hinweise: Die aktuelle Zuordnung kann durch die Built-in-Funktion ADDRESS() ermittelt werden.

Beispiele: ADDRESS ISREDIT "(start) = .ZF"

REXX-Instruktion

Um einen Befehl an die entsprechende Systemumgebung zu übergeben, wird der Name der Umgebung und der entsprechende Befehl angegeben. Nach Ausführung wird in die aktuelle Systemumgebung zurückgekehrt, wie immer sie heißt. Wird nur eine Systemumgebung angegeben, erfolgt eine Umschaltung dorthin. Sie bleibt erhalten, bis eine neue Umschaltung durchgeführt wird.

302

REXX unter OS/2

ADDRESS() ADDRESS()

REXX-Funktion

Meldet den Namen der Systemumgebung, innerhalb der die Abarbeitung der Befehle durchgeführt wird.

Beispiele: SAY ADDRESS() SAY ADDRESS() SAY ADDRESS()

'CMD' 'PMREXX' 'ISREDIT'

/* möglich */ /* möglich */ /* möglich */

Kapitel 3 - Syntaxbeschreibung

303

ARG() ARG(

) zahl ,E ,O

Übergibt eine Folge von Parametern oder Informationen über Parameter entsprechend der angegebenen Option. Wird kein Parameter in der ARG-Funktion angegeben, wird die Anzahl der übergebenen Parameter gemeldet. zahl Wird eine Zahl angegeben, wird der betreffende Parameter gelistet. Existiert das Argument nicht, wird ein Nullstring rückgemeldet. ,E Prüft das Vorhandensein (Exists) eines Argumentes und liefert 1 bei Vorhandensein bzw. eine 0 bei Nichtvorhandensein ,O Liefert eine 1 bei Nichtvorhandensein (Omitted), eine 0 bei Vorhandensein des Argumentes. Hinweis: Die Funktion arbeitet in der Hauptsteuerleiste (das von der Befehlszeile aus aufgerufene, hierarchisch oberste Programm einer Anwendung) fehlerhaft. Beispiele: (Keine Parameterangaben) 0 ' ' 0

Angenommen: DEMO1 'a',,'b' SAY ARG() 3 SAY ARG(1) 'a' SAY ARG(2) ' ' SAY ARG(3) 'b'

REXX-Funktion

Angenommen: DEMO1 SAY ARG() SAY ARG(1) SAY ARG(1,'E')

304

REXX unter OS/2

BEEP() BEEP(frequenz,dauer)

Erzeugt einen Ton. frequenz Die Hertzfrequenz des zu erzeugenden Tones. dauer Die Länge des Tones in Millisekunden. Frequenz kann ein Wert zwischen 37 und 32767, Dauer ein Wert zwischen 1 und 60.000 sein.

Beispiele:

OS/2-Funktion

/* REXX * CDUR ***********************/ c_dur="262 294 330 349 392 440 494 524" do i=1 to words(c_dur) call beep word(c_dur,i),500 end exit

/* REXX * PFIFF **********************/ do a=1 to 3 if a // 2 = 1 then do wert=50;start=2500;ende=2800 end else do wert=-50;start=2800;ende=2500 end do i=start to ende by wert call beep i,10 end end exit

Kapitel 3 - Syntaxbeschreibung

305

BIND "BIND datei TO DATABASE

" USING :option

Im Regelfall wird dieser Befehl nur gebraucht, wenn DB2/2 mit Programmen arbeiten soll, deren Quellencode aus zu kompilierenden Sprachen stammt (Cobol, C etc.). In diesen Fall werden SQL-Befehle vorübersetzt und mit der Datenbank verbunden. Hier soll BIND lediglich genutzt werden, um über entsprechende Optionen das Datumsformat für Europa anzupassen. datei Name der BIND-Datei in den Ablauf von DB2/2 eingebunden. Zur Nutzung unter REXX werden von der IBM mit DB2/2 drei Bindedateien für die unterschiedlichen Isolations Level mitgeliefert. Unser Zweck kann mit jeder beliebigen dieser Dateien SQLARXCS.BND, SQLARXUR.BND und SQLARXRR.BND) erreicht werden. USING :optionen Benennt den gemeinsamen Namensstamm von Compoundvariablen, die folgende Bedeutung haben (für uns sind nur die ersten beiden von Interesse, auf die restlichen verzichten wir): option.0 ..... Anzahl der Variablen des Stammes. option.1 ..... Datums- und Zeitformate. Möglich sind: DEF, USA, EUR, ISO, JIS und LOC option.2 ..... Isolation Level. Möglich sind (siehe Kapitel 1): RR, UR und CS

option.0=1 option.1="EUR" CALL SQLDBS "BIND C:\SQLLIB\SQLARXCS.BND TO DATABASE" , "USING :option" Regelt, daß Datums- und Zeitfelder gemäß der europäischen Schreibweise geführt werden.

DB2/2-SQLDBS-Befehl

Beispiel:

306

REXX unter OS/2

BITAND() BITAND(b-str-1

) , b-str-2

,füll

Das Ergebnis von BITAND() ist eine binäre Zeichenkette, die sich aus zwei Eingabezeichenketten zusammensetzt, die durch ein logisches UND bitweise logisch miteinander verglichen werden. Die Länge der Ausgabe entspricht der Länge der längeren Zeichenfolge. b-str-1 Die erste der durch UND miteinander zu verknüpfenden Zeichenketten. b-str-2 Die zweite der durch UND miteinander zu verknüpfenden Zeichenketten. füll Ist kein Füllzeichen angegeben, wird der UND-Vergleich beendet, sobald die kürzere der beiden Zeichenfolgen endet. Der verbleibende Rest der unverarbeiteten Zeichenfolge wird an das Ergebnis angehängt.

REXX-Funktion

Wurde ein Füllzeichen angegeben, wird die kürzere der beiden Zeichenketten rechts bis auf die Länge der anderen Zeichenkette aufgefüllt.

Beispiele: SAY BITAND('73'x,'27'x) SAY BITAND('43'x,'3333'x) SAY BITAND('43'x,'3333'x,'24'x)

'23'x '0333'x '0320'x

Kapitel 3 - Syntaxbeschreibung

307

BITOR() BITOR(b-str-1

) , b-str-2

,füll

Ausgabe ist eine binäre Zeichenkette, die sich aus zwei Eingabezeichenketten zusammensetzt, die durch ein logisches ODER bitweise logisch miteinander verglichen werden. Die Länge der Ausgabe entspricht der Länge der längeren Zeichenfolge. b-str-1 Die erste der durch ODER zu verknüpfende binäre Zeichenfolge. b-str-2 Die zweite der durch ODER zu verknüpfende binäre Zeichenfolge. füll Ist kein Füllzeichen angegeben, wird der ODER-Vergleich beendet, sobald die kürzere der beiden Zeichenfolgen endet. Der verbleibende Rest der unverarbeiteten Zeichenfolge wird an das Ergebnis angehängt. Wurde ein Füllzeichen angegeben, wird die kürzere der beiden Zeichenketten rechts bis auf die Länge der anderen Zeichenkette aufgefüllt.

SAY BITOR('12'x,'23'x) SAY BITOR('12'x,'2345'x) SAY BITOR('12'x,'2345'x,'40'x)

'33'x '3345'x '3374'x

REXX-Funktion

Beispiele:

308

REXX unter OS/2

BITXOR() BITXOR(b-str-1

) , b-str-2

,füll

Ausgabe ist eine Zeichenkette, die sich aus zwei Eingabezeichenketten zusammensetzt, die durch ein logisches EXCCUSIVE-ODER bitweise logisch miteinander verglichen werden. Die Länge der Ausgabe entspricht der Länge der längeren Zeichenfolge. b-str-1 Die erste der durch EXCLUSIVE-ODER zu verknüpfende binäre Zeichenfolge. b-str-2 Die zweite der durch EXCLUSIVE-ODER zu verknüpfende binäre Zeichenfolge. füll Ist kein Füllzeichen angegeben, wird der EXCLUSIVE-ODER-Vergleich beendet, sobald die kürzere der beiden Zeichenfolgen endet. Der verbleibende Rest der unverarbeiteten Zeichenfolge wird an das Ergebnis angehängt.

REXX-Funktion

Wurde ein Füllzeichen angegeben, wird die kürzere der beiden Zeichenketten rechts bis auf die Länge der anderen Zeichenkette aufgefüllt.

Beispiele: SAY BITXOR('12'x,'23'x) SAY BITXOR('12'x,'2345'x) SAY BITXOR('12'x,'2345'x,'40'x)

'31'x '3145'x '3174'x

Kapitel 3 - Syntaxbeschreibung

309

B2X() B2X(binärkette)

Wandelt eine binäre Zahl in eine hexadezimale Zahl um. Das Ergebnis enthält gegebenenfalls die Großbuchstaben A-F, keine Blanks. binärkette Die der Funktion als Input zu übergebende binäre Zeichenkette.

Hinweise: Zur besseren Lesbarkeit innerhalb der Binärzeichenkette kann zwischen zwei VierBit-Gruppen eine Leerstelle kodiert werden. Ist die Länge der Binärzeichenfolge nicht restlos durch vier teilbar, wird entsprechend links mit Nullen aufgefüllt.

SAY B2X('1101') SAY B2X('11010011') SAY B2X('1101 0011 1001')

'D'x 'D3'x 'D39'x

REXX-Funktion

Beispiele:

310

REXX unter OS/2

CALL CALL name , ausdruck

Durch die CALL-Instruktion kann eine EXEC (REXX-Programm) aus einer EXEC heraus aufgerufen werden. Es spielt dabei keine Rolle, ob es sich hierbei um eine interne Prozedur (sog. Subroutine) oder eine externe Prozedur (eingenständiges CMD-File) handelt. name Name der Subroutine, des Unterprogrammes oder der Funktion, die aufgerufen werden soll. ausdruck Übergabewert. Kann in Form von Literalen oder Variablen kodiert werden. Hinweise: Unterschiede ergeben sich nur aus den Übergabe-Übernahmemöglichkeiten von Variablen. Im Falle einer Subroutine sind Variablen mit ihren aktuellen Werten sowohl in der Hauptprozedur als auch in der Subroutine immer bekannt. Wird ein externes REXX-Programm aufgerufen, müssen Variablen in beide Richtungen übergeben und empfangen werden (siehe auch RETURN und RESULT). Wird der Name als Literal kodiert, erfolgt der Aufruf zwingend extern.

REXX-Instruktion

Beispiel: /* REXX ***********************************/ SAY "Zahl zwischen 1 und 5" PULL zahl CALL CHECK zahl EXIT CHECK: IF zahl >= 1 & zahl 0 SAY "Auswahl??" wahl = TRANSLATE(SYSGETKEY("NOECHO")) END SELECT WHEN wahl = "E" THEN LEAVE WHEN wahl = 1 THEN CALL blk_jack : END END SAY "Bye. bye..." EXIT

354

REXX unter OS/2

DO UNTIL bedingung DO UNTIL bedingung befehl(e) END

Die Schleife wird durchlaufen, bis die schleifensteuernde Bedingung erfüllt ist. Im Gegensatz zur WHILE-Schleife wird die Bedingung erst am Schleifenende überprüft und entschieden, ob die Schleife ein weiteres Mal durchlaufen werden soll. Ein Durchlauf findet in jedem Fall statt.

Beispiele:

REXX-Instruktion

: DO UNTIL durst = "N" CALL trinken SAY "Durst (J/N)" PULL durst END SAY "Ruelps" : Dieses Beispiel könnte man im Südstaaten-Slang dokumentieren: "A bissl was geht immer", oder wie der Bayer sagt: Der Mensch hebt sich dadurch vom Tier ab, daß er nicht trinkt, weil er Durst hat, sondern weil's ihm schmeckt. Egal ob Durst vorhanden ist oder nicht, eins geht immer. : DO UNTIL eingabe > 0 & eingabe < 10 SAY "Geben Sie eine Zahl zwischen 1 und 9 ein" PULL eingabe END : Hier haben wir eine in die Schleifenbedingung integrierte Plausibilitätsprüfung der Bedienereingabe. Die Schleife wird zunächst in jedem Fall betreten und erlaubt dem Bediener eine Tastatureingabe. Am Schleifenende wird die Bedingung geprüft. Ist sie erfüllt, war die Eingabe richtig, und die Schleife wird verlassen. Ansonsten wird sie aufs neue betreten und erlaubt dem Bediener einen neuen Eingabeversuch.

Kapitel 3 - Syntaxbeschreibung

355

DO WHILE bedingung DO WHILE bedingung befehl(e) END

Die Schleife wird durchlaufen, solange die schleifensteuernde Bedingung erfüllt ist. Im Gegensatz zur UNTIL-Schleife wird die Bedingung bereits am Schleifenanfang überprüft und vor dem ersten Betreten der Schleife entschieden, ob sie durchlaufen werden soll. Ist die Bedingung am Schleifenanfang nicht erfüllt, wird die Schleife übersprungen. Wurde die Schleife einmal durchlaufen, wird bei Rückkehr zum Schleifenkopf die Bedingung aufs neue überprüft. Trifft sie noch immer zu, wird die Schleife ein weiteres Mal durchlaufen. Anderenfalls wird die Schleife verlassen. Beispiele: : SAY "Durst (J/N)" PULL durst DO WHILE durst = "J" CALL trinken SAY "Durst (J/N)" PULL durst END SAY "Auf Wiedersehen" : Ist kein Durst vorhanden, wird die Schleife nicht betreten. Anderenfalls wird sie durchlaufen und die Bedingung vor jedem weiteren Durchlauf aufs neue überprüft. Trifft die Bedingung nicht mehr zu, wird die Schleife verlassen.

REXX-Instruktion

/* REXX * DEMO ********************************/ ARG zahl DO WHILE DATATYPE(zahl) = "CHAR" SAY "Geben Sie eine Zahl ein" PULL zahl END : Das Programm kann einen Startwert empfangen, der numerisch sein muß. Wurde kein (zahl ist NULLSTRING) oder ein falscher Wert übergeben, wäre die Schleifenbedingung erfüllt, und in der Schleife wird so lange eine Bedienereingabe verlangt, bis diese Eingabe numerisch ist. Wurde ein numerischer Startwert empfangen, wird die Schleife übersprungen.

356

REXX unter OS/2

DROP DROP variable ,variable

Durch DROP werden Variablen oder Variablenstämme auf Grundwert gesetzt (sie zeigen inhaltlich wieder auf ihren zu Großschreibung konvertierten Eigennamen).

REXX-Instruktion

Beispiele: y=5 drop a x.1 x.y Löscht die Inhalte der Variablen A, X.1 und X.5 DROP eingabe. Setzt alle Variablen des Stammes EINGABE. zurück, das heißt alle Variablen, die mit EINGABE. beginnen.

Kapitel 3 - Syntaxbeschreibung

357

DROP "DROP

INDEX index TABLE tabelle

"

Führt eine Löschung in der Datenbank durch. INDEX index Führt zum Löschen eines Index aus der Datenbank. TABLE tabelle Entfernt eine Tabelle mit allen Daten und Definitionen aus der Datenbank.

Ein Index, der zu einem Primärschlüssel gehört, kann nicht gelöscht werden. Wird dagegen der Primärschlüssel gelöscht, wird auch der zugehörige Index gelöscht. Mit dem Löschen einer Tabelle werden auch deren Indizes, Primär- und Fremdschlüssel gelöscht. Nach dem Löschen einer Tabelle kann deren Name wieder neu vergeben werden.

DB2/2-SQLEXEC-Befehl

Hinweise:

358

REXX unter OS/2

D2C() D2C(integer

) ,wert

Umwandlung von Dezimal nach Character. Wenn wert nicht angegeben ist, muß integer eine positive Zahl sein, ansonsten wird ein Fehler erzeugt. integer Dezimalwert, der umgewandelt werden soll. wert

REXX-Funktion

Ist die Länge des Ergebnisses in Byte nach der Übersetzung. Hat das Ergebnis in der angegebenen Anzahl Byte nicht Platz, wird entsprechend links abgeschnitten.

Beispiele: SAY SAY SAY SAY SAY

D2C(7) D2C(129) D2C(129,1) D2C(129,2) D2C(45,0)

'07'x '81'x '81'x '0081'x ''

Kapitel 3 - Syntaxbeschreibung

359

D2X() D2X(integer

) ,wert

Umwandlung von Dezimal nach Hexadezimal. Wenn wert nicht angegeben ist, muß integer eine positive Zahl sein, ansonsten wird ein Fehler erzeugt. integer Dezimalzahl, die umgewandelt werden soll. wert Ist die Länge des Ergebnisses in Byte nach der Übersetzung. Hat das Ergebnis in der angegebenen Anzahl Byte nicht Platz, wird entsprechend links abgeschnitten.

SAY SAY SAY SAY SAY SAY

D2X(7) D2X(129) D2X(129,1) D2X(129,2) D2X(129,4) D2X(45,0)

'7' '81' '1' '81' '0081' ''

REXX-Funktion

Beispiele:

360

REXX unter OS/2

ENDLOCAL() ENDLOCAL()

ENDLOCAL() stellt die Situation für aktuelles Laufwerk, Verzeichnis und die Umgebungsvariablen wieder her, wie sie vor der letzten SETLOCAL()-Funktion gültig waren.

Hinweise: Wird nach aufgerufener SETLOCAL()-Funktion im Programm kein ENDLOCAL() kodiert, werden die abgespeicherten Werte bei Ende des Programmes rückgespeichert. Die Funktion liefert eine 0, wenn das Rückspeichern nicht möglich war, bzw. eine 1 bei ordnungsgemäßem Ende.

OS/2-Funktion

Beispiel: /* REXX ********************************/ : tmp=setlocal() pull eingabe /* Umgebungsvariable, Laufwerk und aktuelles /* Verzeichnis können verändert werden tmp=endlocal() /* das ursprüngliche Umfeld wird wieder /* rückgespeichert :

*/ */ */ */

Kapitel 3 - Syntaxbeschreibung

361

ERRORTEXT() ERRORTEXT(meldungsnummer)

Übergibt die entsprechende Fehlermeldung. Die Meldungsnummer muß zwischen 0 und 99 liegen, ansonsten wird ein Nullstring übergeben. Die Fehlermeldungen stehen in unmittelbarem Zusammenhang mit den ausgegebenen Returncodes. Wird bei Syntaxfehler RC 16 ausgegeben, wird diese Situation in der Fehlermeldung 16 erklärt. Eine Beschreibung der REXX-Fehlernummern und -meldungen finden Sie im Anhang A.

SAY ERRORTEXT(16) SAY ERRORTEXT(36) SAY ERRORTEXT(60)

'Label not found' 'Unmatched "(" in Expression' ' '

REXX-Funktion

Beispiele:

362

REXX unter OS/2

EXECUTE "EXECUTE befehl

" , USING variable USING DESCRIPTOR descriptor

Führt einen vorher übersetzten SQL-Befehl aus. befehl Der Befehl, der unter diesem Namen über PREPARE übersetzt wurde. USING variable Eine oder mehrere Variablen, die bei dynamischen SELECT-Befehlen der Reihe nach die Platzhalter ersetzen. USING DESCRIPTOR descriptor

DB2/2-SQLEXEC-Befehl

Zeigt auf die SQLDA (Dynamic Area), die die Programmvariablen beschreibt. Vor OPEN müssen die entsprechenden Werte in die SQLDA gestellt werden.

Kapitel 3 - Syntaxbeschreibung

363

EXECUTE "EXECUTE IMMEDIATE variable"

Übersetzt einen SQL-Befehl, der als Zeichenkette vorliegt. Im Gegensatz zu EXECUTE wird die übersetzte Form des Befehles nach Ausführung sofort wieder gelöscht. variable Enthält den zu übersetzenden Befehl. Nicht auf diese Weise zu verarbeiten sind die Befehle: SELECT INTO, EXEC SQL und Befehls-Delimiter wie END-EXEC.

Enthält die zu übersetzende Zeichenkette Fehler, liegt der entsprechende Fehlercode in der SQLCA.

DB2/2-SQLEXEC-Befehl

Hinweis:

364

REXX unter OS/2

EXIT EXIT zahl

Wird benutzt, um eine Prozedur unmittelbar zu beenden. Mit EXIT kann das Ende der Prozedur auch inmitten des Ablaufes gelegt werden. zahl Muß eine ganze Zahl zwischen 0 und 4095 sein. Wird zahl angegeben, wird der Wert bei Programmende als Returncode zurückgemeldet.

Beispiele:

REXX-Instruktion

/* REXX **************************************/ DO FOREVER CALL SYSCLS SAY 'Druckdatei angeben' PULL datei IF LENGTH(datei) = 0 THEN EXIT /* Instruktionen zur Verarbeitung */ END

/* REXX **************************************/ ARG PARM IF LENGTH(parm) = 0 THEN EXIT 4 : /* Regulaere Verarbeitung */ : EXIT 0

Kapitel 3 - Syntaxbeschreibung

365

FETCH "FETCH cursor

, INTO variable USING DESCRIPTOR descriptor

"

Positioniert den Satzzeiger in der Ergebnistabelle auf den nächsten Satz und kopiert die Feldinhalte der Ergebnistabelle in die angegebenen Programmvariablen. cursor Name des Cursors (Satzzeigers) der mit DECLARE CURSOR definiert wurde. INTO variable Eine oder mehrere Variablen, die die Feldinhalte der Ergebnistabelle aufnehmen. Die Wertzuweisung erfolgt der Reihe nach von links nach rechts. USING DESCRIPTOR descriptor Zeigt auf die SQL-Dynamic Area, die eine Beschreibung der Variablen enthält, die zur Wertübernahme genutzt werden sollen. Die SQLDA muß vor Befehlsausführung entsprechend versorgt werden.

Steht der Satzzeiger bereits auf oder hinter dem letzten Datensatz, wird in SQLCODE der Wert +100 zurückgegeben.

DB2/2-SQLEXEC-Befehl

Hinweise:

366

REXX unter OS/2

FILESPEC() FILESPEC(

DRIVE PATH NAME

,datei)

Zerlegt einen vollständigen Dateinamen in Laufwerk, Pfad und Dateinamen gemäß der angegebenen Option. DRIVE Der Laufwerksbuchstabe von datei. Der Parameter kann mit D abgekürzt werden. PATH Der Verzeichnispfad von datei. Der Parameter kann mit P abgekürzt werden. NAME Der Name von datei mit Dateierweiterung. Der Parameter kann mit N abgekürzt werden.

OS/2-Funktion

Beispiele: /* REXX **************/ parse source . . name . say filespec("D",name) say filespec("P",name) say filespec("N",name)

"D:" "\#RXOS2\" "DEMO.CMD"

/* möglich */ /* möglich */ /* möglich */

Kapitel 3 - Syntaxbeschreibung

367

FORM() FORM()

Übergibt den aktuellen Wert aus NUMERIC FORM (siehe hierzu REXX-Instruktion NUMERIC).

REXX-Funktion

368

REXX unter OS/2

FORMAT() FORMAT(zahl

) ,vor ,nach

Formatiert eine Zahl in bezug auf Vor- oder Nachkommastellen unter Berücksichtigung der Regeln für Auf- oder Abrunden. zahl Ist nur zahl angegeben, wird nach den Regeln von REXX gerundet (NUMERIC DIGITS). vor Bestimmt die Anzahl der Vorkommastellen. Ist der Vorkomma-Stellenwert zu klein um zahl aufnehmen zu können, wird Fehler gemeldet. Ist der Vorkommawert größer, wird links mit BLANK aufgefüllt. nach

REXX-Funktion

Anzahl der Dezimalstellen. Werden in zahl vorhandene Nachkommastellen beschnitten, wird entsprechend gerundet. Ist der Wert größer, als die in zahl vorhandenen Dezimalstellen, wird mit 0 aufgefüllt.

Beispiele: SAY SAY SAY SAY SAY SAY

FORMAT('3',4) FORMAT('3.75',4,0) FORMAT('3.75',4,3) FORMAT('-.28',4,1) FORMAT('-4.5',,4) FORMAT(' - 6.76')

' 3' ' 4' ' 3.750' ' -0.3' '-4.5000' '-6.76'

Kapitel 3 - Syntaxbeschreibung

369

FUZZ() FUZZ()

Übergibt den aktuellen Wert aus NUMERIC FUZZ. Soll dieser Wert für einen Verarbeitungsschritt geändert werden, ist es sinnvoll, den aktuellen Wert in einer Variablen abzulegen, um nach der Verarbeitung NUMERIC FUZZ auf den alten Wert zurücksetzen zu können.

: altfuzz=fuzz() numeric fuzz 3 /* Verarbeitung mit dem neuen Wert von FUZZ */ numeric fuzz altfuzz :

REXX-Funktion

Beispiel:

370

REXX unter OS/2

GET "GET

DATABASE CONFIGURATION FOR dbk USING var DATABASE DIRECTORY ENTRY scanid USING var

"

Die GET-Anweisung erlaubt die Abfrage diverser Informationen aus dem Umfeld von DB2/2. DATABASE CONFIGURATION FOR dbk USING var Liefert Konfigurationsdaten über die angegebene Datenbank in der hinter USING angegebenen Compoundvariablen. Vor Aufruf müssen im gleichen Variablenstamm Werte vorbereitet werden. Der Aufbau des Variablenstammes sieht folgendermaßen aus: var.0 ..... Anzahl der Compoundvariablen, die gebildet werden sollen. var.1 ..... Wert, der abgefragt werden soll und in der nächsten Variablen zurückgeliefert wird. var.2 ..... Wert, der über die vorausgegangenen Variablen abgefragt wurde. var.3 ..... wie var.1 var.4 ..... wie var.2 : var.0 und alle ungeraden var-Elemente müssen vor Verarbeitung gefüllt werden. Alle geraden var-Elemente werden vom Befehl mit Daten gefüllt. Die möglichen Inhalte der ungeraden var-Elemente sind im Handbuch »DB2/2 Programming Guide« unter »SQLFUPD« nachzulesen.

DB2/2-SQLDBS-Befehl

GET DATABASE DIRECTORY ENTRY scanid Liefert globale Informationen über die Datenbank in einem Variablenstamm. Die Struktur des Stammes ist in den IBM-Handbüchern unter dem Schlagwort SQLDINFO nachzulesen. Wird keine Angabe USING var gemacht, wird als VariablenstammName SQLDINFO benutzt. Bevor die Abfrage erfolgen kann, muß ein "OPEN DIRECTORY..." erfolgen. Die einzelnen Variablen des Stammes haben folgende Bedeutung: var.0 ..... Anzahl der Copmpoundvariablen, die gebildet wurden (immer 9). var.1 ..... ALIAS-Name

Kapitel 3 - Syntaxbeschreibung

371

GET var.2 var.3 var.4 var.5 var.6 var.7 var.8 var.9

..... ..... ..... ..... ..... ..... ..... .....

Datenbankname Laufwerk Dateisystem Node Name (für entfernte Datenbanken) Datenbanktyp Kommentar CodePage Datenbankentyp (lokal oder entfernt)

Beispiele: CONFIG.0=4 CONFIG.1=100 /* Abfrage des Country Code */ CONFIG.3=101 /* Abfrage der Code Page */ CALL SQLDBS "GET DATABASE CONFIGURATION FOR db1 USING :config" Kann zu folgenden Variableninhalten führen: CONFIG.2 49 /* Rückgabe des Country Code */ CONFIG.4 850 /* Rückgabe der Code Page */

DB2/2-SQLDBS-Befehl

CALL SQLDBS "OPEN DATABASE DIRECTORY ON 0 USING :scan" CALL SQLDBS "GET DATABASE DIRECTORY ENTRY :scan.1 USING :info" CALL CLOSE "DATABASE DIRECTORY :scan.1" Kann zu folgenden Variableninhalten führen: INFO.0 9 /* ist immer 9 */ INFO.1 RXDEMO /* ALIAS-Name */ INFO.2 RXDEMO /* Datenbank-Name */ INFO.3 C: /* Laufwerk */ INFO.4 INFO.5 INFO.6 DB2/2 VER. 4.00 /* Datenbank Typ */ INFO.7 Test für REXX DB2/2 /* Kommentar */ INFO.8 850 /* Code Page */ INFO.9 0 /* Home Datenbank=lokal */

372

REXX unter OS/2

IF - THEN - ELSE IF bedingung THEN befehl ELSE befehl

IF bietet die Möglichkeit, eine bestimmte Situation zu erkennen. Trifft die Bedingung zu, wird der Befehl hinter THEN ausgeführt. IF Leitet die Fragestellung ein. bedingung Ist ein Ausdruck. Sollen mehrere kleine Bedingungen zu einer Frage zusammengefaßt werden, können sie mit Bool'schen Operanden miteinander verknüpft werden. THEN Ist der JA-Zweig. Er wird durchlaufen, wenn die Bedingung erfüllt ist. ELSE Ist der NEIN-Zweig. Er wird durchlaufen, wenn die Bedingung nicht erfüllt ist. Die Kodierung des Nein-Zweiges ist nicht zwingend. befehl Ist die Instruktion, die im Falle JA oder NEIN ausgeführt werden soll. Generell ist an den JA- oder NEIN-Zweig geknüpft nur eine Instruktion möglich. Sollen mehrere Befehle ausgeführt werden, sind sie als Befehlsfolge zwischen DO und END einzugrenzen und werden wie ein Befehl behandelt.

REXX-Instruktion

Beispiel: : IF ZAHL >= 20 & zahl bis THEN msg="FALSCH" ELSE msg="OK" RETURN msg

Kapitel 3 - Syntaxbeschreibung

403

PUSH PUSH ausdruck

Der aufgelöste Ausdruck wird im Stackbereich nach dem Prinzip LIFO (Last In First Out) eingefügt. Wird kein Ausdruck angegeben, wird ein Nullstring (eine Leerzeile) hinterlegt. Die aktuelle Anzahl von Sätzen im Stack kann durch die Built-in-Funktion QUEUED() ermittelt werden. ausdruck Variablen oder Literale können in Folge angegeben werden.

Beispiel:

REXX-Instruktion

Hat folgenden Inhalt des Stacks zur Folge: Fred Feuerstein August Nieselpriem Alfred Neumann Nullstring

REXX-Instruktion

push push 'Alfred Neumann' push "August Nieselpriem" push "Fred Feuerstein"

404

REXX unter OS/2

QUEUE QUEUE ausdruck

Der aufgelöste Ausdruck wird in den Stackbereich nach dem Prinzip FIFO (First In First Out) eingearbeitet. Wird kein Ausdruck angegeben, wird ein Nullstring hinterlegt. ausdruck Kann ein Literal oder eine Variable sein, oder beides.

Beispiel:

REXX-Instruktion

QUEUE 'Alfred Neumann' QUEUE "August Nieselpriem" QUEUE "Fred Feuerstein" QUEUE Hat folgenden Inhalt des STACK zur Folge: Alfred Neumann August Nieselpriem Fred Feuerstein NULLSTRING

Kapitel 3 - Syntaxbeschreibung

405

QUEUED() QUEUED()

Übergibt die Gesamtanzahl der Sätze im aktiven Stackbereich.

Beispiel:

REXX-Funktion

/* REXX ***********************************************/ CALL SYSCLS SAY 'Dateinamen eingeben' datei = LINEIN() IF STREAM(datei,"C",QUERY EXISTS") = "" THEN EXIT DO WHILE LINES(datei) > 0 QUEUE LINEIN(datei) END SAY 'In' datei 'sind' queued() 'Datensätze gespeichert' DO QUEUED() PARSE PULL satz SAY satz END EXIT

406

REXX unter OS/2

RANDOM() RANDOM(

) min

,max

Liefert eine Zufallszahl zwischen 0 und 999, wenn max und min nicht angegeben ist. Diese beiden Werte können ansonsten die Streuung der Pseudo-Zufallszahl steuern. Der zwischen max und min liegende Bereich darf nicht größer als 100000 sein.

Beispiele:

REXX-Funktion

SAY RANDOM() SAY RANDOM(7,14) SAY RANDOM(5)

329 12 43

/ möglicherweise */ / möglicherweise */ / möglicherweise */

/* REXX **************************************/ CALL SYSCLS DO FOREVER SAY 'Zahlenraten, Eingabe (0 bis 9)' PULL zahl IF DATATYPE(zahl)='CHAR' ! zahl > 9 then exit IF zahl=RANDOM(,9) THEN SAY 'Treffer, OK' ELSE SAY 'Falsch geraten, Stuemper' END

Kapitel 3 - Syntaxbeschreibung

407

RD "RD

verzeichnis" laufwerk

Entfernt ein Verzeichnis, sofern es leer ist. laufwerk Laufwerksbezeichnung, auf dem das zu löschende Verzeichnis liegt (sofern es nicht auf dem aktuellen ist). verzeichnis Name des zu löschenden Verzeichnisses.

Hinweise: Ist das Verzeichnis nicht leer, wird die Operation nicht ausgeführt. In einer praktischen Anwendung wird man an dieser Stelle lieber SysRmDir aus der REXXUTIL.DLL einsetzen.

Beispiel:

OS/2-Befehl

/* REXX ******************************/ SAY "Name des zu löschenden Verzeichnisses?" PULL verz "RD" verz IF rc = 0 THEN SAY "Verzeichnis" verz "gelöscht" ELSE DO SAY "verz "konnte nicht gelöscht werden." say "Verzeichnis nicht leer, oder Verzeichnisname" SAY "falsch eingegeben." END :

408

REXX unter OS/2

REN "REN name_alt name_neu"

Umbenennen einer Datei oder eines Verzeichnisses. name_alt Name der Datei oder des Verzeichnisses, der geändert werden soll. name_neu

OS/2-Befehl

Neuer Name, der dem Verzeichnis oder der Datei zugewiesen werden soll.

Hinweis: Wildcards sind erlaubt.

Kapitel 3 - Syntaxbeschreibung

409

REORG "REORG TABLE tab IN dbk

" INDEX iname

USE pfad

Reorganisiert eine Tabelle in einer Datenbank. tab Name der Tabelle, die reorganisiert werden soll. dbk Name der Datenbank, die die Tabelle enthalten muß. iname Name des Index, der Grundlage für die Reorganisation sein soll. pfad Pfadangabe für temporäre Dateien, die während der Neuindizierung gebraucht werden. Fehlt diese Angabe, werden die Temporärdateien im gleichen Verzeichnis erzeugt, in dem auch die Datenbank liegt.

DB2/2-SQLDBS-Befehl

410

REXX unter OS/2

RETURN RETURN ausdruck

RETURN wird genutzt, um aus einer EXEC zu einer höherliegenden, beziehungsweise zurück zum Punkt des Aufrufes zu kommen. Dabei können Variablen oder Literale zurückgereicht werden. Existiert keine übergeordnete Prozedur, führt die Anwendung der Instruktionen RETURN und EXIT zum gleichen Ergebnis (die Prozedur wird beendet). ausdruck Können Variablen oder Literale in beliebiger Folge sein.

Beispiel:

REXX-Instruktion

/* REXX * PROG1 *********/ x=2 DO x x = x * x CALL prog2 x x=result SAY 'X:' x END EXIT

Bildschirmausgaben während des Ablaufes: X: X: X: X:

4 16 256 65536

/* REXX * PROG2 */ ARG x SAY "X:" x x=x*x RETURN X

Kapitel 3 - Syntaxbeschreibung

411

REVERSE() REVERSE(string)

Kehrt die Zeichenfolge eines Strings um. string Repräsentiert die Zeichenfolge in Form eines Literals oder einer Variablen, die umgekehrt werden soll.

SAY REVERSE('llot tsi XXER')

'REXX ist toll'

REXX-Funktion

Beispiel:

412

REXX unter OS/2

RIGHT() RIGHT(string,länge

) ,füllzeichen

Übergibt eine Zeichenfolge in der angegebenen Länge von rechts. Situationsabhängig wird nach der angegebenen Anzahl Byte auf der linken Seite abgeschnitten oder mit dem angegebenen Füllzeichen aufgefüllt (Standard ist BLANK). string Zeichenfolge, von der rechtsbündig die entsprechenden Zeichen zu übernehmen sind. länge Anzahl Bytes ab hinterster Position. Ist die Zeichenfolge kürzer als die angegebene Länge, wird sie auf die entsprechende Länge aufgefüllt. Ist die Zeichenfolge länger als die angegebene Länge, wird sie beschnitten. füllzeichen

REXX-Funktion

Sofern die Zeichenfolge kürzer der angegebenen Länge ist, wird sie mit dem angegebenen Füllzeichen aufgefüllt. Ist kein Füllzeichen angegeben, wird als Füllzeichen BLANK genutzt.

Beispiele: SAY SAY SAY SAY

RIGHT('Freibier',10) RIGHT('Freibier',10,'.') RIGHT('Hans ist doof',4) RIGHT('25',4,'0')

' Freibier' '..Freibier' 'doof' '0025'

Kapitel 3 - Syntaxbeschreibung

413

ROLLBACK "ROLLBACK

" WORK

Beendet eine UNIT of WORK und macht alle Änderungen, die seit Beginn der Unit of Work gamcht wurden, rückgängig.

Veränderungen, die durch COMMIT bereits "rechtskräftig" geworden sind, können mit ROLLBACK nicht mehr rückgängig gemacht werden. Nach Abschluß des ROLLBACK werden von DB2/2 alle Sperren frei.

DB2/2-SQLEXEC-Befehl

Hinweise:

414

REXX unter OS/2

RxFuncAdd() RxFuncAdd(aufruf_name,dll_name,funktions_name)

Zieht eine Funktion aus einer Dynamic-Link-Library an und macht sie unter einem beliebigen Namen unter OS/2 verfügbar. aufruf_name Der Name, unter dem die aus der DLL entnommene Funktion aufgerufen werden kann. dll_name Name einer Dynamic-Link-Library, aus der eine Funktion geladen werden soll. funktions_name Name der zu ladenden Funktion, wie er in der jeweiligen DLL hinterlegt ist. Hinweise: Aufrufname und Funktionsname können identisch sein, müssen aber nicht. In REXX gibt es eine ganze Reihe sogenannter Dienstprogrammfunktionen, die in der REXXUTIL.DLL geliefert werden. Diese Funktionen sind unter dem Namen SysLoadFuncs gemeinsam erreichbar (einzeln sind sie unter Namen wie SysCls oder SysDriveInfo ansprechbar). Um alle diese Funktionen zu aktivieren, müssen sie einmal in einer OS/2-Session angezogen werden (am besten in der STARTUP.CMD). Hier kann ein REXX-Zweizeiler zum gewünschten Ergebnis führen:

REXX-Funktion

Beispiele: /* REXX *****************************************/ call RXFUNCADD "LoadFuncs","REXXUTIL","SysLoadFuncs" call LoadFuncs EXIT Genausogut wäre auch /* REXX *****************************************/ x=RXFUNCADD("LoadFuncs","REXXUTIL","SysLoadFuncs") x=LoadFuncs() EXIT

Kapitel 3 - Syntaxbeschreibung

415

RxFuncDrop() RxFuncDrop(name)

Entfernt eine Funktion aus der Liste der verfügbaren Funktionen. name Name der Funktion, die nicht mehr benötigt wird.

Hinweis: Es ist im allgemeinen nicht ratsam, eine momentan nicht mehr benötigte Funktion aus der REXXUTIL.DLL auf diese Weise fallenzulassen. Über kurz oder lang wird man froh sein, wieder darauf zurückgreifen zu können und sie nicht erst wieder über RxFuncAdd() laden zu müssen.

: call RXFUNCDROP "RxMessageBox" : tmp=RXFUNCDROP("RxMessageBox") :

REXX-Funktion

Beispiel:

416

REXX unter OS/2

RxFuncQuery() RxFuncQuery(name)

Prüft, ob die Funktion in der Liste der verfügbaren Funktionen enthalten ist, oder nicht. Im JA-Fall wird eine 0 zurückgegeben, anderenfalls eine 1. name

REXX-Funktion

Name der Funktion, deren Verfügbarkeit überprüft werden soll.

Beispiel: : if rxfuncquery("DINGDONG") = 0 then say "Funktion DINGDONG ist verfügbar" else say "Funktion DINGDONG ist unbekannt" :

Kapitel 3 - Syntaxbeschreibung

417

RxMessgeBox() RxMessageBox(text

) ,

, titel

, knopf

symbol

Erzeugt ein Nachrichtenfenster. Die Funktion ist nur unter PMREXX oder einer PMAnwendung heraus aufrufbar. text Der auszugebende Meldungstext. titel Die Überschrift im Nachrichtenfenster, Standardtitel ist FEHLER knopf Regelt die Art und Anzahl der Druckknöpfe, die im Nachrichtenfenster gezeigt werden sollen. Möglich sind:

REXXUTIL-Funktion

Ok ........................Nur der Druckknopf wird gezeigt. OkCancel .............Je ein Druckknopf< OK> und (Cancel) wird gezeigt. Cancel ..................Ein Druckknopf für (cancel) wird angezeigt. Enter ....................Ein Druckknopf (Enter) wird sichtbar. EnterCancel .........In der Dialogbox erscheint ein Druckknopf für und einer für . RetryCancel .........Je ein Knopf für und (Cancel) wird ausgegeben. AbortRetryIgnore ..Es werden angezeigt: (Abort), (Retry) und (Ignore). YesNo ...................Es erscheint ein Konopf für (Yes) und einer für (No). YesNoCancel .......Die Druckknöpfe im Fenster heißen (Yes), (No) und (Cancel).

418

REXX unter OS/2

RxMessageBox() symbol Mit Ausgabe eines Textes und entsprechenden Drückknöpfen kann ein Symbol im Dialogfenster gezeigt werden. Durch nachfolgende Angaben werden gezeigt (hier irrt das OS/2-Handbuch): NONE HAND QUESTION EXCLAMATION ASTERISK INFORMATION QUERY WARNING ERROR

➪ ➪ ➪ ➪ ➪ ➪ ➪ ➪ ➪

Nichts Kreis mit Schrägstrich (Parkverbot) Fragezeichen im Kreis Ausrufezeichen im Dreieck i im Kreis i im Kreis Fragezeichen im Kreis Ausrufezeichen im Dreieck Kreis mit Schrägstrich (Parkverbot)

Rückmeldung Die Funktion liefert einen Wert zurück, der abhängig zum gedrückten Knopf folgende Bedeutung hat: 1 2 3 4 5 6 7 8

➪ ➪ ➪ ➪ ➪ ➪ ➪ ➪



REXXUTIL-Funktion

Beispiel: : if rc > 0 then do m="Programm fortsetzen" t="Returncode:" rc if RxMessageBox(m,t,"YesNo","Question")=7 then exit end :

Kapitel 3 - Syntaxbeschreibung

419

RxQueue() RxQueue(

"CREATE"

)

,queue-name "DELETE",queue-name "GET" "SET",neu-name

Erzeugt oder löscht eine Queue (Daten-Warteschlange) beziehungsweise weist ihr einen Namen zu oder ermittelt diesen. CREATE Erzeugt eine Queue. Wird kein Name angegeben oder existiert eine QUEUE gleichen Namens, vergibt REXX selbst einen. RXQUEUE liefert den Namen der Queue. DELETE queue-name Löscht die angegebene Queue und liefert einen Returncode folgender Bedeutung zurück: 0 5 9 10 12 1000

➪ ➪ ➪ ➪ ➪ ➪

Queue wurde gelöscht. Kein gültiger Queue-Name angegeben Angegebene Queue nicht vorhanden Queue wird benutzt Speicherfehler Initialisierungsfehler, OS/2.INI prüfen

GET Übergibt den Namen der aktuellen Queue. SET neu-name OS/2-Funktion

Positioniert auf eine neue QUEUE und liefert den alten Namen.

420

REXX unter OS/2

RxQueue() Beispiel:

/* REXX *************************************/ DO RANDOM(1,10) QUEUE "Gugus" END neu=RxQUEUE("CREATE") alt=RxQUEUE("SET,neu) DO RANDOM(1,10) QUEUE "Gaga" END SAY SAY "Sätze der 2. Schleife:" QUEUED() DO QUEUED() PARSE PULL satz SAY satz END CALL RxQUEUE "SET",alt CALL RxQUEUE "DELETE",neu SAY SAY "Sätze der 1. Schleife:" QUEUED() DO QUEUED() PARSE PULL satz SAY satz END EXIT

OS/2-Funktion

Zunächst werden 1-10 Sätze in die Standardqueue (SESSION) , dann 1-10 Sätze in eine neue Queue geschrieben. Die beiden Datenpakete werden in getrennten Verarbeitungsschritten wieder ausgegeben.

Kapitel 3 - Syntaxbeschreibung

421

SAY SAY ausdruck

Schreibt den angegebenen Ausdruck an die Standardzuordnung für Output (im Allgemeinen der Bildschirm), wobei enthaltene Variablen vor Ausgabe aufgelöst werden. Der Ausdruck kann beliebig lang sein. Wird die SAY-Instruktion ohne Ausdruck angegeben, wird eine Leerzeile erzeugt. ausdruck Literal oder Variable in beliebiger Anzahl und Reihenfolge.

Beispiel:

Führt zur Anzeige: 100 dividiert durch 4 = 25

REXX-Instruktion

: zahl=100 say zahl 'dividiert durch 4 =' zahl/4 :

422

REXX unter OS/2

SELECT SELECT

WHEN ausdruck THEN instruktion

OTHERWISE instruktion

END

Sind innerhalb eines Verarbeitungsabschnittes mehrere Bedingungen zu überprüfen, die sich gegenseitig ausschließen sollen, kann dies grundsätzlich durch in sich geschachtelte IF-THEN-ELSE-Anweisungen bewerkstelligt werden. Die SELECTAnweisung bietet hier aber eine wesentliche Vereinfachung. An eine Bedingung geknüpft kann nur je eine Instruktion kodiert werden. Müssen von der Ablauflogik her mehrere Befehle ausgeführt werden, sind sie als Befehlsfolge zwischen DO und END zusammenzufassen. SELECT Leitet die Mehrfachabfrage ein. WHEN ausdruck THEN instruktion Fragt nach einer Bedingung. Ist sie wahr, wird der Befehl hinter THEN ausgeführt. Wenn nicht, wird in der Mehrfachabfrage zum nächsten WHEN verzweigt. Ist keine weitere Frage kodiert, wird der NEIN-Zweig der Abfrage angesteuert oder die Mehrfachabfrage verlassen.

REXX-Instruktion

OTHERWISE instruktion Ist der NEIN-Zweig der Mehrfachabfrage. Er wird durchlaufen, wenn alle vorangegangenen Fragen verneint wurden. OTHERWISE ist nicht in allen Interpreterversionen zwingend zu kodieren. Unter MVS-TSO/E wird das Fehlen von OTHERWISE aber meist als Syntaxfehler reklamiert. Wird der NEIN-Zweig von der Programmlogik her nicht benötigt, wird in Verbindung mit OTHERWISE die Instruktion NOP (No OPeration) eingesetzt.

Kapitel 3 - Syntaxbeschreibung

423

SELECT Beispiele: /* REXX ***************************************/ CALL SysCls SAY 'Geben Sie Ihr Alter an' PULL alter SELECT WHEN alter < 18 THEN txt='noch in die Schule' WHEN alter > 65 THEN txt='nach Mallorca' OTHERWISE txt='sofort an die Arbeit' END SAY 'Sie gehören' txt EXIT

REXX-Instruktion

/* REXX ***************************************/ CALL SysCls SAY 'Geben Sie Ihr Alter an' PULL alter SELECT WHEN DATATYPE(alter) = "CHAR" THEN EXIT WHEN alter < 18 THEN DO txt.1 = "Nimm den Schnuller aus dem Mund" txt.2 = "Du gehoerst noch in die Schule" txt.0 = 2 END WHEN alter > 65 THEN DO txt.1 = "Der Kalk rieselt Ihnen aus dem Hosenbein" txt.2 = "Bitte treten Sie einen Schritt zurueck," txt.3 = "sonst verstauben meine Module!" txt.4 = "" txt.5 = "Fahren Sie lieber nach Mallorca" txt.0 = 5 END OTHERWISE DO txt.1 ="Haben Sie sonst nichts zu tun?" txt.0 = 1 END END DO cnt = 1 to txt.0 SAY txt.cnt END EXIT

424

REXX unter OS/2

SELECT ,

SELECT

liste FROM

tab

ALL DISTINCT WHERE bedingung GROUP BY HAVING bedingung ORDER BY

UNION EXCEPT INTERSECT

, spalte , name nummer

ASC DESC

ALL

Selektiert Datensätze aus einer Tabelle. Wir innerhalb eines SELECT-Befehles als bedingung ein weiterer SELECT kodiert, sprechen wir dort von einem SUBSELECT. Aus der Vielzahl der möglichen Angaben im SELECT wollen wir hier nur einige herausgreifen und bitten um Verständnis, daß wir nicht alle Details zu SELECT liefern. Die Beschreibung dieses Befehles würde sich sicher über mehr als 10 Seiten hinziehen. Die DB2/2-Insider möchten wir an dieser Stelle auf die IBM-Literatur verweisen. ALL

DB2/2-SQLEXEC-Befehl

Alle Sätze wandern in die Ergebnistabelle. DISTINCT Doppelte Zeilen aus der originären Tabelle werden nicht in die Ergebnistabelle übernommen (der Parameter darf nur einmal je SUBSELECT kodiert werden).

Kapitel 3 - Syntaxbeschreibung

425

SELECT liste Bestimmt, mit welchen Spalten die Ergebnistabelle aufgebaut werden soll.Maximal können bis zu 255 Spalten angegeben werden. Folgende Angaben für liste sind möglich: * (Stern) Alle Spalten der Originärtabelle werden namensgleich der Reihe nach für die Ergebnistabelle benutzt. name.* Alle Spalten, deren Name oder Alias dem Stern vorangestellt wurden, werden der Reihe nach in die Ergebnistabelle übernommen. spaltenname Die Ergebnistabelle wird entsprechend der Angabe der Spaltennamen aufgebaut. Die Spalten müssen in der originären Tabelle vorhanden sein. ausdruck Ein Ausdruck kann aus Spaltennamen, Konstanten und Funktionen bestehen. Ausgegeben wird das Resultat des Ausdruckes. Arithmetische Operatoren dürfen nur mit numerischen Werten benutzt werden. Als Operanden können benutzt werden: Addition(+), Subtraktion(-), Multiplikation(*) und Division(/) Liefert die Anzahl der Datensätze (SELECT COUNT(*)) Liefert den Durchschnitt einer Zahlenreihe. Liefert die Summe einer Zahlenreihe. Liefert die größte Zahl aus einer Zahlenreihe. Liefert die kleinste Zahl aus einer Zahlenreihe.

FROM tab Zeigt auf die Originärtabelle, die durchsucht wird und die die Ergebnisse für die Ergebnistabelle liefert. Es können maximal 15 Tabellen angegeben werden.

DB2/2-SQLEXEC-Befehl

COUNT AVG ...... SUM ..... MAX ..... MIN ......

426

REXX unter OS/2

SELECT WHERE bedingung Es werden nur die Datensätze in die Ergebnistabelle übernommen, die die angegebene Bedingung erfüllen. In der Auswahlbedingung können enthalten sein: ❍

Einfache Vergleiche mit den Operatoren =, >, >=,