| Kelf | 
| Отправлено: 19.08.2005, 02:48 |  | 
| 
 Не зарегистрирован
 
 
 
 
 
 
 
  
 | Использую компоненты FIBPlus: DataBase->DataSet->DataSource и две транзакции
 Есть форма для справочника с DBGrid подключеным к этому DS.
 Таких цепочек и форм несколько (для каждого справочника, DataBase конечно только один).
 На главной форме расположен DBGid сводной таблицы и DBLookupComboBox.
 Lookup использует DS одного из справочников, у сводной таблицы свой DS.
 Свойства DataSource & DataField LookupComboBoxa пустые, но есть такой обработчик:
 
 | CODE |  | void __fastcall TMainForm::LkOtdelChange(TObject *Sender){
 AnsiString sql="SELECT S.KOTD,S.KPRED,S.KURS,S.FOBUCH,S.ID FROM SPIS2 S WHERE s.kotd=";
 DM->dsTree->Close();
 DM->dsTree->SQLs->SelectSQL->Clear();
 sql+=LkOtdel->KeyValue;
 DM->dsTree->SQLs->SelectSQL->Add(sql);
 DM->dsTree->Prepare();
 DM->dsTree->Open();
 }
 
 | 
 dsTree DataSet сводной таблицы.
 При закрытии программы вылетает ошибка "Невозможно отключиться от базы. У вас есть незакрытая транзакция"
 
 | 
|  | 
| greyich | 
| Отправлено: 19.08.2005, 10:51 |  | 
| 
 Дежурный стрелочник
 
 Группа: Участник
 Сообщений: 45
 
 
 
  
 | а какая база данных? | 
|  | 
| olegenty | 
| Отправлено: 19.08.2005, 17:21 |  | 
| 
 Ветеран
 
 Группа: Модератор
 Сообщений: 2412
 
 
 
  
 | в OnCloseQuery позакрывай всё, и всего-то делов. это можно сделать почти автоматом — все транзакции перечисляются в Transactions компонента TpFIBDatabase | 
|  | 
| ** Admin | 
| Отправлено: 21.08.2005, 22:19 |  | 
| 
 Не зарегистрирован
 
 
 
 
 
 
 
  
 | Были проблемы при завершении программы (закрытии главной формы программы).
 
 Как оказалось связаны проблемы были с несколькими
 TDBLookupComboboxEh находящихся на разных формах.
 Простое (даже в правильном порядке) закрытие датасетов
 не помогло.
 Пришлось сначала отключить от событий TDBLookupComboboxEh
 и только потом закрыть все запросы DBase->CloseDataSets();
 и отключиться от базы DBase->Connected = false;.
 
 Вот код:
 
 
 | CODE |  | void __fastcall TFMain::FormClose(TObject *Sender, TCloseAction &Action)
 {
 PageControl->OnChange = NULL; // также пришлось
 // сначала отключить это событие
 
 for(int i=0; i<Application->ComponentCount; i++){
 if(dynamic_cast<TForm*>(Application->Components[i])){
 TForm* TmpForm = (TForm*)(Application->Components[i]);
 for(int j=0; j<TmpForm->ComponentCount; j++){
 if(dynamic_cast<TDBLookupComboboxEh*>(TmpForm->Components[j])){
 ((TDBLookupComboboxEh*)TmpForm->Components[j])->OnChange = NULL;
 }//if
 }//j
 }//if
 }// i
 
 
 if(DBase->Connected){
 DBase->CloseDataSets();
 DBase->Connected = false;
 }
 }
 | 
 | 
|  |