Robert W.B. Linn´s Software, Beispielprojekte und Tipps zu TurboDB, TurboDB VCP, TurboDB Studio, Visual Data Publisher
   
System Tabelle verwenden
TurboDB Studio  »  Entwicklungsleitfaden  »  System Tabelle verwenden  | 

Die Einrichtung einer System-Tabelle ist in fast allen größeren Projekte nützlich.
Mit einer System-Tabelle können:
o Globale Informationen ablegt werden, wie z.B.
Benutzer-Name, Einstellungen, Logo, Datum des letzen Starts, getätigte Eingaben usw.
o Daten zwischen Formularen oder Formularen und Datenbankjobsausgetauscht werden.
o Dialogfelder für Benutzereingaben realisiert werden.

Pro Anwendung braucht nur eine System-Tabelle eingericht zu werden der auch nur einen Datensatz enthält.
Wenn einmal eine System-Tabelle eingerichtet wurde, werden Sie sehrschnell erkennen, wie nützlich diese ist, und für wie viele Anwendungen die eingesetzt werden kann.

Wie kann eine System-Tabelle erstellt werden?
Eine System-Tabelle ist eine ganz normale Tabelle, die jedoch im Gegensatz zu den anderen Tabellen keine Daten aus dem Anwendungsbereich der Applikationenthält sondern
einfach nur Daten für die Applikation selbst.
Weil eine Systeme-Tabelle so ähnlichfunktioniert wie eine Sammlung von globalen Variablen, wird sie oft nur einen einzigen Datensatz enthalten.
Unter Umständen besitzt dieser allerdings einige Dutzend Felder.
Da einer System-Tabelle meist nur ein Datensatz enthält, sollte die Tabellen-Eigenschaft
auf nur Editieren gesetzt werden (Neueingabe und Löschen deaktivieren, nachdem der eine Datensatz angelegt wurde).

Gemerkte Eingaben
Als erstes Anwendungsbeispiel betrachten wir eine Applikation mit einem Schalter zum
Suchen nach dem Namen.
Der Schalter enthält das Makro:

INPUT("Anfangsbuchstaben der gesuchte Name?");
SUCHEN("KUNDEN.ID", T-Eingabe);

Wenn dieser Schalter mehrmals hintereinander betätigt wird, sieht der Anwender immer
seine letzte Eingabe als Vorschlag für die nächste. Wenn er öfter nach gleichen oder
ähnlichen Einträgen suchen muß, ist dies eine große Hilfe beim Eintippen.
Falls aber ein anderen INPUT dazwischen kommt, ist die letzte Such-Eingabe verloren,
da der Inhalt der Variablen T-Eingabe überschrieben wurde.
Um dieses Manko zu beheben, erstellen wir eine System-Tabelle mit einem Feld für die
letzte Such-Option:

1. Wählen Sie Datei/Dem Projekt hinzufügen im Projektfenster und selektieren Sie dann Neue Tabelle in der Liste.
2. Als Name der Tabelle wählen Sie SYSTEM. (Auch jede andere passende Bezeichnung ist möglich)
3. Fügen Sie in der Struktur ein einziges alphanumerisches Feld mit demNamen SucheName hinzu. Die Länge könnte z.B. 40 betragen.
4. Erzeugen Sie die Tabelle. Ein Formular benötigen Sie nicht.

Wie schon gesagt, ist die System-Tabelle eine Tabelle wie alle anderen auch.
Sie hat jedoch keine Verknüpfung zu den anderen Tabellen im Projekt und enthält im
Gegensatz zu diesen nur Verwaltungs-Information.
Die Anfangswerte für diese Verwaltungs-Information sollten Sie nun eintragen.
Öffnen Sie die neue Tabelle und erzeugen Sie mit "Bearbeiten/NeueDatensätze eingeben"
einen neuen Datensatz. Jetzt können Sie einen sinnvollen Vorgabewert für die Suche nach
dem Namen in der Spalte SucheName eintragen, z.B. *.
Beenden Sie die Neueingabe und schließen Sie die Tabelle.
Das Makro auf dem Such-Schalter muß nun so erweitert werden, daß es vor der Abfrage die
letzte Such-Einstellung aus der System-Tabelle holt und nachher den neuen Begriff
wieder in die System-Tabelle einträgt:

ReadRec(SYSTEM, 1);
T-Eingabe := SYSTEM.SucheName;
Input("Wie beginnt der gesuchte Name?");
Suchen("Kunden.id", T-Eingabe);
SYSTEM.SucheName := T-Eingabe

Somit retten Sie den Suchbegriff über alle eventuell folgenden Aufrufe von INPUT hinweg
und sogar beim nächsten Öffnen des Projektes ist er noch da.
Wenn Sie mit der Workgroup-Edition netzwerkfähige Anwendungen erstellen, sollten Sie
darauf achten, daß jeder Anwender seine eigene private System-Tabelle erhält.
Dies erreichen Sie, indem Sie bei den Eigenschaften der Tabelle unter Suchpfad
Lokaleintragen. Auch wenn das restliche Projekt auf dem Server installiert wird, legt diese
Option die System-Tabelle in das private Verzeichnis.

Datenaustausch
Wer anspruchsvolle Datenbankjobs einsetzt, kommt manchmal in die Verlegenheit,
dem Job für die Ausführung noch weitere Information zukommen zu lassen.
Alte DOS-Hasen benutzen dazu immer noch dem Befehl NOTE, obwohl es mit einer
System-Tabelle einfacher und komfortabler geht.

Als einfaches Beispiel wählen wir einen Datenbankjob, der die Kunden aus KFZ als
Liste ausdruckt:

.REPORT
.PO 5, MT 3
.PROLOG
Liste der Fahrzeuge * Erstellt von: Datum: $heute
.DATA$(Name:30 Vorname:20 Fahrzeug.Bezeichnung:30)

Im Prolog des Jobs soll neben dem Titel auch das Erstelldatum und der Autor angegeben
werden. Aber auf welchem Weg kommt der Name in den Datenbankjob?
Mit einer System-Tabelle ist das gar kein Problem. Erweitern Sie diese einfach um eine
Spalte Autor und tragen Sie dort als Vorgabewert der Autor ein.
Diese Angaben fügen Sie ihrem Datenbankjob hinzu:

.REPORT
.PO 5, MT 3
.PROLOG
Liste der Kunden * Erstellt von: $SYSTEM.AutorDatum: $heute
.DATA$(Name:30 Vorname:20 Fahrzeug.Bezeichnung:30)

Nun müssen Sie noch dafür sorgen, daß jeweils der richtige Autor in die
System-Tabelle eingetragen wird. Wahrscheinlich gibt es ja schon ein Prozedur, die
den Bericht ausführt. Die müssen Sie nur noch etwas erweitern:

Procedure Liste_drucken
Input("Geben Sie Ihren Namen an:");
ReadRec(SYSTEM, 1);
SYSTEM.Autor := T-Eingabe;
WriteRec(SYSTEM, 1);
Run("KUNDEN.Liste", 2);
EndProc

Auf diese Weise können Sie nicht nur einfache Strings mit Datenbankjobs austauschen
sondern auch mehrere Informationen auf einmal inklusive Memos für Textbausteine oder
Bilder für Logos im Datenbankjob.
Natürlich ist diese Art des Datenaustausches nicht auf Datenbankjobsbeschränkt.
Das selbe funktioniert zwischen Formularen, z.B. wenn Sie ein modales Formular öffnen
oder zwischen Formular und Bericht.

Dialoge mit dem Anwender
In Kombination mit Fomularen und der Oberflächen-Funktion ExecDialog entfalten
System-Tabellen ihre ganze Mächtigkeit. Hierzu folgende Fragenstellungen:
Sind Ihnen die Möglichkeiten von Message und Input zu eingeschränkt?
Möchten Sie auch mal ein Datum oder zwei Zahlen oder noch mehr Eingabe beim Benutzer
abfragen?
Würden Sie die Gültigkeit seiner Eingaben gerne kontrollieren und eigene Fehlermeldungen
ausgeben?

Dies ist alles kein Problem, wenn Sie Formulare mit der System-Tabellekombinieren.
In Formularen können Sie ja nach belieben unterschiedliche Datentypenkombinieren,
Eingaben prüfen, Felder vorbesetzen, weitere Formulare ausführen usw. Es macht
keinen Unterschied, ob diese Daten "echte" Daten oder Verwaltungsdaten aus
der System-Tabelle sind.
Damit sich auch das richtige Dialog-Feeling einstellt, verfügt easy über die Funktion
ExecDialog, die jedes Formular wie ein Dialogfeld ausführt.
Der Unterschied zu ähnlichen Funktionen wie z.B. EditRec besteht in folgenden Punkten:

   1. das Formular wird immer in seiner ganzen Größe zentriert auf dem Bildschirm angezeigt,
   2. der Dialog wird nicht mit einem ADL-Panel versehen,
   3. Menü- und Schalterleiste bleiben unverändert,
   4. die restliche Anwendung ist vollkommen gesperrt, solange der Anwender den Dialog nicht schließt,
   5. die Funktion ExecDialog liefert als Rückgabewert, ob es mit OK (CloseWnd) oder Abbruch (Cancel) beendet wurde.


Um Ihnen die Vorgehensweise zu demonstrieren, erweiteren wir das vorherige Beispiel um
die Möglichkeit, einen Altersbereich für die auszudruckenden Kunden anzugeben.

Auch diese beiden Angaben werden in der System-Tabelle gespeichert.
Sie muß also um die Spalten GeburtsdatumVon und GeburtsdatumBis ergänzt werden.
Als nächstes fügen Sie dem Projekt ein neues Formular namens Bereich_eingeben für
die System-Tabelle hinzu, das später als Dialogfeld dienen wird. Es sollte nur die beiden
Datumsfelder und die zwei Schalter beinhalten.
Am besten sieht es aus, wenn Sie für die Eingabefelder die Rahmenart 3-dimensional verwenden.
Die Schalter werden mit OK und Abbruch beschriftet und führen die Makros CloseWnd und Cancel aus.
Die Prozedur Liste_drucken wird so erweitert, daß zu Beginn das
Anfangs- und Ende-Geburtsdatum abgebfragt wird:

Procedure Liste_drucken
If ExecDialog("SYSTEM.Bereich_eingeben") = 1
Input("Geben Sie Ihren Namen an:");
ReadRec(SYSTEM, 1);
SYSTEM.Autor := T-Eingabe;
WriteRec(SYSTEM, 1);
Run("KUNDEN.Datenbankjob_Test", 2);
End
EndProc

Nach dem Aufruf von ExecDialog stehen die Daten in der System-Tabelle
und können vom Datenbankjob aus benutzt werden:

.REPORT
.PROLOG
.SELECTION Geboren >= SYSTEM.GebdatumVon AND Geboren <<= SYSTEM.GebdatumBis
Liste der Kunden
Erstellt von: $SYSTEM.Autor Datum: $heute
Geburtsdatum zwischen $SYSTEM.GebdatumVon und $SYSTEM.GebdatumBis
..
.DATA$(Name:30 Vorname:20 Fahrzeug.Bezeichnung:30)


Letzte Änderung 18.12.2011 19:10 Erstellt mittels KALHelp Version 6.7 (09-11-2011) (alle Rechte vorbehalten) (c) Robert W.B. Linn @53° 38' 60''N 9° 48' 0''E