【问题标题】:Hide groups based on textbox value in group footer (populated with code) - SSRS根据组页脚中的文本框值隐藏组(用代码填充)-SSRS
【发布时间】:2017-05-01 01:59:18
【问题描述】:

我正在尝试根据任何运行总行是否具有负值来隐藏组。我正在为制造建立一个计划报告,如果在选定的时间范围内没有特定零件的短缺,我想隐藏整个组。我不确定我是否走在正确的轨道上,但这是我尝试过的(SQL 2014):

加码得到总数:

Dim public totalBalance as Integer
Public Function AddTotal(ByVal balance AS Integer ) AS Integer
                totalBalance = totalBalance + balance    
            return balance
End Function

Public Function GetTotal()
            return totalBalance
End Function

使用每个明细行上的代码来统计运行总计

=Code.AddTotal(SWITCH({FORMULA CALCULATING RUNNING TOTAL}<0,1,TRUE,0))

将总计添加到同一列但在组页脚中:

=Code.GetTotal()

问题 1 - GetTotal 代码似乎在每次打印时聚合整个报告(直到报告中的那个点),而不是在组上重新启动。我对 SSRS 中的代码知之甚少,无法告诉它重新开始指望一个新组。假设我可以成功隐藏非短组,我们将不胜感激。

问题 2 - 如果我尝试基于该文本框或直接在 Code.GetTotal() 表达式上隐藏任何内容,它会隐藏所有内容,即使报告中存在短缺(所以我希望它要么显示所有内容,或在第一次短缺后显示所有内容)。

编辑:

这是我实际报告输出的简化屏幕截图(您看不到组标签,但它已分组)。

报告截图

日期和数量是查询字段。余额是数量上的一个运行值。 Exception 是与 Balance 相同的运行值计算的 SWITCH - 这里还会有一些其他异常选项,最终我想根据这个字段隐藏/显示,但我想让它只使用 Quantity首先要保持简单(因为我认为是 runningvalue 表达式导致了我的问题)。有一个名为“Part”的组。

平衡的表达式是

=RunningValue(Fields!NetQty.Value,Sum,"Part")

如果所有余额值都高于零,我需要能够隐藏整个组。如果任何值低于零,那么我想查看整个组和该组中的所有行,无论单个行是低于零还是现在。

查询是从我们的 ERP 传到一个临时表中的,但它是有效的

SELECT Part, Date, Quantity from PartDetail WHERE Date <= ?UserParameter

还有一些其他字段,但我认为它们在这里不相关(例如,如果是出站交易,我会翻转 Quantity 上的符号以基于另一个字段获取 NetQuantity)。

【问题讨论】:

  • 好的,我现在明白这个问题了。现在还有一件事......你的组基于什么,Part?我的直觉是在 SQL 中完成所有这些操作,但解决方案会因您运行的 SQL Server 版本而异。附言我在英国,所以可能需要一些时间才能回复您。
  • 组基于 PartNumber。 SQL 有点不同——我在 ERP 的查询向导中构建了查询,然后将数据集转储到临时表中。然后 SSRS 对该数据集进行查询。限制是原始查询需要是单个级别(没有子查询),因为将初始查询结果推送到临时表的功能存在问题(我相信这是一个错误,因为我被告知它会是已在更高版本的 ERP 软件中修复)。
  • 哦,我需要使用向导才能从软件内部启动报告。不过,我可以将其他数据集直接添加到报告中,只要我有至少一组来自 ERP 的数据集,所以我想我可以在必要时通过向导简单地传递一些参数。

标签: sql reporting-services


【解决方案1】:

我可能误解了你的要求,但你应该可以不用任何代码,用一个简单的表达式来做到这一点。

假设您有一个名为“Group1”的组,并且详细信息行包含一个名为“Quantity”的列值,您要检查它是否有负数。

在屏幕底部的组面板中右键单击要隐藏的组,选择属性。在属性面板中单击“可见性”,然后将隐藏属性设置为这样的表达式。 (假设你想隐藏不包含底片的组)。

=MIN(Fields!Quantity.Value, "Group1") >0 

请注意,您正在设置 hidden 属性,因此如果此表达式返回 True,则该组将被隐藏。 “Group1”设置表达式的范围以在每个组内检查。通过寻找最小值,如果它>0,那么组中一定没有负数。

希望对您有所帮助。

【讨论】:

  • 我没有名为 Quantity 的字段。我在文本框中有一个 runningvalue 表达式,并且 SSRS 似乎不允许对聚合进行聚合(所以我不能 MIN a RUNNINGVALUE)。
  • 您能否编辑您的问题以显示数据集输出和报告设计的示例。如果没有看到这一点,很难准确理解您需要什么,但是,您的运行值(我假设)是聚合来自数据集的值。无论如何,让我们看看你的数据集(查询和示例数据)和所需的输出并从那里获取。
  • 更新了!谢谢。
【解决方案2】:

希望这次我理解正确了!

这是一个示例,其中包含一个表变量,我认为它应该接近您从临时表中获取的数据。

输出应该允许您只需要在 SSRS 中进行非常基本的过滤,或者您可以根据 cmets 对其进行扩展,以便仅将过滤后的数据发送到您的报告。我把它留了下来,以防你也想选择显示这些。

首先,我们只创建一个与您的临时表结构匹配的表,您显然不会在最终报告中使用它,但它便于测试。

DECLARE @InputData TABLE (Part varchar(10), [Date] Date, Qty int)

INSERT INTO @InputData
VALUES 
('ABC', '2017-01-13', 10),
('ABC', '2017-01-14', 3),
('ABC', '2017-01-15', -4),
('ABC', '2017-01-16', -10),
('ABC', '2017-01-17', 5),
('ABC', '2017-01-18', 6),
('ABC', '2017-01-19', 6),
('DEF', '2017-01-13', 10),
('DEF', '2017-01-14', -5),
('DEF', '2017-01-15', -4),
('DEF', '2017-01-16', 3),
('DEF', '2017-01-17', 2),
('DEF', '2017-01-18', 1),
('DEF', '2017-01-19', -1),
('GHI', '2017-01-13', 12),
('GHI', '2017-01-14', -3),
('GHI', '2017-01-15', -4),
('GHI', '2017-01-16', 4),
('GHI', '2017-01-17', 3),
('GHI', '2017-01-18', 2),
('GHI', '2017-01-19', 1),
('JKL', '2017-01-13', 11),
('JKL', '2017-01-14', 4),
('JKL', '2017-01-15', -6),
('JKL', '2017-01-16', -12),
('JKL', '2017-01-17', 5),
('JKL', '2017-01-18', 6),
('JKL', '2017-01-19', 6)

现在一个简单的查询计算部分内的运行总计,然后检查这些运行总计是否低于零(再次在部分内)

-- Return data including running total by Part 
-- Starting at the inner query we get the running total within Part
-- The outer query checks the min running total and sets a HideGroup column
SELECT 
    *
    , CASE WHEN MIN(RunTot) OVER(PARTITION BY Part) <0 THEN 1 ELSE 0 END AS HideGroup
    FROM 
    (-- running total within part
    select 
        *
        , SUM(Qty) OVER(PARTITION BY Part ORDER BY [Date]) AS RunTot
         from @InputData
    ) x

-- optionally we could wrap the whole thing in another select and 
-- we could filter out anything where hidegroup =1

最终输出如下所示。

Part    Date        Qty RunTot  HideGroup
ABC     2017-01-13  10  10      1
ABC     2017-01-14  3   13      1
ABC     2017-01-15  -4  9       1
ABC     2017-01-16  -10 -1      1
ABC     2017-01-17  5   4       1
ABC     2017-01-18  6   10      1
ABC     2017-01-19  6   16      1
DEF     2017-01-13  10  10      0
DEF     2017-01-14  -5  5       0
DEF     2017-01-15  -4  1       0
DEF     2017-01-16  3   4       0
DEF     2017-01-17  2   6       0
DEF     2017-01-18  1   7       0
DEF     2017-01-19  -1  6       0
GHI     2017-01-13  12  12      0
GHI     2017-01-14  -3  9       0
GHI     2017-01-15  -4  5       0
GHI     2017-01-16  4   9       0
GHI     2017-01-17  3   12      0
GHI     2017-01-18  2   14      0
GHI     2017-01-19  1   15      0
JKL     2017-01-13  11  11      1
JKL     2017-01-14  4   15      1
JKL     2017-01-15  -6  9       1
JKL     2017-01-16  -12 -3      1
JKL     2017-01-17  5   2       1
JKL     2017-01-18  6   8       1
JKL     2017-01-19  6   14      1

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多