登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

忆风的博客

http://www.cnblogs.com/dhjdhja

 
 
 

日志

 
 
 
 

MSCRM4 在过滤后的Lookup框中实现查找  

2009-12-24 10:33:52|  分类: CRM学习 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

转:http://blog.163.com/nathan_cn/blog/static/12006288200933105621965/

MSCRM4 在过滤后的Lookup框中实现查找

软件技术   2009-04-03 10:56   阅读133   评论0  

字号: 大  中 

在MSCRM中让Lookup根据一定的条件实现过滤功能, 这个需求很常见, 在我接触的诸多项目中似乎都需要有这个功能. 但非常遗憾是, MSCRM 的SDK并没有提供实现这个功能的方法. 不过我们应该还是感到庆幸, 据说, 微软CRM产品组有透露下面这样的方法:

 

场景:

实体:

实体名 架构名
客户 account
联系人 contact

 

客户:

字段名 架构名 类型 关联实体
上级单位 parentaccountid lookup 客户
主要联系人 primarycontactid lookup 联系人

 

联系人:

字段名 架构名 类型 关联实体
上司 parentcustomerid lookup 客户

 

需求:

在客户实体中, 当选择上级单位后, 点击主要联系人Lookup按钮, 在弹出的lookup选择对话框中必须过滤出上司等于上级单位的所有联系人.

 

实现方法:

第一步:

进入高级查找, 根据需求设置查找条件。

MSCRM4 在过滤后的Lookup框中实现查找 - 忆风 - 忆风的博客  

点击查找,然后在地址栏中输入javascript:alert(resultRender.FetchXml.value);后回车, 获取fetchxml

MSCRM4 在过滤后的Lookup框中实现查找 - 忆风 - 忆风的博客

第二步:

将第一步获取的Fetchxml做适当的修改,并将其在客户实体的OnLoad事件 和 上级单位的OnChange事件 中 对上级单位字段设置参数如下:

if(crmForm.all.primarycontactid.DataValue != null){

crmForm.all.primarycontactid.lookupbrowse = 1;

crmForm.all.primarycontactid.additionalparams = "search=<fetch version=\"1.0\" output-format=\"xml-platform\" mapping=\"logical\" distinct=\"false\"><entity name=\"contact\"><order attribute=\"fullname\" descending=\"false\"/><filter type=\"and\"><condition attribute=\"parentcustomerid\" operator=\"eq\" uiname=\""+crmForm.all.parentaccountid.DataValue[ 0 ].name+"\" uitype=\"account\" value=\""+crmForm.all.parentaccountid.DataValue[ 0 ].id+"\"/></filter></entity></fetch>";

}

第三步:

修改CRMWeb\_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 )

{

      crmGrid.AddParameter( "fetchxml" , Request["search"] );

      crmGrid.Parameters.Remove( "searchvalue" );

}

</script>

OK, 以上就是传说中产品组透露的方法.实现的效果过下图:

MSCRM4 在过滤后的Lookup框中实现查找 - 忆风 - 忆风的博客

 

从上图可以看到, 经过过滤后的lookup没有了查找框. 当然, 如果过滤后的出来的结果数据量并不是很大的话, 那么我个人认为已经满足需求, 但关键是, 如果过滤后的结果有几百条之多. 那么用户体验就差了. 也就在这个时候我们往往会想方设法去改善他.

 

接下来是我要谈到的重点, 如何在过滤后的lookup中实现查找

 

其实, 之前的方法之所以没有了查找框, 是在脚本中加了这么条语句:crmForm.all.primarycontactid.lookupbrowse = 1; 但当这个值改为0时, 会出现下面的效果:

MSCRM4 在过滤后的Lookup框中实现查找 - 忆风 - 忆风的博客

 

显然这并不是我们想要的结果

但这个结果也并不是最糟糕的, 至少它给了一个提示, 告诉我们可以在fetchxml上做文章.

 

 

 

没错, 还是偷梁换柱的方法, 但这里需要注意一点, 直接将fetchxml作为查找条件是得不出任何结果的. 在这里我们需要通过另外一种方式来实现.

 

其实, 经过分析lookup页面会发现, fetchxml 被存储在lookup页面的的一个隐藏div中, 如下图:

MSCRM4 在过滤后的Lookup框中实现查找 - 忆风 - 忆风的博客

 

当点击视图的刷新按钮时, MSCRM自动的会根据fetchxml的条件重新加载数据.

 

通过以上信息, 便可很轻松的实现这个功能.

 

实现方法:

之前的三个步骤不变, 更改步骤二的代码如下:

if(crmForm.all.primarycontactid.DataValue != null){

crmForm.all.primarycontactid.lookupbrowse = 0;

crmForm.all.primarycontactid.additionalparams = "search=<fetch version=\"1.0\" output-format=\"xml-platform\" mapping=\"logical\" distinct=\"false\"><entity name=\"contact\"><order attribute=\"fullname\" descending=\"false\"/><filter type=\"and\"><condition attribute=\"fullname\" operator=\"like\" value=\"%%\"/><condition attribute=\"parentcustomerid\" operator=\"eq\" uiname=\""+crmForm.all.parentaccountid.DataValue[ 0 ].name+"\" uitype=\"account\" value=\""+crmForm.all.parentaccountid.DataValue[ 0 ].id+"\"/></filter></entity></fetch>";

}

 

在\CRMWeb\_controls\lookup\lookupsingle.aspx页面中添加如下代码, 并在onload中调用FindCriteria方法

function FindCriteria(){

    try{

        var criteriaObj = document.getElementById("findValue");

        var fetchObj = document.getElementById("fetchxml");

        var searchObj = document.getElementById("search");

        var criteriaObj2 = criteriaObj.cloneNode(true);

        criteriaObj2.value = "";

        if(fetchObj.value == ""){

            criteriaObj.value = "*"+criteriaObj2.value;

            if(criteriaObj.value == "*"){criteriaObj.value = "";}

        }

        else{

            document.getElementById("btnGo").onclick = function(){

                document.getElementById("grid_refresh").click();

            }

        }

        criteriaObj2.onchange = function(){

            if(fetchObj.value == ""){

                criteriaObj.value = "*"+criteriaObj2.value;

                if(criteriaObj.value == "*"){criteriaObj.value = "";}

            }

            else{

                fetchObj.value = searchObj.value.replace("value=\"%%\"","value=\"%"+criteriaObj2.value.replace(/\*/g,"%") +"%\"");

                document.getElementById("btnGo").onclick = function(){

                    document.getElementById("grid_refresh").click();

                }

            }

        }

        criteriaObj2.id = "findCriteria2";

        criteriaObj.parentElement.appendChild(criteriaObj2);

        criteriaObj.style.position = "absolute";

        criteriaObj.style.zIndex = "1000";

        criteriaObj.style.left = "-1000px";

        criteriaObj.style.top = "-1000px";

        criteriaObj2.onkeydown = function(){

            if(event.keyCode==13){

                if(fetchObj.value == ""){

                    criteriaObj.value = "*"+criteriaObj2.value;

                    if(criteriaObj.value == "*"){criteriaObj.value = criteriaObj.value = "";}

                    document.getElementById("btnGo").click();

                }

                else{

                    fetchObj.value = searchObj.value.replace("value=\"%%\"","value=\"%"+criteriaObj2.value.replace(/\*/g,"%")+"%\"");

                    document.getElementById("btnGo").onclick = function(){

                        document.getElementById("grid_refresh").click();

                    }

                }

            }

        }

    }catch(e){alert(e.message)}

}

最终效果:

MSCRM4 在过滤后的Lookup框中实现查找 - 忆风 - 忆风的博客

2009-04-03 05:28 星吧客(josh) 阅读(6) | 评论 (0)编辑

MSCRM4 让视图查找功能默认实现模糊查找

在MSCRM中, 视图的查找功能默认是匹配首字符串的. 比如. 你在查找框中输入ABC.那么当你点击查找时. 得到的结果都是以ACD开头的所有记录. 只有当你输入*ABC得到的结果才是包含ABC的所有记录.

 

如何能让MSCRM视图查找功能默认实现模糊查找呢? 在这里提供一种偷梁换柱的方法.

 

方法很简单, 更改视图所在的页面, 在onload事件中编写代码, 将原有的查找框隐藏, 用一新的查找框代替. 当点击查找按钮时, 先将替换后查找框的值前面加*号赋给原有的查找框, 然后再执行查找事件. 具体代码如下:

 

默认试图中实现模糊查找:

--------------------------------------------------------------------------------------

将下面的代码写入\CRMWeb\_root\homepage.aspx页面中. 并在该页面的onload 事件中调用FindCriteria 方法

function FindCriteria(){

    var criteriaObj = document.getElementById("findCriteria");

    var clearCBObj = document.getElementById("clearCriteriaButton");

    var criteriaObj2 = criteriaObj.cloneNode(true);

    criteriaObj2.onchange = function(){

        criteriaObj.value = "*"+criteriaObj2.value;

        if(criteriaObj.value == "*"){criteriaObj.value = "";}

    }

    criteriaObj2.id = "findCriteria2";

    criteriaObj.parentElement.appendChild(criteriaObj2);

    criteriaObj.style.display = "none";

    clearCBObj.onclick = function(){

        criteriaObj2.value = "";

        try{

            this.parentElement.parentElement.ClearQuickFind();

        }catch(e){};

    }

    criteriaObj2.onkeydown = function(){

        if(event.keyCode==13){

            criteriaObj.value = "*"+criteriaObj2.value;

            if(criteriaObj.value == "*"){criteriaObj.value = "";}

        }

    }

}

 

Lookup中实现模糊查找:

--------------------------------------------------------------------------------------

将下面的代码写入\CRMWeb\_controls\lookup\lookupsingle.aspx页面中. 并在该页面的onload 事件中调用FindCriteria 方法

function FindCriteria(){

    var criteriaObj = document.getElementById("findValue");

    var criteriaObj2 = criteriaObj.cloneNode(true);

    criteriaObj2.onchange = function(){

        criteriaObj.value = "*"+criteriaObj2.value;

        if(criteriaObj.value == "*"){criteriaObj.value = "";}

    }

    criteriaObj2.id = "findCriteria2";

    criteriaObj.parentElement.appendChild(criteriaObj2);

    criteriaObj.style.position = "absolute";

    criteriaObj.style.zIndex = "1000";

    criteriaObj.style.left = "-1000px";

    criteriaObj.style.top = "-1000px";

    criteriaObj2.onkeydown = function(){

        if(event.keyCode==13){

            criteriaObj.value = "*"+criteriaObj2.value;

            if(criteriaObj.value == "*"){criteriaObj.value = "";}

            document.getElementById("btnGo").click();

        }

    }

}

 

当然这种方法属于微软unsupport的方法, 如果客户并不是特别在意这个功能, 本人也并不推荐使用该方法.

  评论这张
 
阅读(380)| 评论(0)

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018