我是微软Dynamics 365 & Power Platform方面的工程师/顾问罗勇,也是2015年7月到2018年6月连续三年Dynamics CRM/Business Solutions方面的微软最有价值专家(Microsoft MVP),欢迎关注我的微信公众号 MSFTDynamics365erLuoYong ,回复449或者20210707可方便获取本文,同时可以在第一间得到我发布的最新博文信息,follow me!
前面的博文 Dynamics 365报表开发之安装Report Authoring Extension 讲了工具的安装,今天我们来做个报表,做个基于客户实体的报表,展示该该客户下面的联系人,并且为联系人名字做个超链接可以点击。这里我会做两个报表,一个父报表,一个子报表。
主要的官方文档可以参考 Report writing guide for Dynamics 365 Customer Engagement (on-premises), version 9.x ,Add report navigation,Use parameters in reports ,Publish reports using the web application,Best practices for reports 。还有一些非官方文章也很值得参考:Create an ***S report for Dynamics 365 – Part 1 ,Create an ***S Report for Dynamics 365 – Part 2.
首先添加一个项目,项目类型为 Report Server Project,
右击Reports文件夹,选择 Add > New Item... 。
选择 Report 这个类型,输入个合适名字,点击 Add 按钮
如果刚才新增的Report没有打开的话双击打开,然后在左边的 Data Sources 文件夹上右击选择 Add Data Source.
在Data Source Properties这个窗口的General Tab中,Name我一般取名为D365DataSource,Embedded connection的Type请选择 Microsoft Dynamics 365 Fetch, 然后Connection string我输入的是 https://luoweidemo.crm5.dynamics.com;unqa38a904d9ebf43cd9aab92098bb67 。这个connection string分号分隔的前面部分好理解,就是访问的URL,后面这串数字则来自Advanced Settings > Customizations > Developer Resources 页面中的Unique Name的值,如后图。
然后就是设置好连接用的Credentials,如下图,点击OK按钮保存并关闭。
然后我需要新建一个Data Set,这是用来展示客户的信息,我这里使用的FetchXml如下,需要注意到增加了 enableprefiltering="1"这个属性,而且FetchXml中不要包括filter元素。
<fetch version="1.0" mapping="logical" distinct="false">
<entity name="account" enableprefiltering="1">>
<attribute name="name" />
<attribute name="primarycontactid" />
<attribute name="telephone1" />
<attribute name="accountid" />
</entity>
</fetch>
右击左边Data Sources下面的Datasets,选择Add Dataset,弹出的Dataset Properties窗体如下,名字命名成有意义的,选择 Use a dataset embedded in my report,Data source选择前面步骤的创建的D365DataSource,Query type选择Text,用前面的FetchXml,然后点击 OK 按钮关闭。
可以看到新建的Dataset如下图:
通过左边的 Toolbox,拉一个 List 组件到右边的报表中,设置该List组件对应的Tablix的 DataSetName 属性为 AccountDataSet ,然后将要的字段拖动到 List组件中。
点击Preview可以预览如下:
然后需要添加另外一个报表作为子报表,我命名为 AccountContactReport,方法类似不再重复,Data Source的设置同父报表, Dataset我用FetchXml的如下,因为我是用来做子报表的,所以不需要添加enableprefiltering="1"这个属性,而且也要保留适当的filter,当然父记录ID这个筛选我就换成了一个参数,到时候由父报表传递过来。
<fetch version="1.0" output-format="xml-platform" mapping="logical" distinct="false">
<entity name="contact">
<attribute name="fullname" />
<attribute name="telephone1" />
<attribute name="contactid" />
<attribute name="emailaddress1" />
<order attribute="fullname" descending="false" />
<filter type="and">
<condition attribute="statecode" operator="eq" value="0" />
<condition attribute="parentcustomerid" operator="eq" value="@AccountId" />
</filter>
</entity>
</fetch>
对于这个子报表,我用Table来呈现数据,设置这个Table的DataSetName 属性为 ContactDataSet ,并将三个列放到table中。
为了方便预览报表,将刚才自动生成的参数 AccountId我设置一个合适的默认值,然后确保预览没有问题。
为了跳转到CRM我需要获取CRM的URL,我这里新增一个Parameter,如下,Name我设置为CRM_URL。
为了方便预览,我也为这个Parameter设置一个默认值,我这里设置为 https://luoweidemo.crm5.dynamics.com/main.aspx ,如下图,然后点击OK按钮保存。
然后右击我要做超链接的列,选择 Text Box Properties...
在弹出框的Action Tab中我选择 Go to URL,并设置Select URL的值为表达式 =Left(Parameters!CRM_URL.Value,InStr(Parameters!CRM_URL.Value,"dynamics.com") + 11) & "/main.aspx?pagetype=entityrecord&etn=contact&id=" & Fields!contactid.Value 。当然,为了显示这个是超链接,我还可以为这个单元格设置下划线效果。
然后我去预览下如下,需要确保预览不会有问题。
然后我需要将这个子报表嵌入到父报表中。父报表也需要增加一个名称为 CRM_URL 的Parameter (这个Parameter的名称不能改,一定要是CRM_URL),该Parameter其余的设置和子报表的一样。右击父报表的Tablix中的空白处选择 Insert > Subreport 。
然后右击刚才插入的子报表,选择 Subreport Properties,设置好 Use this report as subreport的值。
还需要设置传递给子报表的两个参数的值,我这里设置如下:
预览没有问题后,我们在某个解决方案中,点击左侧的Reports 节点,然后New一个报表,Report Type选择Existing File,然后选择父报表,其余设置如下图,保存。
然后再创建子报表,如下图,Parent Report字段的值会自动设置好。
然后我们去看效果,打开一个account,点击Run Report 按钮,
选择制作的报表来看效果:
效果如下,contact的链接点击也好用。