GARANTIR DESCONTO

Fórum Consulta dentro do OnChange do edit #341931

17/05/2007

0

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

Responder

Posts

17/05/2007

Adriano Santos

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


Responder

Gostei + 0

17/05/2007

Thiago Vidal

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.


Responder

Gostei + 0

17/05/2007

Adriano Santos

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?


Responder

Gostei + 0

17/05/2007

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


Responder

Gostei + 0

17/05/2007

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: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.


Responder

Gostei + 0

17/05/2007

Paullsoftware

[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:


Responder

Gostei + 0

17/05/2007

Adriano Santos

[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


Responder

Gostei + 0

18/05/2007

Marco Salles

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)+´¬´;



Responder

Gostei + 0

20/09/2007

Wadojr

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]


Responder

Gostei + 0

20/09/2007

Adriano Santos

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;



Responder

Gostei + 0

20/09/2007

Wadojr

Muito bom, show de bola...

Valew pela atenção!!!

Obrigado!!!


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar