-
[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.
-
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
-
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).
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.
-
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 em vez disto
-
Post Thanks / Like - 1 Likes, 0 Likes