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.

