Generate report – In this example we are using delivery note report
Copy the below complete code - CustPacking slip email class contains all the code , Report generation, Email template, email place holders mapping, send email using sysoutgoingemailtable and interactive way email /// <summary> /// Class to send packing slip email /// </summary> public class CustPackingSlipEmail { CustPackingSlipJour custPackingSlipJour; Map mappings = new Map(Types::String,Types::String); /// <summary> /// CustPackingSlipEmail /// </summary> /// <param name = "_custPackingSlipJour">CustPackingSlipJour</param> /// <returns>CustPackingSlipEmail</returns> public static CustPackingSlipEmail construct(CustPackingSlipJour _custPackingSlipJour) { CustPackingSlipEmail CustPackingSlipEmail = new CustPackingSlipEmail(); custPackingSlipEmail.parmPackingSlip(_custPackingSlipJour); return custPackingSlipEmail; } /// <summary> /// CustPackingSlipJour /// </summary> /// <param name = "_custPackingSlipJour">CustPackingSlipJour</param> /// <returns>CustPackingSlipJour</returns> public CustPackingSlipJour parmPackingSlip(CustPackingSlipJour _custPackingSlipJour = custPackingSlipJour) { custPackingSlipJour = _custPackingSlipJour; return custPackingSlipJour; } /// <summary> /// generateAndSendPackingSlipReport as binary container /// </summary> /// <param name = "_args">Args</param> public void generateAndSendPackingSlipReport(Args _args) { //Set variables Array arrayFiles; SRSProxy srsProxy; Map reportParametersMap; SRSPrintDestinationSettings settings; Filename fileName = custPackingSlipJour.InternalPackingSlipId + '.pdf'; SrsReportRunController formLetterController = SalesPackingSlipController::construct(); SalesPackingSlipController controller = formLetterController; SalesPackingSlipContract contract = new SalesPackingSlipContract(); System.Byte[] reportBytes = new System.Byte[0](); SRSReportRunService srsReportRunService = new SrsReportRunService(); SRSReportExecutionInfo executionInfo = new SRSReportExecutionInfo(); Microsoft.Dynamics.AX.Framework.Reporting.Shared.ReportingService.ParameterValue[] parameterValueArray; //set the report contract parameters contract.parmRecordId(custPackingSlipJour.RecId); contract.parmTableId(tableNum(CustPackingSlipJour)); //2nd paramter contract.parm2ndtParameter('2ndParamter value'); //3rd parameter //4th parameter //set the report controller parameters //set report name and design name controller.parmArgs(_args); controller.parmReportName(PrintMgmtDocType::construct( PrintMgmtDocumentType::SalesOrderPackingSlip).getDefaultReportFormat()); controller.parmShowDialog(false); controller.parmLoadFromSysLastValue(false); controller.parmReportContract().parmRdpContract(contract); // Provide printer settings settings = controller.parmReportContract().parmPrintSettings(); settings.printMediumType(SRSPrintMediumType::File); settings.fileName(fileName); settings.fileFormat(SRSReportFileFormat::PDF); // Below is a part of code responsible for rendering the report 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()); // Actual rendering to byte array reportBytes = srsproxy.renderReportToByteArray(controller.parmreportcontract().parmreportpath(), parameterValueArray, settings.fileFormat(), settings.deviceinfo()); // You can also convert the report Bytes into an xpp BinData object if needed container binData; Binary binaryData; System.IO.MemoryStream mstream = new System.IO.MemoryStream(reportBytes); binaryData = Binary::constructFromMemoryStream(mstream); if (binaryData) { binData = binaryData.getContainer(); } SysEmailRecipients recipientEmailAddr = SysUserInfo::find(curUserId()).Email; //Send email using sysoutgoing email this.sendEmailWithAttachment(binData, fileName, recipientEmailAddr); //Send email using interactive methodology this.sendEmailWithAttachmentInteractive(binData, fileName, recipientEmailAddr); } /// <summary> /// sendEmailWithAttachment using sysoutgoing email table /// </summary> /// <param name = "_binData">container</param> /// <param name = "_fileName">str</param> /// <param name = "_recipientEmailAddr">SysEmailRecipients</param> public void sendEmailWithAttachment(container _binData, str _fileName, SysEmailRecipients _recipientEmailAddr) { SysEmailItemId nextEmailItemId; SysEmailTable sysEmailTable; SysEmailContents sysEmailContents; SysOutgoingEmailTable outgoingEmailTable; SysOutgoingEmailData outgoingEmailData; str subject; Filename fileExtension = ".pdf"; [sysEmailTable, subject, sysEmailContents] = this.getEmailTemplateDetails(); if (sysEmailTable.RecId > 0) { nextEmailItemId = EventInbox::nextEventId(); outgoingEmailTable.clear(); outgoingEmailTable.Origin = sysEmailTable.Description; outgoingEmailTable.EmailItemId = nextEmailItemId; outgoingEmailTable.IsSystemEmail = NoYes::Yes; outgoingEmailTable.Sender = sysEmailTable.SenderAddr; outgoingEmailTable.SenderName = sysEmailTable.SenderName; outgoingEmailTable.Recipient = _recipientEmailAddr; outgoingEmailTable.Subject = subject; outgoingEmailTable.Priority = eMailPriority::High; outgoingEmailTable.WithRetries = NoYes::No; outgoingEmailTable.RetryNum = 0; outgoingEmailTable.UserId = curUserId(); outgoingEmailTable.Status = SysEmailStatus::Unsent; outgoingEmailTable.Message = sysEmailContents; outgoingEmailTable.LatestStatusChangeDateTime = DateTimeUtil::getSystemDateTime(); outgoingEmailTable.TemplateId = sysEmailTable.EmailId; outgoingEmailTable.insert(); if (conLen(_binData) > 0) { outgoingEmailData.clear(); outgoingEmailData.EmailItemId = nextEmailItemId; outgoingEmailData.DataId = 1; outgoingEmailData.EmailDataType = SysEmailDataType::Attachment; outgoingEmailData.Data = _binData; outgoingEmailData.FileName = _filename; outgoingEmailData.FileExtension = fileExtension; outgoingEmailData.insert(); } } } /// <summary> /// send email as interactive or non interactive methodology /// </summary> /// <param name = "_binData">container</param> /// <param name = "_fileName">str</param> /// <param name = "_recipientEmailAddr">SysEmailRecipients</param> public void sendEmailWithAttachmentInteractive(container _binData, str _fileName, SysEmailRecipients _recipientEmailAddr) { System.Byte[] binData1; System.IO.Stream stream1; SysEmailTable sysEmailTable; SysEmailContents sysEmailContents; str subject; SysIMailerInteractive mail; SysMailerMessageBuilder messageBuilder; Email sendFrom = SysUserInfo::find(curUserId()).Email; [sysEmailTable, subject, sysEmailContents] = this.getEmailTemplateDetails(); // Turn the Bytes into a stream for (int i = 0; i < conLen(_binData); i++) { binData1 = conPeek(_binData,i+1); stream1 = new System.IO.MemoryStream(binData1); } //email sending settings mail = SysMailerFactory::getInteractiveMailer(); messageBuilder = new SysMailerMessageBuilder(); messageBuilder.reset() .setFrom(sendFrom) // From email address .addTo(_recipientEmailAddr) // To Email address .setSubject(subject) // Email Subject .setBody(sysEmailContents); //Email Body if (stream1 != null) { //add attachment to the email messageBuilder.addAttachment(stream1, _filename); } //send email mail.sendInteractive(messageBuilder.getMessage()); } /// <summary> /// getEmailTemplateDetails /// </summary> /// <returns>container</returns> private container getEmailTemplateDetails() { SysEmailTable sysEmailTable; SysEmailMessageTable sysEmailMessageTable; SysEmailContents sysEmailContents; str subject; SysEmailId emailTemplateId = this.getCustPackingSlipTemplateEmailId(); LanguageId language = 'en-Au'; this.populateEmailMessageMap(); select sysEmailTable join sysEmailMessageTable where sysEmailMessageTable.EmailId==sysEmailTable.EmailId && sysEmailMessageTable.EmailId== emailTemplateId && sysEmailMessageTable.LanguageId==language; subject = SysEmailMessage::stringExpand(sysEmailMessageTable.Subject, mappings); sysEmailContents = SysEmailMessage::stringExpand(sysEmailMessageTable.Mail, mappings); return [sysEmailTable, subject, sysEmailContents]; } /// <summary> /// Get Email template /// </summary> /// <returns>SysEmailId</returns> private SysEmailId getCustPackingSlipTemplateEmailId() { SysEmailId emailId = CustParameters::find().DeliveryNoteEmailId; // new parameter field for email template if (!emailId) { throw error("@Label:DeliveryNoteEmailTemplateError"); } return emailId; } /// <summary> /// populate map for email place holders /// </summary> private void populateEmailMessageMap() { SalesTable salesTable = SalesTable::find(custPackingSlipJour.SalesId); mappings.insert('DeliveryNoteNumber', custPackingSlipJour.PackingSlipId); mappings.insert('Version', custPackingSlipJour.InternalPackingSlipId); mappings.insert('SalesOrder', custPackingSlipJour.SalesId ); //strFmt("%1", missingHourTmp.Hour)); mappings.insert('ProjectID', salesTable.ProjId); mappings.insert('CustAccount', custPackingSlipJour.OrderAccount); mappings.insert('DeliveryName', custPackingSlipJour.DeliveryName); mappings.insert('DeliveryAddress', custPackingSlipJour.deliveryAddress()); mappings.insert('InvoiceName', custPackingSlipJour.InvoicingName); mappings.insert('InvoiceAddress', custPackingSlipJour.invoicingAddress()); } }
Call the above class from the Sales packing slip controller class extension [ExtensionOf(classStr(SalesPackingSlipController))] public final class custSalesPackingSlipController_Extension { /// <summary> /// Send delivery note email /// </summary> /// <param name = "_args">Args</param> protected static void doMainJob(Args _args) { boolean sendMail = false; if (Box::yesNo('@Label:SendDeliveryNoteEmail', DialogButton::Yes, '@Label:SendDLvNoteEmail') == DialogButton::Yes) { sendMail = true; } next doMainJob(_args); if (sendMail) { CustPackingSlipJour custPackingSlipJour = _args.record(); CustPackingSlipEmail custPackingSlipEmail = custPackingSlipEmail::construct(custPackingSlipJour); custPackingSlipEmail.generateAndSendPackingSlipReport(_args); Info('@Label:DlvNoteEmailSent'); } } }