如何在BQL Where子句中使用多选字符串字段
Acumatica多选筛选字段的BQL过滤实现
问题根源
你用MultiSelect=true的PXStringList定义的下拉字段,选中多个值后,存储的是逗号分隔的字符串(比如选了"Open"和"Pending Approval",POStatus的值就是"N,B")。而BQL的IsIn<>运算符要求传入值集合(数组或枚举),直接用该字段和IsIn<>匹配会因类型不兼容导致编译失败。
解决方案
方案1:视图委托(推荐,灵活可靠)
视图委托可以手动处理逗号分隔的字符串,拆分后作为筛选条件,示例代码如下:
假设你的筛选DAC名为POFilter,主视图基于POOrder,代码实现:
// 先定义基础查询(无筛选时返回全部) public PXSelect<POOrder> POOrders; // 重写视图委托处理筛选逻辑 protected virtual IEnumerable pOOrders() { POFilter currentFilter = Base.Filter.Current; // 无筛选条件时返回所有POOrder记录 if (currentFilter == null || string.IsNullOrWhiteSpace(currentFilter.POStatus)) { foreach (POOrder order in Base.POOrders.Select()) { yield return order; } yield break; } // 拆分逗号分隔的筛选值为数组 string[] selectedStatuses = currentFilter.POStatus.Split(',', StringSplitOptions.RemoveEmptyEntries); // 构造带In条件的查询,传入拆分后的状态数组 foreach (POOrder order in PXSelect<POOrder, Where<POOrder.status, In<Required<string[]>>>>.Select(Base, selectedStatuses)) { yield return order; } }
方案2:BQL内置函数(兼容性有限,仅作参考)
部分Acumatica版本支持PXStringSplit函数,可直接在BQL中拆分字符串并配合IsIn,代码示例:
public PXSelect<POOrder, Where<POOrder.status, In<PXStringSplit<POFilter.poStatus, StringLiteral<",">>>>> POOrders;
但这种方式对Acumatica版本有要求,且调试排查问题不如视图委托直观,因此更推荐使用视图委托方案。
内容的提问来源于stack exchange,提问作者MikeNIke
相关产品推荐
相关产品推荐

