Thursday, January 30, 2025

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

Table browser URL in D365FO

Critical Thinking icon icon by Icons8