Pessoal,
Estou tendo alguns problemas para configurar um relatório contendo subrelatório, informo que realizei diversas pesquisas a respeito mas não foi encontrada nenhuma solução direta que ajudasse a resolver.
As configurações do ambiente são as seguintes:
Versão do Java: 1.8.0_112
IDE do Relatório: Jasper Soft Studio versão 6.3.1
Biblioteca do Maven
<dependency>
<groupId>net.sf.jasperreports</groupId>
<artifactId>jasperreports</artifactId>
<version>6.3.1</version>
</dependency>
Inicialmente tentei enviar uma lista para o relatório que funcionou normalmente da seguinte forma:
Implementação Java processando a consulta na aplicação:
List<Monitoramento> monitoramentos = this.documentoEletronicoService.obterMonitoramentosNUD();
if(!monitoramentos.isEmpty()){
for (Monitoramento monitoramento : monitoramentos) {
monitoramento.setEventosNFE(this.documentoEletronicoService.obterEventosNFE());
}
StringBuilder jasperFile = new StringBuilder("");
jasperFile.append(JASPER_PATH);
jasperFile.append(MONITORAMENTO_JASPER_FILE);
StringBuilder jrPrintFile = new StringBuilder("");
jrPrintFile.append(JASPER_PATH);
jrPrintFile.append(MONITORAMENTO_JRPRINT_FILE);
processarRelatorioMonitoramento(monitoramentos, obterParametros(), jasperFile.toString(), jrPrintFile.toString());
}
private void processarRelatorioMonitoramento(List<Monitoramento> monitoramentos, Map<String, Object> parametros, String jasperFile, String jrPrintFile) {
StringBuilder msg = new StringBuilder("");
try {
String reportUrlReal = obterExternalContext().getRealPath(jasperFile);
String pdfFilePath = obterExternalContext().getRealPath(jrPrintFile);
JasperFillManager.fillReportToFile(reportUrlReal, parametros, new JRBeanCollectionDataSource(monitoramentos));
JasperExportManager.exportReportToPdfFile(pdfFilePath);
} catch (Exception e) {
msg.append("Erro ao gerar relarório de monitoramento ");
logger.error(msg.append(e.getMessage()));
FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, e.getMessage(), ""));
}
}
Porém quando incluo o subrelatório apresenta o seguinte erro:
java.sql.SQLException: Connection is not associated with a managed connection.org.jboss.jca.adapters.jdbc.jdk6.WrappedConnectionJDK6@285b0645
Informo que tanto o Eclipse quando o Jasper Soft Studio estão configurados apontando para o jdk 1.8
Resolvi configurar a conexão do Jasper Soft Studio com a base de dados DB2 e a conexão funcionou normalmente, trouxe as consultas para dentro do relatório principal e
o subrelatório. Gerei os campos automaticamente pelo jasper soft studio e ao previsualizar funciona perfeitamente exibindo tanto o relatório quanto o sub relatório
com os dados porém quando tento executar pela aplicação está apresentando o seguinte erro
Exceção
ERROR Error preparing statement for executing the report query:
SELECT
P.CPF_CNPJ CNPJ_ENTIDADE_CREDITO,
P.NOME NOME_ENTIDADE_CREDITO,
T.ID_NFE CHAVE_ACESSO,
NFEM.NUMERO_PROTOCOLO PROTOCOLO_AUTORIZACAO,
NFEM.DATA_AUTORIZACAO DATA_AUTORIZACAO,
MNFE.OBSERVACAO STATUS_ATUAL_NFE,
LPAD(R.NR_CNPJ_CEDENTE,14,0) || LPAD(R.ID_REGISTRO_UNICO,10,0) || LPAD(R.NR_CPFCNPJ_SACADO,14,0) NUD
FROM PUBLIC.TITULO T
INNER JOIN PUBLIC.PESSOA P ON (T.FK_ID_CONSULTORA = P.ID)
INNER JOIN PUBLIC.NFE_MONITORADA NFEM ON (T.ID_NFE = NFEM.CHAVE_ACESSO AND NFEM.ID = (SELECT MAX(ID) FROM PUBLIC.NFE_MONITORADA NFEM WHERE CHAVE_ACESSO = T.ID_NFE))
INNER JOIN PUBLIC.NFE_MONITORADA_MONITORAMENTO NFEMM ON (NFEM.ID = NFEMM.FK_ID_NFE_MONITORADA)
INNER JOIN PUBLIC.MONITORAMENTO_NFE MNFE ON (NFEMM.FK_ID_MONITORAMENTO = MNFE.ID)
INNER JOIN PUBLIC.REGISTRO R ON (T.FK_ID_REGISTRO_UNICO = R.ID_REGISTRO_UNICO)
WHERE T.ID = 9736334
Informo que a consulta acima é a executada pelo relatório principal, modifiquei para uma consulta bem básica para testar mesmo assim o erro permanesce
Implementação Java processando a consulta dentro do jasper soft studio
public static final String MONITORAMENTO_JASPER_FILE = "monitoramentoNUD.jasper";
public static final String MONITORAMENTO_JRPRINT_FILE = "monitoramento.jrprint";
public static final String JASPER_PATH = "\\WEB-INF\\classes\\jasper\\";
public static final String JASPER_IMG_PATH = "\\WEB-INF\\classes\\img\\logo.png";
public void obterRelatorioMonitoramento() {
StringBuilder jasperFile = new StringBuilder("");
jasperFile.append(JASPER_PATH);
jasperFile.append(MONITORAMENTO_JASPER_FILE);
StringBuilder jrPrintFile = new StringBuilder("");
jrPrintFile.append(JASPER_PATH);
jrPrintFile.append(MONITORAMENTO_JRPRINT_FILE);
processarRelatorioMonitoramento(obterParametros(), jasperFile.toString(), jrPrintFile.toString());
}
private void processarRelatorioMonitoramento(Map<String, Object> parametros, String jasperFile, String jrPrintFile) {
StringBuilder msg = new StringBuilder("");
try {
String reportUrlReal = obterExternalContext().getRealPath(jasperFile);
String pdfFilePath = obterExternalContext().getRealPath(jrPrintFile);
JasperFillManager.fillReportToFile(reportUrlReal, parametros);
JasperExportManager.exportReportToPdfFile(pdfFilePath);
} catch (Exception e) {
msg.append("Erro ao gerar relarório de monitoramento ");
logger.error(msg.append(e.getMessage()));
FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, e.getMessage(), ""));
}
}
private Map<String, Object> obterParametros() {
Map<String, Object> parametros = new HashMap<String, Object>();
parametros.put("logoPath", obterExternalContext().getRealPath(JASPER_IMG_PATH));
parametros.put("REPORT_CONNECTION", this.documentoEletronicoService.obterConexao());
return parametros;
}
public Connection obterConexao(){
Session session = em.unwrap(Session.class);
MyWork myWork = new MyWork();
session.doWork(myWork);
return myWork.getConnection();
}
private static class MyWork implements Work {
Connection conn;
@Override
public void execute(Connection arg0) throws SQLException {
this.conn = arg0;
}
Connection getConnection() {
return conn;
}
}
Agradeço a colaboração, qualquer orientação será bem vinda.