[Gelöst] Endlosschleife beim Repeat...Until mit Findest

20. August 2017 16:35

Hallo zusammen,

derzeit schreibe ich für einen Kunden eine Funktion in der ich eine bereits gelieferte Verkaufszeile eines Auftrags mit einer neuen Zeile mit negativer Menge zum Teil ausbuchen möchte.
Das soll genutzt werden um Ware die bei der Lieferung beschädigt wurde ausbuchen zu können.

Allerdings laufe ich in eine Endlosschleife, da NAV die Zeilen findet die ich gerade erst angelegt habe.
Das ist doch normalerweise nicht so. Ich benutze doch auch extra eine zweite Variable der Sales Line.

Hat einer von euch eine Idee woran es liegen könnte?

Vielen lieben Dank schon im Voraus für eure Hilfe. :)

Hier noch der Code:
Code:
CLEAR(ToSalesLine);
FromSalesLine.SETRANGE("Document Type",FromSalesHeader."Document Type");
FromSalesLine.SETRANGE("Document No.",FromSalesHeader."No.");
FromSalesLine.SETFILTER("Attached to Order Line No.",'<>%1',0);
IF FromSalesLine.FIND('-') THEN BEGIN
     REPEAT
           ToSalesLine.INIT;
           ToSalesLine.COPY(FromSalesLine);
           ToSalesLine.VALIDATE("Line No.",GetNextLineNo(FromSalesLine));
           ToSalesLine.INSERT;
     UNTIL FromSalesLine.NEXT = 0;
Zuletzt geändert von Navlex am 21. August 2017 11:46, insgesamt 1-mal geändert.

Re: Endlosschleife beim Repeat...Until mit Findest

21. August 2017 08:03

Was macht denn die Funktion GetNextLineNo mit FromSalesLine?

Re: Endlosschleife beim Repeat...Until mit Findest

21. August 2017 08:25

Navlex hat geschrieben:Allerdings laufe ich in eine Endlosschleife, da NAV die Zeilen findet die ich gerade erst angelegt habe.

Den Grund für dein Problem nennst du ja schon selber. Du musst die Schleife so mit Filtern o.ä. versorgen, dass genau das nicht passieren kann.
Das ist doch normalerweise nicht so. Ich benutze doch auch extra eine zweite Variable der Sales Line.

Ob dein FromSalesLine.NEXT den gerade erst angelegten Datensatz findet, hat nichts mit extra Variablen zu tun, sondenr mit gesetzten Filtern. NEXT zieht seine Daten nicht aus einem eingefrorenen DataSet, sondern live aus der Datenbank.

Ein Ansatz: Lade die zuerst vorhandenen FromSalesLines in eine temporäre Recordvariable, und durchlaufe diese statt FromSalesLines direkt, um ToSalesLines zu füllen.
Alternativ setze einen Filter auf FromSalesLines: Line No. muss gefiltert sein auf <= den ursprünglich größten vorhandenen Wert.

Re: Endlosschleife beim Repeat...Until mit Findest

21. August 2017 09:12

Hallo,

ich denke Natalie hat mit Ihrem Ansatz recht.

Eine weitere Lösungsmöglichkeit für dein Problem, wäre statt des FINDSET ein FINDLAST zu verwenden, und FromSalesLine.NEXT mit FromSalesLine.NEXT(-1) aufzurufen.

Der Rest müsste eigentlich so funktionieren wie gehabt, wenn GetNextLineNo SalesLine nicht als VAR- Parameter übergibt.


Ein kleiner Tipp noch: Du solltest prüfen ob es nicht notwendig ist, den ToSalesline.INSERT mit TRUE aufzurufen, damit alle Daten korrekt gefüllt sind.

Gruß Fiddi

Re: Endlosschleife beim Repeat...Until mit Findest

21. August 2017 11:46

Vielen dank für die vielen Antworten.

Ich habe es jetzt mit der Temporären Tabelle gelöst wie Natalie vorgeschlagen hat.
Das hat einwandfrei funktioniert. :)

Was macht denn die Funktion GetNextLineNo mit FromSalesLine?

Damit wird jeweils die nächste Zeilennr. erzeugt.

Ein kleiner Tipp noch: Du solltest prüfen ob es nicht notwendig ist, den ToSalesline.INSERT mit TRUE aufzurufen, damit alle Daten korrekt gefüllt sind.

Habe ich gemacht. Vielen Dank auch Fiddi.

Viele Grüße

Re: [Gelöst] Endlosschleife beim Repeat...Until mit Findest

21. August 2017 11:54

Navlex hat geschrieben:Damit wird jeweils die nächste Zeilennr. erzeugt.

ist nicht wahr :shock: :wink:

die Frage zielte auf das hier ab:
fiddi hat geschrieben:wenn GetNextLineNo SalesLine nicht als VAR- Parameter übergibt.

Re: [Gelöst] Endlosschleife beim Repeat...Until mit Findest

22. August 2017 08:12

Hallo Zusammen,

mich verwirrt ein wenig, dass hier die ganze Zeit die Rede von FINDSET ist. Im geposteten Code steht doch ein ein FIND('-')?
Das würde dann auch erklären warum hier das NEXT die frisch angelegten Datensätze findet.

FIND holt sich 50 Datensätze und wenn die durchlaufen sind dann holt es sich weitere 50 Datensätze aus der Datenbank.
Bei FINDSET werden direkt alle Daten aus der Datenbank gezogen. Und NEXT arbeitet dann tatsächlich auf einem "eingefrorenen" Dataset nur auf dem NST.

Ich hoffe ich verdrehe hier nichts :mrgreen:

Re: [Gelöst] Endlosschleife beim Repeat...Until mit Findest

22. August 2017 09:22

Bei mir klappt's mit findset genau wie mit find('-') (oder auch findfirst :wink: ).

Re: [Gelöst] Endlosschleife beim Repeat...Until mit Findest

22. August 2017 09:43

shove hat geschrieben:...Ich hoffe ich verdrehe hier nichts :mrgreen:

Doch tust du. Die Funktionsweise von FIND und FINDSET ist für NAV identisch. Er geht durch alle Datensätze einer Tabelle. Und wenn neue dazu kommen, nimmt er die über das NEXT mit.

Die beiden Befehle unterscheiden sich nur in der Verbindung zum SQL Server. Da ist FINDSET performanter und bietet noch Optionen.

Re: [Gelöst] Endlosschleife beim Repeat...Until mit Findest

23. August 2017 08:10

m_schneider hat geschrieben:Die Funktionsweise von FIND und FINDSET ist für NAV identisch.


Okay hm :-?

Ich hatte vor einiger Zeit diesen Artikel von Vjeko gelesen.
http://vjeko.com/the-if-count-1-conundrum/
Aber kann auch sein, dass ich das falsch interpretiert habe.

Re: [Gelöst] Endlosschleife beim Repeat...Until mit Findest

23. August 2017 08:32

Hallo,

die Funktionsweise von FINDSET und FIND ist schon unterschiedlich, nur in diesem Fall belanglos, da alle Datensätze des Recordsets bearbeitet werden.

FIND bringt nur etwas, wenn man noch nicht weiß ob man alle Records des gefilterten Recordsets auch benötigt, wie in seinem "COUNT=1"- Beispiel "IF FIND('-') and (NEXT=0)".

Gruß Fiddi

Re: [Gelöst] Endlosschleife beim Repeat...Until mit Findest

23. August 2017 08:40

shove hat geschrieben:Ich hatte vor einiger Zeit diesen Artikel von Vjeko gelesen.
http://vjeko.com/the-if-count-1-conundrum/
Aber kann auch sein, dass ich das falsch interpretiert habe.

Oh da hat sich etwas (Link) geändert.
Ich glaube jedoch, dass es für den vorliegenden Fall egal ist.

Re: [Gelöst] Endlosschleife beim Repeat...Until mit Findest

23. August 2017 10:49

m_schneider hat geschrieben:
shove hat geschrieben:Ich hatte vor einiger Zeit diesen Artikel von Vjeko gelesen.
http://vjeko.com/the-if-count-1-conundrum/
Aber kann auch sein, dass ich das falsch interpretiert habe.

Oh da hat sich etwas (Link) geändert.
Ich glaube jedoch, dass es für den vorliegenden Fall egal ist.
Grundsätzlich hat sich das Verhalten beginnend mit Dynamics NAV 2013 geändert. Eventuell sogar schon 2009 R2 ff.
FINDSET soll nur benutzt werden, wenn auch wirklich alle (gefilterten) Datensätze genutzt werden sollen, also eine Schleife nicht vorzeitig, durch eine weitere Bedingung beispielsweise, abgebrochen wird. Grund dafür ist, dass alle (gefilterten) Datensätze gelesen, an das NST gesendet und auch im Cache gespeichert werden.
Im Blog-Post von Vjeko ist das leider nicht sehr anschaulich und in einer Passage auch mehr als missverständlich, wenn nicht sogar falsch, wiedergegeben.

Letztlich weiß ein Entwickler, was genau er macht (sollte man annehmen und hoffen) und kann für sich entscheiden, ob es sinnvoll ist, das gesamte (gefilterte) Recordset zu lesen, obwohl eine Schleife vorzeitig abgebrochen wird. Eventuell werden die anderen Datensätze später noch gebraucht und dann ist es doch sinnvoll, diese bereits im Cache zu haben.

Eine generelle Antwort auf "soll ich FINDSET oder FIND('-') benutzen?" ist: Es kommt darauf an 8-)

Re: [Gelöst] Endlosschleife beim Repeat...Until mit Findest

23. August 2017 10:59

Das der FINDSET den kompletten Recordset vom SQL-Server liest, heißt aber nicht, dass er nicht zwischenzeitlich eingefügte Datensätze aus unserem Beispiel oben doch berücksichtigt.

Gruß Fiddi

Re: [Gelöst] Endlosschleife beim Repeat...Until mit Findest

23. August 2017 11:52

fiddi hat geschrieben:Das der FINDSET den kompletten Recordset vom SQL-Server liest, heißt aber nicht, dass er nicht zwischenzeitlich eingefügte Datensätze aus unserem Beispiel oben doch berücksichtigt.

Richtig. Dann aber nicht so optimal und schnell. Das stand aber oben schon :-)

Re: [Gelöst] Endlosschleife beim Repeat...Until mit Findest

23. August 2017 13:26

SilverX hat geschrieben:Grundsätzlich hat sich das Verhalten beginnend mit Dynamics NAV 2013 geändert.

Mehr dazu hier: Data Access. Ab NAV 2013 sind Multiple Active Result Sets (MARS) im Einsatz.