|  16.01.2009, 08:10 | #1 | 
| Участник |  переделать запрос sql 
			
			Здравствуйте! Помогите плз. новичку! столкнулся со следующей проблемой: есть запрос, select * from RAssetLocation join UserGroupList join RAssetTransferTable where RAssetLocation.userGroupId == UserGroupList.GroupId && UserGroupList.UserId == currentUserId && (RAssetTransferTable.NewLocation == RAssetLocation.Location || RAssetTransferTable.OldLocation == RAssetLocation.Location) мне необходимо добавить его к this.query() я делаю примерно следующее: qbds = this.query().dataSourceTable(tablenum(RAssetTransferTable)); qbds = qbds.addDataSource(tablenum(RAssetLocation)); qbds.addLink(fieldNum(RAssetTransferTable,NewLocation),fieldNum(RAssetLocation,Location)); qbds.joinMode(JoinMode::InnerJoin); qbds = qbds.addDataSource(tablenum(UserGroupList)); qbds.addLink(fieldNum(RAssetLocation,userGroupId),fieldNum(UserGroupList,groupId)); qbds.joinMode(JoinMode::InnerJoin); qbds.addRange(fieldnum(UserGroupList, UserId)).value(currentUserId); Но здесь идет связь по RAssetTransferTable.NewLocation == RAssetLocation.Location, а мне необходимо сделать: (RAssetTransferTable.NewLocation == RAssetLocation.Location || RAssetTransferTable.OldLocation == RAssetLocation.Location)  Помогите пожалуйста... | 
|  | 
|  16.01.2009, 08:18 | #2 | 
| Участник | Возможности Ranges 
			
			Надеюсь ссылка поможет Возможности Ranges update: еще можно посмотреть вот эту ссылку http://www.axaptapedia.com/Expressions_in_query_ranges Последний раз редактировалось SRF; 16.01.2009 в 08:23. | 
|  | 
|  16.01.2009, 10:18 | #3 | 
| Участник |   
			
			Не помогло!   ... qbds = this.query().dataSourceTable(tablenum(RAssetTransferTable)); qbds.addDataSource(tablenum(RAssetLocation)); qbds.addRange( FieldNum( RAssetTransferTable, recId) ).value( "((RAssetTransferTable.NewLocation = RAssetLocation.Location || RAssetTransferTable.OldLocation = RAssetLocation.Location))" ); ... Ошибка расширенного диапазона запроса: RAssetLocation.Location не является корректной парой datasource.field рядом с 64. | 
|  | 
|  16.01.2009, 10:33 | #4 | 
| MCITP |   Цитата: 
		
			Сообщение от hated8
			   Не помогло!   ... qbds = this.query().dataSourceTable(tablenum(RAssetTransferTable)); qbds.addDataSource(tablenum(RAssetLocation)); qbds.addRange( FieldNum( RAssetTransferTable, recId) ).value( "((RAssetTransferTable.NewLocation = RAssetLocation.Location || RAssetTransferTable.OldLocation = RAssetLocation.Location))" ); ... Ошибка расширенного диапазона запроса: RAssetLocation.Location не является корректной парой datasource.field рядом с 64. Расширенные ренджи также буквально вчера обсуждались: Расширенный фильтр в запрос или как то так + Всегда можно сделать info(qbds.toString()) и посмотреть что за кверю вы там наваяли... 
				__________________ Zhirenkov Vitaly | 
|  | 
|  16.01.2009, 11:18 | #5 | 
| Moderator | 
			
			Это, наверное, будет следующей обнаруженной ошибкой    А пока, судя по позиции "64", похоже, компилятор хочет, чтобы внутренние сравнения, которые соединяются по ||, взяли в скобки. X++: "((RAssetTransferTable.NewLocation==RAssetLocation.Location)|| 
(RAssetTransferTable.OldLocation==RAssetLocation.Location))" | 
|  | 
|  16.01.2009, 11:21 | #6 | 
| Участник | Цитата: 
		
			Сообщение от ZVV
			   А "равно" разве не "==" пишется в аксапте? Расширенные ренджи также буквально вчера обсуждались: Расширенный фильтр в запрос или как то так + Всегда можно сделать info(qbds.toString()) и посмотреть что за кверю вы там наваяли... А по теме, не пробуя, мне кажется проблема в скобках вместо "((RAssetTransferTable.NewLocation = RAssetLocation.Location || RAssetTransferTable.OldLocation = RAssetLocation.Location))" надо "((RAssetTransferTable.NewLocation = RAssetLocation.Location) || (RAssetTransferTable.OldLocation = RAssetLocation.Location))" | 
|  | |
| За это сообщение автора поблагодарили: Gustav (3). | |
|  16.01.2009, 11:25 | #7 | 
| Участник | 
			
			Фсё перепробоваал!!!  Фанарь! У меня почему-то даже qbds = this.query().dataSourceTable(tablenum(RAssetTransferTable)); qbds.addRange(fieldNum(RAssetTransferTable, recid)).value("((RAssetTransferTable.NewLocation == '1 01 01 00 12'))" ); возращает ошибку! Последний раз редактировалось hated8; 16.01.2009 в 11:39. | 
|  | 
|  16.01.2009, 11:28 | #8 | 
| Moderator | |
|  | 
|  16.01.2009, 11:30 | #9 | 
| Участник |   
			
			2 человека уже написали рабочий вариант... почему бы его не попробовать?    | 
|  | 
|  16.01.2009, 11:36 | #10 | 
| MCITP |   
			
			Это слишком лёгкий путь...   А так всё перепробует и запомнит на всю жизнь (надеюсь).   
				__________________ Zhirenkov Vitaly | 
|  | 
|  16.01.2009, 11:57 | #11 | 
| Участник | 
			
			да не в том дело! Все примеры работают с qbds = query.addDataSource(tablenum(RAssetTransferTable)); , а мне необходимо qbds = this.query().dataSourceTable(tablenum(RAssetTransferTable));! как только меняешь одно на другое сразу получаеш: Ошибка расширенного диапазона запроса: RAssetLocation.Location не является корректной парой datasource.field рядом с 60.   | 
|  | 
|  16.01.2009, 12:15 | #12 | 
| Moderator | 
			
			А в this.query() -то у вас что сидит перед добавлением в него чего-либо?
		 | 
|  | 
|  16.01.2009, 12:19 | #13 | 
| MCITP |   
			
			Если нужно именно добавить к существующей квери, то вероятно надо  X++: qbds = this.query().addDataSource(tablenum(RAssetTransferTable));Может вам лучше привести сюда весь код? 
				__________________ Zhirenkov Vitaly | 
|  | 
|  16.01.2009, 12:24 | #14 | 
| Moderator | 
			
			А уберите-ка RAssetLocation, оставьте так: X++: "((RAssetTransferTable.NewLocation==Location)||
(RAssetTransferTable.OldLocation==Location))" | 
|  | 
|  16.01.2009, 12:31 | #15 | 
| Участник | 
			
			qbds = this.query().dataSourceTable(tablenum(RAssetTransferTable));   //SELECT * FROM RAssetTransferTable USING INDEX DateIdx qbds.addDataSource(tablenum(RAssetLocation)); //SELECT * FROM RAssetTransferTable USING INDEX DateIdx JOIN * FROM RAssetLocation qbds.addRange(fieldNum(RAssetTransferTable, recid)).value('(RAssetTransferTable.NewLocation==RAssetLocation.Location)'); //SELECT * FROM RAssetTransferTable USING INDEX DateIdx WHERE (((RAssetTransferTable.NewLocation==RAssetLocation.Location))) JOIN * FROM RAssetLocation Уже пробовал убрать RAssetLocation ошибка почти та же! dataSourceTable на addDataSource тоже безрезультатно! Последний раз редактировалось hated8; 16.01.2009 в 12:37. | 
|  | 
|  16.01.2009, 12:38 | #16 | 
| MCITP |   
			
			а добавлять этот рэндж ко второму датасорсу пробовали? X++: qbds.addDataSource(tablenum(RAssetLocation)).addRange(fieldNum(RAssetLocation, recid)).value(.... 
				__________________ Zhirenkov Vitaly | 
|  | 
|  16.01.2009, 12:42 | #17 | 
| Участник | 
			
			Картинка не изменилась!   Те же ошибки! | 
|  | 
|  16.01.2009, 12:46 | #18 | 
| Участник |   
			
			Возможно дело в названии ичточников данных, попробуйте использовать QueryBuildDataSource.name() при формировании связки. Набросал тут упрощенную версию запроса по RAssetLocation: X++: static void jbRAssetLocationOR(Args _args) { RAssetLocation rAssetLocation ; RAssetTransferTable rAssetTransferTable ; QueryBuildDataSource qbdsRAssetLocation ; QueryBuildDataSource qbdsRAssetTransfer ; Range rangeRAsset ; RAssetLocationId rAssetLocationId ; Query query ; QueryRun queryRun ; ; rAssetLocationId = '1 01 01 11 00' ; info( 'From X++ Select:' ) ; while select rAssetLocation where rAssetLocation.Location == rAssetLocationId join rAssetTransferTable where rAssetTransferTable.NewLocation == rAssetLocation.Location || rAssetTransferTable.OldLocation == rAssetLocation.Location { info( rAssetTransferTable.JournalNum ) ; } query = new Query() ; qbdsRAssetLocation = query.addDataSource( tableNum( RAssetLocation ) ) ; qbdsRAssetTransfer = qbdsRAssetLocation.addDataSource( tableNum( RAssetTransferTable ) ) ; qbdsRAssetTransfer.relations( false ) ; rangeRAsset = strfmt( '((%1.%2 == %4.%5) || (%1.%3 == %4.%5))' , qbdsRAssetTransfer.name() , fieldStr( RAssetTransferTable, NewLocation ), fieldStr( RAssetTransferTable, OldLocation ), qbdsRAssetLocation.name() , fieldStr( RAssetTable, Location ) ) ; findOrCreateRange_W( qbdsRAssetLocation, fieldNum( RAssetLocation, Location ), SysQuery::value( rAssetLocationId ) ) ; findOrCreateRange_W( qbdsRAssetTransfer, fieldNum( RAssetTransferTable, RecId ), rangeRAsset ) ; info( 'From QueryRun:' ) ; info( qbdsRAssetLocation.toString() ) ; queryRun = new QueryRun( query ) ; while( queryRun.next() ) { rAssetTransferTable = queryRun.get( tableNum( RAssetTransferTable ) ) ; info( rAssetTransferTable.JournalNum ) ; } } | 
|  | |
| За это сообщение автора поблагодарили: Gustav (7). | |
|  16.01.2009, 13:05 | #19 | 
| Moderator | Цитата:  X++: "((RAssetTransferTable_1.NewLocation==RAssetLocation_1.Location)|| 
(RAssetTransferTable_1.OldLocation==RAssetLocation_1.Location))" | 
|  | 
|  16.01.2009, 13:25 | #20 | 
| Участник | Цитата: При желании, можно и явно задать имя синонима источника данных при добавлении: X++:      ...
    qbdsRAssetLocation = query.addDataSource( tableNum( RAssetLocation ), "SampleLocation" ) ;
    qbdsRAssetTransfer = qbdsRAssetLocation.addDataSource( tableNum( RAssetTransferTable ), "SampleTransfer" ) ;
    ...Цитата: 
		
			SELECT * FROM RAssetLocation WHERE ((Location = N'1 01 01 11 00')) JOIN * FROM RAssetTransferTable WHERE ((((SampleTransfer.NewLocation == SampleLocation.Location) || (SampleTransfer.OldLocation == SampleLocation.Location))))
		
	 | 
|  |