Показать сообщение отдельно
Старый 18.06.2009, 17:32   #1  
petergunn is offline
petergunn
Участник
 
118 / 274 (10) ++++++
Регистрация: 30.08.2005
Адрес: Tyumen
? Баг в InventItemType?
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 к ним можно добавить еще метод:
  • valueCanNotHaveBOM()
Подозрение в этих методах вызывает использование итератора 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));
    }
Изображения
 
За это сообщение автора поблагодарили: kashperuk (5), konopello (3), Bober (1).