19.09.2007, 12:51 | #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. |
|
19.09.2007, 14:09 | #2 |
Программатор
|
Как вариант, fetchMode ручками явно выставить. Мне как то помогло
Последний раз редактировалось Sada; 19.09.2007 в 14:13. |
|
19.09.2007, 14:39 | #3 |
Участник
|
+1
Еще я бы попобдробнее на запрос посмотрел, кажись там группировки были, надо либо делать Exists join и перемещать его в кнонец, либо группировать Как-то InventTable |
|
19.09.2007, 15:25 | #4 |
Участник
|
fetchmode не помогает. также в запрос просто не добавляется InventTable - и все тут
попробовал добавить InventTable на форму - вылетает ошибка при попытке выставить фильтр - недопустимый диапазон. при попытке выставить ordermode в groupby и добавить поля сортировки сразу на itemid вылетает с ошибкой - недопустимое полу для сортировки |
|
19.09.2007, 15:41 | #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(); } |
|
19.09.2007, 16:05 | #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(); } |
|
|
|