Setar cursor em determinada posição do resultset

2 respostas
marcos3

Pessoal, estou enfrentando uma dificuldade que acredito ser razoavelmente simples de se fazer.

1 - tenha uma tela para cadastro de cidades, onde faço as operações básicas (inserção, alteração, exclusão), nesta interface tenho botões para navegação entre os registros. A navegação está funcionando perfeitamente através de resultset;

2 - nesta mesma tela, ao clicar no botão pesquisar, instancio uma tela do tipo jdialog que exibe todos os registros da respectiva tabela e ao selecionar determinada linha esta tela fecha (dispose()) e os campos da tela de cadastro de cidades são setados com os dados da linha que foi selecionada;

3 - ao fazer esta pesquisa, o cursor do meu resultset perde a referência e os botões de navegação não respondem mais conforme deveriam;

4 - tentei pegar a linha selecionada e fazer com o cursor saltasse para lá através da propriedade absolute() do resultset, mas também não funcionou

Como faço para resolver este problema?

2 Respostas

marcos3
Pessoal, na tentativa de tornar mais claro o que fiz, abaixo a rotina que utilizo para carregar os valores no resultset
try {
            String sql = "Select * from cidade";
            stm = con.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);
            rst = stm.executeQuery();            
            
            rst.first();
            MostrarDados();
        } catch (SQLException ex) {
            JOptionPane.showMessageDialog(null, "Dados não localizados!\n" + ex);
        }
marcos3

Caros colegas, encontrei uma solução que está funcionando. Provavelmente há formas "melhores" de resolver este problema, mas estou considerando minha solução como uma medida paliativa (principalmente por ser iniciante).

1 - Passei a utilizar sobrecarga no método que recupera as informações e as armazena no ResultSet:
private void PreencherResultSet(){
        try {
            String sql = "Select * from cidade";
            stm = con.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);
            rst = stm.executeQuery();    
            rst.first();
            MostrarDados();
        } catch (SQLException ex) {
            JOptionPane.showMessageDialog(null, "Dados não localizados!\n" + ex);
        }
    }
E:
private void PreencherResultSet(String direcao,int id){
        String sql = null;
        try {
                if(direcao == "voltar")
                    sql = "select * from cidade where codigo = (select max(codigo)from cidade where codigo < "+id+")";
                else    
                    sql = "select * from cidade where codigo = (select min(codigo)from cidade where codigo > "+id+")";
                
            stm = con.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);
            rst = stm.executeQuery();   
            
        } catch (SQLException ex) {
            JOptionPane.showMessageDialog(null, "Dados não localizados - método com parametros!\n" + ex +"\n" + ex.getMessage());
        }
    }
2 - Pra evitar repetição de código criei um método que "pega" do ResultSet e seta os campos da tela:
private void MostrarDados(){
        try {
            jtxfCodigo.setText(rst.getString("codigo"));
            jtxtfNome.setText(rst.getString("nome"));
            jtxtfCep.setText(rst.getString("cep"));
            jComboBox1.setSelectedItem(rst.getString("uf"));            
        } catch (SQLException ex) {
            
        }
    }
3 - Nos botões Primeiro e Último, fiz o seguinte:
private void jbtnPrimeiroActionPerformed(java.awt.event.ActionEvent evt) {                                             
        try {   
            PreencherResultSet();
            rst.first();
            MostrarDados();
        } catch (SQLException ex) {
            JOptionPane.showMessageDialog(null, "Dados não localizados!\n" + ex.getMessage());
        }        
    }
E:
private void jbtnUltimoActionPerformed(java.awt.event.ActionEvent evt) {                                           
        try {     
            PreencherResultSet();
            rst.last();
            MostrarDados();            
        } catch (SQLException ex) {
            JOptionPane.showMessageDialog(null, "Dados não localizados!\n" + ex);
        }
    }
4 - Nos botões Anterior e Próximo, para evitar erros nos casos em que já estiver navegando pelo primeiro ou último registro criei métodos que recuperam o primeiro e último registro do banco. Ao clicar em um desses botões eu verifico se o valor do código do registro selecionado corresponde ao valor do primeiro ou último registro do banco, caso sejam iguais chamo a rotina de mostrar dados. Caso sejam diferentes chamo o método sobrescrito para preencher ResultSet:
private String CapturaIdMaximo(){
        String lastId = null;
        try{            
            String sql = "select * from cidade where codigo = (select max(codigo)as id from cidade)";
            stm = con.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);
            rst = stm.executeQuery();
            rst.first();
            lastId = rst.getString("codigo");          
        }catch(SQLException erro){
            JOptionPane.showMessageDialog(null, "Dados não localizados 1!\n"+erro);
        }
        finally{
            return lastId;
        }
    }
    
    private String CapturaIdMinimo(){
        String lastId = null;
        try{            
            String sql = "select * from cidade where codigo = (select min(codigo)as id from cidade)";
            stm = con.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);
            rst = stm.executeQuery();
            rst.first();
            lastId = rst.getString("codigo");          
        }catch(SQLException erro){
            JOptionPane.showMessageDialog(null, "Dados não localizados 1!\n"+erro);
        }
        finally{
            return lastId;
        }
    }
Fazendo as verificações e preenchendo o ResultSet:
private void jbtnAnteriorActionPerformed(java.awt.event.ActionEvent evt) {                                             
        try {            
             int primeiroId = Integer.parseInt(CapturaIdMinimo());
             id_selecionada = Integer.parseInt(jtxfCodigo.getText());
             if(id_selecionada != primeiroId){
                PreencherResultSet("voltar", id_selecionada);
                rst.first();
             }                  
            MostrarDados();
        } catch (SQLException ex) {
            JOptionPane.showMessageDialog(null, "Dados não localizados!\n" + ex.getMessage());
        }
    }    

private void jbtnProximoActionPerformed(java.awt.event.ActionEvent evt) {                                            
        try {     
            int ultimoId = Integer.parseInt(CapturaIdMaximo());
            id_selecionada = Integer.parseInt(jtxfCodigo.getText());
             if(id_selecionada != ultimoId){
                PreencherResultSet("c", id_selecionada);
                rst.first();
             }         
            MostrarDados();            
        } catch (SQLException ex) {
            JOptionPane.showMessageDialog(null, "Dados não localizados2!\n" + ex);
        }
    }

Conforme disse anteriormente, com certeza existem formas melhores e mais práticas de resolver este problema. Mas como medida paliativa encontrei essa forma.

Espero que possa servir como idéia inicial para outros colegas que venham a ter a mesma dúvida que eu.

Criado 31 de outubro de 2014
Ultima resposta 1 de nov. de 2014
Respostas 2
Participantes 1