Discussion:
Delete und EOF
(zu alt für eine Antwort)
Günter Kieninger
2012-07-13 07:32:20 UTC
Permalink
Hallo!

Bis jetzt bin ich dem Irrglauben aufgesessen daß ein Delete automatisch
den nächsten Datensatz selektiert und auch richtig reagiert wenn man
auf dem letzten Datensatz steht.
Nur steht in der Hilfe eindeutig
Die Datenmenge wird neu synchronisiert. Dadurch wird der nächste >
Datensatz aktiviert, der nicht gelöscht wurde. Wenn der letzte >
Datensatz in der Datenmenge gelöscht wurde, wird der vorherige zum >
aktiven Datensatz.

Okay. Nur wie macht man dann am schönsten und richtig eine Schleife wie
folgt (mein jetziger, falscher, Ansatz:

Table1.First;
while not Table1.Eof do begin
if Table1.FieldByName('m').asString = '' then begin
Table1.Delete;
end
else begin
VerarbeiteDatensatz(Table1);
Table1.Next;
end;
end;

Wenn nun der letzte Datensatz gelöscht wird, dann wird der vorletzte
zweimal verarbeitet, weil der ja aktiviert wird.

Wie macht man das nun richtig, ohne viel Verrenkungen?

Gruß aus den Bergen
Günter
Georg Hübner
2012-07-13 08:10:39 UTC
Permalink
Hallo,
...
Post by Günter Kieninger
Table1.First;
while not Table1.Eof do begin
if Table1.FieldByName('m').asString = '' then begin
Table1.Delete;
end
else begin
VerarbeiteDatensatz(Table1);
Table1.Next;
end;
end;
Wenn nun der letzte Datensatz gelöscht wird, dann wird der vorletzte
zweimal verarbeitet, weil der ja aktiviert wird.
Wie macht man das nun richtig, ohne viel Verrenkungen?
...

ich würde in diesem Fall zwei Schleifen bauen.
Erst eine, die alles löscht was nicht gebraucht wird und dann
in einer zweiten danach die Datensatzverarbeitung.

Ist vielleicht nicht die optimalste Lösung, aber funktioniert.

Gruß

Georg Hübner
Günter Kieninger
2012-07-13 08:45:48 UTC
Permalink
Post by Georg Hübner
ich würde in diesem Fall zwei Schleifen bauen.
Erst eine, die alles löscht was nicht gebraucht wird und dann
in einer zweiten danach die Datensatzverarbeitung.
Ist vielleicht nicht die optimalste Lösung, aber funktioniert.
Ist auch meine derzeitige schnelle Lösung. Aber schön und elegant ist
das halt nicht.

Gruß aus den Bergen
Günter
Peter Lange
2012-07-13 16:19:26 UTC
Permalink
Am 13.07.2012 10:45, schrieb Günter Kieninger:

Hallo Günter,
Post by Günter Kieninger
Ist auch meine derzeitige schnelle Lösung. Aber schön und elegant ist
das halt nicht.
Offensichtlich arbeitest Du ja mit Dateitabellen (dBase, Paradox, o.ä).
Sicherlich nicht elegant, aber eine Möglichkeit wäre:

vor dem Delete/Verarbeiten ein Table.Next zu machen, auf EOF prüfen,
merken und dann wieder ein Table.Prior.

Eine Zweite Möglichkeit wäre mit RecordCount und RecNo zu arbeiten, was
ja bei dateibasierten DataSets ordentliche Werte liefert.

hth
Pe-elegantisteineSQLDatenbank-ter
Günter Kieninger
2012-07-16 07:07:16 UTC
Permalink
Post by Peter Lange
Offensichtlich arbeitest Du ja mit Dateitabellen (dBase, Paradox, o.ä).
Hier ist ne TkbmMemtable im Einsatz.
Post by Peter Lange
vor dem Delete/Verarbeiten ein Table.Next zu machen, auf EOF prüfen,
merken und dann wieder ein Table.Prior.
Eine Zweite Möglichkeit wäre mit RecordCount und RecNo zu arbeiten, was
ja bei dateibasierten DataSets ordentliche Werte liefert.
Da scheint mir die jetzige lösung besser zu sein ...


Gruß aus den Bergen
Günter
Joachim Duerr (ADS)
2012-07-13 22:08:12 UTC
Permalink
Post by Günter Kieninger
Table1.First;
while not Table1.Eof do begin
if Table1.FieldByName('m').asString = '' then begin
Table1.Delete;
end
else begin
VerarbeiteDatensatz(Table1);
Table1.Next;
end;
end;
query.sql.text:='delete from ['+table1.tablename+'] where m is null or
m=''''';
query.execsql;
Table1.First;
while not Table1.Eof do begin
VerarbeiteDatensatz(Table1);
Table1.Next;
end;
--
Joachim Duerr, Advantage Presales

ADS books available on http://pocketguide.jd-engineering.de
Günter Kieninger
2012-07-16 07:07:16 UTC
Permalink
Post by Joachim Duerr (ADS)
Post by Günter Kieninger
Table1.First;
while not Table1.Eof do begin
if Table1.FieldByName('m').asString = '' then begin
Table1.Delete;
end
else begin
VerarbeiteDatensatz(Table1);
Table1.Next;
end;
end;
query.sql.text:='delete from ['+table1.tablename+'] where m is null or
m=''''';
query.execsql;
Table1.First;
while not Table1.Eof do begin
VerarbeiteDatensatz(Table1);
Table1.Next;
end;
Es handelt sich hier um eine Mem-Table (TkbmMemTable), da bin ich so
vermutlich schneller.

Gruß aus den Bergen
Günter

Lesen Sie weiter auf narkive:
Loading...