DBFSeek и DBFLocate

Как выполнить поиск в таблице?

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

Пример:

{ 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 - поиск величины, не связанный с ключевым полем; замена 
  теперь принимает FieldName, величина может быть частичной }
function DBFLocate(const Table1: TTable; const sFld, sValue: string): boolean;
var
  bmPos: TBookMark;
  bFound: boolean;
  len: integer;
begin
  Result := False;
  if (sValue <> '') and (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;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Table1.UpdateCursorPos;
  if DBFSeek(Table1, xVal1) then begin ...
  /// делаем все, что необходимо
  if DBFLocate(Table1, 'CUSTNAME', xVal2) then begin ...
  /// делаем все, что необходимо
end;