[RESOLVIDO] Retorna ID depois de Cadastrado

Olá pessoal tenho um problema de quando eu salvar quero que me retorne o ultimo ID ( que foi gerado automático no banco (Firebird) ) e set em um jTextField

meu dão eu fiz assim:

     public static int getLastId() throws SQLException{ 
            Connection conexao = ConexaoFirebird.getConexao();
	String retornaUltID = "Select last from CAD_VENDA_PDV where ID_VENDA = ?"; 
	PreparedStatement pstmt =  conexao.prepareStatement(retornaUltID); 
	ResultSet rs = pstmt.executeQuery(); 
	rs.next(); 
	int lastId = rs.getInt("ID_VENDA"); 
	rs.close(); 
	pstmt.close();
            return lastId;
    } 

e coloquei o método na minha class assim:

private JTextField getJTextFieldCodigoCliente() {
VendaDAO vendaDAO = new VendaDAO();
      if (jtcarre == null) {
        try {
            jtcarre = new JTextField(String.valueOf(vendaDAO.getLastId()));
        } catch (SQLException ex) {
            
        }
	
 }
  return jtcarre;
}

alguem tem alguma dica ou coisa parecida ? não apresenta erro no codigo mais não não gera nada

public int save(Pessoa pessoa) {
        Connection conn = ConexaoFirebird.getConnection();
        PreparedStatement pstm = null;
        ResultSet rs = null;
        try {
           //Passando esse paramatro return_generated_keys 
           pstm = conn.prepareStatement(SQL_INSERT, pstm.RETURN_GENERATED_KEYS);
           pstm.setString(1, pessoa.getNome());
           pstm.setString(2, pessoa.getProfissao());
           pstm.setDate(3, new java.sql.Date(pessoa.getDtNascimento().getTime()));
           pstm.execute();     
           rs = pstm.getGeneratedKeys();
           while (rs.next()) {
                     return rs.getInt(1);
           }
        } catch (SQLException e) {
          // TODO Auto-generated catch block
            e.printStackTrace();
        } finally {
            ConexaoFirebird.close(conn, pstm, null);
        }
        return 0;
}
1 curtida

Tente colocar igual exemplo abaixo:

String query="Insert INTO people(name, age) (?, ?)";
PreparedStatement prest;
prest = con.prepareStatement(query, Statement.RETURN_GENERATED_KEYS);
prest.setString(1,"Guj");
prest.setInt(2,2);
prest.executeUpdate();
ResultSet rs = prest.getGeneratedKeys();
if(rs.next())
{
	int last_inserted_id = rs.getInt(1);
}

Ou seja, dentro de

conexao.prepareStatement(retornaUltID);

para:

conexao.prepareStatement(retornaUltID, Statement.RETURN_GENERATED_KEYS);

em vez de pstmt.executeQuery(); faça um pstmt.executeUpdate(); e no final utilize o mesmo if do exemplo:

if(rs.next())
{
    int last_inserted_id = pstmt.getInt(1);
}
1 curtida

deixou assim então ?

public static int getLastId() throws SQLException{ 
        Connection conexao = ConexaoFirebird.getConexao();
String retornaUltID = "Select last from CAD_VENDA_PDV where ID_VENDA = ?"; 
PreparedStatement pstmt =  conexao.prepareStatement(retornaUltID,      Statement.RETURN_GENERATED_KEYS); 
ResultSet rs = pstmt.executeUpdate(); 
rs.next(); 
int lastId = rs.getInt("ID_VENDA"); 
rs.close(); 
pstmt.close();
        return lastId;

if(rs.next()){
		int last_inserted_id = pstmt.getInt(1);
 }
}

e o método na classe fica certo como deixei ?

public void salvarNfVenda (ModelVenda modelVenda){
    Connection conexao = ConexaoFirebird.getConexao();
    try{
        String salvarNfVenda = "Insert into CAD_VENDA_PDV (FORMA_PAG1) values"
                + "(?)";
        PreparedStatement pstmt = conexao.prepareStatement(salvarNfVenda, Statement.RETURN_GENERATED_KEYS);
        
        pstmt.setFloat(1, modelVenda.getFORMA_PAG1());
      
    int resultado = pstmt.executeUpdate();
                
    if (resultado!=1){
        System.out.println("Erro ao Gravar, Tente Novamente !!");
    }else{
        System.out.println("Gravado com Sucesso !!");
        
    } pstmt.close();
    }catch(SQLException ex){
        System.out.println("Erro no Banco de Dados");
    }
}

para facilitar olha meu salvar ai !

public int salvarNfVenda (ModelVenda modelVenda)  {
    Connection conexao = ConexaoFirebird.getConexao();
    try{
        String salvarNfVenda = "Insert into CAD_VENDA_PDV (FORMA_PAG1) values"  + "(?)";
        PreparedStatement pstmt = conexao.prepareStatement(salvarNfVenda,  PreparedStatement.RETURN_GENERATED_KEYS);        
        pstmt.setFloat(1, modelVenda.getFORMA_PAG1());     
        pstmt.executeUpdate();                
        ResultSet rs = pstmt.getGeneratedKeys();
        while (rs.next()) {
            return rs.getInt(1);  
        }
        pstmt.close();
    } catch(SQLException ex) {
        System.out.println("Erro no Banco de Dados");
    }
    return 0;
}

ele esta dando erro no

while (rs.next()) {
    return rs.getInt(1);
}

e no catch ta pedindo um return.

missing return Statement

public int salvarNfVenda (ModelVenda modelVenda)  {
    Connection conexao = ConexaoFirebird.getConexao();
    try{
        String salvarNfVenda = "Insert into CAD_VENDA_PDV (FORMA_PAG1) values"  + "(?)";
        PreparedStatement pstmt = conexao.prepareStatement(salvarNfVenda,  PreparedStatement.RETURN_GENERATED_KEYS);        
        pstmt.setFloat(1, modelVenda.getFORMA_PAG1());     
        pstmt.executeUpdate();                
        ResultSet rs = pstmt.getGeneratedKeys();
        while (rs.next()) {
            return rs.getInt(1);  
        }
        pstmt.close();
    } catch(SQLException ex) {
        System.out.println("Erro no Banco de Dados");
    }
    return 0;
}
private int salvarNfVenda(){
    VendaDAO VendaDAO = new VendaDAO();
    ModelVenda modelVenda = new ModelVenda();
    modelVenda.setFORMA_PAG1(Float.parseFloat(jTDDPdv.getText()));
    VendaDAO.salvarNfVenda(modelVenda);
    JOptionPane.showMessageDialog(this, "Dados Gravado, Com Sucesso !!");
   return 0;  
}

meu metodo na class é esse mais esta dando erro ao gravar

private int salvarNfVenda(){
     VendaDAO vendaDAO = new VendaDAO();
     ModelVenda modelVenda = new ModelVenda();                                       
     modelVenda.setFORMA_PAG1(Float.parseFloat(jTDDPdv.getText()));            
     int resultado vendaDAO.salvarNfVenda(modelVenda);           
     JOptionPane.showMessageDialog(this, "Dados Gravado, Com Sucesso !!");
     return resultado;  
}
private int salvarNfVenda()
{
     VendaDAO vendaDAO = new VendaDAO();
     ModelVenda modelVenda = new ModelVenda();                                       
     modelVenda.setFORMA_PAG1(Float.parseFloat(jTDDPdv.getText()));            
     int resultado vendaDAO.salvarNfVenda(modelVenda);          // Dando erro nessa linha (o Erro ";" expected)
     JOptionPane.showMessageDialog(this, "Dados Gravado, Com Sucesso !!");
     return resultado;  // e nessa (variable resultado mignt not have been initialized)
}

Consegui resolver o problema, só que ao salvar esta dando erro !

lembrando que o banco é firebird e ta assim

tabela CAD_VENDA_PDV
     PK ID_VENDA INTERGER not null
           FORMA_PAG! FLOAT

OBS.: tirei o Statement.RETURN_GENERATED_KEYS e gravou normal

mais mesmo assim não me retornou o ultimo registro !

alguém mais poderia me ajudar ? o que poderia ser se o código ta todo certinho porque ele esta apresentando erro =/. lembrando que ele não salva e quando tiro o RETURN_GENERATED_KEYS ele salva ( Banco Firebird ) quem puder ajudar por favor !

Pessoa aqui deu tudo certo, muito obrigado a thimor que ajudou pra caramba

Codigo DAO

        public int getLastId() throws SQLException{ //meu metodo 
        Connection conexao = ConexaoFirebird.getConexao(); //minha conexao
        String retornaUltID = "Select max(ID_VENDA) from CAD_VENDA_PDV"; // Select max que pega o ultimo registro salvo (o que me parece que no Firebird não funciona o Statement.RETURN_GENERATED_KEYS )
        PreparedStatement pstmt =  conexao.prepareStatement(retornaUltID); 
        ResultSet rs = pstmt.executeQuery(); 
        rs.next(); 
        
        int lastId = rs.getInt(1); 
        conexao.close();
                   
    return lastId;
}

Minha Class VendaPDV

    private int ultimaID() throws SQLException{
    VendaDAO vendaDAO = new VendaDAO();
    ModelVenda modelVenda = new ModelVenda(); 
    
     int lastId = (vendaDAO.getLastId());
     
   
           jTNumNF.setText(String.valueOf(lastId));
       
           return lastId;
    }

espero que ajude, como me ajudou tbm, lembrando ja que vc foi ajudado, então sempre procure ajudar ao próximo foi tão bom quando o Thimor me respondia e teve outra pessoa tbm que acho que não faz parte da comunidade mais tbm ajudou muito o Mario Vieira que nem sei de onde é mais ajudou pra caramba