我是微软Dynamics 365 & Power Platform方面的工程师/顾问罗勇,也是2015年7月到2018年6月连续三年Dynamics CRM/Business Solutions方面的微软最有价值专家(Microsoft MVP),欢迎关注我的微信公众号 MSFTDynamics365erLuoYong ,回复443或者20210601可方便获取本文,同时可以在第一间得到我发布的最新博文信息,follow me!
Cutomer这种数据类型(Data Type)具有一定的复合型,我们自定义的查找字段(Lookup field)只能Lookup到一个实体,但是Customer这种数据类型却可以Lookup到两个实体,分别是客户(account)和联系人(contact)两个实体,查找字段在赋值时候既可以选择客户实体记录也可以选择联系人客户实体记录,具有一定的灵活性。
在项目实施过程中我们可能优先利用现有字段,有时候会需要限定Customer类型字段只能选择客户或者联系人,怎么办?以前没有特别好的办法,是用权限来控制。比如不给用户contact实体权限,这样用户就只能选择account实体记录了。新的客户端API setEntityTypes (Client API reference) 是可以帮你实现的,我们来具体看看实现的方法。
首先我们知道案例实体(incident)的Customer字段就是Customer类型的字段,它的定义如下:
在没有客制化之前,我们在Case实体表单上可以看到Customer字段既可以选择客户,也可以选择联系人。
然后我使用如下的代码:
"use strict"; var LuoYong = window.LuoYong || {}; LuoYong.IncidentForm = LuoYong.IncidentForm || {}; (function () { this.onLoad = function (executionContext) { var formContext = executionContext.getFormContext(); formContext.getControl("customerid").setEntityTypes(["account"]); } }).call(LuoYong.IncidentForm);
并使Case表单的On Load事件执行该代码:
发布后然后我们去看效果,可以看到只能选择Account了,目的达到。
如果我要通过Web API来给Customer字段赋值呢?其实有两个关系,当赋值为Account的时候和赋值为Contact的时候不一样,自然通过Web API为Customer类型字段的赋值方法也稍有不同。可以通过Metadata Browser来查看,如下图:
赋值为account实体记录和contact实体记录的示例代码如下,通过组织服务的话则没有多大区别,都是 EntityReference类型。
var data = { "customerid_account@odata.bind": "/accounts(7076d7bb-3aa3-eb11-b1ac-00224816920b)", "title": "Customer is account" } Xrm.WebApi.createRecord("incident", data).then( function success(result) { console.log("Case created with ID: " + result.id); }, function (error) { console.log(error.message); } ); data = { "customerid_contact@odata.bind": "/contacts(d876d7bb-3aa3-eb11-b1ac-00224816920b)", "title": "Customer is contact" } Xrm.WebApi.createRecord("incident", data).then( function success(result) { console.log("Case created with ID: " + result.id); }, function (error) { console.log(error.message); } );