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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 12.05.2009, 17:36   #1  
ortin is offline
ortin
Участник
 
39 / 11 (1) +
Регистрация: 10.09.2007
Адрес: СПб
Modified на ComboBox
Задача. На форме выбирается тип договора (ComboBox). По его значению должен сгенерироваться и отобразиться номер договора. Проблема в том, что метод modified comboBox вызывется 2 раза (после selectionChange и leave). Соответственно, номерная серия расходуется в 2 раза быстрее.
Вопрос. Как сделать?

Ax 3.0.
Старый 12.05.2009, 17:51   #2  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
В active() сбрасываем некоторую логическую переменную (из ClassDeclaration), например, alreadyModified = false. При первом modified() выполняем логику, которая выполняется, если alreadyModified = false, после чего устанавливаем в true. Таким образом, при втором modified() логика уже не выполняется. Как-то так...
Старый 12.05.2009, 17:55   #3  
MironovI is offline
MironovI
Участник
 
724 / 77 (4) ++++
Регистрация: 30.05.2005
Хм.. а просто на selectionChange повеситься нельзя?
За это сообщение автора поблагодарили: sashanka (1).
Старый 12.05.2009, 18:02   #4  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Цитата:
Сообщение от MironovI Посмотреть сообщение
а просто на selectionChange повеситься нельзя?
Да, собственно, так и надо сделать. Тем более, что мой метод уязвим от "злоумышленника", не покидающего запись и производящего несколько изменений.
Ну, в общем всё говорит в пользу твоего selectionChange
Старый 12.05.2009, 19:22   #5  
ZVV is offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1,006 / 246 (11) ++++++
Регистрация: 13.02.2004
Адрес: Минск
->
Ещё хорошо бы проверить в нём, что значение действительно изменилось..
__________________
Zhirenkov Vitaly
Старый 12.05.2009, 23:38   #6  
ortin is offline
ortin
Участник
 
39 / 11 (1) +
Регистрация: 10.09.2007
Адрес: СПб
Про проверку помню На selectionChange вешать завтра на работе буду.
Старый 10.06.2011, 10:34   #7  
Eldar9x is offline
Eldar9x
MCTS
Аватар для Eldar9x
Oracle
MCBMSS
 
1,064 / 166 (8) ++++++
Регистрация: 29.09.2006
Адрес: Казань
Почти такая же проблема возникла. Только у меня метод modifiedField на таблице.
X++:
public void modifiedField(fieldId _fieldId)
{
;

    super(_fieldId);

    switch (_fieldId)
    {
    case fieldnum(DiscountCard_Cards, CardType):
        if (this.RecId && this.CardType != this.orig().CardType)
        {
            if (this.canModifyCardType() && Box::okCancel("Будет удалена ссылка на сотрудника или клиента.", DialogButton::Ok) == DialogButton::Ok)
                this.modifyCardType();
            else
                this.CardType = this.orig().CardType;
        }
        break;
Окно с запросом показывается два раза по точно такой же причине (из SelectionChange и Leave).
Можно тут как-нибудь извернуться?
Старый 10.06.2011, 10:39   #8  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,438 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Проверки лучше всё же делать не в modifiedField, а в validateField
Старый 10.06.2011, 11:05   #9  
Eldar9x is offline
Eldar9x
MCTS
Аватар для Eldar9x
Oracle
MCBMSS
 
1,064 / 166 (8) ++++++
Регистрация: 29.09.2006
Адрес: Казань
В ValidateField точно также два раза вызывается диалог...
X++:
public boolean validateField(fieldId _fieldIdToCheck)
{
    boolean ret;

    ret = super(_fieldIdToCheck);

    switch (_fieldIdToCheck)
    {
    case fieldnum(DiscountCard_Cards, CardType):
        if (this.RecId && this.CardType != this.orig().CardType)
            ret = ret && this.canModifyCardType() && Box::okCancel("Будет удалена ссылка на сотрудника или клиента.", DialogButton::Ok) == DialogButton::Ok;
        break;
    default:
        break;
    }

    return ret;
}
Старый 10.06.2011, 11:11   #10  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
Цитата:
Сообщение от Eldar9x Посмотреть сообщение
Почти такая же проблема возникла. Только у меня метод modifiedField на таблице.
X++:
public void modifiedField(fieldId _fieldId)
{
;

    super(_fieldId);

    switch (_fieldId)
    {
    case fieldnum(DiscountCard_Cards, CardType):
        if (this.RecId && this.CardType != this.orig().CardType)
        {
            if (this.canModifyCardType() && Box::okCancel("Будет удалена ссылка на сотрудника или клиента.", DialogButton::Ok) == DialogButton::Ok)
                this.modifyCardType();
            else
                this.CardType = this.orig().CardType;
        }
        break;
Окно с запросом показывается два раза по точно такой же причине (из SelectionChange и Leave).
Можно тут как-нибудь извернуться?
не знаю на сколько правильно, но я обычно такого рода проверки пишу в методе validateWrite() на таблице.
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем
Старый 10.06.2011, 11:16   #11  
Eldar9x is offline
Eldar9x
MCTS
Аватар для Eldar9x
Oracle
MCBMSS
 
1,064 / 166 (8) ++++++
Регистрация: 29.09.2006
Адрес: Казань
canModifyCardType() это ведь все таки не проверки корректности заполнения поля, а проверка того, что можно вообще его менять. Хотя тут, действительно, в validateField оно логичней будет смотреться.
Старый 10.06.2011, 11:23   #12  
Eldar9x is offline
Eldar9x
MCTS
Аватар для Eldar9x
Oracle
MCBMSS
 
1,064 / 166 (8) ++++++
Регистрация: 29.09.2006
Адрес: Казань
Lev, ValidateWrite тут не катит, потому что по запросу диалога, должны либо очиститься, либо не очиститься именно в момент изменения поля CardType.
Старый 10.06.2011, 11:52   #13  
ice is offline
ice
Участник
Аватар для ice
Лучший по профессии 2014
 
1,732 / 406 (17) +++++++
Регистрация: 23.03.2006
Цитата:
Сообщение от Eldar9x Посмотреть сообщение
Lev, ValidateWrite тут не катит, потому что по запросу диалога, должны либо очиститься, либо не очиститься именно в момент изменения поля CardType.
сомнительное решение, тк изменение поля еще не означает, что запись будет сохранена в таком виде, она может быть вообще не сохранена
Старый 10.06.2011, 13:23   #14  
Eldar9x is offline
Eldar9x
MCTS
Аватар для Eldar9x
Oracle
MCBMSS
 
1,064 / 166 (8) ++++++
Регистрация: 29.09.2006
Адрес: Казань
Вобщем сделал через синглтон, переключающий свое состояние при очередном обращении.
Старый 10.06.2011, 15:02   #15  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,691 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
А ссылка на сотрудника, которая "будет удалена" хранится в той же таблице и в той же записи? Может, заодно проверять тот факт, что она вообще существует?

X++:
if (this.RecId && this.CardType != this.orig().CardType && "Существует ссылка")
Тогда при первом проходе диалог и очистка, а при втором проходе, поскольку ссылка уже очищена, диалога не возникает.
Старый 10.06.2011, 15:16   #16  
Eldar9x is offline
Eldar9x
MCTS
Аватар для Eldar9x
Oracle
MCBMSS
 
1,064 / 166 (8) ++++++
Регистрация: 29.09.2006
Адрес: Казань
Ну это как-то уже на костыль похоже будет. Тем более что проверять придется не одно поле. Тут как получается... Мы знаем, что ModifiedField по полю будет вызываться с формы всегда два раза. Если бы диалога не было, то можно было бы и закрыть глаза на это. Причем в стандарте так и делается. Либо делают this.write() после того как вызов произойдет - тогда orig() уже вернет другое значение и повторный вызов не произойдет. Но мне сохранять запись нельзя. Следовательно, нам остается каким-то образом просто отключить повторный вызов метода. Для этого используем обычный флаг.
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
PatrickChua: Change the combobox options in RunbaseBatch class Blog bot DAX Blogs 0 04.05.2009 14:05
PatrickChua: Change the combobox options in RunbaseBatch class Blog bot DAX Blogs 0 28.10.2006 18:14
Fred Shen: Change the combobox options in RunbaseBatch class Blog bot DAX Blogs 0 28.10.2006 16:40
Транзакция в modified Gad DAX: Программирование 1 29.11.2005 19:54
Странный ComboBox DenNik DAX: Программирование 1 22.09.2005 15:31
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

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

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

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 19:19.