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

873 views Asked by At

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.

2

There are 2 answers

0
Sébastien Sevrin On

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.

0
Trubs On

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.