[英]SSRS Report Builder: Creating text color expression based on textbox value?
[英]Hide groups based on textbox value in group footer (populated with code) - SSRS
我试图根据是否有任何正在运行的总计行具有负值来隐藏组。 我正在为生产制造计划报告,如果在选定的时间范围内特定零件不短缺,我想隐藏整个团队。 我不确定自己是否步入正轨,但这是我尝试过的方法(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
使用每个明细行上的代码来计算运行总计<0的行数。
=Code.AddTotal(SWITCH({FORMULA CALCULATING RUNNING TOTAL}<0,1,TRUE,0))
将总计添加到同一列中但在组页脚中:
=Code.GetTotal()
问题1-GetTotal代码似乎在每次打印时(直到报告中的这一点)都在汇总整个报告,而不是在组上重新启动。 我对SSRS中的代码了解不足,无法告诉它重新开始依靠新组。 希望能帮助您,前提是我可以成功地隐藏非短组。
问题2-如果我尝试基于该文本框或直接在Code.GetTotal()表达式中隐藏任何内容,即使报告不足,它也会隐藏所有内容(因此,我希望它可以显示所有内容,或显示所有内容第一次短缺后)。
编辑:
这是我的实际报告输出的简化屏幕截图(您看不到组标签,但已将其分组)。
日期和数量是查询字段。 余额是数量的运行值。 例外是SWITCH,其运行值计算与Balance相同-此处还将有其他例外选项,最终我想基于此字段进行隐藏/显示,但我想使其仅与“数量”一起使用首先要保持简单(因为我认为这是导致问题的运行值表达式)。 有一个称为“零件”的组。
余额的表达式是
=RunningValue(Fields!NetQty.Value,Sum,"Part")
如果所有“余额”值都大于零,则需要能够隐藏整个组。 如果任何值都小于零,那么我想查看整个组以及该组中的所有行,而不管单个行是低于零还是现在。
该查询是从我们的ERP进入临时表的,但它是有效的
SELECT Part, Date, Quantity from PartDetail WHERE Date <= ?UserParameter
还有其他一些字段,但是我认为它们在这里不相关(例如,如果是出库交易,我会翻转“数量”以获得基于另一个字段的NetQuantity)。
我可能误解了您的要求,但是您应该可以使用简单的表达式而无需任何代码即可完成此操作。
假设您有一个名为“ Group1”的组,并且明细行包含要检查负数的名为“ Quantity”的列值。
在屏幕底部的组面板中右键单击要隐藏的组,选择属性。 在属性面板中,单击“可见性”,然后将隐藏的属性设置为这样的表达式。 (假设您要隐藏该组,如果它不包含底片)。
=MIN(Fields!Quantity.Value, "Group1") >0
请注意,您正在设置hidden属性,因此,如果此表达式返回True,则该组将被隐藏。 “ Group1”设置要在每个组中检查的表达式范围。 通过寻找最小值,如果最小值> 0,则该组中必须没有负数。
希望能有所帮助。
希望这次我能正确理解您!
这是一个包含表变量的示例,我认为该变量应该与从临时表获取的数据接近。
输出应仅允许您在SSRS中进行非常基本的过滤,也可以根据注释进行扩展,以仅将过滤后的数据发送到报告中。 如果您可能也想显示这些内容,则我将其保留。
首先,我们只创建一个与您的temp表的结构匹配的表,您显然在最终报告中将不需要此表,但是它很方便进行测试。
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)
现在,一个简单的查询将计算Part内的运行总计,然后检查这些运行总计是否低于零(再次在part内)
-- 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
希望这可以帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.