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

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

场景:

实体:











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

客户:

















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

联系人:












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

需求:

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

实现方法:

第一步:

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

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

第二步:

将第一步获取的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, 以上就是传说中产品组透露的方法.实现的效果过下图:

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

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

其实, 之前的方法之所以没有了查找框, 是在脚本中加了这么条语句:

crmForm.all.primarycontactid.lookupbrowse = 1; 但当这个值改为0时,
会出现下面的效果:

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

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

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

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

当点击视图的刷新按钮时, 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)}
}

最终效果:

转载自http://www.cnblogs.com/xingbake/archive/2009/04/03/1428608.html

MSCRM4 在过滤后的LOOKUP框中实现查找,布布扣,bubuko.com

时间: 2024-11-04 11:31:36

MSCRM4 在过滤后的LOOKUP框中实现查找的相关文章

jquery实现&lt;body&gt;中点击按钮后,在&lt;tbody&gt;中显示一连串文本框

HTML中的代码如下: 1 <div style="background:#fff;border-style:solid; border-width:1px 1px 0 1px;border-color:#B8D0D6;"> 2 <div > 3 <div style="margin:-6px 0 0 0"> 4 <button class="button gray" type="button&

jquery选中将select下拉框中一项后赋值给text文本框

jquery选中将select下拉框中一项后赋值给text文本框,出现无法将第一个下拉框的value赋值给文本框 因为select默认选中第一项..在选择第一项时,便导致无法激发onchange事件.所以无法进行赋值给文本框 解决方法. select下拉框设置第一项做一个无用的占位option <script type="text/javascript">     function changeSelect(obj) {         var _this = obj;  

c# winform 设置winform进入窗口后在文本框里的默认焦点

http://www.cnblogs.com/JuneZhang/archive/2011/04/19/2020585.html 进入窗口后默认聚焦到某个文本框,两种方法: ①设置tabindex 把该文本框属性里的tabIndex设为0,焦点就默认在这个文本框里了. ②Winform的Activated事件 在Form的Activated事件中添加textBox1.Focus(), 即可获得焦点. ? private void Form1_Activated(object sender, Ev

安装完Linux Mint后,发现系统中竟没有中文输入法

安装完Linux Mint后,发现系统中竟没有中文输入法,语言支持之后自动更新过程中有些安装包下载失败. 可以采取下面的方法安装上中文输入法. 1. 安装iBus: sudo add-apt-repository ppa:shawn-p-huang/ppasudo apt-get update sudo apt-get install ibus-gtk ibus-pinyin ibus-pinyin-db-open-phrase 2. 打开语言支持,选择更新,这时它会下载一系列相关安装包 3.

怎么去掉WIN7窗口文本框中淡绿色的底色

重装系统后突然发现,浏览器中URL位置,word文本框中到处都充满这种淡绿色的东西,突然就好怀念白色的底色.就想把他改过来.原来是这样的: 下面是亲测有用的教程. 1 . 回到桌面,单击右键选择个性化! 2 . 进入如下页面,选择高级外观设置: 3.进行如下设置,设置完后单击确定,就完成完成了更改,所有的文本底色都改为白色的啦! 4 .最后是如下的效果,都改成功啦

SQL 查询条件放在LEFT OUTER JOIN 的ON语句后与放在WHERE中的区别

这两种条件放置的位置不同很容易让人造成混淆,以致经常查询出莫名其妙的结果出来,特别是副本的条件与主表不匹配时,下面以A,B表为例简单说下我的理解. 首先要明白的是: 跟在ON 后面的条件是对参与左联接的数据进行筛选,即在左联接之前起作用. 跟在WHERE后的条件是对左联接得到的结果集进行筛选,即在左联接之后起作用. 我直接把我的结论发出来,建议朋友们自行测试一下,下面是结论: 1) 如果条件是由主表和副表之间的字段构成,那么放在ON后与放在WHERE子条件中所得到的结果是一样,即这种条件可以随便

快速解决js开发下拉框中blur与click冲突

在开发中我们会经常遇到blur和click冲突的情况.下面叙述了开发中常遇到的"下拉框"的问题,并提供了两种解决方案. 一.blur和click事件简述 blur事件:当元素失去焦点时触发blur事件:其为表单事件,blur和focus事件不会冒泡,其他表单事件都可以.click事件:当点击元素时触发click事件:所有元素都有此事件,会产生冒泡. 示例1:blur事件为表单事件 1 2 3 4 5 6 7 8 9 10 11 12 13 <input type="te

下拉框&mdash;&mdash;把一个select框中选中内容移到另一个select框中遇到的问题

在使用jQuery实现把一个select框中选中内容移到另一个select框中功能时遇到了一个问题,就是点击按钮时内容可以到另一个select框中,但是到了另一个select框中的内容却很快闪退回原来的select框中,代码如下:                  <select class="select1" name="select1" multiple="multiple">                     <op

让下拉框中同时显示Key与Value

声明:原创作品,转载时请注明文章来自SAP师太技术博客:www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将追究法律责任!原文链接:http://www.cnblogs.com/jiangzhengjun/p/4296020.html 作为开发人员,希望看到下拉框中选项的Key,一般GUI安装后,下拉框是不显示Key的,只有Value: 通过下面设置后,就可以显示Key了:   这样就知道了后台真实值了