AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 08.02.2013, 14:08   #1  
sashanka is offline
sashanka
Участник
 
28 / 10 (1) +
Регистрация: 07.02.2013
Проблема с modified ComboBox'а
Проблема заключается вот в чем:
При работе с формой, необходимо пересчитывать суммы в колонках грида в зависимости от выбранного значения ComboBox. Перекрыла метод modified. Добавила отображение сообщения о том, что суммы пересчитываются.
  1. Если вызывать функцию пересчета после вызова super, то пересчет выполняется два раза, два раза выводится сообщение
  2. Если вызывать функцию пересчета до вызова super и перекрывать значения ret = false, то форма начинает глючить и сообщение выводится постоянно при любом действии. Спасет только выход через Esc.

Кто еще сталкивался с проблемой повторных вызовов modified при работе с ComboBox?

Нашла по теме два осбуждения еще 2006 и 2009 года,но ответа на вопрос так и не увидела:
modified два раза два раза и Интересные вещи в Аксапте
Старый 08.02.2013, 14:52   #2  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,429 / 1772 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
ComboBox связан с датасурсом? Функция пересчёта сумм обновляет датасурс?
Старый 08.02.2013, 14:57   #3  
sashanka is offline
sashanka
Участник
 
28 / 10 (1) +
Регистрация: 07.02.2013
Да, связан с полем типа Base Enum. Да, датасурс обновляется при вызове функции
Старый 08.02.2013, 15:12   #4  
sashanka is offline
sashanka
Участник
 
28 / 10 (1) +
Регистрация: 07.02.2013
Вызываю функцию в selectionChange, на первый взгляд все правильно работает. Спасибо MironovI

Modified на ComboBox
Старый 08.02.2013, 15:14   #5  
plumbum is offline
plumbum
Участник
Соотечественники
 
182 / 86 (3) ++++
Регистрация: 07.12.2007
Адрес: Vienna, AT
А modified Вы на датасорсе перекрываете? Предлагаю кешировать значение, если больше ничего не помогает. При повторном вызове проверяйте просто закешированное
__________________
http://www.axdevposts.blogspot.com
Пришел, уведел.... отойди, дай другому увидеть!
Старый 08.02.2013, 15:27   #6  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,429 / 1772 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от sashanka Посмотреть сообщение
Да, датасурс обновляется при вызове функции
Функция пересчёта сумм, меняет значения только текущей строки? Для чего происходит принудительное обновление датасурса? Изменение значения ComboBox должно вызвать моментально сохранение данных в БД?

Метод modified предназначен для обработки изменения полей без сохранения строки в БД. За сохранение строки в БД отвечает метод write. Если изменение поля должно тутже инициировать пересохранение строки в БД, то после super в modified явно вызовите метод write().
Старый 08.02.2013, 15:42   #7  
sashanka is offline
sashanka
Участник
 
28 / 10 (1) +
Регистрация: 07.02.2013
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Функция пересчёта сумм, меняет значения только текущей строки? Для чего происходит принудительное обновление датасурса? Изменение значения ComboBox должно вызвать моментально сохранение данных в БД?

Метод modified предназначен для обработки изменения полей без сохранения строки в БД. За сохранение строки в БД отвечает метод write. Если изменение поля должно тутже инициировать пересохранение строки в БД, то после super в modified явно вызовите метод write().
На форме используется 2 датасорса:
первая таблица отображает полную информацию по какому-либо процессу, содержит несколько строк на один процесс.
вторая - суммирующая таблица содержит по одной записи на каждый процесс, сюда записывается сумма из первой. А также во второй таблице есть строка, где содержится итоговая сумма по всем процессам.

При изменении ComboBox'а пересчитывается сумма строки в первой таблице, во второй при этом должна пересчитаться одна строчка по данному процессу и итоговая строка.

На первой таблице переопределены методы insert, update, delete они обеспечивают синхронизацию данных между таблицами.
Я новичок и может не все понимаю, но без обновления первой таблицы, вторая не будет отображать достоверные данные.
Старый 08.02.2013, 15:50   #8  
plumbum is offline
plumbum
Участник
Соотечественники
 
182 / 86 (3) ++++
Регистрация: 07.12.2007
Адрес: Vienna, AT
я бы отказался от modified. Вы можете перекрыть write на источнике данных (не update на таблице, так как вы будете показывать диалоговое окно). Сравните значение поля со значением в оригинальном буффере (<table>.orig()). Если значение изменилось и было подтверждено, пересчитайте все в каком нибудь статическом методе на сервере и тогда обновление источников данных не повредит.

Еще один минус использования modified заключается здесь в том, что главная таблица не будет сохранена, а подчиненная будет уже пересчитанна. При падении системы у вас просто потом будут неверные данные.
__________________
http://www.axdevposts.blogspot.com
Пришел, уведел.... отойди, дай другому увидеть!
Старый 08.02.2013, 16:07   #9  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,429 / 1772 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от plumbum Посмотреть сообщение
Еще один минус использования modified заключается здесь в том, что главная таблица не будет сохранена, а подчиненная будет уже пересчитанна. При падении системы у вас просто потом будут неверные данные.
Угу. Только write в таком случае тоже не очень подходит. Для обеспечения целостности данных обновление обеих таблиц необходимо выполнять в одной транзакции. Поэтому сдесь в cамый раз будет табличный метод update. А на методе write датасурса нужно оставить только логику обновления связанных датасурсов и отображения сообщения.

Последний раз редактировалось S.Kuskov; 08.02.2013 в 16:11.
Старый 08.02.2013, 16:13   #10  
plumbum is offline
plumbum
Участник
Соотечественники
 
182 / 86 (3) ++++
Регистрация: 07.12.2007
Адрес: Vienna, AT
Согласен, я написал
Цитата:
все в каком нибудь статическом методе на сервере и тогда обновление источников данных не повредит.
рассчитывая, что пересчет должен осуществляться только при вызове из формы.

Если же этот пересчет должен вызываться при любом обновлении, тогда естественно в update.
__________________
http://www.axdevposts.blogspot.com
Пришел, уведел.... отойди, дай другому увидеть!
Старый 08.02.2013, 17:13   #11  
sashanka is offline
sashanka
Участник
 
28 / 10 (1) +
Регистрация: 07.02.2013
В итоге воспользовалась методом selectionChange.
Так как выполнять или нет пересчет зависит всего от 2 типов переходов между значениями Base Enum, мне кажется это самый простой способ решить проблему.

Еще раз спасибо MironovI Modified на ComboBox
Теги
combobox, modified

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
sjakalax: The model store has been modified Blog bot DAX Blogs 0 23.01.2012 16:11
Modified на ComboBox ortin DAX: Программирование 15 10.06.2011 15:16
PatrickChua: Change the combobox options in RunbaseBatch class Blog bot DAX Blogs 0 04.05.2009 14:05
modified два раза два раза MironovI DAX: Программирование 5 14.07.2006 16:29
Странный ComboBox DenNik DAX: Программирование 1 22.09.2005 15:31

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 18:08.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.