知识共享 - 对物料列表实现多字段模糊查询
金蝶云社区-JohnnyDing
JohnnyDing
11人赞赏了该文章 5,406次浏览 未经作者许可,禁止转载编辑于2016年01月18日 09:29:55
summary-icon摘要由AI智能服务提供

本文讨论了处理大量物料信息时,通过优化搜索功能来提升查询效率和准确度的方案。具体措施包括在物料数据中添加一个模糊查询文本字段,并在后台拦截过滤事件,以支持在多个字段(如名称和规格型号)间进行模糊匹配查询。文中详细描述了增加文本字段、修改快捷查询面板、编写物料列表插件以重新解析过滤条件等实现步骤,并附带了相关插件代码示例,旨在通过技术手段解决因数据量庞大导致的查询效率低下问题。

案例背景:
物料信息很多,已经上百万条。
现在遇到的问题是在输入“轴承”查询出来可能就会有几百条记录。

因此,需要通过输入 “轴承 R12”,然后在名称与规格型号中,同时进行模糊匹配,匹配出名称包含“轴承” ,且规格型号包含 “R12”的所有数据,提升搜索的效率、准确度。

实现方案:
在物料上,增加了一个专门处理模糊查询的文本字段,默认以此字段作为快捷过滤字段,并拦截列表过滤事件,在后台修改过滤条件,使用户录入的搜索值,在多个字段间进行匹配。

具体实现步骤如下:
步骤一:扩展物料,增加一个文本字段,命名为"模糊查询文本":



步骤二:保存单据设计;之后重新打开物料扩展,以刷新物料的快捷面板可选择字段

步骤三:修改物料的快捷查询面板,把模糊查询文本字段,摆在首选位置:



步骤四:编写物料列表插件,对模糊查询文本字段的过滤条件进行重新解析,拼接出类似于:
(名称 like '%轴承%' OR 规格型号 like '%轴承%') AND (名称 like '%R12%' OR 规格型号 like '%R12%')
(完整的插件代码,在后面)

步骤五:启用插件,实际运行效果:



插件代码:
//********************************************
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel;

using Kingdee.BOS;
using Kingdee.BOS.Util;
using Kingdee.BOS.Core;
using Kingdee.BOS.Core.DynamicForm;
using Kingdee.BOS.Core.DynamicForm.PlugIn;
using Kingdee.BOS.Core.DynamicForm.PlugIn.ControlModel;
using Kingdee.BOS.Core.List;
using Kingdee.BOS.Core.List.PlugIn;
using Kingdee.BOS.Core.List.PlugIn.Args;


namespace JDSample.FormPlugIn.List
{
///
/// 实现多字段模糊查询:把用户录入的条件,自动与多个字段进行匹配
///

[Description("实现多字段模糊查询")]
public class S151127SmartSearchList : AbstractListPlugIn
{
public override void PrepareFilterParameter(FilterArgs e)
{
base.PrepareFilterParameter(e);
// "( F_JD_SearchText Like '%轴承 R12%' )"

string quickFilter = this.ListModel.FilterParameter.QuickFilterString;
if (string.IsNullOrWhiteSpace(quickFilter))
{// 快捷条件为空白,无需处理
return;
}

if (quickFilter.IndexOf("F_JD_SearchText") < 0 )
{// 快捷条件不含模糊查询字段,
return;
}

// 去掉首尾的括号:从第2个字符开始截取,直到倒数第2个字符
quickFilter = quickFilter.Substring(1, quickFilter.Length - 2);

// 把过滤条件中的and,替换为大写
string[] splits = { " AND " };
string[] oldFilters = quickFilter.Split(splits, StringSplitOptions.None);
List newFilters = new List();

foreach(string oldfilter in oldFilters)
{
if (oldfilter.IndexOf("F_JD_SearchText") < 0)
{// 此段条件中,未包含模糊查询字段,略过
newFilters.Add(oldfilter);
}
else
{
// 截取条件值
int startIndex = oldfilter.IndexOf("'");
int endIndex = oldfilter.IndexOf("'", startIndex + 1);
string filterValue = oldfilter.Substring(startIndex + 1, endIndex - startIndex - 1);

// 按照空格对条件值进行分解
string[] fldValues = filterValue.Split(' ');

// 重新拼接条件
List fldFilters = new List();

foreach (string fldValue in fldValues)
{
if (string.IsNullOrWhiteSpace(fldValue))
{
continue;
}
// 去掉两头空格
string fldValueNoSpace = fldValue.Trim();

// 拼接新条件:名称 like '%value%' or 规格 like '%value%'
string fldFilter = string.Format("(FName like '%{0}%' OR FSpecification like '%{0}%')", fldValueNoSpace);
fldFilters.Add(fldFilter);
}

string newFilter = string.Join(" AND ", fldFilters);
newFilters.Add(newFilter);
}
}

// 重新填写快捷过滤条件
this.ListModel.FilterParameter.QuickFilterString = "(" + string.Join(" AND ", newFilters) + ")";
}
}
}