Digitar num Edit e mostrar no DBGrid (Delphi 2009 + Firebird 1.5)
Boa noite, galera!!!
É o seguinte, estou quebrando cabeça aqui pra fazer algo que não quer funcionar de jeito nenhum! É algo simples, mas eu ainda não manjo tanto de Delphi e pra mim é complicado.
Eu tenho um programinha de cadastro aqui e uso um DBGrid com um DBNavigator. O DBGrid fica o tempo todo preenchido com todas as informações de uma tabela.
O caso é que eu preciso que ao digitar algo no Edit1, os dados do DBGrid sumam e apareçam apenas os registros que começem com a letra que eu digitei. Basicamente seria um "like" no evento "onchange" do Edit1.
Alguém saberia me dizer como fazer isso considerando que utilizo os componentes IBDatabase, IBTransaction, IBQuery, IBUpdateSQL e DataSource?
Muito obrigado a quem puder ajudar!!!
É o seguinte, estou quebrando cabeça aqui pra fazer algo que não quer funcionar de jeito nenhum! É algo simples, mas eu ainda não manjo tanto de Delphi e pra mim é complicado.
Eu tenho um programinha de cadastro aqui e uso um DBGrid com um DBNavigator. O DBGrid fica o tempo todo preenchido com todas as informações de uma tabela.
O caso é que eu preciso que ao digitar algo no Edit1, os dados do DBGrid sumam e apareçam apenas os registros que começem com a letra que eu digitei. Basicamente seria um "like" no evento "onchange" do Edit1.
Alguém saberia me dizer como fazer isso considerando que utilizo os componentes IBDatabase, IBTransaction, IBQuery, IBUpdateSQL e DataSource?
Muito obrigado a quem puder ajudar!!!
Ricardo
Curtidas 0
Melhor post
Ricardo
25/06/2013
Agradeço muito a todos que deixaram aqui uma resposta e aos que entraram no tópico também!
Resolvi o problema com a dica que o colega deu de usar o locate. Ficou assim:
Tive que colocar um if else para que quando eu apague o que for digitado a seleção volte ao registro inicial. E como meu a tabela não vai ter mais que 100 registros e os campos são pequenos, a consulta é instantânea!
Resolvi o problema com a dica que o colega deu de usar o locate. Ficou assim:
procedure TForm1.Edit1Change(Sender: TObject);
begin
if (Edit1.Text='') then
begin
DBNavigator1.BtnClick(nbFirst);
end
else
begin
dbgrid1.datasource.dataset.locate(dbgrid1.columns[0].fieldName,Edit1.text,[loPartialKey,locaseInsensitive]);
end;
end;
Tive que colocar um if else para que quando eu apague o que for digitado a seleção volte ao registro inicial. E como meu a tabela não vai ter mais que 100 registros e os campos são pequenos, a consulta é instantânea!
GOSTEI 1
Mais Respostas
Landerson Santos
22/06/2013
Tente fazer um locate, associando ao campo do seu grid, no evento on change do Edit...
Assim a cada letra alteração no edit ele faria atualização filtrando o conteúdo do campo selecionado.
Deve funcionar, porém fique atento a questões de desempenho, talvez não seja interessante trazer todos os registro pro grid e depois filtrá-lo, pense nisso!
Assim a cada letra alteração no edit ele faria atualização filtrando o conteúdo do campo selecionado.
Deve funcionar, porém fique atento a questões de desempenho, talvez não seja interessante trazer todos os registro pro grid e depois filtrá-lo, pense nisso!
GOSTEI 0
Ricardo
22/06/2013
Tente fazer um locate, associando ao campo do seu grid, no evento on change do Edit...
Assim a cada letra alteração no edit ele faria atualização filtrando o conteúdo do campo selecionado.
Deve funcionar, porém fique atento a questões de desempenho, talvez não seja interessante trazer todos os registro pro grid e depois filtrá-lo, pense nisso!
Assim a cada letra alteração no edit ele faria atualização filtrando o conteúdo do campo selecionado.
Deve funcionar, porém fique atento a questões de desempenho, talvez não seja interessante trazer todos os registro pro grid e depois filtrá-lo, pense nisso!
Eu fiz um locate no onchange do Edit1 assim:
dbgrid1.datasource.dataset.locate(dbgrid1.columns[0].fieldName,Edit1.text,[loPartialKey,locaseInsensitive]);
Só que encontrei alguns problemas:
1º - Quando eu digito a letra "a", ele aponta o primeiro registro que começa com "a" e só. Se eu digitar "alan", por exemplo, ele não anda mais, só fica no primeiro registro que encontrou.
2º - O ideal seria que os outros registros sumissem e só fossem ficando os registros que começassem com o que eu estivesse digitando. Por exemplo, se eu digitar "a", devem vir todos que comecem com "a", mas se digitar "al", devem ficar só os que comecem com "al" e os outros sumissem, etc.
E quanto ao problema de desempenho, esse banco não receberá um número grande de registros nunca. No máximo uns 100 registros pequenos, por isso a perda de desempenho é imperceptível!
GOSTEI 0
Ricardo
22/06/2013
Minto, se eu continuar digitando ele mostra os outros registros sim, mas continua o problema de os outros registros aparecerem juntos no DBGrid. O ideal é que os outros sumam mesmo.
GOSTEI 0
Joel Rodrigues
22/06/2013
O Locate filtra apenas os valores exatos, não?
Nesse caso, acho que você vai precisar usar o Filter.
Nesse caso, acho que você vai precisar usar o Filter.
GOSTEI 0
Marco Salles
22/06/2013
Sobre a questão de performance pode ser melhorada utilizando o Padrão abaixo
http://marcosalles.wordpress.com/?s=Verificar+quando+usu%C3%A1rio+parou+de+Digitar
apesar de assutador para os novatos , o ganho são enormes
não sei se no delphi 2009 tem todos os recursos ...
Quanto ao filtro tente aseguinte instrução
http://marcosalles.wordpress.com/?s=Verificar+quando+usu%C3%A1rio+parou+de+Digitar
apesar de assutador para os novatos , o ganho são enormes
não sei se no delphi 2009 tem todos os recursos ...
Quanto ao filtro tente aseguinte instrução
DataSet.Filtered := False; DataSet.Filter := 'CAMPO LIKE '+QuotedStr(Edit1.text+%); DataSet.Filtered := True;
GOSTEI 0
José
22/06/2013
Obrigado Ricardo pelo retorno, já que sua duvida foi solucionada estou dando o tópico por concluído.
GOSTEI 0