Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Problem beim Löschen des letzten Datensatzes aus Query (https://www.delphipraxis.net/87971-problem-beim-loeschen-des-letzten-datensatzes-aus-query.html)

spuster 8. Mär 2007 09:56

Datenbank: Access • Version: 2003 • Zugriff über: ADO

Problem beim Löschen des letzten Datensatzes aus Query
 
Hallo zusammen,

hab ein Problem, wenn ich den letzten Datensatz aus einer Query mittels Delete löschen möchte. Letzter Datensatz heißt hier der letzte verbliebene Datensatz in der Query. Alle anderen Datensätze wurden vorher ohne Probleme gelöscht.

Die Fehlermeldung lautet:
"Entweder BOF oder EOF ist True, oder der aktuelle Datensatz wurde gelöscht. Der angeforderte Vorgang benötigt einen aktuellen Datensatz"

Hier mein vereinfachter Programm-Code:
Delphi-Quellcode:
Query_Picture.First;
while not Query_Picture.Eof do
begin
  Filename := Query_Picture.FieldByName('filename').AsString;
  if not FileExists(Filename) then
    Query_Picture.Delete        
  else
    Query_Picture.Next;
end;
Vielleicht hat habt Ihr ja einen Tip, warum es nicht funktioniert.

Gruß,
Ben

mkinzler 8. Mär 2007 11:32

Re: Problem beim Löschen des letzten Datensatzes aus Query
 
Wenn du auf dem letzten DS stehst ist EOF true

spuster 8. Mär 2007 11:54

Re: Problem beim Löschen des letzten Datensatzes aus Query
 
also kann ich den letzten Eintrag nur ausserhalb der While-Schleife löschen?

cruiser 8. Mär 2007 12:31

Re: Problem beim Löschen des letzten Datensatzes aus Query
 
Wandel die Schleife doch um...
Delphi-Quellcode:
{finde heraus ob es Einträge gibt und bau daraus ein if}
Query_Picture.First;
repeat
  Filename := Query_Picture.FieldByName('filename').AsString;
  if not FileExists(Filename) then
    Query_Picture.Delete        
  else
    Query_Picture.Next;
until Query_Picture.Eof;
{ende vom if}

spuster 8. Mär 2007 13:47

Re: Problem beim Löschen des letzten Datensatzes aus Query
 
Danke. Werde das ausprobieren.

Ben

spuster 9. Mär 2007 12:08

Re: Problem beim Löschen des letzten Datensatzes aus Query
 
Leider läßt sich das Problem so auch nicht lösen.
Ich glaube es liegt daran, das Delete nach dem Löschen auf den nächsten Datensatz springen möchte. Genau das ist aber nicht möglich, da ja vorher schon alle anderen Datensätze gelöscht wurden.

Bin jetzt ziemlich ratlos.. :?:

shmia 9. Mär 2007 12:45

Re: Problem beim Löschen des letzten Datensatzes aus Query
 
Zitat:

Zitat von spuster
Die Fehlermeldung lautet:
"Entweder BOF oder EOF ist True, oder der aktuelle Datensatz wurde gelöscht. Der angeforderte Vorgang benötigt einen aktuellen Datensatz"

Die Fehlermeldung erinnert mich an einen Bug von Delphi 5.
Man musste das ADO Update #2 einspielen, um den Bug zu fixen.

Hast du zufällig ein Eveenthandler (z.B. AfterScroll) angekoppelt oder ein DBGrid mit eigener OnDrawColumnCell ?

spuster 9. Mär 2007 13:05

Re: Problem beim Löschen des letzten Datensatzes aus Query
 
Nein, hab ich nicht.
Warum?

shmia 9. Mär 2007 14:33

Re: Problem beim Löschen des letzten Datensatzes aus Query
 
Zitat:

Zitat von spuster
Nein, hab ich nicht. Warum?

Weil das natürlich zu einem Fehler führen würde, falls man nicht innerhalb dieser Eventhandler speziell die Bedingung Dataset.Eof abprüft.
Also muss man jetzt von einem Bug innerhalb der VCL ausgehen.

spuster 9. Mär 2007 14:42

Re: Problem beim Löschen des letzten Datensatzes aus Query
 
Ok. Danke. Werde mal sehen wie weit ich mit einem Update komme.

hoika 9. Mär 2007 15:01

Re: Problem beim Löschen des letzten Datensatzes aus Query
 
Hallo,

sicher, dass der Fehler nicht beim Next kommt ?.

Du könntest einen Zähler mitlaufen lassen
(vorher die Anzahl der Einträge in der Query z.B. mit
select count(*) oder RecordCount ermitteln).

vor dem while-end dann die Prüfung
if Counter=MaxCount then break;


Heiko

Catbytes 9. Mär 2007 15:06

Re: Problem beim Löschen des letzten Datensatzes aus Query
 
Und so?

Delphi-Quellcode:
Query_Picture.First;
while not Query_Picture.Eof do
begin
  Filename := Query_Picture.FieldByName('filename').AsString;
  if not FileExists(Filename) then
    Query_Picture.Delete        
  else
   if not Query_Picture.Eof then // <--- Aenderung
    Query_Picture.Next;
end;
Grad so aus dem Kopf - ungetestet...

spuster 9. Mär 2007 15:25

Re: Problem beim Löschen des letzten Datensatzes aus Query
 
Zitat:

Zitat von hoika
Hallo,

sicher, dass der Fehler nicht beim Next kommt ?.

Du könntest einen Zähler mitlaufen lassen
(vorher die Anzahl der Einträge in der Query z.B. mit
select count(*) oder RecordCount ermitteln).

vor dem while-end dann die Prüfung
if Counter=MaxCount then break;


Heiko

Ja, habs ausprobiert und der Fehler tritt definitiv bei Delete auf und zwar dann, wenn nur noch ein Record da ist.

Das mit MaxCount werde ich mal testen. Danke!

spuster 9. Mär 2007 15:31

Re: Problem beim Löschen des letzten Datensatzes aus Query
 
Zitat:

Zitat von Catbytes
Und so?

Delphi-Quellcode:
Query_Picture.First;
while not Query_Picture.Eof do
begin
  Filename := Query_Picture.FieldByName('filename').AsString;
  if not FileExists(Filename) then
    Query_Picture.Delete        
  else
   if not Query_Picture.Eof then // <--- Aenderung
    Query_Picture.Next;
end;
Grad so aus dem Kopf - ungetestet...

Gleiche Problem wie beim Beitrag davor...
Nach Delete ist leider schon Schluß, so dass die nächste Abfrage nicht mehr zur Geltung kommt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:17 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