Deutsch English
Blog
Home
Über tdbengine
Newsletter
Download
Helpware
Chat
Dokumentation
Installation
Konfiguration
Erste Schritte
Variablentypen
Laufzeitschalter
Textdateien
Systemfunktionen
Tabellenfunktionen
Indexfunktionen
Volltext-Indizierung
Memos und Blobs
Semaphoren-Konzept
Fehlermeldungen
Tipps für PHP Programmierer
Locking daemon
Einführungskurs
Befehlsreferenz
HOWTO - Wie kann ich...?
Projekte
Links
Benchmarks
Bug Reporting
Supportanfrage
 
Home    Überblick    Suche    Impressum    Kontakt    Mitglieder
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.

Siehe auch:





tdbengine Anwendungen im Web:

Open-Source Web CMS


Open-Source Bug-Tracking


Free wiki hosting

Open-Source Wiki-System

Kostenloses Foren-Hosting

Diät mit tdbengine 8-)

tdbengine chat
irc.tdbengine.org
#tdbengine

   Copyright © 2003-2004 tdb Software Service GmbH
   Alle rechte vorbehalten. / All rights reserved
   Letzte Änderung: 10.05.2004


ranking-charts.de

Programmers Heaven - Where programmers go!