How to know if a report is already printed in SSRS?

≡放荡痞女 提交于 2019-12-11 12:33:32

问题


The user of my report would like to know if the report has already been printed? If the report has already been printed then the user would like to see a message that the report has already been printed previously on the report next time the report is generated. what is the best way to achieve this? Thanks in advance.


回答1:


There is no official documentation on how to achieve this, but I there could be a way of doing this.

The ExecutionLogStorage table contains information about reports executed or exported.
When you print a report by clicking on the print button in the toolbar, the report is "re-generated" and it is logged in the ExecutionLogStorage table, with Format = 'IMAGE'.

If you export your report as a TIFF file, a line is also generated with Format = 'IMAGE'.

Fortunately, there is also a ByteCount column, which contains the "Size of rendered reports in bytes." according to MSDN.

This ByteCount column contains 0 in the case the report is printed, and the image size if you do an image export.

So I ended up with the following query, that you can execute in the SSRS DB:

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

I just kept key columns here and of course you can you can adapt it to fit your need, and maybe do a group by to have print counts per report.

Important notes:

  • This worked in my case but it is not officially supported, so do not be surprised if it doesn't work for you.
  • It can be obvious for most people but this will not work if the user prints the report in any other way than clicking on the print report button, like:
    • Exporting the report in any format (PDF, Excel, Doc)
    • CTRL + P the page
  • Take Server Properties into account:
    • EnableExecutionLogging must be set to true
    • The default ExecutionLogDaysKept is 60 so adjust this number accordingly

In your case with the above query, you could add a DataSource to your report targetting the ReportServer DB, and if the query has a result matching the report, display the message.

Alternatively, you could schedule a job filling another DB that will be used to keep track of the reports printed, and query this DB in the report.




回答2:


If you click the print button, the RenderFormat.Name of the report is IMAGE (The print button actually renders the report as a TIFF prior to printing, so Export as TIFF file would have the same effect)

if you're using the renderformat as a parameter to an proc, you could log the fact it was printed, and subsequently display a message saying so.



来源:https://stackoverflow.com/questions/30924983/how-to-know-if-a-report-is-already-printed-in-ssrs

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!