08.02.2013, 14:08 | #1 |
Участник
|
Проблема с modified ComboBox'а
Проблема заключается вот в чем:
При работе с формой, необходимо пересчитывать суммы в колонках грида в зависимости от выбранного значения ComboBox. Перекрыла метод modified. Добавила отображение сообщения о том, что суммы пересчитываются.
Кто еще сталкивался с проблемой повторных вызовов modified при работе с ComboBox? Нашла по теме два осбуждения еще 2006 и 2009 года,но ответа на вопрос так и не увидела: modified два раза два раза и Интересные вещи в Аксапте |
|
08.02.2013, 14:52 | #2 |
Участник
|
ComboBox связан с датасурсом? Функция пересчёта сумм обновляет датасурс?
|
|
08.02.2013, 14:57 | #3 |
Участник
|
Да, связан с полем типа Base Enum. Да, датасурс обновляется при вызове функции
|
|
08.02.2013, 15:12 | #4 |
Участник
|
Вызываю функцию в selectionChange, на первый взгляд все правильно работает. Спасибо MironovI
Modified на ComboBox |
|
08.02.2013, 15:14 | #5 |
Участник
|
А modified Вы на датасорсе перекрываете? Предлагаю кешировать значение, если больше ничего не помогает. При повторном вызове проверяйте просто закешированное
__________________
http://www.axdevposts.blogspot.com Пришел, уведел.... отойди, дай другому увидеть! |
|
08.02.2013, 15:27 | #6 |
Участник
|
Функция пересчёта сумм, меняет значения только текущей строки? Для чего происходит принудительное обновление датасурса? Изменение значения ComboBox должно вызвать моментально сохранение данных в БД?
Метод modified предназначен для обработки изменения полей без сохранения строки в БД. За сохранение строки в БД отвечает метод write. Если изменение поля должно тутже инициировать пересохранение строки в БД, то после super в modified явно вызовите метод write(). |
|
08.02.2013, 15:42 | #7 |
Участник
|
Цитата:
Сообщение от S.Kuskov
Функция пересчёта сумм, меняет значения только текущей строки? Для чего происходит принудительное обновление датасурса? Изменение значения ComboBox должно вызвать моментально сохранение данных в БД?
Метод modified предназначен для обработки изменения полей без сохранения строки в БД. За сохранение строки в БД отвечает метод write. Если изменение поля должно тутже инициировать пересохранение строки в БД, то после super в modified явно вызовите метод write(). первая таблица отображает полную информацию по какому-либо процессу, содержит несколько строк на один процесс. вторая - суммирующая таблица содержит по одной записи на каждый процесс, сюда записывается сумма из первой. А также во второй таблице есть строка, где содержится итоговая сумма по всем процессам. При изменении ComboBox'а пересчитывается сумма строки в первой таблице, во второй при этом должна пересчитаться одна строчка по данному процессу и итоговая строка. На первой таблице переопределены методы insert, update, delete они обеспечивают синхронизацию данных между таблицами. Я новичок и может не все понимаю, но без обновления первой таблицы, вторая не будет отображать достоверные данные. |
|
08.02.2013, 15:50 | #8 |
Участник
|
я бы отказался от modified. Вы можете перекрыть write на источнике данных (не update на таблице, так как вы будете показывать диалоговое окно). Сравните значение поля со значением в оригинальном буффере (<table>.orig()). Если значение изменилось и было подтверждено, пересчитайте все в каком нибудь статическом методе на сервере и тогда обновление источников данных не повредит.
Еще один минус использования modified заключается здесь в том, что главная таблица не будет сохранена, а подчиненная будет уже пересчитанна. При падении системы у вас просто потом будут неверные данные.
__________________
http://www.axdevposts.blogspot.com Пришел, уведел.... отойди, дай другому увидеть! |
|
08.02.2013, 16:07 | #9 |
Участник
|
Угу. Только write в таком случае тоже не очень подходит. Для обеспечения целостности данных обновление обеих таблиц необходимо выполнять в одной транзакции. Поэтому сдесь в cамый раз будет табличный метод update. А на методе write датасурса нужно оставить только логику обновления связанных датасурсов и отображения сообщения.
Последний раз редактировалось S.Kuskov; 08.02.2013 в 16:11. |
|
08.02.2013, 16:13 | #10 |
Участник
|
Согласен, я написал
Цитата:
все в каком нибудь статическом методе на сервере и тогда обновление источников данных не повредит.
Если же этот пересчет должен вызываться при любом обновлении, тогда естественно в update.
__________________
http://www.axdevposts.blogspot.com Пришел, уведел.... отойди, дай другому увидеть! |
|
08.02.2013, 17:13 | #11 |
Участник
|
В итоге воспользовалась методом selectionChange.
Так как выполнять или нет пересчет зависит всего от 2 типов переходов между значениями Base Enum, мне кажется это самый простой способ решить проблему. Еще раз спасибо MironovI Modified на ComboBox |
|