D365 Sending Email with Customer Account Statement SSRS report as attachment using X++
D365 Sending Email with Customer Account Statement SSRS report as attachment using X++
custTable _custTable;
SysOperationQueryDataContractInfo sysOperationQueryDataContractInfo;
SrsReportRunController reportRunController;
CustTransListContract custTransListContract;
SRSReportExecutionInfo reportExecutionInfo;
SRSPrintDestinationSettings printDestinationSettings;
SRSReportRunService srsReportRunService;
SRSProxy srsProxy;
QueryBuildRange qbrCustAccount;
QueryBuildDataSource queryBuildDataSource;
Object dataContractInfoObject;
Map reportParametersMap;
Map mapCustAccount;
MapEnumerator mapEnumerator;
Array arrayFiles;
System.Byte[] reportBytes;
Filename fileName;
Args args;
System.IO.MemoryStream memoryStream;
System.IO.MemoryStream fileStream;
CustParameters custParameters;
Email toEmail;
Map templateTokens;
str emailSenderName;
str emailSenderAddr;
str emailSubject;
str emailBody;
Microsoft.Dynamics.AX.Framework.Reporting.Shared.ReportingService.ParameterValue[] parameterValueArray;
#define.Subject("Subject")
#define.CustAccount("CustAccount")
#define.EmailDate("Date");
custParameters = CustParameters::find();
reportRunController = new SrsReportRunController();
custTransListContract = new CustTransListContract();
reportExecutionInfo = new SRSReportExecutionInfo();
srsReportRunService = new SrsReportRunService();
reportBytes = new System.Byte[0]();
args = new Args();
templateTokens = new Map(Types::String, Types::String);
var messageBuilder = new SysMailerMessageBuilder();
// custTransListContract.parmNewPage(NoYes::Yes);
_custTable = CustTable::find(custAccount);
if(!_custTable)
{
return "No Customer found";
}
if(!emailAddress)
{
return "No emailAddress";
}
fileName = strFmt("CustomerAccountStatement_%1.pdf", _custTable.AccountNum);
reportRunController.parmArgs(args);
reportRunController.parmReportName(ssrsReportStr(CustTransList, Report));
reportRunController.parmShowDialog(false);
reportRunController.parmLoadFromSysLastValue(false);
reportRunController.parmReportContract().parmRdpContract(custTransListContract);
// Modify query
mapCustAccount = reportRunController.getDataContractInfoObjects();
mapEnumerator = mapCustAccount.getEnumerator();
while (mapEnumerator.moveNext())
{
dataContractInfoObject = mapEnumerator.currentValue();
if (dataContractInfoObject is SysOperationQueryDataContractInfo)
{
sysOperationQueryDataContractInfo = dataContractInfoObject;
queryBuildDataSource = SysQuery::findOrCreateDataSource(sysOperationQueryDataContractInfo.parmQuery()
, tableNum(CustTable));
qbrCustAccount = SysQuery::findOrCreateRange(queryBuildDataSource, fieldNum(CustTable, AccountNum));
qbrCustAccount.value(_custTable.AccountNum);
}
}
printDestinationSettings = reportRunController.parmReportContract().parmPrintSettings();
printDestinationSettings.printMediumType(SRSPrintMediumType::File);
printDestinationSettings.fileName(fileName);
printDestinationSettings.fileFormat(SRSReportFileFormat::PDF);
reportRunController.parmReportContract().parmReportServerConfig(SRSConfiguration::getDefaultServerConfiguration());
reportRunController.parmReportContract().parmReportExecutionInfo(reportExecutionInfo);
srsReportRunService.getReportDataContract(reportRunController.parmreportcontract().parmReportName());
srsReportRunService.preRunReport(reportRunController.parmreportcontract());
reportParametersMap = srsReportRunService.createParamMapFromContract(reportRunController.parmReportContract());
parameterValueArray = SrsReportRunUtil::getParameterValueArray(reportParametersMap);
srsProxy = SRSProxy::constructWithConfiguration(reportRunController.parmReportContract().parmReportServerConfig());
reportBytes = srsproxy.renderReportToByteArray(reportRunController.parmreportcontract().parmreportpath()
, parameterValueArray
, printDestinationSettings.fileFormat()
, printDestinationSettings.deviceinfo());
memoryStream = new System.IO.MemoryStream(reportBytes);
memoryStream.Position = 0;
fileStream = memoryStream;
toEmail = this.getCustEmail(_custTable.AccountNum);
emailBody = "Dear Customr, Please find attached Customer account statement till today.";
emailSubject = strFmt("Customer account statement for %1", _custTable.AccountNum);
emailSenderAddr = "[email protected]";
emailSenderName = strFmt("Customer account statement for %1", _custTable.AccountNum);
messageBuilder.addTo(toEmail)
.setSubject(emailSubject)
.setBody(SysEmailMessage::stringExpand(emailBody, SysEmailTable::htmlEncodeParameters(templateTokens))).addCC("");
messageBuilder.setFrom(emailSenderAddr , emailSenderName );
messageBuilder.addAttachment(fileStream, fileName);
SysMailerFactory::sendNonInteractive(messageBuilder.getMessage());
public Email getCustEmail(CustAccount _custAccount)
{
CustTable custTable;
DirPartyLocation dirPartyLocation;
LogisticsLocation logisticsLocation;
LogisticsElectronicAddress logisticsElectronicAddress;
custTable = CustTable::find(_custAccount);
select firstonly Location, Party from dirPartyLocation
where dirPartyLocation.Party == custTable.Party
join RecId from logisticsLocation
where logisticsLocation.RecId == dirPartyLocation.Location
join Locator from logisticsElectronicAddress
where logisticsElectronicAddress.Location == logisticsLocation.RecId
&& logisticsElectronicAddress.Type == LogisticsElectronicAddressMethodType::Email
&& logisticsElectronicAddress.IsPrimary == NoYes::Yes;
return logisticsElectronicAddress.Locator;
}
Published on:
Learn moreRelated posts
Practical Hints for Technical Management of D365FO Go-Live
In this post, I share practical insights from my experience managing the technical side of Go-Live for D365FO projects, focusing on key activi...
26 days ago
D365FO Integration: Event-Based Exports to External Web Services
How to implement robust, efficient integrations between Dynamics 365 Finance and Operations and external Web Services. This post covers design...
1 month ago
Physical cost inclusion for Weighted Average Valuation in Microsoft Dynamics 365 Finance and Operations: Part-13
What is physical cost in Dynamics 365 F&O? Anything which has been received or shipped but not invoiced is considered as physical cost for...
1 month ago
Product bundles in Microsoft Dynamics 365 Finance and Operations
Product bundle was first introduced in module revenue recognition but as we all know the there is new modules which has been introduced and wi...
1 month ago
clicking link on info message X++ to Open form
Message::AddAction() method can be used to embed an action within a message sent to the message bar. This method supports adding a singl...
4 months ago