|  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 ! | 
|  | 
|  | 
| 
 |