|  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 | 
| Участник |   | 
|  |