none
Alimentar Arquivo rpt RRS feed

  • Pergunta

  •  

    Boa tarde turma,

    Bem, assisti aos vídeos do Laércio, e no exemplo o mesmo cria um DataSet para o arquivo rpt, mas a minha dúvida é: Para setar o banco nesse arquivo é necessário criar um DataSet mesmo?, pois caso eu tenha que distribuir minha aplicação, "Desktop" terei que efetuar mudanças na String de conexão. Tem outra forma?

     

    Obrigado.

    domingo, 4 de janeiro de 2009 19:35

Respostas

  • André,

     

        No terceiro vídeo que eu fiz sobre relatórios com Crystal Reports e ReportViewer, eu tenho exemplos com os bancos de dados Access, MySQL, Oracle, SQL Compact, etc.

     

         Ocorre que o arquivo com o código fonte disponibilizado no Media Center está com problema e o problema deve ser resolvido em breve.

     

         Para resolver o problema, em anexo, alguns exemplos com banco de dados MS Access e Crystal Reports.

     

    Code Snippet

    Option Explicit On

    Option Strict On

     

    'provider do banco de dados ACCESS

    Imports System.Data.OleDb

    Imports System.Data

     

    'crystal reports

    Imports CrystalDecisions.CrystalReports.Engine

    Imports CrystalDecisions.Shared

     

    'outros

    Imports System.Text 'StringBuilder

    Imports System.Configuration 'ConnectionStrings

    Imports System.IO 'Path.Combine

    Public Class wfmCrystalAccess

     

    Private Sub wfmCrystalSQLServer_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

     

    PreviewRelClientes(CarregarListaClientes())

     

    End Sub

     

     

    Private Sub PreviewRelClientes(ByVal oTable As DataTable)

    '

    'visualizar o relat¢rio "rptCustomer.rpt" utilizando a fun‡Æo CarregarListaClientes()

    '

    Try

    '1 passo: definindo o relat¢rio a ser visualizado (ReportPath)

    Dim crReportDocument As New rptCustomer

     

    '2 passo: definindo o DataSource do relat¢rio

    crReportDocument.SetDataSource(oTable)

     

    '3 passo: visualizando o relat¢rio...

    crPreview.DisplayGroupTree = False

    crPreview.ReportSource = crReportDocument

    Catch ex As Exception

    MsgBox(ex.Message)

    End Try

    End Sub

     

     

    Private Sub PreviewRelClientes()

    '

    'visualizar o relat¢rio "rptCustomer.rpt" utilizando o pr¢prio dataset "dsCustomer"

    '

    Try

    '1 passo: definindo o relat¢rio a ser visualizado (ReportPath)

    Dim crReportDocument As New rptCustomer

    '2 passo: definindo o DataSource do relat¢rio

    Dim oDA As New dsCustomerTableAdapters.CustomerTableAdapter

    Dim oTable As New dsCustomer.CustomerDataTable

    oDA.Fill(oTable)

    crReportDocument.SetDataSource(CType(oTable, DataTable))

    '3 passo: visualizando o relat¢rio...

    crPreview.DisplayGroupTree = False

    crPreview.ReportSource = crReportDocument

    Catch ex As Exception

    MsgBox(ex.Message)

     

    End Try

    End Sub

     

    Private Function CarregarListaClientes() As DataTable

    'definindo a string de conexÆo do banco de dados

    Dim strConexao As String = _

    ConfigurationManager.ConnectionStrings("MSAccess").ToString

    Dim oConn As New OleDbConnection(strConexao)

    Dim strSQL As New StringBuilder

    Dim oTable As New DataTable()

    Dim oCmd As OleDbCommand = Nothing

    Try

    'abrindo conexÆo com o banco de dados.

    oConn.Open()

    'definindo o SQL

    strSQL.Append(" Select CustomerID ")

    strSQL.Append(" ,CustomerName")

    strSQL.Append(" ,Phone")

    strSQL.Append(" ,EmailAddress")

    strSQL.Append(" ,AddressLine")

    strSQL.Append(" ,City")

    strSQL.Append(" ,StateProvinceName")

    strSQL.Append(" ,PostalCode")

    strSQL.Append(" ,CountryName")

    strSQL.Append(" ,LastUpdate ")

    strSQL.Append(" FROM Customer inner join Country ")

    strSQL.Append(" on Customer.CountryID = Country.CountryID ")

    strSQL.Append(" Order by CountryName, CustomerName ")

    'carregando os dados do banco de dados

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

    oDA.Fill(oTable)

    Catch ex As Exception

    MsgBox(ex.Message)

    Finally

    'liberando os objetos

    oConn.Dispose()

    oConn = Nothing

    End Try

    Return oTable

    End Function

    Private Function CarregarListaClientes(ByVal strCountryName As String) As DataTable

    'definindo a string de conexÆo do banco de dados

    Dim strConexao As String = _

    ConfigurationManager.ConnectionStrings("MSAccess").ToString

    Dim oConn As New OleDbConnection(strConexao)

    Dim strSQL As New StringBuilder

    Dim oTable As New DataTable()

    Dim oCmd As OleDbCommand = Nothing

    Try

    'abrindo conexÆo com o banco de dados.

    oConn.Open()

    'definindo o SQL

    strSQL.Append(" Select CustomerID ")

    strSQL.Append(" ,CustomerName")

    strSQL.Append(" ,Phone")

    strSQL.Append(" ,EmailAddress")

    strSQL.Append(" ,AddressLine")

    strSQL.Append(" ,City")

    strSQL.Append(" ,StateProvinceName")

    strSQL.Append(" ,PostalCode")

    strSQL.Append(" ,CountryName")

    strSQL.Append(" ,LastUpdate ")

    strSQL.Append(" FROM Customer inner join Country ")

    strSQL.Append(" on Customer.CountryID = Country.CountryID ")

    strSQL.Append(" Where CountryName = @CountryName ")

    strSQL.Append(" Order by CustomerName ")

    'definindo os parƒmetros do SqlCommand

    oCmd = New OleDbCommand(strSQL.ToString, oConn)

    oCmd.CommandType = CommandType.Text

    oCmd.Parameters.Add(New _

    OleDbParameter("@CountryName", SqlDbType.VarChar)).Value = strCountryName

    'carregando os dados do banco de dados

    Dim oDataReader As OleDbDataReader = _

    oCmd.ExecuteReader(CommandBehavior.CloseConnection)

    'carregar o DataTable com base no DataReader

    oTable.Load(oDataReader)

    Catch ex As Exception

    MsgBox(ex.Message)

    Finally

    'liberando os objetos

    oConn.Dispose()

    oConn = Nothing

    End Try

    Return oTable

    End Function

     

     

    Private Function ExportarDados() As Boolean

    '

    'exportar o relat¢rio para PDF sem print preview

    '

    '1 passo: carregar o relat¢rio

    Dim crReportDocument As New rptCustomer

    Try

    '2 passo: definindo o DataSource do relat¢rio

    crReportDocument.SetDataSource(CarregarListaClientes)

    'exportando o arquivo para pdf

    Dim crExportOptions As ExportOptions

    Dim crDiskFileDestinationOptions As DiskFileDestinationOptions

    crDiskFileDestinationOptions = New DiskFileDestinationOptions()

    crDiskFileDestinationOptions.DiskFileName = Path.Combine(My.Application.Info.DirectoryPath, "pdf_crystal.pdf")

    crExportOptions = crReportDocument.ExportOptions

    With crExportOptions

    .DestinationOptions = crDiskFileDestinationOptions

    .ExportDestinationType = ExportDestinationType.DiskFile

    .ExportFormatType = ExportFormatType.PortableDocFormat

    End With

    crReportDocument.Export()

    MsgBox(String.Concat("PDF gerado no diret¢rio: ", Path.Combine(My.Application.Info.DirectoryPath, "pdf_crystal.pdf")))

    Catch ex As Exception

    MsgBox(ex.Message)

    Finally

    crReportDocument.Dispose()

    End Try

    End Function

     

    End Class

     

     

    quinta-feira, 8 de janeiro de 2009 15:52
    Moderador

Todas as Respostas

  • André,

     

    A sua dúvida é bem comum nessa etapa de construção do relatório (seja com Crystal Reports ou ReportViewer).

     

    O que vc precisa fazer fazer é criar uma estrutura "XML" para fazer o "designer do relatório" e neste caso adicione um dataset ao projeto e adicionar um DataTable (ou um TableAdapter sem nenhum método) somente para criar o XML com os campos a serem visualizados no relatório. Ou seja, esse "DataSet" é arquivo XML que contem apenas a lista de campos a serem exibidos no relatório (sem dados ou conexão com o banco de dados).

     

    Depois de finalizar o designer do relatório ai sim vem a parte de definir o DataSource do relatório conforme apresentado nos 3 vídeos disponbilizados para a comunidade MSDN.

     

    Neste link eu ajudei a responder uma dúvida bem parecida com a sua, veja de ajuda:

    http://forums.microsoft.com/msdn-br/ShowPost.aspx?PostID=3256996&SiteID=21

     

     

    [ ]'s

     Laércio.


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

    terça-feira, 6 de janeiro de 2009 13:19
    Moderador
  •  

    Laércio,

     

    Entendi, vc está dizendo que o DataSet é apenas um modo de visualizar o relatório para sua criação, e o fato de eu efetuar a conexão com o banco não influência em nada, tudo bem, agora minha consulta é baseada em em um sql enorme com 1 parametro de entrada (Data), e não consigo colocá-lo no DataSet é necessário que seja o mesmo sql ou posso setar apenas os dados que eu quero do banco?.

    terça-feira, 6 de janeiro de 2009 13:29
  • André,

     

         Esse XML utilizado apenas para fazer o designer do relatório possui a lista de campos. Neste caso, você não precisa rodar o SQL para ter a lista de campos do relatório.

     

         Como Fazer:

     

         1 - Adicione um novo DataSet ao projeto .NET (Add New Item - DataSet )

         2 - Com o DataSet aberto, clique com o botão direito do mouse e selecione a opção Add - DataTable

         3 - Para alterar o nome do DataTable, selecione o objeto e tecle F4 (vai abrir a aba Properties e altere o valor do campo Name

         4 - Adicione os campos que fazem parte da sua consulta. Clique com o botão direito do mouse dentro do DataTable e selecione a opção Add - Column (informe as propriedades Name e DataType de acordo com os campos do banco de dados.

     

         Pronto! você já tem um DataSet (XML) com a lista de campos a serem visualizados no relatório. Agora é só fazer o designer do relatório com base nesse dataset.

     

         Dica importante:

     

        No terceiro vídeo que eu disponibilizei para a comunidade MSDN, eu tenho um exemplo onde eu mostro como criar o DataSet de várias formas (inclusive sem fazer nenhum tipo de conexão com o banco de dados).

     

        Criei um tópico fixo no fórum MSDN com algumas dicas  sobre a construção de relatórios com Crystal Reports e ReportView (incluindo 3 vídeos com vários exemplos de como construir relatórios com os componentes, licença, distribuição, service packs, etc.):

     

     

    http://forums.microsoft.com/MSDN-BR/ShowPost.aspx?PostID=3761576&SiteID=21

     


    [ ]'s

     Laércio.


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

     

     

    quinta-feira, 8 de janeiro de 2009 12:58
    Moderador
  •  

    Laércio,

     

    Ok, meu relatório está sendo gerado com sucesso, para isso fiz igual ao seu exemplo, utilizando SqlConnection, mas toda a conexão com o banco da minha aplicação é por OleDb.

    Dai vai mais uma pergunta:

    Tem como eu popular o DataTable do meu DataSet com IDataReader utilizando a conexão OleDb?.

    quinta-feira, 8 de janeiro de 2009 14:49
  • André,

     

        No terceiro vídeo que eu fiz sobre relatórios com Crystal Reports e ReportViewer, eu tenho exemplos com os bancos de dados Access, MySQL, Oracle, SQL Compact, etc.

     

         Ocorre que o arquivo com o código fonte disponibilizado no Media Center está com problema e o problema deve ser resolvido em breve.

     

         Para resolver o problema, em anexo, alguns exemplos com banco de dados MS Access e Crystal Reports.

     

    Code Snippet

    Option Explicit On

    Option Strict On

     

    'provider do banco de dados ACCESS

    Imports System.Data.OleDb

    Imports System.Data

     

    'crystal reports

    Imports CrystalDecisions.CrystalReports.Engine

    Imports CrystalDecisions.Shared

     

    'outros

    Imports System.Text 'StringBuilder

    Imports System.Configuration 'ConnectionStrings

    Imports System.IO 'Path.Combine

    Public Class wfmCrystalAccess

     

    Private Sub wfmCrystalSQLServer_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

     

    PreviewRelClientes(CarregarListaClientes())

     

    End Sub

     

     

    Private Sub PreviewRelClientes(ByVal oTable As DataTable)

    '

    'visualizar o relat¢rio "rptCustomer.rpt" utilizando a fun‡Æo CarregarListaClientes()

    '

    Try

    '1 passo: definindo o relat¢rio a ser visualizado (ReportPath)

    Dim crReportDocument As New rptCustomer

     

    '2 passo: definindo o DataSource do relat¢rio

    crReportDocument.SetDataSource(oTable)

     

    '3 passo: visualizando o relat¢rio...

    crPreview.DisplayGroupTree = False

    crPreview.ReportSource = crReportDocument

    Catch ex As Exception

    MsgBox(ex.Message)

    End Try

    End Sub

     

     

    Private Sub PreviewRelClientes()

    '

    'visualizar o relat¢rio "rptCustomer.rpt" utilizando o pr¢prio dataset "dsCustomer"

    '

    Try

    '1 passo: definindo o relat¢rio a ser visualizado (ReportPath)

    Dim crReportDocument As New rptCustomer

    '2 passo: definindo o DataSource do relat¢rio

    Dim oDA As New dsCustomerTableAdapters.CustomerTableAdapter

    Dim oTable As New dsCustomer.CustomerDataTable

    oDA.Fill(oTable)

    crReportDocument.SetDataSource(CType(oTable, DataTable))

    '3 passo: visualizando o relat¢rio...

    crPreview.DisplayGroupTree = False

    crPreview.ReportSource = crReportDocument

    Catch ex As Exception

    MsgBox(ex.Message)

     

    End Try

    End Sub

     

    Private Function CarregarListaClientes() As DataTable

    'definindo a string de conexÆo do banco de dados

    Dim strConexao As String = _

    ConfigurationManager.ConnectionStrings("MSAccess").ToString

    Dim oConn As New OleDbConnection(strConexao)

    Dim strSQL As New StringBuilder

    Dim oTable As New DataTable()

    Dim oCmd As OleDbCommand = Nothing

    Try

    'abrindo conexÆo com o banco de dados.

    oConn.Open()

    'definindo o SQL

    strSQL.Append(" Select CustomerID ")

    strSQL.Append(" ,CustomerName")

    strSQL.Append(" ,Phone")

    strSQL.Append(" ,EmailAddress")

    strSQL.Append(" ,AddressLine")

    strSQL.Append(" ,City")

    strSQL.Append(" ,StateProvinceName")

    strSQL.Append(" ,PostalCode")

    strSQL.Append(" ,CountryName")

    strSQL.Append(" ,LastUpdate ")

    strSQL.Append(" FROM Customer inner join Country ")

    strSQL.Append(" on Customer.CountryID = Country.CountryID ")

    strSQL.Append(" Order by CountryName, CustomerName ")

    'carregando os dados do banco de dados

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

    oDA.Fill(oTable)

    Catch ex As Exception

    MsgBox(ex.Message)

    Finally

    'liberando os objetos

    oConn.Dispose()

    oConn = Nothing

    End Try

    Return oTable

    End Function

    Private Function CarregarListaClientes(ByVal strCountryName As String) As DataTable

    'definindo a string de conexÆo do banco de dados

    Dim strConexao As String = _

    ConfigurationManager.ConnectionStrings("MSAccess").ToString

    Dim oConn As New OleDbConnection(strConexao)

    Dim strSQL As New StringBuilder

    Dim oTable As New DataTable()

    Dim oCmd As OleDbCommand = Nothing

    Try

    'abrindo conexÆo com o banco de dados.

    oConn.Open()

    'definindo o SQL

    strSQL.Append(" Select CustomerID ")

    strSQL.Append(" ,CustomerName")

    strSQL.Append(" ,Phone")

    strSQL.Append(" ,EmailAddress")

    strSQL.Append(" ,AddressLine")

    strSQL.Append(" ,City")

    strSQL.Append(" ,StateProvinceName")

    strSQL.Append(" ,PostalCode")

    strSQL.Append(" ,CountryName")

    strSQL.Append(" ,LastUpdate ")

    strSQL.Append(" FROM Customer inner join Country ")

    strSQL.Append(" on Customer.CountryID = Country.CountryID ")

    strSQL.Append(" Where CountryName = @CountryName ")

    strSQL.Append(" Order by CustomerName ")

    'definindo os parƒmetros do SqlCommand

    oCmd = New OleDbCommand(strSQL.ToString, oConn)

    oCmd.CommandType = CommandType.Text

    oCmd.Parameters.Add(New _

    OleDbParameter("@CountryName", SqlDbType.VarChar)).Value = strCountryName

    'carregando os dados do banco de dados

    Dim oDataReader As OleDbDataReader = _

    oCmd.ExecuteReader(CommandBehavior.CloseConnection)

    'carregar o DataTable com base no DataReader

    oTable.Load(oDataReader)

    Catch ex As Exception

    MsgBox(ex.Message)

    Finally

    'liberando os objetos

    oConn.Dispose()

    oConn = Nothing

    End Try

    Return oTable

    End Function

     

     

    Private Function ExportarDados() As Boolean

    '

    'exportar o relat¢rio para PDF sem print preview

    '

    '1 passo: carregar o relat¢rio

    Dim crReportDocument As New rptCustomer

    Try

    '2 passo: definindo o DataSource do relat¢rio

    crReportDocument.SetDataSource(CarregarListaClientes)

    'exportando o arquivo para pdf

    Dim crExportOptions As ExportOptions

    Dim crDiskFileDestinationOptions As DiskFileDestinationOptions

    crDiskFileDestinationOptions = New DiskFileDestinationOptions()

    crDiskFileDestinationOptions.DiskFileName = Path.Combine(My.Application.Info.DirectoryPath, "pdf_crystal.pdf")

    crExportOptions = crReportDocument.ExportOptions

    With crExportOptions

    .DestinationOptions = crDiskFileDestinationOptions

    .ExportDestinationType = ExportDestinationType.DiskFile

    .ExportFormatType = ExportFormatType.PortableDocFormat

    End With

    crReportDocument.Export()

    MsgBox(String.Concat("PDF gerado no diret¢rio: ", Path.Combine(My.Application.Info.DirectoryPath, "pdf_crystal.pdf")))

    Catch ex As Exception

    MsgBox(ex.Message)

    Finally

    crReportDocument.Dispose()

    End Try

    End Function

     

    End Class

     

     

    quinta-feira, 8 de janeiro de 2009 15:52
    Moderador