zoukankan      html  css  js  c++  java
  • 也谈MS CRM4中实现模糊查找

        看了星吧客的文章<<MSCRM4 让视图查找功能默认实现模糊查找>>,确实在项目实施中有这种需求出现,End User希望实现完全的模糊查询,而现有系统中给定的功能呢,只是在输入的查询字符之后加入了通配符以便进行模糊查找。举例来说,用户在客户列表的搜索查找框中输入数字"8",MS CRM系统会在处理时,将"8"扩充为"8*",由此可见,这只是部分的模糊匹配,即,只能够查找出以"8"开头的所有数据,而End User经常希望的结果是,只要数据中还有8,就要被挑选出来,也就是形如"*8*"的查询。

        星吧客的做法,是修改了源文件,一种Unsupported方法,我也提供另一个方法的思路吧。

        主旨想法就是借用MS CRM中的Plugin,将完全模糊查询功能实现在一个Plugin中。那么应该截获那个消息呢?凭感觉,想到了Fetch方法,不过,在SDK给的注册工具中,并没有相对应的消息,那么是什么呢?在Reference中找到ExecuteFetch Message方法,还是没有对应的消息,不过,倒是有Execute消息,是不是可以用乜?try一下,get it。在进行查找时,使用Execute方法可以拦截到该查找请求。分析context参数的属性,如下图所示。

    image

    其中,InputParameters[“FetchXml”]对应的值如下:

    <fetch distinct="false" mapping="logical" page="1" count="50">
      <entity name="account">
        <attribute name="name" />
        <attribute name="accountnumber" />
        <attribute name="createdon" />
        <attribute name="modifiedon" />
        <attribute name="accountid" />
        <attribute name="name" />
        <attribute name="accountnumber" />
        <attribute name="modifiedon" />
        <attribute name="createdon" />
        <filter type="and">
          <filter type="and">
            <condition attribute="statecode" operator="eq" value="0" />
          </filter>
          <filter type="or">
            <condition attribute="name" operator="like" value="8%" />
            <condition attribute="accountnumber" operator="like" value="8%" />
          </filter>
        </filter>
      <order attribute="name" descending="false" />
      </entity>
    </fetch>

    从上面红色以及蓝色着色的部分,可以看到MS CRM系统是如何处理,那么在待开发的Plugin的Execute方法中,只要将形如"8%"的value更改为"%8%"不就可以了么?

        我的代码如下:

    public void Execute(IPluginExecutionContext context)
    {
        if (context.InputParameters.Contains("FetchXml") == false) return;
        string fetchXml = context.InputParameters["FetchXml"].ToString();
        XmlDocument doc = new XmlDocument();
        doc.LoadXml(fetchXml);
        XmlNodeList nodeList = doc.GetElementsByTagName("condition");
        foreach (XmlNode node in nodeList)
        {
            if (node.Attributes["operator"].Value != "like") continue;
            if (node.Attributes["value"] == null) continue;
            node.Attributes["value"].Value = "%" + node.Attributes["value"].Value + "%";
        }
        context.InputParameters["FetchXml"] = doc.InnerXml;
    }

    注册Step时,选择Execute消息,以及PreStage,其他的选项不必修改。

     

    如此,即可实现完全模糊查找功能。

  • 相关阅读:
    BZOJ3498PA2009 Cakes——三元环
    黑科技之三元环讲解
    BZOJ4317Atm的树&BZOJ2051A Problem For Fun&BZOJ2117[2010国家集训队]Crash的旅游计划——二分答案+动态点分治(点分树套线段树/点分树+vector)
    BZOJ2463[中山市选2009]谁能赢呢?——博弈论
    BZOJ2275[Coci2010]HRPA——斐波那契博弈
    BZOJ2281[Sdoi2011]黑白棋&BZOJ4550小奇的博弈——DP+nimk游戏
    BZOJ3435[Wc2014]紫荆花之恋——动态点分治(替罪羊式点分树套替罪羊树)
    Trie树学习总结
    kmp学习小结
    Hash学习小结
  • 原文地址:https://www.cnblogs.com/StoneGarden/p/1512393.html
Copyright © 2011-2022 走看看