scan-schleifen Stolperfalle

14/05/2008 - 21:44 von Olaf Doschke | Report spam
Hallo Leute,

Wenn man einen per ORDER sortierten Alias per SCAN-Schleife
durchlàuft und dabei Felder àndert, die im Index sind, nach dem
sortiert wird, durchlàuft man Datensàtze u.U. mehrfach oder
überspringt Sàtze. Dürfte manchem vielleicht schon passiert sein.

Hat man keine Sortierung, kann einem das auch passieren:

* Ausgangslage erzeugen
set multilocks on
create cursor curTest (cIrgendwas C(1))
cursorsetprop("Buffering",5,"curTest")
append blank
append blank
append blank
append blank

* ab dem 3. Record updaten
goto -3 && neue Datensàtze haben negative Recno(),
Scan Rest
Tableupdate(.f.,.t.)
Endscan

Intention ist eigentlich, daß nur die letzten zwei Records -3 und
-4 nach dem Scan nicht mehr als neu gelten, weil aber Recno -3
durch das Tableupdate(.f.,.t.) zu Recno 1 wird, springt der Da-
tensatzzeiger an den Anfang und letztendlich werden alle Records
durchlaufen.

Auf den nRows-Parameter von TableUpdate() bin ich schon
reingefallen.

Ich hab mir als Lösung nun ein 2-Pass-Verfahren überlegt, im 1.
Durchlauf merk' ich mir die Recno()s in einem Cursor, im 2. Durch-
lauf über diesen Cursor von Recordnummern springe ich im eigentlichen
Alias die gemerkten Recno()s an und mach den Tableupdate dann
Einzeldatensatzweise.

Geht's nicht eleganter? Tableupdate Rest ist sozusagen die Aufgabe.
Die Fieldstates der Datensàtze davor sollen unberührt bleiben.

Tschüß, Olaf.
 

Lesen sie die antworten

#1 Andreas Beger
15/05/2008 - 09:12 | Warnen spam
Hallo Olaf,

* ab dem 3. Record updaten
goto -3 && neue Datensàtze haben negative Recno(),
Scan Rest
Tableupdate(.f.,.t.)
Endscan
.
Geht's nicht eleganter? Tableupdate Rest ist sozusagen die Aufgabe.
Die Fieldstates der Datensàtze davor sollen unberührt bleiben.




Scan FOR RECNO()<=-3
Tableupdate(0,.t.)
Endscan


hth
Andreas

Ähnliche fragen