15.09.2005, 22:16 | #1 |
Участник
|
Еще раз о Display-методах
Всем доброго времени суток.
Ситуация у меня обыденная: - есть таблица, на которую навешан дисплей метод - есть форма, в которой вышеуказанная таблица установлена в качестве источника данных - на форме присутствует грид. Одно из полей грида отображает значение, возвращаемое дисплей методом - display-метод генерит довольно много запросов, поэтому он закеширован в init() датасорса Дело в том, что в display-методе мне необходимо генерить запрос в зависимости от значений некоторых параметров формы. Возникает вопрос - как передать эти параметры дисплей-методу? Вроде бы один из выходов - создавать дисплей-метод не на таблице, а на датасорсе формы, но этот вариант мне не подходит, так как метод перестает кешироваться. Подскажите, пожалуйста, как можно выкрутиться, или скажите чего я делаю неправильно.
__________________
Спокойствие, только спокойствие! (Астрид Линдгрен) |
|
|
За это сообщение автора поблагодарили: Dodger (1). |
16.09.2005, 08:17 | #2 |
Участник
|
Можно воспользоваться механизмом infolog.globalCache()
__________________
Axapta v.3.0 sp5 kr2 |
|
16.09.2005, 09:34 | #3 |
Administrator
|
или же можно в display-методе на таблице достучаться до формы:
PHP код:
В общем - предлагаю как идею ... Не совершенную конечно
__________________
Возможно сделать все. Вопрос времени |
|
16.09.2005, 10:24 | #4 |
Модератор
|
Я делал так: писал "быстрый" метод на таблице:
PHP код:
PHP код:
С Уважением, Георгий |
|
16.09.2005, 10:43 | #5 |
Участник
|
2 George Nordic
Цитата:
Navision Axapta Developer's Guide
Only methods with the display keyword can be cached. Furthermore, only table methods can be cached, i.e. methods written on the form or the form datasource cannot be cached. Use the tableMethodStr function to get a compile check as to whether the method exists.
__________________
Axapta v.3.0 sp5 kr2 |
|
16.09.2005, 10:53 | #6 |
Модератор
|
Угу. Знаю. Но как иначе? Есть предложения?
1) Надо попробовать все-таки закэшировать. Давай проверим - напишем и проверим. Есть вероятность, что этот метод не будет вызываться при перересовке формы, как происходит с диспей-методами без кеширования. 2) Сделать несколько дисплей-методов, как я предлагал, и вызывать один из них. Все эти методы закэшировать и посмотреть, отработает ли кэширование при неявном вызове. 2 AndyD: У Вас есть еще какие-либо конструктивные предложения? С Уважением, Георгий. |
|
16.09.2005, 11:14 | #7 |
Участник
|
Цитата:
display int showInt()
{ return(getMyBeautifulValue(условие1,..N)); } [[/B] А как у Вас получилось закешировать метод определенный на источнике данных? Поделитесь опытом! |
|
16.09.2005, 11:30 | #8 |
Участник
|
2 George Nordic
Попробовал создать метод на датасорсе. Создал метод Init() на датасорсе PHP код:
По поводу конструктива - посмотрите пост 2 в этой ветке.
__________________
Axapta v.3.0 sp5 kr2 |
|
16.09.2005, 11:36 | #9 |
Участник
|
Цитата:
Изначально опубликовано AndyD
Можно воспользоваться механизмом infolog.globalCache() Цитата:
Изначально опубликовано George Nordic
Угу. Знаю. Но как иначе? Есть предложения? 1) Надо попробовать все-таки закэшировать. Давай проверим - напишем и проверим. Есть вероятность, что этот метод не будет вызываться при перересовке формы, как происходит с диспей-методами без кеширования. 2) Сделать несколько дисплей-методов, как я предлагал, и вызывать один из них. Все эти методы закэшировать и посмотреть, отработает ли кэширование при неявном вызове.
__________________
Спокойствие, только спокойствие! (Астрид Линдгрен) |
|
16.09.2005, 11:57 | #10 |
Модератор
|
Да. Млин. Посыпаю голову пеплом.
this.cacheAddMethod("GetCount") - возвращает 0. Не кэширует, зараза. Ччерт. а я-то раньше и не проверял на возвращаемое значение. Да, AndyD дважды прав. Ладно. Буду копать. Может, что-нить и нарою С Уважением, Георгий |
|
16.09.2005, 12:05 | #11 |
Участник
|
Извините, не удержусь от глубокомысленного замечания.
Похоже на то, что кешировать можно только методы возвращаемое значение которых однозначно определяется данными. Отсюда, единственный выход - передавать параметры через бд. С уважением, itfs. |
|
16.09.2005, 12:10 | #12 |
Участник
|
Цитата:
Вроде бы один из выходов - создавать дисплей-метод не на таблице, а на датасорсе формы, но этот вариант мне не подходит, так как метод перестает кешироваться.
Форма в репозитарии - RLedgerSheetTurnoverBalance Там на источнике данных LedgerTable дислпей методы, например, метод getBalanceCredit(). Там при первом обращении считываются данные из базы, а при последующих обращениях - идет считывание из Map |
|
16.09.2005, 12:15 | #13 |
Участник
|
Цитата:
Изначально опубликовано itfs
Извините, не удержусь от глубокомысленного замечания. Похоже на то, что кешировать можно только методы возвращаемое значение которых однозначно определяется данными. Отсюда, единственный выход - передавать параметры через бд.
__________________
Спокойствие, только спокойствие! (Астрид Линдгрен) |
|
16.09.2005, 12:18 | #14 |
Модератор
|
Мда. Жопа.
1) На датасорсе - компилятор глотает, но не кэширует. 2) Неявный вызов (через метод на датасорсе) все равно вызывает ф-ции заного, плевать, что они кэшированные. С Уважением, Георгий |
|
16.09.2005, 12:40 | #15 |
Участник
|
Хочу спросить.
Чем не устраивает предложение с использованием infolog.globalCache(). Сейчас попробовал, все работает.
__________________
Axapta v.3.0 sp5 kr2 |
|
16.09.2005, 12:58 | #16 |
Модератор
|
Цитата:
Изначально опубликовано exceptor
Спасибо, поразбираюсь с ним. Слушайте AndyD. В таком виде, как Вы описали задачу - это одно из самых лучших решений. С Уважением, Георгий |
|
17.09.2005, 21:11 | #17 |
Участник
|
Просто как еще одна идея. Создать столько контролов на форме, сколько условий надо обработать. Делать только один visible в зависимости от условий на форме. Соответственно, столько же display-методов на таблице.
|
|
18.09.2005, 07:57 | #18 |
Участник
|
Кэширование можно реализовать самому, так, как это сказал Ace Of Database. Можно на форме создать Map:
PHP код:
PHP код:
|
|
18.09.2005, 19:31 | #19 |
Участник
|
Мне кажется, что все-таки лучше использовать возможности, предоставляемые ядром. Не думаю, что кэширование, организованное на прикладном уровне эффективнее. Взять хотябы exists(), вызываемый при каждом отображении грида.
__________________
Axapta v.3.0 sp5 kr2 |
|
19.09.2005, 07:57 | #20 |
Снова балуюсь косаптой :)
|
просто и со вкусом :)
В данной ситуации IMHO лучше использовать временную таблицу, которая будет заполняться в init-е. Никакого обмена данными с сервером после изначального быть не должно, так как временная таблица на клиенте. А если её еще сделать в виде датасурса и заджоинить с основной таблицей грида, то и вообще от дисплей-методов можно отказаться
__________________
Бесты и регарды! |
|
|
Похожие темы | ||||
Тема | Ответов | |||
axaptapedia: Display method | 0 | |||
Grid и display-метод | 20 | |||
Говорят вышел SP2 для Axapta 3. Кто нибуть что знает на эту тему? | 10 | |||
display() method on Grid Control | 5 | |||
edit и display методы | 4 |
|