Filtering lookup data in CRM 4

 

现在我们都知道当微软说不支持的时候,他们常常/有时不是真的,例如,在CRM3.0中颇受欢迎的过滤lookup字段的定制方法,一直到4.0之前工作的很好。但不是说这种方法在4.0里边就丢失了,其实我们可以用一个新的不支持的方式去让Filter lookup dataCRM4.0里同样工作。 

例如,在一个Account的对象(记录)里,如果只想在Primary contact lookup中显示该accountcontact时, 需要如下的customizations: 

下边的脚本看起来和原来的几乎一样,除了一个很重要的修改:我们必须传递一段Fetch XML并且用服务器可以识别的参数。注意:如果这个参数不是服务器可识别的,就将会抛出一个Exception. 这里我们将Fetch XML传递给Search value parameter但却禁止了search 功能。 

Form OnLoad Script

var field = crmForm.all.primarycontactid;
if(crmForm.ObjectId == null)
{
    //
禁止contact lookup,因为可能没有相关联系人
    field.Disabled = true;
}
else
{
    //
确保search boxlookup里是不可见的
    field.lookupbrowse = 1;
   
    //
Fetch XML传递给search value parameter
    field.AddParam("search",
     "<fetch mapping='logical'><entity name='contact'>"
    + "<filter><condition attribute='parentcustomerid' operator='eq' value='"
    + crmForm.ObjectId
    + "' /></filter></entity></fetch>");
}

Field Properties

上述的脚本是将以一段Fetch XML传递给Primary Contact作为Search Value Parameter来实现filter功能的。值得注意的是如果这个字段的Automatic Resolution功能被打开的话,用户在LookupTextBox中输入字符时,它会自动调用Web Service而忽略我们传递的Fetch XML.换句话说: 用户可以将这个字段的值设置为数据库中任意存在的Contact通过输入这个ContactName. 为了让我们上述的脚本正常工作不受打扰,关闭字段的Automatic Resolution就可以解决了。 

Lookup Dialog

 关闭它之后,CRM4.0中的Grid控件仍然识别Fetch XML,问题只是将XML传递给控件/字段。下边的一段代码实现了自动注入Fetch XML 你需要将一下代码插入到<CRM Site Folder>\_controls\lookup\lookupSingle.aspx 文件的某个地方。

<script runat="server">

protected override void OnLoad( EventArgs e )
{
      base.OnLoad(e);
      crmGrid.PreRender += new EventHandler( crmgrid_PreRender );
}

void crmgrid_PreRender( object sender , EventArgs e )
{
    // As we don't want to break any other lookups, ensure that we use workaround only if
    // search parameter set to fetch xml.
    if (crmGrid.Parameters["search"] != null && crmGrid.Parameters["search"].StartsWith("<fetch"))
    {
        crmGrid.Parameters.Add("fetchxml", crmGrid.Parameters["search"]); 

        // searchvalue needs to be removed as it's typically set to a wildcard '*'
        crmGrid.Parameters.Remove("searchvalue"); 

        // Icing on a cake - ensure that user cannot create new contact outside of the account
        // and then select it.
        this._showNewButton = false;
    }
}

</script>

 Much easier, supported way to achieve the same functionality (and much more) is to use custom (Stunnware) lookup dialog from Michael Höhne.

 

posted on 2008-06-30 17:18  Allan.  阅读(2007)  评论(2编辑  收藏  举报