Execute D365 F&O SSRS report with parameter and upload report output on Azure blob storage using X++
Execute D365 F&O SSRS report with parameter and upload report output on Azure blob storage using X++
Steps:
1. Create controller class and execute SSRS report with parameter
2. Create Azure storage on Azure
3. Create Azure storage containers and folder to store report output
4. Get Azure connection key to establish connection between D365 F&O and Azure storage
5. Convert SSRS report output into byte stream
6. Upload byte stream to azure storage
How to create Azure storage, containers and folder and get Azure connection key?
Login to https://portal.azure.com
Go to Storage account --> Storage browser --> Blob containers
How to get Connection string ?
Go to Storage account --> Security + networking --> Access Key --> Connection string
Code:
using Microsoft.WindowsAzure.Storage;
Using Microsoft.WindowsAzure.Storage.Blob;
using System.IO;
public class ExampleUploadReportToBlobStorage
{
public static void main(Args _args)
{
ExampleUploadReportToBlobStorage uploadFileToBlobStorage= new ExampleUploadReportToBlobStorage();
CloudBlobContainer blobContainer;
// Connecting container
blobContainer = uploadFileToBlobStorageObj.connectToAzureBlob();
// upload the file
uploadFileToBlobStorageObj.UploadFileToBlob(blobContainer);
}
public CloudBlobContainer connectToAzureBlob()
{
CloudBlobClient cloudBlobClient;
CloudBlobContainer cloudBlobContainer;
CloudStorageAccount cloudStorageAccount;
cloudStorageAccount =
CloudStorageAccount::Parse("DefaultEndpointsProtocol=https;AccountName=67787w8w81DFD;AccountKey=bhxw66778y08/kxnxjxjxnjxn238228746Xladz/MXBSJHXBS6o9+XHJSXHS78E637E637E==;EndpointSuffix=core.windows.net");
cloudBlobClient = cloudStorageAccount.CreateCloudBlobClient();
CloudBlobContainer = cloudBlobClient.GetContainerReference("reportupload"); // Container name
info(strFmt("Storage container Name: %1",CloudBlobContainer.Name));
return CloudBlobContainer;
}
public void UploadFileToBlob(CloudBlobContainer _cloudBlobContainer)
{
CloudBlobDirectory cloudBlobDirectory;
CloudBlockBlob CloudBlockBlob;
System.Byte[] reportBytes = new System.Byte[0]();
// File path
cloudBlobDirectory = _cloudBlobContainer.GetDirectoryReference("ReportUpload"); // Azure container folder name
CloudBlockBlob = cloudBlobDirectory.GetBlockBlobReference("UploadFile.pdf"); // Blob file name
reportBytes = new System.Byte[0]();
reportBytes = ExampleUploadReportToBlobStorage::getSSRSBytes('ReportOutput'); // blob File name
if (reportBytes)
{
System.IO.MemoryStream stream = new System.IO.MemoryStream(reportBytes);
// upload stream
CloudBlockBlob.UploadFromStream(stream, null, null, null);
}
info("File uploaded successfully to Azure Blob Storage.");
}
public static System.Byte[] getSSRSBytes(str _fileName)
{
SrsReportRunController controller = new SrsReportRunController();
SRSPrintDestinationSettings settings;
System.Byte[] reportBytes = new System.Byte[0]();
SRSProxy srsProxy;
SRSReportRunService srsReportRunService = new SrsReportRunService();
Microsoft.Dynamics.AX.Framework.Reporting.Shared.ReportingService.ParameterValue[] parameterValueArray;
Map reportParametersMap;
SRSReportExecutionInfo executionInfo = new SRSReportExecutionInfo();
;
// Provide details to controller and add contract
controller.parmReportName(ssrsReportStr(TransactionsReport, Report));
controller.parmShowDialog(false);
controller.parmLoadFromSysLastValue(false);
//controller.parmReportContract().parmRdpContract(_contract);
ReportParametersDataContract contract = controller.parmReportContract().parmRdpContract() as ReportParametersDataContract
contract.parmFromDate(today()-5);
contract.parmToDate(today());
// Provide printer settings
settings = controller.parmReportContract().parmPrintSettings();
settings.printMediumType(SRSPrintMediumType::File);
//Change file extension or add a new parameter to function
settings.fileName(_fileName + ".pdf");
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());
return reportBytes;
}
}
Comments
Post a Comment