Fórum Consulta dentro do OnChange do edit #341931
17/05/2007
0
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
Curtir tópico
+ 0Posts
17/05/2007
Adriano Santos
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
17/05/2007
Thiago Vidal
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
17/05/2007
Adriano Santos
Quais componentes você utiliza e nos passe o código que está usando como mencionei acima.
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;
[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
17/05/2007
Paullsoftware
supondo que sua query tenha tenha a seguinte instrução SQL
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
17/05/2007
Adriano Santos
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
17/05/2007
Paullsoftware
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
17/05/2007
Adriano Santos
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
18/05/2007
Marco Salles
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 :
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 :
Gostei + 0
20/09/2007
Wadojr
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
20/09/2007
Adriano Santos
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
20/09/2007
Wadojr
Valew pela atenção!!!
Obrigado!!!
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)