Leider hat sich hier im Kernel ein kleiner Fehler eingeschlichen, wenn man als Wertzuweisung ein Array-Element einer gejointen Tabelle verwendet. Folgendes update_recordset wird teilweise ignoriert, konkret ab der Zuweisung des Array-Element custTableRead.Dimension[2] wird diese sowie jede weitere Feldwertzuweisung ausgelassen (also auch die Zuweisung von NameAlias mit dem Wert "any Alias" wird schlichtweg nicht durchgeführt):
CustTable custTableUpdate; CustTable custTableRead; ; ttsbegin; update_recordset custTableUpdate setting Street = custTableRead.Street, Name = custTableRead.Dimension[2], NameAlias = "any Alias" where custTableUpdate.AccountNum == "00000001" join custTableRead where custTableRead.AccountNum == "00000002"; info(strfmt("%1", custTableUpdate.RowCount())); select firstonly custTableUpdate where custTableUpdate.AccountNum == "00000001"; info(custTableUpdate.Street); // works fine so far info(custTableUpdate.Name); // you didn't get what you expect info(custTableUpdate.NameAlias); // you didn't get what you expect ttscommit;
Allerdings funktioniert alles prima, wenn kein Array-Feld im Spiel ist:
update_recordset custTableUpdate setting Name = custTableRead.Name, NameAlias = "any Alias" where custTableUpdate.AccountNum == "00000001" join custTableRead where custTableRead.AccountNum == "00000002";
Es funktioniert auch wenn das Array-Feld von der gleichen Tabelle stammt wie die zu aktualisierende Tabelle.
update_recordset custTableUpdate setting Name = custTableUpdate.Dimension[2], Street = custTableRead.Street where custTableUpdate.AccountNum == "00000001" join custTableRead where custTableRead.AccountNum == "00000002";
Damit eine Zuweisung von custTableRead.Dimension[2] in custTableUpdate.Name korrekt funktioniert muss man leider den altmodischen Weg gehen: Die Datensätze erst auswählen, dann die Zuweisung vornehmen und danach aktualisieren. Dies kostet zwar mehr Zeit, funktioniert dafür aber korrekt (was meiner Meinung nach auch mehr Priorität geniesst :).
ttsbegin; select firstonly Dimension from custTableRead where custTableRead.AccountNum == "00000002" join forupdate custTableUpdate where custTableUpdate.AccountNum == "00000001"; custTableUpdate.Name = custTableRead.Dimension[2]; custTableUpdate.update(); ttscommit;
Dieses Verhalten bezieht sich nur auf AX 2009 und (falls nicht korrigiert) spätere Versionen. Die Möglichkeit zur Verwendung von Joins in update_recordset steht nämlich erst ab AX 2009 zur Verfügung.
No comments:
Post a Comment