OBS/System/Datenbankdefinition
Die Definition der Datenbankstruktur, das heißt die Tabellen und Felder von OBS, findet mit Dateien im sys-Verzeichnis von OBS statt. Neben der von OBS mit dem Update ausgelieferten obsdb.sys können zu Individualisierung, z. B. für Customize-Funktionalitäten, Standardtabellen erweitert oder auch neue Tabellen hinzugefügt werden. Im Nachfolgenden werden Aufbau und Definition einer solchen Datenbankdefinitionsdatei beschrieben.
Arten von Definitionsdateien
OBS Standard
Die Datenbankdefinition wird beim OBS-Update mit ausgeliefert und befindet sich im OBS-Unterverzeichnis sys in der Datei obsdb.sys.
individuelle Tabellen und Felder
Standardtabellen von OBS können sich erweitern lassen oder auch neue Tabellen definiert werden. Die Definition muss ebenfalls im sys-Verzeichnis der OBS-Installation abgelegt werden. Der Dateiname muss mit User_ beginnen, auf _obsdb.sys enden und dazwischen Ihre Kundennummer enthalten. Sollten Sie mit mehreren Installationen arbeiten wird zur Kundennummer möglicherweise noch eine Sub-Identifikation benötigt.
Beispiel Dateiname: User_101234_obsdb.sys.
Falls Sie sich nicht sicher sind, unter welcher Identifikation eine bestimmte Installation läuft, können Sie dies beim OBS-Support erfragen.
Aufbau einer Datenbankdefinitionsdatei
Datenbank Flag
Flags sind besondere "Markierungen" für Felder, die an verschiedenen Stellen in OBS besondere Funktionalitäten erfüllen. Die Flags werden am Anfang einer Datei definiert, da diese zum Zeitpunkt der Verwendung in den Definition einer Tabelle oder eines Tabellenfelds bekannt sein müssen.
Liste Flags
Angabe | Beschreibung |
---|---|
PERSONENNR | Feld enthält eine OBS-Personennummer. Wird beim Ändern der Personennummer automatisch angepasst. |
PERSDELCHK | Verhindert das Löschen einer Person, wenn es einen Datensatz mit der entsprechenden Nummer in diesem Feld gibt |
PERSSETEMPTY | Löscht beim Löschen einer Person nicht den Datensatz sondern leert das Feld |
ARTIKELNR | Feld enthält eine OBS-Artikelnummer. Wird beim Ändern der Artikelnummer automatisch angepasst. |
ARTIKELDELCHK | Verhindert das Löschen eines Artikels, wenn es einen Datensatz mit der entsprechenden Nummer in diesem Feld gibt. |
ARTIKELSETEMPTY | Setzt das Feld leer, wenn der referenzierte Artikel gelöscht wird statt den Datensatz zu löschen. |
LEISTUNGNR | Feld enthält eine OBS-Leistungsnummer |
LEISTUNGDELCHK | Verhindert das Löschen einer Leistung, wenn es einen Datensatz mit der entsprechenden Nummer in diesem Feld gibt. |
AUTOINC | Das Zahlenfeld (Ganzzahl) wird mit einem automatischen Zähler versehen (z. B. MySQL: AUTO_INCREMENT). Das bedeutet, dass für neue Datensätze dieser Zähler sich automatisch um 1 erhöht. |
AUTODATE | Bei Änderung des Datensatzes wird das Feld automatisch auf den Zeitpunkt der Änderung aktualisiert. |
INSERTDATE | Erstellt ein Datumsfeld mit den Standardwert CURRENT_TIMESTAMP. Dies sorgt dafür, dass beim Einfügen eines Datensatzes der Zeitstempel des Anlagezeitpunkts in dieses Feld eingetragen wird. |
NOCREATE | Verhindert die Anlage eines Feldes. Dieses Flag ist nützlich, wenn Felder nicht mehr verwendet werden und somit nicht mehr angelegt werden sollen, aber z. B. für Konvertierungen möglicherweise noch bekannt sein müssen, wenn das Feld bereits engelegt ist. |
DEFAULT | Definition eines Standardwerts für die Datenbank. Wird ein neuer Datensatz in der Tabell hinzugefügt und für das Feld ist kein Wert angegeben, so fügt die Datenbank automatisch den in in Default angegebenen Wert ein. Syntax ist dabei DEFAULT in Großbuchstaben gefolgt von einem Dopelpunk und dem Wert in Anführungszeichen. Beispiel: DEFAULT:"1". HINWEIS: Ohne Angabe wird für Textfelder DEFAULT:"" und für Zahlen DEFAULT:"0" verwendet.
|
SETEMPTYTODEFAULT | Im Zusammenspiel mit DEFAULT werden Felder deren Wert "Leer" entspricht auf den in DEFAULT definierten Wert gesetzt. Dies passiert einmal täglich im OBS-Dienst. Textfelder gelten als leer, wenn kein Text enthalten ist und Zahlenfelder, wenn der Wert 0 ist. |
Definition einer Tabelle
Eine Tabelle wird mit einem Namen, Feldern und Indizes definiert. Die Definition einer neuen Tabelle beginnt immer mit #DBNAME. Alle Felder und Indizes müssen zwischen dem #DBNAME der Tabelle zu der die Felder und Indizes gehören und der nächsten Tabellendefinition stehen.
Tabelle
Die Definition einer neuen Tabelle wird mit #DBNAME begonnen. Mit einem Leerzeichen Abstand tragen Sie dahinter den Namen der Tabelle ein. Der Name einer Tabelle beschränkt sich in den verwendbaren Zeichen auf A bis Z, 0 bis 9 und Unterstrichen.
OK: #DBNAME LISTE_AUTOS
Falsch: #DBNAME LISTE AUTOS
Feld
Felder werden mit #FELDNAME hinzugefügt. Dahinter werden dann mit Komma getrennt folgende weitere Angaben gemacht:
Angabe | Beschreibung |
---|---|
Feldname | Name des Tabellenfeld bzw Tabellenspalte. Die Definition darf nur aus A bis Z, 0 bis 9 und Unterstrich bestehen. Umlaute sind nicht gültig. FELD_STRASSE ist OK FELD_STRAßE ist FALSCH |
Typ | Einzelner Buchstabe. Dieser definiert den Datentyp für die Speicherung. Aktuell Unterstützt werden in der Definition:
|
Feldlänge | Gesamtlänge der Daten, die maximal in das Feld geschrieben werden können. Wenn Sie z. B. eine OBS-Artikelnummer in ein Feld schreiben möchten, muss das Feld mindestens eine Länge von 25 haben, das dies die maximale Länge einer OBS-Artikelnummer ist. Beachten Sie, dass bei Dezimalzahlen die Gesamtlänge den Vor- und Nachkommastellen entsprechen muss. Prozentzahlen von 0 bis 100 mit zwei Nachkommastellen benötigt also eine Länge von mindestens 5. |
Nachkommastellen | Nur gültig bei Dezimalzahlen. Darf nicht gleich oder Größer sein als die Gesamtlänge - 1, da immer mindestens eine Vorkommastelle vorhanden sein muss. |
Picture/Maske | Spannend, wenn Datenbankfelder in Eingabemaske geladen werden. Die Maske sollte daher zu Typ, Feldlänge und Nachkommastellen passen. Folgende Angaben sind erlaubt:
|
Flags | Flags sind besondere Markierungen für Felder, welche zu besonderen Verhalten von OBS führen. Wenn mehrere Flags angegeben werden sollen, dann sind diese mit Komma zu trennen. siehe Liste Flags |
Beispiel für ein Feld mit eine OBS-Artikelnummer (Flag ARTIKELNR):
#FELDNAME MEIN_FELD , C , 25 , 0 , "CCCCCCCCCCCCCCCCCCCCCCCCC" , ARTIKELNR , ARTIKELDELCHK
Index
Ein Index dient der Tabelle zur schnelleren Identifikation von Datensätzen. Felder, welche sich zur Identifikation eigenen, lassen sich hier angeben, damit später Suchen in der Tabelle anhand dieser Felder schneller zu einem Ergebnis führen. Dabei gibt es unterschiedliche Arten und entsprechend unterschiedlichen Identifikationsnamen. Die Struktur ist dabei Identifiaktionsname, Leerzeichen, Name des Index, Leerzeichen und die Tabellenfelderfelder mit Komma getrennt. Der Name des Index muss dabei den Namen der Tabelle enthalten und darf nicht mit einem anderen Index der Tabelle identisch sein. für den Definition nehmen wir daher in der Regel den Namen der Tabelle und einen Zähler (z. B. TABELLENNAME01).
Folgende Identifikationsnamen können für die Definition eines Index genutzt werden:
Fehler | Lösung |
---|---|
#INDEX | Legt einen einfachen Index mit dem angegebenen Namen und den Feldern an. |
#XINDEX oder #UINDEX |
Der Index wird als eindeutig Index angelegt. Eindeutig bedeutet, dass über sämtliche Datensätze der Tabelle die Kombination der Daten in den angegebenen Feldern nur einmal vorkommen darf. Wird versucht einen neuen Datensatz anzulegen oder einen vorhandenen zu ändern und die Daten wären identisch mit einem anderen Datensatz, bricht die Datenbank die Ausführung ab und speichert den Datensatz nicht, außer dieser Umstand wird im Datenbankbefehl entsprechend beachtet (z. B. in MySQL mit INSERT IGNORE oder REPLACE; siehe MySQL Insert). Der Unterschied zwischen XINDEX und UINDEX ist, dass UINDEX den Index als eindeutig anlegt oder gar nicht. XINDEX legt einen normalen Index an, sollten die Daten einer Tabelle die Anlage eines eindeutigen Index für die Felder nicht zulassen. Im Zweifel wird daher XINDEX empfohlen. |
#FINDEX | Erzeugt einen Volltext-Index, welcher für bestimmte Arten der Suche in Textfeldern optimiert ist (z. B. Funktionalität in MySQL). |
Beispiel:
#XINDEX TABELLENNAME01 TB_NUMMER , TB_STATUS
Beispiel Definition einer Tabelle
#DBNAME MEINE_LISTEN
#FELDNAME NUMMER , C , 5 , 0 , "CCCCC" #FELDNAME NAME , C , 60 , 0 , "*" #FELDNAME BESCHREIBUNG , M , 2000 , 0 , "*" #FELDNAME EINTRAEGE , N , 10 , 0 , "NNNNNNNNNN" #FELDNAME SYS_UID , C , 10 , 0 , "CCCCCCCCCC" #FELDNAME SYS_DATE , D , 4 , 0 , "TT.MM.JJ", AUTODATE
#XINDEX MEINE_LISTEN01 SYS_UID #XINDEX MEINE_LISTEN02 NUMMER
Fehler in der Definition
Beim Starten von OBS erhalten Sie bei Fehlern in der Definition folgende Meldung (ID: Y006GZTPFV):
Sollte dies der Fall sein, prüfen Sie die adminerror.txt im OBS-Unterverzeichnis ..\data\debug\.
Fehler | Lösung |
---|---|
Tabelle "Tabellenname" Feldname "Feld" Maske passt nicht zur Definition! | Die Maske enthält unerlaubte Zeichen für den Typen oder ist zu lang. siehe dazu Definition Felder |
Tabelle "Tabellenname" Feldname "Feld" Feldlänge 0 nicht erlaubt! | In der Spalte für die Feldlänge steht eine 0. Tragen Sie hier die gewünschte Feldlänge ein. |