22.08.2013, 18:07 | #1 |
Участник
|
Ускорить вычисление дисплей методов
Есть форма с гридом ,
в гриде 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 |
Участник
|
В форме объявите переменные Price1,Price2 и Price3. Присваивайте им значение в методе Метод1, а в методах Метод2 и Метод3 используйте значения переменных Price2 и Price3
__________________
-Ты в гномиков веришь? -Нет. -А они в тебя верят, смотри, не подведи их. |
|
22.08.2013, 18:47 | #3 |
Участник
|
где гарантия, что метод1 вызовется первым?
|
|
22.08.2013, 19:01 | #4 |
Участник
|
в гриде контрол Цена1 должен быть первым по отношению к Цена2 и Цена3, в противном случае будет "билибирда"
__________________
-Ты в гномиков веришь? -Нет. -А они в тебя верят, смотри, не подведи их. Последний раз редактировалось Pustik; 22.08.2013 в 19:08. |
|
22.08.2013, 19:21 | #5 |
Участник
|
ээээ, здорово конечо, но по-моему "на авось", если честно.....
Тк, если пользователь завтра решит настроить форму под себя и передвинет первый контрол или вообще скроет, то, сдается мне, будет точно такая же "билибирда" |
|
22.08.2013, 19:35 | #6 |
Administrator
|
Для примера см классы 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 |
Участник
|
метод Active срабатывает только при переходе на новую запись. В моем случае эти три поля на закладке Overview То есть, флажок не будет "сбрасываться", если я правильно понимаю...
Спасибо, сейчас классы гляну, может, там кая-то еще идея |
|
22.08.2013, 19:54 | #8 |
Участник
|
А кеширование дисплей методов не рассматривается ?
__________________
Sergey Nefedov |
|
22.08.2013, 19:58 | #9 |
NavAx
|
Используйте Map и будет вам счастье.
|
|
|
За это сообщение автора поблагодарили: IKA (1). |
22.08.2013, 20:04 | #10 |
Участник
|
рассматривается,конечно, если поясните, как оно тут поможет. то есть, просто опишите что кэшируем и где
Я поясню: если кэшировать все три метода. то все рассчеты все равно 3 раза для каждой записи будут произведены, а не один, как описано в постановке задачи. Но, может быть, я не поняла вашу мысль .. Последний раз редактировалось IKA; 22.08.2013 в 20:06. |
|
22.08.2013, 20:09 | #11 |
Участник
|
Ну как правило кеширование методов на форме происходит как уже сказал raz при помощи Map ну или как них нибудь других объектов.
Суть что делаем : делаем общий метод на форме например, в качестве параметра курсор, мап - скажем ключ recid, ну а значение в вашем случае контейнер из трех полей. Метод работает по принципу - есть в мапе данные берем из него, нет вызываем методОбщий, записываем в мап и эти же данные берем в качестве расчета. Дальше в каждом методе priceX - вызываем данный метод, в результате будет возвращаться контейнер, ну и в методе уже определяете нужный элемент контейнера. Соответственно расчет будет выполнен один раз, каким нибудь из методов, остальные данные уже возьмутся из мапа.
__________________
Sergey Nefedov Последний раз редактировалось SRF; 22.08.2013 в 20:12. |
|
|
За это сообщение автора поблагодарили: IKA (1). |
22.08.2013, 20:16 | #12 |
Участник
|
MAP- точно, отличная мысль! Спасибо!
|
|
22.08.2013, 20:41 | #13 |
Участник
|
мап хорош только если данные не меняются пока пользователь просматривает форму туда-сюда.
вы это... поосторожнее с кэшированием. формы могут быть открытыми на экране пользователя часами. вычислять один раз вместо трех на каждый показ записи - вполне разумно. вычислять один раз вместо всех показов записи - уже как-то безрассудно. |
|
|
За это сообщение автора поблагодарили: Pustik (2). |
22.08.2013, 21:24 | #14 |
Участник
|
2 Mazzy, а вы что предлагаете-то?
|
|
22.08.2013, 21:26 | #15 |
Участник
|
2SRF Да, извините, если вы не про cacheAddMethod, а про Map, то, конечно.
Я по умолчанию под кэшированием, встроенные механизмы подразумеваю. Спасибо |
|
22.08.2013, 22:19 | #16 |
Участник
|
а уже предложено sukhanchik'ом:
Цитата:
Сообщение от sukhanchik
Для примера см классы InventOnHand, PriceDisc и т.д.
Суть: Инициализируется класс, у которого имеется несколько (в Вашем случае 3) методов, возвращающих переменные Цена1, Цена2 и Цена3. Дополнительно в классе объявляется переменная-флажок isCalculated. При расчете, который выполняется в методе МетодОбщий рассчитываются переменные Цена1, Цена2, Цена3, а также взводится флажок isCalculated. В методах, которые возвращают соответствующие переменные производится проверка - а не взведен ли флажок? Если флажок не взведен - то вызывается МетодОбщий. Если флажок взведен - то ничего не вызывается - просто возвращается соответствующая переменная. |
|
23.08.2013, 07:25 | #17 |
Участник
|
Вы можете общий метод запихнуть в active() вашего ds, и использовать его результаты (которые будут находиться в classDeclaration) вашими тремя другими методами. Единственное, что эти 3 дисплейных метода будут находиться на форме и их нельзя закэшировать. И не надо никаких флажков.
__________________
// no comments |
|
|
За это сообщение автора поблагодарили: Pustik (2). |
23.08.2013, 09:03 | #18 |
Участник
|
Цитата:
__________________
-Ты в гномиков веришь? -Нет. -А они в тебя верят, смотри, не подведи их. Последний раз редактировалось Pustik; 23.08.2013 в 09:06. |
|
|
За это сообщение автора поблагодарили: dech (2). |
23.08.2013, 10:07 | #19 |
Участник
|
Цитата:
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 |
Участник
|
Ох, товарищи!
2dech & 2Mazzy. Там же буквально строкой выше же написано, почему active не подходит для решения задачи Если вы не согласны. то поясните, как вы считаете можно обойти это ограничение. 2pustik: Не мое конечно дело, но немного удивительно, что вы "поблагодарили" dech и строкой ниже раскритиковали его подход. За что благодарность-то тогда оставили? Вопрос закрыт, спасибо raz & srf ! |
|
|
|