AXForum  
Go Back   AXForum > Microsoft Dynamics AX > DAX: Программирование
DAX
Forgotten Your Password?
Register Forum Rules FAQ Members List Today's Posts Search

 
 
Thread Tools Search this Thread Display Modes
Old 22.08.2013, 18:07   #1  
IKA is offline
IKA
Участник
 
359 / 65 (3) ++++
Join Date: 15.03.2006
Ускорить вычисление дисплей методов
Есть форма с гридом ,
в гриде 3 контрола(Цена1, Цена2, Цена3), привязанных к датасоуру формы и их значения которых получаются из привязанных к датасоурсу (можно перенести на таблицу) дисплей методов Метод1, Метод2, Метод3

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

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

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

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

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

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

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

Last edited by sukhanchik; 22.08.2013 at 19:40.
This post has been rated by: mazzy (2), Pustik (2).
Old 22.08.2013, 19:44   #7  
IKA is offline
IKA
Участник
 
359 / 65 (3) ++++
Join Date: 15.03.2006
метод Active срабатывает только при переходе на новую запись. В моем случае эти три поля на закладке Overview То есть, флажок не будет "сбрасываться", если я правильно понимаю...

Спасибо, сейчас классы гляну, может, там кая-то еще идея
Old 22.08.2013, 19:54   #8  
SRF is offline
SRF
Участник
MCBMSS
Axapta Retail User
 
376 / 562 (19) +++++++
Join Date: 08.08.2007
Blog Entries: 1
А кеширование дисплей методов не рассматривается ?
__________________
Sergey Nefedov
Old 22.08.2013, 19:58   #9  
raz is offline
raz
NavAx
raz's Avatar
NavAx Club
Лучший по профессии 2014
Лучший по профессии 2009
 
1,499 / 1097 (39) ++++++++
Join Date: 22.07.2003
Location: МО
Используйте Map и будет вам счастье.
This post has been rated by: IKA (1).
Old 22.08.2013, 20:04   #10  
IKA is offline
IKA
Участник
 
359 / 65 (3) ++++
Join Date: 15.03.2006
Quote:
Originally Posted by SRF View Post
А кеширование дисплей методов не рассматривается ?
рассматривается,конечно, если поясните, как оно тут поможет. то есть, просто опишите что кэшируем и где
Я поясню: если кэшировать все три метода. то все рассчеты все равно 3 раза для каждой записи будут произведены, а не один, как описано в постановке задачи. Но, может быть, я не поняла вашу мысль ..

Last edited by IKA; 22.08.2013 at 20:06.
Old 22.08.2013, 20:09   #11  
SRF is offline
SRF
Участник
MCBMSS
Axapta Retail User
 
376 / 562 (19) +++++++
Join Date: 08.08.2007
Blog Entries: 1
Ну как правило кеширование методов на форме происходит как уже сказал raz при помощи Map ну или как них нибудь других объектов.

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

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

Last edited by SRF; 22.08.2013 at 20:12.
This post has been rated by: IKA (1).
Old 22.08.2013, 20:16   #12  
IKA is offline
IKA
Участник
 
359 / 65 (3) ++++
Join Date: 15.03.2006
MAP- точно, отличная мысль! Спасибо!
Old 22.08.2013, 20:41   #13  
mazzy is offline
mazzy
Участник
mazzy's Avatar
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Join Date: 29.11.2001
Location: Москва
Blog Entries: 10
Quote:
Originally Posted by IKA View Post
MAP- точно, отличная мысль! Спасибо!
мап хорош только если данные не меняются пока пользователь просматривает форму туда-сюда.
вы это... поосторожнее с кэшированием. формы могут быть открытыми на экране пользователя часами.

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

Last edited by Pustik; 23.08.2013 at 09:06.
This post has been rated by: dech (2).
Old 23.08.2013, 10:07   #19  
Pustik is offline
Pustik
Участник
 
807 / 372 (14) ++++++
Join Date: 04.06.2004
Quote:
Originally Posted by IKA View Post
ээээ, здорово конечо, но по-моему "на авось", если честно.....
Тк, если пользователь завтра решит настроить форму под себя и передвинет первый контрол или вообще скроет, то, сдается мне, будет точно такая же "билибирда"
Используйте метод 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);
...........
__________________
-Ты в гномиков веришь?
-Нет.
-А они в тебя верят, смотри, не подведи их.
Old 23.08.2013, 14:00   #20  
IKA is offline
IKA
Участник
 
359 / 65 (3) ++++
Join Date: 15.03.2006
Ох, товарищи!

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

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

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

Similar Threads
Thread Thread Starter Forum Replies Last Post
Вывод дисплей методов в 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

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Forum Jump

Рейтинг@Mail.ru
All times are GMT +3. The time now is 17:31.
Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Contacts E-mail, Advertising.