Цитата:
Сообщение от
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