Relatórios no IReport 0.2.3 em site JSP

11 respostas
warley

Boa noite,

Eu estive estudando o IReport e consegui fazer vários relatórios legais usando banco de dados, no entanto eu não sei como fazer uma coisa:

Eu tenho uma pagina jsp que dá um select em uma tabela, e há outra tela em que o usuario pode inserir dados nesta mesma tabela.

No IReport, eu montei um relatório do tipo PDF, mas se o usuário adicionar informações no banco as novas informações não aparecem do relatório, pq eu apenas estou disponibilizando o arquivo pdf para ele.

Eu percebi que o IReport gera uma classe e junto alguns arquivos, mas eu não sei como usa-los em uma pagina jsp.

Eu estive pesquizando e descobri que tenho que colocar dentro da pasta classes, da minha aplicação, a classe e o arquivo .jasper que foi gerado pelo IReport e q tb tenho que colocar dentro da pasta LIB, da minha aplicação, todo o conteúdo da pasta LIB do IReport - que são as classes compactadas que ele usa.

Mas a minha dúvia MORTAL é a seguinte:
-> Como, em uma página jsp, eu faço para que o relatório fique atulizado, isto é, com os dados que o usuário acabou de inserir em uma tabela?
-> Como eu disponiblizo o arquivo .pdf para o usuário?
-> Como o IReport vai compilar ente arquivo? Se é que precisa.
-> Quais as classes do IReport tenho que importar?

Será que alguêm podera me ajudar?
Muito Obrigado!

11 Respostas

A

De uma olhada nos exemplos do JasperReports (não se esqueca q o iReports é só um GUI para ele)

warley

Sem querer pedir muito, será que vc poderia me mandar um exemplo prático?

Obrigado

A

Da uma olhada no codigo abaixo

<%@page import="negocio.Conn" %>
<%@page import="dori.jasper.engine.*" %>
<%@page import="java.io.*" %>
<%@page import="java.util.*" %>
<%@page import="java.sql.*" %>

<%
String id       = request.getParameter("id");

Conn con = null;
Connection connection = null;

try {
   con = new Conn();
   Statement stmt = con.getStatement();
   connection = stmt.getConnection();

   File reportFile = new File(application.getRealPath("/reports/slip_cdsettle.jasper"));

   Map parameters = new HashMap();
   parameters.put("pcd_slip", id);
   parameters.put("pdirectory", application.getRealPath(""));

   byte[] bytes =
     JasperRunManager.runReportToPdf(reportFile.getPath(), parameters, connection);

   response.setContentType("application/pdf");
   response.setContentLength(bytes.length);
   ServletOutputStream ouputStream = response.getOutputStream();
   ouputStream.write(bytes, 0, bytes.length);
   ouputStream.flush();
   ouputStream.close();
}
catch(Exception e){
    response.sendRedirect("msg_err.jsp");
} // catch
finally {
   if (con != null) con.closeStatement();
}
%>
warley

Pô cara, vc salvou a minha vida!!!

Valeu!

Eu estou no trabalho e vou pra casa para testar!!!

Valeu, Brigadão mesmo!!!

A

Qq coisa chama aeee

warley

Pó, rolou uma dúvida apora que é a seguinte:

O pacote “negocio.Conn” é fictício ou eu sou obrigado a usar?

Eu tenho que cologar os arquivos que ele gerar dentro da pasta classes da minha aplicação e tb os arquios .jar que estão na pasta LIB do IReport?

Valeu mais uma vez!

A

Sim, o pacote negocio.Conn faz parte da minha aplicação, vc nao vai usá-la nao. Quanto as libs pode colocar todas sim na pasta lib do WEB-INF, sem problemas, os arquivos .jasper q são os importantes para a aplicação devem estar em um lugar acessivel pelo sistema.

warley

Qual seria o conteúdo da variável id?

No aruivo que foi criado pelo IReport já foi informada a tabela que eu quero os dados, será que na conexão eu tenho que informar novamente?

A

Neste relatorio espesificamente eu passo dois paramentros que são recebidos pelo relatorio, um é o id que eu uso como filto do meu relatorio em algo do tipo

<queryString><![CDATA[SELECT
    LOAN.*,
   S_BOR.SUB_ACCOUNT_NAME AS SUB_ACC_BORROW,
   S_COU.SUB_ACCOUNT_NAME AS SUB_ACC_COUNTER
FROM
(LOAN INNER JOIN SUBACCOUNTS S_BOR ON LOAN.LOAN_BORROWER = S_BOR.SUB_ACCOUNT_ID)
INNER JOIN SUBACCOUNTS S_COU ON LOAN.LOAN_COUNTERPARTY = S_COU.SUB_ACCOUNT_ID
where loan.loan_slip = $P{pcd_slip}]]></queryString>

o outro parametro é usado pq eu exibo uma imagem e essa imagem é buscada em run-time para montagem do pdf entao eu preciso saber o path de onde ela se encontra

<parameter name="pdirectory" isForPrompting="false" class="java.lang.String"> <defaultValueExpression><![CDATA["C:\jakarta-tomcat-4.1.10\webapps\assets"]]></defaultValueExpression> </parameter>
Da conexão, sim, vc precisa passar sim, aquela é a que o ireport gera para desenho do relatorio, o jasper precisa do caminho para chegar ao banco.

A

Neste relatorio espesificamente eu passo dois paramentros que são recebidos pelo relatorio, um é o id que eu uso como filto do meu relatorio em algo do tipo

<queryString><![CDATA[SELECT
    LOAN.*,
   S_BOR.SUB_ACCOUNT_NAME AS SUB_ACC_BORROW,
   S_COU.SUB_ACCOUNT_NAME AS SUB_ACC_COUNTER
FROM
(LOAN INNER JOIN SUBACCOUNTS S_BOR ON LOAN.LOAN_BORROWER = S_BOR.SUB_ACCOUNT_ID)
INNER JOIN SUBACCOUNTS S_COU ON LOAN.LOAN_COUNTERPARTY = S_COU.SUB_ACCOUNT_ID
where loan.loan_slip = $P{pcd_slip}]]></queryString>

o outro parametro é usado pq eu exibo uma imagem e essa imagem é buscada em run-time para montagem do pdf entao eu preciso saber o path de onde ela se encontra

<parameter name="pdirectory" isForPrompting="false" class="java.lang.String"> <defaultValueExpression><![CDATA["C:\jakarta-tomcat-4.1.10\webapps\assets"]]></defaultValueExpression> </parameter>
Da conexão, sim, vc precisa passar sim, aquela é a que o ireport gera para desenho do relatorio, o jasper precisa do caminho para chegar ao banco.

warley

Cara, desculpa pela minha insistência, mas é que eu estou apanhando até hoje para conseguir montar um relatório, acredita?

Bom, eu estou querendo contar um relatório simples só para testar!

Neste relatório deve pegar informações de uma tabela chamada Aluno que possui dois campos (Codigo e Nome), então eu crio uma string com o nome de query e passo para esta string um código sql (Select codigo, nome from Aluno ), mas o quê eu não estou conseguindo saber é o local onde colocar esta string query e nem o quê eu tenho que passar para a variável parameters . Ela é usada para eu carregar uma imagem para colocar no relatório? Se for, como eu especifico o local do relatório ele irá ficar, ou se ele vai ficar do lado direito o do esquerdo?

Eu estou mandando o meu código para você dar analisar melhor:

<%@ page contentType=“text/html; charset=iso-8859-1” language=“java” errorPage="" %>

<%<a class="mention" href="/u/page">@page</a> import=“dori.jasper.engine.<em>" %>

<%<a class="mention" href="/u/page">@page</a> import="<a href="http://java.io">java.io</a>.</em>” %>

<%<a class="mention" href="/u/page">@page</a> import=“java.util.<em>" %>

<%<a class="mention" href="/u/page">@page</a> import="java.sql.</em> %>

<%

String url = "jdbc:odbc:teste";
String usuario = "";
String senha = "";

try {

		Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");

	Connection con;
	con = DriverManager.getConnection(url, usuario, senha);

	Statement stm = con.createStatement();
	
	File reportFile = new File(application.getRealPath("slip_cdsettle.jasper"));
	
	out.println("Conexão OK <br>");

	String query = " Select codigo,nome from Aluno"; // onde ficará esta query

	
	Map parameters = new HashMap();
	parameters.put( ); // o q eu devo colocar aqui?
	
	byte[] bytes = JasperRunManager.runReportToPdf(reportFile.getPath(), parameters, con); 

	response.setContentType("application/pdf"); 
	response.setContentLength(bytes.length); 
	ServletOutputStream ouputStream = response.getOutputStream(); 
	ouputStream.write(bytes, 0, bytes.length); 
	ouputStream.flush(); 
	ouputStream.close(); 


}
catch(Exception e){ 
		out.print("Warley de Erro! (ESTUDA)"); 
}

%>

Se vc puder me ajudar eu ficarei eternamente grato!

Mas de qualquer forma muito obrigado!

Criado 16 de março de 2004
Ultima resposta 22 de mar. de 2004
Respostas 11
Participantes 2