| 
			
			 | 
		#1 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
			
			
			Расширение запроса на форме InventOnHand
			 
			
			Нам понадобилось ставить фильтр по свойствам номенклатуры на форму InventOnHand. 
		
		
		
		
		
		
		
		
			Нахожу, что в executequery вызывается метод для модификации запроса. переписываю executequery: X++: void executeQuery() { // > добавленный мной кусок --> QueryBuildDataSource BR; Query q; str s=''; QueryBuildRange findOrAddRange(int fNum){ QueryBuildRange ret; ret=BR.findRange(fNum); if(!ret) ret=BR.addRange(fNum); return ret; } // > добавленный мной кусок <-- ; element.inventDimSetupObject().modifyQuery(inventSum_DS,inventDim_DS); // > добавленный мной кусок --> q=InventSum_ds.query(); BR=q.dataSourceNo(1).addDataSource(tablenum(InventTable)); BR.relations(true); fItemGroupId =findOrAddRange(fieldnum(InventTable,ItemGroupId)); fModelGroupId =findOrAddRange(fieldnum(InventTable,ModelGroupId)); fDimGroupId =findOrAddRange(fieldnum(InventTable,DimGroupId)); fItemBuyerGroupId=findOrAddRange(fieldnum(InventTable,ItemBuyerGroupId)); InventSum_ds.query(q); // пробовал InventSum_ds.queryrun(new sysqueryrun(q)); - тот же эффект info(inventsum_ds.query().dataSourceNo(1).toString()); fItemGroupId.value(ItemGroupId.valueStr()); fModelGroupId.value(ModelGroupId.valueStr()); fDimGroupId.value(DimGroupId.valueStr()); fItemBuyerGroupId.value(ItemBuyerGroupId.valueStr()); // > добавленный мной кусок <-- super(); соответствующие XXXXXX - элементы управления для выбора значений фильтра. фильтрации не происходит, и в info данного метода выводится запрос без прикрепленого InventTable. Кто-нидь подскажет, что не так делаем? Последний раз редактировалось gefr; 19.09.2007 в 13:03.  | 
| 
	
 | 
| 
			
			 | 
		#2 | 
| 
			
			 Программатор 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Как вариант, fetchMode ручками явно выставить. Мне как то помогло  
		
		
		
		
		
		
		
		
			 
		Последний раз редактировалось Sada; 19.09.2007 в 14:13.  | 
| 
	
 | 
| 
			
			 | 
		#3 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			+1 
		
		
		
		
		
		
		
	Еще я бы попобдробнее на запрос посмотрел, кажись там группировки были, надо либо делать Exists join и перемещать его в кнонец, либо группировать Как-то InventTable  | 
| 
	
 | 
| 
			
			 | 
		#4 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			fetchmode не помогает. также в запрос просто не добавляется InventTable - и все тут 
		
		
		
		
		
		
		
	попробовал добавить InventTable на форму - вылетает ошибка при попытке выставить фильтр - недопустимый диапазон. при попытке выставить ordermode в groupby и добавить поля сортировки сразу на itemid вылетает с ошибкой - недопустимое полу для сортировки  | 
| 
	
 | 
| 
			
			 | 
		#5 | 
| 
			
			 Программатор 
		
			
	 | 
	
	
	
		
		
		
		 
			
			SELECT WITH SELECT_ORDER, NESTED_LOOP, FORCE_PLACEHOLDERS INDEXISHINT SUM(PostedQty), SUM(PostedValue), SUM(PhysicalValue), SUM(Deducted), SUM(Registered), SUM(Received), SUM(Picked), SUM(ReservPhysical), SUM(ReservOrdered), SUM(OnOrder), SUM(Ordered), SUM(Arrived), SUM(QuotationReceipt), SUM(QuotationIssue), SUM(PhysicalInvent), SUM(PostedValueSecCur_RU), SUM(PhysicalValueSecCur_RU), SUM(AvailPhysical), SUM(AvailOrdered) FROM InventSum GROUP BY InventSum.ItemId ASC USING INDEX ClosedItemDimIdx WHERE ((Closed = ???)) AND InventTable.ItemId=InventSum.ItemId AND InventTable.ItemId=InventSum.ItemId JOIN INDEXISHINT * FROM InventDim GROUP BY InventDim.InventLocationId ASC USING INDEX DimIdIdx WHERE InventSum.InventDimId = InventDim.inventDimId 
		
		
		
		
		
		
		
	Это запрос с таким кодом X++: void executeQuery() { // > добавленный мной кусок --> QueryBuildDataSource BR; Query q; str s=''; QueryBuildRange findOrAddRange(int fNum){ QueryBuildRange ret; ret=BR.findRange(fNum); if(!ret) ret=BR.addRange(fNum); return ret; } // > добавленный мной кусок <-- ; element.inventDimSetupObject().modifyQuery(inventSum_DS,inventDim_DS); // > добавленный мной кусок --> q=InventSum_ds.query(); BR=q.dataSourceNo(1).addDataSource(tablenum(InventTable)); BR.relations(true); /*fItemGroupId =findOrAddRange(fieldnum(InventTable,ItemGroupId)); fModelGroupId =findOrAddRange(fieldnum(InventTable,ModelGroupId)); fDimGroupId =findOrAddRange(fieldnum(InventTable,DimGroupId)); fItemBuyerGroupId=findOrAddRange(fieldnum(InventTable,ItemBuyerGroupId)); */ InventSum_ds.query(q); // пробовал InventSum_ds.queryrun(new sysqueryrun(q)); - тот же эффект info(inventsum_ds.query().dataSourceNo(1).toString()); /*fItemGroupId.value(ItemGroupId.valueStr()); fModelGroupId.value(ModelGroupId.valueStr()); fDimGroupId.value(DimGroupId.valueStr()); fItemBuyerGroupId.value(ItemBuyerGroupId.valueStr()); */ // > добавленный мной кусок <-- super(); }  | 
| 
	
 | 
| 
			
			 | 
		#6 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			спасибо за предложения. в конце концов срослось след. образом:  
		
		
		
		
		
		
		
	добавил датасорс InventTable на форму, непосредственно в методе X++: element.inventDimSetupObject().modifyQuery(inventSum_DS,inventDim_DS,InventTable_DS); void modifyQuery( FormDataSource inventSum_DS, FormDataSource inventDim_DS, FormDataSource InventTable_DS=null // georg, добавление фильтров ){ ... // georg, добавление фильтров ---> QueryBuildDataSource qBSItem; QueryBuildRange fItemGroupId; QueryBuildRange fModelGroupId; QueryBuildRange fDimGroupId; QueryBuildRange fItemBuyerGroupId; // georg, добавление фильтров <--- ... // georg, добавление фильтров ---> if(InventTable_DS){ qBSItem=inventTable_DS.query().dataSourceName(inventTable_DS.name()); qBSItem.sortClear(); fItemGroupId=qBSItem.findRange(fieldnum(InventTable,ItemGroupId)); if(!fItemGroupId) fItemGroupId=qBSItem.addRange(fieldnum(InventTable,ItemGroupId)); fModelGroupId =qBSItem.findRange(fieldnum(InventTable,ModelGroupId)); if(!fModelGroupId) fModelGroupId=qBSItem.addRange(fieldnum(InventTable,ModelGroupId)); fDimGroupId =qBSItem.findRange(fieldnum(InventTable,DimGroupId)); if(!fDimGroupId) fDimGroupId=qBSItem.addRange(fieldnum(InventTable,DimGroupId)); fItemBuyerGroupId =qBSItem.findRange(fieldnum(InventTable,ItemBuyerGroupId)); if(!fItemBuyerGroupId) fItemBuyerGroupId=qBSItem.addRange(fieldnum(InventTable,ItemBuyerGroupId)); } // georg, добавление фильтров <--- } X++: void executeQuery() { ; element.inventDimSetupObject().modifyQuery(inventSum_DS,inventDim_DS, // > georg, 19-09-2007, фильтр, --> InventTable_DS); fItemGroupId=InventTable_DS.query().dataSourceName(inventTable_DS.name()).findRange(fieldnum(InventTable,ItemGroupId)); fModelGroupId =InventTable_DS.query().dataSourceName(inventTable_DS.name()).findRange(fieldnum(InventTable,ModelGroupId)); fDimGroupId =InventTable_DS.query().dataSourceName(inventTable_DS.name()).findRange(fieldnum(InventTable,DimGroupId)); fItemBuyerGroupId =InventTable_DS.query().dataSourceName(inventTable_DS.name()).findRange(fieldnum(InventTable,ItemBuyerGroupId)); fItemGroupId.value(ItemGroupId.valueStr()); fModelGroupId.value(ModelGroupId.valueStr()); fDimGroupId.value(DimGroupId.valueStr()); fItemBuyerGroupId.value(ItemBuyerGroupId.valueStr()); // > georg, 19-09-2007, , <-- super(); }  
		 | 
| 
	
 | 
| 
	
	 | 
	
		
  |