神秘的 CRM Lookup (II)

4. 现在我们来看看Lookup的条件过滤,CRM3和CRM4有很大不同,我们通过例子来说明:
我们用的例子是:在公司(Account)记录里的主要联系人(primarycontactid) Lookup列表里只显示和这条公司记录(Account)有关联的联系人(Contact)。
 
a. CRM 3.0 

/* CRM 3.0: only show account owned contacts in the primarycontactid lookup : Form.onLoad() */ 
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()里面添加如下代码:

/* CRM 4.0: only show account owned contacts in the primarycontactid lookup : Form.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)。
第一步是一样的,第二步改成如下代码:

/* CRM 4.0: only show parent account owned contacts in the primarycontactid lookup : Form.onLoad() */ 
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()里面添加代码:

/* CRM 4.0: only show parent account owned contacts in the primarycontactid lookup : parentaccountid.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()里面输入如下代码:

function OnAfterAccountSelect()
{
    
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里详细解释。:)

 

posted @ 2008-05-12 00:55  MicrosoftCRM  阅读(1824)  评论(1编辑  收藏  举报