Sql Dynamics AX 2012复杂QueryBuild对象

Sql Dynamics AX 2012复杂QueryBuild对象,sql,axapta,x++,dynamics-ax-2012,Sql,Axapta,X++,Dynamics Ax 2012,尝试在AX中筛选特定数据范围时遇到问题 这就是我试图做的,用伪代码 (start >= now-30 && (end == null || end >= now-30)) || (end >= now-30 && (start == null || start >= now-30)) || (start >= now-30 && end >= now-30) 下面是我如何尝试去做的 类声明 QueryBuild

尝试在AX中筛选特定数据范围时遇到问题

这就是我试图做的,用伪代码

(start >= now-30 && (end == null || end >= now-30))
||
(end >= now-30 && (start == null || start >= now-30))
||
(start >= now-30 && end >= now-30)
下面是我如何尝试去做的

类声明

QueryBuildRange filterDates;
DS-INIT方法

filterDates=this.query().dataSourceName('LogTable').addRange(fieldNum(LogTable,startDateTime));    
filterDates=this.query().dataSourceName('LogTable').addRange(fieldNum(LogTable,endDateTime));    
DS执行方法

filterDates.value(strFmt("(%1 >= %3 && (%2 == %4 || %2 >= %3)) || (%2 >= %3 && (%1 == %4 || %1 >= %3)) || (%1 >= %3 && %2 >= %3)", fieldStr(LogTable, startDateTime), fieldStr(LogTable, endDateTime), currentTimeMinus30Mins, DateTimeUtil::minValue()));
AX似乎忽略了我输入的几乎所有completex查询


谢谢

我认为你的逻辑有缺陷,这可能是它不起作用的原因

我想您应该使用两个日期时间字段执行时间点搜索
开始
结束
,如果没有结束,
结束
则为空

要搜索30天前有效的记录,唯一需要的条件是:

(start <= now-30 && (end == null || end >= now-30))

上述方法适用于日期字段,我认为也适用于日期时间字段。

如果伪代码中的逻辑正确,我仍然可以看到DS EXECUTEQUERY方法中的一些缺陷:

  • 整个表达式必须用括号括起来
  • 每个子表达式都必须包含在自己的一组括号中
  • 缺少
    DateTimeUtil::toStr(…)
尝试按以下方式更改代码:

filterDates.value(strFmt("(((%1 >= %3) && ((%2 == %4) || (%2 >= %3))) || ((%2 >= %3) && ((%1 == %4) || (%1 >= %3))) || ((%1 >= %3) && (%2 >= %3)))",
                        fieldStr(LogTable, startDateTime),
                        fieldStr(LogTable, endDateTime),
                        DateTimeUtil::toStr(currentTimeMinus30Mins),
                        DateTimeUtil::toStr(DateTimeUtil::minValue())));
您应该能够将其简化一点:

filterDates.value(strFmt("(((%1 >= %3) || (%1 == %4)) && ((%2 >= %3) || (%2 == %4)) && !((%1 == %4) && (%2 == %4)))",
                        fieldStr(LogTable, startDateTime),
                        fieldStr(LogTable, endDateTime),
                        DateTimeUtil::toStr(currentTimeMinus30Mins),
                        DateTimeUtil::toStr(DateTimeUtil::minValue())));
另外,我不认为有任何理由在DS INIT方法中初始化filterDates两次。实际上,您可以在此范围内使用不同的字段,它不必是startDateTime或endDateTime:

filterDates = SysQuery::findOrCreateRange(this.query().dataSourceTable(tableNum(LogTable)), fieldNum(LogTable, RecId));
p.S.我不太清楚utcDateTime值应该如何在此类表达式中使用-据我所知,
DateTimeUtil::toStr(…)
应该可以工作。

尝试“info(query().XML());”语句,然后再将其传递给QueryRun对象以查看它吐出了什么?返回的XML是可读的伪SQL。
filterDates = SysQuery::findOrCreateRange(this.query().dataSourceTable(tableNum(LogTable)), fieldNum(LogTable, RecId));