Showing posts with label Custom service. Show all posts
Showing posts with label Custom service. Show all posts

Friday, 20 October 2023

Pagination in D365 FO X++

Pagination can only apply in Dynamic queries like as below.

// Set up paging
queryRun = new QueryRun(query);
queryRun.enablePositionPaging(true);
queryRun.addPageRange(_startPosition, _pageSize);

Kindly refer the below URL:
https://www.d365stuff.co/d365-custom-web-service-with-pagination/

Custom service with Request with json response with header with multiple lines in D365 FO

[DataContract]
class ULT_HistoryRequestContract

{

    private str     legalEntity;

    private str     allocationAccount;

    private Date    fromDate;

    private Date    toDate;

    private str     transactionType;

    private int     sortBy;

    private int     Page;

    private int     limit;

    [DataMember("LegalEntity")]

    public str parmLegalEntity(str _legalEntity = legalEntity)

    {

        legalEntity = _legalEntity;

        return legalEntity;

    }

    [DataMember("AllocationAccount")]

    public str parmAllocationAccount(str _allocationAccount = allocationAccount)

    {

        allocationAccount = _allocationAccount;

        return allocationAccount;

    }

    [DataMember("FromDate")]

    public Date parmFromDate(Date _fromDate = fromDate)

    {

        fromDate = _fromDate;

        return fromDate;

    }

    [DataMember("ToDate")]

    public Date parmToDate(Date _toDate = toDate)

    {

        toDate = _toDate;

        return toDate;

    }

    [DataMember("TransactionType")]

    public str parmTransactionType(str _transactionType = transactionType)

    {

        transactionType = _transactionType;

        return transactionType;

    }

    [DataMember("SortBy")]

    public int parmSortBy(int _sortBy = sortBy)

    {

        sortBy = _sortBy;

        return sortBy;

    }

    [DataMember("Page")]

    public int parmPage(int _page = page)

    {

        page = _page;

        return page;

    }

    [DataMember("Limit")]

    public int parmLimit(int _limit = limit)

    {

        limit = _limit;

        return limit;

    }

}

-------------------------------------------------------

[DataContract]

class ULT_HistoryResponseContract

{

    private ULT_HistoryResponseHeaderContract  headerResponse;

    private List                                            linesResponse = new List(Types::Class);



    [DataMember("Header")]

    public ULT_HistoryResponseHeaderContract parmHeader(ULT_HistoryResponseHeaderContract _headerResponse = headerResponse)

    {

        headerResponse = _headerResponse;

        return headerResponse;

    }



    [DataMember("Transactions"),

        AifCollectionType("_linesResponse", Types::Class, classStr(ULT_HistoryResponseLineContract)),

        AifCollectionType("return", Types::Class, classStr(ULT_HistoryResponseLineContract))]

    public List parmLines(List _linesResponse = linesResponse)

    {

        linesResponse = _linesResponse;

        return linesResponse;

    }

}
-------------------------------------------------------------------

[DataContract]

class ULT_HistoryResponseHeaderContract

{

    private boolean  queryStatus;

    private real     allocationAccountBalance;

    private int      transactionCount;

    private str      errorType;

    private str      errorDescription;

    [DataMember("QueryStatus")]

    public boolean parmQueryStatus(boolean _queryStatus = queryStatus)

    {

        queryStatus = _queryStatus;

        return queryStatus;

    }

    [DataMember("AllocationAccountBalance")]

    public real parmAllocationAccountBalance(real _allocationAccountBalance = allocationAccountBalance)

    {

        allocationAccountBalance = _allocationAccountBalance;

        return allocationAccountBalance;

    }

    [DataMember("TransactionCount")]

    public int parmTransactionCount(int _transactionCount = transactionCount)

    {

        transactionCount = _transactionCount;

        return transactionCount;

    }

    [DataMember("ErrorType")]

    public str parmErrorType(str _errorType = errorType)

    {

        errorType = _errorType;

        return errorType;

    }

    [DataMember("ErrorDescription")]

    public str parmErrorDescription(str _errorDescription = errorDescription)

    {

        errorDescription = _errorDescription;

        return errorDescription;

    }

    public void setResponse(boolean _queryStatus, real _allocationAccountBalance, int _transactionCount, str _errorType, str _errorDescription)

    {

        this.parmQueryStatus(_queryStatus);

        this.parmAllocationAccountBalance(_allocationAccountBalance);

        this.parmTransactionCount(_transactionCount);

        this.parmErrorType(_errorType);

        this.parmErrorDescription(_errorDescription);

    }

}

-----------------------------------------------------------------------

[DataContract]

class ULT_HistoryResponseLineContract

{

    private str             type;

    private TransDate       transDate;

    private str             voucher;

    private str             description;

    private str             businessProcessReferenceId;

    private real            volume;

    private str             gjaeRecId;

    [DataMember("Type")]

    public str parmType(str _type = type)

    {

        type = _type;

        return type;

    }

    [DataMember("TransDate")]

    public TransDate parmTransDate(TransDate _transDate = transDate)

    {

        transDate = _transDate;

        return transDate;

    }

    [DataMember("Voucher")]

    public str parmVoucher(str _voucher = voucher)

    {

        voucher = _voucher;

        return voucher;

    }

    [DataMember("Description")]

    public str parmDescription(str _description = description)

    {

        description = _description;

        return description;

    }

    [DataMember("BusinessProcessReferenceId")]

    public str parmBusinessProcessReferenceId(str _businessProcessReferenceId = businessProcessReferenceId)

    {

        businessProcessReferenceId = _businessProcessReferenceId;

        return businessProcessReferenceId;

    }

    [DataMember("Volume")]

    public real parmVolume(real _volume = volume)

    {

        volume = _volume;

        return volume;

    }

    [DataMember("RecordId")]

    public str parmRecId(str _gjaeRecId = gjaeRecId)

    {

        gjaeRecId = _gjaeRecId;
        return gjaeRecId;

    }

}

------------------------------------------------------------------------------

public class ULT_HistoryService

{

    ULT_HistoryResponseContract        respoHnse;

    ULT_HistoryResponseHeaderContract  headerResponse;

    GeneralJournalAccountEntry                      generalJournalAccountEntry;

    str                                             operationStatus;

    str                                             errorType, errorTypeDate, missingPayloadfields;

    str                                             errorDescription, errorDescriptionDate, errorDateDescriptions;

    real                                            allocationAccountBalance;

    int                                             transactionCount, i;



    public ULT_HistoryResponseContract getRetrieveAllocationTrans(ULT_HistoryRequestContract _request)

    {

        ULT_allocationDetailsView    allocationDetailsView;

        headerResponse  = new ULT_HistoryResponseHeaderContract ();

        response        = new ULT_HistoryResponseContract();

        Query                   query = new Query();

        QueryRun                queryRun;

        QueryBuildDataSource    qbds;



        try

        {

            if (this.requestIsNotEmpty(_request))

            {

                changecompany(_request.parmLegalEntity())

                {

                    qbds = query.addDataSource(tableNum(ULT_allocationDetailsView));

                    qbds.addRange(fieldNum(ULT_allocationDetailsView, TransactionHistory)).value(SysQuery::value(NoYes::Yes));

                    qbds.addRange(fieldNum(ULT_allocationDetailsView, GeneralJournalEntrySubledgerVoucher)).value(SysQuery::valueNotEmptyString());

                   

                   

                    switch (_request.parmSortBy())

                    {

                        case enum2int(ULT_SortBy::None):

                            qbds.addSortField(fieldNum(ULT_allocationDetailsView, GJAERecId), SortOrder::Ascending);

                            break;

                        case enum2int(ULT_SortBy::DateNewToOld):

                            qbds.addSortField(fieldNum(ULT_allocationDetailsView, AccountingDate), SortOrder::Descending);

                            break;

                        case enum2int(ULT_SortBy::DateOldToNew):

                            qbds.addSortField(fieldNum(ULT_allocationDetailsView, AccountingDate), SortOrder::Ascending);

                            break;

                        case enum2int(ULT_SortBy::VolumeLowToHigh):

                            qbds.addSortField(fieldNum(ULT_allocationDetailsView, AccountingCurrencyAmount), SortOrder::Ascending);

                            break;

                        case enum2int(ULT_SortBy::VolumeHighToLow):

                            qbds.addSortField(fieldNum(ULT_allocationDetailsView, AccountingCurrencyAmount), SortOrder::Descending);

                            break;

                        case enum2int(ULT_SortBy::TransactionTypeAToZ):

                            qbds.addSortField(fieldNum(ULT_allocationDetailsView, WaterTransType), SortOrder::Ascending);

                            break;

                        case enum2int(ULT_SortBy::TransactionTypeZToA):

                            qbds.addSortField(fieldNum(ULT_allocationDetailsView, WaterTransType), SortOrder::Descending);

                            break;

                    }    



                    qbds.addRange(fieldNum(ULT_allocationDetailsView, DIMENSIONATTRIBUTENAME)).value(ULT_AllocationTradeConstants::allocationAccountConst);

                    qbds.addRange(fieldNum(ULT_allocationDetailsView, DimensionAttributeLevelValueViewDisplayValue)).value(_request.parmAllocationAccount());

                    qbds.addRange(fieldNum(ULT_allocationDetailsView, AccountingDate)).value(SysQuery::range(_request.parmFromDate(), _request.parmToDate()));



                    if (_request.parmTransactionType())

                    {

                        qbds.addRange(fieldNum(ULT_allocationDetailsView, WaterTransType)).value(SysQuery::value(_request.parmTransactionType()));

                    }

                    else 

                    {

                        qbds.addRange(fieldNum(ULT_allocationDetailsView, WaterTransType)).value(SysQuery::valueNotEmptyString());

                    }



                    queryRun = new QueryRun(query);



                    if (_request.parmPage() !=0)

                    {

                        queryRun.enablePositionPaging(true);

                        queryRun.addPageRange(_request.parmPage(), _request.parmLimit());

                    }



                    while (queryRun.next())

                    {

                        allocationDetailsView =  queryRun.get(tableNum(ULT_AllocationDetailsView));

                        ULT_HistoryResponseLineContract  lineResponse = new  ULT_HistoryResponseLineContract();

                       

                        select firstonly generalJournalAccountEntry

                            where generalJournalAccountEntry.RecId == allocationDetailsView.GJAERecId;

                        

                        finTagConfiguration         finTagConfiguration;

                        FinTagColumnNameValueView   finTagColumnNameValueView;





                        select firstonly FinTagColumnName, RecId from finTagConfiguration

                            where finTagConfiguration.TagName ==  ULT_AllocationTradeConstants::applicationIdConst

                            && finTagConfiguration.Active == noyes::Yes;



                        if (finTagConfiguration.RecId)

                        {

                            select firstonly finTagColumnNameValueView

                                where finTagColumnNameValueView.FinTagColumnName == finTagConfiguration.FinTagColumnName

                                && finTagColumnNameValueView.FinTag ==  generalJournalAccountEntry.FinTag;

                        }



                        lineResponse.parmType(allocationDetailsView.WaterTransType);

                        lineResponse.parmBusinessProcessReferenceId(finTagColumnNameValueView.TagValue);

                        lineResponse.parmTransDate(allocationDetailsView.AccountingDate);

                        lineResponse.parmVoucher(allocationDetailsView.GeneralJournalEntrySubledgerVoucher);

                        lineResponse.parmDescription(allocationDetailsView.Text);

                        lineResponse.parmVolume(allocationDetailsView.AccountingCurrencyAmount);

                        lineResponse.parmRecId(int642Str(allocationDetailsView.GJAERecId));

                        response.parmLines().addEnd(lineResponse);

                        transactionCount++;

                        

                    }

                    

                    allocationAccountBalance =  ULT_AllocationTradeBalance::allocationHistoryBalance(_request.parmAllocationAccount(), _request.parmFromDate(), _request.parmToDate());



                    headerResponse.setResponse(NoYes::Yes, allocationAccountBalance, transactionCount, ULT_AllocationTradeConstants::empty, ULT_AllocationTradeConstants::empty);

                }

            }

        }

        catch (Exception::Deadlock)

        {

            headerResponse.setResponse(NoYes::No, allocationAccountBalance, transactionCount, "@ULTExtension:ULT_DeadLock", "@ULTExtension:ULT_ErrorOccurredInEndpoint");

        }

        catch (Exception::UpdateConflict)

        {

            headerResponse.setResponse(NoYes::No, allocationAccountBalance, transactionCount, "@ULTExtension:ULT_UpdateConflict", "@ULTExtension:ULT_ErrorOccurredInEndpoint");

        }

        catch(Exception::DuplicateKeyException)

        {

            headerResponse.setResponse(NoYes::No, allocationAccountBalance, transactionCount, "@ULTExtension:ULT_DuplicateKeyException", "@ULTExtension:ULT_ErrorOccurredInEndpoint");

        }

        catch(Exception::CLRError)

        {

            System.Exception ex = CLRInterop::getLastException();

            headerResponse.setResponse(NoYes::No, allocationAccountBalance, transactionCount, "@ULTExtension:ULT_CLRInterop", ex.Message);

        }

        catch

        {

            headerResponse.parmQueryStatus(NoYes::No);

            

            if (!headerResponse.parmErrorType())

            {

                headerResponse.setResponse(NoYes::No, allocationAccountBalance, transactionCount, enum2Str(Exception::Error), ULT_ResponseErrorLog::getErrorMessage());

            }

        }

        response.parmHeader(headerResponse);



        return response;

    }

    private boolean requestIsNotEmpty(ULT_HistoryRequestContract _request)

    {

        boolean                  ret;



        try

        {

            if (CompanyInfo::findDataArea(_request.parmLegalEntity())   &&

                _request.parmAllocationAccount()                        &&

                _request.parmFromDate()                                 &&

                _request.parmToDate())

            {

                changecompany(_request.parmLegalEntity())

                {

                    if (!this.validateDimensions(ULT_AllocationTradeConstants::allocationAccountConst,  _request.parmAllocationAccount()))

                    {

                        missingPayloadfields = (!missingPayloadfields) ? "@ULTExtension:ULT_AllocationAccount" : missingPayloadfields + ULT_AllocationTradeConstants::separator + "@ULTExtension:ULT_AllocationAccount";

                        errorDescription     = (!errorDescription) ? "@ULTExtension:ULT_AllocationAccount" + ULT_AllocationTradeConstants::empty+  _request.parmAllocationAccount():

                        errorDescription + ULT_AllocationTradeConstants::separator + "@ULTExtension:ULT_AllocationAccount" + ULT_AllocationTradeConstants::empty+

                        _request.parmAllocationAccount();

                        i++;

                    }

                      

                    if (_request.parmSortBy() != enum2int(ULT_SortBy::DateNewToOld) && _request.parmSortBy() != enum2int(ULT_SortBy::DateOldToNew) &&

                        _request.parmSortBy() != enum2int(ULT_SortBy::VolumeLowToHigh) && _request.parmSortBy() != enum2int(ULT_SortBy::VolumeHighToLow) &&

                        _request.parmSortBy() != enum2int(ULT_SortBy::TransactionTypeAToZ) && _request.parmSortBy() != enum2int(ULT_SortBy::TransactionTypeZToA) &&

                        _request.parmSortBy() != enum2int(ULT_SortBy::None))

                    {

                        missingPayloadfields = (!missingPayloadfields) ? "@ULTExtension:ULT_SortBy" : missingPayloadfields + ULT_AllocationTradeConstants::separator + "@ULTExtension:ULT_SortBy";

                        errorDescription     = (!errorDescription) ? "@ULTExtension:ULT_SortBy" + ULT_AllocationTradeConstants::empty+  int2Str(_request.parmSortBy()):

                                                errorDescription + ULT_AllocationTradeConstants::separator + "@ULTExtension:ULT_SortBy" + ULT_AllocationTradeConstants::empty+

                                                int2Str(_request.parmSortBy());

                        i++;

                    }



                    if (_request.parmTransactionType())

                    {

                        ULT_WaterTransTypeTable   WaterTransTypeTable;

                    

                        select firstonly WaterTransTypeTable

                            where WaterTransTypeTable.TransType == _request.parmTransactionType();

                        if (!WaterTransTypeTable.RecId)

                        {

                            missingPayloadfields = (!missingPayloadfields) ? "@ULTExtension:ULT_WaterTransType" : missingPayloadfields + ULT_AllocationTradeConstants::separator + "@ULTExtension:ULT_WaterTransType";

                            errorDescription     = (!errorDescription) ? "@ULTExtension:ULT_WaterTransType" + ULT_AllocationTradeConstants::empty+  _request.parmTransactionType():

                                                errorDescription + ULT_AllocationTradeConstants::separator + "@ULTExtension:ULT_WaterTransType" + ULT_AllocationTradeConstants::empty+

                                                _request.parmTransactionType();

                            i++;

                        }

                    }

                }



                if (i == 1)

                {

                    errorDescription  =  (!errorDateDescriptions) ? errorDescription + ULT_AllocationTradeConstants::empty +

                                        ULT_AllocationTradeConstants::doesNotExistConst : errorDateDescriptions;

                    headerResponse.setResponse(NoYes::No, allocationAccountBalance, transactionCount, missingPayloadfields,

                                        strReplace(errorDescription, ULT_AllocationTradeConstants::semiColonConst, ULT_AllocationTradeConstants::commaConst));

                }

                else if (i > 1)

                {

                    errorDescription = (!errorDateDescriptions) ? errorDescription + ULT_AllocationTradeConstants::empty + ULT_AllocationTradeConstants::doNotExistConst :

                                    errorDescription + ULT_AllocationTradeConstants::empty + ULT_AllocationTradeConstants::doNotExistConst +

                                    ULT_AllocationTradeConstants::separator + errorDateDescriptions;



                    headerResponse.setResponse(NoYes::No, allocationAccountBalance, transactionCount, missingPayloadfields ,

                                    strReplace(errorDescription, ULT_AllocationTradeConstants::semiColonConst, ULT_AllocationTradeConstants::commaConst));

                }

                else

                {

                    if (_request.parmPage() >0 &&  _request.parmLimit() <=0)

                    {

                        headerResponse.setResponse(NoYes::No, allocationAccountBalance, transactionCount, "@ULTExtension:ULT_LIMIT", "@ULTExtension:ULT_LimitValid");

                        i++;

                    }

                    if (_request.parmToDate() < _request.parmFromDate())

                    {

                        headerResponse.setResponse(NoYes::No, allocationAccountBalance, transactionCount, "@ULTExtension:ULT_FromDateAndToDate", "@SYS16982");

                        i++;

                    }

                    else

                    {

                        ret = true;

                    }

                }

            }

            else

            {

                if (!_request.parmLegalEntity())

                {

                    missingPayloadfields = "@ULTExtension:ULT_LegalEntity";

                    i++;

                }

                else if (!CompanyInfo::findDataArea(_request.parmLegalEntity()))

                {

                    missingPayloadfields = "@ULTExtension:ULT_LegalEntity";

                    errorDescription     = missingPayloadfields + ULT_AllocationTradeConstants::empty+ _request.parmLegalEntity() +

                                        ULT_AllocationTradeConstants::empty + ULT_AllocationTradeConstants::doesNotExistConst;

                    i++;

                }

                

                if (!_request.parmAllocationAccount() && !errorDescription)

                {

                    missingPayloadfields = (!missingPayloadfields) ? "@ULTExtension:ULT_AllocationAccount" : missingPayloadfields + ULT_AllocationTradeConstants::separator + "@ULTExtension:ULT_AllocationAccount";

                    i++;

                }



                if (!_request.parmFromDate() && !errorDescription)

                {

                    missingPayloadfields = (!missingPayloadfields) ? "@SYS24050" : missingPayloadfields + ULT_AllocationTradeConstants::separator + "@SYS24050";

                    i++;

                }



                if (!_request.parmToDate() && !errorDescription)

                {

                    missingPayloadfields = (!missingPayloadfields) ? "@SYS80662" : missingPayloadfields + ULT_AllocationTradeConstants::separator + "@SYS80662";

                    i++;

                }



                errortype = missingPayloadfields;



                if (i == 1)

                {

                    missingPayloadfields =  (errorDescription) ? errorDescription: missingPayloadfields + ULT_AllocationTradeConstants::empty +   ULT_AllocationTradeConstants::isMandatoryConst;

                    

                    headerResponse.setResponse(NoYes::No, allocationAccountBalance, transactionCount, errortype,

                                        strReplace(missingPayloadfields,ULT_AllocationTradeConstants::semiColonConst, ULT_AllocationTradeConstants::commaConst));

                }

                else

                {

                    missingPayloadfields = (errorDescription) ? errorDescription : missingPayloadfields + ULT_AllocationTradeConstants::empty + ULT_AllocationTradeConstants::areMandatoryConst;

                    headerResponse.setResponse(NoYes::No, allocationAccountBalance, transactionCount, errortype,

                                      strReplace(missingPayloadfields,ULT_AllocationTradeConstants::semiColonConst, ULT_AllocationTradeConstants::commaConst));

                }

                ret = false;

            }

        }

        catch

        {

            headerResponse.parmQueryStatus(NoYes::No);

        }

        return ret;

    }

    public RefRecId validateDimensions(Name _dimensionAttributeName, str _displayValue)

    {

        DimensionAttribute              dimensionAttribute;

        RecId                           dimFinancialCategoryRecid;

        DimensionFinancialTag           dimensionFinancialTag;

        dimensionAttribute = DimensionAttribute::findByName(_dimensionAttributeName);

        dimFinancialCategoryRecid = dimensionAttribute.financialTagCategory();

        select firstonly RecId from dimensionFinancialTag

            where dimensionFinancialTag.FinancialTagCategory == dimFinancialCategoryRecid

                && dimensionFinancialTag.Value == _displayValue;

        return dimensionFinancialTag.RecId;

    }

}

Tuesday, 22 February 2022

List value get from Json in D365 F&O

Public static void createAddresses(RefRecId _partyRecId, List _list)

{

ListEnumerator electronicAddressEnumerator;

        str getJsonValue(Newtonsoft.Json.Linq.JObject jsObject, str propName)

      {

const str EmptyValue = '';

if(jsObject != null && jsObject.HasValues)

{

Newtonsoft.Json.Linq.JToken jToken = jsObject.get_Item(propName);

return jToken ? jToken.ToString() : EmptyValue;

}

return null;

      }

electronicAddressEnumerator = _list.getEnumerator();

while (electronicAddressEnumerator.moveNext())

{

Newtonsoft.Json.Linq.JObject electronicAddEnum = electronicAddressEnumerator.current();

this.Description  = getJsonValue(electronicAddEnum, 'Description');

}

}

Monday, 7 February 2022

Custom service using JSON string type in D365 F&O

[DataContract]
class JSONContract
{
    String50 parmFirst, parmSecond;
    List     lines = new  List (types::Class);
    [
        DataMemberAttribute('parmFirst')
    ]
    public String50 parmFirst(String50 _parmFirst = parmFirst)
    {
        parmFirst = _parmFirst;
        return parmFirst;
    }

    [
        DataMemberAttribute('parmSecond')
    ]
    public String50 parmSecond(String50 _parmSecond = parmSecond)
    {
        parmSecond = _parmSecond;
        return parmSecond;
    }

    [DataMemberAttribute('lines'),
    DataCollectionattribute(types::class, classstr(JSONLineContract))]
    public List parmLines(List _lines = lines)
    {
        lines = _lines;
        return lines;
    }

}

[DataContract]
class JSONLineContract
{
    String50 parmFirst, parmSecond;
    [
        DataMemberAttribute('parmFirst')
    ]
    public String50 parmFirst(String50 _parmFirst = parmFirst)
    {
        parmFirst = _parmFirst;
        return parmFirst;
    }

    [
        DataMemberAttribute('parmSecond')
    ]
    public String50 parmSecond(String50 _parmSecond = parmSecond)
    {
        parmSecond = _parmSecond;
        return parmSecond;
    }

}

class ReadJson
{
    public static void main(Args _args)
    {
        str json;
        List values = new List(Types::Class);
  List valuesLines = new List(Types::Class);
        ListEnumerator value,valueLines;
        json = '[{"FieldValues": [{"parmFirst": "ValueFirst", "parmSecond": "ValueSecond", "lines":[{"parmFirst": "ValueFirst1", "parmSecond": "ValueSecond1"},{"parmFirst": "ValueFirst2", "parmSecond": "ValueSecond2"}] }]}]';

        values = FormJsonSerializer::deserializeCollection(classnum(List), json, Types::Class, classStr(JSONContract));
        value = values.getEnumerator();
        while(value.moveNext())
        {
            JSONContract JSONContractCurrent = value.current();
            info(strfmt('%1',JSONContractCurrent.parmFirst(), JSONContractCurrent.parmSecond()));

            valuesLines = JSONContractCurrent.parmLines();
valueLines = valuesLines.getEnumerator();
            while(valueLines.moveNext())
            {
JSONLineContract JSONLineContractCurrent = valueLines.current();
info(strfmt('%1',JSONLineContractCurrent.parmFirst(), JSONLineContractCurrent.parmSecond()));
}
        }
    }

}

validate offsetLedgerDimension in d365 FO

 /// <summary> /// This class is used to validate offsetLedgerDimension /// </summary> class PNG_InventMovValidateOffsetLedgerDi...