none
Sugestões para trabalhar com crystal RRS feed

  • Pergunta

  • Opa.
    Estou começando a desenvolver um módulo de relatórios para o meu sistema.
    Vi que preciso criar um viewr para cada relatório.
    Quero fazer isso somente com um viewr, ai instanciar o rpt quando for chamado para este viewr.
    Ou seja o viewer vai servir para todos os relatórios do meu sistema.

    o problema é como fazer isso. Por exemplo, não conseguir passar por byref o rpt para mostrar no form do viewer.

    Vlw as dicas desde ja´.
    terça-feira, 26 de agosto de 2008 20:37

Respostas

  • Cássio,

     

    Minha sugestão: Exemplo completo em VB.NET

     

    Adicionei um form ao projeto Windows Form o nome wfmCarregarDados

     

    Adicione  referência (Add reference) ao projeto System.Configuration

    Code Snippet

    'referências do banco de dados

    Imports System.Data.SqlClient

    Imports System.Data

    'referências do crystal reports

    Imports CrystalDecisions.CrystalReports.Engine

    Imports CrystalDecisions.Shared

    'referência ConnectionStrings web.config

    Imports System.Configuration

    Imports System.Text

     

     

    Rotina para montar o relatório

    Code Snippet

    Private Sub ListaProdutos()

    Dim crReportDocument As New ReportDocument

    Dim strConexao = ConfigurationManager.ConnectionStrings("AWorks").ToString

    Dim oConn As New SqlConnection

    Dim strSQL As New StringBuilder

    Dim oTable As New DataTable()

    Try

     

    '1 passo: carregar o relatório

    Dim strPathreport As String = String.Concat(Application.StartupPath.ToString(), "\CrystalReports\rptProdutos.rpt")

    strPathreport = strPathreport.Replace("bin\Debug\", "")

    crReportDocument.Load(strPathreport)

    'configurando para impressão em Landscape

    'crReportDocument.PrintOptions.PaperOrientation = PaperOrientation.Landscape

     

    '2 passo: passar os dados para o relatório (datatable)

    'abrindo conexão com o banco de dados

    oConn.ConnectionString = strConexao

    oConn.Open()

     

    'carregando os dados

    strSQL.Append(" SELECT ")

    strSQL.Append(" Production.Product.ProductID, ")

    strSQL.Append(" Production.Product.Name, ")

    strSQL.Append(" Production.Product.Color, ")

    strSQL.Append(" Production.Product.ListPrice, ")

    strSQL.Append(" Production.ProductSubcategory.Name AS NameSubcategory ")

    strSQL.Append(" FROM ")

    strSQL.Append(" Production.Product INNER JOIN Production.ProductSubcategory ")

    strSQL.Append(" ON Production.Product.ProductSubcategoryID = Production.ProductSubcategory.ProductSubcategoryID ")

    Dim oDA As New SqlDataAdapter(strSQL.ToString, oConn)

    oDA.Fill(oTable)

     

    'definindo o DataSource do relatório

    crReportDocument.SetDataSource(oTable)

     

    '

    'visualizando o relatório

    '

     

    'criar uma instância do form printpreview

    Dim ofrmPrintPreview As New wfmPrintPreview

     

    'definindo o ReportSource do printpreview

    ofrmPrintPreview.crPrintPreview.DisplayGroupTree = False

    ofrmPrintPreview.crPrintPreview.ReportSource = crReportDocument

     

    'exibir o form

    ofrmPrintPreview.Show()

     

    Catch ex As Exception

    System.Diagnostics.Debug.WriteLine(ex.Message)

    Finally

     

    'liberando os objetos

    oConn.Dispose()

    oTable.Dispose()

    oConn = Nothing

    oTable = Nothing

    End Try

    End Sub

     

     

    Adicione um controle Button ao form com o nome btnCarregarRelCrystalReports e adicione o seguinte código no evento btnCarregarRelCrystalReports_Click

     

    Code Snippet
    ListaProdutos()

     

     

    Agora, adicione um novo form o nome wfmPrintPreview.vb, adicione um controle CrystalReportViewer com o nome crPrintPreview e adicione o seguinte código:

     

    Code Snippet

    Private Sub wfmPrintPreview_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing

     

    'liberando os objetos

    Me.crPrintPreview.Dispose()

     

    End Sub

     

     

    O Resultado é um PrintPreview com Crystal Reports .NET sem utilizar Refresh e um form independente  para visualizar os relatórios da aplicação.

    Utilizei nesse exemplo o banco de dados AdventureWorks e banco de dados SQL-Server 2005 express.

     

    Caso precise, mando o código fonte do projeto por e-mail.

     

     

     

     

    Ajude a melhorar o nosso Fórum!
    Não esqueça de marca a mensagem como "útil", caso tenha ajudado.

     

     

     

     

     

     

     

    quarta-feira, 27 de agosto de 2008 01:26
    Moderador
  • Opa!

     

    Vamos lá:

     

    1- eu não preciso criar um reportviewr dentro de um form? qual form ele vai mostrar?

     

    No exemplo, eu adicionei um novo form ao projeto com o nome wfmPrintPreview.vb, adicionei também um controle CrystalReportViewer com o nome crPrintPreview e adicione o seguinte código no evento FormClosing do Form:

     

    Code Snippet

    Private Sub wfmPrintPreview_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing

     

    'liberando os objetos

    Me.crPrintPreview.Dispose()

     

    End Sub

     

     

    Esse será o nosso form utilizado para fazer o printpreview de TODOS os relatórios da aplicação. Veja que até agora não tenho nenhum referência com o relatório a ser visualizado.

     

    2 - aqui vc está contando que o report (layout dentro do rpt) já está criado né?

    Sim, para visualizar o relatório (.rpt), você precisa primeiro criar o relatório com base em um dataset (conforme eu faço nos exemplos dos webcasts sobre Crystal Reports e ReportViewer).

     

    3 - quer dizer, na tua solução, eu somente um form pra charmar o rel e tudo vai dar certo?
    Sim, eu fiz um teste em uma aplicação Windows Form e funciona sem nenhum problema.

     

    Veja se assim fica melhor:

     

    Adicionei um form ao projeto Windows Form o nome wfmCarregarDados

     

    Adicione  referência (Add reference) ao projeto System.Configuration

    Code Snippet

    'referências do banco de dados

    Imports System.Data.SqlClient

    Imports System.Data

    'referências do crystal reports

    Imports CrystalDecisions.CrystalReports.Engine

    Imports CrystalDecisions.Shared

    'referência ConnectionStrings web.config

    Imports System.Configuration

    Imports System.Text

     

    'classe responsável pelo printpreview de um relatório Crystal Reports

    Imports PrintPreview

     

    Rotina para montar o relatório

    Code Snippet

    Private Sub ListaProdutos()

    Dim crReportDocument As New ReportDocument

    Dim strConexao = ConfigurationManager.ConnectionStrings("AWorks").ToString

    Dim oConn As New SqlConnection

    Dim strSQL As New StringBuilder

    Dim oTable As New DataTable()

    Try

     

    '1 passo: carregar o relatório

    Dim strPathreport As String = String.Concat(Application.StartupPath.ToString(), "\CrystalReports\rptProdutos.rpt")

    strPathreport = strPathreport.Replace("bin\Debug\", "")

    crReportDocument.Load(strPathreport)

    'configurando para impressão em Landscape

    'crReportDocument.PrintOptions.PaperOrientation = PaperOrientation.Landscape

     

    '2 passo: passar os dados para o relatório (datatable)

    'abrindo conexão com o banco de dados

    oConn.ConnectionString = strConexao

    oConn.Open()

     

    'carregando os dados

    strSQL.Append(" SELECT ")

    strSQL.Append(" Production.Product.ProductID, ")

    strSQL.Append(" Production.Product.Name, ")

    strSQL.Append(" Production.Product.Color, ")

    strSQL.Append(" Production.Product.ListPrice, ")

    strSQL.Append(" Production.ProductSubcategory.Name AS NameSubcategory ")

    strSQL.Append(" FROM ")

    strSQL.Append(" Production.Product INNER JOIN Production.ProductSubcategory ")

    strSQL.Append(" ON Production.Product.ProductSubcategoryID = Production.ProductSubcategory.ProductSubcategoryID ")

    Dim oDA As New SqlDataAdapter(strSQL.ToString, oConn)

    oDA.Fill(oTable)

     

    'definindo o DataSource do relatório

    crReportDocument.SetDataSource(oTable)

     

    '

    'visualizando o relatório

    '

    PreviewRelCrystalReports (crReportDocument)

     

     

    Catch ex As Exception

    System.Diagnostics.Debug.WriteLine(ex.Message)

    Finally

     

    'liberando os objetos

    oConn.Dispose()

    oTable.Dispose()

    oConn = Nothing

    oTable = Nothing

    End Try

    End Sub

     

     

    Adicione um controle Button ao form com o nome btnCarregarRelCrystalReports e adicione o seguinte código no evento btnCarregarRelCrystalReports_Click

     

    Code Snippet
    ListaProdutos()

     

     

    Agora, adicione um novo form o nome wfmPrintPreview.vb, adicione um controle CrystalReportViewer com o nome crPrintPreview e adicione o seguinte código:

     

    Code Snippet

    Private Sub wfmPrintPreview_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing

     

    'liberando os objetos

    Me.crPrintPreview.Dispose()

     

    End Sub

     

     

    adicione uma classe ao projeto com o nome PrintPreview, contendo o seguinte código:

     

    Code Snippet

    Imports CrystalDecisions.Shared

    'referência ConnectionStrings web.config

    Imports System.Configuration

    Imports System.Text

    Public Class PrintPreview

    Public Shared Sub PreviewRelCrystalReports(ByVal crReportDocument As ReportDocument)

    '

    'visualizando o relatório

    '

    Try

    'criar uma instância do form printpreview

    Dim ofrmPrintPreview As New wfmPrintPreview

     

    'definindo o ReportSource do printpreview

    ofrmPrintPreview.crPrintPreview.DisplayGroupTree = False

    ofrmPrintPreview.crPrintPreview.ReportSource = crReportDocument

     

    'exibir o form

    ofrmPrintPreview.Show()

     

    Catch ex As Exception

    MsgBox(ex.Message.ToString)

    End Try

     

    End Sub

    End Class

     

     

    Agora eu tenho uma sub PreviewRelCrystalReports, na classe PrintPreview que faz a visualização de um relatório do Crystal reports utilizando o form wfmPrintPreview

     

    O Resultado é um PrintPreview com Crystal Reports .NET sem utilizar Refresh e um form independente  para visualizar os relatórios da aplicação.

    Utilizei nesse exemplo o banco de dados AdventureWorks e banco de dados SQL-Server 2005 express.

     

    Bem, uma outra forma de implementar. Em caso de dúvidas é só teclar!

     

     

    Ajude a melhorar o nosso Fórum!
    Não esqueça de marca a mensagem como "útil", caso tenha ajudado.

     

     

    sábado, 30 de agosto de 2008 18:15
    Moderador
  • Altere o conteúdo da propriedade ReportSource do seu ReportViewer para o relatório desejado (e não esqueça o Refresh depois)!

     

    http://forums.msdn.microsoft.com/en-US/vscrystalreports/thread/3caa5f9d-daf3-433d-aa95-6689dfd7048e/

    terça-feira, 26 de agosto de 2008 23:44
    Moderador

Todas as Respostas

  • Altere o conteúdo da propriedade ReportSource do seu ReportViewer para o relatório desejado (e não esqueça o Refresh depois)!

     

    http://forums.msdn.microsoft.com/en-US/vscrystalreports/thread/3caa5f9d-daf3-433d-aa95-6689dfd7048e/

    terça-feira, 26 de agosto de 2008 23:44
    Moderador
  • Cássio,

     

    Minha sugestão: Exemplo completo em VB.NET

     

    Adicionei um form ao projeto Windows Form o nome wfmCarregarDados

     

    Adicione  referência (Add reference) ao projeto System.Configuration

    Code Snippet

    'referências do banco de dados

    Imports System.Data.SqlClient

    Imports System.Data

    'referências do crystal reports

    Imports CrystalDecisions.CrystalReports.Engine

    Imports CrystalDecisions.Shared

    'referência ConnectionStrings web.config

    Imports System.Configuration

    Imports System.Text

     

     

    Rotina para montar o relatório

    Code Snippet

    Private Sub ListaProdutos()

    Dim crReportDocument As New ReportDocument

    Dim strConexao = ConfigurationManager.ConnectionStrings("AWorks").ToString

    Dim oConn As New SqlConnection

    Dim strSQL As New StringBuilder

    Dim oTable As New DataTable()

    Try

     

    '1 passo: carregar o relatório

    Dim strPathreport As String = String.Concat(Application.StartupPath.ToString(), "\CrystalReports\rptProdutos.rpt")

    strPathreport = strPathreport.Replace("bin\Debug\", "")

    crReportDocument.Load(strPathreport)

    'configurando para impressão em Landscape

    'crReportDocument.PrintOptions.PaperOrientation = PaperOrientation.Landscape

     

    '2 passo: passar os dados para o relatório (datatable)

    'abrindo conexão com o banco de dados

    oConn.ConnectionString = strConexao

    oConn.Open()

     

    'carregando os dados

    strSQL.Append(" SELECT ")

    strSQL.Append(" Production.Product.ProductID, ")

    strSQL.Append(" Production.Product.Name, ")

    strSQL.Append(" Production.Product.Color, ")

    strSQL.Append(" Production.Product.ListPrice, ")

    strSQL.Append(" Production.ProductSubcategory.Name AS NameSubcategory ")

    strSQL.Append(" FROM ")

    strSQL.Append(" Production.Product INNER JOIN Production.ProductSubcategory ")

    strSQL.Append(" ON Production.Product.ProductSubcategoryID = Production.ProductSubcategory.ProductSubcategoryID ")

    Dim oDA As New SqlDataAdapter(strSQL.ToString, oConn)

    oDA.Fill(oTable)

     

    'definindo o DataSource do relatório

    crReportDocument.SetDataSource(oTable)

     

    '

    'visualizando o relatório

    '

     

    'criar uma instância do form printpreview

    Dim ofrmPrintPreview As New wfmPrintPreview

     

    'definindo o ReportSource do printpreview

    ofrmPrintPreview.crPrintPreview.DisplayGroupTree = False

    ofrmPrintPreview.crPrintPreview.ReportSource = crReportDocument

     

    'exibir o form

    ofrmPrintPreview.Show()

     

    Catch ex As Exception

    System.Diagnostics.Debug.WriteLine(ex.Message)

    Finally

     

    'liberando os objetos

    oConn.Dispose()

    oTable.Dispose()

    oConn = Nothing

    oTable = Nothing

    End Try

    End Sub

     

     

    Adicione um controle Button ao form com o nome btnCarregarRelCrystalReports e adicione o seguinte código no evento btnCarregarRelCrystalReports_Click

     

    Code Snippet
    ListaProdutos()

     

     

    Agora, adicione um novo form o nome wfmPrintPreview.vb, adicione um controle CrystalReportViewer com o nome crPrintPreview e adicione o seguinte código:

     

    Code Snippet

    Private Sub wfmPrintPreview_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing

     

    'liberando os objetos

    Me.crPrintPreview.Dispose()

     

    End Sub

     

     

    O Resultado é um PrintPreview com Crystal Reports .NET sem utilizar Refresh e um form independente  para visualizar os relatórios da aplicação.

    Utilizei nesse exemplo o banco de dados AdventureWorks e banco de dados SQL-Server 2005 express.

     

    Caso precise, mando o código fonte do projeto por e-mail.

     

     

     

     

    Ajude a melhorar o nosso Fórum!
    Não esqueça de marca a mensagem como "útil", caso tenha ajudado.

     

     

     

     

     

     

     

    quarta-feira, 27 de agosto de 2008 01:26
    Moderador
  • dae Laércio, blza..

    Achei legal a tua solução.
    porém tenho algumas dúvidas:

    1- eu não preciso criar um reportviewr dentro de um form? qual form ele vai mostrar?
    2 - aqui vc está contando que o report (layout dentro do rpt) já está criado né?
    3 - quer dizer, na tua solução, eu somente um form pra charmar o rel e tudo vai dar certo?

    aguardo vlw.




    sábado, 30 de agosto de 2008 17:33
  • Opa!

     

    Vamos lá:

     

    1- eu não preciso criar um reportviewr dentro de um form? qual form ele vai mostrar?

     

    No exemplo, eu adicionei um novo form ao projeto com o nome wfmPrintPreview.vb, adicionei também um controle CrystalReportViewer com o nome crPrintPreview e adicione o seguinte código no evento FormClosing do Form:

     

    Code Snippet

    Private Sub wfmPrintPreview_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing

     

    'liberando os objetos

    Me.crPrintPreview.Dispose()

     

    End Sub

     

     

    Esse será o nosso form utilizado para fazer o printpreview de TODOS os relatórios da aplicação. Veja que até agora não tenho nenhum referência com o relatório a ser visualizado.

     

    2 - aqui vc está contando que o report (layout dentro do rpt) já está criado né?

    Sim, para visualizar o relatório (.rpt), você precisa primeiro criar o relatório com base em um dataset (conforme eu faço nos exemplos dos webcasts sobre Crystal Reports e ReportViewer).

     

    3 - quer dizer, na tua solução, eu somente um form pra charmar o rel e tudo vai dar certo?
    Sim, eu fiz um teste em uma aplicação Windows Form e funciona sem nenhum problema.

     

    Veja se assim fica melhor:

     

    Adicionei um form ao projeto Windows Form o nome wfmCarregarDados

     

    Adicione  referência (Add reference) ao projeto System.Configuration

    Code Snippet

    'referências do banco de dados

    Imports System.Data.SqlClient

    Imports System.Data

    'referências do crystal reports

    Imports CrystalDecisions.CrystalReports.Engine

    Imports CrystalDecisions.Shared

    'referência ConnectionStrings web.config

    Imports System.Configuration

    Imports System.Text

     

    'classe responsável pelo printpreview de um relatório Crystal Reports

    Imports PrintPreview

     

    Rotina para montar o relatório

    Code Snippet

    Private Sub ListaProdutos()

    Dim crReportDocument As New ReportDocument

    Dim strConexao = ConfigurationManager.ConnectionStrings("AWorks").ToString

    Dim oConn As New SqlConnection

    Dim strSQL As New StringBuilder

    Dim oTable As New DataTable()

    Try

     

    '1 passo: carregar o relatório

    Dim strPathreport As String = String.Concat(Application.StartupPath.ToString(), "\CrystalReports\rptProdutos.rpt")

    strPathreport = strPathreport.Replace("bin\Debug\", "")

    crReportDocument.Load(strPathreport)

    'configurando para impressão em Landscape

    'crReportDocument.PrintOptions.PaperOrientation = PaperOrientation.Landscape

     

    '2 passo: passar os dados para o relatório (datatable)

    'abrindo conexão com o banco de dados

    oConn.ConnectionString = strConexao

    oConn.Open()

     

    'carregando os dados

    strSQL.Append(" SELECT ")

    strSQL.Append(" Production.Product.ProductID, ")

    strSQL.Append(" Production.Product.Name, ")

    strSQL.Append(" Production.Product.Color, ")

    strSQL.Append(" Production.Product.ListPrice, ")

    strSQL.Append(" Production.ProductSubcategory.Name AS NameSubcategory ")

    strSQL.Append(" FROM ")

    strSQL.Append(" Production.Product INNER JOIN Production.ProductSubcategory ")

    strSQL.Append(" ON Production.Product.ProductSubcategoryID = Production.ProductSubcategory.ProductSubcategoryID ")

    Dim oDA As New SqlDataAdapter(strSQL.ToString, oConn)

    oDA.Fill(oTable)

     

    'definindo o DataSource do relatório

    crReportDocument.SetDataSource(oTable)

     

    '

    'visualizando o relatório

    '

    PreviewRelCrystalReports (crReportDocument)

     

     

    Catch ex As Exception

    System.Diagnostics.Debug.WriteLine(ex.Message)

    Finally

     

    'liberando os objetos

    oConn.Dispose()

    oTable.Dispose()

    oConn = Nothing

    oTable = Nothing

    End Try

    End Sub

     

     

    Adicione um controle Button ao form com o nome btnCarregarRelCrystalReports e adicione o seguinte código no evento btnCarregarRelCrystalReports_Click

     

    Code Snippet
    ListaProdutos()

     

     

    Agora, adicione um novo form o nome wfmPrintPreview.vb, adicione um controle CrystalReportViewer com o nome crPrintPreview e adicione o seguinte código:

     

    Code Snippet

    Private Sub wfmPrintPreview_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing

     

    'liberando os objetos

    Me.crPrintPreview.Dispose()

     

    End Sub

     

     

    adicione uma classe ao projeto com o nome PrintPreview, contendo o seguinte código:

     

    Code Snippet

    Imports CrystalDecisions.Shared

    'referência ConnectionStrings web.config

    Imports System.Configuration

    Imports System.Text

    Public Class PrintPreview

    Public Shared Sub PreviewRelCrystalReports(ByVal crReportDocument As ReportDocument)

    '

    'visualizando o relatório

    '

    Try

    'criar uma instância do form printpreview

    Dim ofrmPrintPreview As New wfmPrintPreview

     

    'definindo o ReportSource do printpreview

    ofrmPrintPreview.crPrintPreview.DisplayGroupTree = False

    ofrmPrintPreview.crPrintPreview.ReportSource = crReportDocument

     

    'exibir o form

    ofrmPrintPreview.Show()

     

    Catch ex As Exception

    MsgBox(ex.Message.ToString)

    End Try

     

    End Sub

    End Class

     

     

    Agora eu tenho uma sub PreviewRelCrystalReports, na classe PrintPreview que faz a visualização de um relatório do Crystal reports utilizando o form wfmPrintPreview

     

    O Resultado é um PrintPreview com Crystal Reports .NET sem utilizar Refresh e um form independente  para visualizar os relatórios da aplicação.

    Utilizei nesse exemplo o banco de dados AdventureWorks e banco de dados SQL-Server 2005 express.

     

    Bem, uma outra forma de implementar. Em caso de dúvidas é só teclar!

     

     

    Ajude a melhorar o nosso Fórum!
    Não esqueça de marca a mensagem como "útil", caso tenha ajudado.

     

     

    sábado, 30 de agosto de 2008 18:15
    Moderador
  • Amigo estou tentando fazer mas estou com problemas na classe

    Public Shared Sub PreviewRelCrystalReports(ByVal crReportDocument As ReportDocument)

     
    Poderia me ajudar
     
    Grato
    Francis
    terça-feira, 13 de janeiro de 2009 22:42
  • que problema?
    segunda-feira, 26 de janeiro de 2009 16:14
  • Olá Francis,

     

    Por favor, detalhe melhor o seu problema e neste caso adicione uma nova Thread no fórum.

     

    Obrigado,

     


    [ ]'s

     Laércio.


    Ajude a melhorar o nosso Fórum!
    Não esqueça de marca a mensagem como "útil", caso tenha ajudado.

     

    segunda-feira, 26 de janeiro de 2009 17:43
    Moderador
  • Obrigado amigos eu ja resolvi, fiz igual e funcionou corretamente.

     

    Abraços

     

    Francis

    segunda-feira, 26 de janeiro de 2009 21:31