none
Crystal Reports - C#-SubReports RRS feed

  • Pergunta

  • Galera bom dia,

    estou fazendo um relatorio no Visual Studio C# e utilizando Crystal Report.

    Essse relatorio é o seguinte é mostrado o cliente e suas compras.

     

    Então coloquei no Details, os dados do Cliente como Nome, Data da Venda e no mesma sessão coloquei um subreports

    e nele os dados dos itens da venda.

     

    cliquei em CHANGE SUBREPORTS LINK e fiz o relacionamento lá.

    no programa no evento do botão imprimir coloquei o seguinte codigo:

     

    // ... instanciar o relatório...

    crRelacaoVenda relatorio = new crRelacaoVenda();

     

    relatorio.SetDataSource(this.dsRelacaoVendas.Tables["RelacaoVenda"]);

    relatorio.Subreports["crRelRelacaoItensVenda"].SetDataSource(this.dsRelacaoItensVenda.Tables["RelacaoItensVenda"]);

     

    So que o relatório traz a primeira venda e seus itens, mas no segundo registro somente tras a venda e não aparece os itens. Aí fecho o relatorio e se eu seleciono a segunda venda os itens da primeira some??

     

    Alguem sabe alguma solução aí?

     

    Por favor me ajudem!

     

     

    Wellington

    segunda-feira, 14 de abril de 2008 12:25

Respostas

  • Wellington,

     

    Primeiro passo: Valide o relatório entre o relatório principal e o sub-relatório:

    Clique com o botão da direira no sub-relatório e selecione Edit SubReport

    No SubReport selecione: CrystalReports - Report - Select Expert e clique no botão show formula e veja se existe o relacionamento.

     

    exemplo:

    Code Snippet
    {ProductListPriceHistory.ProductID} = {?Pm-Product.ProductID}

     

     

    um exemplo em C#

     

    Code Snippet

    //referências do banco de dados

    using System.Data.SqlClient;

    using System.Data;

     

    //referências do crystal reports

    using CrystalDecisions.CrystalReports.Engine;

    using CrystalDecisions.Shared;

     

    //referência ConnectionStrings web.config

    using System.Web.Configuration.WebConfigurationManager;

     

     

     

    Code Snippet

     

    private void PrecoProdutos()

    {

    ReportDocument crReportDocument = new ReportDocument();

    ReportDocument crReportSubDocument = new ReportDocument();

    string strConexao = ConnectionStrings("AWorks").ConnectionString();

    SqlConnection oConn = new SqlConnection();

    StringBuilder strSQL = new StringBuilder();

    DataSet oDataset = new DataSet();

    try {

    //1 passo: carregar o relatório

    string strPathreport = Server.MapPath("~\\CrystalReports\\rptPrecoProdutos.rpt");

    crReportDocument.Load(strPathreport);

    //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; ");

    strSQL.Append(" SELECT ");

    strSQL.Append(" ProductID, ");

    strSQL.Append(" StartDate, ");

    strSQL.Append(" EndDate, ");

    strSQL.Append(" ListPrice");

    strSQL.Append(" FROM Production.ProductListPriceHistory");

    SqlDataAdapter oDA = new SqlDataAdapter(strSQL.ToString, oConn);

    oDA.Fill(oDataset);

    //definindo o DataSource do relatório

    crReportSubDocument = crReportDocument.OpenSubreport("rptPrecoProdutoHistorico.rpt");

    crReportDocument.Database.Tables(0).SetDataSource(oDataset.Tables(0));

    //dados do sub-relatório

    crReportSubDocument.Database.Tables(0).SetDataSource(oDataset.Tables(1));

    //visualizando o relatório

    crPrintPreview.DisplayGroupTree = false;

    crPrintPreview.HasCrystalLogo = false;

    crPrintPreview.ReportSource = crReportDocument;

    }

    catch (Exception ex) {

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

    }

    finally {

    //fechando a conexão com o banco de dados

    oConn.Close();

    //liberando os objetos

    oConn.Dispose();

    oDataset.Dispose();

    oConn = null;

    oDataset = null;

    }

    }

     

     

     

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

     

    No dia 17/04/2008 vou fazer um super webcast sobre Crystal Reports e ReportViewer !
    https://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032370740&culture=pt-BR

    segunda-feira, 14 de abril de 2008 13:15
    Moderador

Todas as Respostas

  • Wellington,

     

    Primeiro passo: Valide o relatório entre o relatório principal e o sub-relatório:

    Clique com o botão da direira no sub-relatório e selecione Edit SubReport

    No SubReport selecione: CrystalReports - Report - Select Expert e clique no botão show formula e veja se existe o relacionamento.

     

    exemplo:

    Code Snippet
    {ProductListPriceHistory.ProductID} = {?Pm-Product.ProductID}

     

     

    um exemplo em C#

     

    Code Snippet

    //referências do banco de dados

    using System.Data.SqlClient;

    using System.Data;

     

    //referências do crystal reports

    using CrystalDecisions.CrystalReports.Engine;

    using CrystalDecisions.Shared;

     

    //referência ConnectionStrings web.config

    using System.Web.Configuration.WebConfigurationManager;

     

     

     

    Code Snippet

     

    private void PrecoProdutos()

    {

    ReportDocument crReportDocument = new ReportDocument();

    ReportDocument crReportSubDocument = new ReportDocument();

    string strConexao = ConnectionStrings("AWorks").ConnectionString();

    SqlConnection oConn = new SqlConnection();

    StringBuilder strSQL = new StringBuilder();

    DataSet oDataset = new DataSet();

    try {

    //1 passo: carregar o relatório

    string strPathreport = Server.MapPath("~\\CrystalReports\\rptPrecoProdutos.rpt");

    crReportDocument.Load(strPathreport);

    //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; ");

    strSQL.Append(" SELECT ");

    strSQL.Append(" ProductID, ");

    strSQL.Append(" StartDate, ");

    strSQL.Append(" EndDate, ");

    strSQL.Append(" ListPrice");

    strSQL.Append(" FROM Production.ProductListPriceHistory");

    SqlDataAdapter oDA = new SqlDataAdapter(strSQL.ToString, oConn);

    oDA.Fill(oDataset);

    //definindo o DataSource do relatório

    crReportSubDocument = crReportDocument.OpenSubreport("rptPrecoProdutoHistorico.rpt");

    crReportDocument.Database.Tables(0).SetDataSource(oDataset.Tables(0));

    //dados do sub-relatório

    crReportSubDocument.Database.Tables(0).SetDataSource(oDataset.Tables(1));

    //visualizando o relatório

    crPrintPreview.DisplayGroupTree = false;

    crPrintPreview.HasCrystalLogo = false;

    crPrintPreview.ReportSource = crReportDocument;

    }

    catch (Exception ex) {

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

    }

    finally {

    //fechando a conexão com o banco de dados

    oConn.Close();

    //liberando os objetos

    oConn.Dispose();

    oDataset.Dispose();

    oConn = null;

    oDataset = null;

    }

    }

     

     

     

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

     

    No dia 17/04/2008 vou fazer um super webcast sobre Crystal Reports e ReportViewer !
    https://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032370740&culture=pt-BR

    segunda-feira, 14 de abril de 2008 13:15
    Moderador
  • terça-feira, 3 de junho de 2008 17:05
  • boas eu tambem estou fazendo um relatorio no Visual Studio C# e utilizando Crystal Report.
    para a gestão de consumiveis...
    eu faço os passos todos mas nao sei que codigos tenho que por no programa e onde por porque quando corro o programa nao me aparece os campos que estao na base de dados!!

    terça-feira, 3 de junho de 2008 17:10
  • puntz,

    Eu fiz 2 vídeos para a comunidade MSDN com as principais funcionalidades como como montar relatórios utilizandos os componentes (Crystal Reports e ReportView) com DataSet (Como fazer o designer, passar os dados, montar gráficos, etc.)

    Em anexo, links para download do webcast sobre a construção de relatórios com Crystal Reports e ReportView

    https://www.msdnbrasil.com.br/mediacenter/search.aspx?Busca=Reportview

     

    Conteúdo:

    Gerando relatórios do seu projeto: Crystal Reports versus Report Viewer Parte 1

    Duração: 45 minutos:

     

    Tópicos a serem abordados:

    Crystal Reports .NET 2005 e Report Viewer

    - Construindo um relatório com os principais recursos do componente; - Visualização e Impressão através de uma aplicação ASP .NET; - Opções avançadas de construção de relatórios; - Exportação para PDF sem “Print Preview” - Exibir uma imagem no cabeçalho do relatório de forma dinâmica

     

    Gerando relatórios do seu projeto: Crystal Reports versus Report Viewer Parte 2

    Duração: 1:30 minutos:

     

    Tópicos a serem abordados: Continuação: Aplicação ASP.NET (Visual Studio 2005 Professional Edition) - Opções avançadas com Crystal Reports .NET 2005 e ReportView - Agrupamento (Group) - Sub-Relatório (SubReport) - Imagens armazenadas no banco de dados - Gráficos (Pizza e Barras) Aplicação Windows (Visual Studio 2008 Professional Edition) - Criação de um relatório do tipo DrillDown com link para um sub-relatório utilizando o componente ReportView

     

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

     

    quarta-feira, 4 de junho de 2008 00:43
    Moderador
  • Laercio, Era mesmo isso que eu estava a precisar só que há um problema com o link de download (https://www.msdnbrasil.com.br/mediacenter/search.aspx?Busca=Reportview) não está conseguindo aceder!  agradecia muito que podesses disponibilizar isso, outra coisa ai falas que os relatorios vao ser mostrados atraves de paginas Asp, tambem é possivel fazer numa win form! mas de qualquer maneira o importante e conseguir fazer!!

    quarta-feira, 4 de junho de 2008 09:31
  • Faça o seguinte:

     

    Entre no link

    http://www.msdnbrasil.com.br/mediacenter/default.aspx

    e Informe  reportview no campo Localizar conteúdo e clique no botão ok

     

    ou tente o link

    http://www.msdnbrasil.com.br/mediacenter/search.aspx?Busca=Reportview 

     

    Espero ter ajudado!

    quarta-feira, 4 de junho de 2008 12:36
    Moderador
  • Laércio, boa tarde

    Fizemos um relatório no VS2008 utilizando o Crystal Reports.

    Aparentemente está tudo certo, o relatório chama a Stored Procedure, o relatório é gerado, e apresentado no preview.

    Depois quando clicamos no Print ou no Export, novamente é chamado a SP, e tal.

    Não que seja ruim, mas é mais lento.

    É dessa forma mesmo, ou tem como acertar para ele fazer print/export sem chamar novamente a SP ?



    At,
    Carlos Hass
    segunda-feira, 21 de julho de 2008 19:02
  • Bom dia,

     Laercio, fiz exatamente como voce fez no seu vídeo com imagens dinamicas, o relatório aparece mais a imagem não. estou usando c# o código está ai..
    using System;  
    using System.Configuration;  
    using System.Collections;  
    using System.Web;  
    using System.Web.Security;  
    using System.Web.UI;  
    using System.Web.UI.WebControls;  
    using System.Web.UI.WebControls.WebParts;  
    using System.Web.UI.HtmlControls;  
     
    //referências do banco de dados  
    using System.Data.SqlClient;  
    using System.Data;  
     
    //referências do crystal reports  
    using CrystalDecisions.CrystalReports.Engine;  
    using CrystalDecisions.Shared;  
     
    //referência ConnectionStrings web.config  
    using System.Web.Configuration;  
     
    //referência imagem  
    using System.IO;  
    using System.Drawing;  
     
     
    public partial class _Default : System.Web.UI.Page  
    {  
        protected void Page_Load(object sender, EventArgs e)  
        {  
            ReportDocument crReportDocument = new ReportDocument();  
            string strConexao = ConfigurationManager.ConnectionStrings["ServerConnectionString"].ConnectionString;  
            SqlConnection sqlConn = new SqlConnection();  
            string strSql = string.Empty;  
            dsEmailCredenciado dataSet = new dsEmailCredenciado();  
              
            try  
            {  
                //1 passo: carregar os dados do relatório / abrindo conexão com o banco de dados  
                sqlConn.ConnectionString = strConexao;  
                sqlConn.Open();  
     
                //definindo o SQL   
                strSql = "SELECT Cp080_01 AS Codigo_Credenciado, Cp080_03 AS Credenciado, Cp080_14 AS Email FROM Tb080 ORDER BY Cp080_03";  
     
                SqlDataAdapter sqlDataAdapter = new SqlDataAdapter(strSql,sqlConn);  
                sqlDataAdapter.Fill(dataSet, "PROC_rptEmailCredenciado");  
     
                //2 passo: carregar o relatório  
                string strCaminhoRelatorio = string.Empty;  
                strCaminhoRelatorio = Server.MapPath("~\\Relatório\\CrystalReport.rpt");  
                  
                crReportDocument.Load(strCaminhoRelatorio);  
     
                  
                //gerando o logo do relatório  
     
     
                DataRow dRow = dataSet.Tables["TabelaDeImagem"].NewRow();  
     
                FileStream fsOpen1 = new FileStream(Server.MapPath("~\\LogoCabecalho.bmp"), FileMode.Open,FileAccess.Read);  
                BinaryReader BinRed1 = new BinaryReader(fsOpen1);  
     
                dRow.ItemArray[0] = BinRed1.ReadBytes(Convert.ToInt32(BinRed1.BaseStream.Length));  
                dataSet.Tables["TabelaDeImagem"].Rows.Add(dRow);  
     
                //liberando os objetos  
                dRow = null;  
     
                BinRed1.Close();  
                BinRed1 = null;  
     
                fsOpen1.Dispose();  
                fsOpen1 = null;  
     
                //3 passo: definir o DataSource do relatório  
                crReportDocument.SetDataSource(dataSet);  
     
                //4 passo: visualizar o relatório  
                crPrintPreview.DisplayGroupTree = false;  
                crPrintPreview.HasCrystalLogo = false;  
                crPrintPreview.ReportSource = crReportDocument;  
            }  
            catch  
            {  
                System.Diagnostics.Debug.WriteLine("Erro ao Gerar o Relatório");  
            }  
            finally  
            {  
                //liberando os objetos   
                sqlConn.Dispose();  
                dataSet.Dispose();  
     
                sqlConn = null;  
                dataSet = null;  
            }  
        }  

    não sei se coloquei se essa linha está certa

    dRow.ItemArray[0] = BinRed1.ReadBytes(Convert.ToInt32(BinRed1.BaseStream.Length));  

    pq acho q eu estou carregando a imagem em lugar errado.

    pode me dar uma ajuda...


    abraço
    At
    Marcelo



    quarta-feira, 11 de março de 2009 13:12
  • Ola Laercio, também estou com problemas na utilização de subreport, só que no meu caso utilizamos o vs2003 e crystal.

    Este seu procedimento serve para vb2003?
    quinta-feira, 9 de julho de 2009 19:20
  • Estou com uma dúvida nessa linha: 

    crReportDocument.Load(Server.MapPath("RelContato.rpt"));

     

    No Windows Form não tem esse Server.MapPath...


     

    sexta-feira, 24 de julho de 2009 19:58
  • Estou com uma dúvida nessa linha: 

    crReportDocument.Load(Server.MapPath("RelContato.rpt"));

     

    No Windows Form não tem esse Server.MapPath...


     

     

    Estou com o mesmo problema e pelo que vi ninguém se habilita a responder!!! uma Pena.

    Espero que alguém posso nos ajudar!

    Obrigado galera!

    domingo, 27 de março de 2011 18:18
  • Jessy_Bastos e Hick2008

    Quando comecei a mexer com o crystal report tive esses mesmos problemas
    e não conseguia resposta, ate que consegui fazer o seguinte código que acabou com todos meus problemas.
    Espero que ajudem a vocês também.


                    //Crio um novo form para o preeview
                    Form fPreeView = new Form();
                    fPreeView.WindowState = FormWindowState.Maximized;

                    Crio uma instancia do relatorio
                    NomeDoSeuRelatorio report = new Namespace.NomeDoSeuRelatorio();

                    Defino o datasource do relatorio
                    report.SetDataSource(SeuDataSet);


                    CrystalDecisions.Windows.Forms.CrystalReportViewer reportview = new CrystalReportViewer();
                    reportview.Parent = fPreeView;
                    reportview.Dock = DockStyle.Fill;
                    reportview.ReportSource = report;
                    reportview.DisplayGroupTree = false;
                    fPreeView.ShowDialog();

    Caso tenha sido util, favor marcar.

    Abraços,

    Zagatti, Angelo Itápolis-SP
    segunda-feira, 28 de março de 2011 00:19