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