Skip to main content

Sending Email with Excel File Attached in Dynamics D365 and AX2012 Using X++ without Framework

Sending Email is one of the most common features used in  Dynamics AX .Though,There are many  advancement when we move forward from AX2012 to D365FO .Similar is the case here we could use Predefined Framework as i have done in one of my blog(https://shayanarshi.blogspot.com/2019/10/sending-email-with-attached-excel-file.html) but there are some cases where we use just a job to send email.Below is the working code to send email in Dynamics AX

Requirements: 
*Our objective it to Generate an excel File and attach it to an email and sending it to multiple
recipients
*The file data will be from financial dimension view and it will be distributed into
three worksheets that is D1,D2 and D4_5 according to conditions
*Data of Data Entity of D4 & D5 will be inserted into same worksheet that is D4_5


using System.IO;
using OfficeOpenXml;
using OfficeOpenXml.Style;
using OfficeOpenXml.Table;
class Irc_ExportDataExcelClass extends SysOperationServiceController
{

      public static void main(Args _args)
    {
     
        Irc_ExportDataExcelClass exportDataExcelClass = new Irc_ExportDataExcelClass();
        exportDataExcelClass.EmailSender(_args);
        info('Email successfully sent');
    }

//Code for Email
public void EmailSender(Args _args)
    {
        SysMailerMessageBuilder mailer = new SysMailerMessageBuilder();
        SysMailerSMTP smtp = new SysMailerSMTP();
        var             user       = xUserInfo::find();
        var             sysUser    = SysUserInfo::find(user.id);
        var             sender     = sysUser.getSendAsEmail(user);
        container       con        = str2con(_args.parm());
        Irc_ExportDataExcelClass exporter = new Irc_ExportDataExcelClass();
        System.IO.MemoryStream memoryStream = new System.IO.MemoryStream();
        var             recipient  ='';
        ;

        for(int i=1;i<=conLen(con);i++)

        {
            recipient   = conPeek(con,i);
            mailer.addTo(recipient);
        }
     
        mailer.setSubject("Financial Details");
        mailer.setFrom(sender);
        mailer.setBody("PFA");
        memoryStream = exporter.DataLoaderExcel();
        memoryStream.Seek(0, System.IO.SeekOrigin::Begin);

        //The below line used to attach excel file to email.

     //it will self download the file and attach it 
     
        mailer.addAttachment(memoryStream, 'D Codes FCM.xlsx', "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");

        try

        {
            smtp.sendNonInteractive(mailer.getMessage());
        }
        catch(Exception::CLRError)
        {
            error(CLRInterop::getLastException().toString());
        }
    }


//Code For Generating Excel
    public void DataLoaderExcel()
    {
        FINANCIALDIMENSIONVALUEENTITYVIEW financialDimension;
        MemoryStream memoryStream = new MemoryStream();

        using (var package = new ExcelPackage(memoryStream))
        {
            var currentRow = 1;

            var worksheets = package.get_Workbook().get_Worksheets();
            var financialDimensionWorksheet = worksheets.Add("D1");
            var cells = financialDimensionWorksheet.get_Cells();
            OfficeOpenXml.ExcelRange cell = cells.get_Item(currentRow, 1);
            System.String value = "Dimension Value";
            cell.set_Value(value);
            cell = null;
            value = "Description";
            cell = cells.get_Item(currentRow, 2);
            cell.set_Value(value);

            while select financialDimension where financialDimension.DimensionAttribute == 'D01Project_Code'
            {
                currentRow ++;
                cell = null;

                cell = cells.get_Item(currentRow, 1);
                cell.set_Value(financialDimension.DimensionValue);
                cell = null;

                cell = cells.get_Item(currentRow, 2);
                cell.set_Value(financialDimension.Description);
            }
            //for D3
            currentRow = 1;

            worksheets = package.get_Workbook().get_Worksheets();
            financialDimensionWorksheet = worksheets.Add("D3");
            cells = financialDimensionWorksheet.get_Cells();
            cell = cells.get_Item(currentRow, 1);
            value = "Dimension Value";
            cell.set_Value(value);
            cell = null;
            value = "Description";
            cell = cells.get_Item(currentRow, 2);
            cell.set_Value(value);

            while select financialDimension where financialDimension.DimensionAttribute == 'D03Program_Area'
            {
                currentRow ++;
                cell = null;

                cell = cells.get_Item(currentRow, 1);
                cell.set_Value(financialDimension.DimensionValue);
                cell = null;

                cell = cells.get_Item(currentRow, 2);
                cell.set_Value(financialDimension.Description);
            }
            //D3 work ends
            //for D4_5
            currentRow = 1;

            worksheets = package.get_Workbook().get_Worksheets();
            financialDimensionWorksheet = worksheets.Add("D4_5");
            cells = financialDimensionWorksheet.get_Cells();
            cell = cells.get_Item(currentRow, 1);
            value = "Dimension Value";
            cell.set_Value(value);
            cell = null;
            value = "Description";
            cell = cells.get_Item(currentRow, 2);
            cell.set_Value(value);

            while select financialDimension where financialDimension.DimensionAttribute == 'D04Location' || financialDimension.DimensionAttribute == 'D05Entity_Code'
            {
                currentRow ++;
                cell = null;

                cell = cells.get_Item(currentRow, 1);
                cell.set_Value(financialDimension.DimensionValue);
                cell = null;

                cell = cells.get_Item(currentRow, 2);
                cell.set_Value(financialDimension.Description);
            }
            //D4_5 work ends
            package.Save();
            file::SendFileToUser(memoryStream, "D_Codes_FCM");
            Global::info("Data has been loaded");
     
        }

    }

}

Comments

Popular posts from this blog

Update record set using update_recordset in d365 F&O | AX 2012 using X++

Hello Devs! One the most common condition that we being a developer faces is to update existing records set that is mostly done on report level when we need to add new fields in the Temporary table and we don't wants to make extensions on class level. Here is a small piece of code that will assist you in updating existing record sets.  update_recordset custAgingReportTmp                 setting                 CMTCustInternalCollector = hcmWorker.PersonnelNumber,                 PaymDayId                         = custTable.PaymDayId,                 PaymTermId                       = custTable.PaymTermId,                 CashDisc      ...

Import DB backup from .BacPac file in D365 F&O using CMD

Hello Devs! This is one of the most quickest way to import DB from .Bacpac file. Bacpac files are those which are generated from Tier 2 or higher environments as a DB backup.   Alternate Approach ----> Using wizard Prerequisites: 1) Access to LCS folder Asset library --> Database Backup Incase you don't see the folder ask your project owner to give you the access. Step 1:  Download the file and save it in local non-user directory.  Step 2: - Services to be stopped World Wide Web Publishing Service Management Reporter 2012 Process Service Microsoft Dynamics 365 Unified Operations: Batch Management Service Microsoft Dynamics 365 Unified Operations: Data Import Export Framework Service - Download SqlPackage.Exe.  Download link :  https://learn.microsoft.com/en-us/sql/tools/sqlpackage/sqlpackage-download?view=sql-server-ver15 Extract it and Open CMD as admin.  Step 3 :  Navigate to directory where you have extracted the SqlPackage.Exe folder us...

Adding D365 F&O Extension in Visual Studio 2022 | Dynamics

  Hello Devs! This is a very common scenario when it comes to enabling D365 extension within VS 2022, so for that below are list of steps needs to be done to enable extension for development. Please note for Older VS versions please refer to my blog below : https://www.linkedin.com/feed/update/urn:li:ugcPost:7033677029451440128/ Prerequisites: Visual Studio 2022 should be installed before performing below steps. Step # 1: Login to LCS (Microsoft Dynamics lifecycle services). In the main page after login there is a option of Shared asset library (without entering into project folder). Step # 2: In the list of sub menus , Select Software deployment package and search for latest Service update. For my case I am downloading 10.0.41 Step # 3 : Once you have downloaded it. Unzip the folder and search for FinanceAndOperations_10.0.2015.54_Application\DevToolsService\Scripts Before installation you will not be able to see Dynamics 365 option within VS 2022. Now please clos...