我正在处理BOM树爆炸报告。它具有很多用途,属于一个总体思路:使工程师和成本会计师关心的信息可以很容易地显示BOM树。我在SQL Server 2008r2中为MS Dynamics AX 2009工作。
查询运行正常。报告运行正常。递归运行正常。但缺少的是体重累加。在AX中,权重字段通常是项目主文件中的便利字段,通常不用于任何类型的业务逻辑。但是,我们将其作为CPQ软件的一个因素,因此需要有些准确。我试图增加重量累加的可见度,以帮助识别和校正我们产品的重量。
由于我已经拥有每单位的重量和我的数据集中每个BOM行的计算总重量(并且它们正确拉动),我的第一次尝试是在SSRS报告中执行聚合。我尝试使用SUM(Fields!TotalWeight.Value, "BOMTreeDS", recursive)
,但结果是从当前行到所有深度的所有BOM级别都进行了小计。因此,如果我的BOM有5个{0,1,2,3,4}级别并且我正在查看级别2中的某些内容,那么它将在此记录中添加权重2,其子项为3,及其子项在4中也是如此。这不好。 4中的权重已经在3级中计算,我绝对不想包括项目自身的权重。
然后我尝试使用名为" GUID"的组变量。在“一个人”和“#34;细节"我正在进行递归的小组。我尝试了公式SUM(IIF(Variables!GUID.Value = Fields!PARENTGUID.Value, Fields!TotalWeight.Value, 0), "BOMTreeDS")
。我对此非常乐观,因为它会返回直接孩子的重量总和。我使用了组变量,因为我不确定如何管理范围从此行到IIF函数内数据集中所有行的移位。无论如何,它没有用。 Visual Studio告诉我,我不允许在聚合函数中使用组变量。
然后我将注意力转移到数据集中的SQL查询。如果SSRS不想玩得很好,我可以在SQL Server中完成它。我正在使用CTE生成递归,我正在动态创建GUID。
这是一个非常长的查询,但这是执行BOM爆炸的片段...
WITH Hierarchy AS
(
SELECT
CAST('' AS NVARCHAR(50)) AS PARENTGUID,
CAST(NEWID() AS NVARCHAR(50)) AS GUID,
PhysItem.*,
CAST('' AS NVARCHAR(10)) AS ColorID,
CAST(1 AS NUMERIC(28, 12)) AS BOMQTY,
CAST(1 AS NUMERIC(28, 12)) AS QTY,
0 AS Level
FROM PhysItem
WHERE
PhysItem.Item = @ItemId AND
PhysItem.Color = @ColorId
UNION ALL
SELECT
CAST(Hierarchy.GUID AS NVARCHAR(50)) AS PARENTGUID,
CAST(NEWID() AS NVARCHAR(50)) AS GUID,
PhysItem.DATAAREAID,
PhysItem.Item,
PhysItem.Color,
PhysItem.ItemName,
PhysItem.ItemGroup,
PhysItem.ItemType,
_Component.UNITID,
CASE
WHEN PhysItem.ItemGroup = 'PKG' OR PhysItem.ItemType = 'Service' THEN CAST(0 AS NUMERIC(28, 12))
WHEN _Component.UNITID = 'lb' THEN 1
ELSE PhysItem.NETWEIGHT
END AS NETWEIGHT,
CASE
WHEN _Component.ITEMBOMID IS NOT NULL AND _Component.ITEMBOMID <> '' THEN _Component.BOMID
ELSE PhysItem.BOMID
END AS BOMID,
_Invent.INVENTCOLORID,
CAST(_Component.BOMQTY/_Component.BOMQTYSERIE AS NUMERIC(28, 12)),
CAST(Hierarchy.QTY * _Component.BOMQTY/_Component.BOMQTYSERIE AS NUMERIC(28, 12)),
Hierarchy.Level + 1
FROM dbo.BOM _Component
INNER JOIN Hierarchy ON
_Component.BOMID = Hierarchy.BOMID
AND _Component.DATAAREAID = Hierarchy.DATAAREAID
INNER JOIN dbo.INVENTDIM _Invent ON
_Component.INVENTDIMID = _Invent.INVENTDIMID
AND _Component.DATAAREAID = _Invent.DATAAREAID
INNER JOIN PhysItem ON
Hierarchy.DATAAREAID = PhysItem.DATAAREAID
AND _Component.ITEMID = PhysItem.Item
AND _Invent.INVENTCOLORID = PhysItem.Color
)
如您所见,我正在使用CAST(NEWID()AS NVARCHAR(50))创建GUID。现在我遇到了一个新问题。我创建了一个子查询来对子项求和,并且从GUID到PARENTGUID的比较失败了。由于一些原因,这尤其令人困惑。
所以是的...所有这一切都得到了一个多层次的权重报告。在我看来,我想为每个项目查看当前在项目主文件中设置的值以及它旁边的直接子项的权重总和。那么有人可以浏览一下这个报告然后说'嗯嗯...这个重量看起来不太正常&#34;。
思想?