class CustInvoiceProcessBaseService extends SysOperationServiceBase { public void process(CustInvoiceProcessContract _contract) { Query query; QueryRun queryRun; CustInvoiceJour custInvoiceJour; int defaultBundleSize = _contract.parmbundleSize(); int defaultRecordLimit = _contract.parmRecordLimit(); query = _contract.getQuery(); queryRun = new QueryRun(query); int counter = 0, lineCount = 0; BatchHeader batchHeader = this.getCurrentBatchHeader(); List customerInvoiceList = new List(Types::Int64); while (queryRun.next()) { custInvoiceJour = queryRun.get(tableNum(CustInvoiceJour)); if (batchHeader) { counter++; customerInvoiceList.addEnd(custInvoiceJour.RecId); if (counter == DefaultBundleSize) { CustInvoiceProcessSubTaskController accountResolver = CustInvoiceProcessSubTaskController::newTaskController(customerInvoiceList, strFmt("@DistITServices:BundleSize", lineCount == 0 ? 1 : lineCount, lineCount + counter)); batchHeader.addRuntimeTask(accountResolver, BatchHeader::getCurrentBatchTask().RecId); customerInvoiceList = new List(Types::Int64); lineCount = lineCount + counter; counter = 0; } if (lineCount >= DefaultRecordLimit) { break; } } else { lineCount++; CustInvoiceProcessSubTaskService::run(custInvoiceJour); } } if (batchHeader) { //To add last lines if (counter != 0 && counter <= DefaultBundleSize) { CustInvoiceProcessSubTaskController accountResolver = CustInvoiceProcessSubTaskController::newTaskController(customerInvoiceList, strFmt("@DistITServices:BundleSize",lineCount == 0 ? 1 : lineCount, lineCount + counter)); batchHeader.addRuntimeTask(accountResolver, BatchHeader::getCurrentBatchTask().RecId); customerInvoiceList = new List(Types::Int64); lineCount = lineCount + counter; counter = 0; } if (batchHeader) { batchHeader.save(); if (lineCount) { info(strFmt("%1 : %2", "@DMP1153", lineCount)); } } } else if (lineCount) { info(strFmt("%1 : %2", "@DMF:NumberOfRecordsProcessed", lineCount)); } } } /////////////////////////// [DataContractAttribute] class CustInvoiceProcessSubTaskContract extends SysOperationDataContractBase { List custInvoiceJourList = new List(Types::Int64); [ DataMemberAttribute, SysOperationControlVisibilityAttribute(false), AifCollectionTypeAttribute('return', Types::Int64) ] public List parmCustInvoiceJourList( List _custInvoiceJourList = custInvoiceJourList ) { custInvoiceJourList = _custInvoiceJourList; return custInvoiceJourList; } } ////////////////////////// class CustInvoiceProcessSubTaskController extends SysOperationServiceController { public ClassDescription defaultCaption() { return "@DistITServices:CustInvoiceProcess"; } private void new() { super(); this.parmClassName(classStr(CustInvoiceProcessSubTaskService_DIS)); this.parmMethodName(methodStr(CustInvoiceProcessSubTaskService_DIS, process)); this.parmExecutionMode(SysOperationExecutionMode::Synchronous); } public static SysOperationController newTaskController(List _list, str _taskDesc) { CustInvoiceProcessSubTaskControllercontroller = new CustInvoiceProcessSubTaskController_DIS(); CustInvoiceProcessSubTaskContract contract = controller.getDataContractObject() as CustInvoiceProcessSubTaskContract_DIS; controller.parmDialogCaption(strFmt("@DistITServices:BatchTaskDescription", _taskDesc)); contract.parmCustInvoiceJourList(_list); return controller; } [Hookable(false)] public boolean canGoBatch() { return true; } protected boolean canRunInNewSession() { return true; } [Hookable(false)] public boolean parmShowDialog(boolean _showDialog = showDialog) { return false; } [Hookable(false)] public boolean parmShowProgressForm(boolean _showProgressForm = showProgressForm) { return false; } } ////////////////////////////////////////// class CustInvoiceProcessSubTaskService extends SysOperationServiceBase { public void process(CustInvoiceProcessSubTaskContract _contract) { ListIterator custInvoiceJourListIterator = new ListIterator(_contract.parmCustInvoiceJourList()); container conCompleted, conEDIFailed, conEmailFailed, conNotSent; while (custInvoiceJourListIterator.more()) { custInvoiceJourListIterator.next(); } } public static void run(CustInvoiceJour _custInvoiceJour) { #OCCRetryCount try { } catch (Exception::Error) { throw Error("@SYS138340"); } catch (Exception::Deadlock) { if (xSession::currentRetryCount() >= #RetryNum) { throw Exception::Deadlock; } else { retry; } } catch(Exception::UpdateConflict) { if (appl.ttsLevel() == 0) { if (xSession::currentRetryCount() >= #RetryNum) { throw Exception::UpdateConflictNotRecovered; } else { retry; } } else { throw Exception::UpdateConflict; } } } }
This blog is contains coding reference related to Microsoft AX 2012 and D365 finance and operations and Power platform
Thursday, January 30, 2025
Sysoperation multithread using subtasks
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment