有没有办法根据参数向 SSRS 数据集添加空白行?
Is there a way to add a blank row to an SSRS dataset based on parameter?
我有一个 SSRS 报告,打印地址标签,30 页,3 列。
我创建的报告与找到的说明类似 here
我很少需要正好打印 30 个标签。所以,为了节省纸张和金钱,我想给这个报告添加一个参数,用数字 1-30 来决定页面上的哪个位置开始打印。
如果我已经在一页上打印了 16 个标签,那么我可以在参数中 select 17,我的结果将从页面上的第 17 个标签开始打印。
如果我可以使用参数向我的结果集中添加一些空白行,我就可以做到这一点。这可能吗?
我不确定这是最佳解决方案,但请参阅下面的查询
DECLARE @StartColumn INT = 6
;WITH CTE
AS (
SELECT *
,ROW_NUMBER() OVER (ORDER BY q.value) AS [rowNum]
FROM (
values('A'),('B'),('C'),('D'),('E'),('F'),('G'),('H'),('I'),('J'),('K'),('L')
) q (value)
)
SELECT CASE
WHEN CTE.rowNum > @StartColumn THEN CTE.value
ELSE NULL
END AS [Value]
FROM CTE
你会得到这样的结果
然后运行当报告中的值为空时它会显示空白(我想你在报告中使用组来打印多行)
我遇到了类似的问题,例如选择要打印的标签,但还需要为每个客户打印 1 个以上的标签。我的问题是我无法访问 SQL(我们使用多维数据集)。我将 SSRS 2012 与 SharePoint 一起使用。它不漂亮,但确实有效。
我的报告中有 1 个数据集。我有 14 个标签 - 7 个向下和 2 个横向。每个标签都设置为自己的 tablix。
Tablix 从左上角开始编号为 1 到 14。所以,1-7,从左往下 "column" & 然后从右上往下 8-14 "column".
烦人的参数值都是从0开始的,所以编号是0-13
每个tablix都设置为按特定参数值过滤,例如tablix 1设置为按参数值0过滤,tablix 2按参数值1过滤,tablix 3按参数值2过滤,tablix 4过滤按参数值 3 等
我不得不在标签中打印两次数据,所以我在 tablix 中使用了 2 个文本框。
创建参数
用户将使用客户端 ID(一个 6 位数字)作为参数值。我创建了一个名为 ClientID 的参数。对于提示,我输入 "Replace 000000 for each label required. 000000 = blank label"
在常规选项下,我:
- 已将数据类型更改为文本
- 已启用 允许空白值 ("")
- 启用允许多个值
- 将 Select 参数可见性设置为 Visible
可用值
- 保留为 None
- 默认值
- 已选择指定值
- 单击添加并将值设置为 00000 我这样做了 14 次(因此每个标签的默认值为 000000)
创建 tablix
然后我为每个标签创建了一个 tablix。他们都指向我的数据集(想象中称为"DataSet1")。它们由一个细胞组成。这与我的标签可打印区域的高度和宽度相匹配。
创建文本框
我在 tablix 单元格中添加了我的第一个文本框。我把它做得比 tablix 的宽度略小,刚好从 tablix 的顶部向下。
他们创建了第二个文本框并将其向下移动直到它适合我的需要。它使用与第一个文本框相同的公式。 (记住我需要打印两次客户名称)。
我在报告中使用了对数据集的查找。是的,尽管 tablix 已经基于此数据集。
对于第一个标签,两个文本框的公式为:
=lookup(Parameters!ClientID.Value(0),
Fields!ID.Value,
UCase(Fields!Surname.Value),
"DataSet1")
& ", " &
lookup(Parameters!ClientID.Value(0),
Fields!ID.Value,
Fields!Given.Value,
"DataSet1")
为 tablix 创建过滤器
我还必须对每个 tablix 应用过滤器,以便它打印通过参数选择的客户端信息。
在过滤器选项下的 Tablix 属性中
+ 单击添加
+ 从表达式中,我选择了我的 ClientID
+ 从接线员那里,我选择了 In
+ 在值中,我单击 Fx 按钮创建公式
=参数!ClientID.Value(0)
不显示默认参数值
显然,如果您将参数值保留为默认值 (000000),它将打印此内容。
我可以防止这种情况的唯一方法是使用字体颜色(我无法使可见性工作)。
+ 右键单击文本框
+ Select 文本框属性
+ 单击字体选项
+ 在颜色下,单击 Fx 按钮
+ 使用这个公式:
=iif(Parameters!ClientID.Value(0)="000000", "White", "Black")
后续标签
对于第二个标签,我为括号中的值编制了索引,例如 (0) 到 (1) 用于文本框公式和过滤器,例如
=lookup(Parameters!ClientID.Value(1),
Fields!ID.Value,
UCase(Fields!Surname.Value),
"DataSet1")
& ", " &
lookup(Parameters!ClientID.Value(1),
Fields!ID.Value,
Fields!Given.Value,
"DataSet1")
并在 Tablix 属性过滤器中,
=Parameters!ClientID.Value(1)
和文本框字体公式
=iif(Parameters!ClientID.Value(1)="000000", "White", "Black")
然后我为每个后续标签索引了这个数字,所以最后一个标签(标签 14)的值是:
=lookup(Parameters!ClientID.Value(13) etc
并在 Tablix 属性过滤器中,
=Parameters!ClientID.Value(13)
并在文本框字体公式中
=iif(参数!ClientID.Value(13)="000000", "White", "Black")
因此,当用户 运行 报告时,他们将 000000、000000、000000 等替换为适当的客户端 ID
Chanom 让我走上了正确的轨道,我的解决方案是创建我的数据集查询,如下例所示。
declare @cnt int = 1
declare @string varchar(max) = ''
declare @varID varchar(max) = cast(@paramID as varchar(max))
IF @paramStartLocation > 1
WHILE @cnt < @paramStartLocation
BEGIN
set @string = @string + 'select null as Column1
,null as Column2
,null as Column3
,null as Column4
,null as Column5
,null as Column6
UNION ALL
'
set @cnt = @cnt + 1
END
set @string = @string + 'SELECT [TableName].[Column1]
, [TableName].[Column2]
, [TableName].[Column3]
, [TableName].[Column4]
, [TableName].[Column5]
, [TableName].[Column6]
FROM [TableName]
WHERE [TableName].[IDColumn] in ('+@varID+')'
exec(@string)
此处@paramStartLocation 是开始打印的标签槽,"null" 记录在报告中显示为空白。 Chanom 的解决方案可以跳过记录并改为显示空白,我的解决方案需要不跳过记录而是添加 X 条空白记录。
我有一个 SSRS 报告,打印地址标签,30 页,3 列。
我创建的报告与找到的说明类似 here
我很少需要正好打印 30 个标签。所以,为了节省纸张和金钱,我想给这个报告添加一个参数,用数字 1-30 来决定页面上的哪个位置开始打印。
如果我已经在一页上打印了 16 个标签,那么我可以在参数中 select 17,我的结果将从页面上的第 17 个标签开始打印。
如果我可以使用参数向我的结果集中添加一些空白行,我就可以做到这一点。这可能吗?
我不确定这是最佳解决方案,但请参阅下面的查询
DECLARE @StartColumn INT = 6
;WITH CTE
AS (
SELECT *
,ROW_NUMBER() OVER (ORDER BY q.value) AS [rowNum]
FROM (
values('A'),('B'),('C'),('D'),('E'),('F'),('G'),('H'),('I'),('J'),('K'),('L')
) q (value)
)
SELECT CASE
WHEN CTE.rowNum > @StartColumn THEN CTE.value
ELSE NULL
END AS [Value]
FROM CTE
你会得到这样的结果
然后运行当报告中的值为空时它会显示空白(我想你在报告中使用组来打印多行)
我遇到了类似的问题,例如选择要打印的标签,但还需要为每个客户打印 1 个以上的标签。我的问题是我无法访问 SQL(我们使用多维数据集)。我将 SSRS 2012 与 SharePoint 一起使用。它不漂亮,但确实有效。
我的报告中有 1 个数据集。我有 14 个标签 - 7 个向下和 2 个横向。每个标签都设置为自己的 tablix。
Tablix 从左上角开始编号为 1 到 14。所以,1-7,从左往下 "column" & 然后从右上往下 8-14 "column".
烦人的参数值都是从0开始的,所以编号是0-13 每个tablix都设置为按特定参数值过滤,例如tablix 1设置为按参数值0过滤,tablix 2按参数值1过滤,tablix 3按参数值2过滤,tablix 4过滤按参数值 3 等
我不得不在标签中打印两次数据,所以我在 tablix 中使用了 2 个文本框。
创建参数
用户将使用客户端 ID(一个 6 位数字)作为参数值。我创建了一个名为 ClientID 的参数。对于提示,我输入 "Replace 000000 for each label required. 000000 = blank label"
在常规选项下,我:
- 已将数据类型更改为文本
- 已启用 允许空白值 ("")
- 启用允许多个值
- 将 Select 参数可见性设置为 Visible
可用值
- 保留为 None
- 默认值
- 已选择指定值
- 单击添加并将值设置为 00000 我这样做了 14 次(因此每个标签的默认值为 000000)
创建 tablix
然后我为每个标签创建了一个 tablix。他们都指向我的数据集(想象中称为"DataSet1")。它们由一个细胞组成。这与我的标签可打印区域的高度和宽度相匹配。
创建文本框
我在 tablix 单元格中添加了我的第一个文本框。我把它做得比 tablix 的宽度略小,刚好从 tablix 的顶部向下。
他们创建了第二个文本框并将其向下移动直到它适合我的需要。它使用与第一个文本框相同的公式。 (记住我需要打印两次客户名称)。
我在报告中使用了对数据集的查找。是的,尽管 tablix 已经基于此数据集。
对于第一个标签,两个文本框的公式为:
=lookup(Parameters!ClientID.Value(0),
Fields!ID.Value,
UCase(Fields!Surname.Value),
"DataSet1")
& ", " &
lookup(Parameters!ClientID.Value(0),
Fields!ID.Value,
Fields!Given.Value,
"DataSet1")
为 tablix 创建过滤器
我还必须对每个 tablix 应用过滤器,以便它打印通过参数选择的客户端信息。
在过滤器选项下的 Tablix 属性中 + 单击添加 + 从表达式中,我选择了我的 ClientID + 从接线员那里,我选择了 In + 在值中,我单击 Fx 按钮创建公式 =参数!ClientID.Value(0)
不显示默认参数值
显然,如果您将参数值保留为默认值 (000000),它将打印此内容。
我可以防止这种情况的唯一方法是使用字体颜色(我无法使可见性工作)。
+ 右键单击文本框
+ Select 文本框属性
+ 单击字体选项
+ 在颜色下,单击 Fx 按钮
+ 使用这个公式:
=iif(Parameters!ClientID.Value(0)="000000", "White", "Black")
后续标签
对于第二个标签,我为括号中的值编制了索引,例如 (0) 到 (1) 用于文本框公式和过滤器,例如
=lookup(Parameters!ClientID.Value(1),
Fields!ID.Value,
UCase(Fields!Surname.Value),
"DataSet1")
& ", " &
lookup(Parameters!ClientID.Value(1),
Fields!ID.Value,
Fields!Given.Value,
"DataSet1")
并在 Tablix 属性过滤器中,
=Parameters!ClientID.Value(1)
和文本框字体公式
=iif(Parameters!ClientID.Value(1)="000000", "White", "Black")
然后我为每个后续标签索引了这个数字,所以最后一个标签(标签 14)的值是:
=lookup(Parameters!ClientID.Value(13) etc
并在 Tablix 属性过滤器中,
=Parameters!ClientID.Value(13)
并在文本框字体公式中 =iif(参数!ClientID.Value(13)="000000", "White", "Black")
因此,当用户 运行 报告时,他们将 000000、000000、000000 等替换为适当的客户端 ID
Chanom 让我走上了正确的轨道,我的解决方案是创建我的数据集查询,如下例所示。
declare @cnt int = 1
declare @string varchar(max) = ''
declare @varID varchar(max) = cast(@paramID as varchar(max))
IF @paramStartLocation > 1
WHILE @cnt < @paramStartLocation
BEGIN
set @string = @string + 'select null as Column1
,null as Column2
,null as Column3
,null as Column4
,null as Column5
,null as Column6
UNION ALL
'
set @cnt = @cnt + 1
END
set @string = @string + 'SELECT [TableName].[Column1]
, [TableName].[Column2]
, [TableName].[Column3]
, [TableName].[Column4]
, [TableName].[Column5]
, [TableName].[Column6]
FROM [TableName]
WHERE [TableName].[IDColumn] in ('+@varID+')'
exec(@string)
此处@paramStartLocation 是开始打印的标签槽,"null" 记录在报告中显示为空白。 Chanom 的解决方案可以跳过记录并改为显示空白,我的解决方案需要不跳过记录而是添加 X 条空白记录。