Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.220.136.165] |
|
Сообщ.
#1
,
|
|
|
Здравствуйте,
есть некий Dataset FIBplus, в нём указан код DeleteSQL который нормально работает. Но в ряде случаев нужно удалить строки только внутри Dataset НЕ запуская DeleteSQL код (не обращаясь к БД)! Можно ли как-то это сделать? |
Сообщ.
#2
,
|
|
|
По идее, должен быть тип курсора, который не отправляет изменения сразу на сервер, а кеширует их на клиенте. Если указать этот тип курсора, то с датасетом можно выполнять операции обычными средствами. А потом, либо подтвердить изменения, либо отменить их. Наличие этого типа курсора зависит от провайдера.
ИМХО |
Сообщ.
#3
,
|
|
|
Теория отличная. Можно пример на практике в коде?
|
Сообщ.
#4
,
|
|
|
свойство CachedUpdates
|
Сообщ.
#5
,
|
|
|
Цитата DeveloPerchik @ Теория отличная. Можно пример на практике в коде? К сожалению, сейчас не вспомню что и как. Такой проект писал очень давно. Запамятовал... |
Сообщ.
#6
,
|
|
|
ViktorXP
Привет, давно не виделись, как поживаешь? Раз Вы заинтересовались вопросом, опишу задачу подробнее... Интерфейс: окно с огромной таблицей, внизу кнопка "Удалить". Код: Таблица cxGrid получает данные из FIBplus Dataset который получает данные из сложной ХП из БД связывающей порядка 10таблиц в результате чего KeyField=xID. Когда юзер нажимает кнопку "Удалить" ему задаётся вопрос: вы хотите удалить по методу "а" или методу "б"? Удаление возможно двух типов: а) удаление строки по xID из основной для отображаемой таблицы xTable - это удаление делает Dataset.DeleteSQL; б) возможно удаление по другому yID (есть в полученных данных) которое требует сложного кросс-удаления из множества всех 10таблиц для чего используется отдельная ХП в БД. То есть в случае удаления типа "б" удаление происходит скрыто от Dataset из-за чего строка(и) которые уже удалены из БД всё ещё присутствуют в Dataset и отображаются в связанной таблице cxGrid. Так вот вопрос в том - как удалить из Dataset уже неактуальные-несуществующие строки данных? Можно сделать тупо FullRefresh, но хотелось бы обойтись без дополнительных запросов к БД (без повторных сложных выборок)! |
Сообщ.
#7
,
|
|
|
Как вариант, можно воспользоваться локальным фильтром. Т.е.
query1.filtered := false; query1.filter := 'xID <> 1' query1.filtered := true; |
Сообщ.
#8
,
|
|
|
Можно, но поработав с cxGrid опасаюсь их туманного поведения, ведь у них есть свой DataController выкачивающий все данные из Dataset в связи с чем бывают всякие баги... поэтому хотелось бы уж наверняка удалить строки из Dataset...
|
Сообщ.
#9
,
|
|
|
cxGrid очень богатая на возможности. скрыть строку можно прямо в ней (я не помню как точно там все эти свойства называются так как последние полтора года, вообще не работал с визуализацией. все как то более системной разработкой занят)
Также можно сделать копию TDataSet. Для копии можно взять стандартный TClientDataSet (midas). Так и TMemDataSet (если я не ошибся в имени) из тойже библиотеки DevExpres. И если я не ошибаюсь что то наподобие этого есть среди компонентов джейди. Ну или как вариант загрузить все данные прямо в сетку cxGrid (он умеет работать и как обычный TStringGrid) + еще можно почитать доки FIBplus. Я не знаю как в этом компоненте (почти не пользовался им), но например pgDac умеет рефрешить отдельные строки (ну по крайне мере умел полтора года тому назад) Цитата DeveloPerchik @ ViktorXP Привет, давно не виделись, как поживаешь? Привет. Да все как то в делах погруз. |
Сообщ.
#10
,
|
|
|
Точно встречал в описаниях FB фишку, которая обновляет только выбранную запись. Правда, не знаю, как это сработает в случае удаления этой записи. Вообще проблема интересная.
|
Сообщ.
#11
,
|
|
|
Цитата artsb @ Как вариант, можно воспользоваться локальным фильтром. Т.е. Решил вопрос темы всё же через Dataset.Filter, тк тупо "Dataset.InternalDelete" нет, а все остальные обходные варианты оказались хуже. Всем спасибо за участие! |