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

D365 Print Management Setup to print reports

In Microsoft Dynamics Ax D365, we have the out of the box feature of print management to print report either OOTB or custom reports of our clients so for that we need to configure the print management settings. We normally faces this warning message when we print the reports without the setting has been done. Firstly , select Form setup ( Accounts Receivable >> Forms >> Form setup  ) Secondly, In the General tab , select Print Management Thirdly, In the Document Tab right click and select New tab Moreover , we need to set the listed below details and need to select our required reports to load using print management Furthermore , we now nee to go to All Free Tax Invoices in AR Lastly you can use the FTI to generate the respective report using the print button. This time the Warning will be Gone!!! 

Upload and Download file to BLOB storage Account in D365 F&O using X++

Hello Devs! This blog will be a source of help for many Devs who are working on Azure Blog Storage account. We normally use azure blob storage account to hold thing that need to be further processed and stored on cloud. Scenario:  We have been asked to * Upload file to azure * Download file from azure "We will be using Share File Management technique" Case #1 : Uploading File to Azure  Note : Here we are using  PurchParameter  table to extract urls and other folder related details you can use your own folder name to access the azure blob folder Further, Credential details have already been extracted i.e vault key,authorization key and has been stored in our custom table and extracted from d365 through azure parameters  storageCredentials  = new Microsoft.WindowsAzure.Storage.Auth.StorageCredentials(SystemParameters::find().CMTStorageAccountName, purchParameters.CMTTankKeyVaultSecret); Or alternatively, CloudStorageAccount storageAccount =                 Clo

Error : 9002 The Transaction Log for database 'DB' is full due to 'LOG_BACKUP' Sql Server Error in Event View for AX dynamics D365

This is one of the most common error faced by developers often working with database. This error is very much common for SQL servers as when the LOG size runs out in other words reaches 100% then we encounter this error. Being an AX developer, when the log usage reaches to 100% AX stops working and throw reconnecting request error. For this there is a rapid solution and i have written query for it. Step #1: --this could be use to check you Database log file name and its location use AxDB--in my case AxDB is my Database Name select * from sys.database_files Step #2: --This could be used to see you log space usage for your particular log DBCC SQLPERF (LOGSPACE) Step #3: --In my case Database log file name is D365DB_log --use this query to shrink your log file size USE AxDB; GO -- Truncate the log by changing the database recovery model to SIMPLE. ALTER DATABASE AxDB SET RECOVERY SIMPLE; GO -- Shrink the truncated log file to 1 MB. DBCC SHRINKFILE (D365DB_log, 1); G