Resultados 1 a 4 de 4

Tópico: [Erro em pesquisar funcionario por nome]

  1. #1
    Membro ingresso Avatar de thia
    Data de Ingresso
    Oct 2010
    Posts
    107
    Post Thanks / Like

    [Erro em pesquisar funcionario por nome]

    opa pessoal, eu estou com um probleminha aqui em um sistema que estou fazendo e queria que algum pudesse me ajudar, eu fiz um sistema de pesquisa em java, e esta certo , esta funcionando , mais o problema é quando eu coloco o ID 1 por exemplo el pula para outro ID , ele esta pesquisando só por nome , mais tem dois cliente que começa com a letra r e ele nao pega o primeiro nome cadastrado com r ele pega o segundo , como eu arrumo isso, alguem pode me ajudar..... o codigo esta ai em baixo;
    Código:
    [ public Funcionario BuscarFuncionario(String cod){]        
             String sql = "select * from Funcionario where nome like '" + cod + "%'";
             
             Funcionario f = new Funcionario();
             
             try(PreparedStatement stmt = conexao.prepareStatement(sql)){
                 ResultSet rs = stmt.executeQuery();
                 while(rs.next()){
                     f.setCodigo(rs.getInt("codigo"));
                     f.setNome(rs.getString("nome"));
                     f.setCargo(rs.getString("cargo"));
                 }
             }catch (SQLException ex) {
                Logger.getLogger(Conexao.class.getName()).log(Level.SEVERE, null, ex);
            }
             
        return f;
        }
    
    
    [}] esse é o metodo buscarFuncionario
    
    [esse é batao aonde eu chamo o método ]
      private void jBuscarActionPerformed(java.awt.event.ActionEvent evt) {                                        
            Funcionario f = new Funcionario();
            String codNome = String.valueOf(jTnome.getText());
            
            try {
                conexao = new Conexao();
                f = conexao.BuscarFuncionario(codNome);
                jTcodigo.setText(String.valueOf(f.getCodigo()));
                jTnome.setText(f.getNome());
                jTcargo.setText(f.getCargo());
                
            } catch (ClassNotFoundException ex) {
                Logger.getLogger(TelaFuncionario.class.getName()).log(Level.SEVERE, null, ex);
            }
            
        }
    Última edição por guedes.acp; 02 Mar 2017 às 08:16.

  2. #2
    Hacker ingresso Avatar de guedes.acp
    Data de Ingresso
    Sep 2010
    Localização
    #!/usr/bin/env perl
    Posts
    1.445
    Post Thanks / Like
    Vamos ver, depois de anos vc ainda não sabe usar as tags CODE e PHP pra postar seu código

    Eu não sou expert em java mas achei estranho esse linha
    Código:
    String codNome = String.valueOf(jTnome.getText());
    Se vc ta usando um banco de dados seria ideal vc verificar como os fields estão preenchidos, as vezes o 1 nome é comumente guardado em uma coluna diferente do resto do nome e talvez vc esteja na coluna errada, de fato é muito comum mesmo em cadastros ter "name" e "codname".
    So respondo se a consiencia perguntar!!!
    Não Respondo MP's de perguntas, as faça em um tópico!

    Perl User, Bioinformatcs Programmer!


    just another biomedical perl hacker try to learn Delphi

  3. #3
    Membro ingresso Avatar de hacker_wap
    Data de Ingresso
    Feb 2009
    Posts
    152
    Post Thanks / Like

    Post

    O tempo passa mas você não muda em guedes.acp, deu bobeira leva uma na orelha.

    Só vou responder porque o tópico é recente, ao menos para o atual padrão do forum.

    Baseado nas informações que você passou o que está acontecendo é o seguinte.

    Dado os seguintes dados da tabela funcionario:

    Tabela funcionario
    id nome
    1 thia
    8 guedes acp
    10 root_striker
    14 kepler
    22 hacker_wap
    30 rodrigo
    31 guga

    O seguinte select hipotético SELECT * FROM funcionario WHERE nome LIKE 'r%' retornaria:
    id nome
    10 root_striker
    30 rodrigo

    E este outro select hipotético SELECT * FROM funcionario WHERE id LIKE '1%' retornaria:
    id nome
    1 thia
    10 root_striker
    14 kepler

    Sabendo o resultado destes select's vamos ao problema.

    Dado o seguinte trecho do seu código.

    Código:
    ResultSet rs = stmt.executeQuery();
    while(rs.next()){
        f.setCodigo(rs.getInt("codigo"));
        f.setNome(rs.getString("nome"));
        f.setCargo(rs.getString("cargo"));
    }
    Vamos analisar as seguintes linhas.

    Código:
    ResultSet rs = stmt.executeQuery();
    A variável do rs do tipo ResultSet representa um cursor(imagine um ponteiro ou indice que aponta para uma linha/registro do resultado da consulta), inicialmente ele está posicionado na linha anterior a primeira linha/registro(basicamente no limbo/nada).

    Código:
    while(rs.next())
    O método rs.next() tenta avançar o cursor para a proxíma linha/registro, caso consiga(não tenha chegado ao final) retorna true, caso contrário retorna false.

    o while irá executar o conteúdo de seu bloco(delimitado por { }) enquanto rs.next retornar true.

    Caso seu select não tenha retornado resultados na primeira interação rs.next irá retorna false e os dados da variavél funcionario ficarão em branco.

    Caso seu select tenha retornado somente uma linha/registro, o bloco será executado uma vez e você terá o resultado esperado.

    Porem agora chegamos ao seu problema, caso o select tenha retornado multiplas linhas conforme os exemplos que dei no inicio, o while irá executar o bloco de código para cada linha/registro.

    Código:
    {
        f.setCodigo(rs.getInt("codigo"));
        f.setNome(rs.getString("nome"));
        f.setCargo(rs.getString("cargo"));
    }
    E o que seu bloco de código faz é definir o valor dos campos da variavel funcionario, dessa forma a cada interação ele irá substituir o conteudo da variável com os dados da linha/registro atual e no final ela conterá os dados da última linha/registro.

    Caso você queira sempre os dados da primeira linha/registro da consulta você pode simplismente trocar o while por um if, dessa forma caso a consulta tenha retornado ao menos uma linha/registro o cursor irá avançar para ela(lembre-se inicialmente estamos no limbo/nada em uma posição anterior a primeira linha/registro) e você terá o resultado esperado.

    Código:
    ResultSet rs = stmt.executeQuery();
    if(rs.next()){
        f.setCodigo(rs.getInt("codigo"));
        f.setNome(rs.getString("nome"));
        f.setCargo(rs.getString("cargo"));
    }
    Porem a unica forma de visualizar as outras linhas/registros é sendo mais especifico na consulta, algo que funcionaria com o código atual, exceto se existirem duas ou mais linhas com o mesmo valor no campo utilizado no filtro.

    No caso da busca utilizando o ID eu sugiro utilizar a seguinte consulta SELECT * FROM funcionario WHERE id = '1' dessa forma você somente terá um ou nenhum resultado.



    Agora caso queira exibir todos os resultados, bom ai você precisaria encontrar uma forma de exibi-los e isso fica para um outro tópico.

    Adicionalmente, sugiro que pesquise ou pergunte em outro tópico sobre o uso de prepared statements para que você possa passar parametros de forma segura para sua consulta, pois da forma atual seu código está vunerável a SQL injection, bastando alguem informar uma aspas simples para quebrar sua consulta.
    É melhor não dizer nada e pensarem que é bobo, do que abrir a boca e acabar com as duvidas.

  4. #4
    Membro ingresso Avatar de b4l4
    Data de Ingresso
    Oct 2007
    Posts
    275
    Post Thanks / Like
    Já que é um método de pesquisa, e só ta pesquisando por nome, acho que vc tereia que retornar uma lista de clientes ( List<Clientes> ) e não apenas um cliente.
    Ai ele traria todos os clientes com "R" no nome.
    mais se vc quer trazer os dados de apenas um cliente o correto da pesquisa seria pelo ID e não necessitaria do "LIKE" na consulta SQL.

    e usa isso
    if(rs.next())
    em vez disto
    while(rs.next())

Permissões de Postagem

  • Você não pode iniciar novos tópicos
  • Você não pode enviar respostas
  • Você não pode enviar anexos
  • Você não pode editar suas mensagens
  •