Определение удаления записей в .DBF

{codecitation class=»brush: pascal; gutter: false;» width=»600px»}

Взято из «Dtopics Database 1.10 from 3K computer Consultancy»:

Dbase в BDE имеет большее количество ситуаций ‘особого случая’, чем таблицы SQL и Paradox, поскольку данный формат поддерживает выражения в индексах и прочие характеристики, например:

Создание и пересоздание индекса

DbiRegenIndexes( Table1.Handle ); { Регенерация всех индексов }

создание индекса (зависит от того, существует ли выражение или нет)

if (( Pos(‘(‘,cTagExp) Pos(‘ ‘,cTagExp) ) > 0 ) then

Table1.AddIndex( cTagName, cTagExp, [ixExpression]) {<- ixExpression - _литерал_}

else

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

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

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

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

with Table1 do

StrPCopy( TName, TableName );

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

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

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

Задание частичного/полного соответствия символов — вкл/выкл (например, 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;

except

on 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

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

{/codecitation}

Добавить комментарий