Bom dia. Por acaso alguém saberia dizer se há possibilidade de passar a base de dados como parâmetro para o relatório JasperReport?
A questão é, por exemplo: a empresa tem vários clientes, e para não ter que implantar cada relatório em uma base de dados diferente, pegaria e implantaria passando a base de dados (banco de dados) como parâmetro.
Pesquisei e vi que há algo semelhante a fazer quando de cria um subrelatório. Mas no meu caso, gostaria tipo, de passar para cliente A, bancoClienteA e cliente B o bancoClienteB por parâmetro. Desta forma, não precisaria criar relatórios iguais para bases diferentes.
Se alguém puder ajudar, agradeceria muito.
Inicie com uma idéia neste fórum:
https://groups.google.com/forum/#!topic/jasperreports-ireport-brasil/K5jlZHApREw
Porém, o cara mencionou que não tem acesso a como eles fazem na empresa nesta parte que eu precisaria sobre o relatório.
Esses relatórios são chamados por uma aplicação web, certo? E o SQL da consulta fica no próprio relatorio também, certo?
Bom, quando você vai gerar o JasperPrint do relatório, você passar o objeto Connection que você criou pra conexão especifica que você quer:
JasperPrint jp = JasperFillManager.fillReport(#PATH_JASPER#,#PARAMETERS#,#CONNECTION#);
Certo. Estamos desenvolvendo em c#.
Fizemos da seguinte maneira @Oni_Humura, estamos desenvolvendo ele em c#:
public FileJasperReport GenerateReport(EnumFormatoArquivo format, Dictionary<string, string> parameters, string report) {
var config = _relatorioApp.GetObject(x => x.Padrao);
var file = new FileJasperReport();
var jasperserverRestClient = new JasperserverRestClient(config.UsuarioRelatorio, config.SenhaRelatorio, config.UrlServidor);
file.MimeType = MimeTypes.PDF;
file.NomeArquivo = ".pdf";
switch (format) {
case EnumFormatoArquivo.CSV:
file.MimeType = MimeTypes.CSV;
file.NomeArquivo = ".csv";
break;
case EnumFormatoArquivo.DOCX:
file.MimeType = MimeTypes.DOCX;
file.NomeArquivo = ".docx";
break;
case EnumFormatoArquivo.HTML:
file.MimeType = MimeTypes.HTML;
file.NomeArquivo = ".html";
break;
case EnumFormatoArquivo.ODS:
file.MimeType = MimeTypes.ODS;
file.NomeArquivo = ".ods";
break;
case EnumFormatoArquivo.ODT:
file.MimeType = MimeTypes.ODT;
file.NomeArquivo = ".odt";
break;
case EnumFormatoArquivo.PDF:
file.MimeType = MimeTypes.PDF;
file.NomeArquivo = ".pdf";
break;
case EnumFormatoArquivo.RTF:
file.MimeType = MimeTypes.RTF;
file.NomeArquivo = ".rtf";
break;
case EnumFormatoArquivo.TXT:
file.MimeType = MimeTypes.TXT;
file.NomeArquivo = ".txt";
break;
case EnumFormatoArquivo.XLS:
file.MimeType = MimeTypes.XLS;
file.NomeArquivo = ".xls";
break;
case EnumFormatoArquivo.XLSX:
file.MimeType = MimeTypes.XLSX;
file.NomeArquivo = ".xlsx";
break;
}
file.NomeArquivo = report + file.NomeArquivo;
file.ConteudoArquivo = ConvertStream(jasperserverRestClient.Get(config.PathRelatorio + file.NomeArquivo,parameters));
return file;
}
e em nosso Controller:
[HttpPost]
public async Task<ActionResult> Report(EnumFormatoArquivo tipo) {
var jasper = new JasperReport(_relatorioApp);
//parametros
var parameters = new Dictionary<string, string>();
//parameters.Add("REPORT_DATA_SOURCE", "jdbc:sqlserver://192.168.1.14/SQL;databasename=ControleDB");
parameters.Add("ParametroTeste", "teste 123456");
parameters.Add("DescricaoLaudoP", "LAUDO"); // SELECT * FROM "Laudo" WHERE "Laudo"."DescrLaudo" LIKE $P{ DescricaoLaudoP}
var file = jasper.GenerateReport(tipo, parameters, "Laudos");
return File(file.ConteudoArquivo, file.MimeType, file.NomeArquivo);
}
Conseguiu entender? Se precisar de mais alguma informação, estou á disposição. Muito obrigado pela ajuda.
Com c# deve ter uma forma de enviar a conexão, assim como fazemos no Java. Dessa forma você conseguirá utilizar o mesmo relatório para várias bases de dados (claro, desde que o modelo de dados seja o mesmo).
Sim @Lucas_Camara, acredito que sim. Isso que estou tentando descobrir… Postei o código de como estamos fazendo. Claro, estamos utilizando também o jasper Server para configuração.