Arial Century Courier Georgia Tahoma Verdana Times New Roman
-
+
DBIERR_INVALIDHNDL: ErrorMsg := 'Указанный дескриптор базы данных или курсора ' +'неверен или равен NULL';
DBIERR_NOSUCHTABLE: ErrorMsg := 'Таблица с таким именем не существует';
DBIERR_UNKNOWNTBLTYPE: ErrorMsg := 'Неизвестный тип таблицы';
DBIERR_NEEDEXCLACCESS: ErrorMsg := 'Таблица открыта не в эксклюзивном режиме';
else
DbiGetErrorString(Error, Special);
ErrorMsg := '[' + IntToStr(Error) + ']: ' + Special;
end ;
MessageDlg(ErrorMsg, mtWarning, [mbOk], 0);
end ;
Пакование
таблиц dBASE III
Для упаковки таблицы dBASE, открытой с помощью TTable, воспользуйтесь функцией BDE DbiPackTable. Для этого достаточно сделать две операции:
1. Добавьте в секцию uses следующие модули:
{ Для Delphi 1.0: } DBITYPES, DBIPROCS и DBIERRS;
{ Для Delphi 2.0: } BDE;
2. Затем вызовите BDE функцию DbiPackTable следующим образом:
Check(DbiPackTable(Table1.DbHandle, Table1.Handle, Nil , szDBASE, TRUE));
Примечания:
• Таблица должна быть открыта в эксклюзивном режиме.
• При вызове функций API BDE используйте процедуру Check. Check в случае ошибки при вызове BDE генерирует исключительную ситуацию.
Пакование таблиц dBASE IV
Nomadic советует:
Для dBase:
uses DbiProcs;
with table do
begin
OldState := Active;
Close;
Exclusive := True;
Open;
DbiPackTable(DBHandle, Handle, nil , nil , True);
{^ здесь можно добавить check}
Close;
Exclusive := False;
Active := OldState;
{ при желании можно сохранить закладку }
end ;
Pavel Kulchenko
(2:465/66)
Пример для Paradox:
Uses BDE; // for d3, для d2 не помню (что-то типа dbiprocs и еще что-то)
// для пpимеpа
tLog : TTable; // таблица, юзающая d:\db\log.db
var
TblDesc: CRTblDesc;
rslt: DBIResult;
Dir: String ; //имеется в виду huge string т.е. {$h+}
hDb: hDbiDb;
begin
tLog.Active := False; //деактивиpуем TTable
SetLength(Dir, dbiMaxNameLen + 1);
DbiGetDirectory(tLog.DBHandle, False, PChar(Dir));
SetLength(Dir, StrLen(PChar(Dir)));
DbiOpenDatabase(nil , nil , dbiReadWrite, dbiOpenExcl, nil , 0, nil , nil , hDb);
DbiSetDirectory(hDb, PChar(Dir));
FillChar(TblDesc, sizeof(CRTblDesc), 0);
StrPCopy(TblDesc.szTblName, 'd:\db\log.db');
//
здесь должно быть полное имя файла
//котоpое можно: а) ввести pуками;
//б) вытащить из пpопеpтей таблицы;
//в) вытащить из алиаса;
//г) см. FAQ
StrCopy(TblDesc.szTblType, szParadox);
//BTW тут может и szDBase стоять
TblDesc.bPack := TRUE;
DbiDoRestructure(hDb, 1, @TblDesc, nil , nil , nil , false);
DbiCloseDatabase(hDb);
end ;
// можно еще чеки ввести, но облом :-)
Показ удаленных записей в таблице dBASE
В таблицах dBASE записи не удаляются до тех пор, пока таблица не будет упакована. Пока же это не произойдет, удаленные записи остаются в таблице, только имеют при этом флажок "к удалению". Для того, чтобы показать эти существующие, но не отображаемые записи, существует функция ShowDeleted, которая использует функцию BDE API DbiSetProp, показывающая записи, помеченные к удалению. При использовании этой функции нет необходимости закрывать и вновь открывать таблицу. ShowDeleted в качестве параметров передается TTable и логическое значение. Логический параметр указывает на необходимость показа удаленных записей.
Демонстрационный проект:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, DBCtrls, Grids, DBGrids, DB, DBTables;
type
TForm1 = class (TForm)
Table1: TTable;
DataSource1: TDataSource;
DBGrid1: TDBGrid;
DBNavigator1: TDBNavigator;
CheckBox1: TCheckBox;
procedure CheckBox1Click(Sender: TObject);
public
procedure ShowDeleted(Table: TTable; ShowDeleted: Boolean);
end ;
var