• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

PauloR

Microsoft Reports | Problemas com SubReport

31 mensagens neste tópico

Precisava da vossa ajuda / dicas para o seguinte:

Necessito de fazer uma serie de listagens.

A BD que uso é o Access, mas não tenho definido nenhum dataset no projecto pois faço a ligação e carrego

os dados por código.

Outra situação é que tanto o nome da BD de dados bem como a sua localização são variaveis mas não é

problema pois carrego esta informação quando o programa arranca.

A minha questão é os Reports (rdlc) que vem com o VS 2008 funcionam bem?

Existem alguns exemplos de reports sem datasets?

O que necessitava era quando um utilizador carrega-se num botão o programa criava a instrucção SQL

e chamava o report com esses parâmetros.

É possivel?

Já procurei em diversos sitios na NET mas não consegui nada.  :-[

Obrigado

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Os Microsoft Reporting Services (*.rdls) funcionam muito bem e alias só uso eles actualmente. Na minha opinião são mais rápidos e fáceis de utilizar do que os Crystal Reports.

Já à questão que colocas não sei se é possivel, e até porque se desse para o fazer não era nada prático. Os datasets servem para colocar os campos no relatório e depois, através do código, define-se a datasource. É muito mais fácil assim.

Podes também passar parametros e colocar no relatório muito facilmente.

Podes ver alguns exemplos e mais detalhes nestes sites.

http://www.gotreportviewer.com/

http://msdn.microsoft.com/en-us/library/ms251712(VS.80).aspx

http://www.neodynamic.com/ND/FaqsTipsTricks.aspx?tabid=66&prodid=7&sid=30

Se tiveres dúvidas diz que eu estou farto de os usar :P

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Os Microsoft Reporting Services (*.rdls) funcionam muito bem e alias só uso eles actualmente. Na minha opinião são mais rápidos e fáceis de utilizar do que os Crystal Reports.

Já à questão que colocas não sei se é possivel, e até porque se desse para o fazer não era nada prático. Os datasets servem para colocar os campos no relatório e depois, através do código, define-se a datasource. É muito mais fácil assim.

Podes também passar parametros e colocar no relatório muito facilmente.

Podes ver alguns exemplos e mais detalhes nestes sites.

http://www.gotreportviewer.com/

http://msdn.microsoft.com/en-us/library/ms251712(VS.80).aspx

http://www.neodynamic.com/ND/FaqsTipsTricks.aspx?tabid=66&prodid=7&sid=30

Se tiveres dúvidas diz que eu estou farto de os usar :P

Em primeiro lugar obrigado pela rápida resposta  :P

Em relação aos dataset com faço em virtude de usar nome de DBs e localizações variaveis?

Vou dar uma leitura aos links.

Obrigado,

cumpts

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Isso não interessa ... depois no código vais preencher uma dataset que terá a indicação  para a localização da base de dados.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Isso não interessa ... depois no código vais preencher uma dataset que terá a indicação  para a localização da base de dados.

Ok  :P

Vou fazer uns testes.

Cumpts

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Para começar fiz uma listagem simples e sem parametros, mostra todos os registos usando um query da BD.

- Criei o report.rdlc

- Criei um form e adicionei o Report Viewer

Agora como e onde altero a "Connection String" por codigo  :-[  :wallbash:

Obrigado

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Queres um exemplo, é isso ? :thumbsup: Deixa-me lá abrir um projecto

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Bem, tens aqui um exemplo que está mais ou menos modificado. Precisas de alterar para Access!

- Crias a dataset com a informação que precisas (neste caso era a tabela myTable)

- Colocas um reportviewer no form

- Utilizas o seguinte código (depois de adaptares)

        Try

            ReportViewer1.LocalReport.ReportPath = reportPath & "\Report1.rdlc"

            ' Preenche a listagem do relatório

            Using da As New SqlDataAdapter("SELECT * FROM myTable WHERE ID=?", connString)

                With da.SelectCommand.Parameters

                    .Add("@id", SqlDbType.Int).Value = 123

                End With

                Using ds As New DataSet

                    da.Fill(ds)

                    ReportViewer1.LocalReport.DataSources.Add(New ReportDataSource("Nome Do DataSet", ds.Tables(0)))

                End Using

            End Using

            ' Um parametro definido no report

            Dim parameters(0) As ReportParameter

            parameters(0) = New ReportParameter("ID", 123)

            ReportViewer1.LocalReport.SetParameters(parameters)

            With ReportViewer1

                .SetDisplayMode(DisplayMode.PrintLayout)

                .ZoomMode = ZoomMode.Percent

                .ZoomPercent = 80

            End With

        Catch ex As Exception

            MessageBox.Show(ex.Message, My.Application.Info.Title, MessageBoxButtons.OK, MessageBoxIcon.Error)

        End Try

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Depois de alguns testes:

O código disponibilizado pelo jpaulino e adaptado para o MSAccess aparentemente funciona pois não dá qualquer erro durante a execução mas ... quando o reportviewer abre aparece a mensagem de cancelado e apenas mostra os títulos, header e o valor do parâmetro

rpt1.png

rpt2.png

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Aqui está

       Dim strSQL As String = _
            " SELECT LBK_Record, LBK_nome1, LBK_nome2, LBK_Nome3, " & _
            " FROM qryLBSimples " & _
            " WHERE LBK_Record = ?"

        Try

            'ReportViewer1.LocalReport.ReportPath = "Report1.rdlc"

            'Preenche a listagem do relatório
            Using da As New OleDbDataAdapter(strSQL, CnnString)
                With da.SelectCommand.Parameters
                    .Add("@RecID", OleDbType.Integer).Value = 25
                End With

                Using ds As New DataSet
                    da.Fill(ds)
                    ReportViewer1.LocalReport.DataSources.Add(New ReportDataSource("LBKDataSet", ds.Tables(0))) 
                End Using

            End Using

            ' Um parametro definido no report
            Dim parameters(0) As ReportParameter
            parameters(0) = New ReportParameter("RecID", 25)
            ReportViewer1.LocalReport.SetParameters(parameters)

            With ReportViewer1
                .SetDisplayMode(DisplayMode.PrintLayout)
                .ZoomMode = ZoomMode.Percent
                .ZoomPercent = 80
            End With

        Catch ex As Exception
            MessageBox.Show(ex.Message, My.Application.Info.Title, MessageBoxButtons.OK, MessageBoxIcon.Error)
        End Try

        Me.ReportViewer1.RefreshReport()

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Parece estar correcto.

E tens estes campos no dataset que criaste LBKDataSet e está definido correctamente na datasource do report ?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Parece estar correcto.

E tens estes campos no dataset que criaste LBKDataSet e está definido correctamente na datasource do report ?

Sim,

Este é o meu problema e estou farto de dar voltas e voltas e não chego lá.

Acho que vou eliminar o dataset, report, form e código e fazer novamente com calma.

Pode estar "algo" a baralhar isto  :P

Obrigado

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

See quiseres fazer um exemplo simples e mostrar (upload) posso dar uma olhada!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

eu para abrir os meus reports mando por url os parametros e ja ta...n tenho de mexer mto do lado do codigo

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

eu para abrir os meus reports mando por url os parametros e ja ta...n tenho de mexer mto do lado do codigo

Mas é uma aplicação windows :P

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

See quiseres fazer um exemplo simples e mostrar (upload) posso dar uma olhada!

Já eliminei  :rant_01:

Amanhã faço novamente com calma e se não der faço um upload para veres ok?

Obrigado

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

See quiseres fazer um exemplo simples e mostrar (upload) posso dar uma olhada!

Não funciona  :wallbash:

Apenas consegui que funcionasse usando o wizard mas não consigo fazer Sub-Reports

O link para o project é: PrintDB

O teu código está em "Comment".

Caso tenhas oportunidade agradecia que desses uma vista de olhos.

Obrigado

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Acho que 80% do problema está resolvido.

Trata-se de um Report + SubReport.

Neste momento e com o código, a seguir,  consigo ter todos os dados principais mas apenas consigo imprimir os cabeçalhos do SubReport e o valor do parâmetro.

Option Strict On
Option Explicit On

Imports System
Imports Microsoft.Reporting.WinForms

Public Class Form2

    Dim DocID As Integer = 371

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

        Me.InvoiceHeaderTableAdapter.Fill(Me.DBDataSet.IHeader, DocID)

        Dim instance As LocalReport = Me.ReportViewer1.LocalReport

        AddHandler ReportViewer1.LocalReport.SubreportProcessing, AddressOf Me.SetSubDataSource

        Me.ReportViewer1.RefreshReport()

    End Sub

    Public Sub SetSubDataSource(ByVal sender As Object, ByVal e As SubreportProcessingEventArgs)

        e.DataSources.Add(New ReportDataSource("DBDataSet_IDetails", Me.DBDataSet.IHeader))

    End Sub

End Class

O SubReport tem os parâmetros definidos correctamente pois no SubReport aparece o valor correcto do parametro enviado do Report principal.

Deixo aqui algumas imagens

rsr001.png

rsr002.png

rsr003.png

Report final:

rsr004.png

Obrigado

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ninguém tem umas ideias para resolver este problema???  :mad:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Bem, eu faço de maneira diferente de como tu fazer. Podes dizer que é mais complicada mas dá-me mais versatilidade e menos dores de cabeça ... pelo menos até à data :biggrin:

Criei um relatório novo e limpei algumas coisas que depois só precisas de adaptar para o teu original. Como já andaste à porrada com isto aqui fica!

Como não é algo muito usado e um pouco explorado fica também aqui um pouco de código e o exemplo (com base no teu)

    Private CnnString As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\PrintDB.mdb;"


    Private Sub frmViewRpt3_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim DOCID As Integer = 371

        Try

            ' Define um evento quando o subreport estiver a ser carregado
            AddHandler ReportViewer1.LocalReport.SubreportProcessing, AddressOf SubreportProcessingEvent

            ' Define a datasource do relatório
            Using da As New OleDbDataAdapter("SELECT * FROM DocHeader WHERE Doc_ID=?", CnnString)
                da.SelectCommand.Parameters.Add("@Doc_ID", OleDbType.Integer).Value = DOCID
                Using ds As New DataSet("PrintDBDataSet")
                    da.Fill(ds, "DocHeader")
                    ReportViewer1.LocalReport.DataSources.Add(New ReportDataSource("PrintDBDataSet_DocHeader", ds.Tables("DocHeader")))
                End Using
            End Using

            ' Definições do relatório
            With ReportViewer1
                .SetDisplayMode(DisplayMode.PrintLayout)
                .ZoomMode = ZoomMode.Percent
                .ZoomPercent = 80
            End With

            Me.ReportViewer1.RefreshReport()

        Catch ex As Exception
            MessageBox.Show(ex.Message, My.Application.Info.Title, MessageBoxButtons.OK, MessageBoxIcon.Error)
        End Try

    End Sub

Depois quando o subreport está a ser carregado:

    ' Quando o relatório estiver a ser processado/carregado
    Sub SubreportProcessingEvent(ByVal sender As Object, ByVal e As SubreportProcessingEventArgs)

        Try

            Using da As New OleDbDataAdapter("SELECT * FROM DocDetails", CnnString)

                Using ds As New DataSet("PrintDBDataSet")
                    da.Fill(ds, "DocDetails")
                    e.DataSources.Add(New ReportDataSource("PrintDBDataSet_DocDetails", ds.Tables("DocDetails")))
                End Using
            End Using

        Catch ex As Exception
            MessageBox.Show(ex.Message, My.Application.Info.Title, MessageBoxButtons.OK, MessageBoxIcon.Error)
        End Try

    End Sub

Acho que em breve vou colocar um artigo no meu blog sobre isto com um passo a passo  :hmm:

Espero que ajude!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora