pessoal preciso criar uma impressao para um pedido e seus itens mas como faco para passar os dois objetos para o Datasource do jasper?
estou usando o hibernate,e bem simples tenho que mostra os dados do pedido como cliente,datavenda,condicao,e tds os seus itens,consegui fazer com jdbc mas com hibernate naum consigo alguem pode me dar umas dicas de como fazer?
obrigado.
Ireport
6 Respostas
olá fbarreto,
eu participei de um projeto e uma das minhas responsabilidades era gerar relatório no iReport. Depois de pegar alguns relatórios cascudos… vi que ele recebe arrayList para imprimir. A minha dica é, quando o bicho pega no iReport, monte isso em um List em seu código JAVA e passe esse List para o jasper. Isso ajuda muito na manutenção também, pois você não tem query nem regra de negócio em relatório, o que também é mal.
Espero ter ajudado,
abraços
pessoal preciso criar uma impressao para um pedido e seus itens mas como faco para passar os dois objetos para o Datasource do jasper?
estou usando o hibernate,e bem simples tenho que mostra os dados do pedido como cliente,datavenda,condicao,e tds os seus itens,consegui fazer com jdbc mas com hibernate naum consigo alguem pode me dar umas dicas de como fazer?
obrigado.
Olá!
Vc não precisa passar os dois objetos para o Datasource do jasper. Crie um único datasource que tenha as duas informações (a do pedido e a dos itens) e mande para o seu relatório. Lá vc pode fazer uma quebra pelo número de pedido, colocar as informações dos itens no detalhe e tudo fica lindinhu! 
Boa sorte!
Obrigada amigos,pelas dicas.
Alguem teria um exemplo de datasource para me mostrar,pois a maneira que estou usando eu peguei num site frances e esta funcionando porem he mto confuso.
api da classe que voce ira implementar
http://jasperreports.sourceforge.net/api/net/sf/jasperreports/engine/JRDataSource.html
tutorial sobre como fazer
http://www.javalobby.org/articles/hibernatequery103/
implementacao utilizando o hibernate
http://www.hibernate.org/79.html
dicas:
-
procure criar uma classe que represente o seu relatório de forma que ela não tenha tanta dependência com objetos, para quando for instanciar. (ganho de performance e objetos com mais granularidade = representam os dados que estão sendo trabalhados)
-
busque ao máximo utilizar recursos do ireport, de forma que a informação ja seja passada pronta para o relatório. lógico que não para todos os casos, em exceções voce terá que se beneficiar do ireport. em manutenção você terá um ganho e menos dores de cabeça.
-
em casos de muitos calculos, dentre bandas e agrupamentos, voce pode utilizar scriplet.
Vejam meu datasource ficou assim:
package com.Lgweb.Tcc.Relatorios.Vendas;
import java.util.Iterator;
import java.util.List;
import net.sf.jasperreports.engine.JRDataSource;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JRField;
public class DataSource implements JRDataSource {
private String[] fields;
private Iterator iterator;
private Object currentValue;
public DataSource(List list, String[] fields) {
this.fields = fields;
this.iterator = list.iterator();
}
public Object getFieldValue(JRField field) throws JRException {
Object value = null;
int index = getFieldIndex(field.getName());
if (index > -1) {
Object[] values = (Object[])currentValue;
value = values[index];
}
return value;
}
public boolean next() throws JRException {
currentValue = iterator.hasNext() ? iterator.next() : null;
return (currentValue != null);
}
private int getFieldIndex(String field) {
int index = -1;
for (int i = 0; i < fields.length; i++) {
if (fields[i].equals(field)) {
index = i;
break;
}
}
return index;
}
}
e estou tentando criar o relatorio assim:
package com.Barreto.Tcc.Relatorios.Vendas;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.faces.context.FacesContext;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperManager;
import net.sf.jasperreports.engine.JasperPrint;
import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.criterion.Order;
import com.Barreto.Tcc.Model.Pedido;
import com.Barreto.Tcc.Relatorios.ReportDataSourceImpl;
import com.Barreto.Tcc.Relatorios.ReportSource;
import com.Barreto.Tcc.Util.HibernateUtil;
public class RelatorioPedido {
public String relatorioContasReceber(){
try {
Session session = HibernateUtil.getInstance();
List pedido = (List) session.createQuery("from Produto,Itensvenda").list();
Map parameters = new HashMap();
parameters.put("titulo", "Pedido");
String[] fields = new String[] { "pedidoid", "clienteid", "usuarioid","datavenda",
"produtoid", "numeracaoid","quantidade", "valorproduto", "valortotal"};
DataSource ds = new DataSource(pedido,fields);
Map parametros = new HashMap();
parametros.put("VendasPeriodo", getPath() + "RelatorioPedido.jasper");
parametros.put("titulo", "Relatorio de Vendas por Periodo");
// Aqui ele cria o relatório
JasperPrint impressao = JasperFillManager.fillReport(getPath()
+ "RelatorioPedido.jasper", parametros, ds);
// Grava o relatório em disco em pdf
JasperManager.printReportToPdfFile(impressao, getPath()
+ "/RelatorioPedido.pdf");
// Redireciona para o pdf gerado
HttpServletResponse res = (HttpServletResponse) FacesContext
.getCurrentInstance().getExternalContext().getResponse();
@SuppressWarnings("unused")
HttpServletRequest req = (HttpServletRequest) FacesContext
.getCurrentInstance().getExternalContext().getRequest();
res.sendRedirect("RelatorioPedido.pdf");
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
private static final String DATA_PATH = "/WEB-INF/classes/com/Barreto/Tcc/Relatorios/" ;
public String getPath(){
FacesContext aFacesContext = FacesContext.getCurrentInstance();
ServletContext context = (ServletContext)aFacesContext.getExternalContext().getContext();
String rootpath = context.getRealPath(DATA_PATH)+"/";
return rootpath;
}
public static String getDATA_PATH() {
return DATA_PATH;
}
}
E esta dando este erro:
21:49:52,875 INFO [STDOUT] Hibernate: select fornecedor0_.fornecedorid as forneced1_7_2_, fornecedor0_.estado as estado7_2_, fornecedor0_.nomefantasia as nomefant3_7_2_, fornecedor0_.razaosocial as razaosoc4_7_2_, fornecedor0_.ie as ie7_2_, fornecedor0_.cnpj as cnpj7_2_, fornecedor0_.rua as rua7_2_, fornecedor0_.bairro as bairro7_2_, fornecedor0_.numero as numero7_2_, fornecedor0_.complemento as complem10_7_2_, fornecedor0_.email as email7_2_, fornecedor0_.homepage as homepage7_2_, fornecedor0_.fone as fone7_2_, fornecedor0_.celular as celular7_2_, fornecedor0_.agencia as agencia7_2_, fornecedor0_.conta as conta7_2_, fornecedor0_.digito as digito7_2_, fornecedor0_.situacao as situacao7_2_, fornecedor0_.observacoes as observa19_7_2_, fornecedor0_.cidadeid as cidadeid7_2_, cidade1_.cidadeid as cidadeid0_0_, cidade1_.cidadenome as cidadenome0_0_, cidade1_.estadoid as estadoid0_0_, estado2_.estadoid as estadoid18_1_, estado2_.estado as estado18_1_, estado2_.sigla as sigla18_1_ from fornecedor fornecedor0_ left outer join cidade cidade1_ on fornecedor0_.cidadeid=cidade1_.cidadeid left outer join estado estado2_ on cidade1_.estadoid=estado2_.estadoid where fornecedor0_.fornecedorid=?
21:49:53,406 ERROR [STDERR] java.lang.ArrayIndexOutOfBoundsException: -1
21:49:53,406 ERROR [STDERR] at com.Barreto.Tcc.Relatorios.Vendas.DataSource.getFieldValue(DataSource.java:26)
21:49:53,406 ERROR [STDERR] at net.sf.jasperreports.engine.fill.JRFillDataset.setOldValues(JRFillDataset.java:787)
21:49:53,406 ERROR [STDERR] at net.sf.jasperreports.engine.fill.JRFillDataset.next(JRFillDataset.java:751)
21:49:53,406 ERROR [STDERR] at net.sf.jasperreports.engine.fill.JRBaseFiller.next(JRBaseFiller.java:1422)
21:49:53,406 ERROR [STDERR] at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillReport(JRVerticalFiller.java:111)
21:49:53,406 ERROR [STDERR] at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:879)
21:49:53,406 ERROR [STDERR] at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:801)
21:49:53,421 ERROR [STDERR] at net.sf.jasperreports.engine.fill.JRFiller.fillReport(JRFiller.java:89)
21:49:53,421 ERROR [STDERR] at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:601)
21:49:53,421 ERROR [STDERR] at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:517)
21:49:53,421 ERROR [STDERR] at com.Barreto.Tcc.Relatorios.Vendas.RelatorioContasReceber.relatorioContasReceber(RelatorioContasReceber.java:42)
21:49:53,421 ERROR [STDERR] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
21:49:53,421 ERROR [STDERR] at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
21:49:53,421 ERROR [STDERR] at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
21:49:53,421 ERROR [STDERR] at java.lang.reflect.Method.invoke(Unknown Source)
21:49:53,421 ERROR [STDERR] at org.apache.el.parser.AstValue.invoke(AstValue.java:131)
21:49:53,421 ERROR [STDERR] at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:276)
21:49:53,421 ERROR [STDERR] at org.apache.jasper.el.JspMethodExpression.invoke(JspMethodExpression.java:68)
21:49:53,421 ERROR [STDERR] at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:77)
21:49:53,421 ERROR [STDERR] at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:91)
21:49:53,421 ERROR [STDERR] at javax.faces.component.UICommand.broadcast(UICommand.java:383)
21:49:53,421 ERROR [STDERR] at org.ajax4jsf.component.UIDataAdaptor.broadcast(UIDataAdaptor.java:1379)
21:49:53,421 ERROR [STDERR] at org.ajax4jsf.component.AjaxViewRoot.processEvents(AjaxViewRoot.java:321)
21:49:53,421 ERROR [STDERR] at org.ajax4jsf.component.AjaxViewRoot.broadcastEvents(AjaxViewRoot.java:296)
21:49:53,421 ERROR [STDERR] at org.ajax4jsf.component.AjaxViewRoot.processPhase(AjaxViewRoot.java:253)
21:49:53,421 ERROR [STDERR] at org.ajax4jsf.component.AjaxViewRoot.processApplication(AjaxViewRoot.java:466)
21:49:53,421 ERROR [STDERR] at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:97)
21:49:53,421 ERROR [STDERR] at com.sun.faces.lifecycle.LifecycleImpl.phase(LifecycleImpl.java:251)
21:49:53,421 ERROR [STDERR] at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:117)
21:49:53,421 ERROR [STDERR] at javax.faces.webapp.FacesServlet.service(FacesServlet.java:244)
21:49:53,421 ERROR [STDERR] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
21:49:53,421 ERROR [STDERR] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
21:49:53,421 ERROR [STDERR] at org.ajax4jsf.webapp.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:177)
21:49:53,421 ERROR [STDERR] at org.ajax4jsf.webapp.BaseFilter.handleRequest(BaseFilter.java:267)
21:49:53,421 ERROR [STDERR] at org.ajax4jsf.webapp.BaseFilter.processUploadsAndHandleRequest(BaseFilter.java:380)
21:49:53,421 ERROR [STDERR] at org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:507)
21:49:53,421 ERROR [STDERR] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
21:49:53,421 ERROR [STDERR] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
21:49:53,421 ERROR [STDERR] at com.Barreto.Tcc.Util.SecuritFilter.doFilter(SecuritFilter.java:40)
21:49:53,421 ERROR [STDERR] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
21:49:53,421 ERROR [STDERR] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
21:49:53,421 ERROR [STDERR] at org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)
21:49:53,421 ERROR [STDERR] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
21:49:53,421 ERROR [STDERR] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
21:49:53,421 ERROR [STDERR] at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:230)
21:49:53,421 ERROR [STDERR] at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
21:49:53,421 ERROR [STDERR] at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:179)
21:49:53,421 ERROR [STDERR] at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:84)
21:49:53,421 ERROR [STDERR] at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
21:49:53,421 ERROR [STDERR] at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:104)
21:49:53,421 ERROR [STDERR] at org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:157)
21:49:53,421 ERROR [STDERR] at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
21:49:53,421 ERROR [STDERR] at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:241)
21:49:53,421 ERROR [STDERR] at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
21:49:53,421 ERROR [STDERR] at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:580)
21:49:53,421 ERROR [STDERR] at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
21:49:53,421 ERROR [STDERR] at java.lang.Thread.run(Unknown Source)
Se alguem puder me ajudar fico grata.
abracos.
provavelmente o erro ocorre na implementação do seu datasource. verifique em modo debug a execução do método getFieldIndex ou next, a partir da mesma SQL gerada.