Советы по Delphi


DBFSeek и DBFLocate


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

например

    Table1.UpdateCursorPos; if DBFSeek( Table1, xVal1 ) then           {_не_ delphi-функция - смотри ниже} begin if DBFLocate( Table1, 'CUSTNAME', xVal2  ) then   {_не_ delphi-функция - модификация из faq) begin ... делаем все, что необходимо

end; end;

Tom

ps.

  1. DBFLocate - модифицированная из faq фунция fieldname
  2. 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;

[000563]



Содержание раздела