17. August 2009 14:19
Cust.SETCURRENTKEY("Currency Code"); //damit alle Customer mit Currency Code='EUR' an einem Stück stehen
Cust.SETRANGE("Currency Code",'EUR');
Cust.MODIFYALL("Currency Code",'',TRUE);
Cust.SETCURRENTKEY("Currency Code");
Cust.SETRANGE("Currency Code",'EUR');
IF Cust.FIND('-') THEN
REPEAT
Cust."Currency Code." := '';
UNTIL Cust.NEXT = 0
17. August 2009 14:47
Hier besteht bei einigen NAV-Versionen die Gefahr, dass der OnModify-Trigger (entgegen dem gesetzten Parameter) nicht durchlaufen wird.dayscott hat geschrieben:
- Code:
Cust.SETCURRENTKEY("Currency Code"); //damit alle Customer mit Currency Code='EUR' an einem Stück stehen
Cust.SETRANGE("Currency Code",'EUR');
Cust.MODIFYALL("Currency Code",'',TRUE);
Immer dann, wenn du die Felder änderst, nach welchen du auch sortiert hast, besteht die Gefahr, dassdayscott hat geschrieben:Aber eigentlich müsste letzterer Code doch gut funktionieren, da das Rausrutschen aus dem Filter ja kein Problem darstellt oder?
- Code:
Cust.SETCURRENTKEY("Currency Code");
Cust.SETRANGE("Currency Code",'EUR');
IF Cust.FIND('-') THEN
REPEAT
Cust."Currency Code." := '';
UNTIL Cust.NEXT = 0
Cust.SETCURRENTKEY("Currency Code");
Cust.SETRANGE("Currency Code",'EUR');
IF Cust.FIND('-') THEN
REPEAT
Cust2 := Cust;
Cust2.VALIDATE("Currency Code.",'');
Cust2.MODIFY(TRUE);
UNTIL Cust.NEXT = 0
17. August 2009 14:55
Timo Lässer hat geschrieben:Hier besteht bei einigen NAV-Versionen die Gefahr, dass der OnValidate-Trigger (entgegen dem gesetzten Parameter) nicht durchlaufen wird.
17. August 2009 14:59
Natalie hat geschrieben:Timo Lässer hat geschrieben:Hier besteht bei einigen NAV-Versionen die Gefahr, dass der OnValidate-Trigger (entgegen dem gesetzten Parameter) nicht durchlaufen wird.
Du meintest sicherlich den OnModify-Trigger?
17. August 2009 15:42
Timo Lässer hat geschrieben:
- Code:
Cust.SETCURRENTKEY("Currency Code");
Cust.SETRANGE("Currency Code",'EUR');
IF Cust.FIND('-') THEN
REPEAT
Cust2 := Cust;
Cust2.VALIDATE("Currency Code.",'');
Cust2.MODIFY(TRUE);
UNTIL Cust.NEXT = 0
17. August 2009 15:53
mikka hat geschrieben:[...](Über das FIND('-') bzw. FINDSET gibt es ja nach wie vor Uneinigkeit!)
dayscott hat geschrieben:Meine Frage ist an keine NAV Version gebunden, [...]
17. August 2009 16:22
Timo Lässer hat geschrieben:Hier besteht bei einigen NAV-Versionen die Gefahr, dass der OnModify-Trigger (entgegen dem gesetzten Parameter) nicht durchlaufen wird.dayscott hat geschrieben:
- Code:
Cust.SETCURRENTKEY("Currency Code"); //damit alle Customer mit Currency Code='EUR' an einem Stück stehen
Cust.SETRANGE("Currency Code",'EUR');
Cust.MODIFYALL("Currency Code",'',TRUE);
.
Timo Lässer hat geschrieben:Immer dann, wenn du die Felder änderst, nach welchen du auch sortiert hast, besteht die Gefahr, dass
es zu einer Endlosschleife kommt
direkt nach dem ersten bearbeiteten Datensatz Schluß ist, da der "Cursor" an das Ende gerutscht ist
Timo Lässer hat geschrieben:Die einzige saubere und sichere Lösung, welche mir bekannt ist, währe, dass du die tatsächliche Datenänderung auf einer Record-Kopie durchführst:
- Code:
Cust.SETCURRENTKEY("Currency Code");
Cust.SETRANGE("Currency Code",'EUR');
IF Cust.FIND('-') THEN
REPEAT
Cust2 := Cust;
Cust2.VALIDATE("Currency Code.",'');
Cust2.MODIFY(TRUE);
UNTIL Cust.NEXT = 0
17. August 2009 19:49
Weil der Befehl MODIFYALL genau für diese Aufgaben vorgesehen ist.dayscott hat geschrieben:super Sache,... wieso wird dann in der Schulung genau das als Best Practise tituliert? -.-Timo Lässer hat geschrieben:Hier besteht bei einigen NAV-Versionen die Gefahr, dass der OnModify-Trigger (entgegen dem gesetzten Parameter) nicht durchlaufen wird.dayscott hat geschrieben:
- Code:
Cust.SETCURRENTKEY("Currency Code"); //damit alle Customer mit Currency Code='EUR' an einem Stück stehen
Cust.SETRANGE("Currency Code",'EUR');
Cust.MODIFYALL("Currency Code",'',TRUE);
Jetzt wird es kompliziert...dayscott hat geschrieben:Kann man näher begründen warum und wann genau diese unerwünschten Seiteneffekte passieren, falls sie denn passieren?Timo Lässer hat geschrieben:Immer dann, wenn du die Felder änderst, nach welchen du auch sortiert hast, besteht die Gefahr, dass
es zu einer Endlosschleife kommt
direkt nach dem ersten bearbeiteten Datensatz Schluß ist, da der "Cursor" an das Ende gerutscht ist
Wie ich schon weiter oben in diesem Beitrag geschrieben habe:dayscott hat geschrieben:Das ist dann das Best Practise für die Praxis?Timo Lässer hat geschrieben:Die einzige saubere und sichere Lösung, welche mir bekannt ist, währe, dass du die tatsächliche Datenänderung auf einer Record-Kopie durchführst:
- Code:
Cust.SETCURRENTKEY("Currency Code");
Cust.SETRANGE("Currency Code",'EUR');
IF Cust.FIND('-') THEN
REPEAT
Cust2 := Cust;
Cust2.VALIDATE("Currency Code.",'');
Cust2.MODIFY(TRUE);
UNTIL Cust.NEXT = 0
17. August 2009 20:52
18. August 2009 11:14
SilverX hat geschrieben:Die Nutzung von MODIFYALL() oder Loop-MODIFY() sollte nicht von einem Fehler in einer Version abhängig gemacht werden, sondern von der in der Dokumentation beschrieben Funktion dieser Befehle. Wenn es eine Version von NAV mit einem solchen Fehler gibt (...) dann MUSS diese auf jeden Fall ausgetauscht werden und darf in keinster Weise Einfluss auf die Programmierung haben!!
Änderst du nun im ersten Datensatz den Währungscode von EUR nach USD, so rutscht dieser Datensatz in der Sortierung weiter nach hinten.
(Wenn du gefiltert hast, dann sogar ausserhalb des Filters.)
Somit gibt es in der Sortierung keinen folgenden Datensatz mit Währungscode EUR, da wir mittlerweile bei USD angekommen sind.
18. August 2009 17:10
dayscott hat geschrieben:Was soll ausgetauscht werden? Also hats doch Einfluss auf die Programmierung ?
18. August 2009 17:39
Customer.SETCURRENTKEY("Currency Code");
Customer.SETRANGE("Currency Code", 'EUR');
IF Customer.FIND('-') THEN REPEAT
Customer."Currency Code" := 'WST';
Customer.MODIFY;
UNTIL Customer.NEXT = 0;
Customer.SETCURRENTKEY("Currency Code");
Customer.SETRANGE("Currency Code", 'EUR');
WHILE Customer.FIND('-') DO BEGIN
Customer."Currency Code" := 'WST';
Customer.MODIFY;
END;
19. August 2009 09:22
SilverX hat geschrieben:1. Würde der aktuelle Schlüssel der Primärschlüssel sein , dann hättest du keine Probleme , da der PK sich nicht verändert sondern nur der Währungscode.Sobald du aber per SETCURRENTKEY einen Schlüssel setzt deren Feldwert(e) du veränderst, kommt NAV spätestens beim nächsten NEXT aus der Spur.
....
2. Obiger Code beispielsweise funktioniert super, allerdings ist er schon sehr langsam. Hier wird immer ein neuer Datensatz gelesen der dem Filter entspricht ohne den Datensatzzeiger weiter zu bewegen.
19. August 2009 09:28
19. August 2009 13:12
//Customer.SETCURRENTKEY("Currency Code");
Customer.SETRANGE("Currency Code", 'EUR');
IF Customer.FIND('-') THEN REPEAT // braucht sehr lange weil das SETRANGE auf dem Server sehr lange "ausgeführt" wird.
Customer."Currency Code" := 'WST';
Customer.MODIFY;
UNTIL Customer.NEXT = 0
19. August 2009 13:44
Richtig, deshalb ruhig den optimalen Schlüssel für den Filter wählen und die tatsächliche Modifikation auf einer Record-Kopie durchführen.dayscott hat geschrieben:NAV braucht nur sehr lange [...] weil SETRANGE auf dem Server lange braucht um "realisiert" zu werden. D.h. die Suchtransaktion(FIND('-')) [...] wird durch die ungünstige Wahl des Schlüssels einfach lahm - richtig?
19. August 2009 14:34
14. September 2009 16:01
Cust.SETCURRENTKEY("Currency Code");
Cust.SETRANGE("Currency Code",'EUR');
IF Cust.FIND('-') THEN
REPEAT
Cust2 := Cust;
Cust2.VALIDATE("Currency Code.",'');
Cust2.MODIFY(TRUE);
UNTIL Cust.NEXT = 0
14. September 2009 16:26
whynot hat geschrieben:Hierzu mal eine Frage: der Originaldatensatz wird ja nur auf den zweiten Tablehandle kopiert, wahrscheinlich (hier fehlt mir leider viel Hintergrundwissen) mit allen internen Zeigern usw. Besteht dann nicht die Gefahr, daß der Originaldatensatz überschrieben wird, auch wenn man die Kopie speichert und man somit trotzdem in das Problem läuft, das eigentlich umgangen werden soll ?
Bisher hatte ich sowas immer damit gelöst, daß ich über den Primarykey eine Kopie geladen habe (Cust2.GET(Cust.<PrimaryKey>)). Das ist dann aber wohl, aus Performancesicht, ungünstig ?!