Показать сообщение отдельно
Старый 09.12.2010, 15:50   #3  
someOne is offline
someOne
Участник
Аватар для someOne
 
173 / 423 (15) +++++++
Регистрация: 11.12.2008
Адрес: Москва
Цитата:
Сообщение от samolalex Посмотреть сообщение
По-моему, не нужно ничего переделывать в методе valueFromXMLNode.
Вот рабочий код вашей джобы, которая в Axapta 3 "ведет" себя так же, как вы описали относительно AX 2009:
X++:
static void test(Args _args)
{
    xmlNode xmlNode;
    xmlDocument xmlDocument;
    struct content;
    SalesType   SalesType;
    ;

    xmlDocument = new xmlDocument();
    
    xmlNode = xmlDocument.createNode(xmlNodeType::ELEMENT, "test", "");
    
    xmlNode.text(int2str(SalesType::Sales));

    SalesType = global::valueFromXMLNode(Types::Integer, xmlNode).value("value");

    info(strFmt("%1", SalesType));
}
ИМХО:
1)enum2int(SalesType::Sales) - метод enum2int применять необязательно, в 3-ей аксапте я его вовсе не нашел. По идее сам элемент enum'а - это уже целое число.
2) valueFromXMLNode(Types::Enum, xmlNode).value("value") - значение enum'a, как уже говорилось - целое число, поэтому в параметре метода
valueFromXMLNode нужно указать Types::Integer вместо Types::Enum.
Согласен с Вами. Так все будет работать. Но все же это подмена понятий на мой взгляд, а не корректная работа метода. Если элемент относится к типу enum - то его и рассматривать нужно как enum, а не подменять его другим типом данных (в понятии Аксапта), пытаясь обойти явный баг.

В методе методе global::recordFromXMLNode() разработчики сделали так же, но это решение через "задний проход", как мне кажется:

X++:
     t = df.baseType();
        if (t == Types::Enum) //Enums need to be treated as Integers. By defult, Enums are getting treated as a boolean and hence loosing its value.
            t = Types::Integer;
            ...
            content = valueFromXMLNode (t, fieldNode.firstChild());