Dynamic CRM 2013學習筆記(八)過濾查找控件 (類似省市聯動)


我們經常要實現類似省市聯動一樣的功能,常見的就是二個查找控件,一個選擇了省后,另一個市的查找控件就自動過濾了,只顯示當前省下的市,而不是所有的市。當然這是最簡單的,實際工作中還有更復雜的功能要通過過濾查找控件來實現。本文主要介紹基本的查找控件過濾、多表關聯的復雜過濾以及子表里實現查找控件的過濾。

 

一、簡單的過濾

先看下需求:

image

按“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 field
           addPostingLookupFilter();
       });
  }
   function addPostingLookupFilter() {
       var gl = Xrm.Page.getAttribute("new_special_gl_indicatorid").getValue(); // parent field
       var 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了。

image

如上圖,先按“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”

image

當然我們可以通過OData通過主表id來查詢到主表上的這二個值,再來過濾,但這樣做效率太低,而且上面的代碼還不能重用。

這時可以通過主表上來新建1:N的關系把我們需要的主表上的這二個字段mapping到子表上

image

把這二個字段加到子表里,但不用顯示出來

image

 

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

 

Dynamic CRM 2013學習筆記 系列匯總

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM