Советы по Delphi


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


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

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

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

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

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



    if (( Pos('(',cTagExp) + Pos('+',cTagExp) ) > 0 ) then Table1.AddIndex( cTagName, cTagExp, [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

    Рукописи не горят... [001258]



    Содержание раздела