我們經常要實現類似省市聯動一樣的功能,常見的就是二個查找控件,一個選擇了省后,另一個市的查找控件就自動過濾了,只顯示當前省下的市,而不是所有的市。當然這是最簡單的,實際工作中還有更復雜的功能要通過過濾查找控件來實現。本文主要介紹基本的查找控件過濾、多表關聯的復雜過濾以及子表里實現查找控件的過濾。
一、簡單的過濾
先看下需求:
按“Special GL Indicator” 來過濾 Posting
查找控件增加了preSearch事件。它發生在查找控件顯示對話框供用戶查找記錄之前,與其他事件不同的是,不能使用界面來設定這個事件發生時執行的代碼。只有通過Xrm.Page.getControl(arg).addPreSearch(handler) 和 Xrm.Page.getControl(arg).removePreSearch(handler) 來為該事件增加或者清除執行的代碼。
實現方法很簡單,在Form的OnLoad事件加上preFilterLookup
function preFilterLookup() {
Xrm.Page.getControl("new_postingid").addPreSearch(function () { // child fieldaddPostingLookupFilter();});}
function addPostingLookupFilter() {
var gl = Xrm.Page.getAttribute("new_special_gl_indicatorid").getValue(); // parent fieldvar fetchXml = "";
if (gl != null) {fetchXml = "<filter type='and'><condition attribute='new_special_gl_indicatorid' operator='eq' value='" + gl[0].id + "' /></filter>";}else {
fetchXml = "<filter type='and'><condition attribute='new_special_gl_indicatorid' operator='null' /></filter>";
}Xrm.Page.getControl("new_postingid").addCustomFilter(fetchXml); // child field
}
首先為要過濾的查找控件加上addPresearch方法,並用addCustomFilter來控制。 (這里好像只能inner關聯)
二、復雜的過濾
上面我們實現了一個簡單的過濾,下面我們來實現一個復雜點的過濾。上面用到的是addCustomFilter,也就是說用filter來過濾,如果關系復雜點,有多個關聯表,filter就沒辦法實現了,這時就要用到addCustomView了。
如上圖,先按“Company Code”過濾出來,再按“ Company Tax Procedure"(頁面上沒顯示)來過濾 Tax Code。
首先在form OnLoad事件里加上一個新的方法 TaxCodeCustomView,其實現如下:
function TaxCodeCustomView() {
var company = Xrm.Page.getAttribute("new_company_codeid").getValue();var viewId = "{00000000-0000-0000-0000-000000000001}";var viewDisplayName = "Tax Code View ";var fetchXml = "<fetch mapping='logical'>" +"<entity name='new_taxprocedure_taxcode'>" +
"<attribute name='new_taxprocedure_taxcodeid' />" +
"<link-entity name='new_company_taxprocedure' to='new_tax_procedure' from='new_name' alias='ncb' link-type='inner' >";
if (company != null) {fetchXml += "<filter><condition attribute='new_companyid' operator='eq' value='" + company[0].id + "' /></filter>";}fetchXml += "</link-entity>" +
"</entity>" +
"</fetch>";
var layoutXml = "<grid name='resultSet' object='10024' jump='new_name' select='1' icon='1' preview='1'>" +"<row name='result' id='new_taxprocedure_taxcodeid'>" +
"<cell name='new_tax_procedure' width='100' />" +
"<cell name='new_name' width='300' />" +
"</row></grid>";
Xrm.Page.getControl("new_tax_codeid").addCustomView(viewId, "new_taxprocedure_taxcode", viewDisplayName, fetchXml, layoutXml, true);}
這里用到的是addCustomView配合fetchxml來實現復雜的關聯過濾。
三、子表里用主表字段來過濾
下圖是上圖的子表,也有Posting 及 Tax Code,也要像主表那樣過濾,但子表上並沒要過濾的字段“Special GL Indicator” ,“Company Code”
當然我們可以通過OData通過主表id來查詢到主表上的這二個值,再來過濾,但這樣做效率太低,而且上面的代碼還不能重用。
這時可以通過主表上來新建1:N的關系把我們需要的主表上的這二個字段mapping到子表上
把這二個字段加到子表里,但不用顯示出來
這樣在子表里就可以重用主表里的js代碼,也只用在form OnLoad事件上加上preFilterLookup就行了。