DBFSeek и DBFLocate

Previous  Top  Next

    
 

 

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

 

например

Code:

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 индексов, состоящих из одного поля, вопреки мнению других участников форума.

 

Code:

{============================================================

{ 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;

 

 

©Drkb::02713

       

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