Wednesday, October 7, 2020

TFS Work space configuration

Refer below link: 

https://d365byjp.blogspot.com/2018/10/steps-to-configure-tfsvsts-workspace-in.html

Tuesday, October 6, 2020

File Rename in print management report related to the purch requested quotation.

 Written Logic in Init method of PurchRFQEditLinesPrintOptions form

using this to get the dynamic subject and file name in print management





Tuesday, September 29, 2020

Logic for unmapped field in Entity to get the data while DMF export using PostLoad method

  [DataEventHandler(tableStr(EcoResReleasedProductV2Entity), DataEventType::PostedLoad)]

    public static void EcoResReleasedProductV2Entity_onPostedLoad(Common _sender, DataEventArgs _eventArgs)

    {

        InventItemInventSetup           inventItemInventSetup;

        EcoResReleasedProductV2Entity   ecoResReleasedProductV2Entity  = _sender as EcoResReleasedProductV2Entity;


        select firstonly  MultipleQty from inventItemInventSetup 

            where inventItemInventSetup.ItemId == ecoResReleasedProductV2Entity.ItemNumber;

        if(inventItemInventSetup)

        {

            ecoResReleasedProductV2Entity.SalesQuantityMultiple = inventItemInventSetup.MultipleQty;

        }

    }


Saturday, September 12, 2020

OnValidate event handler

 [DataEventHandler(tableStr(TaxRegistrationNumbers_IN), DataEventType::ValidatedField)]
    public static void TaxRegistrationNumbers_IN_onValidatedField(Common sender, DataEventArgs e)
    {
        TaxRegistrationNumbers_IN TaxRegistrationNumbers_IN = sender as TaxRegistrationNumbers_IN; // Code to get the buffer
        boolean ret = true;
 
        ValidateFieldEventArgs args = e as ValidateFieldEventArgs; // Code to get args
 
        switch (args.parmFieldId())
        {
            case fieldNum(TaxRegistrationNumbers_IN, RegistrationNumber):
                {
                    if(strLen(TaxRegistrationNumbers_IN.RegistrationNumber) != 15)
                    {
                        ret = checkFailed("Registration number should be 15 characters"); // Just a validation to display on user interface
                    }
                }
                break;
        }
        args.parmValidateResult(ret);
    }

Saturday, September 5, 2020

COC for form datasource Execute query

 [ExtensionOf(formDataSourceStr(LedgerJournalTable,LedgerJournalTable))]
final class LedgerJournalTableForm_Extension
{
    public void executeQuery()
    {
        FormDataSource   ledgerJournal_ds = this;
        UserGroupList    userGroupList,userGroupListLoc;
         
        str              currentUser;
        select userGroupList
            where userGroupList.userId == curUserId()
               && userGroupList.groupId like "LOC*";
        if(userGroupList)
        {
            while select userGroupListLoc
                    where userGroupListLoc.groupId == userGroupList.groupId
            {
                ledgerJournal_ds.query().dataSourceTable(tableNum(LedgerJournalTable)).addRange(fieldNum(LedgerJournalTable,CreatedBy)).value(SysQuery::value(userGroupListLoc.userId));
            }
        }
        next executeQuery();
        
    }
}

MapEntityToDataSouce logic with Skipping validation

 [ExtensionOf(dataentityviewstr(SalesQuotationLineCDSEntity))]
final class SalesQuotationLineCDSEntity_Extension
{
public void mapEntityToDataSource(DataEntityRuntimeContext entityCtx, DataEntityDataSourceRuntimeContext dataSourceCtx)
{
next mapEntityToDataSource(_entityCtx,_dataSourceCtx);
if (_entityCtx.getDatabaseOperation() == DataEntityDatabaseOperation::Insert)
{
switch (_dataSourceCtx.name())
{
case dataEntityDataSourceStr(SalesQuotationLineCDSEntity, SalesQuotationLineEntity):
SalesQuotationLineV2Entity salesQuotationLineEntity = _dataSourceCtx.getBuffer();

if (SalesQuotationLineEntity.LineCreationSequenceNumber)
{
salesQuotationLineEntity.LineNum = any2Real(SalesQuotationLineEntity.LineCreationSequenceNumber);
}
salesQuotationLineEntity.skipDataSourceValidateField(fieldNum(SalesQuotationLineV2Entity,LineNum),true);

break;
}
}
}
}

Friday, September 4, 2020

Excel Import in D365 F & O

 /// <summary>
/// PMEUploadGereralJournalExcel class is used to import the journals
/// </summary>
using System.IO;
using OfficeOpenXml;
using OfficeOpenXml.ExcelPackage;
using OfficeOpenXml.ExcelRange;
class PMEUploadGereralJournalExcel
{
    /// <summary>
    /// excelimport used to import the journals
    /// </summary>
    public void excelImport()
    {
        System.IO.Stream                            stream;
        //FileUploadBuild                             fileUpload;
        DialogGroup                                 dlgUploadGroup;
        FileUploadBuild                             fileUploadBuild;
        FormBuildControl                            formBuildControl;
        PMEReverseLedgerGeneralJournalTable         reverseJournal;
        PMEReverseJournal                           reversalCreation = new PMEReverseJournal();
        //PMEReverseLedgerJournalCreation             journalCreation = new PMEReverseLedgerJournalCreation();
        Dialog                                      dialog = new Dialog("@PME:ImportDataFromExcel");
        dlgUploadGroup          = dialog.addGroup("@SYS54759");
        formBuildControl        = dialog.formBuildDesign().control(dlgUploadGroup.name());
        fileUploadBuild         = formBuildControl.addControlEx(classstr(FileUpload), "@PME:Upload");
        fileUploadBuild.style(FileUploadStyle::MinimalWithFilename);
        fileUploadBuild.fileTypesAccepted('.xlsx');
        if (dialog.run() && dialog.closedOk())
        {
            FileUpload fileUploadControl     = dialog.formRun().control(dialog.formRun().controlId("@PME:Upload"));
            FileUploadTemporaryStorageResult fileUploadResult = fileUploadControl.getFileUploadResult();
            if (fileUploadResult != null && fileUploadResult.getUploadStatus())
            {
                stream = fileUploadResult.openResult();
                using (ExcelPackage Package = new ExcelPackage(stream))
                {
                    int                         rowCount, i;
                    Package.Load(stream);
                     
                    ExcelWorksheet  worksheet   = package.get_Workbook().get_Worksheets().get_Item(1);
                    OfficeOpenXml.ExcelRange    range       = worksheet.Cells;
                    rowCount                  = worksheet.Dimension.End.Row - worksheet.Dimension.Start.Row + 1;
                    
                    try
                    {
                        for (i = 2; i<= rowCount; i++)
                        {
                            ttsbegin;
                            select firstonly JournalNum from reverseJournal
                                where reverseJournal.JournalNum == range.get_Item(i, 1).value;
                            if(!reverseJournal)
                            {
                                reverseJournal.JournalNum = (range.get_Item(i, 1).value);
                                reverseJournal.Released   = NoYes::Yes;
                                reverseJournal.insert();
                                reversalCreation.createJournal(reverseJournal);
                            }
                            else
                            {
                                info(strFmt("@PME:ReverseJournalExist" ,range.get_Item(i, 1).value));
                            }
                            ttscommit;
                        }
                    }
                    catch(Exception::Error)
                    {
                        info("@PME:Error");
                                
                    }
                }
                Info("@PME:Sucessed");
            }
            else
            {
                error("@PME:Error");
            }
        }
    }
}






The above code create like below and manual choose file and import

Thursday, September 3, 2020

Dimension related tables joins

 public static void main(Args _args)
    {
        LedgerJournalTable                   LedgerJournalTable;
        DimensionAttributeValueSet           DimensionAttributeValueSet;
        DimensionAttributeValueSetItem       DimensionAttributeValueSetItem;
        DimensionAttributeValue              DimensionAttributeValue;
        DimensionAttribute                   DimensionAttribute;


        while select * from ledgerjournaltable
            where ledgerjournaltable.journalnum == "t-jbn-034259"
                join recid from dimensionattributevalueset
                    where  dimensionattributevalueset.recid == ledgerjournaltable.defaultdimension
                        join recid, displayvalue from dimensionattributevaluesetitem
                            where dimensionattributevaluesetitem.dimensionattributevalueset == dimensionattributevalueset.recid
                                && dimensionattributevaluesetitem.displayvalue == 'hyderabad'
                                    join recid from dimensionattributevalue
                                        where dimensionattributevalue.recid == dimensionattributevaluesetitem.dimensionattributevalue
                                            join recid, name from dimensionattribute
                                                 where dimensionattribute.recid == dimensionattributevalue.dimensionattribute
                                                    && dimensionattribute.name == 'loction'
        {
            info(dimensionattribute.name+"----"+ dimensionattributevaluesetitem.displayvalue);
        }
        Query  query = new Query(queryStr(PMELedgerDimensionQuery));
        query.toString();
        info(strFmt("%1",query.toString()));


    }

Saturday, August 29, 2020

Sending mail with PDF attachement report in D365 fo

/// <summary>

/// Service class to send the mail

/// </summary>

class PMEStockTransferIntegrationReportService

{

    /// <summary>

    /// Sending mail with PDF attachement

    /// </summary>

    [SysEntryPointAttribute(false)]

    public void processRecords()

    {

        date                            integationDate;

        PMEIntegrationMailSetup         integrationMailSetup;

        SysEmailParameters              sysEmailParameters;

        integationDate                  = DateTimeUtil::getToday(DateTimeUtil::getUserPreferredTimeZone());

        Filename                        fileName = "StockTransferIntegrationFailedData"+ any2Str(integationDate)+ ".pdf";

        

        PMEStockTransferIntegrationController controller = new PMEStockTransferIntegrationController();

        

        SRSPrintDestinationSettings     settings;

        Array                           arrayFiles;

        System.Byte[]                   reportBytes = new System.Byte[0]();

        SRSProxy                        srsProxy;

        SRSReportRunService             srsReportRunService = new SrsReportRunService();

        Microsoft.Dynamics.AX.Framework.Reporting.Shared.ReportingService.ParameterValue[]  parameterValueArray;

        Map reportParametersMap;

        SRSReportExecutionInfo executionInfo = new SRSReportExecutionInfo();

       

        Args  args = new Args();

        

        controller.parmArgs(args);

        controller.parmReportName(ssrsReportStr(PMEStockTransferIntegrationReport,Report));

        controller.parmShowDialog(false);

        controller.parmLoadFromSysLastValue(false);

       

        settings = controller.parmReportContract().parmPrintSettings();

        settings.printMediumType(SRSPrintMediumType::File);

        settings.fileName(fileName);

        settings.fileFormat(SRSReportFileFormat::PDF);


        controller.parmReportContract().parmReportServerConfig(SRSConfiguration::getDefaultServerConfiguration());

        controller.parmReportContract().parmReportExecutionInfo(executionInfo);


        srsReportRunService.getReportDataContract(controller.parmreportcontract().parmReportName());

        srsReportRunService.preRunReport(controller.parmreportcontract());

        reportParametersMap = srsReportRunService.createParamMapFromContract(controller.parmReportContract());

        parameterValueArray = SrsReportRunUtil::getParameterValueArray(reportParametersMap);


        srsProxy = SRSProxy::constructWithConfiguration(controller.parmReportContract().parmReportServerConfig());


        reportBytes = srsproxy.renderReportToByteArray(controller.parmreportcontract().parmreportpath(),

                                              parameterValueArray,

                                              settings.fileFormat(),

                                              settings.deviceinfo());


        if (reportBytes)

        {

            System.IO.MemoryStream stream = new System.IO.MemoryStream(reportBytes);


            File::SendFileToUser(stream, settings.parmFileName());


            stream.Position = 0;

            str fileContentType = System.Web.MimeMapping::GetMimeMapping(fileName);


            var messageBuilder = new SysMailerMessageBuilder();


            select firstonly integrationMailSetup

                where integrationMailSetup.IntegrationName == 'Stock Transfer Integration';


            select firstonly SMTPUserName from sysEmailParameters;

            

            str sendFromEmail  = sysEmailParameters.SMTPUserName;


            str sendToEmail = integrationMailSetup.ToAddress;

            

            str sendCCEmail = integrationMailSetup.CCAddress;


            str body = "Hi Team,<o:p></o:p></p><p></p><p>Please find the attached report. Kindly review and take necessary actions. <o:p></o:p></p><p></p><p>Regards,<o:p></o:p></p><p></p><p><span style='font-size:12.0pt'>AX Team<o:p></o:p></span></p>";


            messageBuilder.addTo(sendToEmail)

                    .setSubject("Stock transfer integration failed details")

                    .setBody(Body)

                    .addCC(sendCCEmail);

        

            if (sendFromEmail)

            {

                messageBuilder.setFrom(sendFromEmail);

            }

        

            if (stream != null)

            {

                messageBuilder.addAttachment(

                stream,

               fileName);

            }


            SysMailerFactory::sendNonInteractive(messageBuilder.getMessage());

        }


    }


}

MappedEntityToDataSource event

 [DataEventHandler(tableStr(MyTableEntity), DataEventType::MappedEntityToDataSource)]

public static void MyTableEntity_onMappedEntityToDataSource(Common _sender, DataEventArgs _eventArgs)
{
    DataEntityContextEventArgs eventArgs = _eventArgs;
    MyTableEntity entity = _sender;
    if (eventArgs.parmEntityDataSourceContext().name() == dataEntityDataSourceStr(MyTableEntity, MyTable))
    {
        MyTable myTable = eventArgs.parmEntityDataSourceContext().getBuffer();
        //LOgic
    }
}

Transaction Cancle/Reversal code X++

    CustTable               custTable;

    CustTrans               custTransLocal;

    Args                    args;

    str                     reasonCode;

    ReasonTable             reasonTable;

    RecId                   reasonRefRecID;

    CustVendPDCManager      custVendPDCManager;

    BankPaymCancel          bankPaymCancel;

    CICJournalTable         journalTableLine;

    LedgerJournalTrans      ledgerJournalTrans;

    AccountNum              CustAccountNum;

    DimensionAttributeLevelValueAllView         dimensionAttributeLevelValueAllView;



    reasonCode      = CICJournalTable.ReasonCode;

    reasonTable     = ReasonTable::find(reasonCode);

    reasonRefRecID  = ReasonTableRef::createReasonTableRef(reasonTable.Reason, reasonTable.Description);


    args = new Args();

//select statment for finding the vourcher related cust trans record

 select CustTransLocal

            where CustTransLocal.AccountNum ==  Customer Account

                && CustTransLocal.Voucher ==voucherNumber;

        if (CustTransLocal)

        {


            bankPaymCancel = BankPaymCancel::newBankPaymCancel(CustTransLocal);


            bankPaymCancel.parmReason(reasonTable.Reason);

            bankPaymCancel.parmReasonComment(reasonTable.Description);

            bankPaymCancel.parmTransDate(systemDateGet());


            args.caller(bankPaymCancel);

            args.record(CustTransLocal);

            BankPaymCancel::serverRun(args);

}

Excell import file through the browse file option in ax2012

    Use EDT to get the file browse option "FileNameOpen"

 1.  Take String Edit control and in EDT property specify FileNameOpen

    write one method in this EDT control

  like below

public void gotFocus()

{

    fileNameControl = this;

    super();

}

2.Form Methods

public class FormRun extends ObjectRun

{

    SysFormSplitter_Y             _formSplitterVertical;

    FormStringControl             _FileOpen;

    FormStringControl             fileNameControl;


}


str fileNameLookupFilename()

{

    Filename    filepath;

    Filename    fileName;

    Filename    fileType;


    [filepath, fileName, fileType] = fileNameSplit(fileNameControl.text());


    return fileName + fileType;

}


container fileNameLookupFilter()

{

    #File

    Filename    filepath;

    Filename    fileName;

    Filename    fileExtention;



    [filepath, fileName, fileExtention] = Global::FileNameSplit(fileNameControl.text());


    if (!fileExtention)

    {

        fileExtention = '.xlsx';

    }


    return [WinApi::fileType(fileExtention),#AllFilesName+fileExtention, #AllFilesExt, #AllFilesType];

}


str fileNameLookupInitialPath()

{

    #WinAPI


    Filename    filepath;

    Filename    fileName;

    Filename    fileType;


    [filepath, fileName, fileType] = Global::FileNameSplit(fileNameControl.text());


    return FilePath;

}


// AOSRunMode::client

str fileNameLookupTitle()

{

    return  'Lookup Title: ' + fileNameControl.label();

}

   

3.Add button and override clicked method and write the logic.

void clicked()

{

        SysExcelWorkSheet             excelWorksheet;

        SysexcelCells                 excelCells;

        SysExcelApplication           excelApp;

        int                           i,j;

        int                           row;

        Name                          findExcelSheet;

        str 250                       error;

        JournalId                     journalId;

        Voucher                       Voucher;

        CICJournalTable               JournalTable,journalTableOrg;

        LedgerJournalTrans            ledgerJournalTrans;

        LedgerJournalTable            ledgerJournalTable;



        int            WrkShtNum;

        COMVariantType type;

        Name           formatValue;

        boolean        value;

        int            paymentreference;


        name formatcheck(int val)

        {

            formatValue = "";

            switch(excelcells.item(row, val).value().variantType())

            {

                case COMVariantType::VT_BSTR:

                formatValue = strFmt("%1", excelcells.item(row, val).value().bStr());

                break;

                case COMVariantType::VT_DECIMAL, COMVariantType::VT_R4, COMVariantType::VT_R8:

                formatValue = strFmt("%1", any2int(excelcells.item(row, val).value().double()));

                break;

                case COMVariantType::VT_I1, COMVariantType::VT_I2, COMVariantType::VT_I4:

                formatValue = strFmt("%1", excelcells.item(row, val).value().int());

                break;

                case COMVariantType::VT_UI1, COMVariantType::VT_UI2, COMVariantType::VT_UI4:

                formatValue = strFmt("%1", excelcells.item(row, val).value().uLong());

                break;

                case COMVariantType::VT_EMPTY:

                formatValue = '';

                break;

                default:

                throw error(strfmt("Issue in file coloum type.", excelcells.item(row+1, 1).value().variantType()));

            }

            return formatValue;

        }


        excelApp = SysExcelApplication::construct();

        startLengthyOperation();


        if(StrLTrim(StrRTrim(OpenExcelFile.text()))=="")

        {

            ExcelCells = NULL;

            excelWorksheet = NULL;

            excelApp.quit();

            throw error("Empty File Name");

        }

        else

        {


            excelApp.workbooks().open(OpenExcelFile.text());

            excelWorksheet = excelApp.worksheets().itemFromNum(1);

            excelCells = excelWorksheet.cells();

            excelCells.range('A:A').numberFormat('@');

            row=1;

            findExcelSheet  = excelcells.item(row,1).value().bStr();

            info(findExcelSheet);

            row=2;


            if(row == 0)

            {

                ExcelCells = NULL;

                excelWorksheet = NULL;

                excelApp.quit();

                throw error("ERROR: Excel upload aborted...");

            }


            do

            {

                try

                {

                    ttsBegin;


                    if(row >= 1)

                    {

                        if (findExcelSheet == 'Journal Number')

                        {

                            journalId = excelcells.item(row,1).value().bStr();


                            if(journalId)

                            {

                                select ledgerJournalTrans

                                    where ledgerJournalTrans.JournalNum == journalId;

                                select journalTableOrg

                                    where journalTableOrg.JournalID == journalId;


                                if(ledgerJournalTrans && !journalTableOrg)

                                {

                                    JournalTable.JournalID          = ledgerJournalTrans.JournalNum;

                                    JournalTable.JournalDescription =  ledgerJournalTable::find( JournalTable.JournalID).Name;

                                    JournalTable.insert();

                                }

                             }

                        }

                        else if(findExcelSheet == 'Voucher Number')

                        {

                            Voucher   = excelcells.item(Row,1).value().bStr();


                            select journalTableOrg

                                where journalTableOrg.JournalID == Voucher;

                            if (!journalTableOrg)

                            {

                                JournalTable.voucherNumber           = excelcells.item(Row,1).value().bStr();

                                JournalTable.CustomerCode            = excelcells.item(Row,2).value().bStr();

                                JournalTable.Date                    = excelcells.item(Row,3).value().date();

                                JournalTable.ReasonCode              = excelcells.item(Row,4).value().bStr();

                                JournalTable.ReasonDescription       = excelcells.item(Row,5).value().bStr();

                                JournalTable.Reversed                 = NoYes::No;

                                JournalTable.insert();

                            }

                            else

                            {

                                error(strFmt("Voucher number %1 is already exist",Voucher));

                            }

                        }

                    }



                    if (value)

                    {

                        type = excelcells.item(row+1, 1).value().variantType();


                        ttscommit;

                        break;

                    }

                    else

                    {

                        type = excelcells.item(row+1, 1).value().variantType();

                        ttscommit;

                    }

                    }


                catch

                {

                    error(strfmt("Upload Failed in row %1", row));

                }

                type = excelcells.item(row+1, 1).value().variantType();

                Row++;

            }

            while (type != COMVariantType::VT_EMPTY);


            info(strfmt("Journals imported successfully"));

            excelapp.quit();


            endLengthyOperation();


            CICJournalTable_ds.executeQuery();

            }


            super();

}






Here in this code OpenExcelFile.text() file string edit EDT(FileNameOpen) contol name





TFS Work space configuration

Refer below link:  https://d365byjp.blogspot.com/2018/10/steps-to-configure-tfsvsts-workspace-in.html