在X ++中的join语句中使用abs功能不起作用

问题描述 投票:0回答:1

我想获取相关的Prodtable记录的BOMVersion。产品表中有一个名为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;
    }

在另一个类中,我使用bom版本方法逻辑来知道具有BOMVersion的第一个可生产记录。这是我的代码:

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);         

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

sql-server axapta x++ dynamics-365-operations
1个回答
1
投票

您可以在select子句中使用X ++函数,但是在访问SQL Server之前对它们进行评估[。这不是您想要的。

在这种情况下,您可以展开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函数。

© www.soinside.com 2019 - 2024. All rights reserved.