Tenho um relatório no JasperReports
, está funcionando corretamente. Entretanto da forma em que está, passo apenas um parêmetro de cada tipo
da página para o relatório, a tela é conforme a imagem:
O que eu preciso agora é, poder enviar mais de um cliente
, por exemplo, para o relatório como parâmetro para a query . Ainda não consegui fazer. Uma idéia básica seria ter um botão ao lado da combo, que quando clicado enviaria o conteúdo desta para uma lista, algo assim e em seguida, esta lista de parâmetros enviada para o relatório. Mas não consegui implementar, então se alguém puder ajudar, obrigado.
Bean:
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;
}
}
Executor:
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;
}
}
Query no relatório:
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}
xhtml:
<ui:composition template="/WEB-INF/template/LayoutPadrao.xhtml"
xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:p="http://primefaces.org/ui">
<ui:define name="titulo">Relatório de entradas emitidas</ui:define>
<ui:define name="corpo">
<h:form id="frm">
<h1>Relatório de entradas emitidas</h1>
<p:messages autoUpdate="true" closable="true" />
<p:toolbar style="margin-top: 20px">
<p:toolbarGroup>
<p:commandButton value="EmitirPdf"
action="#{relatorioEntradasBean.emitirPdf}" ajax="false" />
<p:commandButton value="EmitirXls"
action="#{relatorioEntradasBean.emitirXls}" ajax="false" />
</p:toolbarGroup>
</p:toolbar>
<p:panelGrid columns="7" id="painel"
style="width: 100%; margin-top: 20px" columnClasses="rotulo, campo">
<p:outputLabel value="Data de criação" />
<h:panelGroup>
<p:calendar value="#{relatorioEntradasBean.dataInicio}"
label="Data inicial" pattern="dd/MM/yyyy" size="8" />
<p:spacer width="8" />
<h:outputText value="a" />
<p:spacer width="8" />
<p:calendar value="#{relatorioEntradasBean.dataFim}"
label="Data final" pattern="dd/MM/yyyy" size="8" />
</h:panelGroup>
<h:panelGroup>
<p:outputLabel value="Cliente" for="cliente" />
<p:autoComplete id="cliente" size="40" dropdown="true"
value="#{relatorioEntradasBean.cliente}"
completeMethod="#{cadastroEntradaBean.completarCliente}"
var="cliente" itemLabel="#{cliente.nome}" itemValue="#{cliente}"
forceSelection="true" />
</h:panelGroup>
<p:outputLabel value="Status" />
<h:panelGroup>
<p:selectOneMenu id="statusEntrada"
value="#{relatorioEntradasBean.statusEntrada}">
<f:selectItem itemLabel="Selecione" />
<f:selectItems value="#{enumProviderStatus.statusEntradas}"
var="statusEntrada" itemValue="#{statusEntrada}"
itemLabel="#{statusEntrada.descricao}" />
</p:selectOneMenu>
</h:panelGroup>
</p:panelGrid>
</h:form>
</ui:define>
</ui:composition>