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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 22.09.2011, 12:44   #1  
Pustik is offline
Pustik
Участник
 
807 / 372 (14) ++++++
Регистрация: 04.06.2004
Сюрприз Edit-метода AX2009 RU5
Началось все с того, что при переходе с Axapta 3.0 на AX2009 заметили такую хрень. У нас есть форма, на ней по кнопочке вызывался отчет на несколько листов. Вот тут первый сюрприз: кнопочки прокрутки листов вниз активны, а прокрутки вверх нет.Т.е. опустился вниз отчета и вверх на первую страницу уже не подняться. После долгих и продолжительных поисков причин такого чуда обнаружили, что беда в edit-методе, который был на гриде. Поскольку в этом методе, много всего было написано кем-то до нас, разбираться не стали. Просто удалили его из грида. Буквально недавно, всплыло, что не работает кнопка, в которой просто тупо на методе clicked() висит info('бла-бла-бла'). И опять edit-метод на гриде.
Выяснилось, что в edit-методах пробовали управлять(в зависимости от условий) контролами грида, на котором эти edit-методы и висят.
Попробуйте в форме InventTable на InventTable_ds создать метод
X++:
edit ItemName editItemId(boolean _set,InventTable _data, ItemName _val)
{
    ItemName _ret = _val;

    InventTable_NameAlias.enabled(false);

    return _ret;
}
перенести его на основной грид.На этой же форме создать кнопочку и в clicked() написать
X++:
void clicked()
{
    super();
    info('test');
}
ну и конечно свойство AutoDeclaration контрола InventTable_NameAlias установить в true.
Открываешь форму с записями, жмешь кнопку и ни фига. Закрываешь форму выскакивает инфо. Плюс если открыть, например, форму в наличии, при условии, что она собой закрыла кнопки на форме InventTable, то после ее закрытия кнопки пропадают.Появятся, если дернуть форму InventTable(подправить ширину,высоту).А если формы MDI, то там вообще крыша у формы InventTable едет (например,кнопочка удаление записи после закрытия формы в наличии навсегда становится не активной).
Я, конечно, понимаю, что управлять контролами в edit-методах может и не совсем правильно, но причем тут кнопки, метод clicked() и т.д., если управляли только контролом InventTable_NameAlias?.Кстати кнопочки прокрутки вверх на отчете(о чем я говорил выше) тоже появлялись после закрытия формы..
__________________
-Ты в гномиков веришь?
-Нет.
-А они в тебя верят, смотри, не подведи их.

Последний раз редактировалось Pustik; 22.09.2011 в 13:04.
За это сообщение автора поблагодарили: S.Kuskov (3).
Старый 22.09.2011, 13:47   #2  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от Pustik Посмотреть сообщение
Выяснилось, что в edit-методах пробовали управлять(в зависимости от условий) контролами грида, на котором эти edit-методы и висят.
А условие, при котором происходит управление контролами, содержит проверку на то, что edit-метод вызван для изменения значения, а не для отображения?
X++:
edit ItemName editItemId(boolean _set,InventTable _data, ItemName _val)
{
    ItemName _ret = _val;
    ;

    if (_set)
    {
        InventTable_NameAlias.enabled(false);
    }
    return _ret;
}

Последний раз редактировалось S.Kuskov; 22.09.2011 в 14:08.
Старый 22.09.2011, 14:10   #3  
Pustik is offline
Pustik
Участник
 
807 / 372 (14) ++++++
Регистрация: 04.06.2004
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
А условие, при котором происходит управление контролами, содержит проверку на то, что edit-метод вызван для изменения значения, а не для отображения?
X++:
edit ItemName editItemId(boolean _set,InventTable _data, ItemName _val)
{
    ItemName _ret = _val;
    ;

    if (set)
    {
        InventTable_NameAlias.enabled(false);
    }
    return _ret;
}
Нет там проверялось стороннее поле таблицы. И в зависимости от того заполнено оно или нет, управляли контролом. Что-то типа :
X++:
edit ItemName editItemId(boolean _set,InventTable _data, ItemName _val)
{
    ItemName _ret = _val;

    if (_data.ItemName)
        InventTable_NameAlias.enabled(false);
    else
        InventTable_NameAlias.enabled(true);

    return _ret;
}
Я конечно условно показываю на InventTable для примера. Там была другая своя таблица. И код такой замудреный, логику, вернее смысл которого я так и не понял.. Просто код писали очень давно и не мы.
__________________
-Ты в гномиков веришь?
-Нет.
-А они в тебя верят, смотри, не подведи их.

Последний раз редактировалось Pustik; 22.09.2011 в 14:19.
Старый 22.09.2011, 14:31   #4  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Видимо что-то вроде этого хотели сделать?
Заблокировать menuItemButton если запись не выбрана
Старый 22.09.2011, 20:37   #5  
Pustik is offline
Pustik
Участник
 
807 / 372 (14) ++++++
Регистрация: 04.06.2004
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Видимо что-то вроде этого хотели сделать?
Заблокировать menuItemButton если запись не выбрана
Спасибо за ссылку. S.Kuskov, Вы, как всегда, интересные и полезные темы выкладываете. Как Вы их в голове держите?, не понятно.
Если вернутся к проблеме, то я хотел услышать мнение опытных людей именно по этому вопросу? Это баг или что? Я в этом методе затронул только определенный контрол и у меня повалились баги:
1) в отчете (пролистать вверх отчет нельзя) - обалдеть, причем тут контрол на гриде и кнопочки прокрутки вверх?
2)работа обычной кнопки с перекрытым методом clicked().
3)если у вас 2 грида, и между ними splitter (как в SalesTable) периодически кнопки будут исчезать, пока не дернешь форму.
А если форма MDI, то вообще полна горница сюрпризов.
Еще раз скажу,что хочу разобраться, потому что такое может быть во многих формах, где побывали предыдущие программисты, и может быть от этого зависит какой нибудь алгоритм, к которому привыкли пользователи.

P.S. Ну, а что скажет купечество? "12 стульев"
__________________
-Ты в гномиков веришь?
-Нет.
-А они в тебя верят, смотри, не подведи их.
Старый 22.09.2011, 20:48   #6  
Wamr is offline
Wamr
----------------
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
1,737 / 858 (32) +++++++
Регистрация: 15.01.2002
Адрес: Москва
Записей в блоге: 7
а стандартные "танцы с бубном" (реиндексация приложения, глобальная компиляция) не помогают?
Старый 22.09.2011, 20:52   #7  
Pustik is offline
Pustik
Участник
 
807 / 372 (14) ++++++
Регистрация: 04.06.2004
Цитата:
Сообщение от Wamr Посмотреть сообщение
а стандартные "танцы с бубном" (реиндексация приложения, глобальная компиляция) не помогают?
Все компилируется на Ура.
Есть еще такое подозрение, что edit-метод работает так же как display, и из за этого беда, потому что при открытии формы грид моргает.
__________________
-Ты в гномиков веришь?
-Нет.
-А они в тебя верят, смотри, не подведи их.
Старый 22.09.2011, 21:09   #8  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5798 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Цитата:
Сообщение от Pustik Посмотреть сообщение
в зависимости от того заполнено оно или нет, управляли контролом. Что-то типа :
X++:
edit ItemName editItemId(boolean _set,InventTable _data, ItemName _val)
{
    ItemName _ret = _val;

    if (_data.ItemName)
        InventTable_NameAlias.enabled(false);
    else
        InventTable_NameAlias.enabled(true);

    return _ret;
}
Я конечно условно показываю на InventTable для примера. Там была другая своя таблица. И код такой замудреный, логику, вернее смысл которого я так и не понял.
Руки обрывать за такие вещи edit-display-методы дергаются на формах подчас до 6-8 раз в секунду (это легко проверяется), причем при любой перерисовке формы. Изменение доступности контрола тоже ведет к частичной перерисовке, отчего снова могут дергаться display-edit-методы. Представляю, как весело должна работать форма, где хрендцать записей на гриде и несско десятков, а то и за сотню раз в секунду (!!) отрабатывает логика изменения доступности какого-нить контрола...
Цитата:
Сообщение от Pustik Посмотреть сообщение
Буквально недавно, всплыло, что не работает кнопка, в которой просто тупо на методе clicked() висит info('бла-бла-бла'). И опять edit-метод на гриде. Открываешь форму с записями, жмешь кнопку и ни фига. Закрываешь форму выскакивает инфо.
Инфолог отрисовывает окно с сообщениями, как только клиент начинает "простаивать". В свете вышеизложенного из-за постоянного мельтешения display-методов клиент может "шуршать" все время, пока открыта форма, и переходить в режим простоя лишь после ее закрытия.
Цитата:
Сообщение от Pustik Посмотреть сообщение
Кстати кнопочки прокрутки вверх на отчете(о чем я говорил выше) тоже появлялись после закрытия формы..
Возможно, ядро "позволяет" прокручивать отчет вверх тоже лишь во время простоя.

PS. Заметьте, что управление доступностью bound-контрола либо табличного поля влияет на все записи в гриде (хотя в каждый момент активна лишь одна), в то время как display-edit-методы на гриде работают с каждой записью по отдельности. Допустим, в записях на гриде через одну то заполнено ItemName, то пусто. Тогда при отрисовке поля для первой записи приведенный edit-метод отключит доступность NameAlias (для всех записей на гриде), для второй - снова включит (для всех), для третей - опять выключит и т.д. И так форма будет дергаться, будто в конвульсиях, пока ее не закроешь (эффект может проявляться в большей или в меньшей степени в зависимости от производительности клиентской машины).

Последний раз редактировалось gl00mie; 22.09.2011 в 21:18. Причина: PS
За это сообщение автора поблагодарили: Pustik (3), lev (3).
Старый 22.09.2011, 21:35   #9  
Pustik is offline
Pustik
Участник
 
807 / 372 (14) ++++++
Регистрация: 04.06.2004
Цитата:
Сообщение от gl00mie Посмотреть сообщение
Тогда при отрисовке поля для первой записи приведенный edit-метод отключит доступность NameAlias (для всех записей на гриде), для второй - снова включит (для всех), для третей - опять выключит и т.д. И так форма будет дергаться, будто в конвульсиях, пока ее не закроешь (эффект может проявляться в большей или в меньшей степени в зависимости от производительности клиентской машины).
Именно так и происходит, потому что грид мелькает. Очень понятно и быстро объяснили, класс, спасибо!!!!
__________________
-Ты в гномиков веришь?
-Нет.
-А они в тебя верят, смотри, не подведи их.
Старый 22.09.2011, 21:21   #10  
Pustik is offline
Pustik
Участник
 
807 / 372 (14) ++++++
Регистрация: 04.06.2004
gl00mie, класс, спасибо за информацию.
__________________
-Ты в гномиков веришь?
-Нет.
-А они в тебя верят, смотри, не подведи их.
Старый 22.09.2011, 21:26   #11  
Pustik is offline
Pustik
Участник
 
807 / 372 (14) ++++++
Регистрация: 04.06.2004
Осталось выяснить по поводу исчезновения кнопок?
__________________
-Ты в гномиков веришь?
-Нет.
-А они в тебя верят, смотри, не подведи их.
Старый 22.09.2011, 21:34   #12  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5798 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Может, просто глюки перерисовки? IntelliMorph захлебывается в попытках пересчитать/перерисовать дизайн формы несско десятков/сотен раз в секунду? Я бы в любом случае убрал такой код из display-edit-методов - если и тогда кнопки будут пропадать, то уже можно более детально разбираться, а пока получается как в анектоде: "...а вы так не делайте"
Что касается приведенной ссылки, где рекомендовали управлять доступностью кнопок в display-методе (мол, работает независимо от того, выбралась запись или нет), хочу заметить, что решается все, по-моему, проще: делается метод, управляющий доступностью всех связанных с записью кнопок, и этот метод дергается из active() - безусловно и из executeQuery() после super() - по условию, что курсор, связанный с DS, пуст (в этом случае active не отработает). И никакого мельтешения display-методов...
Старый 22.09.2011, 21:38   #13  
Pustik is offline
Pustik
Участник
 
807 / 372 (14) ++++++
Регистрация: 04.06.2004
Цитата:
Сообщение от gl00mie Посмотреть сообщение
Я бы в любом случае убрал такой код из display-edit-методов
Убрали однозначно, просто не знали в чем причина. Думал не много по другому.
__________________
-Ты в гномиков веришь?
-Нет.
-А они в тебя верят, смотри, не подведи их.
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Не корректная сортировка в Map-e и Set-е. AX2009 RU5 Pustik DAX: Программирование 12 03.05.2016 21:28
Ax2009 RU5: класс CustVendAutoSettlement_Cust_RU, метод description() Damn DAX: Программирование 4 18.12.2010 15:42
назначение edit метода полю Grid в runTime kornix DAX: Программирование 10 26.10.2010 14:46
Ax2009 RU5: класс SysOperationProgressServer Damn DAX: Программирование 2 29.09.2010 22:18
Ax2009 RU5: Не заполняется CreatedDateTime в SysDatabaseLog Damn DAX: Администрирование 2 07.09.2010 15:29

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

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

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