| | roPTools | >TurboDB Studio < | TurboDB VCL | VDP | KALHelp | Downloads | Verweise | Suche | Kontakt | Impressum | |
|
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)
|