有没有办法根据参数向SSRS数据集添加空行?

时间:2016-08-19 14:37:18

标签: reporting-services ssrs-2012

我有一份SSRS报告,可以在3列中打印30页的地址标签。

我创建的报告类似于找到的here

指令

我很少需要打印30个标签。因此,为了节省纸张和金钱,我想在此报告中添加一个参数,编号为1-30,以决定页面上的哪个位置开始打印。

如果我已在页面上打印了16个标签,我可以在参数中选择17,我的结果将开始在页面的第17个标签上打印。

如果我可以使用该参数在我的结果集中添加一些空行,我可以完成此操作。这可能吗?

3 个答案:

答案 0 :(得分:0)

我不确定这是最佳解决方案,但请参阅下面的查询

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

你会得到这样的结果

enter image description here

然后运行它将在报告中显示空值时显示空白(我认为您在报告中使用组来打印多行)

答案 1 :(得分:0)

我遇到了类似的问题,例如选择要打印的标签,还需要为每个客户打印超过1个标签。我的问题是我无法访问SQL(我们使用立方体)。我使用SSRS 2012和SharePoint。它不漂亮,但确实有效。

我的报告中有一个数据集。我有14个标签 - 7个标签和1个2对面。每个标签都设置为自己的Tablix。

Tablix从左上角开始编号为1到14。所以,1-7,在左边的“列”和&然后从右边“列”的顶部8-14。

令人讨厌的是,参数值从0开始,因此编号为0-13 每个Tablix设置为由特定参数值进行累计,例如tablix 1设置为按参数值0过滤,tablix 2按参数值1过滤,tablix 3过滤参数值2,tablix 4过滤按参数值3等。

我必须在标签中打印两次数据,所以我在tablix中使用了两个文本框。

创建参数

用户将使用客户端ID(6位数字)作为参数值。我创建了一个名为ClientID的参数。为了提示我输入“为每个标签替换000000。000000 =空白标签”

  1. 在常规选项下,我:

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

    • left as None
  3. 默认值
    • 已选择指定值
    • 点击添加并将值设置为00000我这样做了14次(所以每个标签的默认值为000000)
  4. 创建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),它将打印出来 我可以防止这种情况的唯一方法是使用字体颜色(我无法使Visibility工作)。 +右键单击文本框 +选择文本框属性 +单击字体选项 +在“颜色”下,单击“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”,“白色”,“黑色”)

    因此,当用户运行报告时,他们会将000000,000000,000000等替换为相应的客户端ID

答案 2 :(得分:0)

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是开始打印的标签槽,&#34; null&#34;记录在报告中显示为空白。 Chanom的解决方案可以跳过记录并显示空白,我的解决方案不需要跳过记录,而是添加X个空白记录。