Makros und Programme einsetzen

Datensätze lesen

Top  Previous  Next

Wenn Sie in Ihrem eigenen Makro Datensätze aus einer Tabelle lesen wollen, handelt es sich oft darum, alle Datensätze der Tabelle durchzugehen. Dies können Sie z.B. folgendermaßen erreichen:

MoveBegin(MYTABLE);
while ReadNext(MYTABLE)
..Jetzt können Sie mit dem aktuellen Datensatz der Tabelle arbeiten, z.B. ein Feld ausgeben
Message(MYTABLE.Name);
end;

Eine Alternative dazu ist Folgendes:

.sub MYTABLE
Message(MYTABLE.Name);
.endsub

In der ersten Variante haben Sie wesentlich mehr Kontrolle über den gesamten Vorgang, dafür ist die zweite Variante etwas eleganter.

Sollten Sie die Datensätze in einer vorgegebenen Sortierung durchlaufen wollen, können Sie folgendes tun:

SetAccess(MYTABLE, 'MYTABLE_Number_Index');
MoveBegin(MYTABLE);
while ReadNext(MYTABLE)
..Jetzt können Sie mit dem aktuellen Datensatz der Tabelle arbeiten, z.B. ein Feld ausgeben
Message(MYTABLE.Name);
end;

In dieser Variante muss es einen Index namens MYTABLE_Number_Index geben, der die gewünschte Sortierung beinhaltet. Das Kommando SUB kann hier noch etwas mehr:

.sub MYTABLE
Message(MYTABLE.Name);
.endsub Name

Die Sortierung nach dem Datenfeld Name erfolgt hier unabhängig davon, ob ein passender Index existiert oder nicht. Allerdings ist die Ausführung natürlich schneller, wenn dies der Fall ist.

Analog zu MoveBegin und ReadNext gibt es auch die Befehle MoveEnd und ReadPrev, mit denen man die Datensätze der Tabelle von hinten nach vorne durchlaufen kann. Dies ist nützlich, wenn innerhalb des Durchlaufs Datensätze gelöscht werden, weil sich dies dann auf den weiteren Verlauf der Schleife nicht auswirken kann.

In älteren Versionen wurde MoveBegin und ReadNext noch nicht unterstützt. Das Lesen von Datensätzen sah damals folgendermaßen aus und funktioniert auch in TurboDB Studio noch:

vardef RecNo: Number;
SetAccess(MYTABLE, 'MYTABLE_Number_Index');
RecNo := FirstRec(MYTABLE);
while RecNo > 0
ReadRec(MYTABLE, RecNo);
..Jetzt können Sie mit dem aktuellen Datensatz der Tabelle arbeiten, z.B. ein Feld ausgeben
Message(MYTABLE.Name);
RecNo := NextRec(MYTABLE);
end;

Diese Methode ist erheblich umständlicher als die neue Methode mit MoveBegin und ReadNext. Außerdem wird hier in einer Mehrbenutzer-Version zusätzlich noch eine Sperre benötigt, damit die physikalische Satznummer garantiert gültig bleibt. Dies ist bei MoveBegin und ReadNext nicht nötig.

Siehe auch

MoveBegin, MoveEnd, ReadNext, ReadPrev, ReadRec