SSRS递归子行总数

时间:2016-10-14 13:57:02

标签: sql-server recursion reporting-services aggregate

我正在处理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的比较失败了。由于一些原因,这尤其令人困惑。

  1. 我可以看到这些值,我可以看到它们匹配。
  2. 我将NVARCHAR的长度设为50,所以它不应该是一个长度问题。
  3. SSRS成功地将GUID与报告中的PARENTGUID匹配,并准确描绘了BOM。
  4. 所以是的...所有这一切都得到了一个多层次的权重报告。在我看来,我想为每个项目查看当前在项目主文件中设置的值以及它旁边的直接子项的权重总和。那么有人可以浏览一下这个报告然后说'嗯嗯...这个重量看起来不太正常&#34;。

    思想?

0 个答案:

没有答案