| 
| Alex | 
| Отправлено: 27.05.2003, 07:18 |  |  
| 
 Не зарегистрирован
 
 
 
 
 
 
 
  
 | Плиз подскажите, как сделать очистку базы (dbf) от удаленных записей, средствами Билдера ? |  
|  |  
| Admin | 
| Отправлено: 27.05.2003, 13:29 |  |  
|  
 Владимир
 
 Группа: Администратор
 Сообщений: 1190
 
 
 
  
 | Это делается средствами BDE: 
 Table1->Close();
 Table1->Exclusive=true;
 Table1->Open();
 DbiPackTable(Table1->DBHandle,Table1->Handle, NULL,NULL,true);
 
 
 |  
|  |  
| Admin | 
| Отправлено: 27.05.2003, 14:40 |  |  
|  
 Владимир
 
 Группа: Администратор
 Сообщений: 1190
 
 
 
  
 | Кстати, эта функция не подходит для таблиц Paradox, для них используйте функцию DbiDoRestructure() с опцией bPack
 или функцию PackTable() из библиотеки RXLib
 
 Пример: упаковываем все таблицы базы данных Database1
 
 
 | CODE |  | DBIResult fDbiDoRestructure(hDBIDb hDb, char *TblName);
 
 // начинаем упаковку
 void __fastcall TForm1::Button1Click(TObject *Sender)
 {
 // получаем имена всех таблиц в ListBox1
 Database1->GetTableNames(ListBox1->Items,false);
 // если таблицы запаролены- указываем пароль
 Session->AddPassword("jIGGAe");
 
 for(int i=0; i<ListBox1->Items->Count; i++){
 fDbiDoRestructure(Database1->Handle, ListBox1->Items->Strings[i].c_str());
 }
 }
 
 DBIResult fDbiDoRestructure(hDBIDb hDb, char *TblName)
 {
 DBIResult   rslt;
 CRTblDesc   TblDesc;
 
 memset((void *) &TblDesc, 0, sizeof(CRTblDesc));
 lstrcpy(TblDesc.szTblName, TblName);
 lstrcpy(TblDesc.szTblType, szPARADOX);
 TblDesc.bPack = TRUE;
 rslt = DbiDoRestructure(hDb, 1, &TblDesc, NULL, NULL,NULL, FALSE);
 if(rslt == DBIERR_NONE) ShowMessage("Successful Pack: "+String(TblName));
 return rslt;
 }
 //------------------------------------------------------------------------
 | 
 
 Отредактировано Admin — 27 May 2003, 14:41
 |  
|  |  
| Alex | 
| Отправлено: 28.05.2003, 09:03 |  |  
| 
 Ученик-кочегар
 
 Группа: Участник
 Сообщений: 5
 
 
 
  
 | Дело в том что я пытаюсь отвязаться от BDE, для облегчения переноса программы на компы, где его (BDE) нет. Делаю я это путем копирования необходимых библиотек от BDE в директорию с моей программой. И вэтом случае
 DbiPackTable(Table1->DBHandle,Table1->Handle, NULL,NULL,true);
 у меня не работает
  
 Как это лечить ?
 
 |  
|  |  
| pasha | 
| Отправлено: 28.05.2003, 17:37 |  |  
| 
 Дежурный стрелочник
 
 Группа: Участник
 Сообщений: 62
 
 
 
  
 | Дело в том что я пытаюсь отвязаться от BDE, для облегчения переноса программы на компы, где его (BDE) нет. Делаю я это путем копирования необходимых библиотек от BDE в директорию с моей программой. 
 
 То есть, если BDE стоит не в C:\Program Files\Common Files\Borland Shared\BDE, а в другой папке, то это уже и не BDE вовсе ?
 
 А если Вам понадобиться поставить на эти компы еще несколько
 программ в разные директории, то вы в каждую директорию к
 программе будете копировать файлы BDE ?
 
 К сожалению я не разбирался досконально с BDE, но возможно
 Вы скопировали не все необходимые файлы из BDE
 
 |  
|  |  
| Alex | 
| Отправлено: 03.06.2003, 08:53 |  |  
| 
 Ученик-кочегар
 
 Группа: Участник
 Сообщений: 5
 
 
 
  
 | Проблемма решена, теперь база упаковывается. Ларчик то просто открывался.
 
 В директорию к программе, помимо файликов:
 blw32.dll, idapi32.dll, idr20009.dll, iddbas32.dll, bantam.dll, charset.cvb, usa.btl как указанно в FAQ, надо добавить файлик idbat32.dll
 
 Иначе база с помошью команды:
 DbiPackTable(Table1->DBHandle,Table1->Handle, NULL,NULL,true);
 не пакуется и выдается следующая ошибка:
 Access violation at address 00000001. Read of address 00000001.
 
 |  
|  |  |