AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 09.12.2010, 14:02   #1  
someOne is offline
someOne
Участник
Аватар для someOne
 
174 / 429 (15) +++++++
Регистрация: 11.12.2008
Адрес: Москва
Функция 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 функция всегда возвращает "Предложение" (значение enum : 1). (или возвращает ноль)

Дело в ошибке конвертации 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  
samolalex is offline
samolalex
Участник
Аватар для samolalex
Самостоятельные клиенты AX
 
259 / 107 (4) +++++
Регистрация: 18.06.2010
Адрес: Москва
По-моему, не нужно ничего переделывать в методе 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  
someOne is offline
someOne
Участник
Аватар для someOne
 
174 / 429 (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());
Старый 09.12.2010, 15:58   #4  
samolalex is offline
samolalex
Участник
Аватар для samolalex
Самостоятельные клиенты AX
 
259 / 107 (4) +++++
Регистрация: 18.06.2010
Адрес: Москва
Да, не спорю, что теряется смысловое содержание типа первого параметра метода valueFromXMLNode.
Вот здесь, вроде как, уже обсуждался подобный недочет примерно год назад.
__________________
С уважением, Александр.
За это сообщение автора поблагодарили: someOne (1).
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
AX2009 RU-6 не работает на новой БД Wamr DAX: Администрирование 5 24.06.2014 14:36
Не работает корректировка налога в стандартной AX2009 Pustik DAX: Функционал 17 23.11.2012 15:00
ax2009 cu5: не работает с зарплатой? mazzy DAX: Прочие вопросы 8 02.08.2010 11:28
Функция Any2Str не работает Горбунов Дмитрий DAX: Программирование 11 03.06.2009 15:11
Одна и та же функция в 2х и 3х-уровневой конфигурации: в 2х-работает, в 3х- нет Сергей Щербак DAX: Администрирование 4 07.04.2004 18:25

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 03:49.