Liebe Studierende,
ein paar Hinweise zu verschiedenen Code-Sequenzen:
* folgende vier Anweisungen:
date = query~getString("date") year = date[1,4] month =date[6,2] day = date[9,2]
* können in eine zusammengefasst werden:
*parse value* query~getString("date") *with *year +4 6 month +2 9 day +2
Wenn in einem JavaFX-Controller die Rexx-Routine mit arg(arg()) aufgerufen wird, kann überall innerhalb der Rexx-Routine auf dieses Argument zugegriffen werden, unabhängig davon, ob man es selbst verwendet oder nicht. Das slotDir-Argument muss immer das letzte sein, damit die RexxScript-Annotationen funktionieren können.
Die RexxScript-Annotationen können in den runden Klammern durch Leerzeichen getrennt mehrere ScriptContext-Einträge benennen, wodurch das Schreiben einfacher/leichter wird.
Beide Anmerkungen/Hinweise veranschaulicht:
* JavaFX-Controller mit Rexx-Routine (vorher):
::routine stat public *use arg slotDir* /*Connect to Database*/ call sqlite_conn tmpColl = result conn = tmpColl statement = conn~createStatement
/*Connect to the ID Fields from FXML File*/ */* @get(sportart_cb) */****/* @get(failure_save) */* sport = sportart_cb~getValue allSports = sportart_cb~getItems~toArray failure_save~setText(.nil) ... cut ...
* JavaFX-Controller mit Rexx-Routine (nachher, ungetestet):
::routine stat public
/*Connect to Database*/ call sqlite_conn tmpColl = result conn = tmpColl statement = conn~createStatement
/*Connect to the ID Fields from FXML File*/ */* @get(sportart_cb failure_save) */*
sport = sportart_cb~getValue allSports = sportart_cb~getItems~toArray failure_save~setText(.nil) ... cut ...
oder:
* RexxScript-Annotationen (vorher):
/*Connect to the ID Fields from FXML File*/ /* @get(op1) */ /* @get(op2) */ /* @get(op3) */ /* @get(op4) */ /* @get(op5) */ /* @get(op6) */ /* @get(op7) */ /* @get(op8) */ /* @get(op9) */ /* @get(op10) */ /* @get(failure_save) */
* RexxScript-Annotationen (nachher, ungetestet):
/*Connect to the ID Fields from FXML File*/ /* @get(op1 op2 op3 op4 op5 op6 op7 op8 op9 op10 failure_save) */
Mit ooRexx 5.0 kann man das Testen, ob eine Variable auf .nil verweist ein bisschen einfacher schreiben, nämlich statt:
if sport = .nil then sport = "all Sports"
kann man es mit der neuen isNil-Methode testen (gibt .true oder .false zurück):
if sport*~isNil* then sport = "all Sports"
Ad Schleifenzähler, Einsparen von Zuweisungen zu Zwischenvariablen:
* Vorher:
query3= statement~executeQuery('SELECT siteName, Nutzername, mail, passwort from PWtable')
*i=2* do while query3~next
*x = query3~getString("siteName")* call uno.setCell xSheet, 2, i, *x* *x = query3~getString("Nutzername")* call uno.setCell xSheet, 3, i,*x* *x = query3~getString("mail")* call uno.setCell xSheet, 4, i, *x* *x = query3~getString("passwort")* call uno.setCell xSheet, 5, i, *x* *i = i+1* end
* Nachher (ungetestet):
query3= statement~executeQuery('SELECT siteName, Nutzername, mail, passwort from PWtable')
do *i=2* while query3~next call uno.setCell xSheet, 2, i, query3~getString("siteName") call uno.setCell xSheet, 3, i, query3~getString("Nutzername") call uno.setCell xSheet, 4, i, query3~getString("mail") call uno.setCell xSheet, 5, i, query3~getString("passwort") end
Achtung, in Rexx ist der Unterstrich (wie Frage- und Rufezeichen) ein ganz normales Zeichen, das man auch für Bezeichner verwenden kann, gleichberechtigt zu den Buchstaben a-z. Da Rexx Variablen, die keinen Wert aufweisen, mit dem Variablen-Bezeichner selbst als Wert arbeitet, wird die folgende Anweisung einen durchgehenden Strich (29 Unterstriche) ausgeben. Tatsächlich ist dieser durchgehende Strich eine Variable! :)
Statt:
say "Durchsucht eine XML Datei und wiedergibt alles First & Last Names!" say _____________________________
sollte man in diesem Fall den Strich unter Hochkomma setzen, damit klar ist, dass wir diesen Unterstrich als Zeichenkette nutzen möchten und daher wie folgt schreiben:
say "Durchsucht eine XML Datei und wiedergibt alles First & Last Names!" say *"*_____________________________*"*
Ad SQLite-PRAGMAs: das sind Konfigurationsanweisungen, die man auch über Java setzen kann, wenn man weiß, a) dass das geht und b) wo die Dokumentation dafür zu finden ist, was mit Hilfe von Suchmaschinen möglich wird:
* Java-Klasse zum Konfigurieren von SQLite: https://www.javadoc.io/doc/org.xerial/sqlite-jdbc/3.15.1/org/sqlite/SQLiteConfig.html * Java-Beispiele, die zeigen, wie man eine Konfiguration vornimmt und anschließend eine Connection damit aufbaut, z.B.: https://www.programcreek.com/java-api-examples/?api=org.sqlite.SQLiteConfig, in etwa in BSF4ooRexx (ungetestet, in diesem Fall für G6):
SQLiteConfigClz=bsf.import("org.sqlite.SQLiteConfig") -- importieren der Javaklasse conf=SQLiteConfigClz~new -- eine Instanz erzeugen conf~setJournalMode(SQLiteConfigClz~JournalMode~WAL) -- konfigurieren
conn=conf~createConnection("jdbc:sqlite:jadmin.db") -- eine Connection (Verbindung) damit herstellen ...
Ein Hinweis ad Cachen von Objekten, insbesondere des Connection-Objektes, sodass man nicht andauernd eine Connection zur Datenbank herstellen muss: einfach am Programmbeginn das Connection-Objekt erzeugen und in .local speichern. Die ooRexx-Umgebung ".local" stellt seine Einträge allen Rexxprogrammen innerhalb desselben RexxInterpreters (ooRexx ist sehr mächtig und kann beliebig viele RexxInterpreter-Instanzen verwalten) zur Verfügung. Beispiel (ungetestet):
/* z.B. in main.rex am Anfang */ ... cut ... SQLiteConfigClz=bsf.import("org.sqlite.SQLiteConfig") -- importieren der Javaklasse conf=SQLiteConfigClz~new -- eine Instanz erzeugen conf~setJournalMode(SQLiteConfigClz~JournalMode~WAL) -- konfigurieren
*.local~*conn=conf~createConnection("jdbc:sqlite:jadmin.db") -- in .local mit Namen "CONN" speichern
... cut ... .conn~close -- vor dem Ende die Connection schließen -- beginnt mit Punkt, daher Umgebungssymbol, Rexx sucht "CONN"-Eintrag in seiner Umgebung
/* z.B. in controller.rex einen Zugriff zur DB herstellen */ ... cut ... stmt=.conn~createStatement -- beginnt mit Punkt, daher Umgebungssymbol, Rexx sucht "CONN"-Eintrag in seiner Umgebung ... Zugriffe auf die Datenbank ... stmt~close ... cut ...
Umgebungssymbole werden in der Rexx-Umgebung in der folgenden Reihenfolge gesucht (erster Treffer gewinnt), nachdem der führende Punkt vom Umgebungssymbol (in Großbuchstaben) entfernt wurde:
1. lokale Umgebung des Pakets/der Programmdatei: .context~package~local (eine Instanz von .Directory) 2. .local (eine Instanz von .Directory, für jeden RexxInterpreter gibt es eine eigene Instanz) 3. .environment (eine Instanz von .Directory, global für Programme in jedem RexxInterpreter verfügbar) 4. System-Umgebung (kann von Programmierern nicht direkt angesprochen werden)
Zum Schluss anbei "demoResource.rex", das die ::resource-Direktive demonstriert, aber auch wie man einfacher Werte in einfache oder doppelte Hochkomma setzt, was für SQL manchmal wichtig ist. Dabei gilt es auch den Fall zu berücksichtigen, dass das Begrenzungszeichen auch als Buchstabe vorkommt. SQL folgt dabei interessanterweise den Rexxregeln, die auch in qq1() und qq2() angewendet werden.
Sollten Sie Fragen haben, dann bitte über die Liste!
Mit freundlichem Gruß
Rony G. Flatscher