13.12.2011, 22:11 | #1 |
Участник
|
Dates In An Extended Query Range
Источник: http://alexvoy.blogspot.com/2011/12/...ery-range.html
============== Let's say we need to range all the BOM versions that are active as of today. For this purpose we can use an extended range in the query. { QueryBuildRange qbr; ; if(!_args.record()) return; // there is an active caller! switch (_args.record().TableId) { case tablenum(InventTable): inventTable = element.args().record(); this.query().dataSourceTable(tablenum(InventTable)).addRange(fieldnum(InventTable, ItemId)).value(inventTable.ItemId); qbr = this.query().dataSourceTable(tablenum(BOMVersion)).addRange(fieldnum(BOMVersion, RecId)); qbr.value('(fromDate = '+date2StrXpp(today())+')'); break; The final SQL query will look like this (a fragment): = BOMVersion.ItemId AND ((Active = 1)) AND (((fromDate = 13\12\2011))) JOIN * FROM BOM(BOM_1) ORDER BY BOM.LineNum ASC ON BOMVersion.BOMId = BOM.BOMId The idea was taken from the AX forum (in Russian). Источник: http://alexvoy.blogspot.com/2011/12/...ery-range.html
__________________
Расскажите о новых и интересных блогах по Microsoft Dynamics, напишите личное сообщение администратору. |
|
14.12.2011, 02:00 | #2 |
Участник
|
Коллега давно подпилил queryValue(), чтобы тот поддерживал в т.ч. extended range. К слову, особым образом в этом случае надо обрабатывать не только даты, но и енумы.
|
|
14.12.2011, 09:00 | #3 |
Участник
|
|
|
15.12.2011, 07:38 | #4 |
Участник
|
можно подробнее?
__________________
Felix nihil admirari |
|
15.12.2011, 10:50 | #5 |
Участник
|
Енумы в расширенном 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); } |
|
|
За это сообщение автора поблагодарили: Logger (5), wojzeh (1), alex55 (1), S.Kuskov (3), pedrozzz (1). |
Теги |
query, range |
|
|