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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 07.08.2009, 15:57   #1  
Eldar9x is offline
Eldar9x
MCTS
Аватар для Eldar9x
Oracle
MCBMSS
 
1,064 / 166 (8) ++++++
Регистрация: 29.09.2006
Адрес: Казань
Опять Кэш
В validateWrite на форме InventTable:
X++:
    if (!InventTable.RecId && InventTable::exist(inventTable.ItemId))
        return checkFailed(strfmt("@SYS58214", inventTable.ItemId));
из-за этого запись видится, даже если удалена, и после перезапуска клиента. Кэш клиентский чистили - не помогает.

правильно ли будет, если я заменю этот участок кода следущим?
(то есть данные тянутся с сервера, а не клиента)
X++:
    if (!InventTable.RecId && InventTable::tmn_exist(inventTable.ItemId))
        return checkFailed(strfmt("@SYS58214", inventTable.ItemId));

     tmn_exist():

static server boolean tmn_exist(ItemId  itemId)
{
    InventTable inventTable;
    ;

    flush inventTable;

    select inventTable
        index hint ItemIdx
        where inventTable.itemId == itemId;

    return itemId && inventTable.recId;
}
Старый 07.08.2009, 16:22   #2  
ivas is offline
ivas
Участник
Аватар для ivas
 
252 / 68 (3) ++++
Регистрация: 22.12.2005
X++:
if (!InventTable.RecId && InventTable::exist(inventTable.ItemId))
замените на
X++:
if (InventTable::exist(inventTable.ItemId))
__________________
aLL woRk aNd nO JoY MAKes jAck a dULL Boy
Старый 07.08.2009, 19:04   #3  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,701 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
А отменить кеширование таблицы InventTable нельзя? CacheLookup = None
Старый 08.08.2009, 16:24   #4  
Eldar9x is offline
Eldar9x
MCTS
Аватар для Eldar9x
Oracle
MCBMSS
 
1,064 / 166 (8) ++++++
Регистрация: 29.09.2006
Адрес: Казань
ivas, не совсем понимаю, как это мне должно помочь....
Владимир Максимов, этим действием я не получу себе еще больше проблем?
Старый 08.08.2009, 17:04   #5  
glibs is offline
glibs
Member
Сотрудники компании It Box
Most Valuable Professional
Лучший по профессии 2011
Лучший по профессии 2009
 
4,942 / 911 (40) +++++++
Регистрация: 10.06.2002
Адрес: I am from Kyiv, Ukraine. Now I am in Moscow. For private contacts: glibs@hotmail.com
Отменить кэширование можно, но может пострадать производительность. Обычно код пишется таким образом, что он рассчитывает на работающий механизм кэширования.

Я в таких подлых случаях пишу

inventTable.disableCache(true);

Впрочем, как лучше — не знаю.

Eldar9x, а какая у вас проблема, если не секрет? А то я сталкиваюсь с проблемой, когда в InventTableModule регулярно появляются записи, которых нет в InventTable. Пока не словил причину. Но тоже склонен грешить на кэш.
__________________
С уважением,
glibs®
За это сообщение автора поблагодарили: Logger (2).
Старый 08.08.2009, 20:04   #6  
Eldar9x is offline
Eldar9x
MCTS
Аватар для Eldar9x
Oracle
MCBMSS
 
1,064 / 166 (8) ++++++
Регистрация: 29.09.2006
Адрес: Казань
Цитата:
А то я сталкиваюсь с проблемой, когда в InventTableModule регулярно появляются записи, которых нет в InventTable.
и это тоже, кстати. И еще в других связанных таблицах. Чистил руками в итоге. Точно пока сказать не могу, как это происходит. Вроде как, при сохранении записи, если одно из обязательных полей связанной таблицы не заполнено.
Вообще проблемы начались, когда разрешили удалять записи в таблице номенклатур.
И вообще, я не понимаю, для чего это проверка там вставлена? В inventTable есть уникальный индекс по ItemId, зачем еще этот код?

Последний раз редактировалось Eldar9x; 08.08.2009 в 20:06.
За это сообщение автора поблагодарили: glibs (2).
Старый 10.08.2009, 16:53   #7  
ZVV is offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1,006 / 246 (11) ++++++
Регистрация: 13.02.2004
Адрес: Минск
->
Цитата:
Сообщение от Eldar9x Посмотреть сообщение
и это тоже, кстати. И еще в других связанных таблицах. Чистил руками в итоге. Точно пока сказать не могу, как это происходит. Вроде как, при сохранении записи, если одно из обязательных полей связанной таблицы не заполнено.
Вообще проблемы начались, когда разрешили удалять записи в таблице номенклатур.
И вообще, я не понимаю, для чего это проверка там вставлена? В inventTable есть уникальный индекс по ItemId, зачем еще этот код?
Да, действительно как-то глупо...
Думаю можно этот код убрать.
Либо как вариант заменить
X++:
if (InventTable::exist(inventTable.ItemId))
на
X++:
ttsBegin;
if (InventTable::find(inventTable.ItemId, true))
{...}
ttsCommit;
__________________
Zhirenkov Vitaly
Старый 10.08.2009, 18:32   #8  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,701 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Цитата:
Сообщение от Eldar9x Посмотреть сообщение
Владимир Максимов, этим действием я не получу себе еще больше проблем?
Как указал glibs кеширование влияет на производительность. Но здесь нет однозначного ответа.

По умолчанию, у InventTable режим кеширования Found. Т.е. кешируются только те записи, к которым было обращение (поиск). Следовательно, этот режим кеширования имеет смысл оставить, если каждый пользователь работает в основном с небольшим набором номенклатуры. Или сам справочник номенклатуры небольшой.

Если же большинство пользователей работает со всей картотекой номенклатуры, то нет никакого смысла в кешировании.

У нас кеширование InventTable отключено. Справочник порядка 50 тысяч позиций. Проблем нет. Хотя, удаление записей запрещено

Цитата:
Сообщение от Eldar9x
И вообще, я не понимаю, для чего это проверка там вставлена? В inventTable есть уникальный индекс по ItemId, зачем еще этот код?
Вопрос момента проверки на уникальность.

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

Собственно, можно попробовать вообще убрать эту проверку и посмотреть к чему это приведет в случае попытки создания дубля.
За это сообщение автора поблагодарили: Eldar9x (2).
Старый 10.08.2009, 20:00   #9  
glibs is offline
glibs
Member
Сотрудники компании It Box
Most Valuable Professional
Лучший по профессии 2011
Лучший по профессии 2009
 
4,942 / 911 (40) +++++++
Регистрация: 10.06.2002
Адрес: I am from Kyiv, Ukraine. Now I am in Moscow. For private contacts: glibs@hotmail.com
Цитата:
Сообщение от Владимир Максимов
...
кеширование влияет на производительность. Но здесь нет однозначного ответа
...
Если же большинство пользователей работает со всей картотекой номенклатуры, то нет никакого смысла в кешировании.
...
Вы заблуждаетесь. Для "Found" кешировнаие будет работать всякий раз, когда в коде вызывается

InventTable::find(...)

А точнее, когда запись выбирается по первичному ключу.

Если код работает на сервере приложений, то в таком случае будет лишнее обращение на сервер БД. Номенклатура там скорее всего будет тоже в кеше, поэтому потери производительности вы можете не ощутить визуально. Впрочем, если запускается долгоиграющая периодическая процедура (типа закрытия склада), в которой может очень-очень много раз вызываться InventTable::find(...) подразумевая, что кеширование включено, производительность может просесть заметно. Не говоря уже о лишнем трафике (Аксапта имеет привычку выбирать все поля в записи).

Если же код будет выполняться на клиенте (display методы, если по-хорошему), то потеря производительности при отключении кеширования будет заметна даже невооруженным глазом.

Когда я был помоложе, то тоже увлекался отключением кеширования. Но все-таки пришел к тому, что не стоит.

Вот вам джоб.

X++:
static void glibs(Args _args)
{
    InventTable             inventTable;
    Counter                 i;
    TimeOfDay               startTime,
                            endTime;
    ;

    startTime = timenow();
    for (i = 1; i <= 10000; i++)
    {
        inventTable = InventTable::find("Test");
    }
    endTime = timenow();

    info (strfmt("%1", endTime - startTime));

}
Попробуйте позапускать его на тестовой базе с реальным объемом данных при включенном и отключенном кешировании. Заодно еще загрузку сети посмотрите ради любопытства. Код номенклатуры только подставьте реальный.

У меня разница приблизительно на порядок получилась.
__________________
С уважением,
glibs®
За это сообщение автора поблагодарили: mazzy (2).
Старый 11.08.2009, 07:42   #10  
Eldar9x is offline
Eldar9x
MCTS
Аватар для Eldar9x
Oracle
MCBMSS
 
1,064 / 166 (8) ++++++
Регистрация: 29.09.2006
Адрес: Казань
Цитата:
Вопрос момента проверки на уникальность.

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

Собственно, можно попробовать вообще убрать эту проверку и посмотреть к чему это приведет в случае попытки создания дубля.
Теперь понятно, спасибо за объяснение.
Цитата:
Хотя, удаление записей запрещено
Хм, а что если пользователь создал запись неверно, и есть поля, которые можно редактировать только при создании записи, как решили этот вопрос (у нас только из-за этого и пришлось разрешить удалять записи)?
Цитата:
У меня разница приблизительно на порядок получилась
мда как то не радует. Думаю, тогда и на самом деле не стоит трогать кэширование, тем более что у нас еженочные операции по всей inventTable
Старый 11.08.2009, 14:04   #11  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,701 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Цитата:
Сообщение от Eldar9x Посмотреть сообщение
Хм, а что если пользователь создал запись неверно, и есть поля, которые можно редактировать только при создании записи, как решили этот вопрос (у нас только из-за этого и пришлось разрешить удалять записи)?
Программно-то эти поля по прежнему можно редактировать. Поэтому, в карточке номенклатуры добавляются специальные пункты меню вроде "Изменить значение ...".

Ну, а далее выполняешь все необхоимые проверки и программно меняешь значение поля на указанное, если это возможно. Или сообщение, почему уже поздно...
Старый 11.08.2009, 14:20   #12  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,701 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
glibs

Я же говорю, нет однозначного ответа. Зависит от конкретной ситуации и надо смотреть "по месту" что выгоднее: возможная потеря производительности или актуальность данных.

Для нас критичным оказалась именно актуальность данных. Почему? Это уже отдельный вопрос.

По сути, единственное место, где реально ощутима потеря производительности - это display-методы.

Коды циклических процедур все-таки не настолько "тупые", чтобы многократно делать поиск внутри цикла. А если настолько, то на этот случай и нужны программисты, чтобы это исправить

Можно ведь сделать и "закат солнца вручную". В смысле, скидывать найденные записи во временную таблицу внутри цикла. Своеобразный локальный кеш получится.

Насчет закрытия склада - не понял. Где там многократное обращение к одной и той же записи InventTable? Там же единственный цикл именно по InventTable, а потом выбранная запись передается как параметр. Нет повторного InventTable::find()
Теги
кэширование

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
А построение перекрестных ссылок опять сожрет всю память и завесит систему нафих Alex_K DAX: Администрирование 15 04.09.2009 22:00
опять про setFocus() на Grid ... =)) NetBus DAX: Программирование 1 15.11.2005 13:52
Опять про кэш (*.aoc) DenisS DAX: Программирование 2 23.01.2004 13:27
Ax 3.0 Некорректное завершение - ошибка. Не лечится. Локальный кэш? dirigente DAX: Администрирование 4 20.11.2003 13:11
кэш клиента andreynikolai DAX: Программирование 1 15.09.2003 18:37

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

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

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