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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 14.01.2014, 14:03   #1  
АртемМелихов is offline
АртемМелихов
Участник
Аватар для АртемМелихов
 
120 / 10 (1) +
Регистрация: 18.12.2013
Адрес: Samara
:( Преобразование в real без округления?
Доброе время суток. Ситуация такая:
аксапта 3
имею переменную типа anytype , которая хранит 12700.00
имею переменную типа real.
если положить переменную 1 в 2 то получаю во 2 12.00
Помогите, пожалуйста, произвести преобразование. Облазил все интернеты, пречитал все мануалы по типам аксапты.
X++:
 ret.Qty1 = Fields.itemIdx(costsLineTbl.ColumnLoad - 1).Value();
                    temp = Fields.itemIdx(costsLineTbl.ColumnLoad - 1).Value();
                    //ret.Qty1 = str2num(Fields.itemIdx(costsLineTbl.ColumnLoad - 1).Value());
                    info(strfmt('C %1 %2 %3', Fields.itemIdx(costsLineTbl.ColumnLoadPaymDesk - 1).value(),num2str(ret.Qty1,3,3,3,3),temp));

Последний раз редактировалось АртемМелихов; 14.01.2014 в 14:06.
Старый 14.01.2014, 14:24   #2  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5798 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Для начала, если переменная типа anytype хранит вещественное число (12700.00), то у нее фактический тип уже - real, поэтому с ней можно работать так же, как с другими переменными типа real, без лишних выкрутасов. В данном случае, по-моему, путаница возникает из-за своеобразного преобразования значения переменной в строку для вывода в инфолог - уберите num2str() и посмотрите, что получится.
Старый 14.01.2014, 14:29   #3  
АртемМелихов is offline
АртемМелихов
Участник
Аватар для АртемМелихов
 
120 / 10 (1) +
Регистрация: 18.12.2013
Адрес: Samara
Цитата:
Сообщение от gl00mie Посмотреть сообщение
Для начала, если переменная типа anytype хранит вещественное число (12700.00), то у нее фактический тип уже - real, поэтому с ней можно работать так же, как с другими переменными типа real, без лишних выкрутасов. В данном случае, по-моему, путаница возникает из-за своеобразного преобразования значения переменной в строку для вывода в инфолог - уберите num2str() и посмотрите, что получится.
путаница возникла в результате применения метода "метод научного тыка". В начале было простое присвоение из anytype real, _real = _anytype и получал следующие - 12.00 = 12 700 ,00. Поэтому я пробовал и перегонять сначало в строку, а потом в реал. Пробовал any2real. Ничего не изменило ситуацию.
Старый 14.01.2014, 14:45   #4  
АртемМелихов is offline
АртемМелихов
Участник
Аватар для АртемМелихов
 
120 / 10 (1) +
Регистрация: 18.12.2013
Адрес: Samara
обновление статуса ситуации. Данные загружал из excel. ячейки были финансового формата. Поменял на числовой без разделителя и сразу все ЗАРАБОТАЛО! Но вопрос все актуален. Не править же каждый раз документы перед загрузкой в аксапту.
Старый 14.01.2014, 15:33   #5  
maldini is offline
maldini
Участник
 
103 / 30 (2) +++
Регистрация: 06.03.2007
Адрес: москва
Цитата:
Сообщение от АртемМелихов Посмотреть сообщение
Доброе время суток. Ситуация такая:
аксапта 3
имею переменную типа anytype , которая хранит 12700.00
имею переменную типа real.
если положить переменную 1 в 2 то получаю во 2 12.00
Помогите, пожалуйста, произвести преобразование. Облазил все интернеты, пречитал все мануалы по типам аксапты.
X++:
 ret.Qty1 = Fields.itemIdx(costsLineTbl.ColumnLoad - 1).Value();
                    temp = Fields.itemIdx(costsLineTbl.ColumnLoad - 1).Value();
                    //ret.Qty1 = str2num(Fields.itemIdx(costsLineTbl.ColumnLoad - 1).Value());
                    info(strfmt('C %1 %2 %3', Fields.itemIdx(costsLineTbl.ColumnLoadPaymDesk - 1).value(),num2str(ret.Qty1,3,3,3,3),temp));
Я думаю у тебя в anytype строка, удали пробел между 2 и 900.00 и все ок.

X++:
    anyType a = "2 900.00";
    real    b = a;
    ;
     info(strFmt("%1", typeof(a)));
     info(strFmt("%1", b));
    a = strrem(a,' ');
    b = a;
    info(strFmt("%1", b));
Изображения
 

Последний раз редактировалось maldini; 14.01.2014 в 16:00.
Старый 14.01.2014, 15:36   #6  
АртемМелихов is offline
АртемМелихов
Участник
Аватар для АртемМелихов
 
120 / 10 (1) +
Регистрация: 18.12.2013
Адрес: Samara
Цитата:
Сообщение от maldini Посмотреть сообщение
Я думаю у тебя в anytype строка, удали пробел между 2 и 900.00 и все ок.
я проверял тип anytype с помощью typeOf(), вернул 1.
Старый 14.01.2014, 15:49   #7  
maldini is offline
maldini
Участник
 
103 / 30 (2) +++
Регистрация: 06.03.2007
Адрес: москва
Цитата:
Сообщение от АртемМелихов Посмотреть сообщение
я проверял тип anytype с помощью typeOf(), вернул 1.
При преобразовании в anyType в real DAX думает что пробел это конец записи. В job выше видно что и как происходит.

Последний раз редактировалось maldini; 14.01.2014 в 16:14.
Старый 14.01.2014, 16:21   #8  
АртемМелихов is offline
АртемМелихов
Участник
Аватар для АртемМелихов
 
120 / 10 (1) +
Регистрация: 18.12.2013
Адрес: Samara
Цитата:
Сообщение от maldini Посмотреть сообщение
При преобразовании в anyType в real DAX думает что пробел это конец записи. В job выше видно что и как происходит.
нет. Нету там пробелов. Нету в excel и нету в переменной.
вот доказательство.
X++:
void  loadEx(anytype _date)
{   int i;
    str _str;
    str temp = "";
    ;
    _str = any2str(_date);
    info(_date);
    temp= "";
    for (i=1;i<strlen(_str);i++)
    {
        if (subStr(_str,i,1) != " ")
        {
            temp += subStr(_str,i,1);
        }
        else info ("delete  ' '");
    }
    info ("result "+ temp);
}
Старый 14.01.2014, 16:26   #9  
maldini is offline
maldini
Участник
 
103 / 30 (2) +++
Регистрация: 06.03.2007
Адрес: москва
Цитата:
Сообщение от АртемМелихов Посмотреть сообщение
нет. Нету там пробелов. Нету в excel и нету в переменной.
вот доказательство.
X++:
void  loadEx(anytype _date)
{   int i;
    str _str;
    str temp = "";
    ;
    _str = any2str(_date);
    info(_date);
    temp= "";
    for (i=1;i<strlen(_str);i++)
    {
        if (subStr(_str,i,1) != " ")
        {
            temp += subStr(_str,i,1);
        }
        else info ("delete  ' '");
    }
    info ("result "+ temp);
}
Возможно там какой то другой символ, но факт остается фактом. Мне кажется надо копать в этом направлении. Например сравнит длину строки с тем что на экране.
что в info если написать так
X++:
 info(strFmt("%1", typeof(_date)));
 info(strFmt("%1  длинна строки %2", _date,strLen(_date)));

Последний раз редактировалось maldini; 14.01.2014 в 16:38.
За это сообщение автора поблагодарили: АртемМелихов (1).
Старый 14.01.2014, 16:36   #10  
АртемМелихов is offline
АртемМелихов
Участник
Аватар для АртемМелихов
 
120 / 10 (1) +
Регистрация: 18.12.2013
Адрес: Samara
Цитата:
Сообщение от maldini Посмотреть сообщение
Возможно там какой то другой символ, но факт остается фактом. Мне кажется надо копать в этом направлении. Например сравнит длину строки с тем что на экране.
что в info если написать так
X++:
 info(strFmt("%1", typeof(_date)));
прошу прошения, там есть пробелы. Загнал в строку, смотрите код выше, и теперь проверил по Ascii кодам. Есть 160 код. Спасибо, Сейчас поробую убить его и снова перевести.
Старый 14.01.2014, 16:44   #11  
АртемМелихов is offline
АртемМелихов
Участник
Аватар для АртемМелихов
 
120 / 10 (1) +
Регистрация: 18.12.2013
Адрес: Samara
все! Ура, спасибо огромное за совет! сделал метод обработки переменной.
X++:
real  loadEx(anytype _date)
{   int i;
    str _str;
    str temp = "";
    real result;
    ;
    _str = any2str(_date);
   // info(_date);
    temp= "";
    for (i=1;i<strlen(_str)+1;i++)
    {
       // info(strfmt(" %1",char2Num(_str,i)));
        if (char2Num(_str,i) != 160)
        {
            temp += subStr(_str,i,1);
        }
       // else info ("delete  ' '");
    }
    //info ("result "+ temp);
    result = str2num(temp);
   // info(strfmt("real %1",result));
   return result;
}
Старый 15.01.2014, 08:26   #12  
LeonDerCom is offline
LeonDerCom
Участник
 
45 / 20 (1) +++
Регистрация: 08.10.2012
АртемМелихов
X++:
real  loadEx(anytype _date)
{  
if ( typeof(_date) == Types::String)
    {
        return str2num(strReplace(any2str(_date), num2Char(160), ''));
    }
    else
    {
        throw error("Косяк с _date вышел");
    }
         }

Последний раз редактировалось LeonDerCom; 15.01.2014 в 08:57. Причина: Добавлена проверка
За это сообщение автора поблагодарили: АртемМелихов (1).
Старый 15.01.2014, 08:55   #13  
АртемМелихов is offline
АртемМелихов
Участник
Аватар для АртемМелихов
 
120 / 10 (1) +
Регистрация: 18.12.2013
Адрес: Samara
Цитата:
Сообщение от LeonDerCom Посмотреть сообщение
АртемМелихов
X++:
real  loadEx(anytype _date)
{  
         return str2num(strReplace(any2str(_date), num2Char(160), ''));
}
Крутяк! Вот что значит, не прочитать весь функционал строк =)
Теги
anytype, real

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
emeadaxsupport: AX for Retail 2012 R2: Troubleshooting the Real-time Service Blog bot DAX Blogs 0 31.12.2012 11:13
emeadaxsupport: AX for Retail 2012 R2: Installing the Real-time Service Blog bot DAX Blogs 0 19.12.2012 11:11
Преобразование строк UTF-8 в ANSI в DAX 2009 (без файловых операций) Ar DAX: Программирование 0 21.08.2012 19:24
Несоответствие типов: ожидалось real, а получено int S.Kuskov DAX: Программирование 8 23.06.2011 13:03
daxsol: Axapta Kernel Functions Blog bot DAX Blogs 1 16.05.2009 19:22

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

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

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