Fórum Pesquisa incremental direta no DBGrid (Urgente!) #204366
06/01/2004
0
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
Curtir tópico
+ 0Posts
10/01/2004
A.maia
Gostei + 0
11/01/2004
Edilcimar
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
12/01/2004
A.maia
De qualquer forma valeu!
Se tiver mais alguma ideia me avise...
Gostei + 0
17/01/2004
A.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
17/01/2004
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
17/01/2004
Marco Salles
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.
Gostei + 0
18/01/2004
A.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
18/01/2004
Marco Salles
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
Clique aqui para fazer login e interagir na Comunidade :)