Мастер участка
Группа: Участник
Сообщений: 501
|
Возник вопрос. Связь через ADOQuery -> TDatasetProvider -> TClientDataset -> TDatasource грид
Если мне, к примеру, надо чтобы ClientDataSet вел себя как обычный ADOTable т.е. после редактирования, удаления, вставки и переходе на новую строку запись сразу бы обновлялась в базе и в гриде. Тогда мне необходимо написать обработчики ClientDataSet. Написала так:
CODE |
//список всех обработчиков ClientDataSetDoors
//в ADOQueryDoors привязанном к ClientDataSetDoors при старте программы select * from gates order by name
//№2
void __fastcall TDataModule2::ClientDataSetDoorsBeforeDelete(
TDataSet *DataSet)
{
if (Application->MessageBox("Удалить?", "Подтвердите удаление", MB_YESNO +
MB_ICONQUESTION) != IDYES) {
Abort();
}
}
//---------------------------------------------------------------------------
//№3
void __fastcall TDataModule2::ClientDataSetDoorsBeforePost(
TDataSet *DataSet)
{
if( Form1->DBGrid2->Fields[1]->Value.IsNull()
|| Form1->DBGrid2->Fields[2]->Value.IsNull())
{
ShowMessage("Поля \"Доступ\" и \"Описание\" должны быть заполнены");
Abort();
}
}
//---------------------------------------------------------------------------
//№4
void __fastcall TDataModule2::ClientDataSetDoorsAfterDelete(
TDataSet *DataSet)
{
int Number = ClientDataSetDoors->RecNo;
ClientDataSetDoors->ApplyUpdates(-1);
ClientDataSetDoors->RecNo = Number;
}
//---------------------------------------------------------------------------
//№5
void __fastcall TDataModule2::ClientDataSetDoorsAfterPost(
TDataSet *DataSet)
{
int Number = ClientDataSetDoors->RecNo;
ClientDataSetDoors->ApplyUpdates(-1);
ClientDataSetDoors->Active = false;
ADOQueryDoors->Active = false;
ADOQueryDoors->Active = true;
ClientDataSetDoors->Active = true;
ClientDataSetDoors->RecNo = Number;
}
//---------------------------------------------------------------------------
//№6
void __fastcall TDataModule2::ClientDataSetDoorsBeforeRefresh(
TDataSet *DataSet)
{
//кнопка Refresh навигатора
ClientDataSetDoors->Active = false;
ADOQueryDoors->Active = false;
ADOQueryDoors->Active = true;
ClientDataSetDoors->Active = true;
ClientDataSetDoors->First();
}
|
Написав, все эти обработчики будет ли мой ClientDataSetVis вести себя также как ADOTable? Т.е. я хочу отказаться от кэширования и сразу отправлять все в базу и видеть обновления в гриде. Правильны ли в этом случае написаны BeforeRefresh, AfterPost, AfterDelete? Может что поправить или добавить?
|