• MS CRM 2011 如何嵌入Report Viewer


    原创地址:http://www.cnblogs.com/jfzhu/archive/2012/12/27/2835098.html

    转载请注明出处

    在CRM 2011中,Chart与Report是两个很强大的数据统计的图形化工具,只有用好了Chart与Report才能发挥出CRM在数据统计方面的威力。我在前面的博客中演示了如何将Chart嵌入到Dashboard和Form中,本文中我再演示如何利用Report Viewer将Report嵌入到Dashboard与Form中。

    (一) 将Report嵌入Dashboard中

    CRM 2011中,创建Report有两种方式,基于SQL的Report基于Fetch的Report。我在本文中以基于Fetch的Report为例,创建一个report,里边给出所有的account及order的TotalAmount。

    使用的FetchXML定义如下:

    <fetch version="1.0" output-format="xml-platform" mapping="logical" distinct="false"> 
      <entity name="account"> 
        <attribute name="accountid" /> 
        <attribute name="name" /> 
        <order attribute="name" descending="false" /> 
        <link-entity name="salesorder" from="customerid" to="accountid" alias="aa"> 
          <attribute name="ordernumber"/> 
          <attribute name="totalamount"/> 
          <filter type="and"> 
            <condition attribute="totalamount" operator="not-null" /> 
          </filter> 
        </link-entity> 
      </entity> 
    </fetch>

    Report的定义如下:

    image

    将report上传到CRM中,上传成功后,获得reportid为{7EC592B7-B14F-E211-B622-D48564531939}

    然后我们创建一个web resource, new_ReportViewerDashboard.html

    <html> 
    <head> 
        <title></title> 
    </head> 
    <body  onload="submitForm()"> 
        <script type="text/javascript"  src="ClientGlobalContext.js.aspx"></script> 
        <script type="text/javascript"> 
            function submitForm() { 
                var form = document.forms[0]; 
                var context = GetGlobalContext(); 
                form.action = context.getServerUrl() + '/CRMReports/rsviewer/reportviewer.aspx'; 
                form.uniquename.value = context.getOrgUniqueName();            
                var query = window.location.search.substring(1);            
                var vars = query.split("&"); 
                var idSet = false;
    
                for (var i = 0; i < vars.length; i++) {                
                    var pair = vars[i].split("=");                
                    switch (pair[0]) {                
                        case 'data':                    
                            var params = unescape(pair[1]).split("&");                    
                            for (var j = 0; j < params.length; j++) {                        
                                var param = params[j].split("=");                        
                                switch (param[0]) {                            
                                    case 'reportid':                                
                                        form.id.value = param[1];                                
                                        idSet = true;                                
                                        break;                            
                                    case 'hideparams':                                
                                        form.PromptAreaCollapsed.value = param[1];                                
                                        break;                            
                                    case 'iscustomreport':                                
                                        form.iscustomreport.value = param[1];                                
                                        break;                            
                                    default: 
                                        // Add any other values as report parameters                                
                                        var paramInput = document.createElement('input'); 
                                        paramInput.setAttribute('type', 'hidden'); 
                                        paramInput.setAttribute('name', 'p:' + param[0]); 
                                        paramInput.setAttribute('value', param[1]); 
                                        form.appendChild(paramInput); 
                                        break; 
                                } 
                            }            
                    } 
                }
    
                if (idSet) {            
                    form.submit();        
                }        
                else { 
                    // Show message            
                    var dvMessage = document.createElement("div"); 
                    dvMessage.innerHTML = "Report Id is not set"; 
                    form.appendChild(dvMessage);         
                }            
            } 
        </script> 
    <form action="" method="post"> 
    <input type="hidden" name="id" value="{xxx}" /> 
    <input type="hidden" name="uniquename" value="" /> 
    <input type="hidden" name="iscustomreport" value="true" /> 
    <input type="hidden" name="reportName" value="Report Name" /> 
    <input type="hidden" name="isScheduledReport" value="false" /> 
    <input type="hidden" name="PromptAreaCollapsed" value="false" /> 
    </form> 
    </body> 
    </html> 

    注意几点:

    (1) 在body的onload事件中,直接将表单(Form)提交到Report Viewer(/CRMReports/rsviewer/reportviewer.aspx)中;

    (2) 对ClientGlobalContext.js.aspx的引用。如果你的web resource命名为new_test/ReportViewerDashboard.html,那么引用就应改为../ClientGlobalContext.js.aspx

    (3) 表单提交的方式必须为 post。

    接下来创建一个新的Dashboard,并插入web resource new_ReportViewerDashboard.html

    image

    在对web resource的属性定义中,一定要在Custom Parameter(data)中填写进reportid,如下图所示

    image

    publish 之后,打开Dashboard看一下

    image

    如果你将web resource 的表单提交方式改为get(当然这样你就无法在dashboard中看到report了),你会看到提交到report viewer的URL为

    https://aaronbabbitt.crm4.dynamics.com/CRMReports/rsviewer/reportviewer.aspx?id={7EC592B7-B14F-E211-B622-D48564531939}&uniquename=aaronbabbitt&iscustomreport=true&reportName=Report Name&isScheduledReport=false&PromptAreaCollapsed=false

    (二) 将Report嵌入Dashboard中并使用自定义参数

    如果嵌入dashboard的report使用了自定义参数该怎么办?下面我们创建一个report使用自定义参数ownerid,我们只获得ownerid等于参数值的account及order。Fetch的定义如下:

    <fetch version="1.0" output-format="xml-platform" mapping="logical" distinct="true"> 
      <entity name="account"> 
        <attribute name="accountid" /> 
        <attribute name="name" /> 
        <order attribute="name" descending="false" /> 
        <filter type="and"> 
          <condition attribute="ownerid" operator="eq" uitype="systemuser" value="@ownerid" /> 
        </filter> 
        <link-entity name="salesorder" from="customerid" to="accountid" alias="aa"> 
          <attribute name="ordernumber"/> 
          <attribute name="totalamount"/> 
          <filter type="and"> 
            <condition attribute="totalamount" operator="not-null" /> 
          </filter> 
        </link-entity> 
      </entity> 
    </fetch>

    同样将report上传到CRM中,获得reportid为{BD814A01-BB4F-E211-B622-D48564531939}。我的CRM用户systemuserid 为 {D608D786-8654-4933-9E7E-28B2950A382B}。

    在Dashboard中再插入一次web resource new_ReportViewerDashboard.html,但注意这次web resource的属性与上面不同,在Custom Parameter(data)中,需要定义reportid, ownerid,以及hideparams(用来隐藏参数)。

    reportid={BD814A01-BB4F-E211-B622-D48564531939}&ownerid={D608D786-8654-4933-9E7E-28B2950A382B}&hideparams=true

    image

    publish后看到结果如下:

    image

    (三) 将Report嵌入Form中并使用自定义参数

    将report嵌入到form中,通常就意味着我们只想看到关于该entity的report。还以上面的report为例,我们使用一个entityid自定义参数,再报表中我们只显示accountid等于参数值的account及order。FetchXML定义如下:

    <fetch version="1.0" output-format="xml-platform" mapping="logical" distinct="true"> 
      <entity name="account"> 
        <attribute name="accountid" /> 
        <attribute name="name" /> 
        <order attribute="name" descending="false" /> 
        <filter type="and"> 
          <condition attribute="accountid" operator="eq" uitype="account" value="@entityid" /> 
        </filter> 
        <link-entity name="salesorder" from="customerid" to="accountid" alias="aa"> 
          <attribute name="ordernumber"/> 
          <attribute name="totalamount"/> 
          <filter type="and"> 
            <condition attribute="totalamount" operator="not-null" /> 
          </filter> 
        </link-entity> 
      </entity> 
    </fetch>

    同样将report上传到CRM中,获得reportid为{E13A5A3D-C04F-E211-B622-D48564531939}。

    创建一个新的HTML web resouce,它与之前web resouce的不同之处在于对entityid的处理,具体看下面代码:

    <html> 
    <head> 
        <title></title> 
    </head> 
    <body  onload="submitForm()"> 
        <script type="text/javascript"  src="ClientGlobalContext.js.aspx"></script> 
        <script type="text/javascript"> 
            function submitForm() { 
                var form = document.forms[0]; 
                var context = GetGlobalContext(); 
                form.action = context.getServerUrl() + '/CRMReports/rsviewer/reportviewer.aspx'; 
                form.uniquename.value = context.getOrgUniqueName();            
                var query = window.location.search.substring(1);            
                var vars = query.split("&"); 
                var idSet = false;
    
                for (var i = 0; i < vars.length; i++) {                
                    var pair = vars[i].split("="); 
                    switch (pair[0]) { 
                        case 'id':                        
                            var paramInput = document.createElement('input'); 
                            paramInput.setAttribute('type', 'hidden'); 
                            paramInput.setAttribute('name', 'p:entityid'); 
                            paramInput.setAttribute('value', unescape(pair[1]));                        
                            form.appendChild(paramInput); 
                            break; 
                        case 'data': 
                            var params = unescape(pair[1]).split("&"); 
                            for (var j = 0; j < params.length; j++) { 
                                var param = params[j].split("="); 
                                switch (param[0]) { 
                                    case 'reportid': 
                                        form.id.value = param[1]; 
                                        idSet = true; 
                                        break; 
                                    case 'hideparams': 
                                        form.PromptAreaCollapsed.value = param[1]; 
                                        break; 
                                    case 'iscustomreport': 
                                        form.iscustomreport.value = param[1]; 
                                        break; 
                                    default: 
                                        // Add any other values as report parameters                                
                                        var paramInput = document.createElement('input'); 
                                        paramInput.setAttribute('type', 'hidden'); 
                                        paramInput.setAttribute('name', 'p:' + param[0]); 
                                        paramInput.setAttribute('value', param[1]); 
                                        form.appendChild(paramInput); 
                                        break; 
                                } 
                            }            
                    } 
                }
    
                if (idSet) {            
                    form.submit();        
                }        
                else { 
                    // Show message            
                    var dvMessage = document.createElement("div"); 
                    dvMessage.innerHTML = "Report Id is not set"; 
                    form.appendChild(dvMessage);         
                }            
            } 
        </script> 
    <form action="" method="post"> 
    <input type="hidden" name="id" value="{xxx}" /> 
    <input type="hidden" name="uniquename" value="" /> 
    <input type="hidden" name="iscustomreport" value="true" /> 
    <input type="hidden" name="reportName" value="Report Name" /> 
    <input type="hidden" name="isScheduledReport" value="false" /> 
    <input type="hidden" name="PromptAreaCollapsed" value="false" /> 
    </form> 
    </body> 
    </html>

    然后在account的Form中插入该web resouce,web resouce的属性如下:

    image

    要注意需要勾选上 Pass record object-type code and unique identifier as parameter。

    如果你感兴趣可以试着看一下传递给web resouce的参数为什么,alert(window.location.search.substring(1));


    data=reportid%3d%7bE13A5A3D-C04F-E211-B622-D48564531939%7d%26hideparams%3dtrue&id=%7b55B16BF4-6219-E211-B112-3C4A92DBD80A%7d&orglcid=1033&orgname=aaronbabbitt&type=1&typename=account&userlcid=1033

    我们看到有account的id,用户使用的语言,organization name等等。

    最后看一下结果,只显示了当前form的account:

    image

    总结:本文介绍了如何将report嵌入到dashboard或者form中。基本的方法就是,先手动创建一个report(最好不要使用CRM生成的report),你可以为该report定义自定义参数,然后将report上传到CRM中。接下来再创建一个web resouce,web resouce中利用了body的onload事件处理,将表单提交到Report Viewer中去。在dashboard或者form中插入web resouce时,要注意对web resouce 属性的配置。

  • 相关阅读:
    iOS ARC下命名规则
    performSelector may cause a leak because its selector is unknown
    performSelector may cause a leak because its selector is unknown
    Block的Retain Cycle的解决方法
    Block的Retain Cycle的解决方法
    iOS 5 ARC 入门
    iOS 5 ARC 入门
    Xcode 5 SVN配置
    Python基本语法_基本数据类型_序列类型详解
    Python基本语法_基本数据类型_序列类型详解
  • 原文地址:https://www.cnblogs.com/jfzhu/p/2835098.html
Copyright © 2020-2023  润新知