有没有办法根据参数向 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"

  1. 在常规选项下,我:

    • 已将数据类型更改为文本
    • 已启用 允许空白值 ("")
    • 启用允许多个值
    • 将 Select 参数可见性设置为 Visible
  2. 可用值

    • 保留为 None
  3. 默认值
    • 已选择指定值
    • 单击添加并将值设置为 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 条空白记录。