报告服务 - 如何知道报表是否已在 SSRS 中打印



我的报表的用户想知道报表是否已打印?如果报表已打印,则用户希望在下次生成报表时看到一条消息,指出报表以前已在报表上打印。实现这一目标的最佳方法是什么?提前谢谢。

没有关于如何实现这一点的官方文档,但我可能有一种方法可以做到这一点。

ExecutionLogStorage表包含有关已执行或导出的报告的信息。
当您通过单击工具栏中的打印按钮打印报告时,报告将"重新生成",并记录在ExecutionLogStorage表中,并带有Format = 'IMAGE'

如果将报告导出为 TIFF 文件,则还会生成一行带有 Format = 'IMAGE' 的行。

幸运的是,根据 MSDN,还有一个ByteCount列,其中包含"呈现的报告的大小(以字节为单位)。

ByteCount列包含打印报表时0,以及图像大小(如果执行图像导出)。

因此,我最终得到了以下查询,您可以在 SSRS 数据库中执行:

select els.[LogEntryId],
       c.[Name],
       c.[Path],
       els.[Parameters],
       els.[UserName],
       els.[TimeStart],
       els.[TimeEnd]
from [dbo].[ExecutionLogStorage] els
left join [dbo].[Catalog] c on els.[ReportID] = c.[ItemID]
where els.[Format] = 'IMAGE'
and els.[ByteCount] = 0
order by els.[LogEntryId] desc

我只是在这里保留了关键列,当然您可以调整它以满足您的需求,也许可以做一个group by来获得每个报告的打印计数。

重要提示:

  • 这在我的情况下有效,但它没有得到官方支持,所以如果它不适合你,请不要感到惊讶。
  • 对于大多数人来说,这很明显,但如果用户以任何其他方式打印报告,而不是单击打印报告,这将不起作用 按钮,例如:
    • 以任何格式导出报告(PDF、Excel、Doc)
    • 按 CTRL + P 页面
  • 考虑服务器属性:
    • EnableExecutionLogging必须设置为true
    • 默认ExecutionLogDaysKept 60因此请相应地调整此数字
对于上述查询,您可以向报表

中添加一个以报表服务器数据库为目标的数据源,如果查询的结果与报表匹配,则显示该消息。

或者,您可以计划一个作业填充另一个数据库,该数据库将用于跟踪打印的报告,并在报告中查询此数据库。

如果单击打印按钮,则报表的 RenderFormat.Name IMAGE(打印按钮实际上在打印之前将报表呈现为 TIFF,因此Export as TIFF file具有相同的效果)

如果使用 renderformat 作为 proc 的参数,则可以记录它被打印的事实,然后显示一条消息。

最新更新