OBS/Makros und Scripting/Benutzerdefinierte Datenbanktabellen: Unterschied zwischen den Versionen
Zeile 29: | Zeile 29: | ||
#DBNAME PERSSTA | #DBNAME PERSSTA | ||
#TITEL (Hinzufügen von Feldern in vorhadenen Tabellen) | |||
#FELDNAME PS_NOTIZEN , M ,2000 , 0 , "*" , LIKESUCHE | #FELDNAME PS_NOTIZEN , M ,2000 , 0 , "*" , LIKESUCHE | ||
Zeile 34: | Zeile 35: | ||
#DBNAME USER_TISCHE | #DBNAME USER_TISCHE | ||
#TITEL (Hinzufügen von Feldern in neuen Tabellen) | |||
#FELDNAME UT_NR , C , 8 , 0 , "CCCCCCCC" | #FELDNAME UT_NR , C , 8 , 0 , "CCCCCCCC" |
Version vom 17. Dezember 2019, 13:48 Uhr
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:
- TxDB Instanz erstellen oder zurücksetzen
- Verbindung zur Datenbank aufbauenACHTUNG: Wenn Verbindung erfolgreich, dann weiter mit nächsten Schritt, sonst weiter zu 6
- Auslesen der Connection-ID
- Ermitteln der Struktur-Dateien (bei aktiver Compiler-Direktive OBS_oMyDBC)
- Pointer prüfen
- Tabelle PMODE prüfen
- Kundennummer aus PMode 996 auslesen
- Dateiname setzen (USER_<Kundennummer>_OBSDB.SYS)
- Struktur laden
- Rückgabe boolsches Ergebnis, ob Connect erfolgreich
Wann und wie wird die User-Datei gelesen?
Gelesen wird die Datei eigentlich jedesmal, wenn die Add-Funktion der Klasse TxDBStructures aufgerufen wird. Innerhalb von OBS passiert (oder besser SOLLTE ES PASSIEREN) dies über das DB-Connect (TxDB.LoadDBStructure). Zunächst wird immer der aktuelle MD5-Wert der Datei ermittelt. Ist dieser Wert abweichend zum letzten Import einlesen, 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.
Beispiel PERSSTA:
*------------------------------------------------------------------------------- #DBNAME PERSSTA #TITEL (Hinzufügen von Feldern in vorhadenen Tabellen) #FELDNAME 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 PS_NOTIZEN hinzugefügt. Platzhalter und Flags können wie auch in der OBSDB.SYS verwendet werden.