Primeiro resultado de busca sql não aparece na tabela

10 respostas Resolvido
sqljava
R

Olá, Devs.

Me apareceu um probelma um tanto quanto inusitado. Estava montando a tela do meu programa com uma tabela, criei ela normal que nem criei as outras, e quando executei o SQL para exibir o resultado na tabela percebi que ela sempre oculta o primeiro resultado.
EX do Do Banco:

SUB-ITEM | QUANTIDADE | IDPROD
1 | 11 | 1
2 | 10 | 1
3 | 11 | 2
4 | 10 | 2

Executando no Workbench eu peço todos os subitens e quantidades que tenham o idprod=1, então ele me retorna:
1 | 11
2 | 10

Mas no java ele está me retornando:
2 | 10

e se eu por em ordem decrescente ele retorna:
1 | 11
// pq o sub-item 2 iria ser o primeiro resultado.

Só nessa tela que tá acontecendo isso.
Alguem pode me explicar o que pode tá acontecendo?

10 Respostas

I

Rapaz , que estranho haha …

Manda a query que voce esta usando

R

Eu também “sofro” com este problema, pra resolver eu adiciono o item duas vezes:

public List<Recado> listAll() {
        conecta.conexao();
        List<Recado> lista = new ArrayList<>();
        try {
            conecta.executaSQL("SELECT * FROM recado WHERE status = 'Não Entregue' ORDER BY importancia DESC");
            
            conecta.rs.first();

            Recado mod = new Recado();
            mod.setId(conecta.rs.getInt("id"));
            mod.setPorteiro(conecta.rs.getString("porteiro"));
            mod.setMensagem(conecta.rs.getString("mensagem"));
            mod.setImportancia(conecta.rs.getString("importancia"));
            mod.setStatus(conecta.rs.getString("status"));
            lista.add(mod);

            if (conecta.rs.next()) {
                do {
                    Recado mod2 = new Recado();
                    mod2.setId(conecta.rs.getInt("id"));
                    mod2.setPorteiro(conecta.rs.getString("porteiro"));
                    mod2.setMensagem(conecta.rs.getString("mensagem"));
                    mod2.setImportancia(conecta.rs.getString("importancia"));
                    mod2.setStatus(conecta.rs.getString("status"));

                    lista.add(mod2);
                } while (conecta.rs.next());
            } else {
                System.out.println("Tabela Vazia");
            }

        } catch (SQLException ex) {
            ex.printStackTrace();
        } finally {
            conecta.desconecta();
        }

        return lista;
    }

//Lista sem o first

//Lista com o first

R

Incompetência minha mesmo, só trocar rs.next(), por rs.first()

....
        if (conecta.rs.first()) {
            do {
                Recado mod = new Recado();
                mod.setId(conecta.rs.getInt("id"));
                mod.setPorteiro(conecta.rs.getString("porteiro"));
                mod.setMensagem(conecta.rs.getString("mensagem"));
                mod.setImportancia(conecta.rs.getString("importancia"));
                lista.add(mod);
            } while (conecta.rs.next());
        } else {
            System.out.println("Tabela Vazia");
        }
        ....

Agora está perfeito :grinning::grinning:

(ensinando que a gente aprende hahaha)

R

Poxa kkkk Adicionar o item 2 vezes é fora de cogitação por que para controlar as quantidades depois iria ficar complicado pro cliente.

R

select nome, quantidade from tab_subitem where idprod=5;

Se eu usar esse código no workbench ou sql editor da o retorno correto, mas no java não.

R

Nem trocando por first() dá certo.

1
// NO Workbench

2
// Na aplicação

private void buscarsubitem() {
        try {
            String sql = "select nome, quantidade from tab_subitem where idprod=?";
            pst = conexao.prepareStatement(sql);
            pst.setString(1, cId.getText());
            rs = pst.executeQuery();

            if (rs.next()) {

                tSubItens.setModel(DbUtils.resultSetToTableModel(rs));
                
            } else {
                JOptionPane.showMessageDialog(null, "Erro(#tbo01): Sub-Item não encontrado.");
            }

        } catch (HeadlessException | SQLException e) {
            JOptionPane.showMessageDialog(null, "Erro(#tbo02): " + e);
        }
    }
R
Solucao aceita

Descobri o problema!
Eu estava colocando o método de povoar a tabela dentro do IF:

if (rs.next()) {

                tSubItens.setModel(DbUtils.resultSetToTableModel(rs));
                
            } else {
                JOptionPane.showMessageDialog(null, "Erro(#tbo01): Sub-Item não encontrado.");
            }

O rs.next() do if fazia com que o rs pulasse para a linha 2. Ao usar esse tipo de método se coloca sem o if. no Caso o certo é:

private void buscarsubitem() {
        try {
            String sql = "select nome, quantidade from tab_subitem where idprod=?";
            pst = conexao.prepareStatement(sql);
            pst.setString(1, cId.getText());
            rs = pst.executeQuery();
      
            tSubItens.setModel(DbUtils.resultSetToTableModel(rs));
          
        } catch (HeadlessException | SQLException e) {
            JOptionPane.showMessageDialog(null, "Erro(#tbo02): " + e);
        }
    }
R

Na realidade não, o if vai checar se o resultado existe mesmo. A ausência dele vai te causar um SQLException, que quando a tabela estiver vazia, no seu caso, vai gerar uma mensagem

R

Ah.
Bom, pelo menos sem o if funciona, mesmo sendo gambiarra no código. Melhor tratar com o Exception, quando houver, do que continuar com o erro.

R

:face_with_raised_eyebrow::face_with_raised_eyebrow::face_with_raised_eyebrow:

Criado 8 de fevereiro de 2020
Ultima resposta 9 de fev. de 2020
Respostas 10
Participantes 3