【问题标题】:How to use BQL In Operator with Select2 query / PXProjection and list of values如何在 Select2 查询/PXProjection 和值列表中使用 BQL In Operator
【发布时间】:2021-12-18 03:03:37
【问题描述】:

我正在尝试复制可以在 SQL Server 中执行的以下类型的 SQL 查询...这里的重要部分是 WHERE 子句: 从 InventoryItem WHERE InventoryCD IN ('123123', '154677', '445899', '998766') 中选择 InventoryCD

使用 IN3 运算符和一系列字符串常量可以完美地工作: 即 And,

但是,我需要能够使用数组中任意长的值列表来执行此操作,并且我需要能够在运行时动态设置值。

我不确定需要将什么类型传递给 PXProjection 查询中的 IN 语句。我一直在使用以下方法,但这会引发编译器错误。

public class SOSiteStatusFilterExt : PXCacheExtension<SOSiteStatusFilter>
{
    public static bool IsActive()
    {
        return true;
    }
    public abstract class searchitemsarray : PX.Data.IBqlField
    { 
    }
    [PXUnboundDefault()]
    public virtual string[] Searchitemsarray { get; set; }

}

我想也许我需要一个 PXString 对象数组?我真的不确定,也没有任何有用的文档。有人可以帮忙吗?

这显示了如何使用常规 PXSelect:https://asiablog.acumatica.com/2017/11/sql-in-operator-in-bql.html

但我需要能够使用 Select2 传递正确的类型...

【问题讨论】:

  • 您可以使用任何 PXSelect 方法,您链接到的示例说明了如何使用“必需”BQL 运算符进行操作。所以你需要做 In3> 并在 Select 方法参数中传递参数值。
  • 尝试像示例中那样传递一个 Object 数组作为参数。或者如果它不起作用,则将您的数组格式化为字符串数组类型。
  • DAC 类型不好。字符串数组不适用于 DAC。您需要更改它并转换数据类型。
  • 在 Select2 语句中......我在 Where 语句中使用它: And> 我对 searchitemsarray 使用什么 DAC 字段类型? BQL 需要某种 DAC 字段类型...但我不知道将我的字符串数组转换为什么来进行 DAC 演示。你认为你可以提供一个使用 Select2 的快速示例,以及在运行时传入 IN 的任何字符串数组吗?

标签: acumatica


【解决方案1】:

作为参考,我将在 cmets 中发布 the example mentioned by Hugues

如果您需要使用运行时生成的任意值列表生成查询,如下所示:

Select * from InventoryItem InventoryItem
Where InventoryItem.InventoryCD IN ('123123', '154677', '445899', '998766')
Order by InventoryItem.InventoryCD

你会这样写:

Object[] values = new String[] { "123123", "154677", "445899", "998766" };

InventoryItem item = PXSelect<InventoryItem,
      Where<InventoryItem.inventoryCD,
      In<Required<InventoryItem.inventoryCD>>>>.Select(Base, values);

请注意 In&lt;&gt; 运算符仅适用于 Required&lt;&gt; 参数,您需要手动将可能值数组传递给 Select(...) 方法参数。所以你需要在调用 Select 方法之前用你的列表填充这个数组。

此外,Required&lt;&gt; 参数应仅用于在应用程序代码中直接执行的 BQL 语句。如果从 UI 中查询到的数据视图包含Required&lt;&gt; 参数,则它们将不起作用。

【讨论】:

  • 我引用了您在原始问题中引用的相同链接,该链接与您发布的答案相同。问题是它不是问题的答案。我的问题是我们是否可以将 IN 运算符与 PXProjection 一起使用,PXProjection 是一个绑定到许多数据库表的 SQL 视图,而不仅仅是一个。 PXProjection 使用 Select、Select2、Select3、Select4、Select5 或 Select6 行命令(在传统 BQL 中)。为了回答这个问题,我们需要使 IN 运算符与 PXProjection/Select 样式查询一起使用。到目前为止,似乎没有办法做到这一点。
  • 你是对的,这不会直接在 PXProjection 属性中起作用,因为Required 类需要在代码中执行,但我看不出它为什么不能与任何SelectX 类。如果您可以在问题中添加投影和 BQL 的完整示例,将会有所帮助。可以通过覆盖投影的枚举方法来处理它。
  • 可以与 PXProjection DAC 一起使用,但不能在 DAC 内部使用。
  • gist.github.com/alaskancode/1a45045bd6351c6e8f727f7a92b6ce96 此代码在放入扩展库时,将覆盖销售订单输入屏幕内“添加项目”产品搜索屏幕中的 SQL 视图。我想在此 Select2 查询中使用 IN 运算符,然后传入值,与当前使用 Or, Equal 的方式相同,(例如)您可以在Select2中使用IN操作符,但是没有办法传入值,因为它只适用于Required,而Required需要PXSelect。
【解决方案2】:

我最终创建了 100 个变量并使用 BQL OR 运算符,即

  And2<Where<InventoryItem.inventoryCD, Equal<CurrentValue<SOSiteStatusFilterExt.Pagefilter1>>,
        Or<InventoryItem.inventoryCD, Equal<CurrentValue<SOSiteStatusFilterExt.Pagefilter2>>,
        Or<InventoryItem.inventoryCD, Equal<CurrentValue<SOSiteStatusFilterExt.Pagefilter3>>,
        Or<InventoryItem.inventoryCD, Equal<CurrentValue<SOSiteStatusFilterExt.Pagefilter4>>,

 etc...etc...

然后,您可以在 SOSiteStatusFilter.inventory 的 FieldSelecting 事件中设置 Pagefilter1、2 等的值,例如。这里的关键见解对于 Acumatica 中的外行来说并不那么明显,即通过 BQL 在 SQL Server 中参数化的所有变量都是可以为空的。如果在运行查询时变量为空,SQL Server 会使用“位翻转”方法自动禁用该变量,以在 SQL 过程调用中禁用该变量。在普通的 T-SQL 中,这会引发错误。但是 Acumatica 的框架通过在计算相等性之前在 SQL 过程中禁用该变量来处理 NULL 字段相等的情况。

这种方法的性能非常好,尤其是因为我们查询的是索引键字段(InventoryCD 在技术上不是主键,但基本上是紧随其后的)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-21
    相关资源
    最近更新 更多