Skip to main content

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.
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;
}

Popular posts from this blog

What does this mean: "The form datasource query object does not support changing its AllowCrossCompany property after the form has executed the query."?

I have made a form with datasources vendtable and vendtrans. Inside vendtable_ds.executequery() looks like this: QueryBuildDataSource queryBuildDatasource ,queryBDS_VendTrans_Invoice; ; queryBuildDatasource = this.query().dataSourceTable(tablenum(vendtable)); queryBDS_VendTrans_Invoice = this.query().dataSourceTable(tablenum(vendtrans)); if (curext() == "MASTERCOMP") { this.query().allowCrossCompany(true); } else { this.query().allowCrossCompany(false); } //FilterVendorName = stringedit control on form if (FilterVendorName.text()) { queryBuildDatasource.addRange(fieldNum(VendTable,Name)).value(strfmt("*%1*", FilterVendorName.text())); } else { queryBuildDatasource.clearRange(fieldNum(VendTable,Name)); } //FilterInvoiceNumber = stringedit control on form if (FilterInvoiceNumber.valueStr() == "") { queryBDS_VendTrans_Invoice.enabled(false); } else { queryBDS_VendTrans_Invoice.enabled(true); queryBDS_VendTrans_In...

Credit Note [Dynamics AX] using X++

This post will help to create credit note for a sales order based on the invent lot id. All the invoices raised for a particular sales line – Lot Id will be raised back as a credit note. Information on Credit Note: A credit note or credit memorandum (memo) is a commercial document issued by a seller to a buyer. The seller usually issues a Credit Memo for the same or lower amount than the invoice, and then repays the money to the buyer or sets it off against a balance due from other transactions Below Code will help to create credit note for all the invoices raised against the sales line -lot id. Please note: This code can be customized as per your requirements. This is just a template to help creating credit note using X++ code. Please test the code before use. static void SR_CreateCreditNote_Sales(Args _args) { // Coded by Sreenath Reddy CustInvoiceTrans custInvoiceTrans; Dialog dialog = new Dialog(“Create credit note – for sales.”); DialogField dfInv...