Boa tarde galera…
Eu esqueci como se chama ou de como chamar isto em linguagem de programacao… tipo:
tenho um metodo pesquisar emminha aplicacao:
[code]con_cliente.executeSQL(“select * from cliente where cli_nome like '”+tf_pesquisa.getText()
+"%’ order by "+ordenacao);
preencher_jtable(); // filtrar na grade sem clicar no botao filtrar
try
{
con_cliente.resultset.first();
String igual = “n”;
int tamanho_pesquisa = tf_pesquisa.getText().length();
while (igual == “n”)
{
String pesquisado = con_cliente.resultset.getString(“cli_nome”).substring(0,(tamanho_pesquisa));
if(pesquisado.equals(tf_pesquisa.getText()))
{
igual = “s”;
}
else
con_cliente.resultset.next();
}
// mostra conteudo da tabela
tf_codigo.setText(con_cliente.resultset.getString(“cli_codigo”));
mostrar_dados();
}
catch(Exception erro)
{
JOptionPane.showMessageDialog(null,"Não conseguiu localizar");
}[/code]
Funciona de boa… mas eu queria pesquisar sem ficar tipo digitando igualzinho esta no banco… ex: Maria. Se eu digitar : maria , ele me traga independente da forma em que foi salvo… Esqueci ate como se chama esse processo ai… case sensitive? seria isso mesmo?
Hmm, case sensitive, é a diferenciação …
insensitive é quando não tem…
CASE SENSITIVE é quando você quer que minúsculas e maiúsculas sejam diferentes.
CASE INSENSITIVE é quando você quer o contrário.
Muitas vezes isso é uma opção na instalação do banco de dados (por exemplo, o Sybase e o MS SQL Server funcionam assim). Então as pesquisas não levam em conta essa diferença.
Em outros casos, você pode normalizar seu banco de dados (para ter os dados sempre em maiúsculas, por exemplo). Com alguns bancos de dados você é obrigado a fazer dessa maneira.
Dependendo do tipo de consulta, é melhor usar algum recurso de busca que seu próprio banco tenha - muitas vezes isso é muito, muito mais rápido que um LIKE. Isso costuma se chamar “full-text search” ou alguma coisa parecida.
con_cliente.executeSQL("select * from cliente where lower(cli_nome) like '"+tf_pesquisa.getText().toLowerCase()
+"%' order by "+ordenacao);
Veja se seu banco tem a funcao lower()… pode ser que seja diferente
1 curtida
Poizé. Eu vejo uma query com “like” e “lower” e já vejo um “table scan”… isso me dá arrepios. Mas muitas vezes você é obrigado a fazer uma coisa dessas. Se a base de clientes tiver um milhão de clientes provavelmente você não usaria “like” e “lower” e sim um “full text search” ou coisa parecida. Tendo 10 mil clientes não há problemas em fazer um table scan de vez em quando.
Geralmente o pessoal que faz aplicações com muitos registro padroniza a inserção dos dados no banco, no caso sempre em MAIUSCULO no caso todos os campos de entrada inserem dados em maiusculo, ja fazem isso pra evitar essas incomodações com case sensitive e ganhar performe no banco.
Pode também colocar a transação em modo case insensitive, ou accent insensitive, e fazer a consulta. Cada banco tem o seu modo de fazer.
galera dessa forma aqui funciona:
con_cliente.executeSQL("select * from cliente where lower(cli_nome) like '"+tf_pesquisa.getText().toLowerCase()
+"%' order by "+ordenacao);
porem no meu :catch(Exception erro)
{
JOptionPane.showMessageDialog(null,"Não conseguiu localizar");
}
a mensagem insiste em dizer q nao conseguiu localizar… OBVIO que para contornar o problema é facil, somente comentar ou deletar a linha da mensagem. Porem alguem sabe expicar o porque ele retorna dizendo que nao localizou? Sera algum erro do banco? ou do codigo? Sou iniciante, desculpa qq bobera que eu tenha dito… rsrsrs.
Banco de dados : Postgres.
Obs: vi em um topico aqui que o Ilike
tbm funciona… Ele busca o dado tbm, porem insiste na msg de que nao conseguiu localizar… Qual dessas formas seria a melhor para uso?
faz isso:
[code]catch(Exception erro)
{
JOptionPane.showMessageDialog(null,“Não conseguiu localizar”);
erro.printStackTrace();
}
[/code]
Assim será mais fácil saber o que aconteceu…
tenhos alguns comentários sobre o código…
a sua variável igual é do tipo String. no seu while você a compara com == . utilize o método equals() no lugar…
na verdade essa variável está atuando como uma flag… mais apropriado é utilizar um variável do tipo boolean para isto.
pelo que entendi, o while do seu código percorre o recordset até o inicio do campo cli_nome for igual a string pesquisa.
mas é exatamente isso que o seu select já faz! esse loop é desnecessário…
outra coisa, você está montando sua query sql diretamente com o o valor do componente tf_pesquisa.
isso deixa sua aplicação vulnerável a um Sql Injection. Teste colocar no campo uma aspas simples e veja o que acontece.
sobre seu tratamento de erro, qualquer exception que seja lançada vai dar a mensagem de que o registro não foi encontrado.
conforme mencionado na resposta acima, imprima o stack trace do erro para ver o que realmente acontece.
e aconselho evitar colocar mensagens específicas (“Não conseguiu localizar”) para esse tipo de tratamento genérico…
e alguns comentários sobre a solução…
o uso de uma pesquisa com “full-text-search” traz ainda várias vantagens nesse caso, dependendo do banco.
você pode configurar pra uma pesquisa por “gabriela”, por exemplo, retornar registros para “gabrielle”, “grabiela”, “gabriella” e coisas assim…
para nomes de clientes é um recurso maravilhoso.
não sei se todos bancos tem suporte a isso e se frameworks ORM disponibilizam essas funções de forma padronizada.
mas com certeza é um recurso de pesquisa que deveria ser mais popularizado.
galera… bom dia…
com o : JOptionPane.showMessageDialog(null,"Não conseguiu localizar");
erro.printStackTrace();
me da esses seguintes erros aqui… :org.postgresql.util.PSQLException: ResultSet não está posicionado corretamente, talvez você precise chamar next.
at org.postgresql.jdbc2.AbstractJdbc2ResultSet.checkResultSet(AbstractJdbc2ResultSet.java:2576)
at org.postgresql.jdbc2.AbstractJdbc2ResultSet.getString(AbstractJdbc2ResultSet.java:1853)
at org.postgresql.jdbc2.AbstractJdbc2ResultSet.getString(AbstractJdbc2ResultSet.java:2292)
at cadastros.cad_cliente.tf_pesquisaActionPerformed(cad_cliente.java:829)
at cadastros.cad_cliente.access$300(cad_cliente.java:23)
at cadastros.cad_cliente$4.actionPerformed(cad_cliente.java:321)
at javax.swing.JTextField.fireActionPerformed(JTextField.java:492)
at javax.swing.JTextField.postActionEvent(JTextField.java:705)
at javax.swing.JTextField$NotifyAction.actionPerformed(JTextField.java:820)
at javax.swing.SwingUtilities.notifyAction(SwingUtilities.java:1636)
at javax.swing.JComponent.processKeyBinding(JComponent.java:2844)
at javax.swing.JComponent.processKeyBindings(JComponent.java:2879)
at javax.swing.JComponent.processKeyEvent(JComponent.java:2807)
at java.awt.Component.processEvent(Component.java:5815)
at java.awt.Container.processEvent(Container.java:2058)
at java.awt.Component.dispatchEventImpl(Component.java:4410)
at java.awt.Container.dispatchEventImpl(Container.java:2116)
at java.awt.Component.dispatchEvent(Component.java:4240)
at java.awt.KeyboardFocusManager.redispatchEvent(KeyboardFocusManager.java:1848)
at java.awt.DefaultKeyboardFocusManager.dispatchKeyEvent(DefaultKeyboardFocusManager.java:693)
at java.awt.DefaultKeyboardFocusManager.preDispatchKeyEvent(DefaultKeyboardFocusManager.java:958)
at java.awt.DefaultKeyboardFocusManager.typeAheadAssertions(DefaultKeyboardFocusManager.java:830)
at java.awt.DefaultKeyboardFocusManager.dispatchEvent(DefaultKeyboardFocusManager.java:657)
at java.awt.Component.dispatchEventImpl(Component.java:4282)
at java.awt.Container.dispatchEventImpl(Container.java:2116)
at java.awt.Window.dispatchEventImpl(Window.java:2429)
at java.awt.Component.dispatchEvent(Component.java:4240)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:273)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:183)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:173)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:168)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:160)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:121)
BUILD SUCCESSFUL (total time: 8 seconds)
Fiquei ate assustado porque aparentemente funciona… e internamente da esse tanto de erro? Tentei N modificacoes e continua mesmo assim.
agora somente com um botao que filtra: con_cliente.executeSQL("select * from cliente where cli_nome Ilike '"+tf_pesquisa.getText()
+"%' order by "+ordenacao);
preencher_jtable();
com esse botao filtrar funciona sem mensagens de erro… pq tbm eu acho q ele nao trata erro algum ai neste caso. Mas o “massa” mesmo seria digitar e apertar em seguida “ENTER” …
colocando um +erro na mensagem el;e me diz que precisa chamar um resultset.next(). Onde tenho esses resultset’s troquei por next(), mas continua, acrescentei em determinados lugares e mesmo assim.
Qto as dicas da galera ai em cima estou lendo com calma para que eu possa entender… Desde ja agradeco a todos!!!
galera com isto aqui consegui com que ele pesquise sem retornar qq erro, sem aquela prezepada toda do outro codigo acima citado: gostaria da opniao de voces se é valido :
try{
con_cliente.executeSQL("select * from cliente where cli_nome Ilike '"+tf_pesquisa.getText()
+"%' order by "+ordenacao);
preencher_jtable();
}
catch(Exception erro)
{
erro.printStackTrace();
}
ao inves de usar isso
con_cliente.resultset.first();
tente usar isso
con_cliente.resultset.next();
troquei sim o first pelo next, continou na mesma…
try{
con_cliente.executeSQL("select * from cliente where cli_nome Ilike '"+tf_pesquisa.getText()
+"%' order by "+ordenacao);
preencher_jtable();
}
catch(Exception erro)
{
erro.printStackTrace();
}
esse ultimo ai seria uma forma certa de se utilizar? Ate que ta funcionando trankilo sem erros… Queria saber se é uma forma certa, achei que ficou ate mais enchuto do que o codigo la de cima…
Deu o mesmo problema no post de outro cara… mas nao sei como ele resolveu…
Talvez o driver JDBC seja de versao incompatível com a versão do seu banco de dados… foi o que sugeri a ele verificar
O que tem na linha 829 do seu arquivo cad_cliente.java?
(poste as duas linhas anteriores e as duas linhas posteriores também.)
na linha 829 temos:
while (igual == "n")
duas linhas ateriores:
String igual = "n";
int tamanho_pesquisa = tf_pesquisa.getText().length();
duas linhas posteriores:
[code]{
String pesquisado = con_cliente.resultset.getString(“cli_nome”).substring(0,(tamanho_pesquisa));
if(pesquisado.equals(tf_pesquisa.getText()))
{
igual = "s";
} [/code]
Vc chegou a chamar o next desse objeto?
con_cliente.resultset
???
Se nao chamou tem que chamar con_cliente.resultset.next()
antes de usar o getString