Цитата:
Сообщение от
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());