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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 22.08.2013, 18:07   #1  
IKA is offline
IKA
Участник
 
359 / 65 (3) ++++
Регистрация: 15.03.2006
Ускорить вычисление дисплей методов
Есть форма с гридом ,
в гриде 3 контрола(Цена1, Цена2, Цена3), привязанных к датасоуру формы и их значения которых получаются из привязанных к датасоурсу (можно перенести на таблицу) дисплей методов Метод1, Метод2, Метод3

Проблема в том. что все три цены можно получить за одно обращение в методу МетодОбщий, который возвращает контейнер [Цена1, Цена2, Цена3]
МетодОбщий достаточно накладный. Это не оч заметно, когда он 1 раз выполняется, но тк в данной ситуации он невольно вызывается три раза вместо одного, то эффект заметней.
То есть хотелось бы, чтобы для каждой строки грида был вызов
[Цена1, Цена2, Цена3] = МетодОбщий()
а потом уже каждый дисплей метод возращал просто переменную с ценой.

Можно ли так сделать и если да, то где нужно прописать вызов МетодОбщий?

Последний раз редактировалось IKA; 22.08.2013 в 18:46.
Старый 22.08.2013, 18:36   #2  
Pustik is offline
Pustik
Участник
 
807 / 372 (14) ++++++
Регистрация: 04.06.2004
В форме объявите переменные Price1,Price2 и Price3. Присваивайте им значение в методе Метод1, а в методах Метод2 и Метод3 используйте значения переменных Price2 и Price3
__________________
-Ты в гномиков веришь?
-Нет.
-А они в тебя верят, смотри, не подведи их.
Старый 22.08.2013, 18:47   #3  
IKA is offline
IKA
Участник
 
359 / 65 (3) ++++
Регистрация: 15.03.2006
где гарантия, что метод1 вызовется первым?
Старый 22.08.2013, 19:01   #4  
Pustik is offline
Pustik
Участник
 
807 / 372 (14) ++++++
Регистрация: 04.06.2004
Цитата:
Сообщение от IKA Посмотреть сообщение
где гарантия, что метод1 вызовется первым?
в гриде контрол Цена1 должен быть первым по отношению к Цена2 и Цена3, в противном случае будет "билибирда"
__________________
-Ты в гномиков веришь?
-Нет.
-А они в тебя верят, смотри, не подведи их.

Последний раз редактировалось Pustik; 22.08.2013 в 19:08.
Старый 22.08.2013, 19:21   #5  
IKA is offline
IKA
Участник
 
359 / 65 (3) ++++
Регистрация: 15.03.2006
ээээ, здорово конечо, но по-моему "на авось", если честно.....
Тк, если пользователь завтра решит настроить форму под себя и передвинет первый контрол или вообще скроет, то, сдается мне, будет точно такая же "билибирда"
Старый 22.08.2013, 19:35   #6  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,323 / 3547 (125) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
Для примера см классы InventOnHand, PriceDisc и т.д.
Суть: Инициализируется класс, у которого имеется несколько (в Вашем случае 3) методов, возвращающих переменные Цена1, Цена2 и Цена3. Дополнительно в классе объявляется переменная-флажок isCalculated. При расчете, который выполняется в методе МетодОбщий рассчитываются переменные Цена1, Цена2, Цена3, а также взводится флажок isCalculated. В методах, которые возвращают соответствующие переменные производится проверка - а не взведен ли флажок? Если флажок не взведен - то вызывается МетодОбщий. Если флажок взведен - то ничего не вызывается - просто возвращается соответствующая переменная.

Т.о. без разницы - какой метод будет вызван раньше - Цена1 или Цена3 - первый же вызов вызовет МетодОбщий и рассчитает все переменные. При этом повторного вызова МетодОбщий не произойдет.

Само собой, при использовании такого подхода в гриде нужно будет позаботиться, чтобы флажок isCalculated сбрасывался в методе active(), чтобы расчет делался для каждой записи.

Ну и конечно дисплей-методы должны ссылаться на методы этого класса (Цена1, Цена2, Цена3).
__________________
Возможно сделать все. Вопрос времени

Последний раз редактировалось sukhanchik; 22.08.2013 в 19:40.
За это сообщение автора поблагодарили: mazzy (2), Pustik (2).
Старый 22.08.2013, 19:44   #7  
IKA is offline
IKA
Участник
 
359 / 65 (3) ++++
Регистрация: 15.03.2006
метод Active срабатывает только при переходе на новую запись. В моем случае эти три поля на закладке Overview То есть, флажок не будет "сбрасываться", если я правильно понимаю...

Спасибо, сейчас классы гляну, может, там кая-то еще идея
Старый 22.08.2013, 19:54   #8  
SRF is offline
SRF
Участник
MCBMSS
Axapta Retail User
 
375 / 562 (19) +++++++
Регистрация: 08.08.2007
Записей в блоге: 1
А кеширование дисплей методов не рассматривается ?
__________________
Sergey Nefedov
Старый 22.08.2013, 19:58   #9  
raz is offline
raz
NavAx
Аватар для raz
NavAx Club
Лучший по профессии 2014
Лучший по профессии 2009
 
1,494 / 1065 (38) ++++++++
Регистрация: 22.07.2003
Адрес: МО
Используйте Map и будет вам счастье.
За это сообщение автора поблагодарили: IKA (1).
Старый 22.08.2013, 20:04   #10  
IKA is offline
IKA
Участник
 
359 / 65 (3) ++++
Регистрация: 15.03.2006
Цитата:
Сообщение от SRF Посмотреть сообщение
А кеширование дисплей методов не рассматривается ?
рассматривается,конечно, если поясните, как оно тут поможет. то есть, просто опишите что кэшируем и где
Я поясню: если кэшировать все три метода. то все рассчеты все равно 3 раза для каждой записи будут произведены, а не один, как описано в постановке задачи. Но, может быть, я не поняла вашу мысль ..

Последний раз редактировалось IKA; 22.08.2013 в 20:06.
Старый 22.08.2013, 20:09   #11  
SRF is offline
SRF
Участник
MCBMSS
Axapta Retail User
 
375 / 562 (19) +++++++
Регистрация: 08.08.2007
Записей в блоге: 1
Ну как правило кеширование методов на форме происходит как уже сказал raz при помощи Map ну или как них нибудь других объектов.

Суть что делаем : делаем общий метод на форме например, в качестве параметра курсор, мап - скажем ключ recid, ну а значение в вашем случае контейнер из трех полей. Метод работает по принципу - есть в мапе данные берем из него, нет вызываем методОбщий, записываем в мап и эти же данные берем в качестве расчета.

Дальше в каждом методе priceX - вызываем данный метод, в результате будет возвращаться контейнер, ну и в методе уже определяете нужный элемент контейнера. Соответственно расчет будет выполнен один раз, каким нибудь из методов, остальные данные уже возьмутся из мапа.
__________________
Sergey Nefedov

Последний раз редактировалось SRF; 22.08.2013 в 20:12.
За это сообщение автора поблагодарили: IKA (1).
Старый 22.08.2013, 20:16   #12  
IKA is offline
IKA
Участник
 
359 / 65 (3) ++++
Регистрация: 15.03.2006
MAP- точно, отличная мысль! Спасибо!
Старый 22.08.2013, 20:41   #13  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от IKA Посмотреть сообщение
MAP- точно, отличная мысль! Спасибо!
мап хорош только если данные не меняются пока пользователь просматривает форму туда-сюда.
вы это... поосторожнее с кэшированием. формы могут быть открытыми на экране пользователя часами.

вычислять один раз вместо трех на каждый показ записи - вполне разумно.
вычислять один раз вместо всех показов записи - уже как-то безрассудно.
За это сообщение автора поблагодарили: Pustik (2).
Старый 22.08.2013, 21:24   #14  
IKA is offline
IKA
Участник
 
359 / 65 (3) ++++
Регистрация: 15.03.2006
2 Mazzy, а вы что предлагаете-то?
Старый 22.08.2013, 21:26   #15  
IKA is offline
IKA
Участник
 
359 / 65 (3) ++++
Регистрация: 15.03.2006
2SRF Да, извините, если вы не про cacheAddMethod, а про Map, то, конечно.
Я по умолчанию под кэшированием, встроенные механизмы подразумеваю.
Спасибо
Старый 22.08.2013, 22:19   #16  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от IKA Посмотреть сообщение
2 Mazzy, а вы что предлагаете-то?
а уже предложено sukhanchik'ом:
Цитата:
Сообщение от sukhanchik Посмотреть сообщение
Для примера см классы InventOnHand, PriceDisc и т.д.
Суть: Инициализируется класс, у которого имеется несколько (в Вашем случае 3) методов, возвращающих переменные Цена1, Цена2 и Цена3. Дополнительно в классе объявляется переменная-флажок isCalculated. При расчете, который выполняется в методе МетодОбщий рассчитываются переменные Цена1, Цена2, Цена3, а также взводится флажок isCalculated. В методах, которые возвращают соответствующие переменные производится проверка - а не взведен ли флажок? Если флажок не взведен - то вызывается МетодОбщий. Если флажок взведен - то ничего не вызывается - просто возвращается соответствующая переменная.
Старый 23.08.2013, 07:25   #17  
dech is offline
dech
Участник
Аватар для dech
Самостоятельные клиенты AX
 
647 / 350 (13) ++++++
Регистрация: 25.06.2009
Адрес: Омск
Записей в блоге: 3
Вы можете общий метод запихнуть в active() вашего ds, и использовать его результаты (которые будут находиться в classDeclaration) вашими тремя другими методами. Единственное, что эти 3 дисплейных метода будут находиться на форме и их нельзя закэшировать. И не надо никаких флажков.
__________________
// no comments
За это сообщение автора поблагодарили: Pustik (2).
Старый 23.08.2013, 09:03   #18  
Pustik is offline
Pustik
Участник
 
807 / 372 (14) ++++++
Регистрация: 04.06.2004
Цитата:
Сообщение от dech Посмотреть сообщение
Вы можете общий метод запихнуть в active() вашего ds, и использовать его результаты (которые будут находиться в classDeclaration) вашими тремя другими методами. Единственное, что эти 3 дисплейных метода будут находиться на форме и их нельзя закэшировать. И не надо никаких флажков.
Неплохо, только результаты метода будут видно только на текущей строке, а не на всем гриде. Чтобы увидеть их на соседней строке, нужно будет на нее встать. Не очень камильфо
__________________
-Ты в гномиков веришь?
-Нет.
-А они в тебя верят, смотри, не подведи их.

Последний раз редактировалось Pustik; 23.08.2013 в 09:06.
За это сообщение автора поблагодарили: dech (2).
Старый 23.08.2013, 10:07   #19  
Pustik is offline
Pustik
Участник
 
807 / 372 (14) ++++++
Регистрация: 04.06.2004
Цитата:
Сообщение от IKA Посмотреть сообщение
ээээ, здорово конечо, но по-моему "на авось", если честно.....
Тк, если пользователь завтра решит настроить форму под себя и передвинет первый контрол или вообще скроет, то, сдается мне, будет точно такая же "билибирда"
Используйте метод displayOption датасорса
X++:
public void displayOption(Common _record, FormRowDisplayOption _options)
{
     ;
    conPrice = ['Цена1','Цена2','Цена3'];
    Price1 = conpeek(conPrice,1);
    Price2 = conpeek(conPrice,2);
    Price3 = conpeek(conPrice,3);
    
    Map1.insert(_record.RecId,Price1);
    Map2.insert(_record.RecId,Price2);
    Map3.insert(_record.RecId,Price3);
    
    super(_record, _options);
}
а в дисплей методах тогда :
X++:
return (Map1.exists(_Table.RecId) ? Map1.lookup(_Table.RecId) : 0);
...........
__________________
-Ты в гномиков веришь?
-Нет.
-А они в тебя верят, смотри, не подведи их.
Старый 23.08.2013, 14:00   #20  
IKA is offline
IKA
Участник
 
359 / 65 (3) ++++
Регистрация: 15.03.2006
Ох, товарищи!

2dech & 2Mazzy.
Там же буквально строкой выше же написано, почему active не подходит для решения задачи
Если вы не согласны. то поясните, как вы считаете можно обойти это ограничение.

2pustik:
Не мое конечно дело, но немного удивительно, что вы "поблагодарили" dech и строкой ниже раскритиковали его подход. За что благодарность-то тогда оставили?

Вопрос закрыт, спасибо raz & srf !
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Вывод дисплей методов в lookup форме user_ax DAX: Программирование 14 24.07.2013 13:43
Переопределение стандартных методов у динамически создаваемых контролов - вопрос с предисторией (многабукаф) TasmanianDevil DAX: Программирование 13 02.08.2012 07:39
Win2008 и вызов методов COM-объектов AndyD DAX: Программирование 13 06.02.2012 15:22
Некорректное поведение дисплей методов в EP Ax 4 zelibobis DAX: Программирование 3 31.03.2009 14:21
Дисплей метод таблицы который вызывается из ГРИДА 3oppo DAX: Программирование 10 23.05.2006 06:47
Опции темы Поиск в этой теме
Поиск в этой теме:

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

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

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

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