Hi Friends,
In this post I will demonstrate how to do below through X++ code.
We will take Purchase order report as an example
1. Run a report
2. Save as PDF at local drive
3. Email this report
4. Delete from local drive after email.
To perform above task , create a new class and add below methods
To Run and Save Purchase order report through X++ code
public str runAndSaveSSRSReport(PurchTable _purchTable)
{
SrsReportRunController ssrsController = new SrsReportRunController();
PurchPurchaseOrderContract Contract = new PurchPurchaseOrderContract();
SRSPrintDestinationSettings printerSettings;
VendPurchOrderJour VendPurchOrderJour;
str ReportPath;
select firstOnly VendPurchOrderJour
order by VendPurchOrderJour.createdDateTime DESC
where VendPurchOrderJour.PurchId == _PurchTable.PurchId;
ReportPath = "C:\\" + _PurchTable.PurchId +".pdf";
ssrsController.parmReportName(ssrsReportStr(PurchPurchaseOrder, Report));
ssrsController.parmExecutionMode(SysOperationExecutionMode::Synchronous);
ssrsController.parmShowDialog(false);
Contract.parmRecordId(VendPurchOrderJour.RecId);
ssrsController.parmReportContract().parmRdpContract(Contract);
//link the printer settings to the controller
printerSettings = ssrsController.parmReportContract().parmPrintSettings();
//print to pdf and always overwrite if the file exists
printerSettings.printMediumType(SRSPrintMediumType::File);
printerSettings.fileFormat(SRSReportFileFormat::PDF);
printerSettings.overwriteFile(true);
printerSettings.fileName(@ReportPath);
//run & save the report
ssrsController.runReport();
return ReportPath;// return the file location where pdf saved. we use this path to email and delete after email.
}
To Email this report
public void POConfirmationEmail(PurchTable _PurchTable)
{
PurchTable PurchTable;
Map parameterMap = new Map(Types::String, Types::String);
Email requester;
SysEmailId ApprovalEmailTemplate;
SysEmailId ReopenEmailTemplate;
int itemCount = 1;
str ItemId, ItemQty, ItemDeliveryDate, ItemPrice;
str companyDetails;
FilenameOpen attachmentFilename;
companyDetails = curext();
ParameterMap.insert('CompanyDetails',companyDetails);
PurchTable = _PurchTable;
attachmentFilename = this.runAndSaveSSRSReport(PurchTable);
ParameterMap.insert('VendorName', VendTable::find(PurchTable.OrderAccount).name());
ParameterMap.insert('PurchaseID', PurchTable.PurchId);
requester = LogisticsElectronicAddress::findRecId(DirPartyTable::findRec(VendTable::find(PurchTable.OrderAccount).Party).PrimaryContactEmail).Locator;
if(!requester)
{
throw error("No Email address is available");
}
else
{
SysEmailTable::sendMail("PoEmail", companyinfo::languageId(), requester, parameterMap, attachmentFilename); //PoEmail is emial template with two parameter (VendName and PurchId, you can make changes in template as per user requirement.
this.deleteReportFile(attachmentFilename);// To delete this file after email.
}
}
Delete report file from your local drive
public void deleteReportFile(str _ReportPath)
{
str ReportPath = _ReportPath;
if(!ReportPath)
warning("No file in local to remove");
else
WinAPI::deleteFile(@ReportPath);
}
Now all you need is to call this class during confirmation of PO. Put your Feedback/question/Queries in comments.
Enjoy……
-Harry
Originally posted on http://theaxapta.blogspot.in/2015/01/run-save-and-email-purchase-order.html
