我试图根据任何正在运行的总行数是否为负值来隐藏组。我正在制作制造计划报告,并且如果在所选时间范围内没有特定部件的短缺,则希望隐藏整个组。我不确定我是否在正确的轨道上,但这是我尝试过的(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()表达式上,它会隐藏所有内容,即使报告中存在短缺(所以我希望它能显示所有内容,或者在第一次短缺后显示所有内容。)
编辑:
以下是我实际报告输出的简化屏幕截图(您无法看到群组标签,但已将其分组)。
日期和数量是查询字段。余额是数量的运行值。例外是与Balance相同的运行值计算的SWITCH - 这里还会有一些其他的例外选项,最终我想根据这个字段隐藏/显示,但我想让它工作首先使用Quantity来保持简单(因为它是我认为导致我的问题的runvalue表达式)。有一个名为&#34; Part&#34;。
的组Balance的表达式是
=RunningValue(Fields!NetQty.Value,Sum,"Part")
如果所有Balance值都高于零,我需要能够隐藏整个组。如果任何值低于零,那么我想查看整个组以及该组中的所有行,无论单个行是低于零还是现在。
查询来自我们的ERP到临时表,但它有效
SELECT Part, Date, Quantity from PartDetail WHERE Date <= ?UserParameter
还有一些其他领域,但我不认为它们在这里是相关的(例如,如果它是一个出站交易,我可以在数量上点击以获取基于另一个字段的NetQuantity )。
答案 0 :(得分:0)
我可能误解了您的要求,但您应该可以使用简单的表达式在没有任何代码的情况下执行此操作。
假设您有一个名为&#34; Group1&#34;和详细信息行包含一个名为&#34; Quantity&#34;你想检查否定..
在屏幕底部的“组”面板中右键单击要隐藏的组,然后选择“属性”。在属性面板中,点击&#39;可见性&#39;然后将hidden属性设置为这样的表达式。 (假设您想隐藏组,如果它不包含底片)。
=MIN(Fields!Quantity.Value, "Group1") >0
请注意,您正在设置隐藏属性,因此如果此表达式返回True,则该组将被隐藏。 &#34;组1&#34;设置表达式的范围以在每个组中进行检查。通过查找最小值,如果它> 0,则组中不得出现负数。
希望有所帮助。
答案 1 :(得分:0)
我希望这次我能正确理解你!
这是一个包含表变量的示例,我认为该变量应该接近您从临时表中获取的数据。
输出应该允许您只需要在SSRS中进行非常基本的过滤,或者您可以根据注释扩展它,只将过滤后的数据发送到您的报告。我把它留在了,以防你可能想要显示这些。
首先,我们只创建一个与临时表结构相匹配的表,您显然在最终报告中不需要这样,但它可以方便地进行测试。
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中的运行总计,然后检查那些运行总计是否会低于零(再次在部分内)
-- 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
希望这有帮助。