JasperReports传递参数

时间:2016-09-24 16:28:48

标签: mysql jsf jasper-reports

我在JasperReports有一份报告,它运作正常。但是,我只将type cliente的一个参数传递给报告,而我现在想要的是传递多个参数。该页面如下图所示,一个基本想法是有一个按钮(可能),每次点击{{1}时,都会发送<p:selectOneMenu类型cliente的内容,而不是发送到报告。我还没能做到,所以我要求帮助。

inserir a descrição da imagem aqui

豆:

map of parameters

执行人:

import java.io.Serializable;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

import javax.enterprise.context.RequestScoped;
import javax.faces.context.FacesContext;
import javax.inject.Inject;
import javax.inject.Named;
import javax.persistence.EntityManager;
import javax.servlet.http.HttpServletResponse;
import javax.validation.constraints.NotNull;

import org.hibernate.Session;

import com.rodrigo.controleacidentes.model.Cliente;
import com.rodrigo.controleacidentes.model.StatusEntrada;
import com.rodrigo.controleacidentes.util.jsf.FacesUtil;
import com.rodrigo.controleacidentes.util.report.ExecutorRelatorioPdf;
import com.rodrigo.controleacidentes.util.report.ExecutorRelatorioXls;

@Named
@RequestScoped
public class RelatorioEntradasBean implements Serializable {

    private static final long serialVersionUID = 1L;

    private Date dataInicio;
    private Date dataFim;
    private Cliente cliente;
    private StatusEntrada statusEntrada;

    public StatusEntrada getStatusEntrada() {
        return statusEntrada;
    }

    public void setStatusEntrada(StatusEntrada statusEntrada) {
        this.statusEntrada = statusEntrada;
    }

    public void teste(StatusEntrada st) {
        // StatusEntrada entrada = StatusEntrada.valueOf(st);
        System.out.println("TESTE: " + st);
    }

    @Inject
    private FacesContext facesContext;

    @Inject
    private HttpServletResponse response;

    @Inject
    private EntityManager manager;

    public void emitirXls() {
        Map<String, Object> parametros = new HashMap<>();
        parametros.put("data_inicio", this.dataInicio);
        parametros.put("data_fim", this.dataFim);
        if (cliente != null) {

            System.out.println("TESTE: " + cliente.getNome());
            parametros.put("nome_cliente", cliente.getNome());
        }
        if (statusEntrada != null) {
            System.out.println("TESTE :" + statusEntrada.getDescricao());
            parametros.put("status_entrada", statusEntrada.getDescricao());

        }

        ExecutorRelatorioXls executor = new ExecutorRelatorioXls("/relatorios/RelatorioEntradasNome.jasper",
                this.response, parametros, "Relatório Entradas.xls");

        Session session = manager.unwrap(Session.class);
        session.doWork(executor);

        if (executor.isRelatorioGerado()) {
            facesContext.responseComplete();
        } else {
            FacesUtil.addErrorMessage("A execução do relatório não retornou dados.");
        }
    }

    public void emitirPdf() {
        Map<String, Object> parametros = new HashMap<>();
        parametros.put("data_inicio", this.dataInicio);
        parametros.put("data_fim", this.dataFim);
        parametros.put("nome_cliente", this.cliente);

        ExecutorRelatorioPdf executor = new ExecutorRelatorioPdf("/relatorios/RelatorioEntradasNome.jasper",
                this.response, parametros, "Relatório Entradas.pdf");

        Session session = manager.unwrap(Session.class);
        session.doWork(executor);

        if (executor.isRelatorioGerado()) {
            facesContext.responseComplete();
        } else {
            FacesUtil.addErrorMessage("A execução do relatório não retornou dados.");
        }
    }

    @NotNull
    public Date getDataInicio() {
        return dataInicio;
    }

    public void setDataInicio(Date dataInicio) {
        this.dataInicio = dataInicio;
    }

    @NotNull
    public Date getDataFim() {
        return dataFim;
    }

    public void setDataFim(Date dataFim) {
        this.dataFim = dataFim;
    }

    @NotNull
    public Cliente getCliente() {
        return cliente;
    }

    public void setCliente(Cliente cliente) {
        this.cliente = cliente;
    }

}

报告中的查询:

import java.io.InputStream;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Locale;
import java.util.Map;

import javax.servlet.http.HttpServletResponse;

import org.hibernate.jdbc.Work;

import net.sf.jasperreports.engine.JRParameter;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.export.JRXlsExporter;
import net.sf.jasperreports.engine.export.JRXlsExporterParameter;

public class ExecutorRelatorioXls implements Work {

    private String caminhoRelatorio;
    private HttpServletResponse response;
    private Map<String, Object> parametros;
    private String nomeArquivoSaida;

    private boolean relatorioGerado;

    public ExecutorRelatorioXls(String caminhoRelatorio, HttpServletResponse response, Map<String, Object> parametros,
            String nomeArquivoSaida) {
        this.caminhoRelatorio = caminhoRelatorio;
        this.response = response;
        this.parametros = parametros;
        this.nomeArquivoSaida = nomeArquivoSaida;

        this.parametros.put(JRParameter.REPORT_LOCALE, new Locale("pt", "BR"));
    }

    @Override
    public void execute(Connection connection) throws SQLException {
        try {
            InputStream relatorioStream = this.getClass().getResourceAsStream(this.caminhoRelatorio);

            JasperPrint print = JasperFillManager.fillReport(relatorioStream, this.parametros, connection);
            this.relatorioGerado = print.getPages().size() > 0;

            if (this.relatorioGerado) {
                JRXlsExporter exportador = new JRXlsExporter();
                exportador.setParameter(JRXlsExporterParameter.OUTPUT_STREAM, response.getOutputStream());
                exportador.setParameter(JRXlsExporterParameter.JASPER_PRINT, print);

                exportador.setParameter(JRXlsExporterParameter.IS_ONE_PAGE_PER_SHEET, Boolean.FALSE);
                exportador.setParameter(JRXlsExporterParameter.IS_REMOVE_EMPTY_SPACE_BETWEEN_ROWS, Boolean.TRUE);
                exportador.setParameter(JRXlsExporterParameter.IS_WHITE_PAGE_BACKGROUND, Boolean.FALSE);

                response.setHeader("Content-Transfer-Encoding", "Cp1256");
                response.setContentType("application/vnd.ms-excel");
                response.setHeader("Content-Disposition", "attachment; filename=\"" + this.nomeArquivoSaida + "\"");

                exportador.exportReport();
            }
        } catch (Exception e) {
            throw new SQLException("Erro ao executar relatório " + this.caminhoRelatorio, e);
        }
    }

    public boolean isRelatorioGerado() {
        return relatorioGerado;
    }

}

XHTML:

SELECT DISTINCT
     ocorrencia.`id` AS ocorrencia_id,
     ocorrencia.`descricao` AS ocorrencia_descricao,
     ocorrencia.`condicao_tempo` AS ocorrencia_condicao_tempo,
     ocorrencia.`data_ocorrencia` AS ocorrencia_data_ocorrencia,
     ocorrencia.`periodo_ocorrencia` AS ocorrencia_periodo_ocorrencia,
     ocorrencia.`condutor_id` AS ocorrencia_condutor_id,
     condutor.`id` AS condutor_id,
     condutor.`codigo` AS condutor_codigo,
     condutor.`nome` AS condutor_nome,
     entrada_acidente.`id` AS entrada_acidente_id,
     entrada_acidente.`data_criacao` AS entrada_acidente_data_criacao,
     entrada_acidente.`ocorrencia_id` AS entrada_acidente_ocorrencia_id,
     entrada_acidente.`valor_unitario` AS entrada_acidente_valor_unitario,
     cliente.`id` AS cliente_id,
     cliente.`nome` AS cliente_nome,
     entrada_acidente.`status` AS entrada_acidente_status
FROM
     `condutor` condutor INNER JOIN `ocorrencia` ocorrencia ON condutor.`id` = ocorrencia.`condutor_id`
     INNER JOIN `entrada_acidente` entrada_acidente ON ocorrencia.`id` = entrada_acidente.`ocorrencia_id`
     INNER JOIN `cliente` cliente ON entrada_acidente.`cliente_id` = cliente.`id`
WHERE
     entrada_acidente.`data_criacao` BETWEEN $P{data_inicio} AND $P{data_fim}
 AND cliente.`nome` = $P{nome_cliente}
 AND entrada_acidente.`status` = $P{status_entrada}

0 个答案:

没有答案