【问题标题】:How to use AND/OR operators when building query in ax 2012 x++在 ax 2012 x++ 中构建查询时如何使用 AND/OR 运算符
【发布时间】:2025-12-22 21:00:15
【问题描述】:

我真的找不到任何关于这个的东西,我也想不通。 无论如何,我已经创建了一个视图,我需要在 x++ 中使用 query/QueryRun 等进行过滤。

我正在尝试做的选择语句看起来像这样

  while select salestable order by PtsWebDeliveryDate, salesId
    where 
(SalesTable.SalesStatus == SalesStatus::Delivered && !SalesTable.PtsProdNorwood && SalesTable.CustAccount != acc && SalesTable.InvoiceAccount != acc &&
           salestable.PtsWebDeliveryDate >= today() && salestable.PtsWebDeliveryDate <= today()+daysahead)
           ||
          (
            SalesTable.SalesStatus == SalesStatus::Backorder && SalesTable.SalesType == SalesType::Sales && !SalesTable.PtsProdNorwood &&
             SalesTable.CustAccount != acc && SalesTable.InvoiceAccount != acc &&
          (
                (salesTable.PtsSalesorderPacked  && salestable.PtsWebDeliveryDate >= today() && salestable.PtsWebDeliveryDate <= today()+daysAhead)
            ||
                (!salesTable.PtsSalesorderPacked && salestable.PtsWebDeliveryDate >= d && salestable.PtsWebDeliveryDate <= today()+daysahead))
          )
{
//Do stuff
}

如您所见,我有需要使用的 som OR 运算符。我已经开始在 x++ 中构建查询,这就是我得到的:

q = new Query();
q.addDataSource(TableNum("packlistview"));
q.dataSourceNo(1).addSortField(fn[_OrderBy], _direction);

q.dataSourceNo(1).addRange(fieldNum(PackListView, SalesStatus)).value(queryValue(SalesStatus::Delivered));
q.dataSourceNo(1).addRange(fieldNum(PackListView, PtsProdnorwood)).value(queryValue(NoYes::No));
q.dataSourceNo(1).addRange(fieldNum(PackListView, CustAccount)).value(queryValue(!acc));
q.dataSourceNo(1).addRange(fieldNum(PackListView, PtsWebDeliveryDate)).value(queryrange(today(),today()+daysahead));

//OR
q.dataSourceNo(1).addRange(fieldNum(PackListView, SalesStatus)).value(queryValue(SalesStatus::Backorder));
q.dataSourceNo(1).addRange(fieldNum(PackListView, SalesType)).value(queryValue(SalesType::Sales));
q.dataSourceNo(1).addRange(fieldNum(PackListView, PtsProdnorwood)).value(queryValue(false));
q.dataSourceNo(1).addRange(fieldNum(PackListView, CustAccount)).value(queryValue(!acc));
q.dataSourceNo(1).addRange(fieldNum(PackListView, InvoiceAccount)).value(queryValue(!acc));
q.dataSourceNo(1).addRange(fieldNum(PackListView, PtsSalesorderPacked)).value(queryValue(false));
q.dataSourceNo(1).addRange(fieldNum(PackListView, PtsWebDeliveryDate)).value(queryrange(d, today()+daysahead));

//OR
q.dataSourceNo(1).addRange(fieldNum(PackListView, PtsSalesorderPacked)).value(queryValue(false));
q.dataSourceNo(1).addRange(fieldNum(PackListView, PtsWebDeliveryDate)).value(queryrange(d, today()+daysahead));


    qr = new queryRun(q);

        while( qr.next())// && counter < 100
        {
             //Do stuff
        }

那么我如何将 OR 运算符与此合并?

伙计们干杯:)

【问题讨论】:

    标签: sql axapta x++ dynamics-ax-2012


    【解决方案1】:

    您可以使用您的条件生成查询字符串,如下所示:

    .value(strfmt("((Field1 == %1 && Field2 == %2) || Field1 != %3)", 
     var1, var2, var3, varX, ...));
    

    可能是它不是很聪明,但它是标准的方式。您可以将queryValue 函数与一些变量(如基本枚举或日期)一起使用,以获取每个值的正确查询字符串。

    【讨论】:

      【解决方案2】:

      您可以使用逗号分隔值并将 csv 传递给值函数,如下所示 q.dataSourceNo(1).addRange(fieldNum(PackListView, SalesStatus)).value(queryValue(SalesStatus::Delivered) + "," + "未结订单"));

      【讨论】:

      • 我注意到我可以通过将字段插入视图->元数据->数据源的范围节点来做到这一点,但我有点想要它,这样如果第一个过滤器代码块没有返回 TRUE,然后转到下一个过滤器代码块,因为我已将括号添加到每个“代码块”中,因此括号中的所有代码都需要返回 true,如果不是,则“检查其他代码块” .这会帮助我实现这一目标吗?谢谢你的回答,我的朋友。
      • 还有另一种方法可以在查询中指定 OR AND 运算符请参阅此链接axaptapedia.com/Expressions_in_query_ranges
      【解决方案3】:

      我决定用它制作一个临时表,在标准的 select 语句中进行所有过滤,后来我使用 x++ 查询构建来添加排序和所需的不同内容。这效果很好,感觉更容易做到,而不是将长字符串查询注入到查询对象中。

      但感谢您的回答:)

      【讨论】:

      • 这很好用。但是,不要害怕字符串查询,因为查询框架将其作为过滤后的格式良好的 SQL 字符串在数据库中运行。一个或另一个将与适当的索引一起正常工作,因为最终的 SQL 查询将同样有效。
      最近更新 更多