Microsoft_MVP_banner

Use enum values and unbounded table fields in insert_recordset

insert_recordset is one the greatest enhancement in AX 2012 which allows us to insert records from one to another table in single client-server trip. This is an X++ SQL statement and is similar to update_recordset which i explained in my this post. Sometime we may require to insert values into destination table’s column which do not exists in source table’s column.  To elaborate it more let’s have an example and then I will explain you how it works; static void testJob(Args _args) { ProjTable projTable, projTableInsert; ProjStatus enumValue = ProjStatus::Created; str 30     strValue = “test”; update_recordSet projTable Setting Name = “test” where projTable.projId == “Foobar”; insert_recordset projTableInsert (Name, ProjId) select strValue, ProjId from projTable where projTable.projId == “Foobar”; // You can set to an enum value, providing that update_recordSet projTable Setting status = ProjStatus::Created where projTable.projId == “Foobar”; insert_recordset projTableInsert (Status, ProjId) //select ProjStatus::Created, ProjId        NOT ALLOWED select enumValue, ProjId from projTable where projTable.projId == “Foobar”; } I have two variables StrValue of string type and enumValue of enum (ProjStatus) type.  You can set enum value directly into update_recordset but this is NOT ALLOWED in insert_recordset. For this reason I declared a variable enumValue and used later in insert_recordset statement. another complex example for insert_recordset; // I created this method to insert records into customized table (JobProfitDetailsSw) from different tables. private void insertPurchaseOrderTypeProjCostTrans(ProjId   _projId) {     JobProfitDetailsSW     jobProfitDetailsSW;     ProjCostTrans             projCostTrans;     VendInvoiceJour         vendInvoiceJour;     str 20              jobProfitSourceSw = enum2str(JobProfitSourceSw::BCIInvoice);     str 20              jobProfitTypeSw = enum2str(JobProfitTypeSw::Cost);     insert_recordset jobProfitDetailsSW         (Amount, Description, JobProfitSourceStr, JobProfitTypeStr, ProjectDate, ProjId, CategoryId)     select sum(TotalCostAmountCur), Txt, jobProfitSourceSw, jobProfitTypeSw, AsOfDate, _projId, CategoryId         from projCostTrans     group by Txt, projId, CategoryId         where projCostTrans.TransDate           <= AsOfDate &&               projCostTrans.TransactionOrigin   == ProjOrigin::PurchaseOrder &&               projCostTrans.ProjId              == _projId     join vendInvoiceJour         group by Purchid         where vendInvoiceJour.LedgerVoucher == projCostTrans.VoucherJournal; }

All about Update_recordset

AX 2012 introduces many feature in regards to the performance enhancement and provides ways to access (insert, delete, update) database with less overhead (less database calls). If we talk about updating record(s) in database, few points come into our mind. One is looping through all records and update them in database (will create total number of records calls to database, and will degrade performance). How about to make only one call to database and update all records in this one call.  AX 2012 provides way to use X++ SQL statements to enhance performance. This option is update_recordset which enables you to update multiple rows in a single trip to the server. SQL server statement UPDATE CUSTTABLE SET BLOCKED = 0 WHERE CUSTTABLE.ACCOUNTNUM = ”; X++ SQL Server static void update_recordSetJob(Args _args) {     CustTable custTable; // Table buffer declaration         update_recordSet custTable     setting Blocked = 0     where custTable.AccountNum == “”; } We can also use join statements in update_recordset update_recordSet custTable setting Blocked = 0 Join custTrans where custTable.AccountNum == custTrans.AccountNum &&       […some other criteria];

Cache display methods in AX 2012

Display methods must be written at the table level However, developers often write display or edit methods to perform some calculations and then bind them on form’s controls to allow user to display or edit values in those bounded controls.  Display/Edit methods create excessive client-server round trips and impact on product performance. And if there are  display methods added on the form it will make 5 client-server round trips, one for each method. Options 1: CacheAddMethod This issue can be addressed by using the CacheAddMethod on the FormDataSource. This method enables the form to calculate all of the display methods in single round trip to the server rather making individual calls. Let’s assume you have added edit method on ProjTable form to show some calcuated dates. Override init() method under ProjTable datasource and write following code; public void init() {    super();  ProjTable_ds.cacheAddMethod(tableMethodStr(ProjTable, projectCompletedDate), false); } Options 2: SysClientCacheDataMethodAttribute AX2012 also allows to use SysClientCacheDataMethodAttribute attribute in the display method declaration. Then, forms should cache such methods automatically.Attribute’s constructor accept one optional parameter (_updateOnWrite), which corresponds to the second parameter of cacheAddMethod().Example: [SysClientCacheDataMethodAttribute(true)] display DirPartyType type() {…} [SysClientCacheDataMethodAttribute] public display EcoResProductTitle title() {    return inventTable.product().title(); } Options 3: CacheDataMethod peoperty on Form’s control AX 2012 introduces a new feature called the Declarative Display caching. This allows you to enable caching by setting the form control property CacheDataMethod with either of three values; Yes, No and Auto A lot more on this topic is here https://msdn.microsoft.com/en-us/library/aa596691.aspx Happy Daxure!ing

FaisalFareed@2025. All rights reserved

Design by T3chDesigns