当前位置: 代码迷 >> .NET相关 >> Dynamic CRM 2013学习笔记(8)过滤查找控件 (类似省市联动)
  详细解决方案

Dynamic CRM 2013学习笔记(8)过滤查找控件 (类似省市联动)

热度:490   发布时间:2016-04-24 03:01:54.0
Dynamic CRM 2013学习笔记(八)过滤查找控件 (类似省市联动)

我们经常要实现类似省市联动一样的功能,常见的就是二个查找控件,一个选择了省后,另一个市的查找控件就自动过滤了,只显示当前省下的市,而不是所有的市。当然这是最简单的,实际工作中还有更复杂的功能要通过过滤查找控件来实现。本文主要介绍基本的查找控件过滤、多表关联的复杂过滤以及子表里实现查找控件的过滤。

 

一、简单的过滤

先看下需求:

image

按“Special GL Indicator” 来过滤 Posting

查找控件增加了preSearch事件。它发生在查找控件显示对话框供用户查找记录之前,与其他事件不同的是,不能使用界面来设定这个事件发生时执行的代码。只有通过Xrm.Page.getControl(arg).addPreSearch(handler) 和 Xrm.Page.getControl(arg).removePreSearch(handler) 来为该事件增加或者清除执行的代码。

实现方法很简单,在Form的OnLoad事件加上preFilterLookup

  1: function preFilterLookup() {
  2:     Xrm.Page.getControl("new_postingid").addPreSearch(function () {
  3:         addPostingLookupFilter();
  4:     });
 5: }
  1: function addPostingLookupFilter() {
  2:     var gl = Xrm.Page.getAttribute("new_special_gl_indicatorid").getValue();
  3:     var fetchXml = "";
  4:     if (gl != null) {
  5:         fetchXml = "<filter type='and'><condition attribute='new_special_gl_indicatorid' operator='eq' value='" + gl[0].id + "' /></filter>";
  6:     }
  7:     else {
  8:         fetchXml = "<filter type='and'><condition attribute='new_special_gl_indicatorid' operator='null' /></filter>";
  9:     }
 10:     Xrm.Page.getControl("new_postingid").addCustomFilter(fetchXml);
 11: }

首先为要过滤的查找控件加上addPresearch方法,并用addCustomFilter来控制。

 

二、复杂的过滤

上面我们实现了一个简单的过滤,下面我们来实现一个复杂点的过滤。上面用到的是addCustomFilter,也就是说用filter来过滤,如果关系复杂点,有多个关联表,filter就没办法实现了,这时就要用到addCustomView了。

image

如上图,先按“Company Code”过滤出来,再按“ Company Tax Procedure"(页面上没显示)来过滤 Tax Code。

首先在form OnLoad事件里加上一个新的方法 TaxCodeCustomView,其实现如下:

  1: function TaxCodeCustomView() {
  2:     var company = Xrm.Page.getAttribute("new_company_codeid").getValue();
  3:     var viewId = "{00000000-0000-0000-0000-000000000001}";
  4:     var viewDisplayName = "Tax Code View ";
  5:     var fetchXml = "<fetch mapping='logical'>" +
  6:       "<entity name='new_taxprocedure_taxcode'>" +
  7:             "<attribute name='new_taxprocedure_taxcodeid' />" +
  8:             "<link-entity name='new_company_taxprocedure' to='new_tax_procedure' from='new_name' alias='ncb' link-type='inner' >";
  9:     if (company != null) {
 10:         fetchXml += "<filter><condition attribute='new_companyid' operator='eq' value='" + company[0].id + "' /></filter>";
 11:     }
 12: 
 13:     fetchXml += "</link-entity>" +
 14:       "</entity>" +
 15:     "</fetch>";
 16: 
 17:     var layoutXml = "<grid name='resultSet' object='10024' jump='new_name' select='1' icon='1' preview='1'>" +
 18:         "<row name='result' id='new_taxprocedure_taxcodeid'>" +
 19:             "<cell name='new_tax_procedure' width='100' />" +
 20:             "<cell name='new_name' width='300' />" +
 21:         "</row></grid>";
 22:     Xrm.Page.getControl("new_tax_codeid").addCustomView(viewId, "new_taxprocedure_taxcode", viewDisplayName, fetchXml, layoutXml, true);
 23: }

 

这里用到的是addCustomView配合fetchxml来实现复杂的关联过滤。

 

三、子表里用主表字段来过滤

下图是上图的子表,也有Posting 及 Tax Code,也要像主表那样过滤,但子表上并没要过滤的字段“Special GL Indicator” ,“Company Code”

image

当然我们可以通过OData通过主表id来查询到主表上的这二个值,再来过滤,但这样做效率太低,而且上面的代码还不能重用。

这时可以通过主表上来新建1:N的关系把我们需要的主表上的这二个字段mapping到子表上

image

把这二个字段加到子表里,但不用显示出来

image

这样在子表里就可以重用主表里的js代码,也只用在form OnLoad事件上加上preFilterLookup就行了。

 

Dynamic CRM 2013学习笔记 系列汇总

7楼疯吻IT
我是在外企,一般大公司接CRM的项目多点,国内现在越来越多了,sdk也是最基本的一些东西。
Re: 不知道风往哪儿吹
@疯吻IT,,前辈啊,我才刚做一年,很多都不会,也是在一个外企,不过是设在内地的一个办事处,纯研发的
6楼疯吻IT
en,一起学习!
Re: 不知道风往哪儿吹
@疯吻IT,,你是在外企做吗?好像国内做这个的不是很多,好多资料都查不到,每次只能查SDK
5楼疯吻IT
为什么要放到change事件中呢?
Re: 不知道风往哪儿吹
@疯吻IT,引用为什么要放到change事件中呢?,, 根据不同的provider选product,provider是一个lookup字段,product也是一个lookup字段
4楼疯吻IT
removePreSearch的用法跟addPreSearch一样,都是传入一个function;,Xrm.Page.getControl(quot;new_postingidquot;).addCustomFilter(fetchXml);这句只是在这个function里。
Re: 不知道风往哪儿吹
@疯吻IT,引用removePreSearch的用法跟addPreSearch一样,都是传入一个function;,Xrm.Page.getControl(quot;new_postingidquot;).addCustomFilter(fetchXml);这句只是在这个function里。,,, LZ,你也是做ms dynamic CRM吗?求带我飞啊
3楼不知道风往哪儿吹
在lookup的change事件里面用addPreSearch会有问题,要去掉上一次的id值,用removePreSearch,不知道LZ有没有研究过
2楼疯吻IT
我的第一个例子就是这种情况,二个lookup的
Re: 不知道风往哪儿吹
@疯吻IT,引用我的第一个例子就是这种情况,二个lookup的,Xrm.Page.getControl(arg).removePreSearch(handler),, 这个怎么用,Xrm.Page.getControl(quot;new_postingidquot;).addCustomFilter(fetchXml);,, 还是addCustomFilter吗?
1楼疯吻IT
没有问题的,这都是真实的实例。
Re: 不知道风往哪儿吹
@疯吻IT,引用没有问题的,这都是真实的实例。,,, 我知道写在formload事件是没有问题的,但是在lookup的change事件中,用addPreSearch就有问题,因为每change一次,根据id值过滤的,id值都不一样,他会是上次的id值,要用removePreSearch,去掉以前的id值。不知道LZ有没有用过removePreSearch方法
  相关解决方案