Основной ответ: Base UOM cannot be changed for the item in use.
В общем, что означает in use
, означает, что этот элемент инвентаря используется в деталях транзакции выпущенного документа.
Механизм проверки расположенв ЦАП, использующих PreventEditIfExists
класс.
InventoryItem ЦАП имеет общий запрос проверки:
public abstract class baseUnit : PX.Data.IBqlField
{
public class PreventEditIfExists<TSelect> : PreventEditOf<baseUnit>.On<InventoryItemMaintBase>.IfExists<TSelect>
where TSelect : BqlCommand, new()
{
protected override String CreateEditPreventingReason(GetEditPreventingReasonArgs arg, Object firstPreventingEntity, String fieldName, String currentTableName, String foreignTableName)
=> PXMessages.Localize(Messages.BaseUnitCouldNotBeChanged);
}
}
Другие ЦАП используют общие типы запросов <TSelect>
для проверки, если Элемент инвентаря равен in use
.
Например, это запрос проверки, определенный в INTran
ЦАП в поле INTran.InventoryID
:
public abstract class inventoryID : PX.Data.IBqlField
{
public class InventoryBaseUnitRule :
InventoryItem.baseUnit.PreventEditIfExists<
Select<INTran,
Where<inventoryID, Equal<Current<InventoryItem.inventoryID>>,
And<released, NotEqual<True>>>>>
{ }
}
Так что, если я создаю новый товарный инвентарь, я могу изменить его BaseUOM
поле, потому что это не in use
нигде.Если я затем создаю инвентарную квитанцию для этого предмета и выпускаю ее, она создает деблокированную транзакцию INTran
, и, таким образом, BaseUOM
для этого предмета становится in use
и недоступна для редактирования.
Я полагаю, что причиной такого поведения является сохранение точности статистики для прошлых транзакций без необходимости кэширования (дублирования) UOM для каждой транзакции на случай, если пользователь изменит ее позже.Если это так, то это компромисс между предоставлением пользователю возможности изменить что-либо в любое время и контролем размера базы данных для большого объема транзакций.
Проверка не является исключительной для транзакций получения.Вы можете найти запросы на проверку для других ЦАП, выполнив поиск исходного кода Acumatica для baseUnit.PreventEditIfExists
на странице исходного кода (SM204570):