Надежней и намного быстрее (если вы ищите отдельные записи) выполнить поиск
строки с помощью Seek (если найдена первая запись), или выполнить Locate (индекс
не требуется)
например
Table1.UpdateCursorPos;
if DBFSeek( Table1, xVal1 ) then{_не_ delphi-функция - смотри ниже}beginif 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 dobeginif (Active) and (Length(IndexName) > 0) thenbegin
bmPos := GetBookMark;
DisableControls;
StrPCopy(sExpValue, sValue);
if (DbiGetRecordForKey(Handle, True, 0, strlen(sExpValue), @sExpValue, nil)
= DBIERR_NONE) then
Result := Trueelse
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)) thenbeginwith Table1 dobegin
DisableControls;
bFound := False;
bmPos := GetBookMark;
len := Length(sValue);
First;
whilenot EOF dobeginif FieldByName(sFld).AsString <> sValue then
Next
elsebegin
Result := True;
bFound := True;
Break;
end;
end;
if (not bFound) then
GotoBookMark(bmPos);
FreeBookMark(bmPos);
EnableControls;
end;
end;
end;
В статье описываются две функции для поиска строк в таблицах dBase: DBFSeek, которая использует индекс для поиска, и DBFLocate, которая не требует индекса.
Комментарии и вопросы
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.