Query IReport

12 respostas
hiarlay

Pessoal sou novo com esse brinquedo ai, estou com o relatório todo em ordem funcionando quando executo pelo ireport, e pel aplicação tbem, só que está uma query estatica dentro do ireport, tipo select * from aluno where codigo=2 como seria para passar esse código via aplicação, uma forma de concatenar não sei, alguem pode me ajudar? desde já agradeço
:roll:

12 Respostas

L

no ireport, existem os parametros, que podem ser passados via Map

perceba no seu codigo java, que quando vc cria o relatorio, existem metodos do jasperreports que recebem um objeto
parameters do tipo Map

vc pode cria-lo assim:

Map param = new HashMap();
param.put("codigo", 2);

la dentro do relatorio vc cria um parametro chamado codigo, do tipo Integer

e a sua query fica assim:

select * from aluno where codigo=$P{codigo}
hiarlay

Agora foi Obrigado.

hiarlay

Outra coisa, como faço pra passar o mesmo pra meu subrelatório?

arqueiros

dentro do Relatorio click com o botão direito no subRelatorio e selecione Properties, depois vai na aba Subreport(Other) click em add e insira no campo “Subreport parameter name” o valor parametro_codigo e no campo “Default Value Expression” insira no campo $P{parametro_codigo}

ficando assim

parametro_codigo    $P{parametro_codigo}

la dentro do subRelatorio vc cria um parametro chamado codigo, do tipo Integer

qualquer duvida é soh falar ae…

Kleber-rr
lauronolasco:
no ireport, existem os parametros, que podem ser passados via Map

perceba no seu codigo java, que quando vc cria o relatorio, existem metodos do jasperreports que recebem um objeto
parameters do tipo Map

vc pode cria-lo assim:
Map param = new HashMap();
param.put("codigo", 2);

la dentro do relatorio vc cria um parametro chamado codigo, do tipo Integer

e a sua query fica assim:
select * from aluno where codigo=$P{codigo}

Eae lauronolasco, td bem?

Estou com um problema desses. O meu método está assim:
public String imprimirRelatorio() {

		// parametros
		Map<String, Long> param = new HashMap<String, Long>();
		param.put("codOg", this.orgaogestor.getCod_orgaogestor());

		saida = null;
		System.out.println("metodo de impressao");
		String jasper = getDiretorioReal("/jasper/orgaogestor2.jasper");
		Connection conexao = null;
		try {

			// Abro a conex&#65533;o com o banco que ser&#65533; passada para o JasperReports
			conexao = new Conexao().getConexao();
			JRResultSetDataSource jrds = new JRResultSetDataSource(
					getResultSet(conexao));

			// Mando o jasper gerar o relat&#65533;rio
			JasperPrint print = JasperFillManager.fillReport(jasper, param,
					jrds);

			// Gero o PDF
			preenchePdf(print);
			System.out.println("pdf gerado");

		} catch (Exception e) {
			e.printStackTrace();
			System.out.println("erro: " + e);
		} finally {
			try {
				// // Sempre mando fechar a conex&#65533;o, mesmo que tenha dado erro
				if (conexao != null)
					conexao.close();
			} catch (Exception e) {

			}
		}

		return "exibeRelatorio";

	}
na pagina xhtml, o commandLink está assim:
<rich:dataTable value="#{orgaogestorHandler.orgaosGestoresByNome}" var="f" rendered="#{not empty orgaogestorHandler.orgaosGestoresByNome}" rows="5" id="orgaosGestoresByNome">
//...
		<h:column>
			<f:facet name="header">
				<h:outputText value="Relatório"/>
			</f:facet>
			<center>
			<h:commandLink target="_blank" value="PDF" id="pdf" action="#{orgaogestorHandler.imprimirRelatorio}"/>
			<f:param id="codOg" name="cod" value="#{f.cod_orgaogestor}"/>				
		</center>
		</h:column>
/...

A minha rich:datatable me retorna uma list com os resultados, e cada resultado tem um id na tabela... preciso que seja capturado o id da linha que eu cliquei para que me retorne somente o relatorio daquela linha, o que nao está acontecendo...

Alguma dica??

Vlw

L

No java web vc tem de usar um servlet pra retornar o arquivo pro cliente.
Veja este exemplo:

http://javafree.uol.com.br/artigo/868482/Relatorio-iReport-+-Servlet-+-JSP.html

Kleber-rr

lauronolasco:
No java web vc tem de usar um servlet pra retornar o arquivo pro cliente.
Veja este exemplo:

http://javafree.uol.com.br/artigo/868482/Relatorio-iReport-+-Servlet-+-JSP.html

O problema é que eu já uso a servlet do Faces, e provavelmente, dará pau na aplicação…
:frowning:
Outra alternativa?

L

Não da pau.
Vc só precisa adicionar no seu web.xml esse trecho:

<servlet> <servlet-name>ServletRelatorio</servlet-name> <servlet-class>controller.ServletRelatorio</servlet-class> </servlet> <servlet-mapping> <servlet-name>ServletRelatorio</servlet-name> <url-pattern>/servletRelatorio</url-pattern> </servlet-mapping>

Para visualizar o relatório, vc põe um link para:
http://localhost:8080/NomeDaAplicacao/servletRelatorio?parametro1=x&parametro2=y

Kleber-rr

lauronolasco:
Não da pau.
Vc só precisa adicionar no seu web.xml esse trecho:

<servlet> <servlet-name>ServletRelatorio</servlet-name> <servlet-class>controller.ServletRelatorio</servlet-class> </servlet> <servlet-mapping> <servlet-name>ServletRelatorio</servlet-name> <url-pattern>/servletRelatorio</url-pattern> </servlet-mapping>

Para visualizar o relatório, vc põe um link para:
http://localhost:8080/NomeDaAplicacao/servletRelatorio?parametro1=x&parametro2=y

Rapá, só agora eu vi q tu é meu conterrâneo!! hehheehe. Vou testar aqui e depois te falo. Vlw.

L

Vc tbm é de Conquista?

Mora onde?

Kleber-rr

lauronolasco:
Vc tbm é de Conquista?

Mora onde?


bvb

msn!!!

Kleber-rr
Pessoal, fiz um teste para para ver se minha ultima alteração estava pegando o id do objeto para enviar ao jasperreports e ficou assim:
public String imprimirRelatorio2(ActionEvent event) {

		// pegar objeto com actionEvent
		UIComponent link = event.getComponent();
		UIParameter parametro = (UIParameter) link.findComponent("printCod");
		Long id = (Long) parametro.getValue();

		// parametros
		Map param = new HashMap();
		param.put("codOg", id);
		System.out.println("codOg= " + id); //PARA VER SE REALMENTE PEGA O ID DO OBJETO

		saida = null;
		System.out.println("metodo de impressao");
		String jasper = getDiretorioReal("/jasper/orgaogestor2.jasper");
		Connection conexao = null;
		try {

			// Abro a conex&#65533;o com o banco que ser&#65533; passada para o JasperReports
			conexao = new Conexao().getConexao();
			JRResultSetDataSource jrds = new JRResultSetDataSource(
					getResultSet(conexao));

			// Mando o jasper gerar o relat&#65533;rio
			JasperPrint print = JasperFillManager.fillReport(jasper, param,
					jrds);

			// Gero o PDF
			preenchePdf(print);
			System.out.println("pdf gerado");

		} catch (Exception e) {
			e.printStackTrace();
			System.out.println("erro: " + e);
		} finally {
			try {
				// // Sempre mando fechar a conex&#65533;o, mesmo que tenha dado erro
				if (conexao != null)
					conexao.close();
			} catch (Exception e) {

			}
		}

		return "exibeRelatorio";

	}
na pagina xhtml ficou assim:
&lt;h:commandLink value="PDF" id="pdf" actionListener="#{orgaogestorHandler.imprimirRelatorio2}"/&gt;
			&lt;f:param id="printCod" name="cod" value="#{f.cod_orgaogestor}"/&gt;
O resultado no console foi:
Hibernate: 
    select
...
codOg= 30
metodo de impressao
getDireitorioReal
conexao relatorio
getDireitorioReal
getContextPath
pdf gerado

Como pode ver, ele carrega o método, passa o parametro mas na prática, naum acontece nada... o relatorio naum é exibido, e na página acontece um refresh.
O que pode ser???

Agradeço.

Criado 5 de março de 2010
Ultima resposta 6 de jul. de 2010
Respostas 12
Participantes 4