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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 10.11.2005, 15:56   #1  
Yprit is offline
Yprit
Злыдни
Аватар для Yprit
Злыдни
 
419 / 93 (4) ++++
Регистрация: 22.02.2004
Адрес: СПб
inventItemLocationSelectLocked
В классе InventUpdateTTSControl этот метод лочит запись с пустой аналитикой в таблице InventItemLocation. Насколько я понимаю, это происходит при каком-либо измненении в физическом наличии номенклатуры по комбинациям аналитики. Это же следует и из комментариев в методе "Lock on table inventItemLocation is used for serialisation of updating processes". Непонятно одно - почему лочится именно запись "по-умолчанию"? В результате если у меня разносится накладная по заказу с номенклатурой А со Склада1, а Склад2 пытается переместить эту же номенклатуру между ячейками, то он будет ждать окончания разноски заказа. Не логичнее ли будет лочить запись в InventItemLocation для конкретного склада? Но последствия такой модификации я до конца представить не могу. Хотелось бы услышать просвещенное мнение ALL.
Спасибо
Старый 19.12.2007, 15:43   #2  
ViV is offline
ViV
Axapta Retail User
Самостоятельные клиенты AX
Axapta Retail User
 
200 / 79 (3) ++++
Регистрация: 14.09.2005
Что-то не было ни одного ответа
А тема достаточно для нас актуальна - складов достаточно много, и блокировки по таблице InventItemLocation частенько возникают.
В чем вообще сокровенный смысл этой таблицы? Если галка "блокировать при инвентаризации" у нас не активна и нам данный бизнес-процесс не нужен - можно ли от нее как-то избавится?
Хотя вы убрать из класса InventUpdateTTSControl ?
Старый 20.12.2007, 14:11   #3  
Nikolaich is offline
Nikolaich
Участник
 
238 / 10 (1) +
Регистрация: 15.12.2004
посмотрите содержимое этой таблицы и убедитесь в том что она у вас не используется. Если не используется - можете найти в коде блокировку и грамотно ее отключить. Убедиться в том что она неиспользуется очень просто - проверьте есть ли записи с InventDimId не равнному 'Axapta' !
Если нет таких записей - вам эта таблица не нужна
Старый 14.11.2008, 18:38   #4  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,875 / 3123 (112) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Цитата:
Сообщение от Nikolaich Посмотреть сообщение
посмотрите содержимое этой таблицы и убедитесь в том что она у вас не используется. Если не используется - можете найти в коде блокировку и грамотно ее отключить. Убедиться в том что она неиспользуется очень просто - проверьте есть ли записи с InventDimId не равнному 'Axapta' !
Если нет таких записей - вам эта таблица не нужна
По-моему вы ошибаетесь.
Код
X++:
    if (_movementIssue.mustBeOnhandLocked(false))
        appl.inventUpdateTTSControl().inventItemLocationSelectLocked(_movementIssue.itemId());
встречается в классах
InventUpd_Reservation
InventOnhand ( а как следствие и везде где меняется статус проводки, например в InventUpd_Financial)

Он накладывает блокировку в InventItemLocation в том случае если нужно запретить списывать финансовое или физическое количество в минус.

Так что удалив записи в InventItemLocation вы конечно решите проблему блокировок, но можете что нить в системе поломать. Например, отвалится запрет списания в минус а также пропадут номенклатуры из номенклатурного справочника

Журнал приемки

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

Последний раз редактировалось Logger; 14.11.2008 в 18:55.
Старый 14.11.2008, 18:44   #5  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,875 / 3123 (112) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
У меня правда вопрос аналогичный. Возможно ли как-то избавиться от блокировок и сохранить проверку отрицательного склада. Непонятно зачем для этих целей накладывают блокировки на InventItemLocation

У нас используется партионный учет, и при резервировании не хотелось бы блокировать InventItemLocation с пустой аналитикой (фактически мы целую номенклатуру блокируем). Возможно ли это как-то обойти.

Непонятно почему разработчики Аксапты решили задачу проверки отрицательного склада блокировкой на InventItemLocation. Можно было бы попробовать блокировать InventSum только по нужной аналитике. Даже методы есть подходящие.

см.
\Classes\InventUpdateTTSControl\inventSumSelectLocked
и
\Classes\InventUpdateTTSControl\inventItemLocationSelectLocked


P.S. Ax 3.0 SP5
Старый 17.11.2008, 12:18   #6  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,875 / 3123 (112) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Интересно, а как с обстоит дело с блокировкой таблицы InventItemLocation в Ax 4.0 - 2009 ?
Блокировки по InventSum там оптимизировали.
Старый 17.11.2008, 12:48   #7  
Raven Melancholic is offline
Raven Melancholic
Участник
Аватар для Raven Melancholic
Самостоятельные клиенты AX
Лучший по профессии 2015
 
2,158 / 1286 (47) ++++++++
Регистрация: 21.03.2005
Адрес: Москва-Петушки
Цитата:
Сообщение от Logger Посмотреть сообщение
Интересно, а как с обстоит дело с блокировкой таблицы InventItemLocation в Ax 4.0 - 2009 ?
Блокировки по InventSum там оптимизировали.
В DAX4 такой механизм блокировки (путем блокирования InventItemLocation) уже не используется. Сам механизм резервирования здорово переписан и работает не напрямую с InventSum, а путём накапливания изменений и записью при помощи прямого доступа к базе..
За это сообщение автора поблагодарили: Logger (1).
Старый 24.11.2008, 08:00   #8  
ViV is offline
ViV
Axapta Retail User
Самостоятельные клиенты AX
Axapta Retail User
 
200 / 79 (3) ++++
Регистрация: 14.09.2005
:)
Цитата:
Сообщение от Logger Посмотреть сообщение
Так что удалив записи в InventItemLocation вы конечно решите проблему блокировок, но можете что нить в системе поломать. Например, отвалится запрет списания в минус а также пропадут номенклатуры из номенклатурного справочника.
Вы не совсем корректно поняли ответы - записи из таблицы удалять не советовалось, в этом смысла нет. Мы в итоге убрали просто код из класса InventUpdateTTSControl, который блокировал записи. За прошедшее время проблем никаких не выявлено, с остатками все отлично, блокировки исчезли.
За это сообщение автора поблагодарили: Logger (1).
Старый 24.11.2008, 12:21   #9  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,875 / 3123 (112) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Цитата:
Сообщение от ViV Посмотреть сообщение
Вы не совсем корректно поняли ответы - записи из таблицы удалять не советовалось, в этом смысла нет. Мы в итоге убрали просто код из класса InventUpdateTTSControl, который блокировал записи. За прошедшее время проблем никаких не выявлено, с остатками все отлично, блокировки исчезли.
Спасибо.
В принципе это и интересовало.
Судя по всему этот код нужен для корректной работы системы множественных складских транзакций IMTS. А когда она выключена - он не нужен.

Последний раз редактировалось Logger; 24.11.2008 в 12:25.
Старый 24.11.2008, 12:25   #10  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,875 / 3123 (112) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
А партионный учет или какая -нить другая высокоселективная аналитика (серийные номера, ГТД) у вас используется ?
Вопрос связан с тем что по идее отключение этого кода не поможет если партии не используются. - Просто появятся блокировки на InventSum вместо InventItemLocation.
Старый 24.11.2008, 12:44   #11  
ViV is offline
ViV
Axapta Retail User
Самостоятельные клиенты AX
Axapta Retail User
 
200 / 79 (3) ++++
Регистрация: 14.09.2005
Цитата:
Сообщение от Logger Посмотреть сообщение
Спасибо.
В принципе это и интересовало.
Судя по всему этот код нужен для корректной работы системы множественных складских транзакций IMTS. А когда она выключена - он не нужен.
Опять не соглашусь. У нас IMTS включена. Особых проблем возникших при комментировании того кода не отмечено.
У нас есть и серийные номера, и партии, и ГТД. Полный набор
Другое дело что в InventItemLocation у нас только записи с InventDimId = Axapta.
Старый 24.11.2008, 13:46   #12  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,875 / 3123 (112) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Ну и ну...
Вот так раз.

Ну значит надо еще код поковырять
В общем судя по комментариям эти блокировки как раз для работы системы множественных складских транзакций нужны. А база данных у вас какая ? Подозреваю, MS SQL ?
Старый 24.11.2008, 13:50   #13  
ViV is offline
ViV
Axapta Retail User
Самостоятельные клиенты AX
Axapta Retail User
 
200 / 79 (3) ++++
Регистрация: 14.09.2005
Цитата:
Сообщение от Logger Посмотреть сообщение
В общем судя по комментариям эти блокировки как раз для работы системы множественных складских транзакций нужны. А база данных у вас какая ? Подозреваю, MS SQL ?
А можно привести комментарии, по которым вы сделали такой вывод?

Верно, MS SQL 2000. Ax 3.0 SP3
Старый 24.11.2008, 14:10   #14  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,875 / 3123 (112) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
\Classes\InventUpd_Reservation\updateReserveMore
X++:
    appl.inventUpdateTTSControl().setTTSBeginLock();

    if (movement.mustBeOnhandLocked(false))
        appl.inventUpdateTTSControl().inventItemLocationSelectLocked(movement.itemId());

\Classes\InventUpdateTTSControl\inventItemLocationSelectLocked
X++:
/*
Lock on table inventItemLocation is used for serialisation of updating processes - lock is only used,
if required when instantiating class: InventOnHand (when 'lock' -flag is set to 'true')
*/

public inventItemLocation inventItemLocationSelectLocked(ItemId itemId)
{
    InventItemLocation inventItemLocation;
    ;
   ...
}

\Classes\InventUpdateTTSControl\setTTSBeginLock
X++:
/*
Begin secondary transaction (used to establish serializing lock in table InventItemLocation)
*/
public void setTTSBeginLock()
{
    InventUpdateTTSMode tmpTTSMode;
    ;
    if (!this.mustUseTTSSystem())
        return;
   ...
}
обращаю внимание на этт кусок кода
X++:
    if (!this.mustUseTTSSystem())
        return;
Старый 24.11.2008, 14:11   #15  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,875 / 3123 (112) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
X++:
/*
Used all over to detect whether TTSSystem is active.
If method setTTSMode has not been called before first call to this method, it will default to
"Standard" which means that TTSSystem is not active. Generally method setTTSMode is called when
instantiating class hierarchy InventUpdate
*/

public boolean mustUseTTSSystem()
{
    if (TTSMode == InventUpdateTTSMode::UnDecided && appl.ttsLevel())
        TTSMode = InventUpdateTTSMode::Standard;

    if (!InventUpdateTTSControl::tTSSystemEnabled())
        return false;

    return TTSMode == InventUpdateTTSMode::TTSsystem ? true : false;
}
Старый 24.11.2008, 15:06   #16  
ViV is offline
ViV
Axapta Retail User
Самостоятельные клиенты AX
Axapta Retail User
 
200 / 79 (3) ++++
Регистрация: 14.09.2005
Спасибо, уточню что именно было закомментировано:
\Classes\InventUpdateTTSControl\inventItemLocationSelectLocked закомментирован полностью,

\Classes\InventUpdateTTSControl\setLockInventSumCreate до состояния:
X++:
public void setLockInventSumCreate(InventTrans inventTrans)
{
//    InventItemLocation  inventItemLocation;
//    InventDim           inventDim;
//    ;

    if (!this.mustUseTTSSystem())
        inventDim::find(inventTrans.inventDimId,true);
    else
    {
//        inventItemLocation.setConnection(this.dBConnectionLock());

//        select firstonly forupdate inventItemLocation
//            index hint ItemDimIdx
//            where inventItemLocation.ItemId         == inventTrans.ItemId   &&
//                  inventItemLocation.inventDimId    == InventDim::inventDimIdBlank();
    }
}
Все. Собственно блокировки у нас вызывал именно inventItemLocationSelectLocked.
Старый 24.11.2008, 15:26   #17  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,875 / 3123 (112) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Это не опечатка при копировании ?
X++:
    if (!this.mustUseTTSSystem())
        inventDim::find(inventTrans.inventDimId,true);
Зачем InventDim блокировать ?
Она же в общем случае может разным номенклатурам соответствовать.
Сюда по идее
X++:
Inventsum::find(..., true);
просится
Старый 24.11.2008, 16:30   #18  
ViV is offline
ViV
Axapta Retail User
Самостоятельные клиенты AX
Axapta Retail User
 
200 / 79 (3) ++++
Регистрация: 14.09.2005
Цитата:
Сообщение от Logger Посмотреть сообщение
Это не опечатка при копировании ?
X++:
    if (!this.mustUseTTSSystem())
        inventDim::find(inventTrans.inventDimId,true);
Зачем InventDim блокировать ?
Она же в общем случае может разным номенклатурам соответствовать.
Сюда по идее
X++:
Inventsum::find(..., true);
просится
Это стандартный функционал. Зачем - ответить затрудняюсь. Тем более с учетом, что этот курсор никакой переменной не присваивается.
Теги
резервирование, склад, блокировка, ax3.0

 


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

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

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