|  01.12.2008, 17:44 | #1 | 
| Участник | Вопрос про QueryRun 
			
			Здравствуйте, помогите, пожалуйста, с такой ситуацией. Query query; QueryBuildDataSource qbDS; QueryBuildRange qbr; query = new Query(); qbDS = query.addDataSource(tableNum(InventTrans)); qbDS.addSortField(fieldNum(InventTrans, ItemId)); qbDS.addRange(fieldNum(InventTrans, TransType)).value(SysQuery::value(InventTransType::Sales)); qbDS.orderMode(OrderMode::GroupBy); qbDS.addSelectionField(fieldNum(InventTrans,Qty)); qbDS.addSelectionField(fieldNum(InventTrans,ItemId)); queryRun = new QueryRun(_query); while (queryRun.next()) { inventTrans = queryRun.get(tableNum(InventTrans)); здесь нужно написать запрос, который будет брать данные из inventTrans с некоторыми условиями и считать сумму по полю Qty } проблема в том, что нужно писать запрос не из таблицы InventTrans а из полученных запросом query данных. Если я делаю запрос над этими данными inventTrans, то они ломают весь цикл, так как функция get() берет последнее значение inventTrans (которое я модифицирую своим запросом) перед next(). Запутанно получилось.. Подскажите, как быть. | 
|  | 
|  01.12.2008, 17:53 | #2 | 
| MCTS | 
			
			Запутано. А что у Вас за запрос _query? Если он возвращает по одной записи из InventTrans, то почему-бы не сделать X++:  query = new Query(_query);Либо просто опишите - какого рода необходим запрос. Так будет понятнее | 
|  | |
| За это сообщение автора поблагодарили: Silphidae (1). | |
|  01.12.2008, 18:00 | #3 | 
| MCITP |   
			
			Не понятно вообще. Напишите лучше, что вам нужно получить целиком, или переформулируйте данный вопрос попонятнее. Цитата: 
		
			проблема в том, что нужно писать запрос не из таблицы InventTrans а из полученных запросом query данных
		
	 Подправьте кверю, чтоб она сразу делала то что вам нужно. Функция get() берет значение inventTrans из квери, из очередной полученной записи. 
				__________________ Zhirenkov Vitaly | 
|  | |
| За это сообщение автора поблагодарили: Silphidae (1). | |
|  02.12.2008, 09:31 | #4 | 
| Участник | 
			
			Прошу прощения за запутанность вопроса. Спасибо всем, кто ответил. Там должно быть queryRun = new QueryRun(query); (без подчеркивания) Считать сумму Qty сразу же в запросе query нельзя, т.к. ее подсчет зависит от некоторых условий, налагаемых позже. Смысл сводился к тому, что в таблице InventTrans есть поля ItemId, StatusIssue и Qty, причем, может быть несколько записей с одинаковым значением ItemId. В запросе query на таблицу накладывается некоторый фильтр. И из результата query сначала нужно сосчитать сумму Qty в тех случаях, когда StatusIssue равно OnOrder, а затем когда StatusIssue равно ReservPhysical. | 
|  | 
|  02.12.2008, 10:23 | #5 | 
| Участник | GroupBy + Range Цитата: 
		
			Сообщение от Silphidae
			   Считать сумму Qty сразу же в запросе query нельзя, т.к. ее подсчет зависит от некоторых условий, налагаемых позже. Смысл сводился к тому, что в таблице InventTrans есть поля ItemId, StatusIssue и Qty, причем, может быть несколько записей с одинаковым значением ItemId. В запросе query на таблицу накладывается некоторый фильтр. И из результата query сначала нужно сосчитать сумму Qty в тех случаях, когда StatusIssue равно OnOrder, а затем когда StatusIssue равно ReservPhysical. X++: static void jbGroupByStatusIssue(Args _args) { InventTrans inventTrans ; QueryRun queryRun ; Query query = new Query() ; QueryBuildDataSource qbdsInventTrans = query.addDataSource( tableNum( InventTrans ) ) ; ; qbdsInventTrans.orderMode( OrderMode::GroupBy ) ; qbdsInventTrans.addSortField( fieldNum(InventTrans, ItemId) ) ; qbdsInventTrans.addSelectionField( fieldNum( InventTrans, Qty), SelectionField::Sum ) ; queryRun = new QueryRun( query ) ; // для примера - доп. условия налагаемые пользователем if( !queryRun.prompt() ) return ; // наложить группировку по inventTrans.StatusIssue и ограничить значения группировки queryRun.query().dataSourceTable(tableNum( InventTrans )).addSortField( fieldNum(InventTrans, StatusIssue ) ); queryRun.query().dataSourceTable(tableNum( InventTrans )).addRange( fieldNum( InventTrans, StatusIssue ) ).value( SysQuery::value( StatusIssue::OnOrder ) ) ; queryRun.query().dataSourceTable(tableNum( InventTrans )).addRange( fieldNum( InventTrans, StatusIssue ) ).value( SysQuery::value( StatusIssue::ReservPhysical ) ) ; while( queryRun.next() ) { inventTrans = queryRun.get( tableNum( InventTrans ) ) ; info( strfmt( "%1 (%2): %3", InventTrans.ItemId, InventTrans.StatusIssue, InventTrans.Qty ) ) ; switch( InventTrans.StatusIssue ) { case StatusIssue::OnOrder : // код по обработке статуса StatusIssue::OnOrder break ; case StatusIssue::ReservPhysical : // код по обработке статуса StatusIssue::StatusIssue::ReservPhysical break ; } } } | 
|  | |
| За это сообщение автора поблагодарили: Silphidae (1). | |
|  02.12.2008, 10:30 | #6 | 
| MCITP |   Цитата: 
		
			Сообщение от Silphidae
			   Смысл сводился к тому, что в таблице InventTrans есть поля ItemId, StatusIssue и Qty, причем, может быть несколько записей с одинаковым значением ItemId. В запросе query на таблицу накладывается некоторый фильтр. И из результата query сначала нужно сосчитать сумму Qty в тех случаях, когда StatusIssue равно OnOrder, а затем когда StatusIssue равно ReservPhysical. на чистом SQL, конечно, такие задачи на порядок проще решаются.  А здесь я вижу 2 варианта: 1. делать 2 квери (для каждого статуса) 2. завёсти 2 "mapа" ItemId->Qty и дальше case (inventTrans.StatusIssue ) OnOrder: добавляем (или суммируем) в мап1 очередное кол-во по itemid ReservPhysical: добавляем (или суммируем) в мап2 очередное кол-во по itemid в итоге имеем мапы по всем номенклатурам с кол-вами по каждому статусу. как-то так, надеюсь понятно выразился? 
				__________________ Zhirenkov Vitaly | 
|  | 
|  02.12.2008, 10:40 | #7 | 
| Участник | 
			
			Спасибо, Petergunn. Насколько я понимаю, Ваш код считает сумму поля Qty для StatusIssue == OnOrder || StatusIssue == ReservPhysical. Мне же, фактически, нужно 2 суммы Qty, чтобы отдельно их вывести в поля QtyOnOrder и QtyReservPhyical | 
|  | 
|  02.12.2008, 10:43 | #8 | 
| MCTS | Цитата: X++: switch( InventTrans.StatusIssue ) { case StatusIssue::OnOrder : // код по обработке статуса StatusIssue::OnOrder break ; case StatusIssue::ReservPhysical : // код по обработке статуса StatusIssue::StatusIssue::ReservPhysical break ; } | 
|  | 
|  02.12.2008, 10:48 | #9 | 
| Участник | Цитата: Результат запроса выглядит примерно так: Item_1 - OnOrder - количество_1 Item_1 - ReservPhysical - количество_2 Item_2 - OnOrder - количество_3 Item_3 - ReservPhysical - количество_4 | 
|  | 
|  02.12.2008, 11:08 | #10 | 
| Участник | 
			
			Спасибо большое. Разобрался, все работает. Тему можно закрыть. | 
|  | 
|  | 
| 
 |