01.12.2005, 11:23 | #1 |
Участник
|
Проблема с составлением Query
Создаю query:
Код: PurchLine purchLine; InventTable inventTable; InventDim inventDim; QueryBuildDataSource qbdsPurchTable, qbdsPurchLine, qbdsInventTable, qbdsInventTableModule, qbdsInventDim; Query query; QueryRun queryRun; ; query = new Query(); qbdsPurchTable = query.addDataSource(tableNum(PurchTable)); qbdsPurchTable.addRange(fieldNum(PurchTable, DeliveryDate)).value(queryValue(30\11\2005)); qbdsPurchLine = qbdsPurchTable.addDataSource(tableNum(PurchLine)); qbdsPurchLine.joinMode(JoinMode::InnerJoin); qbdsPurchLine.fetchMode(QueryFetchMode::One2One); qbdsPurchLine.addLink(fieldNum(PurchTable, PurchId), fieldNum(PurchLine, PurchId)); qbdsPurchLine.orderMode(OrderMode::GroupBy); qbdsPurchLine.addSelectionField(fieldNum(PurchLine, PurchQty), SelectionField::Sum); qbdsInventTable = qbdsPurchLine.addDataSource(tableNum(InventTable)); qbdsInventTable.joinMode(JoinMode::InnerJoin); qbdsInventTable.fetchMode(QueryFetchMode::One2One); qbdsInventTable.addLink(fieldNum(PurchLine, ItemId), fieldNum(InventTable, ItemId)); qbdsInventTable.orderMode(OrderMode::GroupBy); qbdsInventTable.addSortField(fieldNum(InventTable, ItemName)); qbdsInventTable.addSortField(fieldNum(InventTable, ItemId)); qbdsInventTableModule = qbdsInventTable.addDataSource(tableNum(inventTableModule)); qbdsInventTableModule.joinMode(JoinMode::InnerJoin); qbdsInventTableModule.fetchMode(QueryFetchMode::One2One); qbdsInventTableModule.addLink(fieldNum(InventTable, ItemId), fieldNum(inventTableModule, ItemId)); qbdsInventDim = qbdsPurchLine.addDataSource(tableNum(InventDim)); qbdsInventDim.joinMode(JoinMode::InnerJoin); qbdsInventDim.fetchMode(QueryFetchMode::One2One); qbdsInventDim.addLink(fieldNum(PurchLine, InventDimId), fieldNum(InventDim, InventDimId)); qbdsInventDim.orderMode(OrderMode::GroupBy); qbdsInventDim.addSortField(fieldNum(InventDim, InventDimId)); queryRun = new QueryRun(query); while(queryRun.next()) { purchLine = queryRun.get(tableNum(PurchLine)); inventTable = queryRun.get(tableNum(InventTable)); inventDim = queryRun.get(tableNum(InventDim)); info(strfmt("%1 ~ %2 ~ %3 ~ %4", inventTable.ItemName, inventTable.ItemId, purchLine.PurchQty, inventDim.inventDimId )); } |
|
01.12.2005, 11:49 | #2 |
злыдень
|
в инвенттаблемодуле записи хранятся по 3 штуки на каждый итем ид. Для закупок, заказов и пермещений.
Если нужен отчет сколько штук товара закуплено на каждый склад по деливеридата- посмотрите лучше в сторону инвенттранс. |
|
01.12.2005, 12:03 | #3 |
Участник
|
2 Recoilme
Прошу прощения что не сказал сразу, но этот запрос не представляет практической ценности, запрос, который я пытаюсь реализовать наполовину состоит из самописных таблиц, поэтому я составил для примера запрос из стандартных таблиц, чтобы этот код просто помещался в job и запускался. Меня интересует менно технологический аспект этого query. |
|
01.12.2005, 12:13 | #4 |
Участник
|
Подключайте к запросу сначала InventDim, а после него - InventTable и InventTableModule
Правда если у вас в запросе будет подключение к обеим таблицам на одном уровне, то скорее всего запрос будет работать неправильно
__________________
Axapta v.3.0 sp5 kr2 |
|
01.12.2005, 12:20 | #5 |
Участник
|
Мне сначала InventDim нельзя, потому что мне надо чтобы сортировка была в порядке: ItemName, InventDim, а, насколько я понял, порядок группировки (он же порядок сортировки), зависит от того, в каком порядке к query добавляются DataSource'ы
|
|
01.12.2005, 12:29 | #6 |
Участник
|
Ну это ограничение можно обойти добавив еще один InventTable перед InventDim (без подключения к нему дополнительных таблиц). Правда запрос при этом усложняется.
__________________
Axapta v.3.0 sp5 kr2 |
|
01.12.2005, 12:34 | #7 |
----------------
|
Цитата:
сначала InventDim нельзя, потому что ..
|
|
01.12.2005, 13:33 | #8 |
Участник
|
Цитата:
InventTableModule - InventTable - PurchLine - PurchTable - InventDim
И не могли бы вы объяснить из каких принципов нужно выстраивать цепочку DataSource, или отправить к первоисточникам? |
|
01.12.2005, 14:09 | #9 |
----------------
|
InventTableModule - InventTable - PurchLine - InventDim - PurchTable - VendTable
(но не уверен, что будет вообще как-то работать) Принцип - минимальное количество ветвлений. Если от ветвлений не уйти, то сначала "маленькая" (InventDim), потом "большая" (PurchTable - VendTable). Если outer или exists, то должен быть последним и единственным [для MS, так как для Oracle удавалось и больше] И стараться не объединять больше 5 таблиц. |
|
01.12.2005, 14:48 | #10 |
Участник
|
2 Wamr
Спасибо, работает. А можно еще вопрос: все эти "фичи" уходят корнями в парсинг query, который выполняет Axapta или это СУБД так себя ведет? |
|
01.12.2005, 15:00 | #11 |
----------------
|
Аксаптовский парсер глючит.
|
|