在 X++ 的连接语句中使用 abs 函数不起作用

Using abs function in join statement in X++ does not work

我想获取 Prodtable 记录的相关 BOMVersion。 prod table 中有一个名为 bomversion 的方法:

 public BOMVersion bomVersion()
    {
        BOMVersion bomVersion;

        // need to remove active from the query
        select firstonly bomVersion
            order by ItemId, Active, FromQty desc
            where bomVersion.ItemId         == this.ItemId          &&
                  bomVersion.bomId          == this.bomId           &&
                  bomVersion.FromQty        <= abs(this.QtySched)   &&
                  bomVersion.FromDate       <= this.bomDate         &&
                  (bomVersion.ToDate        >= this.bomDate         ||
                   ! bomVersion.ToDate
                  );

        return bomVersion;
    }

在其他 class 中,我使用 bom 版本方法逻辑来了解具有 BOMVersion 的第一个 prodtable 记录。这是我的代码:

select firstonly * from prodTable
             join bomVersion
            order by ItemId, Active, FromQty desc
            where
                  bomVersion.ItemId       == prodTable.ItemId           &&
                  bomVersion.bomId          == prodTable.bomId          &&
                  bomVersion.FromQty        <= abs(prodTable.QtySched)  && // abs does not work
                  bomVersion.FromDate       <= prodTable.bomDate        &&
                  (bomVersion.ToDate        >= prodTable.bomDate
                    || !bomVersion.ToDate);         

当我调试时,我了解到这段代码 returns 没有 RecId。在where条件一一评论后,我注意到这个问题与abs方法有关。当我从语句中删除 abs 方法时(我的意思是用 bomVersion.FromQty <= prodTable.QtySched 替换条件),找到记录。但是当我把 abs 没有发现记录。我应该提到我在 SQL 服务器中尝试了这个查询,在两种情况下,即使用 abs 和不使用 abs,它找到了记录。 其实我不明白这是什么原因。因为在Prodtable bomversion方法中的select语句中使用了这个abs方法。为什么那里不存在这个问题?

您可以在 select 子句中使用 X++ 函数,但在访问 SQL 服务器之前,它们会被评估 一次。这不是你想要的。

在这种情况下,您可以展开 abs 函数:

select firstonly prodTable
    join bomVersion
    order by ItemId, Active, FromQty desc
    where bomVersion.ItemId         == prodTable.ItemId         &&
          bomVersion.bomId          == prodTable.bomId          &&
        ((bomVersion.FromQty        <= prodTable.QtySched       && prodTable.QtySched >= 0) ||
         (bomVersion.FromQty        <=-prodTable.QtySched       && prodTable.QtySched <  0))                  
          bomVersion.FromDate       <= prodTable.bomDate        &&
         (bomVersion.ToDate         >= prodTable.bomDate        || !bomVersion.ToDate);         

你有没有计划过制作负片?

另一种方法是制作a view with a computed field。在计算字段函数中,您可以应用任何可用的 SQL 函数。