Axapta 3.0 SP5, Dynamics Ax 4.0 SP2 (application version: 4.0.2501.347), Dynamics Ax2009 (application version: 5.0.1001.176)
Есть подозрение что ряд методов класса
InventItemType на
SYS слое содержат потенциальный (скрытый) bug в реализации. Конкретнее речь о методах:
- queryAddBomRouteItemTypes(...)
- valueCanBeProduced()
- valueCanBeTransferred()
- valueCanHaveBOM()
- valueMustBeReqCreated()
- valueMustInventBeControlled()
В
AX2009 к ним можно добавить еще метод:
Подозрение в этих методах вызывает использование итератора
i конструкции цикла в качестве значения перечисления
ItemType :
X++:
...
DictEnum dictEnum;
Counter i;
InventItemType inventItemType;
str itemTypeTxt;
;
dictEnum = new DictEnum(enumnum(ItemType));
for (i=0;i<dictEnum.values();i++)
{
inventItemType = InventItemType::construct(i);
...
itemTypeTxt += queryValue(dictEnum.value2Name(i));
}
На
SYS слое значения
base enum ItemType (при общем количестве
dictEnum.values() = 3) заведены последовательно:
Item = 0, BOM = 1, Service = 2 и бага не проявляется.
В российской локализации добавлен 4-ый элемент:
Asset_RU = 100 (в версии 3.0 SP3
Asset_RU = 3, в версии 3.0 SP4
Asset_RU = 100), после чего бага в реализации методов уже становится заметной, т.к. порядковый номер элемента перечисления не совпадает с его значением.
Для наглядности на примере пары (дополняющих друг друга по смыслу) методов
InventItemType::valueCanHaveBOM() и
InventItemType::valueCanNotHaveBOM() в
AX2009:
X++:
static void jbInventItemTypeCheck(Args _args)
{
;
info( strfmt( "%1", InventItemType::valueCanHaveBOM() ) ) ;
info( strfmt( "%1", InventItemType::valueCanNotHaveBOM() ) ) ;
}
результат:
Цитата:
Сообщение (18:47:01)
- Спецификация
- Номенклатура,Услуга,3
В качестве варианта исправления (использовать
dictEnum.index2XXXX()):
X++:
...
DictEnum dictEnum;
Counter i;
InventItemType inventItemType;
str itemTypeTxt;
;
dictEnum = new DictEnum(enumnum(ItemType));
for (i=0;i<dictEnum.values();i++)
{
inventItemType = InventItemType::construct(dictEnum.index2Value(i));
...
itemTypeTxt += queryValue(dictEnum.index2Name(i));
}
или
X++:
...
DictEnum dictEnum;
Counter i;
InventItemType inventItemType;
str itemTypeTxt;
ItemType itemType;
;
dictEnum = new DictEnum(enumnum(ItemType));
for (i=0;i<dictEnum.values();i++)
{
itemType = dictEnum.index2Value(i);
inventItemType = InventItemType::construct(itemType);
...
itemTypeTxt += queryValue(dictEnum.value2Name(itemType));
}