Buffer to Buffer data and update only different fields with setFieldAsTouched method and Reflection class using X++ [Dynamics AX]
In many cases we might need to compare the data which is already stored in the table and only update the fields data that is different.
static void SR_SetFieldAsTouched(Args _args)
{
AxVendTable axVendTable;
SysDictTable sysDictTable = new SysDictTable(tablenum(VendTable));
int i;
int fieldCnt;
fieldId fieldId;
VendTable _vendTable, vendTable; // Try out the _vendTable buffer with some modified values
;
ttsbegin;
_vendTable.AddressMap::formatAddress();
axVendTable = AxVendTable::newVendTable(_vendTable);
vendTable = VendTable::findRecId(_vendTable.RecId);
fieldCnt = sysDictTable.fieldCntWithoutSys(); // Get the fieldcount ignoring the system fields
for (i=1;i <= fieldCnt;i++)
{
fieldId = sysDictTable.fieldCnt2Id(i);
if (vendTable.(fieldId) != _vendTable.(fieldId))
{
axVendTable.setFieldAsTouched(fieldId);
}
}
axVendTable.save();
ttscommit;
}
Buf2Buf() – will help to copy the 2 buffers. But If we want to compare and then update the data which is different in the fields along with any other fields that are dependent on the field[SetFieldAsTouched] below code will help you. [Corrected from the old message/post]
The method setFieldAsTouched takes a field ID as a parameter, and when it is executed, it marks that the field has already been assigned a value. Executing modify or save will thereafter resolve the intra-table field relations, and default, any other fields that depend on the field, which is set as touched.
Note: I am using VendTable in the below example to check and compare using reflection class in combination of AXBC class AXVendTable and SysDictTable. You can use traditional way of updating table instead of using AXBC classes as well
static void SR_SetFieldAsTouched(Args _args)
{
AxVendTable axVendTable;
SysDictTable sysDictTable = new SysDictTable(tablenum(VendTable));
int i;
int fieldCnt;
fieldId fieldId;
VendTable _vendTable, vendTable; // Try out the _vendTable buffer with some modified values
;
ttsbegin;
_vendTable.AddressMap::formatAddress();
axVendTable = AxVendTable::newVendTable(_vendTable);
vendTable = VendTable::findRecId(_vendTable.RecId);
fieldCnt = sysDictTable.fieldCntWithoutSys(); // Get the fieldcount ignoring the system fields
for (i=1;i <= fieldCnt;i++)
{
fieldId = sysDictTable.fieldCnt2Id(i);
if (vendTable.(fieldId) != _vendTable.(fieldId))
{
axVendTable.setFieldAsTouched(fieldId);
}
}
axVendTable.save();
ttscommit;
}