Organizar os dados na grade

3 respostas
E

Amigos estou precisando de uma força com netbeans, meu código funcionava legal com sunStudio8, estou querendo dispor os dados retornados de uma consulta em uma grade. No meu outro aplicativo feito no studio funcionava normalmente esse código que irei postar aqui, mais no netbeans ele não está organizando os dados na grade gostaria de saber se há alguma diferença no uso dele, entre as aplicações que eu usei?

private boolean consulta(String campos, String tabela, String campo, String texto) throws Exception {
        try {
            //>>fazer a instrução pra contar a quantidade de digitos para a consulta por codigo ou por descrião
            int rcount = 0;
            
            abreCon();
            
            query = con.createStatement();
            rs = query.executeQuery("select "+campos+" from "+tabela+" where ("+campo+" like '"+texto+"') limit 50");
            while (rs.next()) {
                //JOptionPane.showMessageDialog(null, "produto: "+rs.getString(1), "", JOptionPane.INFORMATION_MESSAGE);
                ++rcount;
            }
            if (rcount == 0){
                limpaGrade();
                JOptionPane.showMessageDialog(null, "Nenhum registro encontrado.");
            } else {
                organizaGrade(); //<<<<<<<<<<<<<< ele não organiza a instrução está abaixo
            }

            fechaCon();

            return true;

        } catch (SQLException ex) {
            JOptionPane.showMessageDialog(null, "Não foi possivel executar a consulta.\nVerifique sua conexão.", "Falha...", JOptionPane.WARNING_MESSAGE);
            return false;
        }
    }

    /** Colocar os dados do rs da query na grade */
    private void organizaGrade() throws SQLException{
        limpaGrade();
        //>> e reorganiza
        DefaultTableModel modelo = (DefaultTableModel) grade.getModel();
        while (rs.next()){
            modelo.addRow(new String [] {"","","","",""});
            grade.setValueAt(rs.getString("CODIGO"), rs.getRow()-1, 0);
            grade.setValueAt(rs.getString("DESCRICAO"), rs.getRow()-1, 1);
            grade.setValueAt(rs.getString("QUATIDADE"), rs.getRow()-1, 2);
            grade.setValueAt(rs.getString("VALOR"), rs.getRow()-1, 3);
            grade.setValueAt(rs.getString("PONTUACAO"), rs.getRow()-1, 4); //<< ja foi tentado rs.getString(0)
        }
    }

    /** Faz uma limpeza na grade pra recolocar novos itens */
    private void limpaGrade(){
        DefaultTableModel modelo = (DefaultTableModel) grade.getModel();
        int r = 0;
        while (r != grade.getRowCount()) { modelo.removeRow(0); }
        grade.doLayout();
    }

grade = jTable
query = Statement
rs = ResultSet

se vocês notarem estou trabalhando com variáveis globais, mais não há nenhum problema com elas, já fiz o teste com locais também e não adiantou.

o retorno da consulta eu sei que há, por que se eu subistituir a instrução: organizaGrade(); por uma jOptionPane exibindo uma msg, eu consigo visualizar o retorno normalmente como deveria.
Não tenho experiência em java, já programo em outras linguagens mas java estou iniciando, e tenho muitas dúvidas :lol:

3 Respostas

E

Bom gente, como não tive resposta. Fiz como um bom programador experiênte :slight_smile: Fussei :lol:
Encontrei uma forma bem mais simples refiz o código e funfou legal.

/** Executa a consulta e armazena os dados na rs */
    private boolean consulta(String campos, String tabela, String campo, String texto) throws Exception {
        try {
            //>>fazer a instrução pra contar a quantidade de digitos para a consulta por codigo ou por descrião
            int rcount = 0;
            
            abreCon();
            
            query = con.createStatement();
            rs = query.executeQuery("select "+campos+" from "+tabela+" where ("+campo+" like '"+texto+"') limit 50");

            limpaGrade(); //<<< limpa a grade e cria o novo modelo
            
            while (rs.next()) {
                ++rcount;
                organizaGrade(); //<<< executa a adição da linha na grade
            }

            if (rcount == 0){
                JOptionPane.showMessageDialog(null, "Nenhum registro encontrado.");
            }

            fechaCon();

            return true;
        } catch (SQLException ex) {
            JOptionPane.showMessageDialog(null, "Não foi possivel executar a consulta.\nVerifique sua conexão.", "Falha...", JOptionPane.WARNING_MESSAGE);
            return false;
        }
    }

    /** Colocar os dados do rs da query na grade */
    private void organizaGrade() throws SQLException{
        //retirei o enquanto daqui e pus somente a adição da linha já chamando direto o valor do resultset
        modelo.addRow(new Object[] {
            rs.getString("codigo"),
            rs.getString("descricao"),
            rs.getFloat("quantidade"),
            rs.getFloat("valor"),
            rs.getInt("pontuacao")
        });
        
    }

    /** Faz uma limpeza na grade pra recolocar novos itens */
    private void limpaGrade(){
        modelo = (DefaultTableModel) grade.getModel(); //<<< como o modelo já está sendo criado aqui então não precisa fazê-lo de novo.
        int r = 0;
        while (r != grade.getRowCount()) { modelo.removeRow(0); }
        grade.doLayout();
    }

Bom ai deixo a dica pra quem ta iniciando:
Fusse até uma solução. :roll:

Se tiverem outras idéas me postem eu aceito :wink:
Flws gente! espero que isso ajude outras pessoas também.

discorpio

Boa tarde Eder.Mcastro.

Pelo menos voce sabe porque o primeiro código não funcionou :?:

Bom, se sabe tudo bem, porém vou postar aqui para que os demais também entendam porque não funcionou.

Se voce está utilizando um ResultSet do tipo "Forward Only" (para frente somente), então voce só poderá fazer a navegação do ResultSet somente uma vez, e no outro código voce tentou fazer duas vezes, assim:

Primeira navegação

.....
while (rs.next()) {   
            //JOptionPane.showMessageDialog(null, "produto: "+rs.getString(1), "", JOptionPane.INFORMATION_MESSAGE);   
            ++rcount;   
}
....

Segunda navegação

while (rs.next()){   
        modelo.addRow(new String [] {"","","","",""});   
        grade.setValueAt(rs.getString("CODIGO"), rs.getRow()-1, 0);   
        grade.setValueAt(rs.getString("DESCRICAO"), rs.getRow()-1, 1);   
        grade.setValueAt(rs.getString("QUATIDADE"), rs.getRow()-1, 2);   
        grade.setValueAt(rs.getString("VALOR"), rs.getRow()-1, 3);   
        grade.setValueAt(rs.getString("PONTUACAO"), rs.getRow()-1, 4); //<< ja foi tentado rs.getString(0)   
}

No segundo código voce utilizou apenas uma navegação:

....
while (rs.next()) {   
            ++rcount;   
            organizaGrade(); //<<< executa a adição da linha na grade   
}
.....
.....
.....
private void organizaGrade() throws SQLException{   
    //retirei o enquanto daqui e pus somente a adição da linha já chamando direto o valor do resultset   
    modelo.addRow(new Object[] {   
        rs.getString("codigo"),   
        rs.getString("descricao"),   
        rs.getFloat("quantidade"),   
        rs.getFloat("valor"),   
        rs.getInt("pontuacao")   
    });   
       
}

Ai funcionou.

Não sei o porque no outro Editor Java, o primeiro código estava funcionando, pois também não era para funcionar

Nada te impede de voce criar ResultSets com navegação bidirecional (para frente e para traz), para isto voce deve criar o Statment desta forma:

...
query = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);   
rs = query.executeQuery("select "+campos+" from "+tabela+" where ("+campo+" like '"+texto+"') limit 50");
....

Ai voce pode e deve até navegar com os seguintes métodos do ResultSet.

rs.beforeFirst; // coloca o ponteiro do registro uma estrutura acima do primeiro
rs.first;  // coloca o ponteiro do registro no primeiro
rs.previous; // coloca no anterior;
rs.next // coloca no próximo;
rs.last // coloca no último;
rs.afterLast    // coloca-o  numa estrutura depois do último
E

Gostei da ideia de usar

query = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);

Com certeza vai ser muito util.

Agora a questão da navegação repetida realmente foi isso que me inspirou pra remover e resolver o problema sozinho, pois analisando bem o outro código fonte, reparei isso.

Muito obrigado amigo! já me inspirou mais um pouco. :slight_smile:

Criado 13 de fevereiro de 2010
Ultima resposta 13 de fev. de 2010
Respostas 3
Participantes 2