OBS/Makros und Scripting/Benutzerdefinierte Datenbanktabellen

Aus OBS Wiki
Zur Navigation springen Zur Suche springen


Diese Seite erklärt die User-Dateien für unsere Datenbankstrukturdefinition.

Allgemeines

Wie merkt OBS sich die Strukturdefinition?

OBS verwendet dazu die Klasse TxDBStructures. Für diese Klasse gibt es ein globales Objekt, für welches in jeder laufenden Exe eine Instanz, die beim Programmstart erzeugt wird, gibt. Pro Kombination aus Struktur-Dateien gibt es einen Eintrag im internen Array (Array of TDB_Structure) mit Namen und MD5-Werten der Datei sowie den Tabellendefinitionen und Flags (ebenfalls Arrays). Das ganze findet sich in der Unit Base.xDBStructure.

Wie nutzt OBS die Strukturdefinition?

Beim Anlegen einer neuen Instanz von TxDB wird sofern gesetzt die Struktur eingelesen. In der Klassen-Definition von TxDB (Base.xDatabase) finden sich die beiden Variablen cStructFile und cStructFileUser, in denen für jeden DB-Connect die zu verwendenen Struktur-Dateien stehen. Diese werden dann beim Laden mit der Klassenfunktion LoadDBStructure and die Add-Funktion der Struktur-Klasse übergeben. Das DB-Connect erhält dafür dann den Index zurück, über den der richtige Eintrag im Array der Struktur-Instanz referenziert wird.
An diversen Stellen wird so über das DB-Connect ermittelt bzw. kann ermittelt werden, ob in der Connection bestimmte Felder oder Tabellen überhaupt vorhanden sind.

Wann wird die Datei beim Programmstart benötigt?

Die Einbindung der benutzerspezifischen Datenbankfelder findet in der Funktion DB_ConnectToDatabase statt. Der grobe Ablauf in DB_ConnectToDatabase ist wie folgt:

  1. TxDB Instanz erstellen oder zurücksetzen
  2. Verbindung zur Datenbank aufbauen
    ACHTUNG: Wenn Verbindung erfolgreich, dann weiter mit nächsten Schritt, sonst weiter zu 6
  3. Auslesen der Connection-ID
  4. Ermitteln der Struktur-Dateien (bei aktiver Compiler-Direktive OBS_oMyDBC)
    1. Pointer prüfen
    2. Tabelle PMODE prüfen
    3. Kundennummer aus PMode 996 auslesen
    4. Dateiname setzen (USER_<Kundennummer>_OBSDB.SYS)
  5. Struktur laden
  6. Rückgabe boolsches Ergebnis, ob Connect erfolgreich

Wann und wie wird die User-Datei gelesen?

Gelesen wird die Datei, wenn die Add-Funktion der Klasse TxDBStructures aufgerufen wird. Innerhalb von OBS passiert dies über das DB-Connect (TxDB.LoadDBStructure). Zunächst wird immer der aktuelle MD5-Wert der Datei ermittelt. Ist dieser Wert abweichend vom letzten Import, wird die gemerkte Struktur zurückgesetzt und die Dateien neu eingelesen. Dabei werden die angegebenen Dateien in eine StringList geladen und Zeilen für Zeile abgearbeitet.

SYS-Datei

Die Definition ist identisch zur OBSDB.SYS. Es können komplette eigene Tabellen definiert oder Standard-Tabellen um eigene Felder erweitert werden. Auch eigene Indizes sind möglich. Beim Hinzufügen von Feldern zu den Standard-Tabellen ist es nicht nötig, die Definition der Tabelle zu kopieren. Es muss nur enthalten sein, was dazu kommen soll.

ACHTUNG: Felder, die zu bereits bestehenden OBS-Tabellen hinzugefügt werden, müssen mit USER_ beginnen! Dadurch werden Fehler vermieden, falls ein Feld mit dem gewünschten Namen in Zukunft in den Standard aufgenommen werden sollte.


Beispiel PERSSTA:

 *-------------------------------------------------------------------------------
 
 #DBNAME PERSSTA
 #TITEL  (Hinzufügen von Feldern in vorhandenen Tabellen)
 
   #FELDNAME USER_PS_NOTIZEN             , M  ,2000 , 0 , "*" , LIKESUCHE

 #DBNAME USER_TISCHE
 #TITEL  (Hinzufügen von Feldern in neuen Tabellen)

  #FELDNAME UT_NR                 , C  ,    8 , 0 , "CCCCCCCC"
  #FELDNAME UT_NAME               , C  ,   50 , 0 , "*"
  #FELDNAME UT_BESCHREIBUNG       , M  , 2000 , 0 , "*"
  #FELDNAME UT_SACHBEARBEITER     , C  ,    2 , 0 , "CC"
  #FELDNAME SYS_UID               , C  ,   10 , 0 , "CCCCCCCCCC"
  #FELDNAME SYS_DATE              , D  ,    4 , 0 , "TT.MM.JJ" , AUTODATE

  #XINDEX USER_TISCHE01 SYS_UID
  #XINDEX USER_TISCHE02 UT_NR

 *-------------------------------------------------------------------------------

In diesem Beispiel wir der Tabelle PERSSTA das Feld USER_PS_NOTIZEN hinzugefügt. Platzhalter und Flags können wie auch in der OBSDB.SYS verwendet werden.