是的,这是可能的。您需要向“子帐户”功能区添加一个按钮并编写一些 JavaScript 来构建 URL 并在新窗口中打开该 URL。如果您还没有,我建议您专门为此实体创建一个 JavaScript 网络资源,命名为 subaccounts_main_library.js。将下面的代码粘贴到库中,输入报告的名称并保存/发布。当您将按钮添加到功能区时,需要设置该命令以触发 runReport() 函数。
您还需要下载最新的 jQuery (2.1.1) 和 JSON2 库,然后将它们作为网络资源上传。
function runReport() {
openReport('<put the name of your report here>');
}
function openReport (reportName) {
var oDataSetName = "ReportSet";
var columns = "ReportId";
var filter = "Name eq '" + reportName + "'";
retrieveMultiple(oDataSetName, columns, filter, onSuccess);
currReportName = reportName;
}
var currReportName;
function onSuccess (data, textStatus, XmlHttpRequest) {
var serverUrl = Xrm.Page.context.getServerUrl();
if (data && data.length > 0) {
var serverUrl = Xrm.Page.context.getServerUrl();
var id = Xrm.Page.data.entity.getId();
var etc = Xrm.Page.context.getQueryStringParameters().etc;
var entityId = id.replace('{', '').replace('}', '');
var reportId = data[0].ReportId.replace('{', '').replace('}', '');
var url = serverUrl + "/crmreports/viewer/viewer.aspx?action=run&context=records&helpID=" + currReportName + ".rdl&id=%7b" + reportId + "%7d&records=%7b" + entityId + "%7d&recordstype=" + etc + "&p:InvoiceId=" + entityId;
window.open(url, "reportwindow", "resizable=1,width=950,height=700");
}
}
function retrieveMultiple(odataSetName, select, filter, successCallback) {
var serverUrl = Xrm.Page.context.getServerUrl();
var ODATA_ENDPOINT = "/XRMServices/2011/OrganizationData.svc";
var odataUri = serverUrl + ODATA_ENDPOINT + "/" + odataSetName + "?";
if (select) {
odataUri += "$select=" + select + "&";
}
if (filter) {
odataUri += "$filter=" + filter;
}
$.ajax({
type: "GET",
contentType: "application/json; charset=utf-8",
datatype: "json",
url: odataUri,
beforeSend: function (XMLHttpRequest) {
XMLHttpRequest.setRequestHeader("Accept", "application/json");
},
success: function (data, textStatus, XmlHttpRequest) {
if (successCallback) {
if (data && data.d && data.d.results) {
successCallback(data.d.results, textStatus, XmlHttpRequest);
}
else if (data && data.d) {
successCallback(data.d, textStatus, XmlHttpRequest);
}
else {
successCallback(data, textStatus, XmlHttpRequest);
}
}
},
error: function (XmlHttpRequest, textStatus, errorThrown) {
if (XmlHttpRequest && XmlHttpRequest.responseText) {
alert("Error while retrieval ; Error – " + XmlHttpRequest.responseText);
}
}
});
}
我不能把上面的代码归功于我。我们要感谢 Rajeev Pentyala 在他的博客上发表的精彩文章。 http://rajeevpentyala.wordpress.com/2012/04/10/opening-a-report-using-ribbon-button-in-crm-2011/
希望这对您有所帮助。如果您需要任何其他帮助,请告诉我。