
Hi,
I have created a custom button on which js is working fine for opening pdf of SSRS report, but when I change SSRS repor, I am getting an error of failed to load file while executing js from button to open pdf of SSRS report in a new window. After debugging, I found the error response: "<!DOCTYPE html><html><head><script type='text/javascript'>window.location.href = '/_common/error/errorhandler.aspx?BackUri=https%3a%2f%2fpsm.crm8.dynamics.com%2fuclient%2fblank.htm%3fv%3d1.4.4480-2207.2&ErrorCode=0x8004832C&inline=1&Parm0=%0d%0a%0d%0a&Parm1=&RequestUri=%2fCRMReports%2frsviewer%2freportviewer.aspx&user_lcid=1033';</script></head><body></body></html>" I am unable to get the reason for this error.
Please find the code
var base64 = null;
function generate_letter(primarycontrol)
{
debugger;
var formContext = primarycontrol;
//alert("1");
createReport(formContext);
}
function createReport(formContext)
{
debugger;
var params = getReportingSession(formContext);
var pth = 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=Public&ContentDisposition=OnlyHtmlInline&Format=PDF";
// alert("2");
fnConvertReportToWord(formContext, pth);
}
function getReportingSession(formContext)
{
debugger;
var reportName = "Demand Letter_h";
var reportGuid = "19fc1a88-7206-ed11-82e6-002248d5bacf";
var rptPathString = "";
var selectedIds = formContext.data.entity.getId().replace("{", "").replace("}", "");
var pth = Xrm.Utility.getGlobalContext().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='psm_letterreport'><all-attributes /><filter type='and'><condition attribute='psm_letterreportid' 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.Utility.getGlobalContext().organizationSettings.uniqueName + "&iscustomreport=true&reportnameonsrs=&reportName=" + reportName + "&isScheduledReport=false&p:CRM_Filteredpsm_letterreport=" + 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;
}
var StringMaker = function ()
{
debugger;
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)
{
debugger;
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 fnConvertReportToWord(formContext, queryString)
{
debugger;
try
{
//alert("3");
var base64WordString = "";
var retrieveEntityReq = new XMLHttpRequest();
retrieveEntityReq.open("GET", queryString, true);
retrieveEntityReq.setRequestHeader("Accept", "*/*");
retrieveEntityReq.responseType = "arraybuffer";
retrieveEntityReq.onreadystatechange = function ()
{ // This is the call-back function.
if (retrieveEntityReq.readyState === 4 && retrieveEntityReq.status === 200)
{
var binary = "";
var bytes = new Uint8Array(this.response);
for (var i = 0; i < bytes.byteLength; i++)
{
binary += String.fromCharCode(bytes[i]);
}
//This is the base64 Word formatted string
base64WordString = btoa(binary);
//alert(base64WordString);
let pdfWindow = window.open("")
pdfWindow.document.write(
"<iframe width='100%' height='100%' src='data:application/pdf;base64, " + encodeURI(base64WordString) + "'></iframe>")
}
};
//This statement sends the request for execution asynchronously. Callback function will be called on completion of the request.
retrieveEntityReq.send();
}
catch (ex)
{
Xrm.Utility.alertDialog(ex);
}
}
Hi ShoaibKhan,
After you change the SSRS report, did you try to preview it in the Visual Studio? Did it work?