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

Announcements

No record found.

News and Announcements icon
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

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 Winners!

Congratulations to our community stars!

Women in Power Builds Momentum

Expanding mentorship, skilling, and AI innovation

Congratulations to the July Top 10 Community Leaders

These are the community rock stars!

Leaderboard > 🔒一 Microsoft Dynamics CRM (Archived)

#1
ScottDurow Profile Picture

ScottDurow 2

Last 30 days Overall leaderboard

Featured topics

Product updates

Dynamics 365 release plans