Определение удаления записей в .DBF
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
|