OBS/System/Datenbankdefinition

Aus OBS Wiki
Version vom 8. März 2024, 17:00 Uhr von Nimz (Diskussion | Beiträge) (→‎Fehler in der Definition)
(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)
Zur Navigation springen Zur Suche springen

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

HINWEIS: Diese Auflistung kann unvollständig sein. Eine Definion und/oder Beschreibung finden Sie am Anfang der obsdb.sys. Suchen Sie nach #DBFLAG.
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 MEINE_LISTEN
Falsch: #DBNAME MEINE LISTEN

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:
  • C : Text vom Typ Char
  • V : Text vom Typ Varchar
  • M : Langtext (mehr als 255 Zeichen)
  • I : Ganzzahl (Integer / Int)
  • N : Dezimalzahl (Decimal)
  • D : Datum/Uhrzeit (Datetime)
  • B : Blob-Daten
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:

  • C
    1. C wiederholt bis maximal der Feldlänge. Feldlänge 10 gibt also die Freiheit von "C" bis "CCCCCCCCCC"
    2. Maske mit Sternchen ("*") veranlasst OBS automatisch die maximale Feldlänge zu verwenden
    3. Zeiten im digitalen 24-Stunden Format können auch in Textfelder gespeichert werden. Als Vorgabe kann dazu mit zwei Varianten gearbeitet werden: "ZZ:ZZ" oder "ZZ:ZZ:ZZ". Je nachdem, ob auch Sekunden mit angegeben werden können.
      HINWEIS: Die Feldlänge muss in diesem Fall entweder 5 für "ZZ:ZZ" oder 8 für "ZZ:ZZ:ZZ" sein. Sonst ist die Verwendung ungültig.
  • V : wie Char (C)
  • M : Maske ist immer "*"
  • I : N bis zur maximalen Feldlänge. Feldlänge 10 gibt also die Freiheit von "N" bis "NNNNNNNNNN"
  • N : Die Kommastelle ist mit einem Punkt anzugeben. Ansonsten gilt hier auch N bis zur maximalen Feldlänge. 10 , 3 ermöglicht als Maske von "N.N" bis "NNNNNNN.NNN"
  • D : Maske immer auf "TT.MM.JJ"
  • B : Maske ist immer "*"
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):
Db struktur fehlerhaft.png

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 Feld
  1. Es wurde das Komma zwischen der Maske und dem ersten Flag vergessen
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.
Tabelle "Tabellenname" Feldname "Feld" Typ "Typ" falsche Syntax! Der Buchstabe passt zu keinem der für die Definition des Datentyps erlaubten Buchstaben. siehe dazu Definition Typ
Tabelle "Tabellenname" Feldname "Feld" Falsche Definition der Feldgröße für Typ "Typ". Nachkommastelle ist nicht 0. Bis auf Dezimalzahlen (Typ N) sind alle anderen Typen mit 0 zu definieren. Passen Sie den Wert für die Nachkommastellen entsprechend an.
Tabelle "Tabellenname" Feldname "Feld" Falsche Definition der Feldgröße für Typ "N". Nachkommastelle ist größer oder gleich der Feldlänge. Die Nachkommastelle ist zu groß, als damit ein Feld definiert werden könnte. Passen Sie entweder die Feldlänge oder die Nachkommastellen an. Die Nachkommastellen dürfen nicht größer sein als die Gesamtlänge des Feldes subtrahiert um 1.
Beispiel:
#FELDNAME FAKTOR            , N ,   4 , 6 , "NN.NNNNNN"

Die Länge 4 ist kleiner als die 6 Nachkommastellen. Entweder muss die Definition der Nachkommastellen 3 reduziert werden oder die Länge mindestens 7 betragen. Die Maske würde in diesem Fall implizieren, dass 8 , 6 die korrekte Definition wäre.

Tabelle "Tabellenname" Feldname "Feld" Flag "Flag" Flag nicht definiert! Das Flag "Flag" ist nicht definiert. Fügen Sie die Definition mit #DBFLAG hinzu oder entfernen Sie das Flag aus der Tabellendefinition.
Tabelle "Tabellenname" #Index "Index" Name nicht erlaubt! Der Indexname beginnt nicht mit dem Tabellennamen. Passen Sie den Namen entsprechend an.
Tabelle "Tabellenname" #Index "Index" schon vorhanden! Der Name des Index ist mehrfach vergeben. Prüfen Sie die Index-Definitionen der Tabelle und ändern Sie die Indexnamen so ab, dass diese eindeutig sind.
Feld "Feld" nicht in Tabellendefinition vorhanden! In der Indexdefinition ist ein Feld aufgeführt, dass in der Tabellendefinition nicht vorhanden ist. Entfernen Sie das Feld aus der Indexdefinition oder definieren Sie das Feld in der Tabelle.