Classe compra

Galera to tentando fazer minha compra funcionar, o problema agora e PK de compra.
Na classe TelaCompra set as persistencias de Compra e ItemCompra

public void setPersistenciaCompra()  {    
        compra.setCodigo(0); // Generator Banco Firebird
        compra.setCodigoFornecedor(Integer.parseInt(jtCodigoFornecedor.getText()));
        compra.setNumeroNota(Integer.parseInt(jtNota.getText()));
        compra.setData(jtDataCadastro.getData());
        compra.setVlrTotal(ConverteDoubleString.textoParaDouble(jlTotal.getText()));
    }
public void setPersistenciaItem() {
            for (int i = 0; i < tabelaCompra.getTabela().getRowCount(); i++) {
            itemCompra = new ItemCompra();
            itemCompra.setCodigo(0);
            itemCompra.setCodigoCompra(Integer.parseInt(jtCodigoCompra.getText()));  //Problema...!!!
            itemCompra.setCodigoProduto(Integer.parseInt((String) tabelaCompra.getTabela().getValueAt(i, 0)));
            itemCompra.setQuantidade(Integer.parseInt((String) tabelaCompra.getTabela().getValueAt(i, 2)));
            itemCompra.setVlrUnitario(Double.parseDouble((String) tabelaCompra.getTabela().getValueAt(i, 3)));
            itemCompra.setValortotalunitario(Double.parseDouble((String) tabelaCompra.getTabela().getValueAt(i, 4)));
            itensCompra.add(itemCompra);
        }
    }

Como posso pegar o codigo da compra depois que fiz a insercao no banco lembrando que tenho um generator no Firebird ?

public void incluirDados() {
            setPersistenciaItem();
            itemCompra.inserir();
            setPersistenciaCompra();
            for (int i = 0; i < itensCompra.size(); i++) {
                itensCompra.get(i).inserir();
          }
    }
//Persistencia de Compra
public boolean inserir() {
        try {
            PreparedStatement ps = ConexaoFirebird.getConexao().prepareStatement(insertsql);
            ps.setInt(1, codigo);
            ps.setInt(2, codigoFornecedor);
            ps.setInt(3, numeroNota);
            ps.setString(4, data);
            ps.setDouble(5, frete);
            ps.setDouble(6, vlrTotal);
            ps.execute();
            for (int i = 0; i < itensCompra.size(); i++) {
                itensCompra.get(i).inserir();
            }
            return true;
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, "Não foi possivel inserir :" + e);
            return false;
        }
    }

//Persistencia de ItemCompra public boolean inserir() { try { PreparedStatement ps = ConexaoFirebird.getConexao().prepareStatement(insertsql); ps.setInt(1, codigo); ps.setInt(2, codigoCompra); ps.setInt(3, codigoProduto); ps.setInt(4, quantidade); ps.setDouble(5, vlrUnitario); ps.setDouble(6, valortotalunitario); ps.execute(); JOptionPane.showMessageDialog(null,"passei por aqui"); return true; } catch (Exception e) { JOptionPane.showMessageDialog(null, "Não foi possivel inserir :" + e); return false; } }

Fala cara…

eu não estou entendendo porque estás passando o código já que o Firebird gera pra ti (segundo você mesmo, não conheço o Firebird).

Quanto a recuperação, vê se isso te ajuda ??

http://javafree.uol.com.br/topic-875610-Recuperar-primary_key-apos-executeUpdate.html

Abraços :wink:

[EDIT] - Achei uma aqui do GUJ mesmo - pode ajudar - http://www.guj.com.br/posts/list/25929.java

Estou aprendendo ainda mas pelo que sei, preciso passar o Zero pois se não da erro !

Interessante os exemplos estou tentando isso
O SQL rodou no IBO agora to pensando em como implementar no fonte esse (SELECT MAX(COM_CODIGO) FROM COMPRA)

public static final String insertsql = "INTO ITENSCOMPRA VALUES ( ?, (SELECT MAX(COM_CODIGO) FROM COMPRA), ?, ?, ?, ?)";

public boolean inserir() {
        try {
            PreparedStatement ps = ConexaoFirebird.getConexao().prepareStatement(insertsql);
            ps.setInt(1, codigo);
            ps.setInt(2, codigoCompra);
            ps.setInt(3, codigoProduto);
            ps.setInt(4, quantidade);
            ps.setDouble(5, vlrUnitario);
            ps.setDouble(6, valortotalunitario);
            ps.execute();
            return true;
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, "Não foi possivel inserir :" + e);
            return false;
        }
    }

è…entendi o que você fez
mas tipo…é tão necessário você fazer dessa forma??
por que vai que amanhã ou depois seu banco de dados tem que
mudar por um motivo qualquer… vai ser complicado você fazer isso…

Existem Frameworks de banco como DAO, HIBERNATE

que te ajudam você a fazer isso,

mas se for tão importante para o domínio de sua aplicação fazer esse tipo de coisa
tudo bem… retiro tudo o que eu disse

Q ?
Patrick não entendi oque disse, é sua primeira resposta a minha pergunta se tu ja me respondeu desculpe devo estar fazendo algo errado !

[quote=Ely Rogerio]Estou aprendendo ainda mas pelo que sei, preciso passar o Zero pois se não da erro !

Interessante os exemplos estou tentando isso
O SQL rodou no IBO agora to pensando em como implementar no fonte esse (SELECT MAX(COM_CODIGO) FROM COMPRA)

[code]
public static final String insertsql = “INTO ITENSCOMPRA VALUES ( ?, (SELECT MAX(COM_CODIGO) FROM COMPRA), ?, ?, ?, ?)”;

public boolean inserir() {
try {
PreparedStatement ps = ConexaoFirebird.getConexao().prepareStatement(insertsql);
ps.setInt(1, codigo);
ps.setInt(2, codigoCompra);
ps.setInt(3, codigoProduto);
ps.setInt(4, quantidade);
ps.setDouble(5, vlrUnitario);
ps.setDouble(6, valortotalunitario);
ps.execute();
return true;
} catch (Exception e) {
JOptionPane.showMessageDialog(null, “Não foi possivel inserir :” + e);
return false;
}
}

[/code][/quote]

Cara, te passei esse link, mas me arrependi, tendo em vista que a prática não é das melhores, irias ter que trabalhar com Threads Sincronizadas pra garantir que ninguém tenha inserido um novo registro na Tabela enquanto não tentas recuperar esse registrio…

Já o segundo Link (o do GUJ mesmo) tem um exemplo bacana, que apesar de ser com SQLServer, ao que tudo indica, é genérico, podes usar em qualquer BD, passando rápido pela solução, ao que tudo indica, ele gera a Key pra tí e guarda um ResultSet de chaves geradas pra tí… Podias recuperar essa chave e mandar gerar uma nova…
Lembrando, não sei bem como funciona o Firebird e nem como o mesmo lhe dá com a geração de chaves…

Abs []

tipo…
você ta fazendo trabalho dobrado…
tipo…se você já tem uma String “insert bla bla bla”
que vai inserir no banco…você não precisa fazer isso:

PreparedStatement ps = ConexaoFirebird.getConexao().prepareStatement(insertsql);   
            ps.setInt(1, codigo);   
            ps.setInt(2, codigoCompra);   

coloca tudo dentro de uma String (os valores, como se fosse um sql normal)
e faz um:

ps.execute(insertsql);

vai se mais fácil e menos custoso pro código você fazer dessa forma

outra…

pra buscar…

você tem que fazer uma query “select”
e preencher o obj Compra

entendeu??

abração