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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 05.07.2017, 15:25   #10  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,971 / 3267 (116) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Этот Newtonsoft.Json имеет проблемы при передаче из аксапты real типа. Т.е. всех суммовых значений.
Вот пример
X++:
static void Job3991_axforum(Args _args)
{
    GRD_JsonWriter      jsonWriter;
    real                r;
    System.Double       netDouble;
    System.Single       netSingle;
    System.Decimal      netDecimal;
    str                 ret;
    Newtonsoft.Json.Linq.JTokenWriter       writer;
    Newtonsoft.Json.Linq.JObject    jObject;
    ClrObject                       clrObject;
    System.Globalization.NumberFormatInfo numinf;
    ;

    r = 268.17;

    writer = new Newtonsoft.Json.Linq.JTokenWriter();
    writer.WriteStartObject();
    
    writer.WritePropertyName("params");
    writer.WriteStartObject();

    writer.WritePropertyName("VATAmount_xppReal");
    writer.WriteValue(r);

    writer.WritePropertyName("VATAmount_Row");
    writer.WriteRawValue("268.17");

    netDouble = r;
    writer.WritePropertyName("VATAmount_netDouble");
    writer.WriteValue(netDouble);

    netSingle = r;
    writer.WritePropertyName("VATAmount_netSingle");
    writer.WriteValue(netSingle);

    netDecimal = New System.Decimal(netDouble);
    writer.WritePropertyName("VATAmount_netDecimalViaDouble");
    writer.WriteValue(netDecimal);

    netDecimal = New System.Decimal(netSingle);
    writer.WritePropertyName("VATAmount_netDecimalViaSingle");
    writer.WriteValue(netDecimal);


    numinf = new System.Globalization.NumberFormatInfo();
    numinf.set_NumberDecimalSeparator(".");
    netDecimal = System.Decimal::Parse("268.17", numinf);
    info(CLRInterop::getAnyTypeForObject(netDecimal));
    writer.WritePropertyName("VATAmount_netDecimal");
    writer.WriteValue(netDecimal);

    writer.WriteEndObject();
    writer.WriteEndObject();
    
    clrObject = writer.get_Token();
    jObject = clrObject;
    ret = jObject.ToString();

    info(ret);

}
На выходе дает
Цитата:
{
"params": {
"VATAmount_xppReal": 268.16999999999996,
"VATAmount_Row": 268.17,
"VATAmount_netDouble": 268.16999999999996,
"VATAmount_netSingle": 268.16999999999996,
"VATAmount_netDecimalViaDouble": 268.17,
"VATAmount_netDecimalViaSingle": 268.17,
"VATAmount_netDecimal": 268.17
}
}
В общем караул. Явно где-то точность теряется так что целые копейки перескакивают в дробные.
Приходится данные через System.Decimal передавать. Или самим значение параметра в строку конвертировать и пихать туда через WriteRawValue

Последний раз редактировалось Logger; 05.07.2017 в 15:45.
Теги
aif, ax2012, azure service bus, json, округление

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
daxdilip: How to: Configure Dynamics AX AIF Services to listen for SSL Requests (https) Blog bot DAX Blogs 0 23.01.2011 10:12
emeadaxsupport: What changes are required if we change the Business Connector Proxy used by AX 2009 Generated AIF Web services Blog bot DAX Blogs 0 29.03.2010 15:05
Channel9: Microsoft Dynamics AX 2009 AIF Web Services Screencast Blog bot DAX Blogs 0 17.06.2009 17:05
axStart: InfoPath with default AIF web services Blog bot DAX Blogs 1 15.05.2008 02:27
Pokluda: Outbound web service (AIF) Blog bot DAX Blogs 0 28.10.2006 17:43

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

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

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