Digitar num Edit e mostrar no DBGrid (Delphi 2009 + Firebird 1.5)

Delphi

22/06/2013

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!!!

Ricardo

Ricardo

Curtidas 0

Melhor post

Ricardo

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:

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

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!
GOSTEI 0
Ricardo

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!


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

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

Joel Rodrigues

22/06/2013

O Locate filtra apenas os valores exatos, não?
Nesse caso, acho que você vai precisar usar o Filter.
GOSTEI 0
Marco Salles

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

DataSet.Filtered := False;
DataSet.Filter := 'CAMPO LIKE '+QuotedStr(Edit1.text+%);
DataSet.Filtered := True;
GOSTEI 0
José

José

22/06/2013

Obrigado Ricardo pelo retorno, já que sua duvida foi solucionada estou dando o tópico por concluído.
GOSTEI 0
POSTAR