Pesquisa incremental direta no DBGrid (Urgente!)
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
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
Curtidas 0
Respostas
A.maia
06/01/2004
Ninguém tem uma ideia ???
GOSTEI 0
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
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
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...
De qualquer forma valeu!
Se tiver mais alguma ideia me avise...
GOSTEI 0
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
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
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
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
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;
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.
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
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
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
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:
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