none
Report e Subreport com dataset tipado RRS feed

  • Pergunta

  • Srs. Estou fazendo um relatorio que contem subrelatorio, ambos com dataset tipado em Visual Basic e Windows Forms "Microsoft.Reporting.WinForms.ReportViewer". O grande problema que o subreport não é carregado "subreport could not be show". Baixei os videos do Laercio que esta de parabens pela qualidade, mas mesmo assim não consegui converter seu codigo para uma aplicação Windows forms. Agradeço as dicas e até mesmo sugestão de livros para este assunto

     

    Atenciosamente

    segunda-feira, 27 de outubro de 2008 23:04

Respostas

  • Ananias,

     

    Opa! Acho que encontrei o erro.

     

    Vc não está passando o datasource do relatório principal e nem do subreport. Nos vídeos eu mostro como trabalhar com sub-relatórios (tem um exemplo completo passo a passo)

     

    Code Snippet

    'Sub para preencher itens da proposta no subrelatorio

    Private Sub SubRelatorioitensproposta(ByVal sender As Object, ByVal e As SubreportProcessingEventArgs)

    Me.TB_Proposta_tempTableAdapter.Fill(Me.BD_Mala_DiretaDataSet.TB_Proposta_temp) ‘carrega normamente os dados no dataset mas não envia para subrelatotio  “subreport could  not be shown”

     End Sub

     

     

     

    Code Snippet

    'Sub para preencher itens da proposta no subrelatorio

    Private Sub SubRelatorioitensproposta(ByVal sender As Object, ByVal e As SubreportProcessingEventArgs)

    Me.TB_Proposta_tempTableAdapter.Fill(Me.BD_Mala_DiretaDataSet.TB_Proposta_temp) ‘carrega normamente os dados no dataset mas não envia para subrelatotio  “subreport could  not be shown”

     

    'informando os dados do sub-relatório

    e.DataSources.Add(New ReportDataSource("nome_do_datasource_do_subrelatorio", nome_do_datatable))

     

     End Sub

     

     

     

    [ ] 's

     

    Laércio.

    quarta-feira, 29 de outubro de 2008 12:44
    Moderador

Todas as Respostas

  • Olá Ananias,

     

    Primeiro gostaria de agradecer pelo feedback.

     

    Se possivel, deixe o seu feedback no fórum Webcasts MSDN (exclusivo para feeback)

    http://forums.microsoft.com/MSDN-BR/ShowForum.aspx?ForumID=1261&SiteID=21

     

    Agora vamos ao problema,

     

    Pode postar o código para dar uma olhada? Você está utilizando o Crystal Reports ou Reportviewer? Detalhe melhor o problema que eu ajudo a resolver.

     

    Valeu!

     

     

     

     

     

     

    terça-feira, 28 de outubro de 2008 14:21
    Moderador
  • Laercio boa noite,

     

    Estou utlizando o Reportviewer, estou trabalhando com dataset tipado o relatorio principal carrega normalmente mas o subreport apresenta a mensagem "subreport could  not be shown".   Abaixo o codigo, Laercio muito obrigado pelo empenho em ajudar toda comunidade do forum.

     

    'Botão para visualisar relatorio

    Private Sub ViewButtonClick_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ViewButtonClick.Click

            Prepara_propostas()

            Me.TB_Consultas_Imp_PropostaTableAdapter.Fill(Me.BD_Mala_DiretaDataSet.TB_Consultas_Imp_Proposta)  ' Dataset tipado carrega normamente os dados da consulta no relatorio principal

    Me.Rptviewe.SetDisplayMode(Microsoft.Reporting.WinForms.DisplayMode.PrintLayout)

     AddHandler Rptviewe.LocalReport.SubreportProcessing, AddressOf SubRelatorioitensproposta

    Me.Rptviewe.RefreshReport()

    End Sub

     

    'Sub para preencher itens da proposta no subrelatorio

    Private Sub SubRelatorioitensproposta(ByVal sender As Object, ByVal e As SubreportProcessingEventArgs)

    Me.TB_Proposta_tempTableAdapter.Fill(Me.BD_Mala_DiretaDataSet.TB_Proposta_temp) ‘carrega normamente os dados no dataset mas não envia para subrelatotio  “subreport could  not be shown”

     End Sub

     

    'Sub com procedure para atualizar as tabelas de consultas/itens da proposta          

    'Esta sub esta OK, atualiza as tabelas consultas e itens da proposta  no banco de dados de acordo com  a seleção do usuario

    Private Sub Prepara_propostas()

            Dim strSQL As New StringBuilder

            Dim oCmd As SqlCommand = Nothing

            conn.Open()

            strSQL.Append("Sel_Propostas_Imp")

            oCmd = New SqlCommand(strSQL.ToString, conn)

            oCmd.CommandText = strSQL.ToString

            oCmd.CommandType = CommandType.StoredProcedure

            If ChkCliente.Checked = True Then

                If TxtRazao.Text <> "" Then

                    oCmd.Parameters.Add(New SqlParameter("@Cliente", SqlDbType.VarChar)).Value = TxtRazao.Text

                Else

                    oCmd.Parameters.Add(New SqlParameter("@Cliente", SqlDbType.VarChar)).Value = DBNull.Value

                End If

            Else

                oCmd.Parameters.Add(New SqlParameter("@Cliente", SqlDbType.VarChar)).Value = DBNull.Value

            End If

            If ChkModEquip.Checked = True Then

                oCmd.Parameters.Add(New SqlParameter("@Modelo_Equipa", SqlDbType.VarChar)).Value = CboModEquip.Text

            Else

                oCmd.Parameters.Add(New SqlParameter("@Modelo_Equipa", SqlDbType.VarChar)).Value = DBNull.Value

            End If

            If ChkMotivoFina.Checked = True Then

                oCmd.Parameters.Add(New SqlParameter("@tipo_Def_Fina", SqlDbType.VarChar)).Value = CboMotivoFina.Text

            Else

                oCmd.Parameters.Add(New SqlParameter("@tipo_Def_Fina", SqlDbType.VarChar)).Value = DBNull.Value

            End If

            If ChkTpFina.Checked = True Then

                oCmd.Parameters.Add(New SqlParameter("@Tipo_Fina", SqlDbType.VarChar)).Value = CboTipoFina.Text

            Else

                oCmd.Parameters.Add(New SqlParameter("@Tipo_Fina", SqlDbType.VarChar)).Value = DBNull.Value

            End If

            If ChkDataCadClie.Checked = True Then

                oCmd.Parameters.Add(New SqlParameter("@Data_Ini", SqlDbType.DateTime)).Value = dtpDataInicial.Value.Date

                oCmd.Parameters.Add(New SqlParameter("@Data_Fina", SqlDbType.DateTime)).Value = dtpDataFinal.Value.Date

            Else

                oCmd.Parameters.Add(New SqlParameter("@Data_Ini", SqlDbType.DateTime)).Value = DBNull.Value

                oCmd.Parameters.Add(New SqlParameter("@Data_Fina", SqlDbType.DateTime)).Value = DBNull.Value

            End If

            oCmd.ExecuteNonQuery()

            conn = Nothing

        End Sub

     

    No relatório principal onde chamo o subreport1  -> Parameter name = ID_Consulta  e no Parameter  value = =Fields!ID_Consulta.Value

     

    No subrelatorio adicionei um parâmetro =ID_Consulta e na tabela que recebe os dados do subrelatorio fiz um filtro -> expression  =Fields!ID_Consulta.Value  operator =  value =Parameters!ID_Consulta.Value

     

    terça-feira, 28 de outubro de 2008 22:14
  • Ananias,

     

    Opa! Acho que encontrei o erro.

     

    Vc não está passando o datasource do relatório principal e nem do subreport. Nos vídeos eu mostro como trabalhar com sub-relatórios (tem um exemplo completo passo a passo)

     

    Code Snippet

    'Sub para preencher itens da proposta no subrelatorio

    Private Sub SubRelatorioitensproposta(ByVal sender As Object, ByVal e As SubreportProcessingEventArgs)

    Me.TB_Proposta_tempTableAdapter.Fill(Me.BD_Mala_DiretaDataSet.TB_Proposta_temp) ‘carrega normamente os dados no dataset mas não envia para subrelatotio  “subreport could  not be shown”

     End Sub

     

     

     

    Code Snippet

    'Sub para preencher itens da proposta no subrelatorio

    Private Sub SubRelatorioitensproposta(ByVal sender As Object, ByVal e As SubreportProcessingEventArgs)

    Me.TB_Proposta_tempTableAdapter.Fill(Me.BD_Mala_DiretaDataSet.TB_Proposta_temp) ‘carrega normamente os dados no dataset mas não envia para subrelatotio  “subreport could  not be shown”

     

    'informando os dados do sub-relatório

    e.DataSources.Add(New ReportDataSource("nome_do_datasource_do_subrelatorio", nome_do_datatable))

     

     End Sub

     

     

     

    [ ] 's

     

    Laércio.

    quarta-feira, 29 de outubro de 2008 12:44
    Moderador
  • Laercio boa noite,

     

    Voce estava certo, eu não estava passando o datasource do relatório principal e nem do subreport. Abaixo codigo correto onde alimento o relatorio principal e mais 2 subreports.

     

    Private Sub ViewButtonClick_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ViewButtonClick.Click

    Atualiza_tabelas() 'atualiza as tabelas baseado na opcão do usuario

    ListaConsultas()

    AddHandler Rptviewe.LocalReport.SubreportProcessing, AddressOf SubRelatorioPropostas

    Rptviewe.RefreshReport()

    End Sub

     

    Private Sub Atualiza_tabelas()

    Dim strSQL As New StringBuilder

    Dim oCmd As SqlCommand '= Nothing

    ''Atualiza banco de dados para relatorio

    If conn.State = ConnectionState.Closed Then

    conn.Open()

    End If

    'conn.Open()

    strSQL.Append("Sel_Propostas_Imp")

    oCmd = New SqlCommand(strSQL.ToString, conn)

    oCmd.CommandText = strSQL.ToString

    oCmd.CommandType = CommandType.StoredProcedure

    If ChkCliente.Checked = True Then

    If TxtRazao.Text <> "" Then

    oCmd.Parameters.Add(New SqlParameter("@Cliente", SqlDbType.VarChar)).Value = TxtRazao.Text

    Else

    oCmd.Parameters.Add(New SqlParameter("@Cliente", SqlDbType.VarChar)).Value = DBNull.Value

    End If

    Else

    oCmd.Parameters.Add(New SqlParameter("@Cliente", SqlDbType.VarChar)).Value = DBNull.Value

    End If

    If ChkModEquip.Checked = True Then

    oCmd.Parameters.Add(New SqlParameter("@Modelo_Equipa", SqlDbType.VarChar)).Value = CboModEquip.Text

    Else

    oCmd.Parameters.Add(New SqlParameter("@Modelo_Equipa", SqlDbType.VarChar)).Value = DBNull.Value

    End If

    If ChkMotivoFina.Checked = True Then

    oCmd.Parameters.Add(New SqlParameter("@tipo_Def_Fina", SqlDbType.VarChar)).Value = CboMotivoFina.Text

    Else

    oCmd.Parameters.Add(New SqlParameter("@tipo_Def_Fina", SqlDbType.VarChar)).Value = DBNull.Value

    End If

    If ChkTpFina.Checked = True Then

    oCmd.Parameters.Add(New SqlParameter("@Tipo_Fina", SqlDbType.VarChar)).Value = CboTipoFina.Text

    Else

    oCmd.Parameters.Add(New SqlParameter("@Tipo_Fina", SqlDbType.VarChar)).Value = DBNull.Value

    End If

    If ChkDataCadClie.Checked = True Then

    oCmd.Parameters.Add(New SqlParameter("@Data_Ini", SqlDbType.DateTime)).Value = dtpDataInicial.Value.Date

    oCmd.Parameters.Add(New SqlParameter("@Data_Fina", SqlDbType.DateTime)).Value = dtpDataFinal.Value.Date

    Else

    oCmd.Parameters.Add(New SqlParameter("@Data_Ini", SqlDbType.DateTime)).Value = DBNull.Value

    oCmd.Parameters.Add(New SqlParameter("@Data_Fina", SqlDbType.DateTime)).Value = DBNull.Value

    End If

    oCmd.ExecuteNonQuery()

    'conn.Close()

    ' conn = Nothing

    End Sub

     

    Private Sub ListaConsultas()

    Dim strSQL As New StringBuilder

    Dim oCmd As SqlCommand = Nothing

    Dim oTable As New DataTable

    'conn.Open()

    Try

    strSQL.Append(" SELECT ")

    strSQL.Append(" ID_Consulta, Data_Consulta, Observacao, Contato, Data_Efetiva_Proposta, ")

    strSQL.Append(" Proposta_Final_Nr, Tipo_Equipo, Def_Consulta, Razao_Social")

    strSQL.Append(" FROM TB_Consultas_Temp ")

    strSQL.Append(" order by Razao_Social")

    oCmd = New SqlCommand(strSQL.ToString, conn)

    oCmd.CommandText = strSQL.ToString

    oCmd.CommandType = CommandType.Text

    Dim oDataReader As SqlDataReader = oCmd.ExecuteReader(CommandBehavior.CloseConnection)

    oTable.Load(oDataReader)

    Dim myReportDataSource As New Microsoft.Reporting.WinForms.ReportDataSource("TB_Consultas_Propostas", oTable)

    Rptviewe.LocalReport.DataSources.Clear()

    Rptviewe.LocalReport.DataSources.Add(myReportDataSource)

    Catch ex As Exception

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

    Finally

    'liberando os objetos

    oCmd.Dispose()

    oTable.Dispose()

    oCmd = Nothing

    oTable = Nothing

    End Try

    End Sub

     

    Private Sub SubRelatorioPropostas(ByVal sender As Object, ByVal e As SubreportProcessingEventArgs)

    Static Dim DtPropostas As DataTable

    'If (DtPropostas Is Nothing) Then

    DtPropostas = Carregarpropostas()

    'End If

    Static Dim DtFolowUps As DataTable

    'If (DtFolowUps Is Nothing) Then

    DtFolowUps = CarregarFolowUps()

    'End If

    'informando os dados do sub-relatório "Dados das propostas"e  sub-relatório Dados flowup das propostas

    e.DataSources.Add(New ReportDataSource("TB_Proposta", DtPropostas))

    e.DataSources.Add(New ReportDataSource("TB_FolowUp", DtFolowUps))

    End Sub

     

    Laercio muito obrigado pelas dicas, e quando lançar alguma novidade avise.

     

    Abraços

    segunda-feira, 1 de dezembro de 2008 22:38
  • Bom galera, estou com problemas ao traduzir o start do evento do subrelatório em C#.

    Não consigo chamar o evento
    AddHandler Rptviewe.LocalReport.SubreportProcessing, AddressOf SubRelatorioPropostas
    para c#.
     
           
    Code Snippet
    private void reportViewer1_Load(object sender, EventArgs e)


            {

                this.reportViewer1.RefreshReport();


    // Setando o modo print layout        
                this.reportViewer1.SetDisplayMode(DisplayMode.PrintLayout);
                this.reportViewer1.ZoomMode = ZoomMode.Percent;
                this.reportViewer1.ZoomPercent = 100;

                DataSet data_set = new DataSet();
                DataTable tb_avaliacao = new DataTable();

    DataTableReader avaliacao = data_set.CreateDataReader((class_generica.dt_table(Ficha.Query_avaliacao)));
               // carrega a tabela com as avaliações no DataReader
                tb_avaliacao(
    avaliacao);

                // Adicionou os dados do dataset Relatório
                ReportDataSource dt_report = new ReportDataSource("dtFichaAnalit", tb_avaliacao);
                // inseri o report data source no relatório
                this.reportViewer1.LocalReport.DataSources.Add(dt_report);
            }

    // evento para startar com o processo do subrelatório
    private void SubRelatorio(object sender, SubreportProcessingEventArgs e)
    {
    DataSet data_set = new DataSet();
    DataTable tb_topicos = new DataTable();
    DataTableReader reader_topicos_ficha = data_set.CreateDataReader((class_generica.dt_table("Select_topicos_ficha")));
    tb_topicos.Load(reader_topicos_ficha);

    int cont = 0;
    if (cont == 0)
    {
    e.DataSources.Add(new ReportDataSource("dtTopicos", tb_topicos));
    cont += 1;
    }
    }



          
    quinta-feira, 8 de janeiro de 2009 12:35