[zurück zum Inhalt]
 

5.3. Das Datenformat der Jahrgangsdateien (.sdb)


Um die Struktur besser nachvollziehen zu können, sollten Sie sich eine Beispieldatei ausdrucken und die dortige Struktur mit den hier gennanten Erklärungen vergleichen.
Kommentare beginnen immer mit dem Zeichen "#". Alle Kommentare werden von der Schulverwaltung komplett ignoriert und nicht wieder mit abgespeichert. Weiterhin wichtig: jeder Eintrag muss in einer einzelnen Zeile stehen.
Die Datendatei gliedert sich in zwei Blöcke: in einen Strukturblock und in einen Datenblock. Im Strukturblock wird festgelegt, welche Daten in welchem Format für die einzelnen Datensätze gespeichert werden sollen. Im Datenblock werden dann die eigentlichen
Inhalte gespeichert.
Der Beginn des Strukturblocks beginnt mit /STRUCTBEGIN und endet mit /STRUCTEND.
Analog beginnt der Datenblock mit /DATABEGIN und endet mit /DATAEND.
Wichtig: Diese vier Befehle müssen genau einmal in der richtigen Reihenfolge in der Datei vorkommen.
Beispiel für eine leere Datei:

# Dies ist ein Kommentar
/STRUCTBEGIN
/STRUCTEND
/DATABEGIN
/DATAEND

Den Aufbau der Blöcke soll nun im Folgenden erläuertert werden:

1. Die in der Schulverwaltung auftauchenden Elemente:
Bevor ich zum eigentlichen Aufbau komme, kurz noch eine Liste, mit welchen Elementen dort gearbeitet wird. Wenn Sie mit der Schulverwaltung gearbeitet haben, ist Ihnen sicher aufgefallen, dass Sie Daten für Lehrer, Schüler, Termine etc. verwalten können. Insgesamt werden in der Schulverwaltung folgende "Elemente" verwaltet:
- Systemweite Variablen, wie z.B. die Anzahl der Stunden pro Tag
- Fächer
- Lehrer
- Räume
- Klassen
- Wünsche (Ein Wunsch ist ein Eintrag im Curriculum)
- Einzeltermine
- Dauertermine
- Vertretungstermine
- Schüler
Darüber hinaus gibt es noch Elemente wie Zensuren, Fehlzeiten etc., die in den entsprechenden Elementen verwaltet werden (mehr dazu in Punkt 3).

2. Der Strukturblock
Der Inhalt des Strukturblocks entspricht haargenau dem der Strukturdatei.
Siehe dazu die entsprechende Seite in dieser Dokumentation (Abschnitt 5.1.).

3. Der Datenblock
Jedes einzelne Element (vgl. Punkt 1) wird durch seinen Namen eingeleitet. Beim Schüler sieht dies z.B. so aus (bitte auch auf die Schreibweise achten!):

/Schueler

Nun weiss die Schulverwaltung, dass im Folgenden ein(!) kompletter Schüler abegspeichert wurde.
Nach dieser "Einleitung" folgen die Daten, die zu dem Schüler, bzw. dem jeweiligen Element gehören. Wichtig dabei ist, dass die Reihenfolge der einzelnen Elemente beachten werden. So müssen alle Lehrer vor den Klassen gespeichert werden, da eine Klasse einen Lehrer beinhalten kann. Durch diese Verkettungen ist die Reihenfolge der Elemente im Datenblock "im Prinzip" fest vorgegeben. Im Folgenden liste ich alle Elemente in der Reihenfolge auf, in der sie in der Datei gespeichert sein müssen. Dazu gebe ich dann immer an, wie die eigentlichen Daten gespeichert werden. Die Daten werden dabei analog wie bei den Strukturdefinitionen gespeichert, d.h. erst kommt der Typ des Wertes, z.B. "string", wenn das Datum aus einem String besteht, dann folgt ein Komma und danach der eigentliche Wert (im Folgenden wird als Platzhalter für diesen Wert "<Wert>" verwendet). Beispiel:

string,Beispiel

enstpricht einer Zeichenkette, deren Inhalt das Wort "Beispiel" ist.
Anmerkung: dem Typ bool folgt eine 0 für den Wert FALSE (=falsch) oder eine 1 für den Wert TRUE (wahr).
Wichtig: auch wenn ein Datenfeld leer ist (also der Benutzer in das entsprechende Feld nichts eingetragen hat), muss dieses Datenfeld hier auftauchen! Nach dem Typ und dem Komma, steht dann nichts mehr, Bsp: "string,".
Das Ende einer Jeden Zeile wird übrigens durch ein CR ("carriage return"), also einen Zeilenvorschub gekennzeichnet.

/System
# hier werden die "Systemweiten" Variablen gespeichert
# Niedrigster Jahrgang, der an der Schule unterrichtet wird:
int,<Wert>
# Höchster Jahrgang, der an der Schule unterrichtet wird:
int,<Wert>
# Anzahl der neuen Klassen, die bei einem Schuljahreswechsel automatisch erzeugt werden sollen.
int,<Wert>
# Wird am Samstag unterrichtet?:
bool,<Wert>
# Anzahl der Stunden pro Tag:
int,<Wert>

/Fach
# Hier wird nur der Name des Faches abgespeichert:
string,<Wert>

/Lehrer
# Der Datensatz eines Lehrers:
# Als erstes folgen hier alle Datenfelder, die im Strukturblock für den Lehrer
# festgelegt wurden und zwar genau in der Reihenfolge, wie sie auch im Strukturblock
# erscheinen!
# Dann folgen die Datenfelder, die fest beim Lehrer "verankert" sind:
# Anzahl der Stunden pro Woche, die der Lehrer bereits unterrichtet:
int,<Wert>
# Jetzt folgen zwei, ebenfalls nicht veränderbare "Listen".
# Zunächst die Liste aller Fächer, die der Lehrer unterrichtet
/FachlisteBegin
# Jedes Fach wird darin durch eine Nummer gekennzeichnet. Diese Nummer
# gibt die Position an, an der das Fach in dieser Datei gespeichert wurde
# Beispiel für einen solchen Eintrag:
int,5
# würde bedeuten: der Lehrer unterrichtet das Fach, das in dieser Datei als Fünftes
# abgelegt wurde.
# folgt auf /FachlisteBegin sofort /FachlisteEnd, unterrichtet der Lehrer kein Fach
/FachlisteEnd
# Die nächste Liste ist die Liste mit allen Fehlzeiten des Lehrers
/FehlzeitlisteBegin
# In diesem Block folgen alle Fehlzeiten, wobei eine Fehlzeit eingeleitet wird durch:
/Fehlzeit
# Die Einträge für eine Fehlzeit folgen nach den Regeln, wie sie im Strukturblock
# für die Fehlzeiten festgelegt wurden. Wurden mehrere Fehlzeiten für einen
# Lehrer eingegeben, folgen Sie nahtlos hintereinander: Eine Kennung ist hier nicht
# extra notwendig, da die Anzahl und Reihenfolge der Daten im Strukturblock angegeben
# wurden.
# Stehen zwischen /FehlzeitlisteBegin und /FehlzeitlisteEnd keine Daten, hat der Lehrer
# keine Fehlzeiten
/FehlzeitlisteEnd

/Raum
# Der Datensatz eines Raums:
# Wie schon beim Lehrer, folgen hier alle Datenfelder, die im Strukturblock für den
# Raum festgelegt wurden. (vgl. auch Beschreibung beim Lehrer)
/FachlisteBegin
# Die Fächer, für die dieser Raum geeignet ist. Gleicher Aufbau wie der entsprechende
# Block beim Lehrer
/FachlisteEnd

/Klasse
# Der Datensatz einer Klasse:
# Zunächst folgen hier, wie schon beim Lehrer alle Datenfelder, die im Strukturblock
# für die Klasse festgelegt wurden. (vgl. auch Beschreibung beim Lehrer)
# Nahtlos im Anschluss folgen (vgl. Lehrer) alle Datenfelder, die fest in der Klasse
# "verankert" sind, das sind im einzelnen:
# Der Klassenraum:
int,<Wert>
# dabei steht <Wert> wieder für den Raum, der in dieser Datei an der <Wert>ten-Stelle
# bzw. Position gespeichert wurde. Steht hier eine 0, so gibt es keinen Klassenraum.
# Der Klassenlehrer:
int,<Wert>
# dabei steht <Wert> (analog zum Klassenraum), ebenfalls für den in dieser Datei an der
# <Wert>ten-Stelle gespeicherten Lehrer

/Wunsch
# Der Datensatz eines Wunsches. Ein Wunsch ist ein Eintrag im Curriculum.
# Der Jahrgang:
int,<Wert>
# Die Anzahl der Stunden:
int,<Wert>
# Folgender Wert wird (noch) nicht verwendet, muss aber mit angegeben werden.
# Sollte entweder den Wert 0 oder denselben Wert wie die "Anzahl der Stunden"
# annehmen.
int,<Wert>
# Das Fach, ebenfalls wieder als Positionsangabe (vgl. Fachangabe bei den Lehrern):
int,<Wert>

/Einzeltermin
# Der Datensatz eines Einzeltermins:
# Zunächst folgt hier, wir schon beim Lehrer alle Datenfelder, die im Strukturblock
# für den Einzeltermin festgelegt wurden (vgl. auch Beschreibung beim Lehrer).
# Nahtlos im Anschluss folgen (vgl. Lehrer) alle Datenfelder, die fest im Einzeltermin
# "verankert" sind:
# Der <Wert> gibt auch hier wieder die Position in der Datei an, an der das entsprechende
# Element gespeichert wurde
# Klasse
int,<Wert>
# Raum
int,<Wert>
# Lehrer
int,<Wert>
# Fach
int,<Wert>

/Dauertermin
# Analog zum Einzeltermin: erst folgen wieder alle Einzeltermine, dann die fest
# "verankerten" Werte:
# Wochentag
string,<Wert>
# Klasse
int,<Wert>
# Raum
int,<Wert>
# Lehrer
int,<Wert>
# Fach
int,<Wert>

/Vertretungstermin
# Im Prinzip wie Einzeltermin, bei dem zusätzlich der vertretende Lehrer gespeichert wird:
# Nach den Datenfeldern, wie im Strukturblock definiert, folgen nahtlos:
# Klasse
int,<Wert>
# Raum
int,<Wert>
# Der Lehrer, der den fehlenden Lehrer vertritt
int,<Wert>
# Fach
int,<Wert>
# Der Lehrer, der fehlt
int,<Wert>

/Schueler
# Die Daten des Schülers sind fast so aufgebaut, wie die des Lehrers.
# Zunächst kommen wieder alle Daten, die im Strukturenblock definiert sind.
# Dann folgen die fest "verankerten" Daten:
# Klasse, in der sich der Schüler befindet:
int,<Klasse>
# Jetzt kommen zwei "Listen":
/ZensurenlisteBegin
# Hier sind jetzt alle Zensuren hintereinaner. Jede Zensur wird durch
/Zensur
# eingeleitet. Direkt dahinter folgt eine Zensur und zwar genauso, wie sie in
# im Strukturenblock definiert sind.
# Dann folgt nahtlos anschliessend genau eine Angabe im Format:
int,<Wert>
# die das Fach angibt, zu dem die Note gehört. Auch hier gibt <Wert> wieder die
# Position des Fachs innerhalb dieser Datei an.
# Stehen hier keine weiteren Daten zwischen /ZensurenlisteBegin und /ZensurenlisteEnd
# wurden dem Schüler keine weiteren Zensuren zugewiesen.
/ZensurenlisteEnd
/FehlzeitlisteBegin
# Hier sind alle Fehlzeiten aufgeführt. Der Aufbau ist wie bei den Fehlzeiten des Lehrers
/FehlzeitlisteEnd

Neben diesen einzelnen Elementen, gibt es noch ein spezielles Element, genauer gesagt einen "Sub-Block" im Datenblock.
Dieser Block beginnt mir /BEGINVER<Wert> und endet mit /ENDVER<Wert>.
Für <Wert> steht eine Versionsnummer oder eine andere anwendungsspezifische Kennung. Dieser Block kommt dann zum Einsatz, wenn ein Programm oder eine zukünftige Version der Schulverwaltung zusätzliche Daten speichern muss. Beim Laden in die Schulverwaltung und beim erneuten Speichern, wird dieser Block immer an das Ende des Datenblocks (also unmittelbar vor /DATAEND) eingetragen.
 

[zurück zum Inhalt]