Create Ledger Dimension for Legder journal Trans line in D365 using X++

To create a General journal header and Line using excel/CSV file(It was a client requirement , instead of using DMF).


internal final class CSVLedgerJournalImportCSV extends RunBaseBatch

{

    private str         availableTypes = ".csv";

    //In the class Declaration control names for OK and upload control

    private const str   OkButtonName = 'OkButton';

    private const str   FileUploadName = 'FileUpload';

    Dialog              dialog;

    str                 textFile;

    QueryRun            gQueryRun;

    HCL_tempLedgerJournalTransForImport tempLedgerJournalTransForImport;

    #define.CurrentVersion(3)

    public Object dialog()

    {

        DialogGroup      dialogGroup;

        FormBuildControl formBuildControl;

        FileUploadBuild  dialogFileUpload;

        Set              enumSet = new Set(Types::Enum);

               

        dialog = super();

        dialogGroup = dialog.addGroup("File path");

        formBuildControl = dialog.formBuildDesign().control(dialogGroup.name());

       

        dialogFileUpload = formBuildControl.addControlEx(classstr(FileUpload), FileUploadName);

        dialogFileUpload.style(FileUploadStyle::MinimalWithFilename);

        dialogFileUpload.baseFileUploadStrategyClassName(classstr(FileUploadTemporaryStorageStrategy));

        dialogFileUpload.fileTypesAccepted(availableTypes);

        dialogFileUpload.fileNameLabel("@SYS308842");

   

        return dialog;

    }


    protected void setDialogOkButtonEnabled(DialogRunbase _dialog, boolean _isEnabled)

    {        FormControl okButtonControl = this.getFormControl(_dialog, OkButtonName);


        if (okButtonControl)

        {

            okButtonControl.enabled(_isEnabled);

        }

    }


    protected FormControl getFormControl(DialogRunbase _dialog, str _controlName)

    {

        return _dialog.formRun().control(_dialog.formRun().controlId( _controlName));

    }


    protected void uploadCompleted()

    {

        FileUpload fileUpload = this.getFormControl(dialog, FileUploadName);

        fileUpload.notifyUploadCompleted -= eventhandler(this.UploadCompleted);

               

        textFile = fileUpload.fileName();


        this.setDialogOkButtonEnabled(dialog, true);

    }


    /// Disables the dialog Ok button until the file upload is complete.

   

    public void dialogPostRun(DialogRunbase _dialog)

    {

        FileUpload fileUpload = this.getFormControl(_dialog, FileUploadName);

        fileUpload.notifyUploadCompleted += eventhandler(this.uploadCompleted);

        this.setDialogOkButtonEnabled(_dialog, false);

    }


    /// <summary>

    /// Prcoess class where the CSV file is accesed and storeinto table for furhter journal creations

    /// </summary>

    void processCSVFile()

    {

        #File

        container               currentLine;

        int                     totalOfLines;

        CommaTextStreamIo       localStream;

        Num                     number;

        int                     fileLineNumber;

        CSVLedgerJournalImportCSV          ledgerJournalmportCSV;

      

        FileUpload fileUploadControl                        = this.getFormControl(dialog, FileUploadName);

        FileUploadTemporaryStorageResult fileUploadResult  = fileUploadControl.getFileUploadResult();

       

        if (fileUploadResult != null && fileUploadResult.getUploadStatus())

        {

            textFile = fileUploadResult.getDownloadUrl();

        }

       

        localStream = CommaTextStreamIo::constructForRead(File::UseFileFromURL(textFile));

         

        if (localStream.status() != IO_Status::Ok)

        {

            throw error(strfmt('Is not possible to open the file. Error %1',enum2str(localStream.status())));

        }

   

        localStream.inFieldDelimiter("\,");

        localStream.inRecordDelimiter("\n");

   

        currentLine = localStream.read();

        fileLineNumber++;

   

        if(conlen(currentLine) == 1)

        {

            throw error('Is not possible to import the file, incorrect format');

        }

           

        currentLine = localStream.read();

        fileLineNumber++;

   

        while(currentLine)

        {

            tempLedgerJournalTransForImport.clear();

            LedgerJournalACType ledgerJournalACType;

            tempLedgerJournalTransForImport.COMPANY             = conPeek(currentLine,1);//Company

            //tempLedgerJournalTransForImport.JOURNALNUM          = conPeek(currentLine,2);//Journal

            tempLedgerJournalTransForImport.JOURNALNAME         = conPeek(currentLine,2);//Name

            tempLedgerJournalTransForImport.TRANSDATE           = str2Date(conPeek(currentLine,3),213);//Date

            tempLedgerJournalTransForImport.ACCOUNTTYPE         = str2Enum(ledgerJournalACType,conPeek(currentLine,4));//AccountType

            tempLedgerJournalTransForImport.LINENUM             = conPeek(currentLine,5);//LineNum

            tempLedgerJournalTransForImport.LedgerDimension     = this.getLedgerDimension(conPeek(currentLine,6),conPeek(currentLine,7),conPeek(currentLine,8),conPeek(currentLine,9),conPeek(currentLine,10),conPeek(currentLine,11),NoYes::Yes);

            

            tempLedgerJournalTransForImport.TXT                 = conPeek(currentLine,12);//Text

            tempLedgerJournalTransForImport.AMOUNTCURDEBIT      = conPeek(currentLine,13);//Debit

            tempLedgerJournalTransForImport.AMOUNTCURCREDIT     = conPeek(currentLine,14);//Credit

            tempLedgerJournalTransForImport.INVOICE             = conPeek(currentLine,15);//Inv006oiceNumber

            tempLedgerJournalTransForImport.DUE                 = str2Date(conPeek(currentLine,16),213);//Due Date

            tempLedgerJournalTransForImport.OFFSETACCOUNTTYPE   = str2Enum(ledgerJournalACType,conPeek(currentLine,17));//OffsetAccountType

            if (conPeek(currentLine,18))

            {

                tempLedgerJournalTransForImport.OffsetLedgerDimension = this.getLedgerDimension(conPeek(currentLine,18),conPeek(currentLine,19),conPeek(currentLine,20),conPeek(currentLine,21),conPeek(currentLine,22),conPeek(currentLine,23),NoYes::No);

            }

            tempLedgerJournalTransForImport.PAYMENT             = conPeek(currentLine,24);//Terms of payment

            tempLedgerJournalTransForImport.DOCUMENTNUM         = conPeek(currentLine,25);//Document

            tempLedgerJournalTransForImport.DOCUMENTDATE        = conPeek(currentLine,26);//Document Date

            tempLedgerJournalTransForImport.PAYMMODE            = conPeek(currentLine,27);//Method of Payment

            tempLedgerJournalTransForImport.CURRENCYCODE        = conPeek(currentLine,28);//Currency

            tempLedgerJournalTransForImport.BANKTRANSTYPE       = conPeek(currentLine,29);//Bank Transaction Type

            tempLedgerJournalTransForImport.PAYMREFERENCE       = conPeek(currentLine,30);//Payment Reference

            tempLedgerJournalTransForImport.insert();

            //info(strFmt("Number : %1",number));


            currentLine = localStream.read();

        }

        ledgerJournalmportCSV = new CSVLedgerJournalImportCSV();

        ledgerJournalmportCSV.createJournal();

    }


    /// <summary>

    /// Class entry point. The system will call this method when a designated menu 

    /// is selected or when execution starts and this class is set as the startup class.

    /// </summary>

    /// <param name = "_args">The specified arguments.</param>

    public static void main(Args _args)

    {

        CSVLedgerJournalImportCSV ledgerJournalmportCSV;

        ledgerJournalmportCSV = new HCL_LedgerJournalImportCSV();

        ledgerJournalmportCSV.prompt();

        {

            ttsbegin;

            ledgerJournalmportCSV.processCSVFile();

            ttscommit;

        }

    }


    protected void createJournal()

    {

        LedgerJournalTable                  ledgerJournalTable;

        JournalTableData                    journalTableData;

        LedgerjournalTrans                  ledgerjournalTrans;

        HCL_tempLedgerJournalTransForImport tempLedgerJournalTransForImportLoc1, tempLedgerJournalTransForImportLoc2;


        while select journalName,CurrencyCode from tempLedgerJournalTransForImportLoc1

            group by journalName

        {

            ledgerJournalTable.initFromLedgerJournalName("");//from excel file

            journalTableData                = JournalTableData::newTable(ledgerJournalTable);

            ledgerJournalTable.JournalNum   = journalTableData.nextJournalId();

            ledgerJournalTable.JournalName  = tempLedgerJournalTransForImportLoc1.JournalName;

            ledgerJournalTable.CurrencyCode = tempLedgerJournalTransForImportLoc1.CurrencyCode;


            if (ledgerJournalTable.validateWrite())

            {

                ledgerJournalTable.insert();

            }


            if (ledgerJournalTable.RecId)

            {

                //create a Temp table // based on excel

                while select *  from tempLedgerJournalTransForImportLoc2

                    where tempLedgerJournalTransForImportLoc2.JournalName == ledgerJournalTable.JournalName

                {

                    ledgerJournalTrans.COMPANY              = tempLedgerJournalTransForImportLoc2.COMPANY;

                    ledgerJournalTrans.JOURNALNUM           = ledgerJournalTable.JournalNum;

                    ledgerjournalTrans.Voucher              = this.getVoucher(ledgerJournalTable);

                    //ledgerJournalTrans.JOURNALNAME          = tempLedgerJournalTransForImportLoc2.JOURNALNAME;

                    ledgerJournalTrans.TRANSDATE            = tempLedgerJournalTransForImportLoc2.TRANSDATE;

                    ledgerJournalTrans.ACCOUNTTYPE          = tempLedgerJournalTransForImportLoc2.ACCOUNTTYPE;

                    ledgerJournalTrans.LINENUM              = tempLedgerJournalTransForImportLoc2.LINENUM;

                    ledgerJournalTrans.LedgerDimension      = tempLedgerJournalTransForImportLoc2.LedgerDimension;

                    ledgerJournalTrans.TXT                  = tempLedgerJournalTransForImportLoc2.TXT;

                    ledgerJournalTrans.AMOUNTCURDEBIT       = tempLedgerJournalTransForImportLoc2.AMOUNTCURDEBIT;

                    ledgerJournalTrans.AMOUNTCURCREDIT      = tempLedgerJournalTransForImportLoc2.AMOUNTCURCREDIT;

                    ledgerJournalTrans.INVOICE              = tempLedgerJournalTransForImportLoc2.INVOICE;

                    ledgerJournalTrans.DUE                  = tempLedgerJournalTransForImportLoc2.DUE;

                    ledgerJournalTrans.OFFSETACCOUNTTYPE    = tempLedgerJournalTransForImportLoc2.OFFSETACCOUNTTYPE;

                    ledgerJournalTrans.OffsetLedgerDimension = tempLedgerJournalTransForImportLoc2.OffsetLedgerDimension;

                    ledgerJournalTrans.PAYMENT              = tempLedgerJournalTransForImportLoc2.PAYMENT;

                    ledgerJournalTrans.DOCUMENTNUM          = tempLedgerJournalTransForImportLoc2.DOCUMENTNUM;

                    ledgerJournalTrans.DOCUMENTDATE         = tempLedgerJournalTransForImportLoc2.DOCUMENTDATE;

                    ledgerJournalTrans.PAYMMODE             = tempLedgerJournalTransForImportLoc2.PAYMMODE;

                    ledgerJournalTrans.CURRENCYCODE         = tempLedgerJournalTransForImportLoc2.CURRENCYCODE;

                    ledgerJournalTrans.BANKTRANSTYPE        = tempLedgerJournalTransForImportLoc2.BANKTRANSTYPE;

                    ledgerJournalTrans.PAYMREFERENCE        = tempLedgerJournalTransForImportLoc2.PAYMREFERENCE;

                    ledgerjournalTrans.Approved             = NoYes::Yes;

                    ledgerJournalTrans.SkipBlockedForManualEntryCheck   = true;

                    /*

                    ledgerJournalTrans.defaultRow();

                    */

                    if (ledgerJournalTrans.validateWrite())

                    {

                        ledgerjournalTrans.insert();

                    }

                }

            }


            //return ledgerJournalTable.JournalNum;

        }

        delete_from tempLedgerJournalTransForImport;

    }


    public Voucher getVoucher(ledgerJournalTable _ledgerJournalTable)

    {

        NumberSequenceTable                 numberSequenceTable;

        numberSequenceTable = NumberSequenceTable::find(LedgerJournalName::find(_ledgerJournalTable.JournalName).NumberSequenceTable);

        return  NumberSeq::newGetVoucherFromCode(numberSequenceTable.NumberSequence).voucher();

        //return NumberSequenceTable::find(numberSequenceTable.RecId).vouch

    }


    /// <summary>

    /// </summary>

    /// <returns>Return the class desc</returns>

    public client server static ClassDescription description()

    {

        return "Ledger journal import CSV";

    }


    /// <summary>

    /// </summary>

    /// <returns>Whether the class can be used in a batch task</returns>

    protected boolean canGoBatchJournal()

    {

        return true;

    }


    /// <summary>

    /// <returns></returns>

    public container pack()

    {

        container pack = conNull();


        if (gQueryRun)

        {

            pack = gQueryRun.pack();

        }

        return [#CurrentVersion] + [pack];

    }


    /// <summary>

    /// </summary>

    /// <param name = "packedClass"></param>

    /// <returns></returns>

    public boolean unpack(container _packedClass)

    {

        boolean     ret         = true;

        int         version     = RunBase::getVersion(_packedClass);

        container   packedQuery = conNull();


        switch (version)

        {

            case #CurrentVersion:

                [version, packedQuery] = _packedClass;


                if (SysQuery::isPackedOk(packedQuery))

                {

                    gQueryRun   = new QueryRun(packedQuery);

                    ret         = true;

                }

                break;


            default:

                ret = false;

        }

        return ret;

    }


    /// <summary>

    /// Allows the class go batch

    /// </summary>

    /// <returns>Return the result</returns>

    public boolean canGoBatch()

    {

        return true;

    }


    /// <summary>

    /// </summary>

    /// <returns>Return the true result</returns>

    public boolean runsImpersonated()

    {

        return true;

    }


    /// <summary>

    /// Doesn't allows the class run in the new session

    /// </summary>

    /// <returns>Return the result</returns>

    protected boolean canRunInNewSession()

    {

        return true;

    }


    /// <summary>

    /// </summary>

    /// <returns></returns>

    public boolean showQueryValues()

    {

        return true;

    }


    /// <summary>

    /// </summary>

    /// <returns></returns>

    public QueryRun queryRun()

    {

        return gQueryRun;

    }


    /// <summary>

    ///  Retruns the ledger dimenion for below param list

    /// </summary>

    /// <param name = "_ledgerAccount"> main account id</param>

    /// <param name = "_BusinessUnit"></param>

    /// <param name = "_RegionalSurgicalOffice"></param>

    /// <param name = "_ConsultationOffice"></param>

    /// <param name = "_Department"></param>

    /// <param name = "_Category"></param>

    /// <param name = "_isLedgerYesOrOffSetDim"> Dummy param, just to identified the Ledger Dimension and Offset Ledeger Dimension to execute if block</param>

    /// <returns></returns>

    public DimensionDynamicAccount getLedgerDimension(str _ledgerAccount,

                                                        str _BusinessUnit,

                                                        str _RegionalSurgicalOffice,

                                                        str _ConsultationOffice,

                                                        str _Department,

                                                        str _Category,

                                                        NoYes _isLedgerYesOrOffSetDim)

    {

        DimensionServiceProvider      DimensionServiceProvider = new DimensionServiceProvider();

        LedgerAccountContract        LedgerAccountContract = new LedgerAccountContract();

        DimensionAttributeValueContract   ValueContract;

        List                ListValueContract = new List(Types::Class);

        dimensionAttributeValueCombination dimensionAttributeValueCombination;

        DimensionStorage          dimStorage;

        if (_isLedgerYesOrOffSetDim == NoYes::Yes)

        {

            if (_businessUnit)

            {

                ValueContract = new DimensionAttributeValueContract();

                ValueContract.parmName('BusinessUnit') ;

                ValueContract.parmValue(_BusinessUnit);

                ListValueContract.addEnd(ValueContract);

            }

            if (_RegionalSurgicalOffice)

            {

                ValueContract = new DimensionAttributeValueContract();

                ValueContract.parmName('RegionalSurgicalOffice') ;

                ValueContract.parmValue(_RegionalSurgicalOffice);

                ListValueContract.addEnd(ValueContract);

            }

            //Department

            if (_ConsultationOffice)

            {

                ValueContract = new DimensionAttributeValueContract();

                ValueContract.parmName('ConsultationOffice') ;

                ValueContract.parmValue(_ConsultationOffice);

            }


            if (_Department)

            {

                ValueContract = new DimensionAttributeValueContract();

                ValueContract.parmName('Department') ;

                ValueContract.parmValue(_Department);

                ListValueContract.addEnd(ValueContract);

            }


            if (_Category)

            {

                ValueContract = new DimensionAttributeValueContract();

                ValueContract.parmName('Category') ;

                ValueContract.parmValue(_Category);

                ListValueContract.addEnd(ValueContract);

            }

        }

        else

        {

            if (_businessUnit)

            {

                ValueContract = new DimensionAttributeValueContract();

                ValueContract.parmName('Offset BusinessUnit') ;

                ValueContract.parmValue(_BusinessUnit);

                ListValueContract.addEnd(ValueContract);

            }

            if (_RegionalSurgicalOffice)

            {

                ValueContract = new DimensionAttributeValueContract();

                ValueContract.parmName('Offset RegionalSurgicalOffice') ;

                ValueContract.parmValue(_RegionalSurgicalOffice);

                ListValueContract.addEnd(ValueContract);

            }

            //Department

            if (_ConsultationOffice)

            {

                ValueContract = new DimensionAttributeValueContract();

                ValueContract.parmName('Offset ConsultationOffice') ;

                ValueContract.parmValue(_ConsultationOffice);

            }


            if (_Department)

            {

                ValueContract = new DimensionAttributeValueContract();

                ValueContract.parmName('Offset Department') ;

                ValueContract.parmValue(_Department);

                ListValueContract.addEnd(ValueContract);

            }


            if (_Category)

            {

                ValueContract = new DimensionAttributeValueContract();

                ValueContract.parmName('Offset Category') ;

                ValueContract.parmValue(_Category);

                ListValueContract.addEnd(ValueContract);

            }

        }

   

        LedgerAccountContract.parmMainAccount(_ledgerAccount);

        LedgerAccountContract.parmValues(ListValueContract);

        dimStorage = DimensionServiceProvider::buildDimensionStorageForLedgerAccount(LedgerAccountContract);

        dimensionAttributeValueCombination = DimensionAttributeValueCombination::find(dimStorage.save());

        return dimensionAttributeValueCombination.RecId;

    }


}


other user full link.

http://daxvisionerp.com/axdappdimensionutil-does-not-designate-a-class-or-table/

http://daxingwitheshant.blogspot.com/2016/02/importing-invoice-journal-lines-from_15.html

https://krishhdax.blogspot.com/2012/03/ax2012-import-ledger-journal-trans-from.html

https://www.linkedin.com/pulse/generate-financial-dimension-ledgerdimension-dynamics-yadav

http://dynamicsnavax.blogspot.com/2018/01/resolve-ledger-dimension-through-xd365fo.html

Comments

Popular posts from this blog

Create ledger journals in D365FO using X++ + LedgerDimensionACType

Excel Import into D365 using x++ code

Sales invoice report