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

Popular posts from this blog

Microsoft D365 F&O: Remove custom models from deployable package

Generate Text/CSV/DAT file using X++ and upload on Azure blob storage