Версия для печати

DBFSeek и DBFLocate

Оцените материал
(0 голосов)

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
Прочитано 9329 раз