Fórum Como configurar um relatório CrystalReport para ler uma ConnectionString do App.Config? #13947

12/01/2010

0

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:


       
 

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 em 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?
Daniel Vieira

Daniel Vieira

Responder

Posts

12/01/2010

Daniel Vieira

Na outra postagem não apareceu o xml da app.config:

O post deveria ser esse:

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?
Responder

Gostei + 0

12/01/2010

Fabio Mans

Daniel segue um exemplo     <?xml version="1.0" encoding="utf-8" ?> <configuration> <appSettings> <add key="ConnectionString" value="Data Source=172.31.0.71;Initial Catalog=intranetfrsp;Persist Security Info=True;User ID=logaiservice;Password=entraiservice"/> </appSettings> <connectionStrings> <add name="Entities" connectionString="metadata=res://*/Model.csdl|res://*/Model.ssdl|res://*/Model.msl;provider=System.Data.SqlClient;provider connection string=string;Data Source=Server;Initial Catalog=Banco;User Id=ID;Password=Senha;Integrated Security=True;MultipleActiveResultSets=True" providerName="System.Data.EntityClient" /> </connectionStrings> </configuration>   using System; using System.Configuration; using System.Windows.Forms;private void button1_Click(object sender, EventArgs e) { //Se utilizar key AppSettingsReader configurationAppSettings = new AppSettingsReader();
string caminho = configurationAppSettings.GetValue("ConnectionString", typeof(String)).ToString();
string[] parts = caminho.Split(";".ToCharArray()); //Se utilizar connection string string caminhoEntity = ConfigurationManager.ConnectionStrings["Entities"].ToString();
string[] partsEntity = caminhoEntity.Split(";".ToCharArray());
string serverName = partsEntity[3];
string databaseName = partsEntity[4];
string userID = partsEntity[5];
string password = partsEntity[6]; } Espero ter ajudado Fabio
Responder

Gostei + 0

13/01/2010

Daniel Vieira

Fábio, tive que tirar 1 de cada index, estava apontando pra um index a mais no exemplo, nada que atrapalhe.

Mas seguinte, rodando em um messagebox pra ver os valores, eu obtive o seguinte:







Eu gostaria somente do valor, está passando também a descrição do valor, isso me gera um erro.



Ps: uma dúvida simples, o projeto tem 2 app.config, mas o que é válido pra leitura de strconn é sempre o app.config que fica no projeto main, o projeto que será o primeiro a ser executado na solution, correto?
Responder

Gostei + 0

13/01/2010

Fabio Mans

Daniel você não pode colocar no App.Config os dados ao invés de utilizar a string de conexão do Entity? Porque senão fica complicado, para quebrar o critério é o ; (ponto vírgula) caso contrário não da para fazer o Split, tem que ter um critério para quebrar, sobre o App.Config é que fica na raiz do projeto.     Fabio
Responder

Gostei + 0

13/01/2010

Daniel Vieira

é que fica difícil pra mim mudar o app.config, como não fui eu quem comecei o projeto, não sei quais consequencias isso traria pro projeto.

Se eu adicionar keys ao app.config isso vai influir em alguma parte que leia a stringconnection, se eu nao modificar ela?
Responder

Gostei + 0

13/01/2010

Fabio Mans

 Não tem problema, você pode colocar quantas keys ou connections você quiser. Faz o seguinte coloca uma Key assim.   <add key="minhaConexao" value="server;banco;usuario;senha/> Deste jeito você recupera e a key minhaConexao e fica do jeito que você quer.   Fabio   ==================================   <?xml version="1.0" encoding="utf-8" ?> <configuration> <appSettings> <add key="ConnectionString" value="Data Source=172.31.0.71;Initial Catalog=intranetfrsp;Persist Security Info=True;User ID=logaiservice;Password=entraiservice"/> </appSettings> <connectionStrings> <add name="Entities" connectionString="metadata=res://*/Model.csdl|res://*/Model.ssdl|res://*/Model.msl;provider=System.Data.SqlClient;provider connection string=string;Data Source=Server;Initial Catalog=Banco;User Id=ID;Password=Senha;Integrated Security=True;MultipleActiveResultSets=True" providerName="System.Data.EntityClient" /> </connectionStrings> </configuration>   using System; using System.Configuration; using System.Windows.Forms;private void button1_Click(object sender, EventArgs e) { //Se utilizar key AppSettingsReader configurationAppSettings = new AppSettingsReader();
string caminho = configurationAppSettings.GetValue("ConnectionString", typeof(String)).ToString();
string[] parts = caminho.Split(";".ToCharArray()); //Se utilizar connection string string caminhoEntity = ConfigurationManager.ConnectionStrings["Entities"].ToString();
string[] partsEntity = caminhoEntity.Split(";".ToCharArray());
string serverName = partsEntity[3];
string databaseName = partsEntity[4];
string userID = partsEntity[5];
string password = partsEntity[6]; } Espero ter ajudado Fabio
Responder

Gostei + 0

13/01/2010

Daniel Vieira

Obrigado Fabio, vou usar.


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.
Pesquisando um pouco, vi como passar parametros ao report, e passei 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, Construsys
                while (pathExeApp.Substring(cont, 11).ToLower() != @"construsys\")
                {
                    unidade += pathExeApp.Substring(cont, 1);
                    cont++;
                }

                unidade += @"construsys\";

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

 
Responder

Gostei + 0

13/01/2010

Fabio Mans

Não tem problema algum, 90% dos relatórios são feitos assim, ou seja o modo mais fácil.   Fabio
Responder

Gostei + 0

13/01/2010

Daniel Vieira

Opa obrigado Fabio, legal saber que estou no caminho certo.


Só uma última dúvida pra encerrarmos o chamado:


Eu fiz um primeiro relatório (o que está funcionando) somente com uma tabela, e no DataSource do report passei um select dessa tabela.


Quando eu fiz um outro report, que envolvia uma junção de 3 tabelas, fui rodar em outras máquinas e ficou pedindo credenciais.
Eu tenho que fazer um select que preencha totalmente as junções das tabelas que populam o datasource?
Responder

Gostei + 0

13/01/2010

Fabio Mans

Daniel eu acho que não, o select não tem nada a ver com autenticação, reveja como você fez um e depois o outro. Fabio    
Responder

Gostei + 0

13/01/2010

Daniel Vieira

Mas eu nao refiz a autenticacao Fabio, unica coisa que eu fiz foi refazer o datasource e atribuir.
Ja testei em outras maquinas e funciona, inclusive com a minha fora da rede e desligada, (e tambem cada instancia do sql tem dados diferentes, 2 maquinas de teste e outra de producao, e em cada maquina exibiu os dados do sql correspondente)


Fiz os seguintes passos:

1- Usei o Wizard do Crystal, Setei New OLEDB SqlProvider pra minha maquina

2- No load do form que contem o reportViewer eu coloquei o seguinte codigo:

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, Construsys
                while (pathExeApp.Substring(cont, 11).ToLower() != @"construsys\")
                {
                    unidade += pathExeApp.Substring(cont, 1);
                    cont++;
                }

                unidade += @"construsys\";

                //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);
            }
        }
Responder

Gostei + 0

14/01/2010

Fabio Mans

Aparentemento está OK, quando você diz credencias o que significa?
Responder

Gostei + 0

14/01/2010

Fabio Mans

Aparentemente está OK, quando você diz credencias o que significa?
Responder

Gostei + 0

14/01/2010

Daniel Vieira

Credenciais quero dizer que o report pede usuario e senha da base pra rodar, ou seja, ele esta utilizando outra máquina na rede.

Eu estou bem confuso com essa parte, nem sei como rodou!
Responder

Gostei + 0

14/01/2010

Fabio Mans

Você tem um DBA na sua empresa para te ajudar?
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar