Показать сообщение отдельно
Старый 15.12.2011, 10:50   #5  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5813 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Цитата:
Сообщение от wojzeh Посмотреть сообщение
можно подробнее?
Енумы в расширенном Range должны быть всегда представлены числовыми значениями, а не метками. Кроме того, для строковых литералов надо добавлять обрамляющие двойные кавычки. Вот как выглядит подправленный SysQuery::value():
X++:
//public static str value(anytype a)                                        //-Исправление для расширенного Range
public static str value(anytype a, boolean _isExtendedRangeSyntax = false)  //+Исправление для расширенного Range
{
    str quotableStr = ' *",.()\\';
    str s;
    int t;

    str doEscape(str s1)
    {
        int i = 1;
        int pos;
        int len = strlen(s1);
        str result;
        pos = strfind(s1, quotableStr, i, len - i + 1);
        while (pos)
        {
            result += substr(s1, i, pos - i) + '\\' + substr(s1, pos, 1);
            i = pos + 1;
            if (i<=len)
                pos = strfind(s1, quotableStr, i, len - i + 1);
            else
                pos = 0;
        }

        if (i == 1)
            return s1;

        if (i<=len)
            result += substr(s1, i, len - i + 1);

        return result;
    }

    t = typeof(a);
    switch (t)
    {
        case Types::Enum:
            // Исправление для расширенного Range -->
            if (_isExtendedRangeSyntax)
            {
                return int2str(a);
            }
            // Исправление для расширенного Range <--
            return enum2Value(a);
        case Types::Real:
            return num2str(a,0,16,1,0);
        case Types::Date:
            // Исправление для расширенного Range -->
            if (_isExtendedRangeSyntax)
            {
                return date2StrXpp(a);
            }
            // Исправление для расширенного Range <--
        case Types::UtcDateTime:
            return strfmt('\"%1\"',a);  // must be double quotes
        case
            Types::String,
            Types::RString,
            Types::VarString:
        {
            s = a;
            if (!s)
                return SysQuery::valueEmptyString();
            // Исправление для расширенного Range -->
            if (_isExtendedRangeSyntax)
            {
                return strfmt(@'"%1"', doEscape(s));
            }
            // Исправление для расширенного Range <--
            return strfmt('%1',doEscape(s));  // must be double quotes
        }
    }
    // <GEEU>

    // to avoid stack trace on unsupported value 'null'
    if (! new DictEnum(enumnum(Types)).value2Symbol(t))
        return SysQuery::valueUnlimited();

        // </GEEU>
    return strfmt('%1',a);
}
В Global::queryValue(), соотв., тоже добавлен опциональный параметр _isExtendedRangeSyntax
За это сообщение автора поблагодарили: Logger (5), wojzeh (1), alex55 (1), S.Kuskov (3), pedrozzz (1).