Чтение онлайн

ЖАНРЫ

Советы по Delphi. Версия 1.4.3 от 1.1.2001

Озеров Валентин

Шрифт:

else Table1.AddIndex(cTagName, cTagExp, []);

2. Связки Master/Detail в выражениях дочерних индексов

– вызов процедуры BDE DbiLinkDetailToExp вместо обычной DbiLinkDetail

3. Пакование таблиц

with Table1 do StrPCopy(TName, TableName);

Result := DBIPackTable(DbHandle, Handle, TName, szDBASE, TRUE);

4. Задание видимости удаленных записей – вкл/выкл (например, dBase SET DELETED ON/OFF)

DbiSetProp( hDBIObj(Table1.Handle), curSOFTDELETEON, LongInt(bValue));

5. Задание частичного/полного

соответствия символов – вкл/выкл (например, dBase SET EXACT ON/OFF)

DbiSetProp( hDBIObj(Table1.Handle), curINEXACTON, LongInt(bValue));

<– Конец –>

Ну и теперь сами вопросы:

<– Начало –>

«Как мне увидеть записи dBASE, помеченные для удаления?»

В обработчике события AfterOpen вызовите приведенную ниже функцию. Включите DBITYPES, DBIERRS, DBIPROCS в список используемых модулей. Для вызова функции передайте ей в качестве аргумента имя TTable и TRUE/FALSE в зависимости от необходимости показа/скрытия удаленных записей. Пример:

procedure TForm1.Table1AfterOpen(DataSet: TDataset);

begin

SetDelete(Table1, TRUE);

end;

procedure SetDelete(oTable:TTable; Value: Boolean);

var

 rslt: DBIResult;

 szErrMsg: DBIMSG;

begin

 try

Table.DisableControls;

try

rslt := DbiSetProp(hDBIObj(oTable.Handle), curSOFTDELETEON,LongInt(Value));

if rslt <> DBIERR_NONE then

begin

DbiGetErrorString(rslt, szErrMsg);

raise Exception.Create(StrPas(szErrMsg));

end;

excepton E: EDBEngineError do ShowMessage(E.Message);

on E: Exception do ShowMessage(E.Message);

end;

 finally

Table.Refresh;

Table.EnableControls;

 end;

end;

«Могу ли я создать в табличной сетке колонку, в которой будут показываться записи, помеченные для удаления из таблицы dBASE?»

Создайте вычисляемое поле, затем в обработчике события таблицы OnCalcField замените его таким образом:

procedure TForm1.Table1CalcFields(DataSet: TDataset);

var

 RCProps : RecProps;

 Result : DBIResult;

begin

 Result := DbiGetRecord(Table1.Handle, dbiNo

Рукописи не горят…

Определение

номера записи в таблице dBASE

Таблицы dBASE применяют довольно статическую систему нумерации записей. Номер записи для данной записи (извините за тавтологию) отражает физическую позицию в табличном файле. Эти номера записей не изменяются вследствие фильтрации, упорядочивания данных или сортировки. К примеру, первая запись, хранящаяся в .DBF файле, будет иметь номер записи 1. Возможно, после некоторого упорядочивания индекса, запись будет последней из 100 записей. В этом случае запись должна оставаться с тем же номером, а не номером 100, отражающим новую позицию в сортированном наборе данных. Это противоречит таблицам Paradox, где соблюдается последовательная нумерация. Последовательная нумерация Paradox похожа на нумерацию записей dBASE, за исключением большей гибкости и отражению в номере записи ее текущей позиции в наборе данных. То есть, запись может не всегда иметь номер, установленный для нее фильтром набора данных, уменьшившим общее число записей, или при активном индексе, из-за чего может измениться отображаемый порядок записи.

В приложениях для работы с базами данных, созданных с помощью Delphi и Borland Database Engine (BDE), DB-компонентами не предусмотрено извлечение и определение записи таблицы dBASE. Такая операция, тем не менее, возможна с помощью вызова из вашего приложения функций BDE.

Существует несколько функций BDE, возвращающих информацию о текущей записи dBASE, например, ее номер. На самом деле, любая функция, заполняющая структуру BDE pRECProps, вполне достаточна. Например, функции BDE DbiGetRecord, DbiGetNextRecord и DbiGetPriorRecord. Естественно, только первая из них реально позволяет получить информацию о текущей записи. Две других перемещают при вводе указатель на запись, подобно методам Next и Prior компонентов TTable и TQuery.

Структура pRECProps состоит из следующих полей:

iSeqNum: тип LongInt; определяет текущий номер записи (относительно набора данных, включая фильтрацию и сортировку индекса); используется, если тип таблицы поддерживает последовательную нумерацию (только Paradox).

iPhyRecNum: тип LongInt; определяет номер записи; используется, если тип таблицы поддерживает физические номера записи (только dBASE).

bRecChanged: тип Boolean; в настоящее время не используется.

bSeqNumChanged: тип Boolean; в настоящее время не используется.

bDeleteFlag: тип Boolean; указывает на удаленную запись; используется, если тип таблицы поддерживает "мягкое" удаление (только dBASE).

Одна из этих BDE-функций может быть вызвана из вашего приложения для заполнения данной структуры, из которой затем может быть извлечен физический номер записи. Ниже - пример использования для этой цели функции DbiGetRecord.

function RecNo(ATable: TTable): LongInt;

var

 R: RECProps;

 rslt: DbiResult;

 Error: array [0..255] of Char;

begin

 ATable.UpdateCursorPos;

 rslt := DbiGetRecord(ATable.Handle, dbiNoLock, nil, @R);

 if rslt = DBIERR_NONE then Result := R.iPhyRecNum

 else begin

Поделиться с друзьями: