Consulta dentro do OnChange do edit

Delphi

17/05/2007

Boa Tarde Galera!

O que me parecia uma coisa tão facil torno-se complicada na hora do vamos ver.

Estou montando uma consulta para a medida que o usuário vai digitando os supostos nomes vão aparecendo só que do jeito que eu fiz digitando a primeira letra aparece um nome e depois eu posso digitar o que eu quizer que não muda mais. Eu tentei com o lacate do ADOQuery.

Se alguem puder me dizer a onde estou errando eu agradeço.


Ruyoutor

Ruyoutor

Curtidas 0

Respostas

Adriano Santos

Adriano Santos

17/05/2007

Boa Tarde Galera! O que me parecia uma coisa tão facil torno-se complicada na hora do vamos ver. Estou montando uma consulta para a medida que o usuário vai digitando os supostos nomes vão aparecendo só que do jeito que eu fiz digitando a primeira letra aparece um nome e depois eu posso digitar o que eu quizer que não muda mais. Eu tentei com o lacate do ADOQuery. Se alguem puder me dizer a onde estou errando eu agradeço.

Como vc usou o locate?

Vc tem que usar assim:

Tabela/Query.Locate(´CAMPO´, Edit1.Text, [loPartialKey, loCaseInsensitive]);

loPartialKey = localização parcial
loCaseInsensitive = sensível ao maiúsculo/minúsculo


GOSTEI 0
Thiago Vidal

Thiago Vidal

17/05/2007

cara, eu te recomendaria, utilizar um timer para fazer essa busca, pq se a tabela começar a ficar muito grande, a cada letra que o cara digitar o sistema vai demorar alguns segundos para destravar, e para quem trabalha com o sistema diariamente, esses segundos passam a ser uma eternidade.

nos meus sistemas, eu faço assim:
procedure TForm1.FormCreate(Sender: TObject);
begin
  Timer1.Enabled := False; // O timer começa desabilitado
  Timer1.Interval := 300; // 300 ms de intervalo
end;

procedure TForm1.Edit1Change(Sender: TObject);
begin
  Timer1.Enabled := False; // Desabilita o timer para recomeçar a contagem a cada letra digitada
  Timer1.Enabled := Trim(Edit1.Text) <> ´´; // Habilita o timer se tiver texto a localizar
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  Timer1.Enabled := False;
  ClientDataSet1.Filtered := Trim(Edit1.Text) <> ´´; // Filtra apenas se tiver texto
  ClientDataSet1.Filter := ´Campo like ´ + QuotedStr(Edit1.Text + ´¬´); // Determina o filtro a ser utilizado
end;


fica apenas como sugestão, espero ter ajudado.


GOSTEI 0
Adriano Santos

Adriano Santos

17/05/2007

Boa Tarde Galera! O que me parecia uma coisa tão facil torno-se complicada na hora do vamos ver. Estou montando uma consulta para a medida que o usuário vai digitando os supostos nomes vão aparecendo só que do jeito que eu fiz digitando a primeira letra aparece um nome e depois eu posso digitar o que eu quizer que não muda mais. Eu tentei com o lacate do ADOQuery. Se alguem puder me dizer a onde estou errando eu agradeço.

Quais componentes você utiliza e nos passe o código que está usando como mencionei acima.

cara, eu te recomendaria, utilizar um timer para fazer essa busca, pq se a tabela começar a ficar muito grande, a cada letra que o cara digitar o sistema vai demorar alguns segundos para destravar, e para quem trabalha com o sistema diariamente, esses segundos passam a ser uma eternidade. nos meus sistemas, eu faço assim:
procedure TForm1.FormCreate(Sender: TObject);
begin
  Timer1.Enabled := False; // O timer começa desabilitado
  Timer1.Interval := 300; // 300 ms de intervalo
end;

procedure TForm1.Edit1Change(Sender: TObject);
begin
  Timer1.Enabled := False; // Desabilita o timer para recomeçar a contagem a cada letra digitada
  Timer1.Enabled := Trim(Edit1.Text) <> ´´; // Habilita o timer se tiver texto a localizar
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  Timer1.Enabled := False;
  ClientDataSet1.Filtered := Trim(Edit1.Text) <> ´´; // Filtra apenas se tiver texto
  ClientDataSet1.Filter := ´Campo like ´ + QuotedStr(Edit1.Text + ´¬´); // Determina o filtro a ser utilizado
end;
fica apenas como sugestão, espero ter ajudado.

[b:4c83baca66]thiago_vidal[/b:4c83baca66] você usa DBExpress? Pois creio que esteja usando de forma equivocada ou ´incorretamente´. Quantos registros você espera ter em uma query? Nos fale um pouco da sua rotina, pois a sua solução me parece um ruim. Pode detalhar melhor?


GOSTEI 0
Paullsoftware

Paullsoftware

17/05/2007

Olha amigo não tenho os dados de sua tabela/query aqui então espero que te ajude a ideia é simples...

supondo que sua query tenha tenha a seguinte instrução SQL
select Nome,Endereco,telefone from clientes where nome starting with :pNome order by Nome

sendo assim...
o Código do Evento OnChange ficaria assim:
if Edit1.Text <>´´ then//faço esse teste para evitar que o usuário traga todos os registros da tabela teclando enter sem digitar nada
whit QryPesquisa do
begin
Close;
Params[0].Value := Edit1.Text;
Open;
end;

posta ai o resultado, pois, não cheguei a testar estou na empresa e naõ tem delphi aqui, mais creio que vai funcionar perfeitamente...
espero ter ajudado.. :wink:


GOSTEI 0
Adriano Santos

Adriano Santos

17/05/2007

Olha amigo não tenho os dados de sua tabela/query aqui então espero que te ajude a ideia é simples... supondo que sua query tenha tenha a seguinte instrução SQL [quote:34deead531] select Nome,Endereco,telefone from clientes where nome starting with :pNome order by Nome

sendo assim...
o Código do Evento OnChange ficaria assim:
if Edit1.Text <>´´ then//faço esse teste para evitar que o usuário traga todos os registros da tabela teclando enter sem digitar nada
whit QryPesquisa do
begin
Close;
Params[0].Value := Edit1.Text;
Open;
end;

posta ai o resultado, pois, não cheguei a testar estou na empresa e naõ tem delphi aqui, mais creio que vai funcionar perfeitamente...
espero ter ajudado.. :wink:[/quote:34deead531]
Não paull, ele quer ir digitando e parando em cima do registro. Deste jeito funciona, mas vai ficar abrindo e fechado a query a cada letra digitada certo? Se ele estiver usando DBExpress, ou seja, ClientDataSet ai é moleza pq os dados já estão na aplicação cliente gerando tráfego desnecessário na rede.
Se bem que ele postou isso mencionando ADOQuery. ADO usa ODBC certo? Mais lento ainda.


GOSTEI 0
Paullsoftware

Paullsoftware

17/05/2007

[quote:05eecce694=´Adriano Santos´]
Olha amigo não tenho os dados de sua tabela/query aqui então espero que te ajude a ideia é simples... supondo que sua query tenha tenha a seguinte instrução SQL [quote:05eecce694] select Nome,Endereco,telefone from clientes where nome starting with :pNome order by Nome

sendo assim...
o Código do Evento OnChange ficaria assim:
if Edit1.Text <>´´ then//faço esse teste para evitar que o usuário traga todos os registros da tabela teclando enter sem digitar nada
whit QryPesquisa do
begin
Close;
Params[0].Value := Edit1.Text;
Open;
end;

posta ai o resultado, pois, não cheguei a testar estou na empresa e naõ tem delphi aqui, mais creio que vai funcionar perfeitamente...
espero ter ajudado.. :wink:[/quote:05eecce694]
Não paull, ele quer ir digitando e parando em cima do registro. Deste jeito funciona, mas vai ficar abrindo e fechado a query a cada letra digitada certo? Se ele estiver usando DBExpress, ou seja, ClientDataSet ai é moleza pq os dados já estão na aplicação cliente gerando tráfego desnecessário na rede.
Se bem que ele postou isso mencionando ADOQuery. ADO usa ODBC certo? Mais lento ainda.[/quote:05eecce694]

valeu [b:05eecce694]x-man[/b:05eecce694] :lol: esse é o segundo vacilo em na mesma semana... nussa!!! :shock: foi mal ai!!1 :lol:


GOSTEI 0
Adriano Santos

Adriano Santos

17/05/2007

[quote:b5285615ea=´Adriano Santos´][quote:b5285615ea=´paullsoftware´]Olha amigo não tenho os dados de sua tabela/query aqui então espero que te ajude a ideia é simples... supondo que sua query tenha tenha a seguinte instrução SQL [quote:b5285615ea] select Nome,Endereco,telefone from clientes where nome starting with :pNome order by Nome

sendo assim...
o Código do Evento OnChange ficaria assim:
if Edit1.Text <>´´ then//faço esse teste para evitar que o usuário traga todos os registros da tabela teclando enter sem digitar nada
whit QryPesquisa do
begin
Close;
Params[0].Value := Edit1.Text;
Open;
end;

posta ai o resultado, pois, não cheguei a testar estou na empresa e naõ tem delphi aqui, mais creio que vai funcionar perfeitamente...
espero ter ajudado.. :wink:[/quote:b5285615ea]
Não paull, ele quer ir digitando e parando em cima do registro. Deste jeito funciona, mas vai ficar abrindo e fechado a query a cada letra digitada certo? Se ele estiver usando DBExpress, ou seja, ClientDataSet ai é moleza pq os dados já estão na aplicação cliente gerando tráfego desnecessário na rede.
Se bem que ele postou isso mencionando ADOQuery. ADO usa ODBC certo? Mais lento ainda.[/quote:b5285615ea]

valeu [b:b5285615ea]x-man[/b:b5285615ea] :lol: esse é o segundo vacilo em na mesma semana... nussa!!! :shock: foi mal ai!!1 :lol:[/quote:b5285615ea]
Quê isso, sem crise. :D


GOSTEI 0
Marco Salles

Marco Salles

17/05/2007

Não paull, ele quer ir digitando e parando em cima do registro.


engraçado , eu ja entendi diferente , desde a primeira vez que li este tópico

o que entendi é que ele ao digitar por exemplo a letra M , apareceria para ele , todos os registros que começão coma letra M... Continuando , ao Digitar a letra ´A´ , os registros estariam mais ainda restritros , e somente pos Registros MA estariam agora visiveis...e assim sucessivamente

outra coisa que me chamou atenção , foi a colocação :

Se ele estiver usando DBExpress, ou seja, ClientDataSet ai é moleza


Ja vi clientDataSet funcionar ate com BDE , independemente de usar ou não DbExpress...Acredito que independente da tecnologia ele pode usar o ClintDataset e filtrar os dados nele , ou sera que estou enganado :cry:
:cry:

Agora , me parece que sinceramente , que se trata de uma Aplicação [b:bd2791f9ed][u:bd2791f9ed]Desktop[/u:bd2791f9ed][/b:bd2791f9ed] e portanto de fácil e pronta resolução

Algo parecido eu fiz usando o DBE , num aplicativo que roda ate hoje
mais ou menos assim :

query.sql.Add(´where (Upper([b:bd2791f9ed]supostos nomes[/b:bd2791f9ed]) Like :Nome)´); query.ParamByName(´Nome´).AsString:=AnsiUpperCase(Edit1.Text)+´¬´;



GOSTEI 0
Wadojr

Wadojr

17/05/2007

Caros colegas, vendo esse tópico vi que pode ser muito útil pra mim.

Em fim, como ficaria essa instrução usando o DBEXPRESS, com a mesma idéa a medida que o usuário vai digitando no edit o filtro vai retornando os valores... :?: [color=blue:2a93be279f][/color:2a93be279f]


GOSTEI 0
Adriano Santos

Adriano Santos

17/05/2007

Caros colegas, vendo esse tópico vi que pode ser muito útil pra mim. Em fim, como ficaria essa instrução usando o DBEXPRESS, com a mesma idéa a medida que o usuário vai digitando no edit o filtro vai retornando os valores... :?: [color=blue:0ac45b3d34][/color:0ac45b3d34]


Igualzinho. Você deve ter o sistema assim:

TSQLConnection + TSQLDataSet + TDataSetProvider + TClientDataSet

Então basta você:

[list:0ac45b3d34]
[*:0ac45b3d34] Fechar o TSQLDataSet
[*:0ac45b3d34] Modificar o Select do TSQLDataSet
[*:0ac45b3d34] Atualizar o params do ClientDataSet
[*:0ac45b3d34] E abrir o ClientDataSet
[/list:u:0ac45b3d34]

procedure TForm1.....
begin
  SQLDataSet.Close;
  ClientDataSet.Close;
  SQLDataSet.CommandText := ´SELECT * FROM CLIENTES WHERE (Upper(supostos nomes) Like :Nome´;
  ClientDataSet.FechtParams;
  ClientDataSet.Params.ParamByName(´NOME´).AsString := UpperCase(Edit1.Text)+´¬´;
  ClientDataSet.Open;
end;



GOSTEI 0
Wadojr

Wadojr

17/05/2007

Muito bom, show de bola...

Valew pela atenção!!!

Obrigado!!!


GOSTEI 0
POSTAR