Меню сайта
Мини-чат
Чтобы добавить сообщение, необходимо авторизоваться.
Главная » Статьи » Не стандартные примеры на 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
Категория: Базы Данных | Добавил: DelphiAiX (20.05.2012)
Просмотров: 183 | Рейтинг: 0.0/0
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]