Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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
14-24238
Феликс
2002-07-11 19:09
2002.08.08
Объясните (если вам не сложно, конечно!) принцип шифрования.


3-23920
novill
2002-07-16 11:52
2002.08.08
Как динамически добавлять вычислимые поля в DBgrid


1-24047
xyz
2002-07-25 00:29
2002.08.08
слова в RichEdit


1-24052
^SANYA
2002-07-23 20:04
2002.08.08
Как выкинуть программу из списка программ (ctrl+alt+del)?


3-23856
ПИТОН
2002-07-17 08:54
2002.08.08
Остатки





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский