Советы по Delphi

         

DBFSeek и DBFLocate


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

например

Table1.UpdateCursorPos;if DBFSeek( Table1, xVal1 ) then {_не_ delphi-функция - смотри ниже}beginif 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 dobeginif (Active) and (Length(IndexName) > 0) thenbeginbmPos := GetBookMark;DisableControls;
StrPCopy( sExpValue, sValue );if (DbiGetRecordForKey( Handle, True, 0, strlen(sExpValue), @sExpValue, nil ) = DBIERR_NONE ) thenResult := TrueelseGotoBookMark( 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 dobeginDisableControls;bFound := False;bmPos := GetBookMark;len := Length(sValue);First;
while not EOF dobeginif FieldByName(sFld).AsString <> sValue thenNextelsebeginResult := True;bFound := True;Break;end;end;
if (not bFound) thenGotoBookMark( bmPos);
FreeBookMark( bmPos );EnableControls;end;end;end;

[000563]



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