Please start any new threads on our new site at https://forums.sqlteam.com. We've got lots of great SQL Server experts to answer whatever question you can come up with.

 All Forums
 Development Tools
 Reporting Services Development
 Auto Print a Report

Author  Topic 

Lesele
Starting Member

4 Posts

Posted - 2008-04-02 : 05:23:41
Hi, all

I’ve got a table ,which gets populated with Product information, so what I want to happen is every time a table gets data [on insert] I want a report to be printed on the remote Printer passing a Currently inserted Product ID as a parameter.

I`m using SQL RS

visakh16
Very Important crosS Applying yaK Herder

52326 Posts

Posted - 2008-04-02 : 05:51:23
I dont think you can configure automated printing from SSRS
Go to Top of Page

Lesele
Starting Member

4 Posts

Posted - 2008-04-02 : 06:12:51
Ok , is it possible to call en run a report from a MS SQL srv Stored Procedure
Go to Top of Page

visakh16
Very Important crosS Applying yaK Herder

52326 Posts

Posted - 2008-04-02 : 06:13:46
Can i ask the reason for such a requirement?
Go to Top of Page

Lesele
Starting Member

4 Posts

Posted - 2008-04-02 : 07:09:42
its because on a my Table , when a new Product Record is entered I want to generate a Report ... passing Product ID as a parameter
Go to Top of Page

jhermiz

3564 Posts

Posted - 2008-04-02 : 07:30:12
quote:
Originally posted by Lesele

Hi, all

I’ve got a table ,which gets populated with Product information, so what I want to happen is every time a table gets data [on insert] I want a report to be printed on the remote Printer passing a Currently inserted Product ID as a parameter.

I`m using SQL RS




Everyone seems to think you cant...with code anything is possible especially with the rs object models and realizing that a print out is simply a distiller like pdf distiller.

here is some C# code to automate printing:


using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.Drawing.Printing;
using System.IO;
using System.Web.Services.Protocols;
using PrintReport.reportserver;
using System.Runtime.InteropServices; // For Marshal.Copy

namespace PrintReport
{
/// <summary>
/// A simple console application that demonstrates one way to
/// print Reporting Services reports to a printer.
/// </summary>
class app
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main(string[] args)
{
PrintExample pe = new PrintExample();
// The name of the printer should be added here;
// this could be a local or network printer.
pe.PrintReport(@"\\jacc-fs120\S2500 PCL IT");
}
}

class PrintExample
{
ReportingService rs;
private byte[][] m_renderedReport;
private Graphics.EnumerateMetafileProc m_delegate = null;
private MemoryStream m_currentPageStream;
private Metafile m_metafile = null;
int m_numberOfPages;
private int m_currentPrintingPage;
private int m_lastPrintingPage;

public PrintExample()
{
// Create proxy object and authenticate
Console.WriteLine("Authenticating to the Web service...");
rs = new ReportingService();
rs.Credentials = System.Net.CredentialCache.DefaultCredentials;
}

public byte[][] RenderReport(string reportPath)
{
// Private variables for rendering
string deviceInfo = null;
string format = "IMAGE";
Byte[] firstPage = null;
string encoding;
string mimeType;
Warning[] warnings = null;
ParameterValue[] reportHistoryParameters = null;
string[] streamIDs = null;
Byte[][] pages = null;

// Build device info based on the start page
deviceInfo =
String.Format(@"<DeviceInfo><OutputFormat>{0}</OutputFormat></DeviceInfo>", "emf");

//Exectute the report and get page count.
try
{
// Renders the first page of the report and returns streamIDs for
// subsequent pages
firstPage = rs.Render(
reportPath,
format,
null,
deviceInfo,
null,
null,
null,
out encoding,
out mimeType,
out reportHistoryParameters,
out warnings,
out streamIDs);

// The total number of pages of the report is 1 + the streamIDs
m_numberOfPages = streamIDs.Length + 1;
pages = new Byte[m_numberOfPages][];

// The first page was already rendered
pages[0] = firstPage;

for (int pageIndex = 1; pageIndex < m_numberOfPages; pageIndex++)
{
// Build device info based on start page
deviceInfo =
String.Format(@"<DeviceInfo><OutputFormat>{0}</OutputFormat><StartPage>{1}</StartPage></DeviceInfo>",
"emf", pageIndex+1);
pages[pageIndex] = rs.Render(
reportPath,
format,
null,
deviceInfo,
null,
null,
null,
out encoding,
out mimeType,
out reportHistoryParameters,
out warnings,
out streamIDs);
}
}

catch (SoapException ex)
{
Console.WriteLine(ex.Detail.InnerXml);
}

catch (Exception ex)
{
Console.WriteLine(ex.Message);
}

finally
{
Console.WriteLine("Number of pages: {0}", pages.Length);
}

return pages;
}


public bool PrintReport(string printerName)
{
this.RenderedReport = this.RenderReport("/SampleReports/Company Sales");
try
{
// Wait for the report to completely render.
if(m_numberOfPages < 1)
return false;
PrinterSettings printerSettings = new PrinterSettings();
printerSettings.MaximumPage = m_numberOfPages;
printerSettings.MinimumPage = 1;
printerSettings.PrintRange = PrintRange.SomePages;
printerSettings.FromPage = 1;
printerSettings.ToPage = m_numberOfPages;
printerSettings.PrinterName = printerName;
PrintDocument pd = new PrintDocument();
m_currentPrintingPage = 1;
m_lastPrintingPage = m_numberOfPages;
pd.PrinterSettings = printerSettings;

// Print report
Console.WriteLine("Printing report...");
pd.PrintPage += new PrintPageEventHandler(this.pd_PrintPage);
pd.Print();
}

catch(Exception ex)
{
Console.WriteLine(ex.Message);
}
finally
{
// Clean up goes here.
}

return true;
}

private void pd_PrintPage(object sender, PrintPageEventArgs ev)
{
ev.HasMorePages = false;
if (m_currentPrintingPage <= m_lastPrintingPage && MoveToPage(m_currentPrintingPage))
{
// Draw the page
ReportDrawPage(ev.Graphics);
// If the next page is less than or equal to the last page,
// print another page.
if (++m_currentPrintingPage <= m_lastPrintingPage)
ev.HasMorePages = true;
}
}

// Method to draw the current emf memory stream
private void ReportDrawPage(Graphics g)
{
if(null == m_currentPageStream || 0 == m_currentPageStream.Length || null ==m_metafile)
return;
lock(this)
{
// Set the metafile delegate.
int width = m_metafile.Width;
int height= m_metafile.Height;
m_delegate = new Graphics.EnumerateMetafileProc(MetafileCallback);
// Draw in the rectangle
Point destPoint = new Point(0, 0);
g.EnumerateMetafile(m_metafile,destPoint , m_delegate);
// Clean up
m_delegate = null;
}
}

private bool MoveToPage(Int32 page)
{
// Check to make sure that the current page exists in
// the array list
if(null == this.RenderedReport[m_currentPrintingPage-1])
return false;
// Set current page stream equal to the rendered page
m_currentPageStream = new MemoryStream(this.RenderedReport[m_currentPrintingPage-1]);
// Set its postion to start.
m_currentPageStream.Position = 0;
// Initialize the metafile
if(null != m_metafile)
{
m_metafile.Dispose();
m_metafile = null;
}
// Load the metafile image for this page
m_metafile = new Metafile((Stream)m_currentPageStream);
return true;
}

private bool MetafileCallback(
EmfPlusRecordType recordType,
int flags,
int dataSize,
IntPtr data,
PlayRecordCallback callbackData)
{
byte[] dataArray = null;
// Dance around unmanaged code.
if (data != IntPtr.Zero)
{
// Copy the unmanaged record to a managed byte buffer
// that can be used by PlayRecord.
dataArray = new byte[dataSize];
Marshal.Copy(data, dataArray, 0, dataSize);
}
// play the record.
m_metafile.PlayRecord(recordType, flags, dataSize, dataArray);

return true;
}

public byte[][] RenderedReport
{
get
{
return m_renderedReport;
}
set
{
m_renderedReport = value;
}
}
}
}


Also to pass in parameters try this:


string[] parameters = reportPath.Split(new char[] { '&' });

ParameterValue[] reportParams = new ParameterValue[parameters.Length - 1];

for(int i = 1; i < parameters.Length; i++) // from 1 not from 0: in 0 index report name is located!!!

{

reportParams[i - 1] = new ParameterValue();

string[] param = parameters[i].Split(new char[] { '=' });

reportParams[i - 1].Name = param[0];

reportParams[i - 1].Value = param[1];

}





// Build device info based on the start page

deviceInfo = @"<DeviceInfo><OutputFormat>emf</OutputFormat></DeviceInfo>";



//Exectute the report and get page count.

try

{

// Renders the first page of the report and returns streamIDs for

// subsequent pages

firstPage = rs.Render(parameters[0], format, null, deviceInfo, reportParams, null,

null, out encoding, out mimeType, out reportHistoryParameters,

out warnings, out streamIDs);

....


Jon


Weblog -- [url]http://weblogs.sqlteam.com/jhermiz[/url]
Go to Top of Page

Lesele
Starting Member

4 Posts

Posted - 2008-04-03 : 02:22:53
THANKS VERY MUCH FOR THE CODE , BUT CAN I HAVE IT IN VB.NET PLZZZZ
Go to Top of Page

jhermiz

3564 Posts

Posted - 2008-04-03 : 07:04:09
quote:
Originally posted by Lesele

THANKS VERY MUCH FOR THE CODE , BUT CAN I HAVE IT IN VB.NET PLZZZZ



You can easily convert any C# code to vb.net and vice versa.
Did you ever hear of google? Try googling "Convert C# to VB.net"


Weblog -- [url]http://weblogs.sqlteam.com/jhermiz[/url]
Go to Top of Page

emilemil
Starting Member

1 Post

Posted - 2009-06-12 : 03:12:55
great, Thanks for your codes. it's working for me. But i have got an issue, when i printed out the pages,i can't fit page to print out. How to scale to fit the page while printing in your codes. thank you very much.

quote:
Originally posted by jhermiz

quote:
Originally posted by Lesele

Hi, all

I’ve got a table ,which gets populated with Product information, so what I want to happen is every time a table gets data [on insert] I want a report to be printed on the remote Printer passing a Currently inserted Product ID as a parameter.

I`m using SQL RS




Everyone seems to think you cant...with code anything is possible especially with the rs object models and realizing that a print out is simply a distiller like pdf distiller.

here is some C# code to automate printing:


using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.Drawing.Printing;
using System.IO;
using System.Web.Services.Protocols;
using PrintReport.reportserver;
using System.Runtime.InteropServices; // For Marshal.Copy

namespace PrintReport
{
/// <summary>
/// A simple console application that demonstrates one way to
/// print Reporting Services reports to a printer.
/// </summary>
class app
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main(string[] args)
{
PrintExample pe = new PrintExample();
// The name of the printer should be added here;
// this could be a local or network printer.
pe.PrintReport(@"\\jacc-fs120\S2500 PCL IT");
}
}

class PrintExample
{
ReportingService rs;
private byte[][] m_renderedReport;
private Graphics.EnumerateMetafileProc m_delegate = null;
private MemoryStream m_currentPageStream;
private Metafile m_metafile = null;
int m_numberOfPages;
private int m_currentPrintingPage;
private int m_lastPrintingPage;

public PrintExample()
{
// Create proxy object and authenticate
Console.WriteLine("Authenticating to the Web service...");
rs = new ReportingService();
rs.Credentials = System.Net.CredentialCache.DefaultCredentials;
}

public byte[][] RenderReport(string reportPath)
{
// Private variables for rendering
string deviceInfo = null;
string format = "IMAGE";
Byte[] firstPage = null;
string encoding;
string mimeType;
Warning[] warnings = null;
ParameterValue[] reportHistoryParameters = null;
string[] streamIDs = null;
Byte[][] pages = null;

// Build device info based on the start page
deviceInfo =
String.Format(@"<DeviceInfo><OutputFormat>{0}</OutputFormat></DeviceInfo>", "emf");

//Exectute the report and get page count.
try
{
// Renders the first page of the report and returns streamIDs for
// subsequent pages
firstPage = rs.Render(
reportPath,
format,
null,
deviceInfo,
null,
null,
null,
out encoding,
out mimeType,
out reportHistoryParameters,
out warnings,
out streamIDs);

// The total number of pages of the report is 1 + the streamIDs
m_numberOfPages = streamIDs.Length + 1;
pages = new Byte[m_numberOfPages][];

// The first page was already rendered
pages[0] = firstPage;

for (int pageIndex = 1; pageIndex < m_numberOfPages; pageIndex++)
{
// Build device info based on start page
deviceInfo =
String.Format(@"<DeviceInfo><OutputFormat>{0}</OutputFormat><StartPage>{1}</StartPage></DeviceInfo>",
"emf", pageIndex+1);
pages[pageIndex] = rs.Render(
reportPath,
format,
null,
deviceInfo,
null,
null,
null,
out encoding,
out mimeType,
out reportHistoryParameters,
out warnings,
out streamIDs);
}
}

catch (SoapException ex)
{
Console.WriteLine(ex.Detail.InnerXml);
}

catch (Exception ex)
{
Console.WriteLine(ex.Message);
}

finally
{
Console.WriteLine("Number of pages: {0}", pages.Length);
}

return pages;
}


public bool PrintReport(string printerName)
{
this.RenderedReport = this.RenderReport("/SampleReports/Company Sales");
try
{
// Wait for the report to completely render.
if(m_numberOfPages < 1)
return false;
PrinterSettings printerSettings = new PrinterSettings();
printerSettings.MaximumPage = m_numberOfPages;
printerSettings.MinimumPage = 1;
printerSettings.PrintRange = PrintRange.SomePages;
printerSettings.FromPage = 1;
printerSettings.ToPage = m_numberOfPages;
printerSettings.PrinterName = printerName;
PrintDocument pd = new PrintDocument();
m_currentPrintingPage = 1;
m_lastPrintingPage = m_numberOfPages;
pd.PrinterSettings = printerSettings;

// Print report
Console.WriteLine("Printing report...");
pd.PrintPage += new PrintPageEventHandler(this.pd_PrintPage);
pd.Print();
}

catch(Exception ex)
{
Console.WriteLine(ex.Message);
}
finally
{
// Clean up goes here.
}

return true;
}

private void pd_PrintPage(object sender, PrintPageEventArgs ev)
{
ev.HasMorePages = false;
if (m_currentPrintingPage <= m_lastPrintingPage && MoveToPage(m_currentPrintingPage))
{
// Draw the page
ReportDrawPage(ev.Graphics);
// If the next page is less than or equal to the last page,
// print another page.
if (++m_currentPrintingPage <= m_lastPrintingPage)
ev.HasMorePages = true;
}
}

// Method to draw the current emf memory stream
private void ReportDrawPage(Graphics g)
{
if(null == m_currentPageStream || 0 == m_currentPageStream.Length || null ==m_metafile)
return;
lock(this)
{
// Set the metafile delegate.
int width = m_metafile.Width;
int height= m_metafile.Height;
m_delegate = new Graphics.EnumerateMetafileProc(MetafileCallback);
// Draw in the rectangle
Point destPoint = new Point(0, 0);
g.EnumerateMetafile(m_metafile,destPoint , m_delegate);
// Clean up
m_delegate = null;
}
}

private bool MoveToPage(Int32 page)
{
// Check to make sure that the current page exists in
// the array list
if(null == this.RenderedReport[m_currentPrintingPage-1])
return false;
// Set current page stream equal to the rendered page
m_currentPageStream = new MemoryStream(this.RenderedReport[m_currentPrintingPage-1]);
// Set its postion to start.
m_currentPageStream.Position = 0;
// Initialize the metafile
if(null != m_metafile)
{
m_metafile.Dispose();
m_metafile = null;
}
// Load the metafile image for this page
m_metafile = new Metafile((Stream)m_currentPageStream);
return true;
}

private bool MetafileCallback(
EmfPlusRecordType recordType,
int flags,
int dataSize,
IntPtr data,
PlayRecordCallback callbackData)
{
byte[] dataArray = null;
// Dance around unmanaged code.
if (data != IntPtr.Zero)
{
// Copy the unmanaged record to a managed byte buffer
// that can be used by PlayRecord.
dataArray = new byte[dataSize];
Marshal.Copy(data, dataArray, 0, dataSize);
}
// play the record.
m_metafile.PlayRecord(recordType, flags, dataSize, dataArray);

return true;
}

public byte[][] RenderedReport
{
get
{
return m_renderedReport;
}
set
{
m_renderedReport = value;
}
}
}
}


Also to pass in parameters try this:


string[] parameters = reportPath.Split(new char[] { '&' });

ParameterValue[] reportParams = new ParameterValue[parameters.Length - 1];

for(int i = 1; i < parameters.Length; i++) // from 1 not from 0: in 0 index report name is located!!!

{

reportParams[i - 1] = new ParameterValue();

string[] param = parameters[i].Split(new char[] { '=' });

reportParams[i - 1].Name = param[0];

reportParams[i - 1].Value = param[1];

}





// Build device info based on the start page

deviceInfo = @"<DeviceInfo><OutputFormat>emf</OutputFormat></DeviceInfo>";



//Exectute the report and get page count.

try

{

// Renders the first page of the report and returns streamIDs for

// subsequent pages

firstPage = rs.Render(parameters[0], format, null, deviceInfo, reportParams, null,

null, out encoding, out mimeType, out reportHistoryParameters,

out warnings, out streamIDs);

....


Jon


Weblog -- [url]http://weblogs.sqlteam.com/jhermiz[/url]

Go to Top of Page
   

- Advertisement -