Ajuda com ireport+jpa-hibernate

Boa tarde a todos,
Fiz um relatorio no ireport e consigo ve-lo legal, so que o relatorio esta sendo gerado pela query que fiz quando estava gerando o relatorio. Eu queira poder passar minha query, pois eu posso quer imprimir em ordem de codigo, ou em ordem alfabetica, ou poderia imprimir somentes as cidades de um determinado estado.
Como posso fazer isso?
Veja abaixo ate onde eu consegui chegar.

[code]
EntityManagerFactory emf = javax.persistence.Persistence.createEntityManagerFactory("BDistribuidorPU");
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();

    String sql = "select c from CidadeBean c ";       
    
    if(CbUf.getSelectedIndex() > 0) {
        sql = sql + "where c.uf = :param ";            
    }    
    
    if(CbOrdem.getSelectedIndex() == 0) {
        sql = sql + "order by c.codCidade";            
    }    

    if(CbOrdem.getSelectedIndex() == 1) {
        sql = sql + "order by c.nomeCidade";            
    }    
    
    Map parametros = new HashMap();                                          
    parametros.put("EMPRESA", "EMPRESA MODELO");
    parametros.put("TITULO", "TITULO DO RELATORIO");
    parametros.put(JRJpaQueryExecuterFactory.PARAMETER_JPA_ENTITY_MANAGER, em);

    try {               
        JasperFillManager.fillReportToFile("relatorio/RelCadCidade.jasper", parametros);   
        JasperViewer jv = new JasperViewer("relatorio/RelCadCidade.jrprint", false, false);   
        jv.setTitle("Relatório de Cidades");   
        jv.setVisible(true);   
    }   
    catch(JRException e) {   
        javax.swing.JOptionPane.showMessageDialog(null, e.getMessage(), "Mensagem", 2);
    }   
   
    em.close();   [/code]

Agradeco a atencao de todos

cara não entendi muito bem sua dúvida…
mas de qualquer forma de uma olhada nesse tutorial…

http://blog.apollo-ti.com/?p=8

vai te esclarecer algumas coisas…

ai vc posta sua dúvida denovo ai…

FLwS

Desculpem a pergunta mal elaborada.
O que eu quero é poder mandar minha query para o jasper gerar meu relatorio somente com os registros que eu selecionar. Como é que eu faço isso usando Hibernate com JPA?

Aguardando…

Se você for fazer relatórios que se adaptam dinamicamente, acho que o projeto é outro. Procura no fórum que tem um que faz isso.
Agora, se for mandar parâmetro, ai sim, mas seria interessante explicar melhor pra entendermos o que realmente quer.

Abraços

Bom dia a todos,

Deu um pouco de trabalho, mas acabei descobrindo.
O que eu tava querendo era poder mandar para o relatorio somente os registros selecionados por uma query (esta na linha 30 do fonte).
Estou postando o codigo abaixo, pode ser que sirva para alguem que venha a precisar.
Obrigado a todos pela atencao

[code] EntityManagerFactory emf = javax.persistence.Persistence.createEntityManagerFactory("BDistribuidorPU");
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();

    String sql = "select c from CidadeBean c ";       
    
    List list = null;
    String titulo = "Relatório de cidades";

    if(CbUf.getSelectedIndex() > 0) {
        sql = sql + "where c.uf = :param "; 
        titulo = titulo + " da UF: " + CbUf.getSelectedItem().toString();
    }    
    
    if(CbOrdem.getSelectedIndex() == 0) {
        sql = sql + "order by c.codCidade";            
    }    

    if(CbOrdem.getSelectedIndex() == 1) {
        sql = sql + "order by c.nomeCidade";            
    }    

    if(CbUf.getSelectedIndex() > 0) {
        list = em.createQuery(sql).setParameter("param", CbUf.getSelectedItem()).getResultList();    
    }
    else {
        list = em.createQuery(sql).getResultList();    
    }
    
    JRBeanCollectionDataSource jr = new JRBeanCollectionDataSource(list); 
    
    Map parametros = new HashMap();                                          
    parametros.put("EMPRESA", "EMPRESA MODELO");
    parametros.put("TITULO", titulo);
    parametros.put(JRJpaQueryExecuterFactory.PARAMETER_JPA_ENTITY_MANAGER, em);
    em.close();        

    try {               
        JasperFillManager.fillReportToFile("relatorio/RelCadCidade.jasper", parametros,jr);   
        JasperViewer jv = new JasperViewer("relatorio/RelCadCidade.jrprint", false, false);   
        jv.setTitle("Relatório de Cidades");   
        jv.setVisible(true);   
    }   
    catch(JRException e) {   
        javax.swing.JOptionPane.showMessageDialog(null, e.getMessage(), "Mensagem", 2);
    }      [/code]

exatamente como está descrito no tutorial que te passei …

:wink:

Bom que resolveu…

Só uma dica, relatórios geralmente são montados com escopos específicos. Você não precisa transmitir a query e o restante.
Você monta a query parcial no relatório e transmite o parâmetro com apenas as partes que deseja, falo da condição.
Há, coloque no título [RESOLVIDO].

Abraços e bons códigos

[quote=djemacao]Só uma dica, relatórios geralmente são montados com escopos específicos. Você não precisa transmitir a query e o restante.
Você monta a query parcial no relatório e transmite o parâmetro com apenas as partes que deseja, falo da condição.
Há, coloque no título [RESOLVIDO].

Abraços e bons códigos[/quote]

não entendi o que vc quiz dizer…

nos meus relatorio normalmente eu nem envio query deixo essa responsabilidade
(resgatar os dados) para a aplicação, mando soh Objetos e listas…

naum sakei o que vc quis dizer ?

PS: o problema ainda nao foi resolvido…

[quote=perell]Bom dia a todos,

Deu um pouco de trabalho, mas acabei descobrindo.
O que eu tava querendo era poder mandar para o relatorio somente os registros selecionados por uma query (esta na linha 30 do fonte).
Estou postando o codigo abaixo, pode ser que sirva para alguem que venha a precisar.
Obrigado a todos pela atencao

[/quote]

Ele disse que resolveu, descobrindo como queria fazer. Então, pra ele, o problema foi resolvido. Não vejo porque não dizer que está resolvido na thread.

Ele fez essa query:

String sql = "select c from CidadeBean c ";

E transmitiu ao relatório. Essa query não precisa ser transmitida, uma vez que estaria já no relatório.
Ele está transmitindo um JRBeanCollectionDataSource para o relatório, mas nada disso é preciso. Ele pode montar um relatório tranquilamente com JPA e depois somente transmitir os parâmetros faltantes para completar a query e gerar o relatório.
Acho que ele teve mais trabalho fazendo dessa forma, foi o que quis dizer.

Abraços

[quote=djemacao][quote=feltraco]
não entendi o que vc quiz dizer…

nos meus relatorio normalmente eu nem envio query deixo essa responsabilidade
(resgatar os dados) para a aplicação, mando soh Objetos e listas…

naum sakei o que vc quis dizer ?

PS: o problema ainda nao foi resolvido…

[/quote]

Ele fez essa query:

String sql = "select c from CidadeBean c ";

E transmitiu ao relatório. Essa query não precisa ser transmitida, uma vez que estaria já no relatório.
Ele está transmitindo um JRBeanCollectionDataSource para o relatório, mas nada disso é preciso. Ele pode montar um relatório tranquilamente com JPA e depois somente transmitir os parâmetros faltantes para completar a query e gerar o relatório.
Acho que ele teve mais trabalho fazendo dessa forma, foi o que quis dizer.

Abraços[/quote]

Agoro entendi e concordo… :wink:

Bom dia a todos,

Agora fiquei com uma duvida. Vamos lá:

Bom, eu posso criar o relatorio no ireport somente usando ‘select c from CidadeBean’, até ai tudo bem.
Agora como eu vou passar em tempo de execusao as clausulas “where” e “order by”?

aguardando…

Depois que eu entender isso eu ponho [ENCERRADO]

pode sim…

do mesmo modo que vc coloca um field no corpo do relatorio
vc pode colocar na query do relatorio

select * from cidade where $F(where) order by $F(order)

ai vc popula $F(where) e $F(order)…

mas ainda sou a favor de vc resgatar todos os dados que
vc quer no relatorio e mandar so dados sem sql pro jasper

mas é opçao de cada um… FLwS

No relatório JasperReports, via iReport, você coloca assim:

O parâmetro PAR_CONDICAO pode ter o valor padrão “”.
No relatório, você transmite o que desejar ao parâmetro.


Map parameters = new HashMap();

if(CbUf.getSelectedIndex() > 0) {  
     sql = sql + "where c.uf = :param ";   
     titulo = titulo + " da UF: " + CbUf.getSelectedItem().toString();  
 }      
   
 if(CbOrdem.getSelectedIndex() == 0) {  
     sql = sql + "order by c.codCidade";              
 }      
   
 if(CbOrdem.getSelectedIndex() == 1) {  
     sql = sql + "order by c.nomeCidade";              
 }     

//aqui você transmite a condicao que deseja e o relatório é gerado
parameters.put("PAR_CONDICAO", sql);

Bom, fiz mais ou menos para ter uma idéia. Acredito que conheça o desenvolvimento de relatórios e entenda o que eu quis dizer.

Abraços

Bom dia a todos,

Bom, agora clareou tudo.

Vou fazer as devidas modificacoes no meu codigo.

Abraco a todos.

Perell