Pesquisa incremental direta no DBGrid (Urgente!)

Delphi

06/01/2004

Estou com um problema e gostaria de uma ajuda.

Tenho uma tela de cadastro de clientes em Paradox usando:

1 DBEdit
1 DBGrid
1 TTable
1 DataSource

Preciso que ao digitar o código do cliente, seja feita busca incremental dentro do DBGrid até encontrar o registro desejado, ou seja, conforme for encontrando na tabela os registros ir posicionando o cursor do Grid no registro mais próximo, até encontrar o último registro que satisfaça o código digitado. Quando o primeiro caracter digitado na sequencia não for encontrado em nenhum registro na tabela, limpar o campo código do DBEdit focando-o para cadastrar um novo código.

Só pra lembrar não pode ser Locate no evento OnChange do Edit, tem que ser DBGrid.

Quem puder me dar uma luz, ficarei muito grato.

[]´s

A. Maia


A.maia

A.maia

Curtidas 0

Respostas

A.maia

A.maia

06/01/2004

Ninguém tem uma ideia ???


GOSTEI 0
Edilcimar

Edilcimar

06/01/2004

Coloque o índice do campo desejado (no caso o código) e faça o seguinte:
coloque um edit e no onchange do mesmo coloque este códidog
SetRangeStart;
FieldByName(´NOMEDOCAMPO´).AsString := Trim(Edit1.Text);
SetRangeEnd;
FieldByName(´NOMEDOCAMPO´).AsString := UmValorQueJamaisSeráAlcançado;
ApplyRange;
Se o Campo não for String troque-o e transforme o valor do Edit1.Text para o que desejar, assim à medida que vc for digitando o dbgrid irá rolar


GOSTEI 0
A.maia

A.maia

06/01/2004

Obrigado edilcimar, mas preciso que o DBGrid role digitando no proprio DBGrid para capturar as teclas. Não posso usar o Edit...

De qualquer forma valeu!

Se tiver mais alguma ideia me avise...


GOSTEI 0
A.maia

A.maia

06/01/2004

Até Agora o máximo que consegui foi fazer a busca pela primeira letra, qdo digito a segunda o DB grid rola procurando pela primeira letra novamente...

No enveto OnKeyPress do DBGrid ficou assim:

procedure TForm1.DBGrid1KeyPress(Sender: TObject; var Key: Char);
var
Busca: String;
begin
TbCliente.Locate(´Nome´, Key,[LoPartialKey, LoCaseInsensitive]);
Busca:= Busca+Key;
end;

Não estou conseguindo armazenar o valor digitado e concatenar com o segundo, terceiro, e assim por diante...


No aguardo de uma sugestão.
Grato,

Andre Maia


GOSTEI 0
Bacalhau

Bacalhau

06/01/2004

Colega usa um código parecido com este:

table1.setkey;
table1.fieldbyname(´Código´).asstring := <texto parcial que escreveste>;
table1.GOTONEAREST; // é este comando que posiciona no mais próximo

Como foi referido anteriormente, o index tem de ser o do código

bacalhau


GOSTEI 0
Marco Salles

Marco Salles

06/01/2004

Eu Vou Arriscar Um Palpite. Não Vai Resolver Todo o Seu Problema. Mas Talves Seja Um Bom Começo. Vou Atacar O Problema Pela Sua Linha De Código.Nela Eu Percebo Que a Pesquisa Que Voce Faz Usando o Método ´Locate´ (Que Não Precisa de Indexador Diga-se De Paasagem´) V.c Usa Como Parametro o Caracter [color=red:c84b7eb2e5]Key. [/color:c84b7eb2e5]. Então é Por Isto Que Voce Não Consegue[color=red:c84b7eb2e5]:´Não estou conseguindo armazenar o valor digitado e concatenar com o segundo, terceiro, e assim por diante...´[/color:c84b7eb2e5]. Tente Fazer as Seguintes Modificações.
1) Declare a Variável Busca na Secção Interface Do Form
2) Inicie esta Variável Com ´´ <Vazio>
3) Modifique as Instruções No Evento OnKeyPress
procedure TForm1.DBGrid1KeyPress(Sender: TObject; var Key: Char);
begin
Busca:= Busca+Key;
if Not TbCliente.Locate(´Nome´, Busca,[LoPartialKey,
LoCaseInsensitive]) Then
begin
//Neste Ponto Do Código , Vamos Atacar Aquela Outra Parte Do
//Problema (Limpar o Código do DbEdit, Forcando Para Cadastrar
//Um Novo Código, Etc....)
//Tambem Neste Ponto Retornamos O Valor De Vazio Para a
Variável Busca....
end;
end;

Até Agora o máximo que consegui foi fazer a busca pela primeira letra, qdo digito a segunda o DB grid rola procurando pela primeira letra novamente... No enveto OnKeyPress do DBGrid ficou assim: procedure TForm1.DBGrid1KeyPress(Sender: TObject; var Key: Char); var Busca: String; begin TbCliente.Locate(´Nome´, Key,[LoPartialKey, LoCaseInsensitive]); Busca:= Busca+Key; end; Não estou conseguindo armazenar o valor digitado e concatenar com o segundo, terceiro, e assim por diante... No aguardo de uma sugestão. Grato, Andre Maia


No Mais, Eu Entendo Que O Primeiro Problema a Ser Resolvido e Concatenar Sua Pesquisa. E Parece Para Mim, Que Voce Não Esta Conseguindo Por Estar Pesquisando Pelo Valor Atual e Não Pelo Valor Da Variável ´Busca´ , Que Teoricamente era Para Ser Sua Palavra Concatenada. Para Mais Estarei ao Seu Inteiro Dispor.


GOSTEI 0
A.maia

A.maia

06/01/2004

:D Cara muito obrigado, realmente funcionou a concatenação...

Agora vamos a segunda parte:
Inclui uma variavel BookMark

[color=red:47b3410173]interface
var
bmLocal: TBookMark;[/color:47b3410173]

e acresecentei o seguinte código ao procedimento:

[color=red:47b3410173]procedure TForm1.DBGrid1KeyPress(Sender: TObject; var Key: Char);

begin
bmLocal:= TbCliente.GetBookMark;
Busca:= Busca+Key;
if Not TbCliente.Locate(´Nome´, Busca, LoPartialKey,LoCaseInsensitive]) Then
begin
if Busca <> ´´ then
DBEdit1.SetFocus;
TbCliente.Insert;
if Busca = ´´ then
TbCliente.GotoBookMark(bmLocal);
end;
end;[/color:47b3410173]
Ficou quase como eu queria, só falta agora conseguir levar o valor da variavel Busca qdo o valor não for encontrado no campo da tabela.

Agora qdo digito um nome que não existe, o cursor foca no campo Nome no modo de inserção, mas vazio. Queria aproveitar o valor da variável Busca...

Tem alguma ideia? Novamente serei muito grato :D

[]´s

Andre Maia


GOSTEI 0
Marco Salles

Marco Salles

06/01/2004

Estou Tentando Captar o Que Voce Deseja.

interface
var
Busca:String;
[color=red:aaa398a164]bmLocal: TBookMarkString; [/color:aaa398a164]***********Defina Assim


procedure TForm1.DBGrid1KeyPress(Sender: TObject; var Key: Char);
begin
[color=red:aaa398a164]bmLocal:= TbCliente.BookMark[/color:aaa398a164];
Busca:= Busca+Key;
if Not TbCliente.Locate(´Nome´, Busca,[LoPartialKey,
LoCaseInsensitive]) Then
begin
DBEdit1.SetFocus;
[color=red:aaa398a164]TbCliente.BookMark:=bmLocal;[/color:aaa398a164]
TbCliente.Insert;
TbClienteNome.Value:=Busca; //Leva o Valor Da Variável Busca Qnd Não
*************************//Encontrado na Tabela e proveita o Valor
*************************//Da VariávelBusca
Busca:=´´; //Prepara Busca Para Uma Nova Pesquisa
Edit1.Text:=´´;// Limpa o Valor Do Editor***Veja Considerações Abaixo**
end;
end;

Obs: É Melhor Usar Uma a Propriedade BOOKMARK da Classe TDATASET,
Explicações Eu Lhe Dou Depois S Precisar...


Ainda Falta Duas Coisas Que Eu Considero Importantes:

A Primeira é Limpar o Valor Do Editor De Campo.Eu Não Testei, Mas Acho Que Voce Pode Limpa-lo No Própio Evento OnKeyPress....Se Não Der Certo Desde Modo, Atacaremos O Problema de Outro Modo.

A Segunda é Alterar o Valor Da Variável ´Busca´ Sempre Que a Tecla <Bacspace> For Pressionada . Este Código Tambem Pode Ficar Para Depois, Se Voce Quiser.

Por Mais Veja ,Se Parte Do Que V.C Quer Esta Resolvido e Me Comunique o Mais Rápido Possível.Estou Entrando De Férias... :lol:


GOSTEI 0
POSTAR