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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 21.10.2014, 16:11   #1  
Blog bot is offline
Blog bot
Участник
 
25,631 / 848 (80) +++++++
Регистрация: 28.10.2006
i-neti: Решение проблемы с поиском новой цены в Dynamics AX
Источник: http://i-neti.ru/blog/230
==============

Многие сталкиваются с такой проблемой как отсутствие только что измененной цены. К примеру что то там стандартный механизм посчитал, мы изменили 1 параметр и нам нужно найти новую цену, в итоге она не находится.

Проблема кроется в кешировании аксаптой класса priceDisc_Price. Аксапта достает этот класс из кэша, видит что там переменная PriceFound = true и не ищет ничего.

Решением является изменение класса для работы без использования кэширования. Видимо этот механизм не до конца был проработан разработчиками Microsoft Dynamics.



Источник: http://i-neti.ru/blog/230
__________________
Расскажите о новых и интересных блогах по Microsoft Dynamics, напишите личное сообщение администратору.
Старый 22.10.2014, 06:50   #2  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от Blog bot Посмотреть сообщение
Видимо этот механизм не до конца был проработан разработчиками Microsoft Dynamics.
Как только разработчик произносит, что другие программисты не до конца проработали некий базовый механизм, который существует уже несколько версий...
...скорее всего, сам разработчик не разобрался.

1. ПРОИЗВОДИТЕЛЬНОСТЬ
ни в коем случае НЕ стоит изменять режим кэширования на продакте.

Конечно, попробуйте на тестовой базе. И убедитесь, что отключение кэширования таблицы PriceDiscTable немедленно приводит к DDOS'у SQL сервера мелкими запросами по этой таблице.

И это неспроста.
Изначальные разработчики Аксапты не боялись мелких, простых и частых запросов к SQL именно потому, что отлично работал кэш.
Поэтому зачастую лучше написать пару простых запросов в цикле (они будут брать данные из кэша) вместо сложного SQL-запроса с join.

2. ПРОБЛЕМА ПО СУТИ
Сама постановка проблемы является надуманной.
Дело в том, что кэш так или иначе обновится максимум через 15 минут.

В многопользовательской системе 15 минут обычно не влияют на работу пользователей. Пользователь1 обновил цены, в течение 15 минут у Пользователя2 цены гарантировано будут обновлены. Если в течение этих 15 минут у Пользователя2 будут задействованы старые цены - обычно ничего критичного не происходит. Это нормально.

15 минут становятся проблемой, когда появляется 1 (один) тестер и гоняет бизнес-процессы. Тогда да, наличие кэша и период до 15 минут становятся проблемой. Но это проблема тестирования, а не реальных бизнес-процессов. В тестировании перед каждым новым бизнес-процессом надо тупо сбрасывать кэши командой "Tools \ Caches \ Refresh data".
За это сообщение автора поблагодарили: AlexeyS (1), gl00mie (3).
Старый 22.10.2014, 12:41   #3  
Napalm is offline
Napalm
Участник
 
80 / 88 (3) ++++
Регистрация: 23.05.2012
Цитата:
Сообщение от Blog bot Посмотреть сообщение
Решением является изменение класса для работы без использования кэширования. Видимо этот механизм не до конца был проработан разработчиками Microsoft Dynamics.
Видимо разработчики Microsoft Dynamics не до конца проработали механизм редактирования линий разнесённых журналов.

Решением является изменение методов \Data Dictionary\Tables\LedgerJournalTrans\Methods\checkAllowEdit и \Classes\LedgerJournalEngine\allowEdit.
За это сообщение автора поблагодарили: mazzy (2).
Старый 22.10.2014, 12:47   #4  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Жжёшь, Napalm
Старый 28.10.2014, 02:06   #5  
wojzeh is offline
wojzeh
Участник
Аватар для wojzeh
Соотечественники
 
674 / 512 (19) +++++++
Регистрация: 27.04.2006
Адрес: Montreal
Проблема отсутствия искомой цены не может быть надуманной, ибо для того и нужна система, чтоб получать нужные данные.

Тут ещё нужно понять, о каком кэше идёт речь. Дело в том, что класс PriceDisc_Price для поиска цен использует класс PriceDisc, который найденные значения добавляет в глобальный кэш SysGlobalObjectCache. Так что вряд ли эта проблема связана с кешированием таблицы. Что такое "кеширование класса", я, честно говоря, не знаю.

В классе PriceDisc в двух местах есть баги, которые "теряют" найденную цену. Вкратце, они в цикле присваивают ссылку на буферную переменную.

X++:
           // Begin: Alexey Voytsekhovskiy Not to lose the buffer!
                    actualDiscTable        =  priceDiscTable.data();
                    //actualDiscTable        = priceDiscTable;
                    // End: Alexey Voytsekhovskiy
Подробнее тут.

Думаю, есть смысл сообщить куда следует.
__________________
Felix nihil admirari
За это сообщение автора поблагодарили: kashperuk (5), gl00mie (2), alex55 (1), S.Kuskov (5), Kabardian (7).
Старый 28.10.2014, 03:53   #6  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от wojzeh Посмотреть сообщение
Проблема отсутствия искомой цены не может быть надуманной, ибо для того и нужна система, чтоб получать нужные данные.
она их и получит.
обратите внимание, что в вашем утверждении ничего не сказано про время

Цитата:
Сообщение от wojzeh Посмотреть сообщение
Дело в том, что класс PriceDisc_Price для поиска цен использует класс PriceDisc, который найденные значения добавляет в глобальный кэш
да. а вот как раз за это яйца бы оторвать разработчикам последних версий.
которые вместо использования стандартных механизмов выполняют закат солнца вручную.
Старый 28.10.2014, 17:06   #7  
wojzeh is offline
wojzeh
Участник
Аватар для wojzeh
Соотечественники
 
674 / 512 (19) +++++++
Регистрация: 27.04.2006
Адрес: Montreal
Цитата:
Сообщение от mazzy Посмотреть сообщение
она их и получит.
обратите внимание, что в вашем утверждении ничего не сказано про время


да. а вот как раз за это яйца бы оторвать разработчикам последних версий.
которые вместо использования стандартных механизмов выполняют закат солнца вручную.
давай на ты, в интернете всё-таки!

о времени давно уже сказано до нас, что оно - деньги. я тут писал модуль симуляции розничных цен для крупнейшего поставщика автозапчастей, и уверяю тебя, эти люди порвут кого угодно, если новая цена не будет появляться чуть раньше реального времени.

вторая часть комментария эмоциональная, но не конструктивная.

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

тем более, что используется он не для всех случаев при поиске цен. например, тот же приснопамятный метод findDisc:

X++:
// To avoid flooding the cache the most granualated setup isn't cached.
// ADAXBasis - Begin
    cacheMode = !(_itemCode      == ADAXTableCategoryGroupAll::Table
                 && _accountCode == ADAXTableGroupOfContractGroupAll::Table);
// ADAXBasis - End
Кроме того, он сбрасывается при всяком "шевелении" таблицы цен\скидок.

Нажмите на изображение для увеличения
Название: цены.png
Просмотров: 214
Размер:	12.5 Кб
ID:	9019

Для моего конкретного случая, когда нужно загружать сотни тысяч новых цен, я это дело отключил.

А вот как бы сделать так, чтоб Ваня заинтересовался косяком, про который я написал, и пофиксили бы это дело в консерватории...
__________________
Felix nihil admirari
Старый 29.10.2014, 09:05   #8  
SRF is offline
SRF
Участник
MCBMSS
Axapta Retail User
 
375 / 562 (19) +++++++
Регистрация: 08.08.2007
Записей в блоге: 1
Цитата:
Сообщение от wojzeh Посмотреть сообщение
Кроме того, он сбрасывается при всяком "шевелении" таблицы цен\скидок.
Да, но только проблема этого кеширования в том, что кеш сбрасывается только для АОСа, на котором происходило "шевеление", а на других оставшихся АОСах глобальный кеш остается неизменным Приходится в некоторых операциях насильно его вручную обновлять.
__________________
Sergey Nefedov
Старый 29.10.2014, 10:37   #9  
Ivanhoe is offline
Ivanhoe
Участник
Аватар для Ivanhoe
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
4,143 / 2156 (80) +++++++++
Регистрация: 29.09.2005
Адрес: Санкт-Петербург
Цитата:
Сообщение от wojzeh Посмотреть сообщение
А вот как бы сделать так, чтоб Ваня заинтересовался косяком, про который я написал, и пофиксили бы это дело в консерватории...
Понимаю, что про другого Ваню, но все же Если объяснишь, на какой версии и как повторить, то зарегистрирую в MS.
__________________
Ivanhoe as is..
За это сообщение автора поблагодарили: kashperuk (3).
Старый 29.10.2014, 11:33   #10  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Цитата:
Сообщение от SRF Посмотреть сообщение
Да, но только проблема этого кеширования в том, что кеш сбрасывается только для АОСа, на котором происходило "шевеление", а на других оставшихся АОСах глобальный кеш остается неизменным Приходится в некоторых операциях насильно его вручную обновлять.
Как это? Другие АОСы тоже должны его сбросить, просто чуть с задержкой.

Цитата:
Сообщение от Ivanhoe Посмотреть сообщение
Понимаю, что про другого Ваню, но все же Если объяснишь, на какой версии и как повторить, то зарегистрирую в MS.
О, вот и доброволец нашелся. Спасибо!
Старый 29.10.2014, 17:13   #11  
wojzeh is offline
wojzeh
Участник
Аватар для wojzeh
Соотечественники
 
674 / 512 (19) +++++++
Регистрация: 27.04.2006
Адрес: Montreal
Цитата:
Сообщение от SRF Посмотреть сообщение
Да, но только проблема этого кеширования в том, что кеш сбрасывается только для АОСа, на котором происходило "шевеление", а на других оставшихся АОСах глобальный кеш остается неизменным Приходится в некоторых операциях насильно его вручную обновлять.
ничего подобного! почитайте же по ссылке что написано: кэш реально global.
__________________
Felix nihil admirari
Старый 29.10.2014, 17:14   #12  
wojzeh is offline
wojzeh
Участник
Аватар для wojzeh
Соотечественники
 
674 / 512 (19) +++++++
Регистрация: 27.04.2006
Адрес: Montreal
Цитата:
Сообщение от Ivanhoe Посмотреть сообщение
Понимаю, что про другого Ваню, но все же Если объяснишь, на какой версии и как повторить, то зарегистрирую в MS.
AX2012 R2, R3
__________________
Felix nihil admirari
Старый 29.10.2014, 17:16   #13  
wojzeh is offline
wojzeh
Участник
Аватар для wojzeh
Соотечественники
 
674 / 512 (19) +++++++
Регистрация: 27.04.2006
Адрес: Montreal
Цитата:
Сообщение от mazzy Посмотреть сообщение
Дело в том, что кэш так или иначе обновится максимум через 15 минут.
кстати, а откуда дровишки про эти 15 минут?
__________________
Felix nihil admirari
Старый 30.10.2014, 11:25   #14  
Ivanhoe is offline
Ivanhoe
Участник
Аватар для Ivanhoe
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
4,143 / 2156 (80) +++++++++
Регистрация: 29.09.2005
Адрес: Санкт-Петербург
Цитата:
Сообщение от wojzeh Посмотреть сообщение
AX2012 R2, R3
А как повторить то?
__________________
Ivanhoe as is..
Старый 30.10.2014, 17:22   #15  
wojzeh is offline
wojzeh
Участник
Аватар для wojzeh
Соотечественники
 
674 / 512 (19) +++++++
Регистрация: 27.04.2006
Адрес: Montreal
Цитата:
Сообщение от Ivanhoe Посмотреть сообщение
А как повторить то?
на рабочем проекте я получил ситуацию, когда флажок "цена найдена" был взведён, а переданный буфер оказался пустым. повторять конкретно на том классе сейчас у меня времени нет, но суть примерно такова:

X++:
static void tmxTestCustTable(Args _args)
{
    PriceDiscTable   priceTable;
    PriceDiscTable   foundPriceTable;
    PriceDiscTable   foundPriceTableData;
    int         maxCust = 5;
    int         i = 1;
    
    while select priceTable
    {
        info(strFmt("in loop %1: %2", i, priceTable.RecId));
        if(i == 2)
        {
            foundPriceTable = priceTable;
            foundPriceTableData = priceTable.data();
            info("<-- let's say this is what we were looking for...");
        }
        
        if(i>maxCust)
        {
            break;
        }
        else
        {
            i++;
        }
    }
    info("---------------------------------------");
    info(strFmt("priceTable buffer after %1", priceTable.RecId));
    info(strFmt("found reference after %1", foundPriceTable.RecId));
    info(strFmt("found buffer after %1", foundPriceTableData.RecId));
}
результат

X++:
Message (10:19:22 am)
in loop 1: 5637351352
in loop 2: 5637349038
<-- let's say this is what we were looking for...
in loop 3: 5637349039
in loop 4: 5637344655
in loop 5: 5637339598
in loop 6: 5637331591
---------------------------------------
priceTable buffer after 5637331591
found reference after 5637331591
found buffer after 5637349038
соответственно, если буфер по дороге где-то обнуляется, то искомые данные митькой звали.
__________________
Felix nihil admirari
Старый 17.11.2014, 13:40   #16  
Kabardian is offline
Kabardian
Талантливый разгвоздяй
Аватар для Kabardian
 
424 / 338 (12) ++++++
Регистрация: 14.12.2008
Адрес: Москва
Записей в блоге: 14
В эту же тему. Не может ли ошибка со следующим текстом быть причиной, указанного выше бага (навскидку если кто знает ответ)?
Цитата:
Внутренняя ошибка в операции удаления в кэше объектов PriceDisc:FindPrice

Последний раз редактировалось Kabardian; 17.11.2014 в 13:43.
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
crminthefield: Podcast and Overview: Microsoft Dynamics CRM 2011 Update Rollup 15 Blog bot Dynamics CRM: Blogs 1 10.02.2016 10:26
emeadaxsupport: Managing general performance issues in Microsoft Dynamics AX Blog bot DAX Blogs 0 12.09.2014 12:11
DAX: Official Dynamics AX 2012 R2 Content (update) - Where is it, and how can you find out about updates? Blog bot DAX Blogs 0 03.12.2012 11:11
crminthefield: Podcast and Overview: Microsoft Dynamics CRM 2011 Update Rollup 10 Blog bot Dynamics CRM: Blogs 0 17.08.2012 03:27
CRM DE LA CREME! Configuring Microsoft Dynamics CRM 4.0 for Internet-facing deployment Blog bot Dynamics CRM: Blogs 0 18.08.2009 11:05

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

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

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