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;
}
} | |
|