|
25.02.2005, 15:32 | #1 |
aka awas
|
2 и более OUTER JOIN к одному паренту
Доброго времени суток, вам, господа и дамы!
Не подскажите, как построить селект с 2мя и более outer join'ами с одним парентом? Или объяснить мне в чем я не прав. У меня на последнем Join'e ругается что "Невозможно выбрать запись в 'Условия оплаты' ('PaymTerm') Использован оператор объединения таблиц join, но выражение WHERE не содержит связи между таблицами." static void Job10(Args _args) { SalesTable contractTable; EmplTable emplTable; PaymTerm paymTerm; ; while select SalesName from contractTable outer join NumOfDays, Description from paymTerm where paymTerm.PaymTermId == contractTable.Payment outer join Name from emplTable where emplTable.EmplId == contractTable.SalesResponsible { info(strfmt("%1 %2", paymTerm.NumOfDays, contractTable.SalesName)); } } Хинт: с "обыкновенными", inner join'ами, все job запускается... |
|
18.12.2005, 20:09 | #2 |
Участник
|
Попробуйте так
X++: qbDS2.relations(false); qbDS2.addRange(fieldNum(InventDim, InventDimId)). value(strfmt("(((%2.dataAreaId == %3.DataAreaId) || (%2.dataAreaId != %3.DataAreaId)) && " + "(%1.inventDimId == %3.inventDimId))", qbDS1.name(), q.dataSourceTable(tableNum(InventTable)).name(), qbDS2.name()));
__________________
Axapta v.3.0 sp5 kr2 |
|
19.12.2005, 07:38 | #3 |
Участник
|
Цитата:
Сообщение от AndyD
Попробуйте так
X++: qbDS2.relations(false); qbDS2.addRange(fieldNum(InventDim, InventDimId)). value(strfmt("(((%2.dataAreaId == %3.DataAreaId) || (%2.dataAreaId != %3.DataAreaId)) && " + "(%1.inventDimId == %3.inventDimId))", qbDS1.name(), q.dataSourceTable(tableNum(InventTable)).name(), qbDS2.name())); X++: qbDS2.addRange(fieldNum(InventDim, InventDimId)). value("(((InventTable.dataAreaId == InventDim.DataAreaId) || (InventTable.dataAreaId != InventDim.DataAreaId)) && (InventSum.inventDimId == InventDim.inventDimId))"); Не ошибайтесь так люди |
|
19.12.2005, 08:16 | #4 |
Участник
|
Можно было явно дать название датасоурсам
qbDS1 = q.addDataSource(tableNum(InventSum), "InventSum"); или qbDS1.Name("InventSum"); и т.д. Тогда бы ваш вариант работал.
__________________
Axapta v.3.0 sp5 kr2 Последний раз редактировалось AndyD; 19.12.2005 в 09:08. |
|
19.12.2005, 10:27 | #5 |
----------------
|
Хочу отметить, что Job40 (см. тут ) замечательно работает на Oracle и никак не работает на MS SQL.
|
|
19.12.2005, 13:21 | #6 |
Developer
|
Цитата:
Сообщение от Wamr
Хочу отметить, что Job40 (см. тут ) замечательно работает на Oracle и никак не работает на MS SQL.
Код: qbDS2.addRange(fieldnum(InventDim, DataAreaId)).value(strfmt( "((%1.DataAreaId == %2.DataAreaId) || (%1.DataAreaId != %2.DataAreaId))", qbDS2.name(), q.dataSourceTable(tablenum(InventTable)).name() )); |
|
19.12.2005, 13:29 | #7 |
----------------
|
а включаешь
PHP код:
Наверно, это из-за SaveDataPerCompany = NO Последний раз редактировалось Wamr; 19.12.2005 в 13:36. |
|
19.12.2005, 13:36 | #8 |
Developer
|
Вот это у меня работает (Ax 3.0 SP 2, MS SQL Server 2000):
Код: static void Job40(Args _args) { Query q = new Query(); QueryRun qr; QueryBuildDataSource qbDS1, qbDS2; InventSum inventSum; InventTable inventTable; InventDim inventDim; ; qbDS1 = q.addDataSource(tableNum(InventSum)); qbDS2 = qbDS1.addDataSource(tableNum(InventTable)); qbDS2.joinMode(JoinMode::OuterJoin); qbDS2.fetchMode(QueryFetchMode::One2One); qbDS2.relations(true); qbDS2 = qbDS1.addDataSource(tableNum(InventDim)); qbDS2.joinMode(JoinMode::OuterJoin); qbDS2.fetchMode(QueryFetchMode::One2One); qbDS2.relations(true); qbDS2.addRange(fieldnum(InventDim, DataAreaId)).value(strfmt( "((%1.DataAreaId == %2.DataAreaId) || (%1.DataAreaId != %2.DataAreaId))", qbDS2.name(), q.dataSourceTable(tablenum(InventTable)).name() )); info(qbDS1.toString()); qr = new QueryRun(q); qr.next(); inventSum = qr.get(tablenum(InventSum)); inventTable = qr.get(tablenum(InventTable)); inventDim = qr.get(tablenum(InventDim)); info(strfmt("%1 %2 %3", inventSum.ItemId, inventTable.ItemName, inventDim.inventDimId)); } |
|
19.12.2005, 13:42 | #9 |
Developer
|
Sorry - не увидел "SaveDataPerCompany = NO"
Конечно из-за этого, я ж range на DataAreaId цеплял... ааа... "SaveDataPerCompany = NO" появилось уже после прочтения сообщения мной... тогда понятно, почему не увидел... Последний раз редактировалось vallys; 19.12.2005 в 14:32. |
|
|
Похожие темы | ||||
Тема | Ответов | |||
Двойной Outer Join в Query | 2 | |||
Несколько outer join в запросе | 2 | |||
Данные в Grid из таблиц, связанных по Outer Join | 2 | |||
Outer Join | 3 | |||
outer join для трех таблиц | 4 |
|