Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.08.08;
Скачать: CL | DM;

Вниз

Головоломка с 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;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.013 c
3-23955
dzmitry
2002-07-02 10:23
2002.08.08
Btrieve for Linux


6-24151
KPOT
2002-05-28 13:59
2002.08.08
Mozhet kto-to znajet kak kodirovat peredavaemyje dannye?


6-24138
inf
2002-05-25 17:12
2002.08.08
net send через дельфи


1-23985
cherepovets
2002-07-27 13:59
2002.08.08
Панель задач


1-24118
vinger
2002-07-26 20:25
2002.08.08
serial