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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 15.09.2005, 22:16   #1  
exceptor is offline
exceptor
Участник
 
32 / 14 (1) ++
Регистрация: 15.03.2004
Еще раз о Display-методах
Всем доброго времени суток.
Ситуация у меня обыденная:
- есть таблица, на которую навешан дисплей метод
- есть форма, в которой вышеуказанная таблица установлена в качестве источника данных
- на форме присутствует грид. Одно из полей грида отображает значение, возвращаемое дисплей методом
- display-метод генерит довольно много запросов, поэтому он закеширован в init() датасорса

Дело в том, что в display-методе мне необходимо генерить запрос в зависимости от значений некоторых параметров формы. Возникает вопрос - как передать эти параметры дисплей-методу?
Вроде бы один из выходов - создавать дисплей-метод не на таблице, а на датасорсе формы, но этот вариант мне не подходит, так как метод перестает кешироваться.

Подскажите, пожалуйста, как можно выкрутиться, или скажите чего я делаю неправильно.
__________________
Спокойствие, только спокойствие! (Астрид Линдгрен)
За это сообщение автора поблагодарили: Dodger (1).
Старый 16.09.2005, 08:17   #2  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2476 (88) +++++++++
Регистрация: 20.08.2005
Можно воспользоваться механизмом infolog.globalCache()
__________________
Axapta v.3.0 sp5 kr2
Старый 16.09.2005, 09:34   #3  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,275 / 3476 (122) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
или же можно в display-методе на таблице достучаться до формы:
PHP код:
Object formRun;
;
if (
this.isFormDataSource())
{
       
formRun this.dataSource().formRun();
       
formRun.MyMethod()

Правда это работает в случае когда метод вызывается из кода.... когда метод прикреплен к контролу на гриде - у меня не получилось увидеть результат.
В общем - предлагаю как идею ... Не совершенную конечно
__________________
Возможно сделать все. Вопрос времени
Старый 16.09.2005, 10:24   #4  
George Nordic is offline
George Nordic
Модератор
Аватар для George Nordic
Злыдни
 
4,479 / 1250 (50) ++++++++
Регистрация: 17.12.2003
Адрес: Moscow
Записей в блоге: 9
Я делал так: писал "быстрый" метод на таблице:
PHP код:
server static int getMyBeautifulValue(int _var1int _var2)
{
.......
;
select firstfast firstonly RecId
    from 
....

    return 
ret;

Потом писал исплей-метод на датасорсе и кэшировал его
PHP код:
display int showInt()
{
  return(
getMyBeautifulValue(условие1,..N));

Или напиши несколько методов и вызывай один из них, если уловий немного.

С Уважением,
Георгий
Старый 16.09.2005, 10:43   #5  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2476 (88) +++++++++
Регистрация: 20.08.2005
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  
George Nordic is offline
George Nordic
Модератор
Аватар для George Nordic
Злыдни
 
4,479 / 1250 (50) ++++++++
Регистрация: 17.12.2003
Адрес: Moscow
Записей в блоге: 9
Угу. Знаю. Но как иначе? Есть предложения?

1) Надо попробовать все-таки закэшировать. Давай проверим - напишем и проверим. Есть вероятность, что этот метод не будет вызываться при перересовке формы, как происходит с диспей-методами без кеширования.
2) Сделать несколько дисплей-методов, как я предлагал, и вызывать один из них. Все эти методы закэшировать и посмотреть, отработает ли кэширование при неявном вызове.

2 AndyD: У Вас есть еще какие-либо конструктивные предложения?

С Уважением,
Георгий.
Старый 16.09.2005, 11:14   #7  
Cargo is offline
Cargo
Участник
 
88 / 30 (2) +++
Регистрация: 16.09.2005
Адрес: Moscow
Цитата:
display int showInt()
{
return(getMyBeautifulValue(условие1,..N));
}
[[/B]
Хм, а ведь метод на таблице был статическим.

А как у Вас получилось закешировать метод определенный на источнике данных? Поделитесь опытом!
Старый 16.09.2005, 11:30   #8  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2476 (88) +++++++++
Регистрация: 20.08.2005
2 George Nordic

Попробовал создать метод на датасорсе. Создал метод Init() на датасорсе
PHP код:
public void init()
{
    ;
    
super();
    
this.cacheAddMethod("GetCount");

Ничего не получилось. Вызовы на сервер идут.

По поводу конструктива - посмотрите пост 2 в этой ветке.
__________________
Axapta v.3.0 sp5 kr2
Старый 16.09.2005, 11:36   #9  
exceptor is offline
exceptor
Участник
 
32 / 14 (1) ++
Регистрация: 15.03.2004
Цитата:
Изначально опубликовано AndyD

Можно воспользоваться механизмом infolog.globalCache()
Спасибо, поразбираюсь с ним.

Цитата:
Изначально опубликовано George Nordic
Угу. Знаю. Но как иначе? Есть предложения?

1) Надо попробовать все-таки закэшировать. Давай проверим - напишем и проверим. Есть вероятность, что этот метод не будет вызываться при перересовке формы, как происходит с диспей-методами без кеширования.
2) Сделать несколько дисплей-методов, как я предлагал, и вызывать один из них. Все эти методы закэшировать и посмотреть, отработает ли кэширование при неявном вызове.
У себя перепробовал все возможные, на мой взгляд, варианты. Закэшировать метод определенный на источнике данных так и не удалось
__________________
Спокойствие, только спокойствие! (Астрид Линдгрен)
Старый 16.09.2005, 11:57   #10  
George Nordic is offline
George Nordic
Модератор
Аватар для George Nordic
Злыдни
 
4,479 / 1250 (50) ++++++++
Регистрация: 17.12.2003
Адрес: Moscow
Записей в блоге: 9
Да. Млин. Посыпаю голову пеплом.

this.cacheAddMethod("GetCount") - возвращает 0. Не кэширует, зараза.

Ччерт. а я-то раньше и не проверял на возвращаемое значение.

Да, AndyD дважды прав.

Ладно. Буду копать. Может, что-нить и нарою

С Уважением,
Георгий
Старый 16.09.2005, 12:05   #11  
itfs is offline
itfs
Участник
 
277 / 43 (2) +++
Регистрация: 18.07.2005
Адрес: Moscow
Извините, не удержусь от глубокомысленного замечания.
Похоже на то, что кешировать можно только методы возвращаемое значение которых однозначно определяется данными. Отсюда, единственный выход - передавать параметры через бд.

С уважением, itfs.
Старый 16.09.2005, 12:10   #12  
Ace of Database is offline
Ace of Database
Участник
Аватар для Ace of Database
 
870 / 637 (23) +++++++
Регистрация: 14.10.2004
Цитата:
Вроде бы один из выходов - создавать дисплей-метод не на таблице, а на датасорсе формы, но этот вариант мне не подходит, так как метод перестает кешироваться.
Можно сделать по аналогии с формой "Оборотно-сальдовая ведомость" - в главной книге - Запросы - Оборот по счету.
Форма в репозитарии - RLedgerSheetTurnoverBalance
Там на источнике данных LedgerTable дислпей методы, например, метод getBalanceCredit().

Там при первом обращении считываются данные из базы, а при последующих обращениях - идет считывание из Map
Старый 16.09.2005, 12:15   #13  
exceptor is offline
exceptor
Участник
 
32 / 14 (1) ++
Регистрация: 15.03.2004
Цитата:
Изначально опубликовано itfs
Извините, не удержусь от глубокомысленного замечания.
Похоже на то, что кешировать можно только методы возвращаемое значение которых однозначно определяется данными. Отсюда, единственный выход - передавать параметры через бд.
Об этом я уже тоже думал. Но как-то слишком криво и некрасиво получается.
__________________
Спокойствие, только спокойствие! (Астрид Линдгрен)
Старый 16.09.2005, 12:18   #14  
George Nordic is offline
George Nordic
Модератор
Аватар для George Nordic
Злыдни
 
4,479 / 1250 (50) ++++++++
Регистрация: 17.12.2003
Адрес: Moscow
Записей в блоге: 9
Мда. Жопа.

1) На датасорсе - компилятор глотает, но не кэширует.
2) Неявный вызов (через метод на датасорсе) все равно вызывает ф-ции заного, плевать, что они кэшированные.


С Уважением,
Георгий
Вложения
Тип файла: xpo tutorial_cashdisplay_flx.xpo (17.1 Кб, 481 просмотров)
Старый 16.09.2005, 12:40   #15  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2476 (88) +++++++++
Регистрация: 20.08.2005
Хочу спросить.

Чем не устраивает предложение с использованием infolog.globalCache(). Сейчас попробовал, все работает.
__________________
Axapta v.3.0 sp5 kr2
Старый 16.09.2005, 12:58   #16  
George Nordic is offline
George Nordic
Модератор
Аватар для George Nordic
Злыдни
 
4,479 / 1250 (50) ++++++++
Регистрация: 17.12.2003
Адрес: Moscow
Записей в блоге: 9
Цитата:
Изначально опубликовано exceptor
Спасибо, поразбираюсь с ним.
Что б было легче разбираться http://www.axforum.info/forums/showt...5853#post35853

Слушайте AndyD. В таком виде, как Вы описали задачу - это одно из самых лучших решений.

С Уважением,
Георгий
Старый 17.09.2005, 21:11   #17  
Alexander A. is offline
Alexander A.
Участник
 
2 / 10 (1) +
Регистрация: 23.08.2005
Просто как еще одна идея. Создать столько контролов на форме, сколько условий надо обработать. Делать только один visible в зависимости от условий на форме. Соответственно, столько же display-методов на таблице.
Старый 18.09.2005, 07:57   #18  
Peter Savintsev is offline
Peter Savintsev
Участник
 
246 / 119 (4) +++++
Регистрация: 14.12.2001
Кэширование можно реализовать самому, так, как это сказал Ace Of Database. Можно на форме создать Map:

PHP код:
void init()
{
    
cacheMap = new Map(Types::IntegerTypes::<тип возвращаемый display-методом>)

А сам display-метод будет выглядеть так:
PHP код:
display <типmyMethod(Common _record)
{
    <
типret;

    if (
cacheMap.exists(_record.RecId))
    {
        return 
cacheMap.lookup(_record.RecId)
    }

    <
необходимые действиянапримервызов соответствующего метода таблицы в зависимости от параметров>

    
cacheMap.insert(_record.RecIdret);
    return 
ret;

Старый 18.09.2005, 19:31   #19  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2476 (88) +++++++++
Регистрация: 20.08.2005
Мне кажется, что все-таки лучше использовать возможности, предоставляемые ядром. Не думаю, что кэширование, организованное на прикладном уровне эффективнее. Взять хотябы exists(), вызываемый при каждом отображении грида.
__________________
Axapta v.3.0 sp5 kr2
Старый 19.09.2005, 07:57   #20  
konfet is offline
konfet
Снова балуюсь косаптой :)
 
143 / 50 (2) ++++
Регистрация: 23.04.2003
Адрес: Moscow
просто и со вкусом :)
В данной ситуации IMHO лучше использовать временную таблицу, которая будет заполняться в init-е. Никакого обмена данными с сервером после изначального быть не должно, так как временная таблица на клиенте. А если её еще сделать в виде датасурса и заджоинить с основной таблицей грида, то и вообще от дисплей-методов можно отказаться
__________________
Бесты и регарды!
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
axaptapedia: Display method Blog bot DAX Blogs 0 29.08.2007 16:30
Grid и display-метод Russland DAX: Программирование 20 09.04.2007 09:25
Говорят вышел SP2 для Axapta 3. Кто нибуть что знает на эту тему? soin DAX: Прочие вопросы 10 13.10.2003 10:43
display() method on Grid Control DK DAX: Программирование 5 31.01.2003 22:09
edit и display методы Maxim Gorbunov DAX: База знаний и проекты 4 15.01.2002 12:58

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

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

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 07:59.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.