Friday, January 24, 2020

How to get financial dimension values of Customers with the help of Accounting Structure using x++ in D365 FO


Hi all ,


In my last post we used the names of financial dimensions in order to get the values from Customer Master.


In this post we will see how this can be achieved by using the name of the Accounting Structure configured to be used by the customer master.

Let's see how do we do it :-

class CalculateFinancialDimensionWActStruct
{
    public  Str1260 calculatefinancialdim(CustTable _custtable)
    {
        List                                                                                       dimensionAttributeList;
        ListEnumerator                                                                    listEnumerator;
        DimensionAttributeSetItem                                                 dimAttrSetItem;
        DimensionAttribute                                                             dimAttr;
        DimensionEnumeration                                                       dimensionSetId;
        DimensionService                                                                dimensionService;
        DimensionContract                                                              dimensionContract;
        AccountStructureContract                                                    accountStructureContract;
        Str1260                                                                                 dimvalue ;
        DefaultDimensionView                                                        defaultDimensionViewitem;

        dimensionSetId = DimensionCache::getDimensionAttributeSetForLedger();

        dimensionService = new dimensionService();

        accountStructureContract = new AccountStructureContract();
        accountStructureContract.parmName("RevenueDim");

        dimensionAttributeList = dimensionService.getDimensions(accountStructureContract);
     
        listEnumerator = dimensionAttributeList.getEnumerator();

        while (listEnumerator.moveNext())
        {
            dimensionContract = listEnumerator.current();

            select dimAttr
            join RecId from dimAttrSetItem
            where dimAttrSetItem.DimensionAttribute == dimAttr.RecId &&
                dimAttrSetItem.DimensionAttributeSet == dimensionSetId
                && dimAttr.Name==dimensionContract.parmDimensionName();

            select firstonly defaultDimensionViewitem
                where defaultDimensionViewitem.DefaultDimension ==  _custtable.DefaultDimension
                    && defaultDimensionViewitem.Name ==dimAttr.Name;

            if (defaultDimensionViewitem.RecId)
            {
                dimvalue += '-'+defaultDimensionViewitem.DisplayValue ;
            }
            else
            {
                dimvalue += '-' ;
            }
            defaultDimensionViewitem.clear();
         
        }
        return dimvalue;
    }

Happy Coding !!!

How to get financial dimension values of Customers without the use of Accounting Structure using x++ in D365 FO


Hi all ,


One of the most important requirements in D365 FO Projects is to get the financial dimension values and display it at various places.

In this scenario we are using the names of the specific Financial Dimensions.

Please take a look at the code written below :-


class CalculateFinancialDimension
{
 

    /// <summary>
    /// Return financial dimension values
    /// </summary>
    public  Str1260 calculatefinancialdim(CustTable _custtable)
    {
        Str1260                             dimvalue ;
        DefaultDimensionView    defaultDimensionViewitem;

        select firstonly defaultDimensionViewitem
                where defaultDimensionViewitem.DefaultDimension ==  _custtable.DefaultDimension
                    && defaultDimensionViewitem.Name =='Dim1';

        if (defaultDimensionViewitem.RecId)
        {
            dimvalue += defaultDimensionViewitem.DisplayValue ;
        }
        else
        {
            dimvalue += '-' ;
        }

        defaultDimensionViewitem.clear() ;

        select firstonly defaultDimensionViewitem
                where defaultDimensionViewitem.DefaultDimension ==  _custtable.DefaultDimension
                    && defaultDimensionViewitem.Name == 'Dim2';
        if(defaultDimensionViewitem.RecId)
        {
            dimvalue += '-'+defaultDimensionViewitem.DisplayValue ;
        }
        else
        {
            dimvalue += '-' ;
        }

        defaultDimensionViewitem.clear() ;
        select firstonly defaultDimensionViewitem
                where defaultDimensionViewitem.DefaultDimension ==  _custtable.DefaultDimension
                    && defaultDimensionViewitem.Name == 'Dim3';

        if  (defaultDimensionViewitem.RecId)
        {
            dimvalue += '-'+defaultDimensionViewitem.DisplayValue ;
        }
        else
        {
            dimvalue += '-' ;
        }

        defaultDimensionViewitem.clear() ;
        select firstonly defaultDimensionViewitem
                where defaultDimensionViewitem.DefaultDimension ==  _custtable.DefaultDimension
                    && defaultDimensionViewitem.Name == 'Dim4';

        if  (defaultDimensionViewitem.RecId)
        {
            dimvalue += '-'+defaultDimensionViewitem.DisplayValue ;
        }
        else
        {
            dimvalue += '-' ;
        }

        defaultDimensionViewitem.clear() ;
        select firstonly defaultDimensionViewitem
                where defaultDimensionViewitem.DefaultDimension ==  _custtable.DefaultDimension
                    && defaultDimensionViewitem.Name == 'Dim5';

        if  (defaultDimensionViewitem.RecId)
        {
            dimvalue += '-'+defaultDimensionViewitem.DisplayValue ;
        }
        else
        {
            dimvalue += '-' ;
        }

        defaultDimensionViewitem.clear() ;
        select firstonly defaultDimensionViewitem
                where defaultDimensionViewitem.DefaultDimension ==  _custtable.DefaultDimension
                    && defaultDimensionViewitem.Name == 'Dim6';

        if  (defaultDimensionViewitem.RecId)
        {
            dimvalue += '-'+defaultDimensionViewitem.DisplayValue ;
        }
        else
        {
            dimvalue += '-' ;
        }

        defaultDimensionViewitem.clear() ;
        select firstonly defaultDimensionViewitem
                where defaultDimensionViewitem.DefaultDimension ==  _custtable.DefaultDimension
                    && defaultDimensionViewitem.Name == 'Dim7';

        if  (defaultDimensionViewitem.RecId)
        {
            dimvalue += '-'+defaultDimensionViewitem.DisplayValue ;
        }
        else
        {
            dimvalue += '-' ;
        }
        return dimvalue ;
    }

}


Thursday, January 23, 2020

How to create a batch job for Runbase Class using x++ in D365 FO

Hi all ,

Either we can manually create the record in Batch Job Master in System Administration Module or we can create the same directly using x++.

Please view the code below written in a Runnable Class :-


    public static void main(Args _args)
    {
        BatchHeader                batHeader;
        BatchInfo                     batInfo;
        RunBaseBatch             rbbTask;
     
        str sParmCaption = "Free Text Invoice Creation Batch Job";

        rbbTask = new FreeTextInvoiceCreationBatchJob();
        batInfo = rbbTask .batchInfo();
        batInfo.parmCaption(sParmCaption);
        batInfo.parmGroupId("");
        batHeader = BatchHeader::construct();
        batHeader.addTask(rbbTask);
        batHeader.save();
        info(strFmt("%1 batch has been scheduled.", sParmCaption));
    }

    Happy Coding !!!

Monday, November 25, 2019

How to merge Default Dimensions for Masters using x++ in D365 FO


Most of the times we get a requirement where we need to merge the dimensions from two areas in a single master.

For e.g In Sales Order Line the dimensions get populated from header but as soon as we select the Item Id the default financial dimensions are updated from Item Master and overrides the Sales Line Dimensions.

In order to achieve this merging from code we can use the below code in a data entity :-


        SalesTable                                             salestablefetch;
        SalesLine                                              saleslineupdate;
        CustTable                                              custtable;
        Str1260                                                 dimensionvalue;
        InventTable                                           inventTable;
        InvFinancialDimensions                       dimension = new InvFinancialDimensions() ;
        DimensionDefault                     defaultDimension,itemDefaultDimension,custDefaultDimension;

            select salestablefetch where salestablefetch.SalesId == this.SalesOrderNumber;
       
       
            inventTable = InventTable::find(this.ItemNumber);
            custtable = CustTable::find(salestablefetch.CustAccount) ;
           
           
           itemDefaultDimension    =   InventTable::find(inventTable.ItemId).DefaultDimension;
           custDefaultDimension    =   CustTable::find(custtable.AccountNum).DefaultDimension;
                             
        defaultDimension  = DimensionDefaultFacade::serviceMergeDefaultDimensions
                                                                  (custDefaultDimension,itemDefaultDimension);

        while select forupdate saleslineupdate
            where saleslineupdate.SalesId == this.SalesOrderNumber && saleslineupdate.ItemId ==                                                                            this.ItemNumber
        {

            if(saleslineupdate)
            {
                ttsbegin;
                saleslineupdate.DefaultDimension =  defaultDimension;
                saleslineupdate.update();
                ttscommit;
            }

How to get or update values from Account Structure into the Default Financial Dimensions using x++ in D365 FO


Most of the times in our D365 Fin Ops Projects we get a requirement to fetch the dimension values from the Standard Account Structure for value updation in the respective masters through a normal button click event or insert() event handler in Data Entity .

Using the below logic we can easily accomplish our goal of doing the same :-

class CalculateFinancialDimensions
{
    public  Str1260 calculatefinancialdim(CustTable _custtable)
    {
        List                                             dimensionAttributeList;
        ListEnumerator                          listEnumerator;
        DimensionAttributeSetItem       dimAttrSetItem;
        DimensionAttribute                   dimAttr;
        DimensionEnumeration             dimensionSetId;
        DimensionService                      dimensionService;
        DimensionContract                    dimensionContract;
        AccountStructureContract         accountStructureContract;
        Str1260                                      dimvalue ;
        DefaultDimensionView             defaultDimensionViewitem;

        dimensionSetId = DimensionCache::getDimensionAttributeSetForLedger();

        dimensionService = new dimensionService();

        accountStructureContract = new AccountStructureContract();
        accountStructureContract.parmName("ABCDim");

        dimensionAttributeList = dimensionService.getDimensions(accountStructureContract);
     
        listEnumerator = dimensionAttributeList.getEnumerator();

        while (listEnumerator.moveNext())
        {
            dimensionContract = listEnumerator.current();

            // The below select statement will fetch only Active Dimensions
            select dimAttr
            join RecId from dimAttrSetItem
            where dimAttrSetItem.DimensionAttribute == dimAttr.RecId &&
                dimAttrSetItem.DimensionAttributeSet == dimensionSetId
                && dimAttr.Name==dimensionContract.parmDimensionName();

            select firstonly defaultDimensionViewitem
                where defaultDimensionViewitem.DefaultDimension ==  _custtable.DefaultDimension
                    && defaultDimensionViewitem.Name ==dimAttr.Name;

            if (defaultDimensionViewitem.RecId)
            {
                dimvalue += '-'+defaultDimensionViewitem.DisplayValue ;
            }
            else
            {
                dimvalue += '-' ;
            }
            defaultDimensionViewitem.clear();
       
        }
        return dimvalue;
    }

}

Monday, August 19, 2019

How to create Vendor Invoice Journal using x++ in D365 FO

Hi folks ,


Very common requirement these days is to create Vendor Invoice Journal through code.

Here is an example mentioned below in which I am picking the values for Vendor invoice creation from a staging table :-

Class Name :- VendInvoiceJournalCreateBatch

        #define.initFromJournal('VINV')
        #define.AEDCurrency('USD')
        #define.EmptyCurrency('')
       
        int                                                                      i;
        str                                                                      invdate , invfinaldate;
        date                                                                   dateheader , dateheaderval , dateline;
        System.DateTime                                             netDttm;
        real                                                                    amountcr;
        utcdatetime                                                       xppDttm , invdatetime;
        SupplierInvoiceHeaderDetails                         vendInvoiceJourStageHeader,                                                                                                                      vendInvoiceJourStageHeaderUpdate;
        SupplierInvoiceLineDetails                                vendInvoiceJourStageLine
                                                                                    , vendInvoiceJourStageLineds;
        LedgerJournalTable                                            journalTable;
        JournalTableData                                                journalTableData;
        LedgerJournalTrans                                            journalTrans;
        container                                                             offsetCon, offsetConLoc , mainAccountCon;
        NumberSeq                                                         numberSeq;
        Voucher                                                               voucher;
        LedgerJournalName                                            ledgerJournalName;
        AccountNum                                                       vendAccount;
        HcmWorker                                                         hcmWorker;
        DirPerson                                                            dirPerson;
        DirPersonUser                                                    dirPersonUser;
        VendInvoiceJournalCreateBatch                        classVend   =   new                                                                                                                                    VendInvoiceJournalCreateBatch();
        MainAccount                                                      mainAccount;
        Voucher                                                               vch;
        DimensionAttributeValueCombination              dimCombination1;
        String255                                                            tmpOffsetAccount, tmpVoucherNo;
        DimensionAttributeValueCombination              dimCombination, dimCombinationLoc;
        NoYes                                                                 newOffsetLine = NoYes::Yes;
        LedgerJournalId                                                 journalId;
        String10                                                              purchId;
       
        i=0;

        while select vendInvoiceJourStageHeader where vendInvoiceJourStageHeader.UpdateFlag == 0
        {
            try
            {
                ledgerJournalName            =   LedgerJournalName::find(#initFromJournal);
                journalTable.initFromLedgerJournalName(#initFromJournal);
                journalTableData            =   JournalTableData::newTable(journalTable);
                journalTable.JournalNum     =   journalTableData.nextJournalId();
                journalTable.CurrencyCode   =   #AEDCurrency;
                if (journalTable.validateWrite())
                {
                    journalTable.insert();
                }

                journalId = journalTable.JournalNum;

                select count(RecId) from vendInvoiceJourStageLineds where vendInvoiceJourStageLineds.DocumentRef  ==  vendInvoiceJourStageHeader.Docref;

                while select vendInvoiceJourStageLine order by OffsetAccount desc
                    where vendInvoiceJourStageLine.DocumentRef  ==  vendInvoiceJourStageHeader.Docref
                {
                    amountcr= 0.00;
                    tmpOffsetAccount    = vendInvoiceJourStageLine.OffsetAccount;
                    tmpVoucherNo        = vendInvoiceJourStageLine.VoucherNo;

                    select dirPersonUser where dirpersonuser.User==curUserId();

                    select dirPerson where dirPerson.RecId == dirPersonUser.PersonParty;

                    select hcmWorker where hcmWorker.Person == dirPerson.RecId;

                    select  dimCombination where dimCombination.DisplayValue    ==  vendInvoiceJourStageHeader.Vendor;

                    select  dimCombinationLoc where dimCombinationLoc.DisplayValue    ==  vendInvoiceJourStageLine.OffsetAccount;
                   
                    offsetCon                           =   [vendInvoiceJourStageLine.Ledger,vendInvoiceJourStageLine.Region,vendInvoiceJourStageLine.LOB,vendInvoiceJourStageLine.Department,vendInvoiceJourStageLine.BIN,vendInvoiceJourStageLine.Contract];
                    offsetConLoc                        =   [vendInvoiceJourStageLine.OffsetAccount,vendInvoiceJourStageLine.Region,vendInvoiceJourStageLine.LOB,vendInvoiceJourStageLine.Department,vendInvoiceJourStageLine.BIN,vendInvoiceJourStageLine.Contract];

                    numberSeq                           =   NumberSeq::newGetVoucherFromId(journalTable.NumberSequenceTable, true);

                    if(vendInvoiceJourStageLine.OffsetAccount != '')
                    {
                        select  dimCombination where dimCombination.DisplayValue    ==  vendInvoiceJourStageLine.Ledger;
                        offsetConLoc                           =   [vendInvoiceJourStageLine.OffsetAccount,vendInvoiceJourStageLine.Region,vendInvoiceJourStageLine.LOB,vendInvoiceJourStageLine.Department,vendInvoiceJourStageLine.BIN,vendInvoiceJourStageLine.Contract];

                        journalTrans.JournalNum             =   journalTable.JournalNum;
                        journalTrans.Voucher                =   numberSeq.voucher();
                        journalTrans.Invoice                =   vendInvoiceJourStageHeader.InvoiceNumber;
                        journalTrans.Txt                    =   vendInvoiceJourStageHeader.InvoiceDescription;
                        invdatetime = DateTimeUtil::anyToDateTime(vendInvoiceJourStageHeader.InvoiceDate);

                        dateheader = DateTimeUtil::date(invdatetime);

                        invdate = date2Str(dateheader,321,DateDay::Digits2,DateSeparator::Slash,DateMonth::Digits2,DateSeparator::Hyphen,DateYear::Digits4);
       
                        dateheaderval = str2Date(invdate,321);

                        journalTrans.INTC_InvDate = dateheaderval;
                        journalTrans.DocumentDate = str2Date(vendInvoiceJourStageHeader.InvoiceReceivedDate,321);
                        journalTrans.TransDate              =   today();//str2Date(journalDeatils.TransactionDate, 123);
                        journalTrans.AccountType            =   LedgerJournalACType::Ledger;
                        //journalTrans.LedgerDimension        =   dimCombination.RecId;
                        journalTrans.LedgerDimension        =   classVend.generateLedgerDimension(offsetCon, vendInvoiceJourStageLine.Ledger);
                        //journalTrans.AmountCurCredit        =   vendInvoiceJourStageLine.InvoiceAmount;
                        journalTrans.AmountCurDebit         =   vendInvoiceJourStageLine.InvoiceAmount;
                        journalTrans.AmountCurCredit         = 0.00;
                        journalTrans.OffsetAccountType      =   LedgerJournalACType::Ledger;
                        //journalTrans.OffsetLedgerDimension  =   classVend.generateLedgerDimension(offsetCon, vendInvoiceJourStageLine.Ledger);
                        //journalTrans.OffsetLedgerDimension  =   dimCombinationLoc.RecId;
                        journalTrans.OffsetLedgerDimension  =   classVend.generateLedgerDimension(offsetConLoc, vendInvoiceJourStageLine.OffsetAccount);
                        journalTrans.INTC_DocumentRef       =   vendInvoiceJourStageLine.DocumentRef;

                        if(vendInvoiceJourStageLine.Currency  ==  #EmptyCurrency)
                        {
                            journalTrans.CurrencyCode   =   #AEDCurrency;
                        }
                        else
                        {
                            journalTrans.CurrencyCode   =   vendInvoiceJourStageLine.Currency;
                        }

                        journalTrans.ExchRate = Currency::exchRate1(journalTrans.CurrencyCode, journalTrans.TransDate);
                        journalTrans.Approver = hcmWorker.RecId;
                        journalTrans.Approved =NoYes::Yes;
                        journalTrans.PostingProfile = "General";
                        journalTrans.INTC_PurchId       =   vendInvoiceJourStageLine.PONo;
                        journalTrans.TransactionType = LedgerTransType::Vend;
                        journalTrans.INTC_WorkOrderId   =   vendInvoiceJourStageLine.WorkOrderNo;
                        journalTrans.INTC_Qty           =   vendInvoiceJourStageLine.Qty;
                        journalTrans.Payment = vendInvoiceJourStageLine.PaymentTerms;
                        journalTrans.insert();

                        //======================
                        numberSeq.used();
                        //======================
                    }
                    else
                    {
                        select  dimCombination where dimCombination.DisplayValue    ==  vendInvoiceJourStageLine.Ledger;
                        select  dimCombinationLoc where dimCombinationLoc.DisplayValue    ==  vendInvoiceJourStageLine.OffsetAccount;

                        offsetCon                           =   [vendInvoiceJourStageLine.Ledger,vendInvoiceJourStageLine.Region,vendInvoiceJourStageLine.LOB,vendInvoiceJourStageLine.Department,vendInvoiceJourStageLine.BIN,vendInvoiceJourStageLine.Contract];
                        if(vendInvoiceJourStageLine.OffsetAccount != '')
                        {
                            offsetConLoc                           =   [vendInvoiceJourStageLine.OffsetAccount,vendInvoiceJourStageLine.Region,vendInvoiceJourStageLine.LOB,vendInvoiceJourStageLine.Department,vendInvoiceJourStageLine.BIN,vendInvoiceJourStageLine.Contract];
                        }
                        journalTrans.JournalNum             =   journalTable.JournalNum;

                        if(newOffsetLine == NoYes::Yes)
                        {
                            numberSeq                   = NumberSeq::newGetVoucherFromId(journalTable.NumberSequenceTable, true);
                            journalTrans.Voucher        = numberSeq.voucher();
                            vch                         = journalTrans.Voucher;
                            newOffsetLine               = NoYes::No;
                        }
                        else
                        {
                            journalTrans.Voucher        = vch;
                        }

                        purchId = vendInvoiceJourStageLine.POLineNum;

                        amountcr+=vendInvoiceJourStageLine.InvoiceAmount;
                        journalTrans.Invoice            =   vendInvoiceJourStageHeader.InvoiceNumber;
                        journalTrans.Txt                 =   vendInvoiceJourStageHeader.InvoiceDescription;
                        invdatetime                     = DateTimeUtil::anyToDateTime(vendInvoiceJourStageHeader.InvoiceDate);

                        dateheader = DateTimeUtil::date(invdatetime);

                        invdate = date2Str(dateheader,321,DateDay::Digits2,DateSeparator::Slash,DateMonth::Digits2,DateSeparator::Hyphen,DateYear::Digits4);
       
                        dateheaderval = str2Date(invdate,321);

                        journalTrans.INTC_InvDate = dateheaderval;
                        journalTrans.DocumentDate = str2Date(vendInvoiceJourStageHeader.InvoiceReceivedDate,321);
                        journalTrans.TransDate              =   today();//str2Date(journalDeatils.TransactionDate, 123);
                        journalTrans.AccountType            =   LedgerJournalACType::Ledger;
                        //journalTrans.LedgerDimension        =   dimCombination.RecId;
                        journalTrans.LedgerDimension        =   classVend.generateLedgerDimension(offsetCon, vendInvoiceJourStageLine.Ledger);
                        //journalTrans.AmountCurCredit        =   vendInvoiceJourStageLine.InvoiceAmount;
                        journalTrans.AmountCurDebit         =   vendInvoiceJourStageLine.InvoiceAmount;
                        journalTrans.AmountCurCredit         = 0.00;
                        journalTrans.OffsetAccountType      =   LedgerJournalACType::Ledger;
                        //journalTrans.OffsetLedgerDimension  =   classVend.generateLedgerDimension(offsetCon, vendInvoiceJourStageLine.Ledger);

                        if(vendInvoiceJourStageLine.OffsetAccount == '')
                        {
                            journalTrans.OffsetLedgerDimension  =   dimCombinationLoc.RecId;
                        }
                        else
                        {
                            journalTrans.OffsetLedgerDimension  =   classVend.generateLedgerDimension(offsetConLoc, vendInvoiceJourStageLine.OffsetAccount);
                        }

                        journalTrans.INTC_DocumentRef       =   vendInvoiceJourStageLine.DocumentRef;
                        if(vendInvoiceJourStageLine.Currency  ==  #EmptyCurrency)
                        {
                            journalTrans.CurrencyCode   =   #AEDCurrency;
                        }
                        else
                        {
                            journalTrans.CurrencyCode   =   vendInvoiceJourStageLine.Currency;
                        }
                        journalTrans.ExchRate = Currency::exchRate1(journalTrans.CurrencyCode, journalTrans.TransDate);
                        journalTrans.Approver = hcmWorker.RecId;
                        journalTrans.Approved =NoYes::Yes;
                        journalTrans.PostingProfile = "General";
                        journalTrans.INTC_PurchId       =   vendInvoiceJourStageLine.PONo;
                        journalTrans.TransactionType = LedgerTransType::Vend;
                        journalTrans.INTC_WorkOrderId   =   vendInvoiceJourStageLine.WorkOrderNo;
                        journalTrans.INTC_Qty           =   vendInvoiceJourStageLine.Qty;
                        journalTrans.Payment = vendInvoiceJourStageLine.PaymentTerms;
                        journalTrans.insert();

                        //======================
                        numberSeq.used();
                        //======================
                    }
                }

                select dirPersonUser where dirpersonuser.User==curUserId();

                select dirPerson where dirPerson.RecId == dirPersonUser.PersonParty;

                select hcmWorker where hcmWorker.Person == dirPerson.RecId;

                select  dimCombination1 where dimCombination1.DisplayValue    ==  vendInvoiceJourStageHeader.Vendor;
                offsetCon                           =   [vendInvoiceJourStageHeader.Vendor,vendInvoiceJourStageLine.Region,vendInvoiceJourStageLine.LOB,vendInvoiceJourStageLine.Department,vendInvoiceJourStageLine.BIN,vendInvoiceJourStageLine.Contract];
                numberSeq                           =   NumberSeq::newGetVoucherFromId(journalTable.NumberSequenceTable, true);

                //journalTrans.JournalNum             =   journalTable.JournalNum;
                journalTrans.JournalNum             =   journalId;

                journalTrans.Voucher                =   vch;

                vch = journalTrans.Voucher;

                journalTrans.Invoice                =   vendInvoiceJourStageHeader.InvoiceNumber;
                journalTrans.Txt                    =   vendInvoiceJourStageHeader.InvoiceDescription;
                invdatetime = DateTimeUtil::anyToDateTime(vendInvoiceJourStageHeader.InvoiceDate);

                dateheader = DateTimeUtil::date(invdatetime);

                invdate = date2Str(dateheader,321,DateDay::Digits2,DateSeparator::Slash,DateMonth::Digits2,DateSeparator::Hyphen,DateYear::Digits4);
       
                dateheaderval = str2Date(invdate,321);

                journalTrans.INTC_InvDate = dateheaderval;
                journalTrans.DocumentDate = str2Date(vendInvoiceJourStageHeader.InvoiceReceivedDate,321);
                journalTrans.TransDate              =   today();//str2Date(journalDeatils.TransactionDate, 123);
                journalTrans.AccountType            =   LedgerJournalACType::Vend;
                journalTrans.LedgerDimension        =   dimCombination1.RecId;
                //journalTrans.LedgerDimension        =   classVend.generateLedgerDimension(offsetCon, vendInvoiceJourStageHeader.Vendor);
                journalTrans.AmountCurDebit         =   0.00;
                journalTrans.AmountCurCredit        =   amountcr;
                journalTrans.OffsetAccountType      =   LedgerJournalACType::Ledger;
                //journalTrans.OffsetLedgerDimension  =   classVend.generateLedgerDimension(offsetCon, vendInvoiceJourStageLine.Ledger);
                //journalTrans.OffsetLedgerDimension  =   dimCombinationLoc.RecId;

                if(vendInvoiceJourStageLine.OffsetAccount == '')
                {
                    journalTrans.OffsetLedgerDimension  =   dimCombinationLoc.RecId;
                }
                else
                {
                    journalTrans.OffsetLedgerDimension  =   classVend.generateLedgerDimension(offsetConLoc, vendInvoiceJourStageLine.OffsetAccount);
                }
               
                journalTrans.INTC_DocumentRef       =   vendInvoiceJourStageHeader.Docref;
               
                if(vendInvoiceJourStageLine.Currency  ==  #EmptyCurrency)
                {
                    journalTrans.CurrencyCode   =   #AEDCurrency;
                }
                else
                {
                    journalTrans.CurrencyCode   =   vendInvoiceJourStageLine.Currency;
                }
                journalTrans.ExchRate = Currency::exchRate1(journalTrans.CurrencyCode, journalTrans.TransDate);
                journalTrans.Approver = hcmWorker.RecId;
                journalTrans.Approved =NoYes::Yes;
                journalTrans.PostingProfile = "General";
                journalTrans.INTC_PurchId       =   vendInvoiceJourStageLine.PONo;
                journalTrans.TransactionType = LedgerTransType::Vend;
                journalTrans.INTC_WorkOrderId   =   vendInvoiceJourStageLine.WorkOrderNo;
                journalTrans.INTC_Qty           =   vendInvoiceJourStageLine.Qty;
                journalTrans.Payment = vendInvoiceJourStageLine.PaymentTerms;
                if(amountcr>0)
                {
                    journalTrans.insert();
                }
                ttsbegin;
                select forupdate vendInvoiceJourStageHeaderUpdate where vendInvoiceJourStageHeaderUpdate.RecId    ==    vendInvoiceJourStageHeader.RecId;
                vendInvoiceJourStageHeaderUpdate.UpdateFlag = 1;
                vendInvoiceJourStageHeaderUpdate.update();
                ttscommit;

                //======================
                numberSeq.used();
                //======================
            }
            catch(Exception::Error)
            {
                throw Exception::Error;
            }
        }



public DimensionDynamicAccount   generateLedgerDimension(container    _conData,                                                                                                                          MainAccountNum  _mainAccountNum)
    {
        int                                                               hierarchyCount;
        int                                                               hierarchyIdx;
        RecId                                                          dimAttId_MainAccount;
        LedgerRecId                                              ledgerRecId;
        MainAccount                                             mainAccount;
        RefRecId                                                    recordvalue;
        DimensionAttribute                                   dimensionAttribute;
        DimensionAttributeValue                          dimensionAttributeValue;
        DimensionSetSegmentName                     DimensionSet;
        DimensionStorage                                     dimStorage;
        LedgerAccountContract                            LedgerAccountContract = new                                                                                                                                                          LedgerAccountContract();
        DimensionAttributeValueContract            ValueContract;

        List                                                             valueContracts = new List(Types::Class);
       
         dimensionAttributeValueCombination  dimensionAttributeValueCombination;
     

        mainAccount     =   MainAccount::findByMainAccountId(_mainAccountNum);
        recordvalue     =                                                                                                                                                         DimensionHierarchy::getAccountStructure(mainAccount.RecId,Ledger::current());
        hierarchyCount  =   DimensionHierarchy::getLevelCount(recordvalue);
        DimensionSet    =                                                                                                                                                          DimensionHierarchyLevel::getDimensionHierarchyLevelNames(recordvalue);

        for(hierarchyIdx = 1;hierarchyIdx<=hierarchyCount;hierarchyIdx++)
        {
            if(hierarchyIdx == 1)
            {
                continue;
            }
            dimensionAttribute =                                                                                                                                         DimensionAttribute::findByLocalizedName(DimensionSet[hierarchyIdx],false,"en-us");

            if(dimensionAttribute)
            {
                dimensionAttributeValue =                                                                                                                     DimensionAttributeValue::findByDimensionAttributeAndValue(
                                                         dimensionAttribute,conPeek(_conData,hierarchyIdx));

                if(dimensionAttributeValue)
                {
                    ValueContract = new DimensionAttributeValueContract();
                    ValueContract.parmName(dimensionAttribute.Name) ;
                    ValueContract.parmValue(dimensionAttributeValue.CachedDisplayValue);
                    valueContracts.addEnd(ValueContract);
                }
            }
        }
        LedgerAccountContract.parmMainAccount(_mainAccountNum);
        LedgerAccountContract.parmValues(valueContracts);
        dimStorage                          =    DimensionServiceProvider::buildDimensionStorageForLedgerAccount(LedgerAccountContract);
        dimensionAttributeValueCombination  =    DimensionAttributeValueCombination::find(dimStorage.save());
        ledgerRecId                         =    dimensionAttributeValueCombination.RecId;

        return ledgerRecId;
    }


Happy Coding !!!!

Tuesday, August 13, 2019

How to create or update customers using x++ in D365 FO

Hey folks ,

This code will be helpful where the requirement is either to create or update customers using x++.

In my example I have used this code to pickup the values for customer creation from a staging table.

The code is shown below :-

        #define.CountryRegionId("US")
        CustomerDetails                                 customerDetailsStaging, custMasterupdate;
        LogisticsElectronicAddress                logisticselectronicaddress;
        LogisticsContactInfoView                  logisticsContactInfoView;
        LogisticsPostalAddress                       logisticspostaladdress;
        LogisticsLocation                                logisticslocation;
        CustTable                                             custTable, custTableUpdate, custTableFind;
        DirParty                                                dirParty;
        DirPartyLocation                                  dirPartyLocation;
        DirPartyContactInfoView                    dirPartyContactInfo;
        DirPartyTable                                       dirPartyTable;
        ContactPerson                                       contactperson;
        DirPartyPostalAddressView                 dirPartyPostalAddressView;
        LanguageId                                           languageId      =   CompanyInfo::find().LanguageId;
        LogisticsPostalAddress                         address;
        DirPartyPostalAddressView                 addressView;
        LogisticsLocationRole                          roles;
        TaxVATNumTable                                taxvatnumtableget , taxvatnumtableins;
        DimensionAttributeValue                     dimAttrBINValue,dimAtrContractValue;
        DimensionAttribute                              dimAttrBIN,dimAtrContract;
        DimensionAttributeValueSetStorage   davss;
        RecId                                                    defaultDimension;
                     

     
        while select customerDetailsStaging where customerDetailsStaging.RecId!=0
        {
            custTable = CustTable::find(customerDetailsStaging.CustomerId);
            try
            {
                if(!custTable)
                {
                    davss = DimensionAttributeValueSetStorage::find(
                                 CustTable::find(custTable.AccountNum).DefaultDimension);
                    ttsBegin;
                    custTable.clear();
                    custTable.initValue();
                    custTable.AccountNum                =   customerDetailsStaging.CustomerId;
                    custTable.CustGroup                 =   customerDetailsStaging.CustGroup;
                    custTable.CustClassificationId      =   customerDetailsStaging.CustClassGroup;
                    custTable.VATNum                    =   customerDetailsStaging.TRNNo;
                    custTable.INTC_Emirates             =   customerDetailsStaging.Emirates;
                    custTable.TaxGroup                  =   customerDetailsStaging.VAT;
                    custTable.PaymTermId                =   customerDetailsStaging.PaymentTerms;

                    dimAttrBIN                          =   DimensionAttribute::findByName("BIN");
                    dimAtrContract                      =   DimensionAttribute::findByName("Contract");
                    dimAttrBINValue       =                                   DimensionAttributeValue::findByDimensionAttributeAndValue(
                         dimAttrBIN,                  customerDetailsStaging.BIN, false, true);
                    dimAtrContractValue                 =   DimensionAttributeValue::findByDimensionAttributeAndValue(dimAtrContract, customerDetailsStaging.Contract, false, true);

                    if(dimAttrBINValue || dimAtrContractValue)
                    {
                        davss.addItem(dimAttrBINValue);
                        davss.addItem(dimAtrContractValue);
                        custTable.DefaultDimension = davss.save();
                    }

                    custTable.insert(DirPartyType::Organization, customerDetailsStaging.CustomerName);
                    dirParty = DirParty::constructFromCommon(custTable);
             
                    dirPartyPostalAddressView.Street            =   customerDetailsStaging.Address;
                    dirPartyPostalAddressView.CountryRegionId   =   #CountryRegionId;
                    dirPartyPostalAddressView.IsPrimary         =   NoYes::Yes;

                    dirParty.createOrUpdatePostalAddress(dirPartyPostalAddressView);
                    ttsCommit;

               
                    if(customerDetailsStaging.TRNNo!='0')
                    {
                        select taxvatnumtableget where taxvatnumtableget.CountryRegionId=='ARE'
                            && taxvatnumtableget.VATNum==customerDetailsStaging.TRNNo &&
                            taxvatnumtableget.Name==custTable.name();
                     
                        if(!taxvatnumtableget)
                        {
                            ttsbegin;
                            taxvatnumtableins.CountryRegionId = "ARE";
                            taxvatnumtableins.VATNum = customerDetailsStaging.TRNNo;
                            taxvatnumtableins.Name = custTable.name();
                            taxvatnumtableins.insert();
                            ttscommit;
                        }
                    }

                }

                else if(custTable)
                {
                    dirParty = DirParty::constructFromCommon(custTable);

                    select taxVatNumTablefetch where taxVatNumTablefetch.Name==custTable.name() && taxVatNumTablefetch.VATNum!='0';

                    select forupdate custTableUpdate where custTableUpdate.AccountNum   ==  custTable.AccountNum;
                    {
                        davss = DimensionAttributeValueSetStorage::find(CustTable::find(custTable.AccountNum).DefaultDimension);
                        ttsbegin;
                        custTableUpdate.CustGroup               =   customerDetailsStaging.CustGroup;
                        custTableUpdate.CustClassificationId    =   customerDetailsStaging.CustClassGroup;
                        custTableUpdate.VATNum                  =   customerDetailsStaging.TRNNo;
                        custTableUpdate.INTC_Emirates           =   customerDetailsStaging.Emirates;
                        custTableUpdate.TaxGroup                =   customerDetailsStaging.VAT;
                        custTableUpdate.PaymTermId              =   customerDetailsStaging.PaymentTerms;

                        dimAttrBIN          =   DimensionAttribute::findByName("BIN");
                        dimAtrContract      =   DimensionAttribute::findByName("Contract");
                        dimAttrBINValue     =   DimensionAttributeValue::findByDimensionAttributeAndValue(dimAttrBIN, customerDetailsStaging.BIN, false, true);
                        dimAtrContractValue =   DimensionAttributeValue::findByDimensionAttributeAndValue(dimAtrContract, customerDetailsStaging.Contract, false, true);

                        if(dimAttrBINValue || dimAtrContractValue)
                        {
                            davss.addItem(dimAttrBINValue);
                            davss.addItem(dimAtrContractValue);
                            custTableUpdate.DefaultDimension = davss.save();
                        }
                        custTableUpdate.update();
                        ttscommit;
                    }

                    ttsbegin;
                    while select dirPartyLocation
                        where dirPartyLocation.Party == custTable.Party
                        join dirPartyPostalAddressView
                        where dirPartyPostalAddressView.Location == dirPartyLocation.Location
                        && dirPartyPostalAddressView.Party == dirPartyLocation.Party
                    {
                        dirPartyPostalAddressView.Street            =   customerDetailsStaging.Address;
                        dirPartyPostalAddressView.CountryRegionId   =   #CountryRegionId;
                        dirPartyPostalAddressView.IsPrimary         =   NoYes::Yes;
                        dirParty.createOrUpdatePostalAddress(dirPartyPostalAddressView);
                    }

                    if(!dirPartyLocation)
                    {
                        address.Street          =   customerDetailsStaging.Address;
                        address.CountryRegionId =   #CountryRegionId;

                        addressView.Party       =   custtable.Party;
                        addressView.IsPrimary   =   NoYes::Yes;
                        addressview.initFromPostalAddress(address);

                        DirParty = DirParty::constructFromPartyRecId(CustTable.Party);
                        roles = LogisticsLocationRole::findBytype(LogisticsLocationRoleType::Delivery);
                        DirParty.createOrUpdatePostalAddress(addressView);
                    }
                    ttscommit;

                    if(customerDetailsStaging.TRNNo!='0')
                    {
                        select taxvatnumtableget where taxvatnumtableget.CountryRegionId=='ARE'
                            && taxvatnumtableget.VATNum==customerDetailsStaging.TRNNo &&
                            taxvatnumtableget.Name==custTable.name();
                     
                        if(!taxvatnumtableget)
                        {
                            ttsbegin;
                            taxvatnumtableins.CountryRegionId = "ARE";
                            taxvatnumtableins.VATNum = customerDetailsStaging.TRNNo;
                            taxvatnumtableins.Name = custTable.name();
                            taxvatnumtableins.insert();
                            ttscommit;
                        }
                    }
                 
               
                }
             
            }
            catch(Exception::Error)
            {
                throw Exception::Error;
            }
        }


Happy Coding!!!

Importing Excel Dates in D365 F&O through X++ without the Apostrophe Trick

  We often get a requirement to create excel upload custom functionality in x++ . In this post we will see how to handle Excel OLE Automatio...