Oi Leandro,
A questão não é nem milagre, rs. É que se eu não conseguir puxar os parâmetros na aplicação (sem chamá-los por código) como faço com o Crystal, eu não poderei usar o Jasper. Continuarei usando o Crystal. (ps: o motivo da troca do crystal por jasper é a performance).
Pesquisei aqui e caminhei um pouco, veja.
Usando esse código posso chamar um relatório na aplicação com o SQL definido no IReport (já que não passo um datasource no método de preenchimento do relatório):
Connection con = getConnection();
Map param = new HashMap();
JasperDesign jdesign = JRXmlLoader.load("c:/comissao.jrxml");
JasperReport jreport = JasperCompileManager.compileReport(jdesign);
JasperPrint jprint = JasperFillManager.fillReport(jreport, param, con);
JasperExportManager.exportReportToPdfFile(jprint, "c:/comissao.pdf");
O problema é que no SQL do IReport há um parâmetro, e como não especifico parâmetro nenhum ele adota o valor padrão para gerar o relatório. Eu poderia então definir um valor para o parâmetro no código, mas não quero isso. Quero que o prompt que aparece no IReport para o usuário preencher, quando dou um run, apareça também na aplicação, sem eu ter que programar nada. No Crystal é assim. Mas estou começando a achar que não existe essa possibilidade no Jasper.
Então pensei numa solução mais ou menos assim:
JRParameter[] jrp = jr.getParameters();
int x = 0;
while (x < jrp.length) {
if (jrp[x].isSystemDefined() == false) {
// Pedir para o usuário digitar o valor do parâmetro
// Colocar o valor digitado no HashMap
}
x++;
}
É uma solução pouco elegante, mas até agora vejo como única.
Vou continuar pesquisando e coloco aqui o final da história…
PS: Eu poderia criar uma tela fixa para passagem dos parâmetros pelo usuário, por exemplo data1, data2… mas são muitos relatórios e cada um deles tem parâmetros diferentes - teria que criar diversas telas. Por isso estou buscando recuperar esses parâmetros dinamicamente.