none
Como fazer um relatório do CrystalReports utilizar a mesma conexão que minha aplicação está utilizando?

    Question

  • Amigos,

    Estou começando a fazer os relatórios do meu sistema, utilizando CrystalReports.
    A única maneira de fazer relatório que eu sei é utilizando o wizard, onde eu seto uma nova conexao OleDB Sql Server Provider.
    Então eu seto minha máquina como data source, mas eu gostaria que fosse dinâmico, gostaria de utilizar a mesma conexão da aplicação. E a conexão da aplicação é baseada no app.config.

    Como eu faria isso? Obrigado

    Ps:

    O que eu preciso é utilizar essa connection string do App.Config:

    <connectionStrings>
        <add name="Entities" connectionString="metadata=res://*/Model.csdl|res://*/Model.ssdl|res://*/Model.msl;provider=System.Data.SqlClient;provider connection string=&quot;Data Source=Server;Initial Catalog=Banco; User Id=ID;Password=Senha; Integrated Security=True;MultipleActiveResultSets=True&quot;" providerName="System.Data.EntityClient" />   
      </connectionStrings>

    preciso ler esse arquivo, separar os 4 campos e passar como parametro pra esse objeto:

               
                ConnectionInfo crConnectionInfo = new ConnectionInfo();
               

                crConnectionInfo.ServerName = "DataSource";
                crConnectionInfo.DatabaseName = "InitialCatalog";
                crConnectionInfo.UserID = "UserId";
                crConnectionInfo.Password = "Password";


    Eu sei ler o app.config de um outro projeto que eu mesmo fiz, mas eu adicionava uma key para cada atributo, esse vem com a stringconnection pronta (e esse projeto nao fui eu quem comecei)

    Como eu quebro essa string connection para ler os parametros?
    Tuesday, January 12, 2010 6:19 PM

Answers

  • Daniel,

    Você pode fazer a conexão com a base de dados e popular um DataSet usando o mesmo como data source do seu relatório.

    Segue alguns links abaixo:

    CodeProject: Creating Crystal Reports using C# with DataSets
    http://www.codeproject.com/KB/cs/CreatingCrystalReports.aspx

    VB.NET - Gerando relatórios via Crystal Reports usando DataSet
    http://www.macoratti.net/vbn3_cr1.htm

    Att.

    Ari C. Raimundo
    MCAD, MCP
    http://araimundo.blogspot.com
    Tuesday, January 12, 2010 6:40 PM
  • Meio complexo, não entendi direito, nunca usei dataset e etc, uso linq pra tudo!

    Ficou meio complicado pra entender!
    Tuesday, January 12, 2010 6:59 PM
  • O que eu preciso é utilizar essa connection string do App.Config:

    <connectionStrings>
        <add name="Entities" connectionString="metadata=res://*/Model.csdl|res://*/Model.ssdl|res://*/Model.msl;provider=System.Data.SqlClient;provider connection string=&quot;Data Source=Server;Initial Catalog=Banco; User Id=ID;Password=Senha; Integrated Security=True;MultipleActiveResultSets=True&quot;" providerName="System.Data.EntityClient" />   
      </connectionStrings>

    preciso ler esse arquivo, separar os 4 campos e passar como parametro pra esse objeto:

               
                ConnectionInfo crConnectionInfo = new ConnectionInfo();
               

                crConnectionInfo.ServerName = "DataSource";
                crConnectionInfo.DatabaseName = "InitialCatalog";
                crConnectionInfo.UserID = "UserId";
                crConnectionInfo.Password = "Password";


    Eu sei ler o app.config de um outro projeto que eu mesmo fiz, mas eu adicionava uma key para cada atributo, esse vem com a stringconnection pronta (e esse projeto nao fui eu quem comecei)

    Como eu quebro essa string connection para ler os parametros?
    Tuesday, January 12, 2010 7:59 PM
  • Daniel,

    Para usar o LINQ você pode utilizar como Data Source do seu relatório a opção de .NET Objects (Report Wizard). Assim, com o LINQ você pode transformar o resultado de uma consulta em uma lista genérica e definir a mesma como data source do relatório.

    Por exemplo:

    var lista = (from c in dc.Customers
                     select c).ToList();

    seuRelatorio.SetDataSource(lista);


    Att.

    Ari C. Raimundo
    MCAD, MCP
    http://araimundo.blogspot.com
    Wednesday, January 13, 2010 2:56 AM
  • Eu consegui fazer funcionar o seu exemplo Ari, foi de grande utilidade.

    Mas só consegui fazer isso em um report gerado pelo wizard utilizando uma conexão OleDB SqlServer provider (o qual eu tenho que escolher uma base de dados, ficando estático)

    Gerei um novo report através do seu exemplo, ele me deixa utilizar os atributos da classe como campos do report, mas em tempo de execução não aparece nem o cabeçalho.

    O que eu teria que fazer pra funcionar um relatorio usando como datasource um .NET Object?
    Wednesday, January 13, 2010 12:43 PM

  • Seguinte:


    Eu fiz um CrystalReport utilizando o Wizard, usei inclusive uma nova Conexao OLEDB SqlServer provider, onde setei server, base user pass etc.
    O report ficou estatico, so funcionando na minha maquina.
    Passei parametros ao report, um list.
    Esse list vem de dados que estão utilizando a conexao corrente do sistema que esta em runtime.

    So de atribuir acabou funcionando, em todas as maquinas, o report, com os dados correntes que vem da base de dados ao qual o projeto esta conectado.

    Tem problema eu ter feito o report via Wizard, setando conexao estatica com minha maquina, e depois fazer essa atribuicao?

    Vou postar o metodo que estou usando no load do form que contem o reportviewer:

    private void frmRPTProdutos_Load(object sender, EventArgs e)
            {
                try
                {
                    //Novo reportDocument
                    ReportDocument cryRpt = new ReportDocument();
                   
                    //Le o caminho do executavel do sistema
                    string pathExeApp = Application.StartupPath;

                    int cont = 0;
                    string unidade = "";

                    //Le o caminho ate chegar a pasta raiz do sistema
                    while (pathExeApp.Substring(cont, 11).ToLower() != @"PastaRaiz\")
                    {
                        unidade += pathExeApp.Substring(cont, 1);
                        cont++;
                    }

                    unidade += @"PastaRaiz\";

                    //Concatena o caminho inicial com a localização do report
                    string caminhoReports = unidade + "Materiais\\Reports\\rptProdutos.rpt";
                  
                    //Le o report
                    cryRpt.Load(caminhoReports);

                    //Query para popular o report
                    Entities db = new Entities();
                    var list = (from p in db.Produto select p).OrderBy(p => p.codigo).ToList();
                   
                    //Atribuicao da query ao report
                    cryRpt.SetDataSource(list);
                   
                    //Exibe o report no ReportViewer
                    crystalReportViewer1.ReportSource = cryRpt;
                    crystalReportViewer1.Refresh();
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
    }

    Wednesday, January 13, 2010 5:40 PM
  • Daniel,

    Eu fiz um teste criando um relatório com um data source do tipo .NET Objects referenciando uma tabela do meu modelo LINQ (LINQ to SQL) e funcionou corretamente (Visual Studio 2008 + SQL Server 2008 + Northwind).

    O seu código acima está correto e está definindo o data source corretamente. Quanto a sua dúvida sobre o Provider, não acho legal criar o relatório pelo wizard escolhendo o provider e posteriormente no código utilizar outro tipo de data source (aliás, nem sei como isso funcionou).

    Não sei porquê em tempo de execução seu relatório não mostra nada. Já tentou debugar a aplicação para verificar se a consulta LINQ está retornando alguma coisa?

    Att.

    Ari C. Raimundo
    MCAD, MCP
    http://araimundo.blogspot.com
    Wednesday, January 13, 2010 8:26 PM
  • Eu utilizei a mesma consulta que está preenchendo esse report feito via Wizard.

    Também não sei como funcionou, e estou com medo de hora ou outra parar de funcionar.

    Mas sobre os .NET Objects, não aparecem minhas representações de tabelas, somente minhas próprias classes criadas dentro do projeto. Como eu as encontraria?

    PS: O meu projeto é Linq to Entities, não sei se tem diferença (alias nem sei qual a diferença entre os 2)
    Wednesday, January 13, 2010 10:44 PM
  • Daniel,

    As tabelas do modelo só aparecem no Wizard depois que você constrói seu projeto (Build). Fiz um teste aqui com o LINQ To Entities e também funcionou normalmente.

    Sim, o LINQ to Entities é diferente do LINQ To SQL. Segue abaixo um artigo que mostra quando usar um ou outro e quais são as diferenças.

    Introducing LINQ to Relational Data
    http://msdn.microsoft.com/en-us/library/cc161164.aspx

    Att.

    Ari C. Raimundo
    MCAD, MCP
    http://araimundo.blogspot.com
    Thursday, January 14, 2010 1:26 AM
  • Ari, eu estava desconfiando, fiz um teste e acabou se revelando verdade.

    A representação das tabelas so aparece se eu adicionar o report ao projeto que contém o Entity Data Model.

    Aliás, cada projeto que eu adiciono o Wizard só encontra as classes daquele projeto.

    Já adicionei referência e não funcionou, como eu faria pra funcionar?
    Thursday, January 14, 2010 11:20 AM
  • Daniel,

    Eu consigo referenciar entidades de outro projeto, independente do projeto do relatório, sem problemas. Você fez o build antes de utilizar o Wizard?

    Att.

    Ari C. Raimundo
    MCAD, MCP
    http://araimundo.blogspot.com
    Thursday, January 14, 2010 4:20 PM
  • Sim ari, eu inclusive já tenho partes desse projeto em uso no server de produção.

    Eu acesso as classes de entidades em todos os projetos do meu sistema, elas estão em um projeto e todos os outros acessam. Mas no wizard do relatório não aparecem, vou postar uma screenshot pra você ver melhor:

    Nessa Screen eu adiciono o relatório ao projeto que eu preciso, o wizard somente me mostra as classes daquele projeto, que eu mesmo criei (o projeto que estou trabalhando agora é o Materiais, e as Entidades ficam no projeto ModelDB:

    http://img11.imageshack.us/img11/3328/projetom.jpg


    Nessa outra screenshot eu adiciono o report ao projeto que contém o Model, e nele aparecem todas as tabelas, representadas por classes:
    http://img695.imageshack.us/img695/1152/modelh.jpg



    Ps: dei uma editada na imagem pra não aparecer o projeto da empresa por inteiro!
    Thursday, January 14, 2010 8:30 PM
  • Daniel,

    Desculpe, eu me enganei, realmente só aparece a entidade do projeto que criamos o relatório. Isso faz sentido, já que o .NET Objects encontra-se em Project Data (Dados do Projeto).

    Bom, descobri como resolver isso da seguinte maneira:

    1 - Crie um relatório no projeto que contém as entidades.
    2 - No Wizard clique com o botão direito sobre a entidade e escolha a opção "Add To Favorites".
    3 - Cancele a criação do relatório e apague o arquivo rpt do projeto.
    4 - Crie um relatório no projeto que você deseja que fiquem os relatórios e no Wizard vá até o nó Favorites. A entidade estará neste nó.

    Vou pesquisar se essa é a melhor forma de resolver esse problema e qualquer coisa lhe aviso por aqui.

    Att.

    Ari C. Raimundo
    MCAD, MCP
    http://araimundo.blogspot.com
    Friday, January 15, 2010 2:21 AM
  • Fiz o que você recomendou e funcionou Ari, apareceram as minhas representações de tabelas, no wizard apareceu o relacionamento entre elas, tudo perfeito.

    Mas na hora de rodar o report pede algumas credenciais (pede pra cada tabela que compõe o report. Eu testei com user e senha do sql mas não funcionou)

    http://img192.imageshack.us/img192/7691/credenciais.jpg

    Eu fiz o report via wizard, depois adicionei um crystalreportviewer ao form, e no proprio botaozinho do viewer eu adicionei o report.
    Depois fiz a chamada ao report via código, fiz um datasource manualmente para preencher, e continua pedindo essas credenciais. O que seriam elas?
    Friday, January 15, 2010 12:05 PM
  • Daniel,

    Fiz um teste aqui usando aquele esquema de adicionar aos favoritos no Wizard e funcionou normalmente. Na sua aplicação Windows Forms você está adicionando a string de conexão ao banco de dados em um arquivo de configuração?

    Essa janela "Database Login" normalmente aparece quando realizamos a conexão usando um provider (SQL, OleDb e outros). Aquelas credenciais são do acesso a base de dados mesmo.

    Att.

    Ari C. Raimundo
    MCAD, MCP
    http://araimundo.blogspot.com
    Sunday, January 17, 2010 1:33 AM
  • Sim, a string de conexão das Entidades fica no arquivo App.config, que é chamada automaticamente.

    Eu testei com um relatório de uma só tabela e não pediu as credenciais. Eu adicionei aquery manualmente. Será que a query do datasource tem que reproduzir fielmente o que foi gerado via wizard?

    Porque no wizard ele me avisou que ia criar algumas procedures (quando eu adicionei 3 tabelas)
    Monday, January 18, 2010 10:27 AM
  • Daniel,

    Sim, a query tem que resultar na entidade escolhida na opção .NET Objects. O Wizard do Crystal avisou que iria criar procedures? Não entendi.

    Att.

    Ari C. Raimundo
    MCAD, MCP
    http://araimundo.blogspot.com
    Tuesday, January 19, 2010 1:15 AM
  • Tem como eu ver a query gerada pelo wizard?

    E ele gera código LINQ ou código sql?
    Tuesday, January 19, 2010 2:11 PM
  • Consegui resolver da seguinte maneira:

    private void ConfigureCrystalReports()
            {
                //Seta um objeto capaz de ler o App.Config
                AppSettingsReader configurationAppSettings = new AppSettingsReader();

                ConnectionInfo connectionInfo = new ConnectionInfo();

                //Monta parcialmente a string de conexão lendo a partir do App.Config
                connectionInfo.ServerName = configurationAppSettings.GetValue("Data Source", typeof(String)).ToString();
                connectionInfo.UserID = configurationAppSettings.GetValue("User ID", typeof(String)).ToString();
                connectionInfo.Password = configurationAppSettings.GetValue("Password", typeof(String)).ToString();
                connectionInfo.DatabaseName = configurationAppSettings.GetValue("Initial Catalog", typeof(String)).ToString();


                //Novo reportDocument
                ReportDocument cryRpt = new ReportDocument();

                //Le o caminho do executavel do sistema
                string pathExeApp = Application.StartupPath;

                int cont = 0;
                string unidade = "";

                //Le o caminho ate chegar a pasta raiz do sistema
                while (pathExeApp.Substring(cont, 10).ToLower() != @"caminho\")
                {
                    unidade += pathExeApp.Substring(cont, 1);
                    cont++;
                }

                unidade += @"caminho\";

                //Concatena o caminho inicial com a localização do report
                string caminhoReports = unidade + "UI\\Relatorios\\rptEstadia.rpt";

                //Le o report
                cryRpt.Load(caminhoReports);
               

                SetDBLogonForReport(connectionInfo, cryRpt);

                crystalReportViewer1.ReportSource = cryRpt;
                crystalReportViewer1.Refresh();
            }

            private void SetDBLogonForReport(ConnectionInfo connectionInfo, ReportDocument ArquivoReport)
            {
                Tables tables = ArquivoReport.Database.Tables;
                foreach (CrystalDecisions.CrystalReports.Engine.Table table in tables)
                {
                    TableLogOnInfo tableLogonInfo = table.LogOnInfo;
                    tableLogonInfo.ConnectionInfo = connectionInfo;
                    table.ApplyLogOnInfo(tableLogonInfo);
                }
            }
    Wednesday, January 20, 2010 10:26 AM

All replies

  • Daniel,

    Você pode fazer a conexão com a base de dados e popular um DataSet usando o mesmo como data source do seu relatório.

    Segue alguns links abaixo:

    CodeProject: Creating Crystal Reports using C# with DataSets
    http://www.codeproject.com/KB/cs/CreatingCrystalReports.aspx

    VB.NET - Gerando relatórios via Crystal Reports usando DataSet
    http://www.macoratti.net/vbn3_cr1.htm

    Att.

    Ari C. Raimundo
    MCAD, MCP
    http://araimundo.blogspot.com
    Tuesday, January 12, 2010 6:40 PM
  • Meio complexo, não entendi direito, nunca usei dataset e etc, uso linq pra tudo!

    Ficou meio complicado pra entender!
    Tuesday, January 12, 2010 6:59 PM
  • O que eu preciso é utilizar essa connection string do App.Config:

    <connectionStrings>
        <add name="Entities" connectionString="metadata=res://*/Model.csdl|res://*/Model.ssdl|res://*/Model.msl;provider=System.Data.SqlClient;provider connection string=&quot;Data Source=Server;Initial Catalog=Banco; User Id=ID;Password=Senha; Integrated Security=True;MultipleActiveResultSets=True&quot;" providerName="System.Data.EntityClient" />   
      </connectionStrings>

    preciso ler esse arquivo, separar os 4 campos e passar como parametro pra esse objeto:

               
                ConnectionInfo crConnectionInfo = new ConnectionInfo();
               

                crConnectionInfo.ServerName = "DataSource";
                crConnectionInfo.DatabaseName = "InitialCatalog";
                crConnectionInfo.UserID = "UserId";
                crConnectionInfo.Password = "Password";


    Eu sei ler o app.config de um outro projeto que eu mesmo fiz, mas eu adicionava uma key para cada atributo, esse vem com a stringconnection pronta (e esse projeto nao fui eu quem comecei)

    Como eu quebro essa string connection para ler os parametros?
    Tuesday, January 12, 2010 7:59 PM
  • Daniel,

    Para usar o LINQ você pode utilizar como Data Source do seu relatório a opção de .NET Objects (Report Wizard). Assim, com o LINQ você pode transformar o resultado de uma consulta em uma lista genérica e definir a mesma como data source do relatório.

    Por exemplo:

    var lista = (from c in dc.Customers
                     select c).ToList();

    seuRelatorio.SetDataSource(lista);


    Att.

    Ari C. Raimundo
    MCAD, MCP
    http://araimundo.blogspot.com
    Wednesday, January 13, 2010 2:56 AM
  • Eu consegui fazer funcionar o seu exemplo Ari, foi de grande utilidade.

    Mas só consegui fazer isso em um report gerado pelo wizard utilizando uma conexão OleDB SqlServer provider (o qual eu tenho que escolher uma base de dados, ficando estático)

    Gerei um novo report através do seu exemplo, ele me deixa utilizar os atributos da classe como campos do report, mas em tempo de execução não aparece nem o cabeçalho.

    O que eu teria que fazer pra funcionar um relatorio usando como datasource um .NET Object?
    Wednesday, January 13, 2010 12:43 PM

  • Seguinte:


    Eu fiz um CrystalReport utilizando o Wizard, usei inclusive uma nova Conexao OLEDB SqlServer provider, onde setei server, base user pass etc.
    O report ficou estatico, so funcionando na minha maquina.
    Passei parametros ao report, um list.
    Esse list vem de dados que estão utilizando a conexao corrente do sistema que esta em runtime.

    So de atribuir acabou funcionando, em todas as maquinas, o report, com os dados correntes que vem da base de dados ao qual o projeto esta conectado.

    Tem problema eu ter feito o report via Wizard, setando conexao estatica com minha maquina, e depois fazer essa atribuicao?

    Vou postar o metodo que estou usando no load do form que contem o reportviewer:

    private void frmRPTProdutos_Load(object sender, EventArgs e)
            {
                try
                {
                    //Novo reportDocument
                    ReportDocument cryRpt = new ReportDocument();
                   
                    //Le o caminho do executavel do sistema
                    string pathExeApp = Application.StartupPath;

                    int cont = 0;
                    string unidade = "";

                    //Le o caminho ate chegar a pasta raiz do sistema
                    while (pathExeApp.Substring(cont, 11).ToLower() != @"PastaRaiz\")
                    {
                        unidade += pathExeApp.Substring(cont, 1);
                        cont++;
                    }

                    unidade += @"PastaRaiz\";

                    //Concatena o caminho inicial com a localização do report
                    string caminhoReports = unidade + "Materiais\\Reports\\rptProdutos.rpt";
                  
                    //Le o report
                    cryRpt.Load(caminhoReports);

                    //Query para popular o report
                    Entities db = new Entities();
                    var list = (from p in db.Produto select p).OrderBy(p => p.codigo).ToList();
                   
                    //Atribuicao da query ao report
                    cryRpt.SetDataSource(list);
                   
                    //Exibe o report no ReportViewer
                    crystalReportViewer1.ReportSource = cryRpt;
                    crystalReportViewer1.Refresh();
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
    }

    Wednesday, January 13, 2010 5:40 PM
  • Daniel,

    Eu fiz um teste criando um relatório com um data source do tipo .NET Objects referenciando uma tabela do meu modelo LINQ (LINQ to SQL) e funcionou corretamente (Visual Studio 2008 + SQL Server 2008 + Northwind).

    O seu código acima está correto e está definindo o data source corretamente. Quanto a sua dúvida sobre o Provider, não acho legal criar o relatório pelo wizard escolhendo o provider e posteriormente no código utilizar outro tipo de data source (aliás, nem sei como isso funcionou).

    Não sei porquê em tempo de execução seu relatório não mostra nada. Já tentou debugar a aplicação para verificar se a consulta LINQ está retornando alguma coisa?

    Att.

    Ari C. Raimundo
    MCAD, MCP
    http://araimundo.blogspot.com
    Wednesday, January 13, 2010 8:26 PM
  • Eu utilizei a mesma consulta que está preenchendo esse report feito via Wizard.

    Também não sei como funcionou, e estou com medo de hora ou outra parar de funcionar.

    Mas sobre os .NET Objects, não aparecem minhas representações de tabelas, somente minhas próprias classes criadas dentro do projeto. Como eu as encontraria?

    PS: O meu projeto é Linq to Entities, não sei se tem diferença (alias nem sei qual a diferença entre os 2)
    Wednesday, January 13, 2010 10:44 PM
  • Daniel,

    As tabelas do modelo só aparecem no Wizard depois que você constrói seu projeto (Build). Fiz um teste aqui com o LINQ To Entities e também funcionou normalmente.

    Sim, o LINQ to Entities é diferente do LINQ To SQL. Segue abaixo um artigo que mostra quando usar um ou outro e quais são as diferenças.

    Introducing LINQ to Relational Data
    http://msdn.microsoft.com/en-us/library/cc161164.aspx

    Att.

    Ari C. Raimundo
    MCAD, MCP
    http://araimundo.blogspot.com
    Thursday, January 14, 2010 1:26 AM
  • Ari, eu estava desconfiando, fiz um teste e acabou se revelando verdade.

    A representação das tabelas so aparece se eu adicionar o report ao projeto que contém o Entity Data Model.

    Aliás, cada projeto que eu adiciono o Wizard só encontra as classes daquele projeto.

    Já adicionei referência e não funcionou, como eu faria pra funcionar?
    Thursday, January 14, 2010 11:20 AM
  • Daniel,

    Eu consigo referenciar entidades de outro projeto, independente do projeto do relatório, sem problemas. Você fez o build antes de utilizar o Wizard?

    Att.

    Ari C. Raimundo
    MCAD, MCP
    http://araimundo.blogspot.com
    Thursday, January 14, 2010 4:20 PM
  • Sim ari, eu inclusive já tenho partes desse projeto em uso no server de produção.

    Eu acesso as classes de entidades em todos os projetos do meu sistema, elas estão em um projeto e todos os outros acessam. Mas no wizard do relatório não aparecem, vou postar uma screenshot pra você ver melhor:

    Nessa Screen eu adiciono o relatório ao projeto que eu preciso, o wizard somente me mostra as classes daquele projeto, que eu mesmo criei (o projeto que estou trabalhando agora é o Materiais, e as Entidades ficam no projeto ModelDB:

    http://img11.imageshack.us/img11/3328/projetom.jpg


    Nessa outra screenshot eu adiciono o report ao projeto que contém o Model, e nele aparecem todas as tabelas, representadas por classes:
    http://img695.imageshack.us/img695/1152/modelh.jpg



    Ps: dei uma editada na imagem pra não aparecer o projeto da empresa por inteiro!
    Thursday, January 14, 2010 8:30 PM
  • Daniel,

    Desculpe, eu me enganei, realmente só aparece a entidade do projeto que criamos o relatório. Isso faz sentido, já que o .NET Objects encontra-se em Project Data (Dados do Projeto).

    Bom, descobri como resolver isso da seguinte maneira:

    1 - Crie um relatório no projeto que contém as entidades.
    2 - No Wizard clique com o botão direito sobre a entidade e escolha a opção "Add To Favorites".
    3 - Cancele a criação do relatório e apague o arquivo rpt do projeto.
    4 - Crie um relatório no projeto que você deseja que fiquem os relatórios e no Wizard vá até o nó Favorites. A entidade estará neste nó.

    Vou pesquisar se essa é a melhor forma de resolver esse problema e qualquer coisa lhe aviso por aqui.

    Att.

    Ari C. Raimundo
    MCAD, MCP
    http://araimundo.blogspot.com
    Friday, January 15, 2010 2:21 AM
  • Fiz o que você recomendou e funcionou Ari, apareceram as minhas representações de tabelas, no wizard apareceu o relacionamento entre elas, tudo perfeito.

    Mas na hora de rodar o report pede algumas credenciais (pede pra cada tabela que compõe o report. Eu testei com user e senha do sql mas não funcionou)

    http://img192.imageshack.us/img192/7691/credenciais.jpg

    Eu fiz o report via wizard, depois adicionei um crystalreportviewer ao form, e no proprio botaozinho do viewer eu adicionei o report.
    Depois fiz a chamada ao report via código, fiz um datasource manualmente para preencher, e continua pedindo essas credenciais. O que seriam elas?
    Friday, January 15, 2010 12:05 PM
  • Daniel,

    Fiz um teste aqui usando aquele esquema de adicionar aos favoritos no Wizard e funcionou normalmente. Na sua aplicação Windows Forms você está adicionando a string de conexão ao banco de dados em um arquivo de configuração?

    Essa janela "Database Login" normalmente aparece quando realizamos a conexão usando um provider (SQL, OleDb e outros). Aquelas credenciais são do acesso a base de dados mesmo.

    Att.

    Ari C. Raimundo
    MCAD, MCP
    http://araimundo.blogspot.com
    Sunday, January 17, 2010 1:33 AM
  • Sim, a string de conexão das Entidades fica no arquivo App.config, que é chamada automaticamente.

    Eu testei com um relatório de uma só tabela e não pediu as credenciais. Eu adicionei aquery manualmente. Será que a query do datasource tem que reproduzir fielmente o que foi gerado via wizard?

    Porque no wizard ele me avisou que ia criar algumas procedures (quando eu adicionei 3 tabelas)
    Monday, January 18, 2010 10:27 AM
  • Daniel,

    Sim, a query tem que resultar na entidade escolhida na opção .NET Objects. O Wizard do Crystal avisou que iria criar procedures? Não entendi.

    Att.

    Ari C. Raimundo
    MCAD, MCP
    http://araimundo.blogspot.com
    Tuesday, January 19, 2010 1:15 AM
  • Tem como eu ver a query gerada pelo wizard?

    E ele gera código LINQ ou código sql?
    Tuesday, January 19, 2010 2:11 PM
  • Consegui resolver da seguinte maneira:

    private void ConfigureCrystalReports()
            {
                //Seta um objeto capaz de ler o App.Config
                AppSettingsReader configurationAppSettings = new AppSettingsReader();

                ConnectionInfo connectionInfo = new ConnectionInfo();

                //Monta parcialmente a string de conexão lendo a partir do App.Config
                connectionInfo.ServerName = configurationAppSettings.GetValue("Data Source", typeof(String)).ToString();
                connectionInfo.UserID = configurationAppSettings.GetValue("User ID", typeof(String)).ToString();
                connectionInfo.Password = configurationAppSettings.GetValue("Password", typeof(String)).ToString();
                connectionInfo.DatabaseName = configurationAppSettings.GetValue("Initial Catalog", typeof(String)).ToString();


                //Novo reportDocument
                ReportDocument cryRpt = new ReportDocument();

                //Le o caminho do executavel do sistema
                string pathExeApp = Application.StartupPath;

                int cont = 0;
                string unidade = "";

                //Le o caminho ate chegar a pasta raiz do sistema
                while (pathExeApp.Substring(cont, 10).ToLower() != @"caminho\")
                {
                    unidade += pathExeApp.Substring(cont, 1);
                    cont++;
                }

                unidade += @"caminho\";

                //Concatena o caminho inicial com a localização do report
                string caminhoReports = unidade + "UI\\Relatorios\\rptEstadia.rpt";

                //Le o report
                cryRpt.Load(caminhoReports);
               

                SetDBLogonForReport(connectionInfo, cryRpt);

                crystalReportViewer1.ReportSource = cryRpt;
                crystalReportViewer1.Refresh();
            }

            private void SetDBLogonForReport(ConnectionInfo connectionInfo, ReportDocument ArquivoReport)
            {
                Tables tables = ArquivoReport.Database.Tables;
                foreach (CrystalDecisions.CrystalReports.Engine.Table table in tables)
                {
                    TableLogOnInfo tableLogonInfo = table.LogOnInfo;
                    tableLogonInfo.ConnectionInfo = connectionInfo;
                    table.ApplyLogOnInfo(tableLogonInfo);
                }
            }
    Wednesday, January 20, 2010 10:26 AM
  • Obrigado por toda a ajuda, fica as respostas e como chegamos as mesmas!

    Esclareceu muitas dúvidas este tópico, recomendado!
    Wednesday, January 20, 2010 10:41 AM
  • Lembrando que pra funcionar a minha última sugestão, eu usei conexão via manager OleDB SqlServer provider.
    Wednesday, January 20, 2010 11:28 AM