Приветствую Вас Гость | RSS

Меню сайта

Реклама

Категории раздела
ADO [17]
ASCII и CSV [12]
Access [20]
Alias [24]
BDE [37]
BLOB поля [19]
Clipper [2]
DB2 [2]
DBASE и DBF [26]
Fox Pro [1]
Interbase [21]
MSSQL [0]
ODBC [10]
Oracle [0]
Paradox [0]
SQL [29]
Sybase [1]
База данных [0]
Закладки [2]
Записи [0]
Индексы [10]
Компоненты и Базы данных [0]
Модуль данных [3]
Отчеты [2]
Ошибки БД [17]
Поиск [16]
Поля [0]
Сортировка и Фильтр [6]
Таблицы [0]

Наш опрос
Оцените мой сайт
Всего ответов: 30

Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0

Форма входа

Главная » Статьи » Базы данных » DBASE и DBF

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.

  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;

Категория: DBASE и DBF | Добавил: Angel (28.07.2008)
Просмотров: 440 | Рейтинг: 0.0/0
  Delphi Lab   Главная   Регистрация   Вход  
Интересная Цитата

Поиск

Магазин


Copyright MyCorp © 2024 Хостинг от uCoz