![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Головоломка с 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]Поясни пункт Д