Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

gleison_gomes

Próximo registro com Locate

Recommended Posts

Pessoal, como faço para ir para o próximo registro usando o Locate e sem utilizar uma tabela auxiliar? O Locate sempre vai para o primeiro registro do dataset que atenda à condição, porém, quero ir para o próximo tb. Obrigado!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Colega,

 

Manter ordenado pela chave de pesquisa (Order by) e após o locate bem sucedido basta utilizar o método next e testar se o registro é válido com sua chave.

 

...

Locate(<Chave>);

Next;

if ADOChave=Chave then..

...

 

Entretanto, é importante salientar que uma boa prática de implementação seria o uso de um select com as restrições necessárias visando evitar o rolamento de cursor no cliente.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não há nenhuma procedure existente nos "DataSets" que faça exatamente isso... mas isso pode ser programado...

 

Veja essa função:

{------------------------------------------------------------------------------}function TfrSQL_GridAcha.BuscaSequencial(const KeyField: string; KeyValue: String;   Options: TLocateOptions; Direction : Smallint): Boolean;{  Retorna TRUE se achou  KeyField: Nome do Campo em que será feita a busca KeyValue:  Valor do campo a achar (sempre String) Options :  Semalhante a Locate (usa apenas loCaseInsensitive) Direction: 0 - pesquisa desde o Inicio,                  1 - Pesquisa da posição atual para Frente,                -1 - Pesquisa da posição atual para Tras------------------------------------------------------------------------------}Var BM : TBookmark;    ValCampo : String;begin  with TClientDataSet(dsGrid.DataSet) do  begin     Result := false;     BM     := GetBookmark;     DisableControls;     if loCaseInsensitive in Options then        KeyValue := UpperCase(KeyValue);     if Direction = 0 then        First;     try        while not Result do        begin           if Direction >= 0 then            begin              if Eof then Break else Next            end           else              if Bof then Break else Prior;           Application.ProcessMessages;           ValCampo := FieldByName(KeyField).AsString;           if loCaseInsensitive in Options then              ValCampo := UpperCase(ValCampo);           Result := (pos(KeyValue, ValCampo) > 0);        end;     finally        if not Result then           GotoBookmark(BM);        FreeBookmark(BM);        EnableControls;     end;  end;end;

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.