Форум: "Базы";
Текущий архив: 2002.08.08;
Скачать: [xml.tar.bz2];
ВнизГоловоломка с IBX-компонентами Найти похожие ветки
← →
Поляков А.Н. (2002-07-19 15:30) [0]Исходная ситуация :
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 16:26) [1]Поясни пункт Д
← →
kaif (2002-07-19 16:27) [2]Проблема имеет простое решение. Режим TIBTransaction по умолчанию не ReadCommitted. Щелкни мышью дважды на каждом компоненте TIBTransaction и выбери изоляцию ReadCommitted nowait. CommitRetaining у тебя работает - просто твои транзакции не видят новые данные.
← →
Поляков А.Н. (2002-07-19 17:52) [3]Щелкни мышью дважды на каждом компоненте 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 такими, какими они были до редактирования.
← →
AlexA (2002-07-19 18:17) [4]> В каждом окне должна быть своя транзакция, на которую
привязываются датасеты окна.
Можно и в отдельной форме, например датамодул"е
>CacheUpdates у датасетов = false
это еще почему?
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2002.08.08;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.005 c