[Bug?] RecRef2 := RecRef.DUPLICATE vs. RecRef2 := RecRef

6. April 2020 10:33

Hi,

ich habe ein seltsames Verhalten bei der Verwendung von RecRef.DUPLICATE beobachtet. Ich möchte gerne mehrere Datensätze verändern und durchlaufe diese per RecRef. Da sich auch Felder ändern können, auf die gefiltert wurde oder ein Datensatz sogar gelöscht werden kann, verwende ich DUPLICATE, statt einer einfachen Zuweisung (ReplaceRecRef := RecRef) um nicht auf die selbe Referenz zu zeigen, wenn Änderungen/Löschungen gemacht werden.

Bei manchen Feldänderungen passiert es aber, dass die Schleife 2x durchläuft. Im Debugger schaut es so aus, als ob die gemachte Feldänderungen beim RecRef.NEXT "plötzlch" erkannt werden und der Zeiger dann wieder an den Anfang springt. Die Schleife wird dann 2x ausgeführt. Verwende ich statt dem DUPLICATE eine Zuweisung, funktioniert es so wie ich es will. Aber normalerweise wäre doch DUPLICATE die richtige Variante, oder? Zumindest wenn man sich die Hilfe dazu anschaut. Aufgefallen ist es mir bei der Massenänderung des Kreditoren Feldes am Artikel. Es passiert nicht immer. Anfangs habe ich vermutet, es passiert nur, wenn durch eine Feldänderung auch andere Felder geändert werden (durch Validate). Das konnte ich aber ausschließen idem ich keine Validierung gemacht habe.

Code:
IF RecRef.FINDSET THEN
   RecRef2 := RecRef.DUPLICATE;
   // --- Tu irgendwas. Bsp. Feldänderungen oder auch Datensatz löschen ---
   FldRef2 := RecRef2.FIELD(FieldNoInt);
   FldRef2.VALDATE(NewValueText);
   RecRef2.MODIFY(ValidateRecordBool);
   // ---------------------------------------------------------------------
UNTIL RecRef.NEXT = 0;


VG

Re: [Bug?] RecRef2 := RecRef.DUPLICATE vs. RecRef2 := RecRef

6. April 2020 10:51

Hallo,

ein Problem könnte die Sortierung sein. Solltest du ein Feld ändern nach dem sortiert wurde, kann es sein, das du mit dem Datensatzzeiger nach der Änderung an einer ganz anderen Stelle in deiner Liste bist.
Der unterschied wird hier sein, dass DUPLICATE einen neuen eigenständigen Zeiger definiert, die Zuweisung aber die Referenz auf die Variable weitergibt, d.h. eine Änderung ändert beide Datensatzzeiger.

Gruß Fiddi

Re: [Bug?] RecRef2 := RecRef.DUPLICATE vs. RecRef2 := RecRef

6. April 2020 11:36

Eine Sortierung gebe ich nicht vor. Hab es gerade nochmal mit einem Artikel im Filter probiert (direkt auf die Nr. gefiltert). Ändere ich das Feld Kreditorennr. am Artikel z.B. zu Kreditor ABC läuft die Schleife 1x durch. Bei Änderung zu Kreditor XYZ läuft die Schleife 2x durch. Völlig unklar warum. Mal so und dann anders. Mache ich statt DUPLICATE eine Zuweisung, geht es!? Laut Hilfe soll doch eigentlich das DUPLICATE eben dies verhindern:

The RecordRef that is returned refers to a new record with the same filters, current keys, and marks as the original RecordRef. Any changes that you make to the filters, current keys, and marks of the new record are not observed in the original. This differs from assigning one RecordRef to another RecordRef. If you assign one RecordRef to another RecordRef, then both refer to the same record and changes that you make to one RecordRef are observed in the other RecordRef.

Also bleibt mir nur übrig die Schleife selbst 2x zu durchlaufen. Beim 1. Mal sammle ich die RecordIDs in einer TempTable und beim 2. Mal gehe ich die TempTable durch und mache einen RecRef.GET(RecID). Das wollte ich eigentlich umgehen. Zudem man glaube die RecordID nicht mal als String zwischenspeichern kann. So hätte ich es mir in ein Array gepackt.

Re: [Bug?] RecRef2 := RecRef.DUPLICATE vs. RecRef2 := RecRef

6. April 2020 11:53

Hallo,

Außerdem solltest du das Feld, das du ändern willst nicht filtern, das geht in NAV nicht ohne zweiten Record bzw. wahrscheinlich nur MODIFYALL. Passieren tut da genau das gleiche wie oben beschrieben.

Gruß Fiddi