Makros und Programme einsetzen

Datenbank-Programmierung und Oberflächenprogrammierung

Top  Previous  Next

TurboPL beinhaltet eine große Menge an Funktionen, mit denen Daten aus Tabellen bearbeitet werden können. Zu diesen Funktionen gehören unter anderen:

ReadRec: Datensatz lesen
PostRec: Datensatz schreiben
FindRec: Datensatz suchen
SetMark: Eine Markierung auf einen Datensatz setzen
NMarks: Anzahl der Markierungen zurückliefern
ClearDat: Eine Tabelle löschen
Access: Sortierung festlegen
und viele andere mehr. Diese Funktionen sind in der Referenz unter Datenbank-Befehle zusammengefasst.

Daneben gibt es eine andere Gruppe von Funktionen, die auf den ersten Blick eine ganz ähnliche Wirkung haben:

ShowRec: Einen bestimmten Datensatz anzeigen
BySelection: Datensätze suchen
PutStar: Einen Datensatz kennzeichnen
SetSortOrder: Sortierung festlegen

und eine ganze Reihe weiterer Befehle. Diese Funktionen sind in der Referenz unter Benutzerschnittstelle zu finden.

Zwischen diesen beiden Gruppen von Funktionen besteht aber ein fundamentaler Unterschied:

Datenbank-Befehle arbeiten rein auf den Daten-Tabellen also intern während Oberflächen-Funktionen rein auf den Formularen arbeiten und keinen Einfluss auf die Datenbank-Tabellen selbst haben.

Das kann man auch daran erkennen, dass Oberflächenfunktionen nur ausgeführt werden können, wenn ein passendes Formular geöffnet ist, und dass sie sich immer auf ein bestimmtes Formular beziehen. Datenbank-Befehle dagegen können immer ausgeführt werden, da sie in der Datenbank selbst ablaufen. Programme, die mit eine .NET-Sprache oder mit Delphi geschrieben sind und TurboDB einsetzen, können Datenbank-Befehle benutzten. Oberflächenfunktionen dagegen sind spezifisch für TurboDB Studio.

Den Unterschied zwischen den beiden Gruppen erkennt man auch an ihren Parametern: Datenbank-Befehle haben als ersten Parameter meistens einen Tabellennamen (manchmal einen Feldnamen). Oberflächenfunktionen haben keinen solchen Parameter. Sie beziehen sich entweder auf das gerade aktive Datenfenster in der Benutzeroberfläche oder werden als Methoden von Datenfenstern aufgerufen. Also:

ReadRec(MYTABLE, 3)
ClearDat(MYTABLE)

aber

ShowRec(80) ..Zeigt Datensatz 80 im aktiven Datenfenster an
TheDataWnd.ShowRec(80) ..Zeigt Datensatz 80 im Datenfenster TheDataWnd an

Jedes Formular legt für jede Tabelle, aus der es Daten anzeigt einen Cursor an. Das ist ein Puffer, in dem der aktuellen Datensatz gespeichert ist und auch die Sortierung und die Auswahl. Wenn für eine Tabelle drei Formulare geöffnet sind, dann gibt es dazu auch drei getrennte Cursors mit den jeweiligen Einstellungen. Das ist auch nötig, weil in diesen drei Formularen unterschiedliche Sortierungen, Auswahlen und Datensätze eingestellt werden können. Zusätzlich gibt es noch einen Cursor pro Tabelle für die Datenbank-Befehle. In der folgenden Grafik sind die Cursors blau dargestellt und die Datenbank-Tabellen grün. In der oberen Reihe sieht man zwei Formulare, die beide sowohl TAB1 als auch TAB2 darstellen sowie ein Programm mit Datenbank-Befehlen.

Die Folge dieser Zweiteilung ist, dass Sie Datenbank-Befehle und Oberflächenfunktionen nicht mischen können, auch wenn das manchmal naheliegend wäre. Die folgende Kombination ist zum Beispiel sinnvoll:

Access(MYTABLE, 'KundenNachName');
ReadRec(MYTABLE, FirstRec(MYTABLE));

Nach dieser Sequenz ist derjenige Datensatz aktuell, dessen Kundenname im Alphabet der erste ist. Dieser Datensatz ist deshalb aber noch nicht in einem Formular angezeigt. Sinnvoll ist auch das:

SetSortOrder('KundenNachName');
ShowRec(-1);

Hier wird der alphabetisch erste Datensatz im Formular zum aktuellen gemacht. Nicht sinnvoll ist dagegen:

Access(MYTABLE, 'KundenNachName');
ShowRec(-1);

Der erste Befehl arbeitet auf der Datenbank, der zweite auf dem aktiven Formular. Angezeigt wird der Datensatz, der bezüglich der für dieses Formular gültigen Sortierung als erster kommt. Diese Sortierung ist nur dann KundenNachName, wenn sie vorher vom Anwender oder durch das Programm mit SetSortOrder so eingestellt wurde. Ebenso wenig Sinn macht:

SetSortOrder('KundenNachName');
ReadRec(MYTABLE, FirstRec(MYTABLE));

Der gelesene Datensatz richtet sich wahrscheinlich nicht nach KundenNachName, sonder nach dem was zuvor mit Access eingestellt wurde.

Eine andere beliebte aber dennoch falsche Mischung ist:

BySelection('Betrag > 300000', 1, 1);
if NMarks(MYTABLE) > 0 ..NICHT DER GEWÜNSCHTE EFFEKT
.. usw.

Weil die zweite Funktion auf einem anderen Cursor arbeitet als die erste, liefert NMarks nicht die Anzahl der in BySelection gefunden Datensätze. Manchmal stimmt die Zahl zwar trotzdem, weil intern Datenbank-Befehle zur Implementierung der Oberflächenbefehle benutzt werden, aber Sie können und dürfen sich nicht darauf verlassen.

Um die Programmierung von Anwendungen zu vereinfachen, gibt es zwei Verbindungen zwischen den Formular-Cursors und der Datenbank:

1.Wenn Sie ein Makro aus einem Formular heraus aufrufen, werden alle Cursors dieses Formulars in die Cursors der Datenbank kopiert. Mit anderen Worten: Beim Start eines Makros, das aus einem Formular heraus aufgerufen wurde, finden Sie auf der Datenbank-Tabelle genau dieselben Einstellungen wieder, die auch im Formular vorhanden waren. Deshalb können Sie mit NMarks oder mit GetAccess abfragen, welche Einstellungen im Datenfenster vorhanden sind, obwohl sich diese Funktionen auf die Datenbank-Tabellen beziehen.
2.Die Oberflächenfunktion Attach übernimmt die Einstellungen der Datenbank-Cursors in das Formular, von wo aus es aufgerufen wurde. Das bedeutet, dass eine Kombination aus Access und Attach auf das Formular den selben Effekt hat wie ein SetSortOrder.

Nach dem bisher gesagten, gibt es drei verschiedene Muster für TurboPL-Prozeduren, die aus einem Formular aufgerufen werden:

1.Die Prozedur führt ausschließlich Oberflächenfunktionen aus: Dies ist der Fall, wenn die Prozedur durch Setzen von Sortierung und Auswahl eine Datensicht aufbaut, einen Bericht ausdruckt, Datensätze kontrolliert oder ähnliches tut.
2.Die Prozedur führt ausschließlich Datenbank-Befehle aus: Sie kann z.B. neue Datensätze eintragen, alte löschen oder vorhandene ändern oder eine Statistik über die Datenbank berechnen. In manchen Fällen resultieren diese Aktionen nicht in einem Zustand, der im Formular angezeigt werden muss.
3.Datenbank-Befehle gefolgt von einem Attach und evtl noch weiteren Oberflächenfunktionen: Dies ist der häufigste Fall, weil man auf diese Weise Änderungen an der Datenbank durchführen kann und das Ergebnis in einem Formular darstellen.

Wann verwendet man nun Datenbank-Befehle und wann Oberflächenfunktionen? Im Grunde ist die Antwort einfach und eine logische Folgerung aus dem bisher Beschriebenen. Wenn Sie einfache, Formular-bezogene Befehle ausführen wollen, sollten Sie Oberflächenfunktionen verwenden. Für alle umfangreicheren Änderungen an Datensätzen, komplexe Suchen, Aufbereiten von Berichten und Reports usw. sind Datenbank-Befehle die einzige sinnvolle Wahl. Um das Ergebnis einer solchen Aktion im Formular sichtbar zu machen, verwenden Sie Attach.

Wenn Sie diese Zusammenhänge etwas komplex finden, ist das nicht verwunderlich. Die Zusammenhänge sind komplex. Experimentieren Sie ein bisschen mit einem richtigen Projekt herum, dann wird es klarer werden.