Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

DBFSeek и DBFLocate

Delphi , Базы данных , DBASE и DBF

DBFSeek и DBFLocate

Автор: Tom

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

например


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

P.S.

  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;

Код, предоставленный ниже, является парой функций Delphi DBFSeek и DBFLocate, предназначенных для упрощения поиска конкретных записей в таблице базы данных. Вот подробное описание каждой функции:

DBFSeek Эта функция использует метод Seek для поиска записи в таблице, используя индекс. Она принимает два параметра: Table1, объект таблицы, и sValue, значение, которое нужно найти.

Функция сначала проверяет, активна ли таблица и имеет ли она имя индекса. Если это так, она отключает контролы, получает маркер текущей позиции и использует метод DbiGetRecordForKey для поиска записи с указанным ключом (значением sValue). Если запись найдена, функция возвращает True; если нет, она сбрасывает маркер и включает контролы снова.

DBFLocate Эта функция не использует индекс для поиска записи. Вместо этого она перебирает все записи в таблице с помощью методов First и Next, пока не найдет совпадение или не достигнет конца файла (EOF). Она принимает три параметра: Table1, объект таблицы; sFld, имя поля, которое нужно найти; и sValue, значение, которое нужно найти.

Функция сначала проверяет, не пустые ли таблица и поле. Если это так, она отключает контролы, получает маркер текущей позиции и затем перебирает все записи в таблице. Для каждой записи она проверяет, совпадает ли значение указанного поля с значением sValue. Если совпадение найдено, функция возвращает True; если нет, она сбрасывает маркер и включает контролы снова.

Замечания

  • Обе функции предназначены для работы с файлами dBase.
  • DBFSeek значительно быстрее, чем использовать SetKey, FieldByName и т.д. при поиске записей по индексу.
  • DBFLocate может использоваться для поиска записей без использования индекса, что может быть медленнее, но более гибко.

В целом, эти функции предоставляют удобный способ поиска конкретных записей в таблице базы данных, either by using an index or iterating through all records.

В статье описываются две функции для поиска строк в таблицах dBase: DBFSeek, которая использует индекс для поиска, и DBFLocate, которая не требует индекса.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: DBASE и DBF ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-19 13:29:56
2024-11-21 11:32:21/0.013959884643555/1