我的报表的用户想知道报表是否已打印?如果报表已打印,则用户希望在下次生成报表时看到一条消息,指出报表以前已在报表上打印。实现这一目标的最佳方法是什么?提前谢谢。
没有关于如何实现这一点的官方文档,但我可能有一种方法可以做到这一点。
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 的参数,则可以记录它被打印的事实,然后显示一条消息。