【问题标题】:Generate SSRS report purely from user input纯粹从用户输入生成 SSRS 报告
【发布时间】:2014-06-09 14:36:24
【问题描述】:

我有一个简单的需求,但在 SQL Reporting Services 中却难以实现。

我的报告,应该做到以下几点:

  • 用户输入一个整数,我们称之为A
  • 为从 1 到 A 的每个数字生成一个标签
  • 所有标签均打印在 A4 纸上(一行四张标签,行数将相应计算)

因此,如果用户输入数字 100,则 100 个标签将打印在 25 行中。

出于充分的理由,我需要使用 SSRS - 标签包含条形码,我有一个仅在 SSRS 中工作的第三方组件。我还想将此报告与现有系统很好地集成,并使用所有 SSRS 好东西,如分页等。

如何做到这一点?显然,此报告不需要任何 SQL 连接或数据,但 SSRS 似乎不允许我在没有实际数据源的情况下使用 Tablix。我试图在 SQL 中创建一个虚拟数据集,但我不知道如何创建返回给定行数的虚拟表的查询。

如果有解决方案只使用嵌入在报告中的 VB 脚本,我会很好。此时我只能想到创建临时表并用我的数据填充它,有没有更优雅的解决方案?

【问题讨论】:

  • 鉴于这是 SSRS,期待 SQL 数据源,使用 sproc 生成临时表似乎相对优雅,并且将来更容易调试......

标签: sql sql-server reporting-services


【解决方案1】:

如果问题归结为查询返回 A 行,那么您应该研究用于生成数字表的 sql 技术。这是一种最多 25 行的简单方法。

select d1.n * 5 + d0.n
from    
    (select 0 union all select 1 union all select 2 union all select 3 union all select 4) as d0(n),
    (select 0 union all select 1 union all select 2 union all select 3 union all select 4) as d1(n)
where d1.n * 5 + d0.n < A

【讨论】:

    【解决方案2】:

    您需要连接到数据库。进入任何数据库都没关系,可以使用下面的语句来获取数字

    DECLARE @A INT = 100;
    
    SELECT DISTINCT  number 
    FROM master..spt_values
    WHERE number >= 1
    AND   number <= @A
    

    【讨论】:

      【解决方案3】:

      由于您不需要实际生成任何数据,因此您可以像这样非常简单地创建一些东西来生成 (A / 4) 行。这将是您的 tablix 中的行的基础。

      DECLARE @A INT = 100;
      
      SELECT  TOP (CAST(CEILING(@A / 4.0) AS INT)) AnyVal = 1
      FROM    sys.all_objects a, sys.all_objects b;
      

      有一个number of other ways 可以生成任意集合,并且在执行循环/递归 CTE 时,它们之间没有太多选择。不过,您仍然需要连接到数据库。

      更进一步,您还可以详细说明需要显示 4 列中的哪一列:

      DECLARE @A INT = 5;
      
      SELECT  DisplayCol1 = 1,
              DisplayCol2 = CASE WHEN RowNumber * 4 + 1 >= @A THEN 0 ELSE 1 END,
              DisplayCol3 = CASE WHEN RowNumber * 4 + 2 >= @A THEN 0 ELSE 1 END,
              DisplayCol4 = CASE WHEN RowNumber * 4 + 3 >= @A THEN 0 ELSE 1 END
      FROM    (   SELECT  TOP (CAST(CEILING(@A / 4.0) AS INT)) 
                          RowNumber = ROW_NUMBER() OVER(ORDER BY a.object_id) - 1
                  FROM    sys.all_objects a, sys.all_objects b
              ) t;
      

      这给出了:

      DisplayCol1 DisplayCol2 DisplayCol3 DisplayCol4
      1           1           1           1
      1           0           0           0
      

      表示一共显示5个标签,只需要显示第2行的第一列即可。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多