07.02.2008, 12:12 | #1 |
Участник
|
Расширенные возможности Query - арифметические операции в условие Where.
Добрый день, уважаемые коллеги!
Существует ли возможность с помощью Query создать запрос, который в SQL выглядит так: X++: select * from ExtendedTestData where Amount + Amount1 - Amount2 <> 0; X++: exQueryString = strfmt("(( %1 + %2 - %3 <> 0 ))", fieldId2name(TableNum(ExtendedTestData), fieldNum(ExtendedTestData, Amount)), fieldId2name(TableNum(ExtendedTestData), fieldNum(ExtendedTestData, Amount1)), fieldId2name(TableNum(ExtendedTestData), fieldNum(ExtendedTestData, Amount2))); А, например, вот такое выражение X++: exQueryString = strfmt("(( %1 + %2 - %3 > 0 ))", ... X++: SELECT A.KEY_,A.AMOUNT,A.AMOUNT1,A.AMOUNT2,A.RECID FROM EXTENDEDTESTDATA A WHERE ((DATAAREAID=?) AND (((AMOUNT+AMOUNT1)-AMOUNT2)>1=?)) ORDER BY A.DATAAREAID,A.RECID OPTION(FAST 1) Со ссылкой http://www.axaptapedia.com/Expressions_in_query_ranges знаком. Собственно, сам вопрос: умеет ли парсер кверей разбирать текст запроса, содержащий арифметические выражения? |
|
07.02.2008, 12:25 | #2 |
Участник
|
А попробуй так:
strfmt("(( %1 + %2 > %3 ))", ... А в первом варианте - <> не для АХ. В АХ это !=. Но такое тоже врядли работает. |
|
07.02.2008, 12:34 | #3 |
Участник
|
Нет. Насколько я знаю ни арифметические операции, ни функции не допустимы в range.
|
|
07.02.2008, 12:48 | #4 |
MCTS
|
Lemming, Так попробуйте:
X++: Query query; ; query = new Query(); query.addDataSource(tablenum(Table1)); query.dataSourceTable(tablenum(Table1)).addRange(fieldNum(Table1, RecId)).value( //strfmt("(( (%1 + %2 - %3) <> 0 ))", strfmt("( (%1+%2*10) != (%3) ) )", fieldStr(Table1, Field2), fieldStr(Table1, Field4), fieldStr(Table1, Field5)) ); new DEV_QueryBrowser().run( query );
__________________
В глухомани, в лесу Несмотря на красу Дни проводит Лиса Патрикевна. Я никак не пойму Отчего, почему Не пускают куму На деревню Последний раз редактировалось Russland; 07.02.2008 в 13:10. |
|
07.02.2008, 14:04 | #5 |
Участник
|
Видимо не судьба...уже массу вариантов перепробовал, не хочет DAX хавать запросы такого плана. Ну ладно, буим знать.
|
|
07.02.2008, 14:11 | #6 |
MCTS
|
Ну как не судьба?
Я же вам уже подсказал Только перепишите под себя Table1 заменяем на ExtendedTestData Field2 - Amount Field4 - Amount1 Field5 - Amount2 strfmt("( (%1+%2) != (%3) ) )", // умножение на 10 было для демонстрации того, что можно вставлять арифметические операции Обратите внимание на то что открывающих скобок 3, а закрывающих 4! Одну скобку кушает RecId
__________________
В глухомани, в лесу Несмотря на красу Дни проводит Лиса Патрикевна. Я никак не пойму Отчего, почему Не пускают куму На деревню Последний раз редактировалось Russland; 07.02.2008 в 14:17. |
|
07.02.2008, 14:12 | #7 |
Member
|
В Query вы не засунете больше, чем можно засунуть в Аксаптовский select. Я так думаю.
__________________
С уважением, glibs® |
|
07.02.2008, 14:25 | #8 |
Участник
|
|
|
07.02.2008, 14:27 | #9 |
Участник
|
Lemming, должно работать. Просто надо чтобы с обоих сторон были поля, насколько я знаю.
Толкьо что проверил - работает. Так что показывайте весь код - будем ошибку искать X++: static void Job1(Args _args) { Query q = new Query(); QueryBuildDataSource qbds = q.addDataSource(tableNum(Table1)); QueryBuildRange qbr = qbds.addRange(fieldNum(Table1, RecId)); QueryRun qr; Table1 table1; ; qbr.value(strFmt('((%1+%2) > (%3))', fieldStr(Table1, Field1), fieldStr(Table1, Field2), fieldStr(Table1, Field3))); qr = new QueryRun(q); while (qr.next()) { table1 = qr.get(tableNum(Table1)); info(strFmt("Field1 = %1, Field2 = %2, Field3 = %3, Field4 = %4", table1.Field1, table1.Field2, table1.Field3, table1.Field4)); } } Field1 Field2 Field3 Field4 dataAreaId recVersion RecId 100.00 100.00 100.00 100 tst 1 5637144576 50.00 100.00 30.00 120 tst 1 5637144577 20.00 20.00 80.00 -40 tst 458154613 5637144578 Данные из Infolog: Info Message (12:27:00 pm) Field1 = 100.00, Field2 = 100.00, Field3 = 100.00, Field4 = 100 Info Message (12:27:00 pm) Field1 = 50.00, Field2 = 100.00, Field3 = 30.00, Field4 = 120 |
|
|
За это сообщение автора поблагодарили: Lemming (3), oip (1). |
07.02.2008, 14:32 | #10 |
MCTS
|
Цитата:
strfmt("(( %1 + %2 - %3 != 0))" - а так ругается
Цитата:
Просто надо чтобы с обоих сторон были поля
Но и ноль можно получть вычтя поле само из себя X++: strfmt("( %1+%2*10-%3 != %3-%3 ) )",
__________________
В глухомани, в лесу Несмотря на красу Дни проводит Лиса Патрикевна. Я никак не пойму Отчего, почему Не пускают куму На деревню |
|
|
За это сообщение автора поблагодарили: Lemming (3). |
07.02.2008, 14:38 | #11 |
Участник
|
|
|
Теги |
query, where, запрос (query), математика, ax3.0 |
|
Опции темы | Поиск в этой теме |
Опции просмотра | |
|