Subrelatório no Jasper Soft Studio

2 respostas
G

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.

2 Respostas

L

Você está criando o relatório principal com uma conexão e criando o sub relatório com outra e esta segunda conexão não está dando certo.
Eu sou totalmente contra o uso de relatórios onde você passa a conexão JDBC e ele que se resolva. Prefiro utilizar os java beans e ter controle sobre o que vai ou não aparecer no relatório.
De qualquer forma, tente entender por quê a conexão do sub relatório está disparando isso java.sql.SQLException: Connection is not associated with a managed

G

Então Luis Augusto, identifiquei que este erro estava ocorrendo porque eu estava enviando uma conexão para o jasper e o subrelatório tinha uma consulta SQL atribuída, após remover a consulta do relatório o erro
"java.sql.SQLException: Connection is not associated with a managed" parou de acontecer.

O problema é que agora não está dando erro nenhum na console, o relatório principal abre normalmente mas não exibe o subrelatório. Para simplificar os testes não defini nenhum Text Field no subrelatório, apenas adicionei um Static Text.

Os Text Fields do relatório principal estão processando normalmente, desta forma a lista de monitoramentos está sendo enviada sem problemas mas o subrelatório não abre.

O que pode estar acontecendo?

Criado 22 de março de 2017
Ultima resposta 22 de mar. de 2017
Respostas 2
Participantes 2