09.12.2010, 14:02 | #1 |
Участник
|
Функция global::valueFromXMLNode() в Ax2009 работает не корректно
Ax2009 RU5
Для примера кода 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(enum2int(SalesType::Sales))); SalesType = global::valueFromXMLNode(Types::Enum, xmlNode).value("value"); info(strFmt("%1", SalesType)); } Дело в ошибке конвертации enum - она умеет возвращать только 0 или 1. Ошибку решил исправить так: X++: static Struct valueFromXMLNode (Types t, XmlNode n) { #define.value('value') Struct retval; int enum; //было boolean enum ; //validate arguments befor using them if (n == null) return null; // --> if (t == types::ENUM) { retval = new struct(types::Integer, #value); } else { retval = new struct(t, #value); } // <-- |
|
09.12.2010, 14:41 | #2 |
Участник
|
По-моему, не нужно ничего переделывать в методе 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.
__________________
С уважением, Александр. Последний раз редактировалось samolalex; 09.12.2010 в 15:09. |
|
09.12.2010, 15:50 | #3 |
Участник
|
Цитата:
Сообщение от 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. В методе методе 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()); |
|
09.12.2010, 15:58 | #4 |
Участник
|
Да, не спорю, что теряется смысловое содержание типа первого параметра метода valueFromXMLNode.
Вот здесь, вроде как, уже обсуждался подобный недочет примерно год назад.
__________________
С уважением, Александр. |
|
|
За это сообщение автора поблагодарили: someOne (1). |