在 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 函数。
我想获取 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 函数。