public void reserveItem(ItemId _itemId,InventTransId _inventTransId, Purchline _purchline) { InventTrans inventTrans; InventTransOrigin inventTransOrigin; InventMovement inventMovement; InventUpd_Reservation inventUpd_Reservation ; InventDim inventdim; // Reserve an item select inventTrans where inventTrans.ItemId == _itemId && inventTrans.StatusReceipt == StatusReceipt::None && inventTrans.StatusIssue == StatusIssue::OnOrder exists join inventTransOrigin where inventTransOrigin.RecId == inventTrans.InventTransOrigin && inventTransOrigin.InventTransId == _inventTransId && inventTrans.MarkingRefInventTransOrigin == InventTransOrigin::findByInventTransId(_purchline.InventTransId).RecId; inventdim = inventTrans.inventDim(); inventdim.inventBatchId = strFmt("%1-%2",_purchline.PurchId,_purchline.InventTransId ); inventdim = inventdim::findDim(inventdim); if(inventTrans.RecId) { Inventmovement = inventTrans.inventmovement(true); inventUpd_Reservation = InventUpd_Reservation::newInventDim(inventmovement,inventdim ? inventdim : inventTrans.inventDim(),inventTrans.Qty, false); inventUpd_Reservation.updatenow(); } } public void removeReserveItem(ItemId _itemId,InventTransId _inventTransId) { InventTrans inventTrans; InventTransOrigin inventTransOrigin; InventMovement inventMovement; InventUpd_Reservation inventUpd_Reservation ; // Remove reservations and markings on a reserved transfer order while select inventTrans where inventTrans.ItemId == _itemId && inventTrans.StatusReceipt == StatusReceipt::None && (inventTrans.StatusIssue == StatusIssue::ReservPhysical || inventTrans.StatusIssue == StatusIssue::ReservOrdered) exists join inventTransOrigin where inventTransOrigin.RecId == inventTrans.InventTransOrigin && inventTransOrigin.InventTransId == _inventTransId { if (inventTrans.StatusIssue == StatusIssue::ReservPhysical || inventTrans.StatusIssue == StatusIssue::ReservOrdered) { Inventmovement = inventTrans.inventmovement(true); inventUpd_Reservation = InventUpd_Reservation::newInventDim(inventmovement,inventTrans.inventDim(), -1 * inventTrans.Qty, false); inventUpd_Reservation.updatenow(); } } }
This blog is contains coding reference related to Microsoft AX 2012 and D365 finance and operations and Power platform
Thursday, January 30, 2025
Reserve and unreserve Item using X++
Trigger Sysoperation through button click
class PurchTableForm_EventHandler { /// <summary> /// run business logic for ConnectTransferOrder button /// </summary> /// <param name="sender">sender</param> /// <param name="e">e</param> [FormControlEventHandler(formControlStr(PurchTable, ConnectTransferOrder), FormControlEventType::Clicked),SuppressBPWarning('BPParameterNotUsed', 'Parameter required')] public static void ConnectTransferOrder_OnClicked(FormControl sender, FormControlEventArgs e) { FormDataSource formds = sender.formRun().dataSource(formDataSourceStr(PurchTable, PurchTable)); PurchTable purchTable = PurchTable::findRecId(formds.cursor().RecId); CreateUpdateTransferOrderController controller; SysOperationStartResult sysOperationStartResult; Args args = new Args(); args.caller(sender.formRun()); args.record(purchTable); controller = CreateUpdateTransferOrderController::newFromArgs(args); controller.parmExecutionMode(SysOperationExecutionMode::Synchronous); sysOperationStartResult = controller.startOperation(); formds.refresh(); formds.reread(); } }
Parse JSON response using X++ to vairables
str output =//JSON String; output = strRem(output, "["); output = strRem(output, "]"); Map jsonData; jsonData = RetailCommonWebAPI::getMapFromJsonString(output); container Error,Log,LinkIds,currentReponse; ListEnumerator listEnumerator,listenum; MapEnumerator mapEnumerator; mapEnumerator = jsonData.getEnumerator(); int AccNum; int Name; int Phone; int address; str errorTxt; str logTxt; str hasErrorStr; while (mapEnumerator.moveNext()) { switch (mapEnumerator.currentKey()) { case "Error": hasErrorStr = mapEnumerator.currentValue(); break; case "Log": logTxt = mapEnumerator.currentValue(); break; case "CustomerDetails"://json array currentReponse = mapEnumerator.currentValue(); if(currentReponse) { for (int i=1; i <= conlen(currentReponse); i++) { switch(conpeek(currentReponse, i)) { case "AccNum": AccNum = conPeek(currentReponse,i+1); break; case "Name": Name = conPeek(currentReponse,i+1); break; case "Phone": Phone = conPeek(currentReponse,i+1); break; case "address": address = conPeek(currentReponse,i+1); break; } } } break; } }
Sysoperation multithread using subtasks
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; } } } }
Subscribe to:
Posts (Atom)