Sources
Delphi Russian Knowledge Base
DRKB - это самая большая и удобная в использовании база знаний по Дельфи в рунете, составленная Виталием Невзоровым

DBFSeek и DBFLocate

01.01.2007

Надежней и намного быстрее (если вы ищите отдельные записи) выполнить поиск строки с помощью Seek (если найдена первая запись), или выполнить Locate (индекс не требуется)

например

Table1.UpdateCursorPos;
if DBFSeek( Table1, xVal1 ) then {_не_ delphi-функция - смотри ниже}
begin
 
if DBFLocate( Table1, 'CUSTNAME', xVal2  ) then {_не_ delphi-функция - модификация из faq}
 
begin
   
//... делаем все, что необходимо
 
end;
end;

P.S.

DBFLocate - модифицированная из faq фунция fieldname

DBFSeek - функция, найденная методом проб и ошибок! - значительно лучшая (IMHO) чем setkey...fieldbyname1...fieldbyname2...gotokey, используемые для выражений индексов dBase за первым полем. Вы можете использовать FindKey для dBase индексов, состоящих из одного поля, вопреки мнению других участников форума.

{============================================================
{ DBFSeek
{ поиск величины с использованием индекса - простой путь
{============================================================}
 
function DBFSeek(const Table1: TTable; const sValue: string): boolean;
var
 
  sExpValue
: DBIKEYEXP;
  bmPos
: TBookMark;
  nOrder
: integer;
 
begin
 
 
Result := False;
 
 
with Table1 do
 
begin
   
if (Active) and (Length(IndexName) > 0) then
   
begin
      bmPos
:= GetBookMark;
     
DisableControls;
 
     
StrPCopy(sExpValue, sValue);
     
if (DbiGetRecordForKey(Handle, True, 0, strlen(sExpValue), @sExpValue, nil)
       
= DBIERR_NONE) then
       
Result := True
     
else
       
GotoBookMark(bmPos);
 
     
FreeBookMark(bmPos);
     
EnableControls;
   
end;
 
end;
end;
 
{==================================================================================
{ DBFLocate
{ поиск величины, не связанный с ключевым полем
{ замена из faq, теперь акцептует fieldname, величина может быть частичной
{================================================================================}
 
function DBFLocate(const Table1: TTable; const sFld, sValue: string): boolean;
var
 
  bmPos
: TBookMark;
  bFound
: boolean;
  len
: integer;
begin
 
 
Result := False;
 
if (not StrEmpty(sValue)) and (not StrEmpty(sFld)) then
 
begin
   
with Table1 do
   
begin
     
DisableControls;
      bFound
:= False;
      bmPos
:= GetBookMark;
      len
:= Length(sValue);
     
First;
 
     
while not EOF do
     
begin
       
if FieldByName(sFld).AsString <> sValue then
         
Next
       
else
       
begin
         
Result := True;
          bFound
:= True;
         
Break;
       
end;
     
end;
 
     
if (not bFound) then
       
GotoBookMark(bmPos);
 
     
FreeBookMark(bmPos);
     
EnableControls;
   
end;
 
end;
end;

Взято с https://delphiworld.narod.ru