Live URL: https://nemely.com/blog/generate-pdf-report-in-dynamics-crm-365/

There is plenty of material available to achieve this very commonly needed functionality to generate PDF of the existing report in your CRM system. I will give some tips and tricks to achieve this in most efficient way.
The requirement is to download PDF format of the SSRS report (OOB or Custom) on a button click either on home page grid or on a button click on the form.
This can be divided in steps:
Step 1: Get ReportSession and ControlID
| function getReportingSession(formContext) { |
| try { |
| var selectedIds = formContext.data.entity.getId(); |
| var reportName = “”; |
| var reportGuid = null; |
| reportName = ‘nameofthereport.rdl’; //for e.g. Quote.rdl |
| reportGuid = getReportGuidByName(“nameofthereport”); //OR Report GUID – Replace with your report GUID |
| if (reportGuid) { |
| //use this path for version 8.2 |
| //var pth = Xrm.Utility.getGlobalContext().getClientUrl() + “/CRMReports/rsviewer/QuirksReportViewer.aspx”; |
| //use this path for version 9.0 and above |
| var pth = Xrm.Utility.getGlobalContext().getClientUrl() + “/CRMReports/rsviewer/reportviewer.aspx”; |
| var retrieveEntityReq = new XMLHttpRequest(); |
| retrieveEntityReq.open(“POST”, pth, false); |
| retrieveEntityReq.setRequestHeader(“Accept”, “*/*”); |
| retrieveEntityReq.setRequestHeader(“Content-Type”, “application/x-www-form-urlencoded”); |
| var strParameterXML = “”; |
| var queryString = “”; |
| //OOB report |
| var strParameterXML = “<ReportFilter><ReportEntity paramname=’P1′ displayname=’Quotes’><fetch version=’1.0′ output-format=’xml-platform’ mapping=’logical’ distinct=’false’><entity name=’quote’><all-attributes/><filter type=’and’><condition attribute=’quoteid’ operator=’eq’ uitype=’quote’ value='” + selectedIds.toString().replace(“{“, “”).replace(“}”, “”) + “‘/></filter></entity></fetch></ReportEntity></ReportFilter>”; |
| var queryString = “id=%7B” + reportGuid + “%7D&uniquename=” + Xrm.Utility.getGlobalContext().organizationSettings.uniqueName + “&iscustomreport=false&reportnameonsrs=&reportName=” + reportName + “&isScheduledReport=false&CRM_Filter=” + strParameterXML; |
| retrieveEntityReq.send(queryString); |
| var x = retrieveEntityReq.responseText.lastIndexOf(“ReportSession=”); |
| var y = retrieveEntityReq.responseText.lastIndexOf(“ControlID=”); |
| var ret = new Array(); |
| ret[0] = retrieveEntityReq.responseText.substr(x + 14, 24); |
| ret[1] = retrieveEntityReq.responseText.substr(x + 10, 32); |
| return ret; |
| } |
| } |
| catch (e) { |
| console.log(“Error in getReportingSession function : ” + e.message); |
| throw new Error(“Error in getReportingSession function : ” + e.message); |
| } |
| } |
Step 2: Download report as PDF
| function runReportToPrint(formContext) { |
| try { |
| var params = getReportingSession(); |
| var strParameter = “nameofthefile”; |
| // Code for web browser or CRM for Outlook only goes here. |
| var newPth = Xrm.Utility.getGlobalContext().getClientUrl() + “/Reserved.ReportViewerWebControl.axd?ReportSession=” + params[0] + “&Culture=1033&CultureOverrides=True&UICulture=1033&UICultureOverrides=True&ReportStack=1&ControlID=” + params[1] + “&OpType=Export&FileName=” + strParameter + “&ContentDisposition=OnlyHtmlInline&Format=PDF”; |
| window.open(newPth, “_self”); |
| } |
| catch (e) { |
| console.log(“Error in runReportToPrint function : ” + e.message); |
| throw new Error(“Error in runReportToPrint function : ” + e.message); |
| } |
| } |
Tips and Tricks
It is very important that you prepare parameter XML and query string correct in order to generate PDF report smoothly. I will show you how you can smoothen this.
- If custom report is generated with report Wizard i.e. enableprefiltering=”1″, then use below example for query string where CRM_Filterednemely_quote is parameter name in the custom report on Quote entity.
var queryString = “id=%7B” + reportGuid + “%7D&uniquename=” + Xrm.Utility.getGlobalContext().organizationSettings.u
- If custom report is created without prefiltering, then use below query string where CRM_Filterednemely_quote is parameter name in the custom report on Quote entity.
var queryString = “id=%7B” + reportGuid + “%7D&uniquename=” + Xrm.Utility.getGlobalContext().organizationSettings.uni
- If custom report and not using fetch as parameter.
var queryString = “id=%7B” + reportGuid + “%7D&uniquename=” + Xrm.Utility.getGlobalContext().organizationSettings.uniqueNam
To get parameter XML, use fiddler to get all details you need.
Hope this helps to achieve your goal. Please share your comments and contact us if you have any questions.
