Usuário com melhor resposta
Alimentar Arquivo rpt

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.
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 SnippetOption
Explicit OnOption
Strict On'provider do banco de dados ACCESS
Imports
System.Data.OleDbImports
System.Data'crystal reports
Imports
CrystalDecisions.CrystalReports.EngineImports
CrystalDecisions.Shared'outros
Imports
System.Text 'StringBuilderImports
System.Configuration 'ConnectionStringsImports
System.IO 'Path.CombinePublic
Class wfmCrystalAccessPrivate 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 =
FalsecrPreview.ReportSource = crReportDocument
Catch ex As ExceptionMsgBox(ex.Message)
End Try End SuboDA.Fill(oTable)
crReportDocument.SetDataSource(
CType(oTable, DataTable)) '3 passo: visualizando o relat¢rio...crPreview.DisplayGroupTree =
FalsecrPreview.ReportSource = crReportDocument
Catch ex As ExceptionMsgBox(ex.Message)
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 SQLstrSQL.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 ExceptionMsgBox(ex.Message)
Finally 'liberando os objetosoConn.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 SQLstrSQL.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 SqlCommandoCmd =
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 DataReaderoTable.Load(oDataReader)
Catch ex As ExceptionMsgBox(ex.Message)
Finally 'liberando os objetosoConn.Dispose()
oConn =
Nothing End Try Return oTable End FunctioncrReportDocument.SetDataSource(CarregarListaClientes)
'exportando o arquivo para pdf Dim crExportOptions As ExportOptions Dim crDiskFileDestinationOptions As DiskFileDestinationOptionscrDiskFileDestinationOptions =
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 WithcrReportDocument.Export()
MsgBox(
String.Concat("PDF gerado no diret¢rio: ", Path.Combine(My.Application.Info.DirectoryPath, "pdf_crystal.pdf"))) Catch ex As ExceptionMsgBox(ex.Message)
FinallycrReportDocument.Dispose()
End Try End FunctionEnd Class
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. -
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?.
-
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
[ ]'sLaércio.
Ajude a melhorar o nosso Fórum!
Não esqueça de marca a mensagem como "útil", caso tenha ajudado. -
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?.
-
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 SnippetOption
Explicit OnOption
Strict On'provider do banco de dados ACCESS
Imports
System.Data.OleDbImports
System.Data'crystal reports
Imports
CrystalDecisions.CrystalReports.EngineImports
CrystalDecisions.Shared'outros
Imports
System.Text 'StringBuilderImports
System.Configuration 'ConnectionStringsImports
System.IO 'Path.CombinePublic
Class wfmCrystalAccessPrivate 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 =
FalsecrPreview.ReportSource = crReportDocument
Catch ex As ExceptionMsgBox(ex.Message)
End Try End SuboDA.Fill(oTable)
crReportDocument.SetDataSource(
CType(oTable, DataTable)) '3 passo: visualizando o relat¢rio...crPreview.DisplayGroupTree =
FalsecrPreview.ReportSource = crReportDocument
Catch ex As ExceptionMsgBox(ex.Message)
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 SQLstrSQL.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 ExceptionMsgBox(ex.Message)
Finally 'liberando os objetosoConn.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 SQLstrSQL.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 SqlCommandoCmd =
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 DataReaderoTable.Load(oDataReader)
Catch ex As ExceptionMsgBox(ex.Message)
Finally 'liberando os objetosoConn.Dispose()
oConn =
Nothing End Try Return oTable End FunctioncrReportDocument.SetDataSource(CarregarListaClientes)
'exportando o arquivo para pdf Dim crExportOptions As ExportOptions Dim crDiskFileDestinationOptions As DiskFileDestinationOptionscrDiskFileDestinationOptions =
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 WithcrReportDocument.Export()
MsgBox(
String.Concat("PDF gerado no diret¢rio: ", Path.Combine(My.Application.Info.DirectoryPath, "pdf_crystal.pdf"))) Catch ex As ExceptionMsgBox(ex.Message)
FinallycrReportDocument.Dispose()
End Try End FunctionEnd Class