MS Dynamics CRM 2013 - SSRS报告获取当前id作为参数

时间:2014-08-25 10:35:16

标签: reporting-services parameters report crm

我有一个自定义实体,它是"子账户" CRM实体"账户" "子帐户"是指账户(公司)的子公司

我有一个简单的报告,显示"子账户的详细信息" (单一子公司)

这就是为什么,每次用户必须填写"子帐户名称时,我都会添加一个过滤参数。过滤报告。

因为我在"子帐户"上运行报告。直接页面,我发现在报告网址中有" id = ..........."和"记录= ............."使用不可读的长文本,我在数据库中找到了这些长文本,这正是" id"当前"子帐户"

我想知道,如果id可以作为默认参数传递到报告中,那么用户就不必自己填充参数。

请告知是否有可能?怎么样?

1 个答案:

答案 0 :(得分:0)

是的,有可能。您需要在“子帐户”功能区中添加一个按钮,并编写一些JavaScript来构造URL并在新窗口中打开该URL。如果您还没有,我建议您专门为此实体创建一个JavaScript webresource,其名称类似于subaccounts_main_library.js。将下面的代码粘贴到库中,输入报告的名称并保存/发布。将按钮添加到功能区时,需要设置该命令以触发runReport()功能。

您还需要下载最新的jQuery(2.1.1)和JSON2库,然后将每个库作为Web资源上传。

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/

希望这会帮助你。如果您需要任何其他帮助,请与我们联系。