Показать сообщение отдельно
Старый 13.09.2017, 09:06   #12  
mayk is offline
mayk
Участник
Аватар для mayk
 
43 / 65 (3) ++++
Регистрация: 07.03.2008
Цитата:
Сообщение от kashperuk Посмотреть сообщение
К примеру если я в XML хочу эти значения запихать, или в какой-то строковой ключ хранимый в БД.
Для БД есть SqlSystem(есть даже в ax3). Он не поддерживает DateTime и вроде даже не боится Little Bobby Tables

X++:
    info(new SqlSystem().sqlLiteral(DateTimeUtil::utcNow()));
    info(new SqlSystem().sqlLiteral("Robert'); DROP TABLE Students;--"));
    info(new SqlSystem().sqlLiteral(-1234.567890123));
выдаст

Цитата:
'1900-01-01T00:00:00'
N'Robert''); DROP TABLE Students;--'
-1.234567890123E3
Цитата:
Сообщение от dech Посмотреть сообщение
Практически любой тип можно преобразовать в строку простой операцией:
X++:
s = strFmt("%1", value);
А вот обратное преобразование... тут все от типа зависит.
Для большинства типов есть трюк с использованием anytype.

anytype хоть и зовётся any, но на самом деле он запоминает тип после первого присвоения. Последующие попытки присвоения запустят штатный механизм преобразований между типами.

str же преобразуется почти во всё, кроме DateTime, к сожалению

X++:
    str typeBinding;
    anytype any = typeBinding;
    transDate transDate = today(), transDateTest;
    real realNum = -12345.789012345, realNumTest;
    int64 i64 = 12345678901234567, i64Test;
    NoYes enum = NoYes::Yes, enumTest;
    UtcDateTime dateTime = DateTimeUtil::utcNow(), dateTimeTest;
    ;
    Debug::assert(typeof(any) == Types::String);

    any = transDate;
    transDateTest = any;
    Debug::assert(transDateTest == transDate);

    any = realNum;
    realNumTest = any;
    Debug::assert(realNumTest == realNum);

    any = i64;
    i64Test = any;
    Debug::assert(i64Test == i64);

    any = enum;
    enumTest = any;
    Debug::assert(enumTest == enum);

    any = dateTime;
    dateTimeTest = any;
    info("OK");