Fórum Pesquisa através parte de nome em um texto #601984
24/04/2019
0

Valdenir Furlanetto
Curtir tópico
+ 0Post mais votado
25/04/2019
por exemplo:
- se o conteúdo do campo for 'RAZAO SOCIAL', e você digitar R na pesquisa, o registro SERÁ encontrado.
- se o conteúdo do campo for 'RAZAO SOCIAL', e você digitar S na pesquisa, o registro NÃO será encontrado.
a sintaxe para o locate() é:
Locate(Campo, ValorProcurado, OpcoesDeBusca);
segue um exemplo:
ClientDatasetCliente.Locate('Nome', 'R', [loPartialKey, loCaseInsensitive]);
você também pode procurar em mais de um campo simultaneamente.
para isso 'Campo' deverá ser uma lista de campos separados por ; (ponto e vírgula) e 'ValorProcurado' precisa ser um array. assim:
ClientDatasetCliente.Locate('Nome;UF', VarArrayOf(['R', 'SP']), [loPartialKey, loCaseInsensitive]);
Emerson Nascimento

Gostei + 2
Mais Posts
26/04/2019
Valdenir Furlanetto
por exemplo:
- se o conteúdo do campo for 'RAZAO SOCIAL', e você digitar R na pesquisa, o registro SERÁ encontrado.
- se o conteúdo do campo for 'RAZAO SOCIAL', e você digitar S na pesquisa, o registro NÃO será encontrado.
a sintaxe para o locate() é:
Locate(Campo, ValorProcurado, OpcoesDeBusca);
segue um exemplo:
ClientDatasetCliente.Locate('Nome', 'R', [loPartialKey, loCaseInsensitive]);
você também pode procurar em mais de um campo simultaneamente.
para isso 'Campo' deverá ser uma lista de campos separados por ; (ponto e vírgula) e 'ValorProcurado' precisa ser um array. assim:
ClientDatasetCliente.Locate('Nome;UF', VarArrayOf(['R', 'SP']), [loPartialKey, loCaseInsensitive]);
Dessa forma eu teria que deixar na própria linha de comando o que eu iria precisar fazer a busca. O que eu preciso é algo similiar ao que o buscador do wuindows explore faz, ali na barra de pesquisa. Ele pesquisar por parte de trecho de um texto, por exemplo, tenho um nome de um serviço em um campo " Bloco de Orçamento / Pedido" ao digitar "pedido" terá que aparecer registro que contenha a palavra pedido, inclusive essa que acabei de citar, "Bloco de Orçamento / Pedido"
Gostei + 0
26/04/2019
Emerson Nascimento
algo assim:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 | procedure BuscaRegistro(cds: TClientDataset; campo: string ; conteudo: string ); var numRegistro: integer ; bolEncontrou: boolean ; strMensagem: string ; begin // verifica se o dataset está aberto e se o campo indicado existe if not cds . Active or (cds . FindField(campo) = nil ) or cds . IsEmpty then begin if not cds . Active then strMensagem := 'A busca só pode ser realizada num dataset aberto' else if cds . IsEmpty then strMensagem := 'A pesquisa não pode ser realizada num dataset vazio' else strMensagem := 'O campo ' '' +campo+ '' ' não existe no dataset' ; ShowMessage(strMensagem); exit; end ; // guarda o registro posicionado antes de iniciar a pesquisa numRegistro := cds . RecNo; // inicializa a variável que indica se o texto foi encontrado bolEncontrou := False ; // desabilita o refresh nos controles ligados ao dataset cds . DisableControls; // posiciona no primeiro registro cds . First; //varre o dataset à procura do conteudo desejado while not cds . Eof do begin // procura o valor digitado em qualquer parte do campo bolEncontrou := (Pos(AnsiUpperCase(conteudo), AnsiUpperCase(cds . FieldByName(campo).AsString)) > 0 ); // se encontrar o conteúdo, sai do loop if bolEncontrou then break; cds . Next; end ; // se não encontrou um registro, reposiciona o ponteiro no registro inicial if not bolEncontrou then cds . RecNo := numRegistro; // habilita o refresh nos controles ligados ao dataset cds . EnableControls; end ; |
você pode usar no OnChange de um Edit, por exemplo:
1 2 3 4 | procedure TForm1 . Edit1Change(Sender: TObject); begin BuscaRegistro(ClientDataSet1, 'Nome' , Edit1 . Text); end ; |
Você pode ainda implementar a procedure como um método numa classe derivada de TClientDataset:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 | type TXClientDataset = class (TClientDataset) public procedure BuscaRegistro(campo: string ; conteudo: string ); end ; procedure TXClientDataset . BuscaRegistro(campo, conteudo: string ); var numRegistro: integer ; bolEncontrou: boolean ; strMensagem: string ; begin // verifica se o dataset está aberto e se o campo indicado existe if not Self . Active or (Self . FindField(campo) = nil ) or Self . IsEmpty then begin if not Self . Active then strMensagem := 'A busca só pode ser realizada num dataset aberto' else if Self . IsEmpty then strMensagem := 'A pesquisa não pode ser realizada num dataset vazio' else strMensagem := 'O campo ' '' +campo+ '' ' não existe no dataset' ; ShowMessage(strMensagem); exit; end ; // guarda o registro posicionado antes de iniciar a pesquisa numRegistro := Self . RecNo; // inicializa a variável que indica se o texto foi encontrado bolEncontrou := False ; // desabilita o refresh nos controles ligados ao dataset Self . DisableControls; // posiciona no primeiro registro Self . First; //varre o dataset à procura do conteudo desejado while not Self . Eof do begin // procura o valor digitado em qualquer parte do campo bolEncontrou := (Pos(AnsiUpperCase(conteudo), AnsiUpperCase(Self . FieldByName(campo).AsString)) > 0 ); // se encontrar o conteúdo, sai do loop if bolEncontrou then break; Self . Next; end ; // se não encontrou um registro, reposiciona o ponteiro no registro inicial if not bolEncontrou then Self . RecNo := numRegistro; // habilita o refresh nos controles ligados ao dataset Self . EnableControls; end ; |
E usar assim:
1 2 3 4 | procedure TForm1 . Edit1Change(Sender: TObject); begin TXClientDataset(ClientDataSet1).BuscaRegistro( 'Nome' , Edit1 . Text); end ; |
Gostei + 1
29/04/2019
Valdenir Furlanetto
Gostei + 0
30/04/2019
Valdenir Furlanetto
procedure BuscaRegistro(cds: TClientDataset; campo: string; conteudo: string); <----- Essa Procedure, é um componente que eu adiciono? Ela é adicionada na própria Unit do form que será feita a pesquisa? Caso seja uma procedure comum sem adição de componente ali onde está TClienteDataSet seria o Nome do meu ClienteDataSet neh, da forma que está o compilador não reconhece esse tipo.
Ali tbm vc postou duas forma, mas a de baixo seria apenas um complemento da parte de cima. Se puder me passar um pouco mais detalhado, fico muito agradecido.
Gostei + 0
02/05/2019
Emerson Nascimento
A procedure:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 | procedure BuscaRegistro(cds: TClientDataset; campo: string ; conteudo: string ); var numRegistro: integer ; bolEncontrou: boolean ; strMensagem: string ; begin // verifica se o dataset está aberto e se o campo indicado existe if not cds . Active or (cds . FindField(campo) = nil ) or cds . IsEmpty then begin if not cds . Active then strMensagem := 'A busca só pode ser realizada num dataset aberto' else if cds . IsEmpty then strMensagem := 'A pesquisa não pode ser realizada num dataset vazio' else strMensagem := 'O campo ' '' +campo+ '' ' não existe no dataset' ; ShowMessage(strMensagem); exit; end ; // guarda o registro posicionado antes de iniciar a pesquisa numRegistro := cds . RecNo; // inicializa a variável que indica se o texto foi encontrado bolEncontrou := False ; // desabilita o refresh nos controles ligados ao dataset cds . DisableControls; // posiciona no primeiro registro cds . First; //varre o dataset à procura do conteudo desejado while not cds . Eof do begin // procura o valor digitado em qualquer parte do campo bolEncontrou := (Pos(AnsiUpperCase(conteudo), AnsiUpperCase(cds . FieldByName(campo).AsString)) > 0 ); // se encontrar o conteúdo, sai do loop if bolEncontrou then break; cds . Next; end ; // se não encontrou um registro, reposiciona o ponteiro no registro inicial if not bolEncontrou then cds . RecNo := numRegistro; // habilita o refresh nos controles ligados ao dataset cds . EnableControls; end ; |
Deve ser colocada no seu código. Se você estiver usando um DataModule, implemente a procedure nele. Não é um componente nem nada. É uma procedure simples. Para que o compilador identifique a classe TClientDataset (está assim porque você disse que usa ClientDataset), será necessário adicionar a unit Datasnap.DBClient na cláusula uses.
E, para usar, basta fazer algo assim:
1 2 3 4 | procedure TForm1 . Edit1Change(Sender: TObject); begin BuscaRegistro(cdsClientes, 'Nome' , Edit1 . Text); // aqui você manda teu ClientDataset, o campo que será pesquisado, e o valor a ser procurado end ; |
Gostei + 0
03/05/2019
Valdenir Furlanetto
Gostei + 0
03/05/2019
Emerson Nascimento
O uso de Datasnap.DBClient ou DBClient vai depender da versão do Delphi.
Gostei + 0
03/05/2019
Emerson Nascimento
Gostei + 0
03/05/2019
Valdenir Furlanetto
O uso de Datasnap.DBClient ou DBClient vai depender da versão do Delphi.
Uso o Delphi 10 e nele jah está declarado esse DBClient na uses do DM. eu adicionei um edit que no caso ficou como edit3 esse código:
procedure TForm1.Edit1Change(Sender: TObject);
begin
BuscaRegistro(ClientDataSet1, 'Nome', Edit1.Text);
end;
Mas ele da como Undeclared Indetifier: BuscaRegistro e no ClienteDataSet1
Gostei + 0
04/05/2019
Emerson Nascimento
- como um método (dentro da definição do datamodule)
1 2 3 4 5 6 7 8 9 | type TDataModule1 = class (TDataModule) procedure DataModuleCreate(Sender: TObject); private { Private declarations } public { Public declarations } procedure BuscaRegistro(cds: TClientDataset; campo: string ; conteudo: string ); // declaração da procedure como método do datamodule end ; |
desta forma, você deve executar assim (indicando o datamodule) :
1 2 3 4 | procedure TForm1 . Edit1Change(Sender: TObject); begin DataModule1 . BuscaRegistro(TeuClientDataset, CampoASerUtilizado, ConteudoProdurado); // aqui você manda teu ClientDataset, o campo que será pesquisado, e o valor a ser procurado end ; |
- como procedure (fora da definição do datamodule)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | type TDataModule1 = class (TDataModule) private { Private declarations } public { Public declarations } end ; var DataModule1: TDataModule1; procedure BuscaRegistro(cds: TClientDataset; campo: string ; conteudo: string ); // declaração da procedure fora da definição do DataModule implementation |
desta forma, você deve executar assim (chama diretamente a procedure):
1 2 3 4 | procedure TForm1 . Edit1Change(Sender: TObject); begin BuscaRegistro(TeuClientDataset, CampoASerUtilizado, ConteudoProdurado); // aqui você manda teu ClientDataset, o campo que será pesquisado, e o valor a ser procurado end ; |
Para uma resposta mais precisa, publique o código fonte do teu datamodule.
Gostei + 1
04/05/2019
Valdenir Furlanetto
lá no Dta Module ta esse:
1 2 3 4 5 6 7 8 9 10 11 | type TDataModule1 = class(TDataModule) private { Private declarations } public { Public declarations } end; var DM: TDM; implementation |
se não eu posto aqui mesmo os código fonte do DM e do Form.
Gostei + 0
06/05/2019
Emerson Nascimento
Gostei + 1
08/05/2019
Valdenir Furlanetto
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)