Makros und Programme einsetzen

Datensätze löschen

Top  Previous  Next

Zum Löschen eines einzelnen Datensatzes benutzen Sie die Funktion DelRec:

while FileSize(MYTABLE) > 0
       DelRec(MYTABLE, 1)

Diese Routine löscht alle Datensätze der Tabelle MYTABLE einzeln. Das dauert ziemlich lange und ist nur zu Demonstrationszwecken gedacht. Sollten Sie tatsächlich die ganze Tabelle löschen wollen, verwenden Sie besser die Funktion ClearDat.

ClearDat(MYTABLE);

Beachten Sie, dass TurboDB den Platz gelöschter Datensätze sofort mit dem letzten Datensatz der Tabelle wieder auffüllt. Wenn Sie alle Datensätze einer Tabelle löschen wollen, in denen der Nachname Maier ist, dann ist der folgende Code nicht richtig:

vardef RecNo: Number;
RecNo := FirstRec(MYTABLE);
while RecNo > 0
       ReadRec(MYTABLE, RecNo);
       if MYTABLE.Nachname = 'Maier'
               DelRec(MYTABLE, RecNo);
       end;
       RecNo := NextRec(MYTABLE);
end;

Das funktioniert deswegen nicht, weil beim ersten Maier, der gefunden und gelöscht wird, der letzte Datensatz der Tabelle an seine Stelle verschoben wird. Dieser Datensatz wird aber nicht mehr untersucht. Falls dieser Datensatz also auch auf das Kriterium Maier passt, bleibt er verschont und die Tabelle enthält auch nach dem Durchlauf dieses Codes einen Datensatz mit dem Nachnamen Maier. Dieses Problem ist glücklicherweise einfach zu lösen:

vardef RecNo: Number;
RecNo := FirstRec(MYTABLE);
while RecNo > 0
       ReadRec(MYTABLE, RecNo);
       if MYTABLE.Nachname = 'Maier'
               DelRec(MYTABLE, RecNo);
               if RecNo > LastRec(MYTABLE)
                       RecNo := 0
               end;
       else
               RecNo := NextRec(MYTABLE);
       end;
end;

Hier wird nur dann auf den nächsten Datensatz geschaltet, wenn der aktuelle Datensatz nicht gelöscht wurde. Dadurch wird im Falle des Löschens der an der Löschstelle eingesetzte Datensatz im folgenden Durchlauf der Schleife ebenfalls noch geprüft. Damit beim Löschen des letzten Datensatzes der Tabelle kein Fehler auftritt, wird RecNo nach dem Löschen auf 0 gesetzt, wenn das Ende der Tabelle erreicht ist.

Wesentlich einfacher und deshalb weniger fehleranfällig ist diese Variante:

MoveEnd(MYTABLE);
while ReadPrev(MYTABLE)
       if MYTABLE.Nachname = 'Maier'
               DelRec(MYTABLE);
       end;
end;

In dieser Variante löscht DelRec ohne Angabe der Satznummer den gerade aktuellen Datensatz der Tabelle. Das obige Problem mit den verschobenen Datensätzen, tritt hier gar nicht auf, weil die Tabelle rückwärts durchlaufen und keine physikalische Satznummer verwendet wird.

Wenn es darum geht, Datensätze zu löschen, die eine bestimmte Bedingung erfüllen, ist es effizienter, diese zuerst zu markieren und dann die markierten Datensätze zu löschen. Die beschriebenen Beispiele dienen nur zur Darstellung der Prinzipien. Sie werden auch dann interessant, wenn man keine Suchbedingung für die zu löschenden Datensätze angeben kann.

Siehe auch

Markierte Datensätze