报告服务和动态字段

时间:2012-02-13 19:10:44

标签: tsql dynamic reporting-services

我是报道服务的新手,所以这个问题可能很疯狂。我正在寻找一种方法来创建一个空的“模板”报告(基本上是一个套用信函),而不是必须为我们系统中的每个客户创建一个。此表格信函的一部分是具有任意数量的25个特定字段的部分。该部分安排如下:

Name:           Jesse James
Date of Birth:  1/1/1800
Address:        123 Blah Blah Street
                Anywhere, USA 12345
Another Field:  Data
Another Field2: More Data

那些(以及客户指定的任何其他字段)可以按任何顺序排列,左边的标签可以是客户决定的任何内容(例如:'DOB'而不是'出生日期')。理想情况下,我希望能够拥有一个Web界面,您可以在其中单击所需的字段,指定它们的显示顺序,并指定自定义标签的内容。我想出了一种方法来指定标签并对它们进行排序(并在报告中“动态”加载它们),但如果可以的话,我想更进一步,并允许动态字段(右侧)选择和排序。问题是,我想在不使用动态SQL的情况下执行此操作。我沿着一条配置表的路径走下去,该配置表包含一个序数,自定义标签文本和实际的列名,并试图通过information_schema.columns将该表与实际包含数据的表连接起来。也许查询所有潜在的字段并让INNER JOIN进行我的过滤(如果有来自'configuration'表的匹配等)。这不会像我想的那样工作:)我想我想我可以模拟数据集的功能(它将值和字段名称烘焙到对象中)。我意识到这不是尝试这样一个壮举的最佳工具,这正是我被迫使用的东西。

配置表将保存许多客户/报告的配置,我将按客户ID进行过滤。配置表看起来像这样:

CustID LabelText ColumnName Ordinal 1名字FName 1 1姓氏LName 2 1出生日期DOBirth 3 2客户端ID ClientID 1 2姓氏LName 2 2地址1地址1 3 2地址2地址2 4

所有这一切:

  1. 有没有办法解决上面提到的问题?
  2. 我是否过于挑剔不使用动态SQL,因为有问题的部分只会拉回一行?但是,有数百个客户每天运行此报告(信件)两到三次。
  3. 另外,请记住,我不是要在报表上动态创建文本框。我将要么将字段连接成一个字符串并将其转储到一个文本框中,或者我将有多个报告,每个报告都有一组期望通用字段名称(“field1”等)的文本框。我打的越多,听起来就越疯狂...... 如果没有办法做到这一点,我可能会在自定义代码中找到一些东西;但我的OCD方面想要相信有超出我目前能力的SQL可以以更加顺畅的方式做到这一点。

1 个答案:

答案 0 :(得分:0)

不确定为什么需要在一行中返回所有内容:似乎SSRS希望进一步规范化:为当前报告的配置表中的每一行返回一行。如果你真的需要连接,那么在报告中的嵌入式代码中执行此操作,或者考虑只在表格中放置一个表格。下面的查询对您的配置表进行了一些假设。它是仅保存当前报告的配置,还是一次为多个客户/报告保留配置?此外,您没有提供有关如何过滤到相应记录的详细信息,因此我只使用了客户ID。

SELECT
   config.ordinal,
   config.LabelText,
   CASE config.ColumnName
      WHEN 'FName' THEN DataRecord.FirstName
      WHEN 'LName' THEN DataRecord.LastName
      WHEN 'ClientID' THEN DataRecord.ClientID
      WHEN 'DOBirth' THEN DataRecord.DOB
      WHEN 'Address' THEN DataRecord.Address
      WHEN 'Field' THEN DataRecord.Field
      WHEN 'Field2' THEN DataRecord.Field2
      ELSE
      NULL
      END AS response
FROM
   ConfigurationTable AS config
LEFT OUTER JOIN
   DataTable AS DataRecord
ON config.CustID = DataRecord.CustomerID 
WHERE DataRecord.CustomerID = @CustID
ORDER BY
   config.Ordinal

在SSRS或SQL中,还有其他方法可以执行此操作,具体取决于您的要求的详细信息。