You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 06:35:32