Valores de uma JTable implementando ArrayList enviando para iReport?

15 respostas
fernandopaiva

Salve galera…

Seguinte, eu consegui fazer a parte de enviar um ArrayList para o iReport, porem agora eu preciso ir adicionando valores a uma JTable e ir populando um ArrayList para mandar esses valores para o iReport.

No JTable eu tenho uma coluna chamado “Qtd” que se refere a quantidade de etiquetas que irei imprimir.

Seria mais ou menos isso.
Meu JTable

Produto | Qtd

CocaCola 5
Chocolate 6

Esse eh + ou - o ambiente do meu JTable, entaum quero emitir 5 etiquetas de CocaCola e 6 Etiquetas de Chocolate. Pra fazer isso, estou tentando fazer o seguinte código.

//metodo que uso para gerar as etiquetas.
public void imprimeEtiquetas() throws JRException {
        String arquivo = "relatorios/Etiquetas.jasper";
        java.io.InputStream file = getClass().getClassLoader().getResourceAsStream(arquivo);

        Etiquetas etiqueta = new Etiquetas();
        ArrayList lista = new ArrayList();
        int qtd = 0;
        for(int y = 0; y < tabelaEtiqueta.getRowCount(); y++){
            etiqueta.setReferencia((String)tabelaEtiqueta.getValueAt(y, 0));
            String qtdE = (String)tabelaEtiqueta.getValueAt(y, 2); //qtd de etiquetas
            qtd = Integer.parseInt(qtdE);
            for(int x = 0; x < qtd; x++){
                lista.add(etiqueta);
            }
        }
        
        Map parametros = new HashMap();
        parametros.put("REFERENCIA", etiqueta.getReferencia());
        JRDataSource dados = new JRBeanCollectionDataSource(lista);
        JasperPrint printer = JasperFillManager.fillReport(file, parametros, dados);
        JRViewer view = new JRViewer(printer);
        JDialog dialog = new JDialog();
        dialog.getContentPane().add(view);
        new AbreRelatorios().abreRelatorio(dialog);
    }

//classe que uso para retornar os valores
public class Etiquetas{
    private String referencia = "";

    public void setReferencia(String referencia){
        this.referencia = referencia;
    }

    public String getReferencia(){
        return this.referencia;
    }

}

O problema que estou encontrando eh que apenas consigo imprimir o ultimo laco do for, por exemplo nesse caso esta saindo 11 etiquetas de Chocolate, sendo que estou mandando 5 de CocaCola e 6 de Chocolate…Eh como se o for estivesse juntando td e imprimindo soh o ultimo item da JTable.

Desde já, Obrigado !

15 Respostas

fernandopaiva

Ninguémmm ???

Galera, seguinte, eu acho que eh meio erro de lógica…Se alguém puder ajudar, agradeço.

t+

leoramos

Cara, acho que teu erro é no iReport mesmo.
Eu não o melhor nesse negócio de analisar código sem executar, mas a meu ver, tá funcional.
Acho - veja, eu acho, tenho certeza não - que tu colocando na tua banda detail o textField de impressão da referência com o valor $P{REFERENCIA}.
Estou certo?

Marky.Vasconcelos

Primeiro, aprenda como implementar um TableModel decente e se livre do Default.

Segundo, voce esta instanciando apenas uma vez Etiquetas, desse modo voce vai adicionar a mesma referencia no List todas as vezes.

leoramos

Ihhhhhhh rapaz, é mesmo, eu não tinha notado isso!
(Caboclo tanso)
Foi mal ae!

fernandopaiva

Eu ja havia visto esse esquema de instanciar apenas 1x, mas não consegui resolver isso pq envio por parametros os valores para o iReport, entaum defino ele fora do for.

e qdo exibo os valores da lista com “lista.get(x).getReferencia()” ele me traz todos os valores corretos…

Ainda não consegui resolver, qquer ajuda ae agradeço.

Obrigado

leoramos

Então, mestre, aí que mora teu erro.
Parâmetros são valores fixos mesmo lá no iReport.
Ele está repetindo o valor do PARÂMETRO com a quantidade de itens da tua LISTA DE DADOS.
Pra acessar os dados da lista, mapeie os atributos do teu bean como fiels no iReport, e utilize lá estes valores como $F{campo}.
No teu caso, a referência da etiqueta:
Field = referencia, tipo String.
Use o valor no textField como $F{referencia).

Acho que tu ainda não pegou muito bem a lógica de funcionamento do iReport (dados, parâmetros, variáveis, bandas, essa coisa toda). Leva um tempo, mas qq coisa posta aqui.

Abraço!

fernandopaiva

Salve LeoRamos…Obrigado pela atenção e desculpe a ignorancia kra…

Eu fiz como vc flw, no meu iReport eu criei o Field REFERENCIA, mas ainda não consegui resolver.

e ainda tive esse erro abaixo.
[error]

02/03/2011 10:59:28 sistema.EtiquetaDigitacao imprimirActionPerformed

SEVERE: null

net.sf.jasperreports.engine.JRException: Error retrieving field value from bean : REFERENCIA

at net.sf.jasperreports.engine.data.JRAbstractBeanDataSource.getBeanProperty(JRAbstractBeanDataSource.java:123)

at net.sf.jasperreports.engine.data.JRAbstractBeanDataSource.getFieldValue(JRAbstractBeanDataSource.java:96)

at net.sf.jasperreports.engine.data.JRBeanCollectionDataSource.getFieldValue(JRBeanCollectionDataSource.java:100)

at net.sf.jasperreports.engine.fill.JRFillDataset.setOldValues(JRFillDataset.java:821)

at net.sf.jasperreports.engine.fill.JRFillDataset.next(JRFillDataset.java:785)

at net.sf.jasperreports.engine.fill.JRBaseFiller.next(JRBaseFiller.java:1482)

at net.sf.jasperreports.engine.fill.JRHorizontalFiller.fillReport(JRHorizontalFiller.java:134)

at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:946)

at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:864)

at net.sf.jasperreports.engine.fill.JRFiller.fillReport(JRFiller.java:84)

at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:624)

at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:605)

at sistema.EtiquetaDigitacao.imprimeEtiquetas(EtiquetaDigitacao.java:658)

at sistema.EtiquetaDigitacao.imprimirActionPerformed(EtiquetaDigitacao.java:613)

at sistema.EtiquetaDigitacao.access$1000(EtiquetaDigitacao.java:48)

at sistema.EtiquetaDigitacao$12.actionPerformed(EtiquetaDigitacao.java:436)

at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)

at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)

at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)

at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)

at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)

at java.awt.Component.processMouseEvent(Component.java:6038)

at javax.swing.JComponent.processMouseEvent(JComponent.java:3260)

at java.awt.Component.processEvent(Component.java:5803)

at java.awt.Container.processEvent(Container.java:2058)

at java.awt.Component.dispatchEventImpl(Component.java:4410)

at java.awt.Container.dispatchEventImpl(Container.java:2116)

at java.awt.Component.dispatchEvent(Component.java:4240)

at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4322)

at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3986)

at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3916)

at java.awt.Container.dispatchEventImpl(Container.java:2102)

at java.awt.Window.dispatchEventImpl(Window.java:2429)

at java.awt.Component.dispatchEvent(Component.java:4240)

at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)

at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:273)

at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:183)

at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:177)

at java.awt.Dialog$1.run(Dialog.java:1039)

at java.awt.Dialog$3.run(Dialog.java:1091)

at java.security.AccessController.doPrivileged(Native Method)

at java.awt.Dialog.show(Dialog.java:1089)

at java.awt.Component.show(Component.java:1419)

at java.awt.Component.setVisible(Component.java:1372)

at java.awt.Window.setVisible(Window.java:801)

at java.awt.Dialog.setVisible(Dialog.java:979)

at classesdecontrole.AbreDialog.abreDialog(AbreDialog.java:9)

at sistema.MenuPrincipal.emissaoEtiquetasActionPerformed(MenuPrincipal.java:283)

at sistema.MenuPrincipal.access$300(MenuPrincipal.java:35)

at sistema.MenuPrincipal$4.actionPerformed(MenuPrincipal.java:170)

at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)

at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)

at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)

at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)

at javax.swing.AbstractButton.doClick(AbstractButton.java:357)

at javax.swing.plaf.basic.BasicMenuItemUI.doClick(BasicMenuItemUI.java:1216)

at javax.swing.plaf.basic.BasicMenuItemUI$Handler.mouseReleased(BasicMenuItemUI.java:1257)

at java.awt.Component.processMouseEvent(Component.java:6038)

at javax.swing.JComponent.processMouseEvent(JComponent.java:3260)

at java.awt.Component.processEvent(Component.java:5803)

at java.awt.Container.processEvent(Container.java:2058)

at java.awt.Component.dispatchEventImpl(Component.java:4410)

at java.awt.Container.dispatchEventImpl(Container.java:2116)

at java.awt.Component.dispatchEvent(Component.java:4240)

at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4322)

at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3986)

at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3916)

at java.awt.Container.dispatchEventImpl(Container.java:2102)

at java.awt.Window.dispatchEventImpl(Window.java:2429)

at java.awt.Component.dispatchEvent(Component.java:4240)

at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)

at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:273)

at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:183)

at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:173)

at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:168)

at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:160)

at java.awt.EventDispatchThread.run(EventDispatchThread.java:121)

Caused by: java.lang.NoSuchMethodException: Unknown property COR on class 'class classesdecontrole.Etiquetas

at org.apache.commons.beanutils.PropertyUtilsBean.getSimpleProperty(PropertyUtilsBean.java:1322)

at org.apache.commons.beanutils.PropertyUtilsBean.getNestedProperty(PropertyUtilsBean.java:770)

at org.apache.commons.beanutils.PropertyUtilsBean.getProperty(PropertyUtilsBean.java:846)

at org.apache.commons.beanutils.PropertyUtils.getProperty(PropertyUtils.java:426)

at net.sf.jasperreports.engine.data.JRAbstractBeanDataSource.getBeanProperty(JRAbstractBeanDataSource.java:111)

 76 more

BUILD SUCCESSFUL (total time: 16 seconds)

[/error]

To na peleja aqui.

obrigado novamente.

leoramos

Então, cara, esse nomes são case-sensitive.
Se teu atributo na classe é ‘referencia’, coloca minúsculo também no iReport, beleza?
E assim… na verdade, não tem a ver com o field, e sim com o método get dele.
Se for ‘getReferencia’, põe ‘referencia’, com a inicial minúscula. Funciona como nos jsps, ele busca esses valores por reflection.
Belezura?

fernandopaiva

afff LeoRamos…num sabia sobre esse esquema que tu flw aew, sobre upper e lower no iReport,…Mano tu eh fera.

Mas entaum, parou de dar erro no Field, mas ainda continua repetindo a referencia…Sendo que informei 2 qtd diferente para referencias diferentes.

Obrigado novamente, to na peleja pra acertar isso.

fernandopaiva

Aqui parte do codigo

public void imprimeEtiquetas() throws JRException, ParseException, SQLException {
        String arquivo = "relatorios/Etiquetas.jasper";
        java.io.InputStream file = getClass().getClassLoader().getResourceAsStream(arquivo);

        Etiquetas etiqueta = new Etiquetas();
        Map parametros = new HashMap();
        ArrayList<Etiquetas> lista = new ArrayList<Etiquetas>();
       
        for(int y = 0; y < tabelaEtiqueta.getRowCount(); y++){
            etiqueta.setCor((String)tabelaEtiqueta.getValueAt(y, 0)); //referencia
            String qtdE = (String)tabelaEtiqueta.getValueAt(y, 2); //qtd de etiquetas
            int qtd = Integer.parseInt(qtdE);
            for(int x = 0; x < qtd; x++){
                lista.add(etiqueta);

            }
        }
        
        JRDataSource dados = new JRBeanCollectionDataSource(lista);
        JasperPrint printer = JasperFillManager.fillReport(file, parametros, dados);
        JRViewer view = new JRViewer(printer);
        JDialog dialog = new JDialog();
        dialog.getContentPane().add(view);
        new AbreRelatorios().abreRelatorio(dialog);
    }


//classe etiquetas
public class Etiquetas{  
    private String referencia = "";  
  
    public void setReferencia(String referencia){  
        this.referencia = referencia;  
    }  
  
    public String getReferencia(){  
        return this.referencia;  
    }  
  
}

obrigado !

fernandopaiva

Opa Leo…resolvi kra…

obrigado a todos…

fernandopaiva

Problema de instancia, coloquei Etiquetas no for e ja era…funcionando !!!

segue o codigo.

public void imprimeEtiquetas() throws JRException, ParseException, SQLException {
        String arquivo = "relatorios/Etiquetas.jasper";
        java.io.InputStream file = getClass().getClassLoader().getResourceAsStream(arquivo);

        Map parametros = new HashMap();
        ArrayList<Etiquetas> lista = new ArrayList<Etiquetas>();
       
        for(int y = 0; y < tabelaEtiqueta.getRowCount(); y++){
            Etiquetas etiqueta = new Etiquetas();
            etiqueta.setReferencia((String)tabelaEtiqueta.getValueAt(y, 0)); //referencia
            String qtdE = (String)tabelaEtiqueta.getValueAt(y, 2); //qtd de etiquetas
            int qtd = Integer.parseInt(qtdE);
            for(int x = 0; x < qtd; x++){
                lista.add(etiqueta);

            }
        }
        
        JRDataSource dados = new JRBeanCollectionDataSource(lista);
        JasperPrint printer = JasperFillManager.fillReport(file, parametros, dados);
        JRViewer view = new JRViewer(printer);
        JDialog dialog = new JDialog();
        dialog.getContentPane().add(view);
        new AbreRelatorios().abreRelatorio(dialog);
    }
leoramos

Vim aqui pra responder e achei tua resposta já hehe
Funcionou, tá 10.

fernandopaiva

ow Leo…tu eh brother mano, me ajudou bastante.

obrigado mais uma vez.

T

http://www.fabsoft.cesupa.br/novo/arquivos/images/stories/tutoriais/passando%20par%E2metros%20do%20java%20ao%20ireport.pdf

Vou deixar aqui este URL que tambem me ajudou a resolver parte do meu problema que era igual a este!

Cumprimentos, Tiago

Criado 1 de março de 2011
Ultima resposta 13 de set. de 2011
Respostas 15
Participantes 4