[Gelöst] REPEAT..UNTIL Schleife statt MODIFYALL - Risiken?

Bild Microsoft Dynamics NAV 5.xx

[Gelöst] REPEAT..UNTIL Schleife statt MODIFYALL - Risiken?

Beitragvon dayscott » 17. August 2009 14:19

Meine Frage ist an keine NAV Version gebunden, deswegen bitte verschiebene falls es hier unpassend ist.

Code: Alles auswÀhlen
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);


Mir geht es darum wie "SprĂŒnge" in der Sortierung passieren können, wenn ich statt MODIFYALL folgenden Code nutze:

Code: Alles auswÀhlen
Cust.SETCURRENTKEY("Currency Code");
Cust.SETRANGE("Currency Code",'EUR');
IF Cust.FIND('-') THEN
REPEAT
Cust."Currency Code." := '';
UNTIL Cust.NEXT = 0


Unser Trainer beim Developer I (impuls) hat gesagt, dass hier die Zeilen aus der Abgrenzung "rutschen" können und dadurch Fehler entstehen können. Wie das passieren kann ist mir nicht ganz klar. An dieser Stelle hat er auch erwĂ€hnt, dass NAV keine Cursor kennt, wie andere Datenbanken. NAV schaut sich stehts zuerst den Currentkey an und danach den PK um "von einem Datensatz zum nĂ€chsten" zu kommen. Aber eigentlich mĂŒsste letzterer Code doch gut funktionieren, da das Rausrutschen aus dem Filter ja kein Problem darstellt oder?
Zuletzt geÀndert von dayscott am 20. August 2009 12:31, insgesamt 1-mal geÀndert.
dayscott
 
BeitrÀge: 61
Registriert: 12. MĂ€rz 2009 22:27
Arbeitsort: MĂŒnchen
Bezug zu Microsoft Dynamics: SchĂŒler / Student
Microsoft Dynamics Produkt: Microsoft Dynamics NAV
Microsoft Dynamics Version: 5.0

Re: REPEAT..UNTIL Schleife statt MODIFYALL - Risiken?

Beitragvon Timo LĂ€sser » 17. August 2009 14:47

dayscott hat geschrieben:
Code: Alles auswÀhlen
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);
Hier besteht bei einigen NAV-Versionen die Gefahr, dass der OnModify-Trigger (entgegen dem gesetzten Parameter) nicht durchlaufen wird.

dayscott hat geschrieben:
Code: Alles auswÀhlen
Cust.SETCURRENTKEY("Currency Code");
Cust.SETRANGE("Currency Code",'EUR');
IF Cust.FIND('-') THEN
REPEAT
  Cust."Currency Code." := '';
UNTIL Cust.NEXT = 0
Aber eigentlich mĂŒsste letzterer Code doch gut funktionieren, da das Rausrutschen aus dem Filter ja kein Problem darstellt oder?
Immer dann, wenn du die Felder Ànderst, nach welchen du auch sortiert hast, besteht die Gefahr, dass
  1. es zu einer Endlosschleife kommt
  2. direkt nach dem ersten bearbeiteten Datensatz Schluß ist, da der "Cursor" an das Ende gerutscht ist
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: Alles auswÀhlen
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
Kleine Anmerkung: Man sollte immer mit VALIDATE und MODIFY(TRUE) arbeiten, es sei denn, man weiß ganz genau, was man macht und welche Auswirkungen es hat.
Gruß, Timo LĂ€sser

Frage beantwortet? Schreibe bitte "[Gelöst]" vor den Titel deines ersten Beitrags.
Bitte erst suchen, dann fragen. Bitte beachte den kleinen Community-Knigge.
Kein Support per PN, E-Mail, Instant Messanger, Soziale Netzwerke, Telefon oder Fax! DafĂŒr ist dieses Forum da.
Hier kannst du fĂŒr MSDynamics.de spenden.
Benutzeravatar
Timo LĂ€sser
Administrator
Administrator
 
BeitrÀge: 5357
Registriert: 14. November 2004 22:18
Wohnort: DE 49716 Meppen
Arbeitsort: DE 49733 Haren (Ems)
Bezug zu Microsoft Dynamics: End-Anwender
Microsoft Dynamics Produkt: Microsoft Dynamics NAV
Microsoft Dynamics Version: 1.10a - 2018, BC14

Re: REPEAT..UNTIL Schleife statt MODIFYALL - Risiken?

Beitragvon Natalie » 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.

Du meintest sicherlich den OnModify-Trigger?
Gruß, Natalie

Frage beantwortet oder Problem von allein gelöst? Schreibe bitte [Gelöst] vor den Titel des ersten Beitrags.

Bitte erst suchen, dann fragen. Bitte beachte den kleinen Community-Knigge.
Kein Support per PN, Mail, IM oder Telefon! DafĂŒr ist dieses Forum da.
Benutzeravatar
Natalie
Moderator
Moderator
 
BeitrÀge: 9318
Registriert: 31. Oktober 2006 19:51
Bezug zu Microsoft Dynamics: Microsoft Partner
Microsoft Dynamics Produkt: Microsoft Dynamics NAV

Re: REPEAT..UNTIL Schleife statt MODIFYALL - Risiken?

Beitragvon Timo LĂ€sser » 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?

:oops: Ähh, ja - sorry :roll:
Habe es korrigiert.
Gruß, Timo LĂ€sser

Frage beantwortet? Schreibe bitte "[Gelöst]" vor den Titel deines ersten Beitrags.
Bitte erst suchen, dann fragen. Bitte beachte den kleinen Community-Knigge.
Kein Support per PN, E-Mail, Instant Messanger, Soziale Netzwerke, Telefon oder Fax! DafĂŒr ist dieses Forum da.
Hier kannst du fĂŒr MSDynamics.de spenden.
Benutzeravatar
Timo LĂ€sser
Administrator
Administrator
 
BeitrÀge: 5357
Registriert: 14. November 2004 22:18
Wohnort: DE 49716 Meppen
Arbeitsort: DE 49733 Haren (Ems)
Bezug zu Microsoft Dynamics: End-Anwender
Microsoft Dynamics Produkt: Microsoft Dynamics NAV
Microsoft Dynamics Version: 1.10a - 2018, BC14

Re: REPEAT..UNTIL Schleife statt MODIFYALL - Risiken?

Beitragvon mikka » 17. August 2009 15:42

Timo LĂ€sser hat geschrieben:
Code: Alles auswÀhlen
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


Hinzu kommt, das dieses der bessere Code (aus Performace Sicht )fĂŒr einen SQL-Server ist. (Über das FIND('-') bzw. FINDSET gibt es ja nach wie vor Uneinigkeit!)
Gruß, Mikka

Frage beantwortet? Schreibe bitte [Gelöst] vor den Titel des ersten Beitrags.
Bitte erst suchen, dann fragen. Bitte beachte den kleinen Community-Knigge.
Kein Support per PN, Mail, IM oder Telefon! DafĂŒr ist dieses Forum da.
Benutzeravatar
mikka
Microsoft Partner
Microsoft Partner
 
BeitrÀge: 1832
Registriert: 26. September 2005 11:54
Wohnort: Bremen
Realer Name: Michael
Bezug zu Microsoft Dynamics: Microsoft Partner
Microsoft Dynamics Produkt: Microsoft Dynamics NAV
Microsoft Dynamics Version: 2.6, 3.7, 4, 5, 2009/13/15

Re: REPEAT..UNTIL Schleife statt MODIFYALL - Risiken?

Beitragvon Timo LĂ€sser » 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, [...]

Aus diesem Grund habe ich das FIND('-') mal so stehen gelassen.
Klar, ab NAV 4.0 SP1 auf SQL-Server sollte man aus Performance GrĂŒnden FINDSET(TRUE) verwenden.
Gruß, Timo LĂ€sser

Frage beantwortet? Schreibe bitte "[Gelöst]" vor den Titel deines ersten Beitrags.
Bitte erst suchen, dann fragen. Bitte beachte den kleinen Community-Knigge.
Kein Support per PN, E-Mail, Instant Messanger, Soziale Netzwerke, Telefon oder Fax! DafĂŒr ist dieses Forum da.
Hier kannst du fĂŒr MSDynamics.de spenden.
Benutzeravatar
Timo LĂ€sser
Administrator
Administrator
 
BeitrÀge: 5357
Registriert: 14. November 2004 22:18
Wohnort: DE 49716 Meppen
Arbeitsort: DE 49733 Haren (Ems)
Bezug zu Microsoft Dynamics: End-Anwender
Microsoft Dynamics Produkt: Microsoft Dynamics NAV
Microsoft Dynamics Version: 1.10a - 2018, BC14

Re: REPEAT..UNTIL Schleife statt MODIFYALL - Risiken?

Beitragvon dayscott » 17. August 2009 16:22

Timo LĂ€sser hat geschrieben:
dayscott hat geschrieben:
Code: Alles auswÀhlen
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);
Hier besteht bei einigen NAV-Versionen die Gefahr, dass der OnModify-Trigger (entgegen dem gesetzten Parameter) nicht durchlaufen wird.
.

super Sache,... wieso wird dann in der Schulung genau das als Best Practise tituliert? -.-

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


Kann man nĂ€her begrĂŒnden warum und wann genau diese unerwĂŒnschten Seiteneffekte passieren, falls sie denn passieren?

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: Alles auswÀhlen
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



Das ist dann das Best Practise fĂŒr die Praxis?
dayscott
 
BeitrÀge: 61
Registriert: 12. MĂ€rz 2009 22:27
Arbeitsort: MĂŒnchen
Bezug zu Microsoft Dynamics: SchĂŒler / Student
Microsoft Dynamics Produkt: Microsoft Dynamics NAV
Microsoft Dynamics Version: 5.0

Re: REPEAT..UNTIL Schleife statt MODIFYALL - Risiken?

Beitragvon Timo LĂ€sser » 17. August 2009 19:49

dayscott hat geschrieben:
Timo LĂ€sser hat geschrieben:
dayscott hat geschrieben:
Code: Alles auswÀhlen
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);
Hier besteht bei einigen NAV-Versionen die Gefahr, dass der OnModify-Trigger (entgegen dem gesetzten Parameter) nicht durchlaufen wird.
super Sache,... wieso wird dann in der Schulung genau das als Best Practise tituliert? -.-
Weil der Befehl MODIFYALL genau fĂŒr diese Aufgaben vorgesehen ist.
Sofern man ohne den OnModify-Trigger auskommt (situationsabhÀngig!!!), ist es auch in der Praxis die eleganteste Art.
Leider gibt es jedoch NAV-Versionen, bei denen die AusfĂŒhrung des OnModify-Triggers nicht angestossen wird (leider weiß ich nicht auswendig, welche Versionen dies konkret sind).

dayscott hat geschrieben:
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
Kann man nĂ€her begrĂŒnden warum und wann genau diese unerwĂŒnschten Seiteneffekte passieren, falls sie denn passieren?
Jetzt wird es kompliziert...
Nehmen wir das Beispiel mit dem WĂ€hrungscode:
Du sortierst danach, somit stehen die DatensĂ€tze nach WĂ€hrungscode aufsteigend zur VerfĂŒgung.
Ä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.

dayscott hat geschrieben:
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: Alles auswÀhlen
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
Das ist dann das Best Practise fĂŒr die Praxis?
Wie ich schon weiter oben in diesem Beitrag geschrieben habe:
Ja, wenn du den OnModify-Trigger ausfĂŒhren lassen willst.
Muss der OnModify-Trigger nicht ausgefĂŒhrt werden, so kannst du bedenkenlos MODIFYALL verwenden.
Gruß, Timo LĂ€sser

Frage beantwortet? Schreibe bitte "[Gelöst]" vor den Titel deines ersten Beitrags.
Bitte erst suchen, dann fragen. Bitte beachte den kleinen Community-Knigge.
Kein Support per PN, E-Mail, Instant Messanger, Soziale Netzwerke, Telefon oder Fax! DafĂŒr ist dieses Forum da.
Hier kannst du fĂŒr MSDynamics.de spenden.
Benutzeravatar
Timo LĂ€sser
Administrator
Administrator
 
BeitrÀge: 5357
Registriert: 14. November 2004 22:18
Wohnort: DE 49716 Meppen
Arbeitsort: DE 49733 Haren (Ems)
Bezug zu Microsoft Dynamics: End-Anwender
Microsoft Dynamics Produkt: Microsoft Dynamics NAV
Microsoft Dynamics Version: 1.10a - 2018, BC14

Re: REPEAT..UNTIL Schleife statt MODIFYALL - Risiken?

Beitragvon SilverX » 17. August 2009 20:52

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 (entzieht sich derzeit meiner Kenntnis), dann MUSS diese auf jeden Fall ausgetauscht werden und darf in keinster Weise Einfluss auf die Programmierung haben!!

Die einzige BegrĂŒndung die fĂŒr die Entscheidung ob nun Loop-MODIFY() oder MODIFYALL() genutzt wird, sollte das Ergebnis der folgenden Tests und die Menge an Daten sein, die im speziellen oder allgemein in einem solchen Vorgang bearbeitet wird: What impact does my C/AL have on SQL - MODIFYALL/DELETEALL.
Cheers
Carsten


This post is my own opinion and does not necessarily reflect the opinion or view of my employer.
SilverX
Microsoft Partner
Microsoft Partner
 
BeitrÀge: 1258
Registriert: 16. September 2006 14:07
Realer Name: Carsten Scholling
Arbeitsort: GĂŒtersloh
Bezug zu Microsoft Dynamics: Microsoft Partner
Microsoft Dynamics Produkt: Microsoft Dynamics NAV
Microsoft Dynamics Version: 2013+

Re: REPEAT..UNTIL Schleife statt MODIFYALL - Risiken?

Beitragvon dayscott » 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!!


Was soll ausgetauscht werden? Also hats doch Einfluss auf die Programmierung ?

@Timo
Ä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.


Es gibt ja schon noch zahlreiche Records mit WĂ€hrungscode EUR, und mein SETRANGE ist doch immernoch gĂŒltig, wieso stehe ich also auf einmal in USD? In NAV Tabellen gibts doch keine Cursor ! : /
Mein Problem ist wohl das ich den Befehl .NEXT nicht ganz durschaut habe, die Online Hilfe hat mir auch nicht weitergeholfen.
dayscott
 
BeitrÀge: 61
Registriert: 12. MĂ€rz 2009 22:27
Arbeitsort: MĂŒnchen
Bezug zu Microsoft Dynamics: SchĂŒler / Student
Microsoft Dynamics Produkt: Microsoft Dynamics NAV
Microsoft Dynamics Version: 5.0

Re: REPEAT..UNTIL Schleife statt MODIFYALL - Risiken?

Beitragvon SilverX » 18. August 2009 17:10

dayscott hat geschrieben:Was soll ausgetauscht werden? Also hats doch Einfluss auf die Programmierung ?


Nein, es sollte keinen Einfluss haben! Ich meinte folgendes: MODIFYALL() ist folgendermaßen definiert:

Record.MODIFYALL(Field, NewValue [, RunTrigger])

Was bedeutet, dass beim Setzen des dritten Parameters auf TRUE der OnModify() Trigger ausgefĂŒhrt wird! Wenn das aufgrund eines Fehlers in der fin.exe oder finsql.exe nicht passiert, dann ist es nicht sinnvoll, deswegen MODIFY zu verwenden (um einen Fehler des Programms zu umgehen), sondern es sollte auf jeden Fall ein entsprechender NAV Hotfix oder eine neue Version eingespielt werden, so dass die Applikation wie in der Dokumentation beschrieben funktioniert.
Cheers
Carsten


This post is my own opinion and does not necessarily reflect the opinion or view of my employer.
SilverX
Microsoft Partner
Microsoft Partner
 
BeitrÀge: 1258
Registriert: 16. September 2006 14:07
Realer Name: Carsten Scholling
Arbeitsort: GĂŒtersloh
Bezug zu Microsoft Dynamics: Microsoft Partner
Microsoft Dynamics Produkt: Microsoft Dynamics NAV
Microsoft Dynamics Version: 2013+

Re: REPEAT..UNTIL Schleife statt MODIFYALL - Risiken?

Beitragvon SilverX » 18. August 2009 17:39

Ein Beispiel fĂŒr die Fehlfunktion bei Nutzung der gleichen Record Instanz bei Änderungen. Nimm folgenden Code an, wobei Debitor 10000 und 20000 auf EUR gesetzt wurden. Der Ersatzwert WST ist bisher in keinem Debitor verwendet:

Code: Alles auswÀhlen
Customer.SETCURRENTKEY("Currency Code");
Customer.SETRANGE("Currency Code", 'EUR');

IF Customer.FIND('-') THEN REPEAT
 
  Customer."Currency Code" := 'WST';
  Customer.MODIFY;

UNTIL Customer.NEXT = 0;


Erster Durchlauf: 10000, EUR -> WST. Da der Wert des aktuellen SchlĂŒssels "Currency Code" erst EUR, nach Änderung dann WST. Aktueller Datensatz ist damit dann auch WST, also außerhalb von EUR. Damit kann als nĂ€chster Datensatz (NEXT) kein EUR mehr kommen und die Schleife wird nach dem ersten Durchlauf bereits verlassen ohne den zweiten EUR Datensatz anzufassen.

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.

Code: Alles auswÀhlen
Customer.SETCURRENTKEY("Currency Code");
Customer.SETRANGE("Currency Code", 'EUR');

WHILE Customer.FIND('-') DO BEGIN
  Customer."Currency Code" := 'WST';
  Customer.MODIFY;
END;

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. Also immer der erste zutreffende.

Ich hoffe das ist einigermaßen verstĂ€ndlich...
Cheers
Carsten


This post is my own opinion and does not necessarily reflect the opinion or view of my employer.
SilverX
Microsoft Partner
Microsoft Partner
 
BeitrÀge: 1258
Registriert: 16. September 2006 14:07
Realer Name: Carsten Scholling
Arbeitsort: GĂŒtersloh
Bezug zu Microsoft Dynamics: Microsoft Partner
Microsoft Dynamics Produkt: Microsoft Dynamics NAV
Microsoft Dynamics Version: 2013+

Re: REPEAT..UNTIL Schleife statt MODIFYALL - Risiken?

Beitragvon dayscott » 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.


1. Also ich stell mir die DatensÀtze bildlich vor: zb beim Ordnen nach WÀhrungscode stehen Euros im Block, die Wst im Block etc. Die Blöcke werden alphabetisch sortiert. Die Sortierung innerhalb der Blöcke erfolg nach PK.

Das Gedankenspiel: "wenn du nach PK sortieren wĂŒrdest" ergibt doch keinen Sinn . Wie will ich die Records iterativ durchgehen und alle Euros durch Wst ersetzen wenn meine Records nach PK (stellen wir uns hierfĂŒhr eine eindeutige ID vor) sortiert sind?

2. Es gibt keine "Datensatzzeiger" in NAV hat unser Trainer gesagt X (
dayscott
 
BeitrÀge: 61
Registriert: 12. MĂ€rz 2009 22:27
Arbeitsort: MĂŒnchen
Bezug zu Microsoft Dynamics: SchĂŒler / Student
Microsoft Dynamics Produkt: Microsoft Dynamics NAV
Microsoft Dynamics Version: 5.0

Re: REPEAT..UNTIL Schleife statt MODIFYALL - Risiken?

Beitragvon SilverX » 19. August 2009 09:28

NatĂŒrlich "gibt das Sinn", denn ohne den SETCURRENTKEY("Currency Code") lĂ€uft dieses Beispiel Problemlos.
Cheers
Carsten


This post is my own opinion and does not necessarily reflect the opinion or view of my employer.
SilverX
Microsoft Partner
Microsoft Partner
 
BeitrÀge: 1258
Registriert: 16. September 2006 14:07
Realer Name: Carsten Scholling
Arbeitsort: GĂŒtersloh
Bezug zu Microsoft Dynamics: Microsoft Partner
Microsoft Dynamics Produkt: Microsoft Dynamics NAV
Microsoft Dynamics Version: 2013+

Re: REPEAT..UNTIL Schleife statt MODIFYALL - Risiken?

Beitragvon dayscott » 19. August 2009 13:12

ouh - Noob-Fehler, hast natĂŒrlich recht.

NAV braucht nur sehr lange (fĂŒr den nachstehenden Code) weil SETRANGE auf dem Server lange braucht um "realisiert" zu werden. D.h. die Suchtransaktion(FIND('-')) [bzw was ist der Oberbegriff fĂŒr FIND/GET...?] wird durch die ungĂŒnstige Wahl des SchlĂŒssels einfach lahm - richtig?

Code: Alles auswÀhlen
//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
dayscott
 
BeitrÀge: 61
Registriert: 12. MĂ€rz 2009 22:27
Arbeitsort: MĂŒnchen
Bezug zu Microsoft Dynamics: SchĂŒler / Student
Microsoft Dynamics Produkt: Microsoft Dynamics NAV
Microsoft Dynamics Version: 5.0

Re: REPEAT..UNTIL Schleife statt MODIFYALL - Risiken?

Beitragvon Timo LĂ€sser » 19. August 2009 13:44

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?
Richtig, deshalb ruhig den optimalen SchlĂŒssel fĂŒr den Filter wĂ€hlen und die tatsĂ€chliche Modifikation auf einer Record-Kopie durchfĂŒhren.
Somit hast du die beste Performance und deine Sortierung kommt nicht durcheinander.
Gruß, Timo LĂ€sser

Frage beantwortet? Schreibe bitte "[Gelöst]" vor den Titel deines ersten Beitrags.
Bitte erst suchen, dann fragen. Bitte beachte den kleinen Community-Knigge.
Kein Support per PN, E-Mail, Instant Messanger, Soziale Netzwerke, Telefon oder Fax! DafĂŒr ist dieses Forum da.
Hier kannst du fĂŒr MSDynamics.de spenden.
Benutzeravatar
Timo LĂ€sser
Administrator
Administrator
 
BeitrÀge: 5357
Registriert: 14. November 2004 22:18
Wohnort: DE 49716 Meppen
Arbeitsort: DE 49733 Haren (Ems)
Bezug zu Microsoft Dynamics: End-Anwender
Microsoft Dynamics Produkt: Microsoft Dynamics NAV
Microsoft Dynamics Version: 1.10a - 2018, BC14

Re: REPEAT..UNTIL Schleife statt MODIFYALL - Risiken?

Beitragvon fiddi » 19. August 2009 14:34

Hallo dayscott,

das grĂ¶ĂŸte Problem bei deiner Aktion ist, das du das Feld Ă€ndern willst auf das du filterst. Wer schon mal in NAV mit STRG-H (Suchen u. Ersetzen) ein gefiltertes Feld bearbeitet hat, wird wissen das i.d.R. nur jedes dritte Feld umbenannt wird :!: :?: (zumindest in der Native-DB).
Deshalb kann ich nur Timos Lösung mit dem 2. Record empfehlen, da diese Lösung auch jeden Record erwischt.

Gruß, Fiddi
Wer aufhört besser zu werden, hat aufgehört gut zu sein. (frei nach Philip Rosenthal)
Frage beantwortet? Schreibe bitte [Gelöst] vor den Titel des ersten Beitrags.
Bitte erst suchen, dann fragen. Bitte beachte den kleinen Community-Knigge.
Kein Support per PN, Mail, IM oder Telefon! DafĂŒr ist dieses Forum da.
fiddi
Moderator
Moderator
 
BeitrÀge: 7486
Registriert: 9. Juni 2008 10:13
Realer Name: Hans Heinrich Fiddelke
Arbeitsort: Bremen
Bezug zu Microsoft Dynamics: Microsoft Partner
Microsoft Dynamics Produkt: Microsoft Dynamics NAV
Microsoft Dynamics Version: NAV2.6-aktuell

Re: [Gelöst] REPEAT..UNTIL Schleife statt MODIFYALL - Risiken?

Beitragvon whynot » 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

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 ?!
whynot
 
BeitrÀge: 2
Registriert: 10. Februar 2009 12:19
Wohnort: Wiesbaden
Realer Name: Stefan Weinreich
Arbeitsort: Mannheim
Bezug zu Microsoft Dynamics: End-Anwender
Microsoft Dynamics Produkt: Microsoft Dynamics NAV
Microsoft Dynamics Version: 2013 R2

Re: [Gelöst] REPEAT..UNTIL Schleife statt MODIFYALL - Risiken?

Beitragvon mikka » 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 ?!


ZunÀchst ein "Herzlich Willkommen" auch an dich :-)

Zur ersten Frage:
Dieses Konstrukt soll den Linearen Zugriff (ich nenne es mal so) nicht zerstören, da dieses PerformaceeinbrĂŒche mit sich bringen kann.
Da es auf den Datensatz des ersten Tablehandle kein MODIFY gibt, wird dieser auch nicht verÀndert.
-->Oder habe ich Deine Frage Missverstanden?

Zur zweiten:
Ich sehe kein Problem darin, ein GET zu benutzen. Ist doch eine der schnellsten Varianten einen DS zu holen, um diesen (einzelnen) zu editieren .
Gruß, Mikka

Frage beantwortet? Schreibe bitte [Gelöst] vor den Titel des ersten Beitrags.
Bitte erst suchen, dann fragen. Bitte beachte den kleinen Community-Knigge.
Kein Support per PN, Mail, IM oder Telefon! DafĂŒr ist dieses Forum da.
Benutzeravatar
mikka
Microsoft Partner
Microsoft Partner
 
BeitrÀge: 1832
Registriert: 26. September 2005 11:54
Wohnort: Bremen
Realer Name: Michael
Bezug zu Microsoft Dynamics: Microsoft Partner
Microsoft Dynamics Produkt: Microsoft Dynamics NAV
Microsoft Dynamics Version: 2.6, 3.7, 4, 5, 2009/13/15


ZurĂŒck zu NAV 5.xx

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 0 GĂ€ste