D365报表中如何获取打印用户的Network Alias及关联联系人PrimaryPhone
D365报表获取打印用户Network Alias及联系人PrimaryPhone的可行方案
嗨,我刚好处理过类似的D365报表需求,完全可以通过数据集配置或者SSRS表达式来实现你的需求,下面给你详细拆解:
一、基于UserId获取Network Alias的方法
Dynamics 365里的系统用户实体(systemuser)本身就存储了Network Alias,对应的字段是networkdomainname。你可以通过两种方式获取:
1. 使用FetchXML数据集直接获取
在报表的数据集里编写FetchXML,直接过滤当前打印用户的记录,就能拿到Network Alias:
<fetch top="1"> <entity name="systemuser"> <attribute name="networkdomainname" /> <attribute name="contactid" /> <!-- 用于关联联系人 --> <filter> <condition attribute="systemuserid" operator="eq-userid" /> </filter> </entity> </fetch>
这里的eq-userid运算符会自动匹配当前执行报表(打印)的用户ID,无需手动传入参数。
2. 使用SSRS Lookup表达式
如果已经有包含系统用户数据的数据集(比如名为SystemUsers),可以用Lookup函数直接关联:
=Lookup(Globals!UserID, Fields!systemuserid.Value, Fields!networkdomainname.Value, "SystemUsers")
简单解释下:
Globals!UserID:报表内置的当前用户ID变量- 前两个参数是用当前用户ID匹配数据集里的用户ID字段,第三个参数指定要返回的Network Alias字段,最后是数据集名称
二、关联获取联系人的PrimaryPhone
拿到用户关联的contactid后,同样可以通过FetchXML或者Lookup表达式获取联系人的PrimaryPhone(默认字段是telephone1):
1. 在FetchXML中直接关联联系人实体
修改之前的FetchXML,添加对contact实体的关联,一次性拿到所有需要的字段:
<fetch top="1"> <entity name="systemuser"> <attribute name="networkdomainname" /> <link-entity name="contact" from="contactid" to="contactid" link-type="inner"> <attribute name="telephone1" /> <!-- 这就是联系人的PrimaryPhone --> </link-entity> <filter> <condition attribute="systemuserid" operator="eq-userid" /> </filter> </entity> </fetch>
这样数据集里会直接返回networkdomainname(Network Alias)和telephone1(PrimaryPhone)两个字段,直接绑定到报表控件即可。
2. 使用SSRS Lookup表达式关联联系人
如果已经有联系人数据集(比如Contacts),可以用嵌套Lookup:
=Lookup( Lookup(Globals!UserID, Fields!systemuserid.Value, Fields!contactid.Value, "SystemUsers"), Fields!contactid.Value, Fields!telephone1.Value, "Contacts" )
先通过用户ID拿到关联的联系人ID,再用联系人ID获取对应的PrimaryPhone。
注意事项
- 确保报表的运行账号有访问
systemuser和contact实体的权限,否则会出现数据为空的情况 - 如果你使用的是自定义字段而非默认字段,需要替换成对应的字段逻辑名
内容的提问来源于stack exchange,提问作者Gabriela




