Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Головоломка с IBX-компонентами [D5, IB6.x]


Поляков А.Н. ©   (2002-07-19 15:30:00) 

Исходная ситуация :

MDI приложение.
Компоненты IBX для работы с IB6
Окна для просмотра/редактирования данных представляют собой
всяки-разны Grid-ы.
В каждом окне в тулБаре есть кнопка "сохранить изменения" и кнопка "отменить изменения (т.е. перечитать датасет из базы)"

Задача - заставить при таких условиях приложение корректно работать.
Корректность заключается в :

A) Кнопка "сохранить" - сохраняет изменения только в своем окне.
B) Кнопка "отменить" - отменяет изменения только в своем окне.
C) Если я в окне-справочнике ввел и сохранил новые данные, то они должны быть доступны в других окнах после перечитывания данных из базы.
D) В формах с мастер-детал гридами/датасетами детал не должен терять изменения данных, если я перемещусь по мастер-датасету. Детал должен их "помнить" пока я не отменю или не сохраню изменения.


А теперь грабли коих я успел насобирать предостаточно :

1. В каждом окне есть свой объект TIBTransaction. (через него
commitRetaining делался).
CacheUpdates у TIBDataSet = false
Кнопка "сохранить" делает ApplyUpdates датасетам и
CommitRetaining через транзакцию
Кнопка "отменить" делает RollbackRetaining через транзакцию
и перечитывает данные из базы

A) B) D) - выполняется
C) - нет, пока не перезапустишь приложение.


2. Транзакция только в главном окне, все датасеты вяжутся к ней.
CacheUpdates у TIBDataSet = false
Кнопка "сохранить" делает ApplyUpdates датасетам и
CommitRetaining через транзакцию
Кнопка "отменить" делает RollbackRetaining через транзакцию
и перечитывает данные из базы

C) D) - выполняется.
A) B) - нет. Коммиты и роллбэки получаются всеобщими для всех открытых окон, т.к. изменения сразу идут в базу (CacheUpdates у TIBDataSet = false)


3. Транзакция только в главном окне, все датасеты вяжутся к ней.
CacheUpdates у TIBDataSet = true
Кнопка "сохранить" делает ApplyUpdates датасетам и
CommitRetaining через транзакцию
Кнопка "отменить" просто перечитывает данные из базы

A) B) C) - выполняется
D) - нет. Детал-датасет с несохраненными изменениями запросто теряет эти изменения, если я перемещусь по мастер-датасету.


У меня уже спортивная злость начинает просыпаться.
Помогите победить проблему.


AlexA   (2002-07-19 18:17:00) [1]

> В каждом окне должна быть своя транзакция, на которую
привязываются датасеты окна.

Можно и в отдельной форме, например датамодул"е


>CacheUpdates у датасетов = false
это еще почему?


Поляков А.Н.   (2002-07-19 17:52:00) [2]

Щелкни мышью дважды на каждом компоненте TIBTransaction и выбери изоляцию ReadCommitted nowait. CommitRetaining у тебя работает - просто твои транзакции не видят новые данные

Спасибо. Потестил. Вроде все ОК.

Итого. (рецепт для тех кто пойдет по стопам) :

1. В каждом окне должна быть своя транзакция, на которую
привязываются датасеты окна.
Изоляция ReadCommitted nowait
2. CacheUpdates у датасетов = false
3. при сохранении Trn.commitRetaining
4. при отмене изменений Trn.rollbackRetaining


И в догонку.

Поясни пункт Д

Например, слева грид с температурными зонами (мастер), справа грид с месячными коэффициентами для выбранной температурной зоны (детайл).

Мои действия :

1. выбрал зону1
2. отредактировал ее коэффициенты
3. не сохраняясь выбрал зону2
4. выбрал зону1

При "правильном" поведении датасета он покажет отредактированные мной kk, при "неправильном" я увижу kk такими, какими они были до редактирования.


kaif   (2002-07-19 16:27:00) [3]

Проблема имеет простое решение. Режим TIBTransaction по умолчанию не ReadCommitted. Щелкни мышью дважды на каждом компоненте TIBTransaction и выбери изоляцию ReadCommitted nowait. CommitRetaining у тебя работает - просто твои транзакции не видят новые данные.


alexA   (2002-07-19 16:26:00) [4]

Поясни пункт Д


Наверх

Титульная страница Поиск, карта сайта Написать письмо