Delphi-Help

Главная Статьи DBASE и DBF Определение удаления записей в .DBF

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

Оцените материал
(0 голосов)


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

Авторизация



Счетчики