15.01.2009, 13:54 | #1 |
Участник
|
Как сделать AND между двумя датасорсами на одном уровне в query
Возникла проблема - как сделать AND между двумя несвязанными датасорсами в query, по умолчанию Axapta делает OR.
X++: Query query = new query(); QueryBuildDataSource qbds, qbds1, qbds2; ; qbds = query.addDataSource(tablenum(VendInvoiceJour)); qbds1 = qbds.addDataSource(tablenum(VendTrans)); qbds1.relations(true); qbds2 = qbds.addDataSource(tablenum(VendInvoiceTrans)); qbds2.relations(true); В вышеприведённом примере получается OR. P.S. VendInvoiceTrans и VendTrans между собой несвязаны.... |
|
15.01.2009, 14:18 | #2 |
MCITP
|
Цитата:
Сообщение от rkorchagin
Возникла проблема - как сделать AND между двумя несвязанными датасорсами в query, по умолчанию Axapta делает OR.
X++: Query query = new query(); QueryBuildDataSource qbds, qbds1, qbds2; ; qbds = query.addDataSource(tablenum(VendInvoiceJour)); qbds1 = qbds.addDataSource(tablenum(VendTrans)); qbds1.relations(true); qbds2 = qbds.addDataSource(tablenum(VendInvoiceTrans)); qbds2.relations(true); В вышеприведённом примере получается OR. P.S. VendInvoiceTrans и VendTrans между собой несвязаны....
__________________
Zhirenkov Vitaly |
|
15.01.2009, 14:33 | #3 |
MCITP
|
У меня в таком виде как у вас кверя вообще строится отказывается, насколько я понимаю, датасорсы должны цепляться последовательно, а не на один уровень. По крайней мере а АОТ-Query так.
А ваш пример (пробовал и на 3-ке и на 4-ке) на выходе даёт, к сожалению: PHP код:
__________________
Zhirenkov Vitaly |
|
15.01.2009, 15:32 | #4 |
Участник
|
Ну как бы решил....
надо получается на каждом датасорсе что на одном уровне ставить fetchMode(QueryFetchMode::One2One); только потом сделать Map и проверять уже выведен ли vendInvoiceJour или нет - а то так получается что печатается столько раз сколько VendTrans (vendInvoiceTrans) X++: //TE-rko static void testDatasource(Args _args) { Query query = new query(); QueryBuildDataSource qbds, qbds1, qbds2; querybuildrange qbr; QueryRun qr; VendInvoiceJour VendInvoiceJour; ; qbds = query.addDataSource(tablenum(VendInvoiceJour)); qbds1 = qbds.addDataSource(tablenum(VendTrans)); qbds1.relations(true); qbds1.fetchMode(QueryFetchMode::One2One); qbr = qbds1.addRange(fieldnum(VendTrans,Recid)); // qbr.value(strfmt("%1",1));//-2082064522)); qbds2 = qbds.addDataSource(tablenum(VendInvoiceTrans)); qbds2.relations(true); qbds2.fetchMode(QueryFetchMode::One2One); qbr = qbds2.addRange(fieldnum(VendInvoiceTrans,InvoiceId)); // qbr.value("TI00005951"); qbr.value("RV300654228"); qr = new QueryRun(query); while (qr.next()) { if (qr.changed(tablenum(VendInvoiceJour))) { VendInvoiceJour = qr.get(tablenum(VendInvoiceJour)); info(VendInvoiceJour.InvoiceId); } } } Цитата:
Поэтому я не совсем понимаю, где у вас на данный момент OR и откуда вы хотите его убрать?
|
|
15.01.2009, 15:46 | #5 |
Участник
|
|
|
15.01.2009, 15:46 | #6 |
MCITP
|
Цитата:
Что вы вообще подразумеваете под понятием "OR между датасорсами"? Повторюсь, попробуйте посмотреть запрос который уходит к БД в обоих случаях (с fetchMode и без), или просто info(qbds.toString());. И вы увидите что в исходном варианте (без fetchMode) вообще не происходит джоина никакого, идёт просто X++: SELECT * FROM VendInvoiceJour
__________________
Zhirenkov Vitaly |
|
15.01.2009, 16:00 | #7 |
Moderator
|
|
|
15.01.2009, 16:16 | #8 |
Участник
|
Ну в общем имел в виду
X++: while select VendInvoiceJour join vendTrans join vendInvoiceTrans where VendInvoiceJour.PurchId == vendInvoiceTrans.PurchID && VendInvoiceJour.InvoiceId == vendInvoiceTrans.InvoiceId && VendInvoiceJour.InvoiceDate == vendInvoiceTrans.InvoiceDate && VendInvoiceJour.numberSequenceGroup == vendInvoiceTrans.numberSequenceGroup && vendInvoiceJour.LedgerVoucher == vendTrans.Voucher && vendInvoiceJour.InvoiceAccount == vendTrans.AccountNum && vendInvoiceJour.InvoiceDate == vendTrans.TransDate && vendInvoiceTrans.InvoiceId == "RV300654228" //&& // vendTrans. //range on vendTrans { info(VendInvoiceJour.InvoiceId); } То есть AND между результатами выборки из VendinvoiceTrans и vendTrans. |
|
15.01.2009, 16:22 | #9 |
Moderator
|
|
|
15.01.2009, 16:30 | #10 |
Участник
|
Цитата:
т.е. что-то типа UNION ?
|
|
15.01.2009, 16:36 | #11 |
MCITP
|
Цитата:
Сообщение от rkorchagin
Ну в общем имел в виду
X++: while select VendInvoiceJour join vendTrans join vendInvoiceTrans where VendInvoiceJour.PurchId == vendInvoiceTrans.PurchID && VendInvoiceJour.InvoiceId == vendInvoiceTrans.InvoiceId && VendInvoiceJour.InvoiceDate == vendInvoiceTrans.InvoiceDate && VendInvoiceJour.numberSequenceGroup == vendInvoiceTrans.numberSequenceGroup && vendInvoiceJour.LedgerVoucher == vendTrans.Voucher && vendInvoiceJour.InvoiceAccount == vendTrans.AccountNum && vendInvoiceJour.InvoiceDate == vendTrans.TransDate && vendInvoiceTrans.InvoiceId == "RV300654228" //&& // vendTrans. //range on vendTrans { info(VendInvoiceJour.InvoiceId); } То есть AND между результатами выборки из VendinvoiceTrans и vendTrans. Тогда возможно вам есть смысл добавить Цитата:
qbds1.joinMode(JoinMode::ExistsJoin);
qbds2.joinMode(JoinMode::ExistsJoin);
__________________
Zhirenkov Vitaly |
|
15.01.2009, 16:38 | #12 |
MCITP
|
Мне кажется UNION - это не совсем то, что вы хотите, по крайней мере добились вы явно не его...
UNION в Аксапте, к сожалению, не имеется... Также как и ещё многие фичи SQL.
__________________
Zhirenkov Vitaly |
|
15.01.2009, 16:50 | #13 |
Участник
|
Цитата:
Я правильно понимаю, что вам нужно найти все VendInvoiceJour, по которым есть записи и в vendInvoiceTrans, удовлетворяющие "пользовательским" условиям, и в vendTrans, удовлетворяющие "пользовательским" условиям. Одновременно...
Да - это не совсем UNION - a ПЕРЕСЕЧЕНИЕ результатов выборок из vendInvoiceTrans и vendTrans. А existJoin поставлю только на vendTrans так как данные из vendInvoiceTrans нужны |
|
15.01.2009, 16:54 | #14 |
Участник
|
Я сделаю как написал ранее -
Как сделать AND между двумя датасорсами на одном уровне в query Такой query вроде работает правильно.... |
|
15.01.2009, 17:12 | #15 |
Участник
|
|
|
|
За это сообщение автора поблагодарили: ZVV (1). |
15.01.2009, 17:42 | #16 |
Moderator
|
Да, действительно: http://msdn.microsoft.com/en-us/library/cc605991.aspx
Хоть просто почитать пока... Кстати, сразу бросилось в глаза: Цитата:
Union queries can only be created in the AOT. You cannot use X++ to create a union query.
|
|
Теги |
datasource, query, несвязанные датасорсы, датасорс (datasource) |
|
|