web
You’re offline. This is a read only version of the page.
close
Skip to main content

Announcements

News and Announcements icon
Community site session details

Community site session details

Session Id :
Microsoft Dynamics CRM (Archived)
Active Discussion

How to send SSRS report as a PDF in Email in Dynamics CRM Online

(0) ShareShare
ReportReport
Posted on by 15

With this js code you can send a ssrs report as PDF attachment in an email! 

I tested it and it works.

var reportName = "Ticket report"; //Please specify your report name.
var reportId = null;
var fileName = Xrm.Page.getAttribute("ticketnumber").getValue(); //Please specify a file which you want to save.
var fromFieldId = null;
var fromFieldEntityName = null;
var toFieldId = null;
var toFieldEntityName = null;
var emailId = null;
var reportGuid = "13AF3881-9670-E911-80F3-00155D1F9339"; // your report guid

//This function is need to be called from action side e.g. Ribbon button click.
function emailreportPDF() {
//This function does not work in add mode of form.
var type = Xrm.Page.ui.getFormType();
if (type != 1) {
GetIds(); // Set ids in global variables.
CreateEmail(); //Create Email
}
}

//Gets the fromFieldId and toFieldEntityName used to set Email To & From fields
function GetIds() {
fromFieldId = "81098448-A265-E911-80ED-00155D1F9332";//The Guid which needs to be set in form field.
fromFieldEntityName = "systemuser";//Please specify entity name for which you have specified above Guid. Most probably it's systemuser.
toFieldId = "44144DFB-2B81-E911-80F4-00155D1F9332"; //The Guid which needs to be set in to field.
toFieldEntityName = "contact";//Please specify entity name for which you have specified above Guid.
}
//Create Email and link it with Order as Reagrding field
function CreateEmail() {
var id = Xrm.Page.data.entity.getId();
id = id.replace('{', "");
id = id.replace('}', "");
var entityLogicalName = Xrm.Page.data.entity.getEntityName();
var regardingObjectId = new Sdk.EntityReference(entityLogicalName, id);
var title = Xrm.Page.getAttribute("title").getValue();
var email = new Sdk.Entity("email");
email.addAttribute(new Sdk.String("subject", title));
email.addAttribute(new Sdk.String("description", title));
email.addAttribute(new Sdk.Lookup("regardingobjectid", regardingObjectId));
var fromParties = PrepareActivityParty(fromFieldId, fromFieldEntityName);
email.addAttribute(new Sdk.PartyList("from", fromParties));
var toParties = PrepareActivityParty(toFieldId, toFieldEntityName);
email.addAttribute(new Sdk.PartyList("to", toParties));
Sdk.Async.create(email, EmailCallBack, function (error) { alert(error.message); });
}

//This method get entity's id and logical name and return entitycollection of it.
function PrepareActivityParty(partyId, partyEntityName) {
var activityParty = new Sdk.Entity("activityparty");
activityParty.addAttribute(new Sdk.Lookup("partyid", new Sdk.EntityReference(partyEntityName, partyId)));
var activityParties = new Sdk.EntityCollection();
activityParties.addEntity(activityParty);
return activityParties;
}

// Email Call Back function
function EmailCallBack(result) {
emailId = result;
GetReportId();
}

function GetReportId() {
var columns = "reportid";
var fetchQuery = new Sdk.Query.QueryByAttribute("report");
fetchQuery.setColumnSet(columns);
fetchQuery.addAttributeValue(new Sdk.String("name", reportName));
Sdk.Async.retrieveMultiple(fetchQuery, RetrieveMultiple);
}

function RetrieveMultiple(entityCollection) {
if (entityCollection.getEntities().getCount() > 0) {
var entities = entityCollection.getEntities();
var getAttribute = entities.getByIndex(0).getAttributes("reportid");
if (getAttribute != null) {
reportId = getAttribute.getValue();
}
}

//get reporting session and use the params to convert a report in PDF
var params = GetReportingSession();
EncodePdf(params);
}

//Gets the report contents
function GetReportingSession() {

var recordId = Xrm.Page.data.entity.getId();
recordId = recordId.replace('{', '').replace('}', '');

var strParameterXML = "<fetch version='1.0' output-format='xml-platform' mapping='logical' distinct='false'><entity name='incident' enableprefiltering='1'><all-attributes /><filter type='and'><condition attribute='incidentid' operator='eq' value='" + recordId + "' /> </filter></entity></fetch>";
var pth = Xrm.Page.context.getClientUrl() + "/CRMReports/rsviewer/QuirksReportViewer.aspx";
var retrieveEntityReq = new XMLHttpRequest();

retrieveEntityReq.open("POST", pth, false);
retrieveEntityReq.setRequestHeader("Accept", "*/*");
retrieveEntityReq.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
retrieveEntityReq.send("id=%7B" + reportGuid + "%7D&uniquename=" + Xrm.Page.context.getOrgUniqueName() + "&iscustomreport=true&reportnameonsrs=&reportName=" + reportName + "&isScheduledReport=false&p:CRM_incident=" + strParameterXML);

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;
}

function EncodePdf(params) {
var retrieveEntityReq = new XMLHttpRequest();
var pth = Xrm.Page.context.getClientUrl() + "/Reserved.ReportViewerWebControl.axd?ReportSession=" + params[0] + "&Culture=1033&CultureOverrides=True&UICulture=1033&UICultureOverrides=True&ReportStack=1&ControlID=" + params[1] + "&OpType=Export&FileName=Public&ContentDisposition=OnlyHtmlInline&Format=PDF";
retrieveEntityReq.open('GET', pth, true);
retrieveEntityReq.setRequestHeader("Accept", "*/*");
retrieveEntityReq.responseType = "arraybuffer";
retrieveEntityReq.onload = function (e) {
if (this.status == 200) {
var uInt8Array = new Uint8Array(this.response);
var base64 = Encode64(uInt8Array);
CreateEmailAttachment(base64);
}
};
retrieveEntityReq.send();
}

var keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
function Encode64(input) {
var output = new StringMaker();
var chr1, chr2, chr3;
var enc1, enc2, enc3, enc4;
var i = 0;

while (i < input.length) {
chr1 = input[i++];
chr2 = input[i++];
chr3 = input[i++];

enc1 = chr1 >> 2;
enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
enc4 = chr3 & 63;

if (isNaN(chr2)) {
enc3 = enc4 = 64;
} else if (isNaN(chr3)) {
enc4 = 64;
}
output.append(keyStr.charAt(enc1) + keyStr.charAt(enc2) + keyStr.charAt(enc3) + keyStr.charAt(enc4));
}
return output.toString();
}

var StringMaker = function () {
this.parts = [];
this.length = 0;
this.append = function (s) {
this.parts.push(s);
this.length += s.length;
}
this.prepend = function (s) {
this.parts.unshift(s);
this.length += s.length;
}
this.toString = function () {
return this.parts.join('');
}
}

//Create attachment for the created email
function CreateEmailAttachment(encodedPdf) {
//Get order number to name a newly created PDF report
var orderNumber = Xrm.Page.getAttribute("ordernumber");
var emailEntityReference = new Sdk.EntityReference("email", emailId);
var newFileName = fileName + ".pdf";
if (orderNumber != null)
newFileName = fileName + orderNumber.getValue() + ".pdf";
var activitymimeattachment = new Sdk.Entity("activitymimeattachment");
activitymimeattachment.addAttribute(new Sdk.String("body", encodedPdf));
activitymimeattachment.addAttribute(new Sdk.String("subject", "File Attachment"));
activitymimeattachment.addAttribute(new Sdk.String("objecttypecode", "email"));
activitymimeattachment.addAttribute(new Sdk.String("filename", newFileName));
activitymimeattachment.addAttribute(new Sdk.Lookup("objectid", emailEntityReference));
activitymimeattachment.addAttribute(new Sdk.String("mimetype", "application/pdf"));
Sdk.Async.create(activitymimeattachment, ActivityMimeAttachmentCallBack, function (error) { alert(error.message); });
}

//ActivityMimeAttachment CallBack function
function ActivityMimeAttachmentCallBack(result) {
Xrm.Utility.openEntityForm("email", emailId);
}

*This post is locked for comments

  • DSK Profile Picture
    5 on at

    I am getting the following error. How can I solve this?

    pastedimage1592663979806v1.png

Under review

Thank you for your reply! To ensure a great experience for everyone, your content is awaiting approval by our Community Managers. Please check back later.

Helpful resources

Quick Links

Season of Sharing Community Challenge Launch!

Jump in, show your community spirit, and win prizes!

Women in Power Builds Momentum

Expanding mentorship, skilling, and AI innovation

Congratulations to the May Top 10 Community Leaders

These are the community rock stars!

Leaderboard > 🔒一 Microsoft Dynamics CRM (Archived)

Last 30 days Overall leaderboard

Featured topics

Product updates

Dynamics 365 release plans