Fórum Como configurar um relatório CrystalReport para ler uma ConnectionString do App.Config? #13947
12/01/2010
0
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
Curtir tópico
+ 0Posts
12/01/2010
Daniel Vieira
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="Data Source=Server;Initial Catalog=Banco; 'User Id=ID;Password=Senha; Integrated Security=True;MultipleActiveResultSets=True"" '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?
Gostei + 0
12/01/2010
Fabio Mans
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
Gostei + 0
13/01/2010
Daniel Vieira
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?
Gostei + 0
13/01/2010
Fabio Mans
Gostei + 0
13/01/2010
Daniel Vieira
Se eu adicionar keys ao app.config isso vai influir em alguma parte que leia a stringconnection, se eu nao modificar ela?
Gostei + 0
13/01/2010
Fabio Mans
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
Gostei + 0
13/01/2010
Daniel Vieira
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);
}
}
Gostei + 0
13/01/2010
Fabio Mans
Gostei + 0
13/01/2010
Daniel Vieira
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?
Gostei + 0
13/01/2010
Fabio Mans
Gostei + 0
13/01/2010
Daniel Vieira
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);
}
}
Gostei + 0
14/01/2010
Fabio Mans
Gostei + 0
14/01/2010
Fabio Mans
Gostei + 0
14/01/2010
Daniel Vieira
Eu estou bem confuso com essa parte, nem sei como rodou!
Gostei + 0
14/01/2010
Fabio Mans
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)