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.