13.04.2012, 09:53 | #1 |
Участник
|
Выражение в QueryBuildRange с сумой полей
Всем привет!
Пытаюсь написать что-то подобное в АХ 3.0: X++: QueryRun qr; Query query = new Query(); QueryBuildDataSource dsTable2 = query.addDataSource(tableNum(Table2)); QueryBuildRange qbr; Table2 t2; ; qbr = dsTable2.addRange(fieldNum(Table2, DataAreaId)); qbr.value(strfmt('((%1 + %2) > 0)', fieldStr(Table2, Field1), fieldStr(Table2, Field2))); qr = new QueryRun(query); while(qr.next()) { t2 = qr.get(tablenum(Table2)); info(int2str(t2.Field1) + "+" + int2str(t2.Field2)); } Описание ошибки SQL: [Microsoft][ODBC SQL Server Driver][SQL Server]Incorrect syntax near '='. Оператор SQL: SELECT A.FIELD1,A.FIELD2,A.RECVERSION,A.RECID FROM TABLE2 A WHERE ((DATAAREAID=?) AND ((FIELD1+FIELD2)>1=?)) ORDER BY A.DATAAREAID,A.RECID OPTION(FAST 45) В АХ 5.0 все работает. Неужели в 3.0 ничего не получится? |
|
13.04.2012, 10:19 | #2 |
Участник
|
а арифметические выражения в сложных условиях не поддерживались, насколько я помню.
такие условия только на стороне аксапты. |
|
13.04.2012, 14:26 | #3 |
MCT
|
Более детально можно посмотреть здесь,не очень понятно зачем по компании суммировать.
__________________
Axapta book for developer |
|
13.04.2012, 15:27 | #4 |
Участник
|
Это вы о чём? Автор вопроса суммирует Field1 и Field2. Вместо DataAreaId ограничение можно было добавить на любое другое поле. В случае с расширенным синтаксисом это не имеет значения! Я например обычно для этих целей использую поле TableId, чтобы гарантированно исключить пересечения с поьлзовательскими фильтрами
|
|
13.04.2012, 16:45 | #5 |
Участник
|
Цитата:
Сообщение от yahenz
Всем привет!
Пытаюсь написать что-то подобное в АХ 3.0: X++: QueryRun qr; Query query = new Query(); QueryBuildDataSource dsTable2 = query.addDataSource(tableNum(Table2)); QueryBuildRange qbr; Table2 t2; ; qbr = dsTable2.addRange(fieldNum(Table2, DataAreaId)); qbr.value(strfmt('((%1 + %2) > 0)', fieldStr(Table2, Field1), fieldStr(Table2, Field2))); qr = new QueryRun(query); while(qr.next()) { t2 = qr.get(tablenum(Table2)); info(int2str(t2.Field1) + "+" + int2str(t2.Field2)); } Описание ошибки SQL: [Microsoft][ODBC SQL Server Driver][SQL Server]Incorrect syntax near '='. Оператор SQL: SELECT A.FIELD1,A.FIELD2,A.RECVERSION,A.RECID FROM TABLE2 A WHERE ((DATAAREAID=?) AND ((FIELD1+FIELD2)>1=?)) ORDER BY A.DATAAREAID,A.RECID OPTION(FAST 45) В АХ 5.0 все работает. Неужели в 3.0 ничего не получится? В качестве workaround для Axapta 3.0 могу предложить на рассмотрение следующий подход - необходимо постараться избавиться от числовой константной составляющей в правой части неравенства заменив ее выражением (с использованием некоторого числового поля). К примеру для этого можно воспользоваться нехитрым тождеством N = N * RecId / RecId. В частном случе '0' можно представить как 0*RecId или привести Ваше выражение вида (a+b)>0 к тождественному виду a > -1*b X++: qbr.value(strfmt('((%1 + %2) > 0*%3)', fieldStr(Table2, Field1), fieldStr(Table2, Field2), fieldStr(Table2, RecId))); P.S. Тестировалось на версии ядра 1951.7609 (Axapta 3.0 SP3 KR3)
__________________
Dynamics AX 4.0 SP2 |
|
|
За это сообщение автора поблагодарили: yahenz (1). |