|
19.06.2017, 20:09 | #1 |
Участник
|
Ларчик у меня открылся вот как. Изначально почитав http://www.axaptapedia.com/Expressions_in_query_ranges я использовал ExistsJoin. Потом спасибо S.Kuskov тип связи изменился на InnerJoin. И тогда встал вопрос, а почему структура query до сих пор такая? Почему бы не поднять InventLocation выше? Поднял и все заработало. Код который бил показан он тестовый и поэтому упрошенный. Сейчас рабочий код выглядит так
X++: qbds = query.addDataSource(tablenum(InventTransferTable)); qbds.orderMode(OrderMode::GroupBy); qbds.addSortField(fieldnum(InventTransferTable, TransferId)); qbds.addSortField(fieldnum(InventTransferTable, InventLocationIdTo)); qbds.addSortField(fieldnum(InventTransferTable, InventLocationIdFrom)); qbds.addSortField(fieldnum(InventTransferTable, InventLocationIdTransit)); qbds.addSortField(fieldnum(InventTransferTable, InventLocationIdLater)); qbds.addSortField(fieldnum(InventTransferTable, ReceiveDate)); qbds.addSortField(fieldnum(InventTransferTable, TransferStatus)); qbds.addSortField(fieldnum(InventTransferTable, InventLocationIdLater)); if (fromDate && toDate)//Дата { qbds.addRange(fieldnum(InventTransferTable, ReceiveDate)).value(strfmt('%1..%2', fromDate, toDate)); } if (receivedOnly) { qbds.addRange(fieldnum(InventTransferTable, TransferStatus)).value(QueryValue(InventTransferStatus::Received)); } else { qbds.addRange(fieldnum(InventTransferTable, TransferStatus)).value(QueryValue(InventTransferStatus::Shipped)); qbds.addRange(fieldnum(InventTransferTable, TransferStatus)).value(QueryValue(InventTransferStatus::Received)); } if (inventLocationId_From)//Отправлено Откуда { qbds.addRange(fieldnum(InventTransferTable, InventLocationIdFrom)).value(inventLocationId_From); } if (inventLocationId_To)//Отправлено Куда { qbds.addRange(fieldnum(InventTransferTable, InventLocationIdTo)).value(inventLocationId_To); } if (inventLocationType != InventLocationType::Standard) { qbdsInventLocationFrom = qbds.addDataSource(tablenum(InventLocation)); qbdsInventLocationFrom.addLink(fieldNum(InventTransferTable, InventLocationIdFrom), fieldNum(InventLocation, InventLocationId)); qbdsInventLocationFrom.joinMode(JoinMode::InnerJoin); qbdsInventLocationFrom.fetchMode(QueryFetchMode::One2One); qbdsInventLocationTo = qbds.addDataSource(tableNum(InventLocation)); qbdsInventLocationTo.addLink(fieldNum(InventTransferTable, InventLocationIdTo), fieldNum(InventLocation, InventLocationId)); qbdsInventLocationTo.joinMode(JoinMode::InnerJoin); qbdsInventLocationTo.fetchMode(QueryFetchMode::One2One); qbrDataAreaId = qbdsInventLocationTo.addRange(fieldNum(InventLocation, DataAreaId)); qbrDataAreaId.value(strFmt('((%1.%3 == %4) || (%2.%3 == %4))', qbdsInventLocationFrom.name(), qbdsInventLocationTo.name(), fieldStr(InventLocation, InventLocationType), any2int(inventLocationType))); } qbds1 = qbds.addDataSource(tablenum(InventTransferLine)); qbds1.addLink(fieldnum(InventTransferTable, TransferId), fieldnum(InventTransferLine , TransferId)); qbds1.joinMode(JoinMode::InnerJoin); qbds1.orderMode(OrderMode::GROUPBY); qbds1.fetchMode(QueryFetchMode::One2One); qbds1.addSortField(fieldnum(InventTransferLine, ItemId)); qbds1.addSortField(fieldnum(InventTransferLine, Out_ItemId)); qbds1.addSortField(fieldnum(InventTransferLine, QtyTransfer)); qbds2 = qbds1.addDataSource(tableNum(InventSum)); qbds2.addLink(fieldnum(InventTransferLine, ItemId), fieldNum(InventSum, ItemId)); qbds2.joinMode(joinMode::InnerJoin); qbds2.orderMode(OrderMode::GROUPBY); qbds2.fetchMode(QueryFetchMode::One2One); qbds2.addSortField(fieldnum(InventSum, ItemId)); qbds2.addSelectionField(fieldnum(InventSum, ReservPhysical), SelectionField::SUM); qbds2.addSelectionField(fieldnum(InventSum, PostedQty), SelectionField::SUM); qbds2.addSelectionField(fieldnum(InventSum, Received), SelectionField::SUM); qbds2.addSelectionField(fieldnum(InventSum, Deducted), SelectionField::SUM); qbds2.addSelectionField(fieldnum(InventSum, Registered), SelectionField::SUM); qbds2.addSelectionField(fieldnum(InventSum, Picked), SelectionField::SUM); qbds2.addRange(fieldnum(InventSum, Closed)).value(SysQuery::value(NoYes::No)); qbds2.addRange(fieldNum(InventSum, PhysicalInvent)).value("> 0"); queryRun = new QueryRun(query); |
|
|
За это сообщение автора поблагодарили: mazzy (2). |
19.06.2017, 20:32 | #2 |
Участник
|
это понятно и нормально.
про код тоже понятно. но проблема то не решена. в скобках у вас по прежнему названия датасорсов, а в самом тексте запроса используются названия таблиц. аксапта не проверяет синтаксис внутри скобок. поэтому и не выдает ошибки. но с точки зрения SQL запрос будет синтаксически неверным. Цитата:
Сообщение от smailik
X++: qbrDataAreaId = qbdsInventLocationTo.addRange(fieldNum(InventLocation, DataAreaId)); qbrDataAreaId.value(strFmt('((%1.%3 == %4) || (%2.%3 == %4))', qbdsInventLocationFrom.name(), qbdsInventLocationTo.name(), fieldStr(InventLocation, InventLocationType), any2int(inventLocationType))); } |
|
19.06.2017, 22:00 | #3 |
Участник
|
поговорите с администратором. )
но лучше начните использовать АОТ для query вместо простыней кода. и всегда экранируйте значение перед тем как записать range.value. вот так категорически неправильно: X++: value(inventLocationId_From) X++: value(SysQuery::value(inventLocationId_From)) или любые друге спец.символы. http://axapta.mazzy.ru/lib/search/ ========================= Цитата:
в общем старая добрая проблема с множественным Exist Join в нескольких подчиненных таблицах воспроизводится и в самых распоследних билдах акс2012. Если есть несколько подчиненных таблиц с Exist Join и InnerJoin, то возникает ошибка при создании SQL-запроса. Независимо от положения подчиненных таблиц, от group by и прочих факторов. ========================= Господи, хорошо то как в старой версии! И все-таки лучшей версией была акс2009. Последний раз редактировалось mazzy; 19.06.2017 в 22:18. |
|
07.09.2017, 11:28 | #4 |
Участник
|
__________________
Мои утилиты для Аксапты версий 3.0-2012: http://aceofdatabase.blogspot.com/ |
|