Ireport - Como passa parâmetro junto com o HashMap dos Fields ?

10 respostas
R

Olá desenvolvedores, estou com dificuldades em manipular parâmetros (filtros) nos meus relatórios do iReport.

Eu passo os fields a seerm preechidos via HashMap e então queria saber como passo parâmetros também. Abaixo segue um exemplo dos códigos usados para gerar o relatorio:

Classe relatório, para simplificar repetição de código

public class Relatorio {

    public void toPDF(JRDataSource jrDataSource, String jrxmlFile) {
        try {
            InputStream input = new FileInputStream(new File(jrxmlFile));
            JasperReport jasperReport = JasperCompileManager.compileReport(input);
            JasperPrint jasperPrint = JasperFillManager.fillReport(
                    jasperReport, null, jrDataSource);

            HttpServletResponse httpServletResponse = (HttpServletResponse) FacesContext.getCurrentInstance()
                    .getExternalContext().getResponse();
            httpServletResponse.addHeader("contentType", "application/pdf");
            ServletOutputStream servletOutputStream = httpServletResponse.getOutputStream();

            JasperExportManager.exportReportToPdfStream(jasperPrint, servletOutputStream);

            FacesContext.getCurrentInstance().responseComplete();
        } catch (Exception e) {
             e.printStackTrace();
        }
    }

}

Classe responsável por criar/enviar os campos da entidade para o relatório:

public class PragaReport {

    private PragaDAO pragaDao = new PragaDAO();
    private Object id;

    public List<Map<String, ?>> listarReport() {
        List<Map<String, ?>> result = new ArrayList<>();
        try {
            for (Praga p : pragaDao.read()) {
                Map<String, Object> m = new HashMap<>();
                m.put("id", p.getId());
                m.put("nome", p.getNome());
                m.put("porcentagemBaixa", p.getPorcentagemBaixa());
                m.put("porcentagemAlta", p.getPorcentagemAlta());
                m.put("id_usuario", p.getUsuario().getNomeUsuario());
                m.put("filtroID", "id");//essa linha não funciona
                result.add(m);
            }
            return result;
        } catch (Exception e) {
            return null;
        }
    } /*Getters e Setters omitidos*/

Método da classe PragaController que chama os métodos das classes acima e gera o relatório:

public void gerarRelatorio() {

        Relatorio relatorio = new Relatorio();
        PragaReport pr = new PragaReport();

        JRDataSource jrDataSource = new JRBeanCollectionDataSource(pr.listarReport());
        String jrxmlFile = FacesContext.getCurrentInstance()
                .getExternalContext().getRealPath("/reports/pragaReport.jrxml");

        relatorio.toPDF(jrDataSource, jrxmlFile);

    }

Botão para chamar o método:

<p:commandButton value="PDF" action="#{pragaController.gerarRelatorio()}"
                 onclick="this.form.target='_blank'" ajax="false" 
                 class="btn btn-default btn-sm" style="margin-bottom: 7px;" />

Se alguém puder me mostrar o caminho para criar filtros para o usuário preencher como intervalo de datas, filtro por id(que é oq tentei no exemplo) ficaria muito grato. Meu projeto ta parado por conta disso.

PS: um fato que acho curioso é que na maioria dos posts sobre iReport vejo o pessoal tratando o arquivo .jasper, e no meu caso eu apenas manipulo o .jrxml o .jasper sequer é gerado e o relatório funciona.

Segue também foto de como ta a hierarquia das classes, local onde o .jrxml é armazenado e layout do form.

Grato

10 Respostas

P

Olá Rafael ,
Após criar os fields e parametro no ireport vc faz o seguinte :
1 - Os fields no DataSource neste exemplo pode ser um arraylist.-> dscliente
2 - Os parametros em um hasmap, -> parametro
3 - O comando então ficaria assim :’

JasperPrint jasperPrint = JasperFillManager.fillReport(
jasperReport, parametro , dscliente);
P

Olá Rafael ,

Quando se opta por um conexão jdbc , criar as instruções sql no ireport , etc … é possivel executar o relatório através do preview e já ter noção de como relatório vai funcionar.

R

@pmauricio Obrigado pelo suporte.

No meu exemplo o DataSource é um arrayList denominado result.
Sendo assim, vejo que terei que deixar este arrayList ‘result’ apenas para mapear os fields e criar um no novo array -List parametros = new ArrayList<>();- para tratar os parâmetros, correto ?!

Uma dúvida que fica é na criação desses parametros, no meu ver será um hash e então quais o valoresque devo passar para o par (key, value) do parametro ?

Outra dúvida que tenho é em que lugar do relatório eu devo inserir o parametro (ex. Detail, header, footer, etc) ?

Grato pela ajuda!!

P

Olá Rafael ,

1.Conforme expliquei o datasorce é um arraylis com as informações dos clientes. O conteúdo do data source será impresso na seção detalhe o ireport.
2 Os parametro dependende do que vc criou no ireport. por exemplo.

nome do sistema , data inicio e data fim , logomarca , etc …

Ou seja cada parametro que vc criou tem que ter uma hasmap e o seu respectivo conteudo.

R

@pmauricio Ainda não esta muito claro Mauricio. Você pode ver na imagem que anexei ao post que meu $P{filtroID} estava no page Header, porém o correto é colocá-lo na banda detail, certo ?!

Pelo o que você me explicou eu alterei meu código e ficou assim

private Object id;

//metodo para carregar os atributos da classe para o ireport
public List<Map<String, ?>> listarReport() {
    List<Map<String, ?>> result = new ArrayList<>();
    try {
        for (Praga p : pragaDao.read()) {
            Map<String, Object> m = new HashMap<>();
            m.put("id", p.getId());
            m.put("nome", p.getNome());
            m.put("porcentagemBaixa", p.getPorcentagemBaixa());
            m.put("porcentagemAlta", p.getPorcentagemAlta());
            m.put("id_usuario", p.getUsuario().getNomeUsuario());
            result.add(m);
        }
        return result;
    } catch (Exception e) {
        return null;
    }
}
//metodo para criar os parametros,. no caso um filtro por id
public List<Map<String, ?>> parametros () {
    List<Map<String, ?>> params = new ArrayList<>();
    Map<String, String> m = new HashMap<>();
    m.put("filtroID", (String) id);
    params.add(m);
    
    return params;
}

A ideia no momento é realizar um filtro por Id, onde o usuário insere o id desejado e o relatório é gerado com o objeto daquele id correspondente, futuramente usarei filtro para data inicio e data fim também.

Se meu código tiver correto fico na dúvida se o trecho m.put("filtroID", (String) id); está correto e caso esteja correto como levá-lo até o relatório, tentei passar na linha JRDataSource jrDataSource = new JRBeanCollectionDataSource(pr.listarReport(), pr.parametros); mas o construtor de JRBeanCollectionDataSource só aceita um argumento.

Não sei se ficou claro, mas é assim: Devo criar uma lista para o dataSource e uma lista para Parametros (filtros) ? Se sim, como fazer o Hash dos parametros ? no código java, onde passar essas duas lista(ds e parametro) ?

Ps: meu dataSource vinda do método listarReport() ja funciona e gera o relatorio ok. A questão são os filtros mesmo.

Grato por ceder seu tempo me ajudando!

P

Olá Rafael ,

Utilizamos parametro para 2 coisas.

1 - Para colocar no cabeçalho do relatório por exemplo.
2 - Com filtro de um instrução sql.

Qual é o seu objetivo de colocar parametro ?

R

No atual momento é para um filtro na instrução SQL, é ai que ta o problema esse relatório que eu gerei em momento algum eu fiz o uso de SQL nem na aplicação java nem no iReport, passei os dados via uma lista com Hash.

Mas respondendo sua pergunta é um filtro para selecionar determinados objetos e não todos de uma vez, acredito que futuramente usarei algo para o cabeçalho do relatório também.

Grato!

P

Olá Rafael ,

Neste caso faça o seguinte :slight_smile:

1 - Crie as instruções sql e utilize os parametros que vc criou.
2 - Os fields automaticamente serão criado na secao detalhe.
3 - Teste o relatório no preview.
4 - Se tudo dê certo se preocupe em executar o rel. apartir da aplicação.

R

Olá @pmauricio,

As instruções devem ser criadas no ireport ou no código java ? o parametro criado no ireport deve ficar em qual banda no relatório ?

Obrigado

P

Olá Rafael ,

Opcionalmete as instruções devem ser criadas no ireport.

Sugiro vc pesq. tutorial na web ou livro ireport na casa de código.

Bons estudos ,
Tudo de bom ,
t+

Criado 4 de agosto de 2016
Ultima resposta 4 de ago. de 2016
Respostas 10
Participantes 2