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

Community site session details

Session Id :
Microsoft Dynamics CRM (Archived)

Is it possible to generate OOB report as pdf format on button click of a custom entity

(0) ShareShare
ReportReport
Posted on by 105

I have written the code as given below but it is not working

//Author: Arunav Dash
//Description: Creating Email and notes with attachment PDF
var base64 = null;

function form_onsave(executionContext) {
debugger;
var formContext = executionContext.getFormContext();
// if (formContext.getAttribute("ccc_senttocustomer") !== null && formContext.getAttribute("ccc_senttocustomer") !== undefined)
// {
// var senttocustomer = formContext.getAttribute("ccc_senttocustomer").getValue();
// if (senttocustomer === true) {
// createAttachment();
// }
// }
createAttachment();
alert("Report Send Successfully");
}
function getReportingSession() {
var reportName = "Report Test.rdl"; //set this to the report you are trying to download
//var reportGuid = "170faa66-19ad-e811-a96f-000d3af43d1a"; //set this to the guid of the report you are trying to download
var reportGuid = "2B5A0201-D382-E911-A973-000D3AF06590"; //set this to the guid of the report you are trying to download
var rptPathString = ""; //set this to the CRMF_Filtered parameter
var selectedIds = Xrm.Page.data.entity.getId();
var pth = Xrm.Page.context.getClientUrl() + "/CRMReports/rsviewer/reportviewer.aspx";
var retrieveEntityReq = new XMLHttpRequest();

var strParameterXML = "<fetch version='1.0' output-format='xml-platform' mapping='logical' distinct='false'><entity name='im360_recurringprocess'><all-attributes /><filter type='and'><condition attribute='im360_recurringprocessid' operator='eq' value='" + selectedIds + "' /> </filter></entity></fetch>";

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_im360_recurringprocess=" + strParameterXML);
var x = retrieveEntityReq.responseText.lastIndexOf("ReportSession=");
var y = retrieveEntityReq.responseText.lastIndexOf("ControlID=");
// alert("x" + x + "y" + y);
var ret = new Array();

ret[0] = retrieveEntityReq.responseText.substr(x + 14, 24);
ret[1] = retrieveEntityReq.responseText.substr(x + 10, 32);
return ret;
}

function createEntity(ent, entName, upd) {
var jsonEntity = JSON.stringify(ent);
var createEntityReq = new XMLHttpRequest();
var ODataPath = Xrm.Page.context.getClientUrl() + "/XRMServices/2011/OrganizationData.svc";
createEntityReq.open("POST", ODataPath + "/" + entName + "Set" + upd, false);
createEntityReq.setRequestHeader("Accept", "application/json");
createEntityReq.setRequestHeader("Content-Type", "application/json; charset=utf-8");
createEntityReq.send(jsonEntity);
var newEntity = JSON.parse(createEntityReq.responseText).d;

return newEntity;
}

function createAttachment() {
var params = getReportingSession();

if (msieversion() >= 1) {
encodePdf_IEOnly(params);
} else {
encodePdf(params);
}
}

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('');
}
}

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

function encodePdf_IEOnly(params) {
var bdy = new Array();
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, false);
retrieveEntityReq.setRequestHeader("Accept", "*/*");

retrieveEntityReq.send();
bdy = new VBArray(retrieveEntityReq.responseBody).toArray(); // minimum IE9 required

createNotesAttachment(encode64(bdy));
}

function encodePdf(params) {
var xhr = 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";
xhr.open('GET', pth, true);

xhr.setRequestHeader("Accept", "application/json");
xhr.setRequestHeader("Content-Type", "application/json; charset=utf-8");
xhr.setRequestHeader("Prefer", "odata.include-annotations=\"*\"");


xhr.responseType = 'arraybuffer';

xhr.onload = function (e) {
//xhr.onreadystatechange = function() {
if (this.status == 200) {
var uInt8Array = new Uint8Array(this.response);
base64 = encode64(uInt8Array);
CreateEmail(base64);
createNotesAttachment(base64);
}
};
xhr.send();
}

function msieversion() {

var ua = window.navigator.userAgent;
var msie = ua.indexOf("MSIE ");

if (msie > 0 || !!navigator.userAgent.match(/Trident.*rv\:11\./)) // If Internet Explorer, return version number
return parseInt(ua.substring(msie + 5, ua.indexOf(".", msie)));
else // If another browser, return 0
return 0;
}

function createNotesAttachment(base64data) {

var propertyName;
var propertyAddress;
var propertyCity;
var estimateNumber;
// if (Xrm.Page.getAttribute("name") !== null && Xrm.Page.getAttribute("name") !== undefined)
// {
// estimateNumber = Xrm.Page.getAttribute("name").getValue();
// //alert(estimateNumber);
// }
// if (Xrm.Page.getAttribute("ccc_propertyid") !== null && Xrm.Page.getAttribute("ccc_propertyid") !== undefined) {
// var propertyNameRef = Xrm.Page.getAttribute("ccc_propertyid");
// if (propertyNameRef != null && propertyNameRef != undefined) {
// propertyId = propertyNameRef.getValue()[0].id.slice(1, -1);
// propertyAddress = propertyNameRef.getValue()[0].name;
// var object = getPropertyAddress(propertyId);
// propertyName = object[1];
// propertyCity = object[2];
// }
// }

var post = Object();
post.DocumentBody = base64data;
post.Subject = estimateNumber+propertyAddress;
post.FileName = "Testing Report " + ".pdf";
post.MimeType = "application/pdf";
post.ObjectId = Object();
post.ObjectId.LogicalName = Xrm.Page.data.entity.getEntityName();
post.ObjectId.Id = Xrm.Page.data.entity.getId();
createEntity(post, "Annotation", "");
}

function CreateEmail(base64) {

var recordURL;
var propertyName;
var propertyAddress;
var propertyCity;
var estimateNumber;
var serverURL = Xrm.Page.context.getClientUrl();
var email = {};
var qid = Xrm.Page.data.entity.getId().replace(/[{}]/g, "");
var OwnerLookup = Xrm.Page.getAttribute("ownerid").getValue();
var OwnerGuid = OwnerLookup[0].id;
OwnerGuid = OwnerGuid.replace(/[{}]/g, "");
var ContactLookUp = Xrm.Page.getAttribute("im360_selectcontact").getValue();
var ContactId = ContactLookUp[0].id.replace(/[{}]/g, "");
var contactTypeName = ContactLookUp[0].typename;
var contactName = ContactLookUp[0].name;
//var signature = getSignature(OwnerGuid);
// if (Xrm.Page.getAttribute("ccc_recordurl") !== null && Xrm.Page.getAttribute("ccc_recordurl") !== undefined)
// {
// recordURL = Xrm.Page.getAttribute("ccc_recordurl").getValue();
// //alert(estimateNumber);
// }
// if (Xrm.Page.getAttribute("name") !== null && Xrm.Page.getAttribute("name") !== undefined)
// {
// estimateNumber = Xrm.Page.getAttribute("name").getValue();
// //alert(estimateNumber);
// }
// if (Xrm.Page.getAttribute("ccc_propertyid") !== null && Xrm.Page.getAttribute("ccc_propertyid") !== undefined)
// {
// var propertyNameRef = Xrm.Page.getAttribute("ccc_propertyid");
// if (propertyNameRef != null && propertyNameRef != undefined) {
// propertyId = propertyNameRef.getValue()[0].id.slice(1, -1);
// propertyAddress = propertyNameRef.getValue()[0].name;
// var object = getPropertyAddress(propertyId);
// propertyName = object[1];
// propertyCity = object[2];
// }
// }
//signature=XMLToString(signature);
//alert("OwnerGuid" + OwnerGuid + " signature" + signature);
// if (signature == null || signature == undefined)
// {
// signature = "";
// }
var string = "Hello " + contactName + " ,</br>Here is the estimate you requested for this location:</br>Estimate # " + "" + " </br>" + "" + " " + "" + ", " + "" + "</br></br>A PDF copy is attached to this email, as well.</br>If you have any questions about this estimate, please reply back to this email or call me.Thank you for considering us!</br></br>" + "";
// var string = "Hello " + contactName + " ,</br>Here is the estimate you requested for this location:</br>Estimate # <a href=" + recordURL + ">" + estimateNumber + "</a> </br>" + propertyName + " " + propertyAddress + ", " + propertyCity + "</br></br> You can click on the estimate number to view the estimate online to approve it, request changes, etc.</br>A PDF copy is attached to this email, as well.</br>If you have any questions about this estimate, please reply back to this email or call me.Thank you for considering us!</br></br>" + signature;

email["subject"] = "Tesing Subject";
// email["description"] = "Hello "+contactName+" ,"+'\n'+"Here is the estimate you requested for this location:"+'\n'+"Estimate # [ESTIMATE-NUMBER] (linked to the estimate)"+'\n'+" ([PROPERTY-NAME]) [PROPERTY-ADDRESS], [PROPERTY-CITY]"+'\n'+""+'\n'+" You can click on the estimate number to view the estimate online to approve it, request changes, etc."+'\n'+"A PDF copy is attached to this email, as well."+'\n'+"If you have any questions about this estimate, please reply back to this email or call me."+'\n'+""+'\n'+"Thank you for considering us!"+'\n'+""+'\n'+signature;
email["description"] = string;
email["regardingobjectid_im360_recurringprocess@odata.bind"] = "/im360_recurringprocesses(" + qid + ")";
//activityparty collection
var activityparties = [];
//from party
var from = {};
from["partyid_systemuser@odata.bind"] = "/systemusers(" + OwnerGuid + ")";
from["participationtypemask"] = 1;
//to party
var to = {};
to["partyid_contact@odata.bind"] = "/contacts(" + ContactId + ")";
to["participationtypemask"] = 2;

activityparties.push(to);
activityparties.push(from);

//set to and from to email
email["email_activity_parties"] = activityparties;

var req = new XMLHttpRequest();
req.open("POST", Xrm.Page.context.getClientUrl() + "/api/data/v8.2/emails", false);
req.setRequestHeader("OData-MaxVersion", "4.0");
req.setRequestHeader("OData-Version", "4.0");
req.setRequestHeader("Accept", "application/json");
req.setRequestHeader("Content-Type", "application/json; charset=utf-8");
req.onreadystatechange = function () {
if (this.readyState === 4) {
req.onreadystatechange = null;
if (this.status === 204) {
var uri = this.getResponseHeader("OData-EntityId");
var regExp = /\(([^)]+)\)/;
var matches = regExp.exec(uri);
var newEntityId = matches[1];
createEmailAttachment(newEntityId, base64);
} else {
Xrm.Utility.alertDialog(this.statusText);
}
}
};
req.send(JSON.stringify(email));
///////////////////
}
function createEmailAttachment(emailUri, base64) {
var activityId = emailUri.replace(/[{}]/g, "");
var propertyId;
var propertyName;
var propertyAddress;
var propertyCity;
var estimateNumber;
// if (Xrm.Page.getAttribute("name") !== null && Xrm.Page.getAttribute("name") !== undefined)
// {
// estimateNumber = Xrm.Page.getAttribute("name").getValue();
// }
// if (Xrm.Page.getAttribute("ccc_propertyid") !== null && Xrm.Page.getAttribute("ccc_propertyid") !== undefined)
// {
// var propertyNameRef = Xrm.Page.getAttribute("ccc_propertyid");
// if (propertyNameRef != null && propertyNameRef != undefined) {
// propertyId = propertyNameRef.getValue()[0].id.slice(1, -1);
// propertyAddress = propertyNameRef.getValue()[0].name;
// var object = getPropertyAddress(propertyId);
// propertyName = object[1];
// propertyCity = object[2];

// }
// }


var activityType = "email"; //or any other entity type
var entity = {};
entity["objectid_activitypointer@odata.bind"] = "/activitypointers(" + activityId + ")";
//entity.body = "ZGZnZA=="; //your file encoded with Base64
entity.body = base64; //your file encoded with Base64
entity.filename = "report" + ".pdf";
entity.subject = "Testing Subject";
entity.objecttypecode = activityType;
var req = new XMLHttpRequest();
req.open("POST", Xrm.Page.context.getClientUrl() + "/api/data/v8.2/activitymimeattachments", false);
req.setRequestHeader("OData-MaxVersion", "4.0");
req.setRequestHeader("OData-Version", "4.0");
req.setRequestHeader("Accept", "application/json");
req.setRequestHeader("Content-Type", "application/json; charset=utf-8");
req.onreadystatechange = function () {
if (this.readyState === 4) {
req.onreadystatechange = null;
if (this.status === 204) {
var uri = this.getResponseHeader("OData-EntityId");
var regExp = /\(([^)]+)\)/;
var matches = regExp.exec(uri);
var newEntityId = matches[1];
//alert("attachement created "+newEntityId);
} else {
Xrm.Utility.alertDialog(this.statusText);
}
}
};
req.send(JSON.stringify(entity));
}
function getPropertyAddress(pid) {
debugger;
var ccc_name;
var ccc_property1;
var ccc_propertycity;
var req = new XMLHttpRequest();
req.open("GET", Xrm.Page.context.getClientUrl() + "/api/data/v8.2/ccc_properties(" + pid + ")?$select=ccc_name,ccc_property1,ccc_propertycity", false);
req.setRequestHeader("OData-MaxVersion", "4.0");
req.setRequestHeader("OData-Version", "4.0");
req.setRequestHeader("Accept", "application/json");
req.setRequestHeader("Content-Type", "application/json; charset=utf-8");
req.setRequestHeader("Prefer", "odata.include-annotations=\"*\"");
req.onreadystatechange = function () {
if (this.readyState === 4) {
req.onreadystatechange = null;
if (this.status === 200) {
var result = JSON.parse(this.response);
ccc_name = result["ccc_name"];
ccc_property1 = result["ccc_property1"];
ccc_propertycity = result["ccc_propertycity"];
} else {
Xrm.Utility.alertDialog(this.statusText);
}
}
};
req.send();
return [ccc_name, ccc_property1, ccc_propertycity];
}
function getSignature(OwnerGuid) {
debugger;
var sig;
var req = new XMLHttpRequest();
req.open("GET", Xrm.Page.context.getClientUrl() + "/api/data/v8.2/emailsignatures?$select=presentationxml&$filter=_ownerid_value eq " + OwnerGuid, false);
req.setRequestHeader("OData-MaxVersion", "4.0");
req.setRequestHeader("OData-Version", "4.0");
req.setRequestHeader("Accept", "application/json");
req.setRequestHeader("Content-Type", "application/json; charset=utf-8");
req.setRequestHeader("Prefer", "odata.include-annotations=\"*\"");
req.onreadystatechange = function () {
if (this.readyState === 4) {
req.onreadystatechange = null;
if (this.status === 200) {
var results = JSON.parse(this.response);
for (var i = 0; i < results.value.length; i++) {
var presentationxml = results.value[i]["presentationxml"];
oXml = CreateXmlDocument(presentationxml);
sig = oXml.lastChild.lastElementChild.textContent;
}
} else {
Xrm.Utility.alertDialog(this.statusText);
}
}
};
req.send();
return sig;
}
function CreateXmlDocument(signatureXmlStr) {
// Function to create Xml formate of return email template data
var parseXml;

if (window.DOMParser) {
parseXml = function (xmlStr) {
return (new window.DOMParser()).parseFromString(xmlStr, "text/xml");
};
}
else if (typeof window.ActiveXObject != "undefined" && new window.ActiveXObject("Microsoft.XMLDOM")) {
parseXml = function (xmlStr) {
var xmlDoc = new window.ActiveXObject("Microsoft.XMLDOM");
xmlDoc.async = "false";
xmlDoc.loadXML(xmlStr);

return xmlDoc;
};
}
else {
parseXml = function () { return null; }
}

var xml = parseXml(signatureXmlStr);
if (xml) {
return xml;
}
}

////////////////////////////////////////////////////////////////////

*This post is locked for comments

I have the same question (0)

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

Responsible AI policies

As AI tools become more common, we’re introducing a Responsible AI Use…

Pallavi Phade – Community Spotlight

We are honored to recognize Pallavi Phade as our Community Spotlight honoree for…

Leaderboard > 🔒一 Microsoft Dynamics CRM (Archived)

#1
Community Member Profile Picture

Community Member 2

#1
UllrSki Profile Picture

UllrSki 2

#3
SC-08081331-0 Profile Picture

SC-08081331-0 1

Last 30 days Overall leaderboard

Featured topics

Product updates

Dynamics 365 release plans