Zuweisung überschreibt xRec

23. August 2016 12:12

Moin zusammen,

wir sind gerade bei einem Upgrade von 2009R2 auf 2016. Dabei ist uns aufgefallen, dass eine einfache Zuweisung von einer lokalen, temporären Record-Variable auf eine übergebene, nicht temporäre Record-Variable des gleichen Typs dazu führt, das der xRec der Ziel-Variable das selbe enthält wie der Rec. Dadurch wird das folgende Modify(True) zwar ausgeführt, aber die Aktualisierung des physikalischen Datensatzes auf der Datenbank nicht.

ResTaskLoc = Temporäre Record Variable
ResTaskPar = An die Funktion übergebene, nicht temporäre Record Variable

Code:
IF OpenDelegateTask(ResTaskLoc,Text0052) THEN BEGIN 
  ResTaskPar := ResTaskLoc;
  ResTaskPar.MODIFY(TRUE);
END;


Nimmt man Transferfields, dann läuft alles:

Code:
IF OpenDelegateTask(ResTaskLoc,Text0052) THEN BEGIN
  ResTaskPar.TRANSFERFIELDS(ResTaskLoc);
  ResTaskPar.MODIFY(TRUE);
END;


Hier gab es offensichtlich eine Änderung im Verhalten, denn unter 2009R2 funktioniert auch der erste Code-Block prima.

Ist das ein Bug, oder ein Feature?

Danke für Eure Einschätzungen

Andreas

Re: Zuweisung überschreibt xRec

23. August 2016 13:44

Eine "Änderung im Verhalten" in NAV 2016 sind Events :wink: , das dürfte die Ursache sein.
Mehr dazu hier:
OnAfter table event subscriber patterns and antipatterns
Eventing OnAfterModify: Watch out when checking against xRec

Re: Zuweisung überschreibt xRec

23. August 2016 15:20

Moin Kai,

danke für die Info. Ich habe das schon vermutet. Ich gebe das mal in die Entwicklung weiter. Mal schauen wie groß der Zusatzaufwand für das Projekt wird.

Andreas

Re: Zuweisung überschreibt xRec

23. August 2016 17:18

Hallo zusammen,

hier meldet sich dann mal die Entwicklung dazu;)

Da wir (noch) keine Events verwenden, glaube ich eher nicht, dass das die Ursache für das Problem ist.
Zumal ich inzwischen herausgefunden habe, dass xRec im OnModify-Trigger immer Rec entspricht, solange das Rec nicht im Trigger selber geändert wird:

NAV2016: https://msdn.microsoft.com/en-us/librar ... 90%29.aspx
Nav2009: https://msdn.microsoft.com/en-us/librar ... 60%29.aspx

Bei der SQL-Ablaufverfolgung wurde bei der Zuweisung mit anschließendem Modify das Einfügen eines dazugehörigen Datensatzes zwar ausgeführt, das Ändern des "ResTaskPar" aber nicht.

Ich vermute eher, dass eines der folgenden Sachen passiert ist:
- Beim Zuweisen wurde dem nicht temporären Record auch die Information "Temporär" mit übertragen
- Beim Ändern des temporären Datensatzes wurde keine Versionsänderung gespeichert und das "keine Versionsänderung" wurde beim Zuweisen ebenfalls in die nicht temporäre Variable übernommen

Re: Zuweisung überschreibt xRec

23. August 2016 17:53

Echt drolliger Fehler. Wir haben eben das Transferfields rausgenommen und zu der Recordset Zuweisung noch einen simplen Stringfeldwert im Code zugewiesen. Das Modify hat nur den geänderten Stringfeldwert aktualisiert. Die Werte aus der temporären Tabelle sind nicht in die Datenbank gespeichert worden.

Ich finde es ja prima, dass nur Felder an die DB übertragen werden, die auch geändert wurden. Ich fände es aber auch prima wenn alle geänderten Felder an die DB übertragen werden.

Da mach ich morgen lieber mal nen Call bei MS auf, oder fällt Euch dazu noch etwas ein?

Update: WIr haben gerade noch mal das aktuelle Hotfix eingespielt. Hat auch nix geholfen :-(