Using JavaScript Download or save any report to Sharepoint or notes Latest 2020
This Post contains unexplained and with not best practice code, in the coming days I will refine this.
This is not Step by Step Guide and not connected, will update the post again
Also not necessary use this in UCI , it only for knowledge sharing and for UCI there many other OOB alternatives as well, will share the link Soon
1. Get Report Session
getReportingSession: function () {
var retrieveEntityReq = parent.document.getElementById("IFRAME_expiryreport").contentWindow.document.getElementById("resultFrame").contentWindow.document.documentElement.innerHTML;
var x = retrieveEntityReq.lastIndexOf("ReportSession="); var y = retrieveEntityReq.lastIndexOf("ControlID=");
var ret = new Array();
ret[0] = retrieveEntityReq.substr(x + 14, 24); ret[1] = retrieveEntityReq.substr(x + 10, 32);
return ret;
},
convertResponseToPDF: function (newPth) {
//Create query string that will be passed to Report Server to generate PDF version of report response.
//var pth = Xrm.Page.context.getClientUrl() + "/Reserved.ReportViewerWebControl.axd?ReportSession=" + arrResponseSession[0] + "&Culture=1033&CultureOverrides=True&UICulture=1033&UICultureOverrides=True&ReportStack=1&ControlID=" + arrResponseSession[1] + "&OpType=Export&FileName=Public&ContentDisposition=OnlyHtmlInline&Format=PDF";
var pth = newPth;
//Create request object that will be called to convert the response in PDF base 64 string.
var retrieveEntityReq = new XMLHttpRequest();
retrieveEntityReq.open("GET", pth, true);
retrieveEntityReq.setRequestHeader("Accept", "*/*");
retrieveEntityReq.responseType = "arraybuffer";
retrieveEntityReq.onreadystatechange = function () { // This is the callback 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 base 64 PDF formatted string and is ready to pass to the action as an input parameter.
var base64PDFString = btoa(binary);
//4. Call Action and pass base 64 string as an input parameter. That’s it
Xrm.Utility.showProgressIndicator("Converted report to PDF. Please Wait..");
var note = {};
var recordId = Xrm.Page.data.entity.getId();
recordId = recordId.replace('{', '').replace('}', '');
var NotificName = Xrm.Page.getAttribute("uniquefield").getValue();
var refInvoice = new Object();
refInvoice.LogicalName = "Logical name";
refInvoice.Id = recordId;
note.ObjectId = refInvoice;
note.ObjectTypeCode = refInvoice.LogicalName;
note.Subject = "ContractExpiryLetter: " + NotificName;
note.MimeType = "application/pdf";
note.DocumentBody = base64PDFString;
note.FileName = NotificName + ".pdf";
XrmServiceToolkit.Rest.Create(
note,
"AnnotationSet",
function (result) {
//Alert user
//alert("Note Created");
Xrm.Utility.closeProgressIndicator();
//Refresh data so user sees newly created note
Xrm.Page.data.refresh(false);
},
function (error) {
Xrm.Utility.closeProgressIndicator();
alert(error.message);
},
true
);
}
};
//This statement sends the request for execution asynchronously. Callback function will be called on completion of the request.
retrieveEntityReq.send();
}
2. Run Report to Print
runReportToPrint: function () {
var params = quoteInvoice.getReportingSession();
var newPth = 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";
quoteInvoice.convertResponseToPDF(newPth);
//window.open(newPth, "_self");
},
callActionOnButtonClick: function (data) {
//// GUID Validation
if (!quoteInvoice.isGuid(entityId)) {
alert("ID is Invalid GUID.");
Xrm.Utility.closeProgressIndicator();
return;
}
},
isGuid: function (value) {
/// <summary>
/// Checks whether value is type of GUID or not.
/// </summary>
/// <param name="value" type="type"></param>
/// <returns type=""></returns>
var validGuid = new RegExp("^({|()?[0-9a-fA-F]{8}-([0-9a-fA-F]{4}-){3}[0-9a-fA-F]{12}(}|))?$")
if (value && typeof value === "string" && validGuid.test(value)) {
return true;
}
return false;
}
};
3. Get Doc Library or Create Doc Library Sharepoint
DocLibrary = {
CheckDocumentLibraryAvailable: function () {
var fetchXmlQuery =
"<fetch version='1.0' output-format='xml-platform' mapping='logical' distinct='false'>" +
" <entity name='sharepointdocumentlocation'>" +
" <attribute name='relativeurl' />" +
" <attribute name='regardingobjectid' />" +
" <attribute name='parentsiteorlocation' />" +
" <attribute name='absoluteurl' />" +
" <attribute name='name' />" +
" <attribute name='sharepointdocumentlocationid' />" +
" <order attribute='name' descending='false' />" +
" <filter type='and'>" +
//" <condition attribute='ownerid' operator='eq-userid' />" +
" <condition attribute='statecode' operator='eq' value='0' />" +
" <condition attribute='locationtype' operator='eq' value='0' />" +
" <condition attribute='servicetype' operator='eq' value='0' />" +
" <condition attribute='regardingobjectid' operator='eq' uiname='test' uitype='" + Xrm.Page.data.entity.getEntityName() + "' value='" + Xrm.Page.data.entity.getId() + "' />" +
" </filter>" +
" </entity>" +
"</fetch>";
var req = new XMLHttpRequest();
req.open(
"GET",
Xrm.Page.context.getClientUrl() +
"/api/data/v9.0/sharepointdocumentlocations?fetchXml=" +
encodeURIComponent(fetchXmlQuery),
false
);
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);
//console.dir(results);
if (results.value.length > 0) {
return;
}
else {
DocLibrary.CreateDocumentLibrary();
}
} else {
alert(this.statusText);
}
}
};
req.send();
},
CreateDocumentLibrary: function () {
debugger;
var locationid = '';
var fetchXmlQuery =
"<fetch version='1.0' output-format='xml-platform' mapping='logical' distinct='false'>" +
" <entity name='sharepointdocumentlocation'>" +
" <attribute name='relativeurl' />" +
" <attribute name='regardingobjectid' />" +
" <attribute name='parentsiteorlocation' />" +
" <attribute name='absoluteurl' />" +
" <attribute name='name' />" +
" <attribute name='sharepointdocumentlocationid' />" +
" <order attribute='name' descending='false' />" +
" <filter type='and'>" +
// " <condition attribute='ownerid' operator='eq-userid' />" +
" <condition attribute='statecode' operator='eq' value='0' />" +
" <condition attribute='locationtype' operator='eq' value='0' />" +
" <condition attribute='servicetype' operator='eq' value='0' />" +
" <condition attribute='relativeurl' operator='eq' value='" + Xrm.Page.data.entity.getEntityName() + "' />" +
" </filter>" +
" <link-entity name='sharepointsite' from='sharepointsiteid' to='parentsiteorlocation' link-type='inner' alias='ac' />" +
" </entity>" +
"</fetch>";
var req = new XMLHttpRequest();
req.open(
"GET",
Xrm.Page.context.getClientUrl() +
"/api/data/v9.0/sharepointdocumentlocations?fetchXml=" +
encodeURIComponent(fetchXmlQuery),
false
);
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);
//console.dir(results);
if (results.value.length > 0) {
locationid = results.value[0].sharepointdocumentlocationid;
}
else {
alert('Unable to check the Sharpoint integration. Please contact administrator.');
}
} else {
alert(this.statusText);
}
}
};
req.send();
var relativepath = Xrm.Page.data.entity.getId().replace("{", "").replace("}", "").replace("-", "").replace("-", "").replace("-", "").replace("-", "");
var absolutepath = DocLibrary.ConstructPath(locationid);
var locationdetails = {
"LocationName": "Location 1",
"AbsUrl": absolutepath + relativepath,
"RelativePath": relativepath,
"ParentType": "sharepointdocumentlocation",
"ParentId": locationid,
"IsAddOrEditMode": true,
"IsCreateFolder": true,
"DocumentId": "",
"ParentEntityReference": { "@odata.type": "Microsoft.Dynamics.CRM." + Xrm.Page.data.entity.getEntityName() }
};
locationdetails["ParentEntityReference"][Xrm.Page.data.entity.getEntityName() + "id"] = Xrm.Page.data.entity.getId();
var createReq = new XMLHttpRequest();
createReq.open("POST", Xrm.Page.context.getClientUrl() + "/api/data/v9.0/AddOrEditLocation", false);
createReq.setRequestHeader("OData-MaxVersion", "4.0");
createReq.setRequestHeader("OData-Version", "4.0");
createReq.setRequestHeader("Accept", "application/json");
createReq.setRequestHeader("Content-Type", "application/json; charset=utf-8");
createReq.onreadystatechange = function () {
if (this.readyState === 4) {
createReq.onreadystatechange = null;
Xrm.Utility.closeProgressIndicator();
if (this.status === 200) {
//Success - No Return Data - Do Something
} else {
Xrm.Utility.alertDialog(this.statusText);
}
}
};
createReq.send(JSON.stringify(locationdetails));
},
4. Upload Function
UploadDocument: function (filename, base64PDFString) {
var parameters = {
"Content": base64PDFString,
"Entity": {
"@odata.type": "Microsoft.Dynamics.CRM.sharepointdocument",
"locationid": "",
"title": filename + ".pdf"
}, "OverwriteExisting": true,
"ParentEntityReference": {
"@odata.type": "Microsoft.Dynamics.CRM." + Xrm.Page.data.entity.getEntityName()
}, "FolderPath": ""
};
parameters["ParentEntityReference"][Xrm.Page.data.entity.getEntityName() + "id"] = Xrm.Page.data.entity.getId();
var req = new XMLHttpRequest();
req.open("POST", Xrm.Page.context.getClientUrl() + "/api/data/v9.0/UploadDocument", true);
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 (filename.indexOf("OppSummary") == -1)
Xrm.Utility.closeProgressIndicator();
if (this.status === 204) {
//Success - No Return Data - Do Something
} else {
Xrm.Utility.alertDialog(this.statusText);
}
}
};
req.send(JSON.stringify(parameters));
}
};
As Mention above is not in Steps or Connected, I Will add steps soon. thanks


