神秘的 CRM Lookup (II)
4. 现在我们来看看Lookup的条件过滤,CRM3和CRM4有很大不同,我们通过例子来说明:
我们用的例子是:在公司(Account)记录里的主要联系人(primarycontactid) Lookup列表里只显示和这条公司记录(Account)有关联的联系人(Contact)。
a. CRM 3.0
if (crmForm.FormType == 2 && crmForm.ObjectId != null)
{
crmForm.all.primarycontactid.lookupbrowse = 1;
crmForm.all.primarycontactid.additionalparams = "fetchXml="
+ "<fetch mapping='logical'><entity name='contact'><all-attributes /><filter>"
+ "<condition attribute='accountid' operator='eq' value='" + crmForm.ObjectId + "' />"
+ "</filter></entity></fetch>";
}
b. CRM 4.0
据我目前了解,在CRM4.0里主要有两种unsupported customization可以进行这样的过滤。由于这个例子并不需要复杂的FetchXml查询,所以我们用第一种方法:
(1) 定制联系人(Contact) 实体, 打开 Contacts Lookup View, 点击'添加新的搜索栏'( Add Find Column), 选择parentcustomerid,保存并发布。
(2) 定制公司 (Account) 实体,在onLoad()里面添加如下代码:
if (crmForm.FormType == 2 && crmForm.ObjectId != null)
{
var name = crmForm.all.name.DataValue;
crmForm.all.primarycontactid.additionalparams = 'search=' + name;
}
这里使用到了‘search’参数,它的作用相当于用户在搜索栏填写了搜索内容。这里的搜索内容就是‘公司名’,由于我们在第一步已经将公司名添加到了搜索关键字栏,所以这个lookup将返回我们指定的公司(Account)记录。
现在如果我们把要求改变一下:只显示和这个公司(Account)的上级公司(parentaccountid)有关联的联系人(Contact)。
第一步是一样的,第二步改成如下代码:
FilterLookup = function(source, target)
{
if (IsNull(source) || IsNull(target)) { return; }
var name = IsNull(source.DataValue) ? '' : source.DataValue[0].name;
target.additionalparams = 'search=' + name;
}
上级公司(parentaccountid)也是一个Lookup,我们还要在它的 onChange()里面添加代码:
FilterLookup(crmForm.all.parentaccountid, crmForm.all.primarycontactid);
Ok, 现在问题解决了!
如果我们再改变一下要求:我们希望当用户选择了上级公司(parentaccountid)后,这个上级公司主要联系人(primarycontactid) 自动填充到当前公司(account)的主要联系人里。
虽然我们可以使用 AJAX 技术来达到这个目的,CRM4.0为我们提供了一个更酷的特性:Lookup自动填充(automatic resolutions)功能。
感谢 Adi Katz, 让我们从头开始来实现它:
(1) 关闭上级公司(parentaccountid) 的自动填充功能(automatic resolutions in field),只需要在Form上双击parentaccountid区域,然后在第一页就可以看到选项来取消这个功能。
(2) 在Form.onLoad()里面输入如下代码:
{
var contactLookup = crmForm.all.primarycontactid;
if( contactLookup.DataValue != null ) {return;}
contactLookup.AutoResolve = 1;
var accountLookup = crmForm.all.parentaccountid;
primaryContact = accountLookup.items[0].keyValues.primarycontactid;
contactLookup.SetFocus();
contactDiv = document.all.primarycontactid_d.getElementsByTagName("DIV")[0];
contactDiv.innerText = primaryContact.value;
contactLookup.Lookup( true , true , primaryContact.value , true );
}
function OnCrmPageLoad()
{
crmForm.all.parentaccountid.attachEvent( "onafterselect" , OnAfterAccountSelect );
}
OnCrmPageLoad();
Ok! 所有问题都解决了。一开始提到的CRM 4.0复杂的FetchXml过滤功能将在下一篇blog里详细解释。:)