 |
| Laufzeitschalter der tdbengine |  |
 |
 |
Über Laufzeitschalter wird das Verhalten der tdbengine gesteuert. Mit Ausnahme von AK werden alle Schalter erst zur Laufzeit aktiviert und gelten grundsätzlich global.
Setzen und Auslesen
Zum Setzen eines Schalters bestehen zwei Möglichkeiten:
- Punktbefehl (veraltet)
- Funktion SetPara
Ein Punktbefehl ist eine Programmzeile, die mit einem Punkt beginnt (wobei führende Leerzeichen ignoriert werden). Nach diesem Punkt werden die einzelnen Schalter mit dem jeweiligen Wert hintereinander - und jeweils durch Komma getrennt - geschrieben: .ec 1, nb 0
Da in der nächsten Hauptversion (6.3.x) die Zeilenstruktur in EASY-Programmen aufgehoben wird, sollte von dieser Art der Schaltersetzung nicht mehr Gebrauch gemacht werden.
An dessen Stelle tritt die Funktion SetPara
SetPara(Schalter : STRING) : REAL
Hier werden die Schalter als String übergeben (ohne führenden Punkt) - ebenfalls durch Komma getrennt:
SetPara('ec 1, nb 0')
Der Rückgabewert der Funktion ist immer 0, bei einem illegalen Befehl wird ein Laufzeitfehler ausgelöst.
Der Wert eines Schalters kann mit der Funktion GetPara abgefragt werden.
GetPara(Schalter : STRING) : REAL
Beispiel: GetPara('ec') -> 0|1 (je nachdem) Alle Schalter in der Übersicht
| Schalter |
Bedeutung |
Wirkung |
Vorgabe |
| ak |
Abkürzung |
Abkürzungen bei Feldbezeichnern sind erlaubt (1) |
0 |
| ec |
Error Check |
Fehlerbehandlung durch Programm (1) |
0 |
| em |
Exact Match |
Volltextindierung und -suche vergleichen Masken exakt (1) |
0 |
| de |
Descending |
Subreport kehrt Reihenfolge der Datensätze um (1) |
0 |
| nb |
No Break |
Das Programm kann nicht durch eine Datei namens 'abort' abgebrochen werden (1) |
0 |
| nv |
Numeric Values |
VAL erlaubt nur numerische Konstanten (1) |
1 |
... und im Detail
ak
Dieser Schalter wird nur bei dynamischen Tabellenauswertungen verwendet, also beispielweise bei FindAndMark oder SUB wenn hier auf Datenfelder via Feldbezeichner Bezug genommen wird. Es handelt sich um ein recht altes Relikt aus DOS-TDB-Zeiten. Im Normalfall sollte man es bei der Grundeinstellung (Abkürzungen verboten) belassen.
ec
Bei allen kritischen Fehlerzuständen erzeugt die tdbengine einen Laufzeitfehler mit einem entsprechenden Eintrag in der Datei bin/error.log. Erfolgt der Fehler bei einer Variablenzuweisung, so kann der Laufzeitfehler abgefangen werden, indem der Schalter ec 1 gesetzt wird. Die Fehlerbehandlung muss dann vom Programm übernommen werden.
Die Behandlung der Schalter als Laufzeitfunktion (und nicht etwa als Flag zur Codeerzeugung) bedingt, dass bei einer lokalen Verwendung der Schalter explizit zurückgesetzt werden muss.
Beispiel:
PROCEDURE OpenTable(path : STRING) : REAL
VARDEF result : REAL
SetPara('ec 1') // Fehlerbehandlung übernehmen
result:=OpenDB(path)
RETURN result
SetPara('ec 0') // Fehlerbehandlung wieder(?) durch System
ENDPROC
Hier wird das Zurücksetzen des Schalters nie erreicht, und so bleibt im restlichen Programm der Schalter gesetzt, bis er irgendwo eventuell wieder zurückgesetzt wird. Deshalb die bessere Lösung:
PROCEDURE OpenTable(path : STRING) : REAL
VAR result, t_ec : INTEGER
t_ec:=GetPara('ec') // äussere Stellung merken
SetPara('ec 1') // Fehlerbehandlung übernehmen
result:=OpenDB(path) // kein Laufzeitfehler
SetPara('ec '+str(t_ec)) // äussere Stellung wieder herstellen
RETURN result
ENDPROC
In diesem Beispiel ging es nur um die Positionierung des Schalters. Zur Fehlerbehandlung selbst stellt EASY die folgenden Funktionen zur Verfügung:
TDB_LastError liefert den Fehlercode
TDB_ErrorStr(TDB_LastError) liefert die Fehlermeldung als String
Zudem wird folgenden Systemvariable gesetzt (hier ist auf Groß/Kleinschreibung zu achten) :
TDB_ErrorMsg liefert den (rückübersetzten) Ausdruck, in dem der Fehler auftrat
Hier nun eine Beispiel mit Fehlerbehandlung:
PROCEDURE OpenTable(path : STRING; VAR system_msg : STRING) : REAL
VAR result, t_ec : INTEGER
t_ec:=GetPara('ec') // äussere Stellung merken
SetPara('ec 1') // Fehlerbehandlung übernehmen
result:=OpenDB(path) // kein Laufzeitfehler
IF TDB_LastError=0 // alles okay
THEN system_msg:='done.'
ELSE system_msg:=TDB_ErrorStr(TDB_LastError) // Meldung nach aussen geben
END
SetPara('ec '+str(t_ec)) // äussere Stellung wieder herstellen
RETURN result
ENDPROC
em
Mit diesem Schalter wird die Behandlung der Maskenzahl bei der Volltextindierung und -suche gesteuert. Näheres siehe in der Dokumentation zur Volltextsuche.
de
Damit wird die Reihenfolge der Datensätze der Primärtabelle bei (Sub-)Reports festgelegt. Normalerweise ist die Reihenfolge aufsteigend. Mit SetPara('de 1') kann auf absteigende Reihenfolge umgeschaltet werden.
Beispiel: erst aufsteigend ...
VAR db : INTEGER
VAR Sel _: STRING
db:= OpenDB('database/adressen.dat')
Access(db,'name.ind')
Sel:='$Name FROM "A" TO "G"'
SUB _sel
CGIWriteLn( GetField(db,'Name'))
ENDSUB
... Ausgabe:
Alzheimer
Bernholzer
Dorfmeister
Elstner
Friedrichs
... dann absteigend
VAR t_de : INTEGER
...
t_de:= GetPara('de') // Reihenfolge merken
SetPara('de 1') // Reihenfolge umdrehen
SUB _DBName(db)
CGIWriteLn( GetField(db,'Name'))
ENDSUB
SetPara('de '+str(t_de)) // Reihenfolge wieder herstellen
... Ausgabe:
Friedrichs
Elstner
Dorfmeister
Bernholzer
Alzheimer
nb
Um bei einer Endlosschleife (oder einem sonstwie irrlaufenden Programm) eine einfache Abbruchmöglichkeit (auch für Nicht-Roots) zu haben, wird jede Sekunde während des Programmlaufs das Vorhandensein einer Datei mit dem Namen 'abort' im Verzeichnis der tdbengine geprüft. Ist eine solche Datei vorhanden, wird das Programm abgebrochen und (falls die Rechte dazu ausreichen) die Datei gelöscht.
Während der Testphase eines Programm sollte dieser Schalter auf 0 (Vorgabe) gesetzt bleiben. Wenn aber ein Programm ausgetestet und Endlosschleifen ausgeschlossen sind, kann der Schalter auf 1 gesetzt werden, was zu einer deutlich spürbaren Performancesteigerung führt.
Hinweis: Der Abbruch mittels "abort" funktioniert nicht bei der Ausführung der Systemfunktionen, also beispielsweise während eines Indizierungslaufs.
Tipp: Falls sich die tdbengine "komisch" verhält und längere Programme ohne Fehlermeldung abbricht, so kann dafür eine "abort"-Datei verantwortlich sein, die nicht gelöscht werden kann (weil die Rechte des anonymen http-users nicht ausreichen oder es sich um ein Verzeichnis handelt)
nv
Die Stellung dieses Schalters wird nur im Zusammenhang mit der Standard-Funktion Val() ausgewertet. Diese Funktion interpretiert das übergebene String-Argument als EASY-Ausdruck und berechnet dessen Wert.
In der eingeschränkten Version (Schalterstellung 1 = Vorgabe) werden nur gültige Zahlenkonstanten ausgewertet. Alle anderen Ausdrücke werden mit dem Fehler "illegale Zahlenkonstante" zurückgewiesen.
In der erweiterten Version (Schalterstellung 0) sind hingegen beliebige Ausdrücke zugelassen. Dies kann zu einem massiven Sicherheitsproblem werden, wenn ungefilterte CGI-Variblen an die Funktion Val() übergeben werden.
Beispiel: x:=Val(GetQueryString('recno'))
Erfolgt der Programmaufruf mit ...?recno=rm+-r+*, so erhalten Sie mit "nv 1" einen Programmabbruch mit Fehlermeldung, mit "nv 0" jedoch eine Katastrophe.
|