Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ClientDataSet, как? 
:(
    Опции темы
Лена
Дата 21.9.2006, 14:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 879
Регистрация: 16.8.2006

Репутация: 11
Всего: 11



Нажимаю на кнопку стандартного компонета навигатора удалить запись (набор ClientDataSet). Пытаюсь обработать нажатие показом диалогово окна:
Код

void __fastcall TDataModule2::ClientDataSetKeyBeforeDelete(
      TDataSet *DataSet)
{
 if (Application->MessageBox("Удалить?", "Подтвердите удаление", MB_YESNO +
    MB_ICONQUESTION) == IDYES) {
     ClientDataSetKey->ApplyUpdates(-1);
}
else {
   ClientDataSetKey->CancelUpdates(); //вижу что эта строка отрабатывается в точке остона, но запись удаляется
    
}

Запись удаляется и при нажатии Да и при нажатии Нет. Почему удаляется при нажатии Нет?
PM MAIL   Вверх
Vyacheslav
Дата 21.9.2006, 14:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

Репутация: 47
Всего: 59



Вы же это этот код поставили на обработчик BeforeDelete
Он выполняется, а дальше идет удаление smile
Попробуйте это перенести на AfterDelete

Добавлено @ 15:07 
Я бы кстати сделал проще
Код

void __fastcall TDataModule2::ClientDataSetKeyBeforeDelete(
      TDataSet *DataSet)
 if (Application->MessageBox("Удалить?", "Подтвердите удаление", MB_YESNO +
    MB_ICONQUESTION) != IDYES) {
         Abort();
    }  
}

void __fastcall TDataModule2::ClientDataSetKeyAfterDelete(
      TDataSet *DataSet)
{
  ClientDataSetKey->ApplyUpdates(-1);
}





--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
Лена
Дата 21.9.2006, 15:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 879
Регистрация: 16.8.2006

Репутация: 11
Всего: 11



Спасибо! 
Но есть вопросы  smile 
Мне пока не понятно логика работы ClientDataSet я удалила записи используя навигатор. Затем нажала кнопку refresh навигатора и все записи вернулись. Что дописать? 

P.S. Пока писала получила от вас код. Наверное решение это событие AfterDelete?

Это сообщение отредактировал(а) Лена - 21.9.2006, 15:16
PM MAIL   Вверх
Vyacheslav
Дата 21.9.2006, 15:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

Репутация: 47
Всего: 59



Точно.


--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
Лена
Дата 21.9.2006, 15:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 879
Регистрация: 16.8.2006

Репутация: 11
Всего: 11



Нет не понятно.  smile 
Как сделать так (какие события написать), чтобы записи удалясь и не появлялись после нажатия refresh в навигаторе?  
Если запись удалена навигатором, то сразу должна быть удалена из базы с которой связан ClientDataSet. Например, я удаляю запись. Нажимаю в навигаторе Утвердить. Затем нажимаю рефреш и запись снова появляется. Получается кнопка навигатора Утвердить не отрабатывает?  smile


P.S.
Код добавила, но записи появляются:
Код

void __fastcall TDataModule2::ClientDataSetKeyBeforeDelete(
      TDataSet *DataSet)
 if (Application->MessageBox("Удалить?", "Подтвердите удаление", MB_YESNO +
    MB_ICONQUESTION) != IDYES) {
         Abort();
    }  
}

void __fastcall TDataModule2::ClientDataSetKeyAfterDelete(
      TDataSet *DataSet)
{
  ClientDataSetKey->ApplyUpdates(-1);
}


Это сообщение отредактировал(а) Лена - 21.9.2006, 15:32
PM MAIL   Вверх
Vyacheslav
Дата 21.9.2006, 15:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

Репутация: 47
Всего: 59



Кнопки "Утвердить" - нет. Естб кнока Post - завершить вставку или редактирование записи с сохранением результата редактирования.
Основная проблем, как  я понимаю, не дейсвует ClientDataSetKey->ApplyUpdates(-1)?




--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
Лена
Дата 21.9.2006, 16:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 879
Регистрация: 16.8.2006

Репутация: 11
Всего: 11



>кнока Post 

Да Post.  Моя задача такая:
в гриде данные идущее из базы через связку ADOQuery -> TDatasetProvider -> TClientDataset -> TDatasource. Я хочу, чтобы навигатор не посредственно воздействовал на отображаемые данные и на саму базу данных. Если пользователь добавил строку, то при переходе на другую строку или при нажатии кнопки Post все это закреплялось и в гриде и в самой базе данных. т.е. если пользователь нажмет refresh то ничего не произойдет, потому что каждое действие навигатора он воздействует и на грид и на базу.  Так же и при редактировании: пользователь отредактировал запись, перешел на другую все закрепилось и в гриде и в базе, также и при удалении строк ( в общем все кнопки редактирования у навигатора). Хочется чтобы все кнопки навигатора воздействовали и на грид и на базу. Я просто запуталась с многочисленными событиями Before/After... помогите smile 


PM MAIL   Вверх
Vyacheslav
Дата 21.9.2006, 17:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

Репутация: 47
Всего: 59



Ну если c ApplyUpdates все в порядке,
то  достаточно поставить два обработчика 
Код

void __fastcall TForm1::ClientDataSet1AfterPost(TDataSet *DataSet)
{
     ClientDataSet1->ApplyUpdates(-1);
}
//---------------------------------------------------------------------------

void __fastcall TForm1::ClientDataSet1AfterDelete(TDataSet *DataSet)
{
      ClientDataSet1->ApplyUpdates(-1);
}
//---------------------------------------------------------------------------




--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
Лена
Дата 21.9.2006, 17:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 879
Регистрация: 16.8.2006

Репутация: 11
Всего: 11



Cейчас у меня такой код:
Код


void __fastcall TDataModule2::ClientDataSetKeyBeforeDelete(
      TDataSet *DataSet)
{

 if (Application->MessageBox("Óäàëèòü?", "Ïîäòâåðäèòå óäàëåíèå", MB_YESNO +
    MB_ICONQUESTION) != IDYES) {
         Abort();
    }
}
//---------------------------------------------------------------------------

void __fastcall TDataModule2::ClientDataSetKeyAfterDelete(
      TDataSet *DataSet)
{
   ClientDataSetKey->ApplyUpdates(-1);
}
//---------------------------------------------------------------------------

//---------------------------------------------------------------------------

void __fastcall TDataModule2::ClientDataSetKeyAfterPost(TDataSet *DataSet)
{
 ClientDataSetKey->ApplyUpdates(-1);
}
//--

Запускаю приложение в гриде 4 записи.
1. Удаляю одну из них.
2. Подтвеждаю удаление.
3. Нажимаю refresh и снова выпазить строка которую я удалила. smile 


Если перезапустить приложение то строки действительно удалена, не понятно, почему она появлалась после refresh до перезапука приложения? Как заставить навигатор намертво фиксировать каждое свое действие? Если строка удалена то никаким refresh ее уже не увидеть в этой ссесии.

Это сообщение отредактировал(а) Лена - 21.9.2006, 17:29
PM MAIL   Вверх
Vyacheslav
Дата 21.9.2006, 17:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

Репутация: 47
Всего: 59



А дело не в навигаторе, а в том, что у Вас провайдер неверно обновляет. Он где то закешировал данные. Кстати, ошибка на refresh - очень чато встречающийся баг в реализации. Надежнее будет вместо refresh  просто закрыть-открыть таблицу.  


--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
Лена
Дата 21.9.2006, 17:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 879
Регистрация: 16.8.2006

Репутация: 11
Всего: 11



>что у Вас провайдер не верно обновляет.

Cпасибо, теперь понятно, а то я уже начала тихо ненавидеть ClientDataSet  smile 
У меня настроено на базу данных на PostgreSQL. Решила так: запретила кнопку refresh и теперь все работает и выглядит как надо.  smile 


PM MAIL   Вверх
Vyacheslav
Дата 22.9.2006, 10:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

Репутация: 47
Всего: 59



Я бы всетаки реализовал вариант с переоткрытием соответсвенно задав обработчик BeforeRefresh. Если бы был простая таблица, то это бы выглядела вот так
Код

void __fastcall TForm1::ClientDataSet1BeforeRefresh(TDataSet *DataSet)
{
    Table1->Active  = false;
    Table1->Active  = true;
    Abort();
}


Тогда бы и кнопка refresh  работа нормально 

Но у Вас используется провайдер, насколько я понял. Там  сложнее. Вернее не сложнее, но я подзабыл уже все. Больше двух лет с Builder и с базами не работаю


--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
Embesse
Дата 26.1.2023, 15:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 26.1.2023

Репутация: нет
Всего: нет




Модератор: Сообщение скрыто.

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.1405 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.