Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi abnormales paradox verhalten (https://www.delphipraxis.net/28073-abnormales-paradox-verhalten.html)

Nightfly 19. Aug 2004 12:05


abnormales paradox verhalten
 
es geht um folgenden code:

Delphi-Quellcode:
Table1.Active := false;
Table1.IndexName := '';
Table1.Active := true;
Table1.First;
repeat
if Table1Keep.Value = 1 then begin end
                           else Table1.Delete;
until Table1.FindNext = false;
Eigentlich sollte der aus meiner tabelle ja alle datensätze, in denen keep nicht i ist, löschen. Die datenbank hat ca. 25.000 Datensätze, übrig bleiben sollen 1388 (das weiß ich aus ner sql abfrage) nun, wenn ich diesen code einmal ausführe sind danach noch ca. 7000 datensätze vorhanden. durch mehrmaliges ausführen des codes komm ich auch irgendwan auf die 1388. aber warum? eigentlich sollte doch einmaliges ausführen reichen,oder?

Die Muhkuh 19. Aug 2004 12:15

Re: abnormales paradox verhalten
 
Hi,


hast du schonmal mit ner SQL-Abfrage versucht? Wenn ja, kommt da das gleiche raus?

UweR 19. Aug 2004 12:38

Re: abnormales paradox verhalten
 
Hallo,

1. Warum dieser Aufwand, das kann man doch sicher mit einer DELETE-Abfrage erschlagen. Z.B. mit
SQL-Code:
DELETE FROM Table1 WHERE KEEP <> 1
oder so ähnlich.

2. Ich glaube das Problem liegt darin das das Löschen von Datensätzen das FindNext etwas verwirrt und womöglich das folgende passiert:

Du findest einen zu löschenden Datensatz an Position 3 und löschst ihn. Die darüberliegenden Fallen alle Position runter. Wenn jetzt der ehemals vierte (jetzt dritte) auch zu löschen wäre wird der aber bei FindNext verschlabbert weil ja erst beim jetzigen vierten (ehemals fünf) wieder weitergesucht wird.

mikhal 19. Aug 2004 15:09

Re: abnormales paradox verhalten
 
Um deine Frage zu beantworten, warum deine Routine nicht funktioniert:

Paradox setzt den Datensatz-Zeiger automatisch auf den nächsten Datensatz, wenn du einen Datensatz löschst. Du weist aber auch nach einem Delete ein Next an, das bedeutet, daß du einen Datensatz ungeprüft überspringst.

Eine Mögliche Lösung wäre:

Code:
while not Table1.Eof do
  if Table1Keep.Value = 1 then
    Table1.Next
  else
    Table1.Delete;
Grüße
Mikhal


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:09 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz