Надежней и быстрее (если вы ищете отдельные записи) выполнить поиск строки с помощью 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;