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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 17.05.2007, 20:01   #1  
EVGL is offline
EVGL
Banned
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
4,445 / 3001 (0) ++++++++++
Регистрация: 09.07.2002
Адрес: Parndorf, AT
Развивающая игра с xRecord.wasCached(), RecordViewCache
Многие опытные разработчики думают о кешировании записей и выполняют соответствующие действия "про запас", не имея времени проверить, работает ли кеш, или не зная, как это можно проверить.

Коллега нашел решение: метод xRecord.wasCached().

Предлагаю всем желающим самостоятельно протестировать и проанализировать следующий код (для 4.0, если это имеет значение):

X++:
static server void testCaching() // try to call on the client
{
    SalesLine       salesLine, salesLineRVC;
    RecordViewCache rvc;
    #DEFINE.TestInventTransId('08587_059')

    void showInfo(str _desc, SalesLine _salesLine)
    {
        ;
        setPrefix(_desc);
        info(strFmt("InventTransId = '%1', .wasCached() = '%2'.", _salesLine.InventTransId, _salesLine.wasCached()));
    }
    ;

    new Application().flushcompanycache(curExt());  // try to comment this out and start a couple of times
    Dictionary::dataFlush(salesLine.TableId);       // "-"
    info("All caches have been flushed");

    select firstonly salesLine
        where salesLine.InventTransId   == #TestInventTransId;
    showInfo("1. A select over an indexed field", salesLine);

    select firstonly salesLine
        where salesLine.InventTransId   == #TestInventTransId;
    showInfo("2. The same select", salesLine);

    ttsbegin;
    select firstonly salesLine
        where salesLine.InventTransId   == #TestInventTransId;
    showInfo("3. The same select as the 1 and 2, but in TTS", salesLine);
    ttsabort;

    select firstonly salesLine
        where salesLine.InventTransId   == #TestInventTransId   &&
              salesLine.ConfirmedDlv    <= systemDateGet();
    showInfo("4. A slightly different select over a non-index field", salesLine);

    select firstonly salesLine
        where salesLine.InventTransId   == #TestInventTransId   &&
              salesLine.ConfirmedDlv    <= systemDateGet();
    showInfo("5. The same as 4, called the 2nd time", salesLine);

    select firstonly nofetch salesLineRVC
        where salesLineRVC.InventTransId    == #TestInventTransId;
    rvc = new RecordViewCache(salesLineRVC);

    select firstonly salesLine
        where salesLine.InventTransId   == #TestInventTransId   &&
              salesLine.ConfirmedDlv    <= systemDateGet();
    showInfo("6. The same as 4 and 5, but after an RVC has been instantiated", salesLine);
}
Результат работы:
Цитата:
All caches have been flushed
1. A select over an indexed field InventTransId = '08587_059', .wasCached() = 'NotCached'.
2. The same select InventTransId = '08587_059', .wasCached() = 'RecordCached'.
3. The same select as the 1 and 2, but in TTS InventTransId = '08587_059', .wasCached() = 'NotCached'.
4. A slightly different select over a non-index field InventTransId = '08587_059', .wasCached() = 'NotCached'.
5. The same as 4, called the 2nd time InventTransId = '08587_059', .wasCached() = 'NotCached'.
6. The same as 4 and 5, but after an RVC has been instantiated InventTransId = '08587_059', .wasCached() = 'ViewCached'.

Последний раз редактировалось EVGL; 17.05.2007 в 20:04.
За это сообщение автора поблагодарили: glibs (2), kashperuk (18), Logger (2), Kabardian (2).
Старый 17.05.2007, 21:00   #2  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Спасибо
Насколько я могу судить, все совпадает с теоретическими предпосылками.

Но вообще очень ценю желание проверять все подряд. Иначе никак нельзя. Вот только было бы время.

Спасибо большое за предоставленный готовый материал для тестов.

Кстати, про wasCached недавно вспоминал AndyD в какой-то из тем.
За это сообщение автора поблагодарили: EVGL (5).
Старый 12.12.2008, 07:21   #3  
vanokh is offline
vanokh
Участник
 
108 / 63 (3) ++++
Регистрация: 23.10.2008
Попробовал выполнить на 4-ке - выдал следующее:

All caches have been flushed
1. A select over an indexed field
InventTransId = 'Лот746278', .wasCached() = 'NotCached'.
2. The same select
InventTransId = 'Лот746278', .wasCached() = 'RecordCached'.
3. The same select as the 1 and 2, but in TTS
InventTransId = 'Лот746278', .wasCached() = 'NotCached'.
4. A slightly different select over a non-index field
InventTransId = 'Лот746278', .wasCached() = 'NotCached'.
5. The same as 4, called the 2nd time
InventTransId = 'Лот746278', .wasCached() = 'NotCached'.
Курсор является недопустимым для обработки recordViewCache.
6. The same as 4 and 5, but after an RVC has been instantiated
InventTransId = 'Лот746278', .wasCached() = 'NotCached'.

Джоб абсолютно тот же - скопировал (изменил только InventTransId). server и nofetch присутствуют.

Последний раз редактировалось vanokh; 12.12.2008 в 08:35.
Старый 12.12.2008, 09:34   #4  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,953 / 3230 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Цитата:
Сообщение от vanokh Посмотреть сообщение
Джоб абсолютно тот же - скопировал (изменил только InventTransId). server и nofetch присутствуют.
Скорее всего ваш код исполнялся на клиенте. Джобы при запуске по F5 игнорируют директиву server.
Попробуйте запустить джоб через настроенный менюитем со свойством RunOn = Server
Либо сделйте его не джобом, а статическим методом класса и дерните из джоба, тогда гарантировано сработает на сервере.

Можно еще первой строкой для контроля места выполнения поставить
info(strfMT('Running on %1', isRunningOnServer()));
За это сообщение автора поблагодарили: maximka (1), vanokh (1).
Старый 12.12.2008, 10:20   #5  
vanokh is offline
vanokh
Участник
 
108 / 63 (3) ++++
Регистрация: 23.10.2008
да, так и есть. спасибо!
Теги
recordviewcache, тестирование

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Глюки RecordViewCache Logger DAX: Программирование 9 22.04.2008 14:12
! "по выбранному курсору нельзя инициализировать recordViewCache" netbas DAX: Программирование 9 20.12.2007 15:24
Заказ/Закупка - ошибка xRecord Mok DAX: Программирование 3 07.12.2005 12:15
Как заставить работать xRecord.suppressWarnings() Logger DAX: Программирование 13 29.08.2005 16:22
Игра для программистов Ruff DAX: База знаний и проекты 4 09.02.2004 08:27
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

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

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

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 19:20.