25.04.2011, 15:15 | #1 |
Участник
|
NoExistsJoin и addRange
Здравствуйте уважаемые.
Вот с такой проблемой столкнулся: есть код X++: QueryBuildDataSource qbdsMain = query.dataSourceTable(tablenum(BankPaymentOrderJour_RU)); QueryBuildDataSource qbdsLedgerJoined; qbdsLedgerJoined = qbdsMain.addDataSource(tablenum(BankAccountTrans),'BankAccountTrans'); if (bankPaymentOrderJourReport_RU.dimension()) { qbdsLedgerJoined.addRange(fieldId2Ext(fieldnum(BankAccountTrans, Dimension),1)).value(bankPaymentOrderJourReport_RU.dimension()); } qbdsLedgerJoined.relations(true); qbdsLedgerJoined.joinMode(JoinMode::NoExistsJoin); |
|
25.04.2011, 15:22 | #2 |
северный Будда
|
То, что нет фильтра - неудивительно. NotExistsJoin всего лишь позволяет отобрать те записи, которым нет соответствия в подчинённом датасоурсе. Никакие фильтры на него наложить не получится. Для этого нужен InnerJoin
__________________
С уважением, Вячеслав |
|
25.04.2011, 15:34 | #3 |
Участник
|
А какие варианты решения данной проблемы могут быть? Мне нужны записи из таблицы BankPaymentOrderJour_RU которых нет в BankAccountTrans и у которых, опять же, в BankAccountTrans есть заданный Dimension.
|
|
25.04.2011, 15:46 | #4 |
Участник
|
Цитата:
Если я правильно понял задачу, то вы хотите отобрать все записи BankPaymentOrderJour_RU для которых в таблице BankAccountTrans нет записей с указанным Dimension. Dimension - это масив? Коли так, то range нужно накладывать отдельно на каждый фильтруемый элемент масива X++: dimension = bankPaymentOrderJourReport_RU.dimension();
qbdsLedgerJoined.addRange(fieldId2Ext(fieldnum(BankAccountTrans, Dimension),1)).value(dimension[1]) |
|
25.04.2011, 16:39 | #5 |
северный Будда
|
Думаю, что дело тут не в Range, а в
X++: qbdsLedgerJoined.relations(true);
__________________
С уважением, Вячеслав |
|
25.04.2011, 17:09 | #6 |
Участник
|
Цитата:
Сообщение от pitersky
Думаю, что дело тут не в Range, а в
X++: qbdsLedgerJoined.relations(true); |
|
25.04.2011, 17:35 | #7 |
Участник
|
После формирования query, в качестве самоконтроля, можно вывести в инфолог текст получившегося SQL-запроса.
X++: info(query.DataSourceNo(1).toString()); |
|
03.07.2012, 08:59 | #8 |
Участник
|
и снова я блондиню....:blush:
помогите перевести вот этот запрос с SQL в нечно красивейшее через QueryBuildDataSource
X++: Select VendInvoiceJour.InvoiceDate,VSN_PURCHORDERJOUR.CENTERPROFIX,VendInvoiceTrans.ItemId from VendInvoiceJour inner join VendInvoiceTrans on VendInvoiceTrans.PurchId = VendInvoiceJour.PurchId inner join PurchTable on PurchTable.PurchId = VendInvoiceTrans.PurchId inner join PurchLine on PurchLine.PurchId = PurchTable.PurchId inner join VSN_PURCHORDERJOUR on VSN_PURCHORDERJOUR.ORDERID = PurchLine.VSN_PURCHORDERID where VSN_PURCHORDERJOUR.CENTERPROFIX= '008-001' and VendInvoiceJour.InvoiceDate >= '2011/03/01' and VendInvoiceJour.InvoiceDate <= '2011/03/20' и может есть у кого нить ссылки на литературу по этому делу на русском языке?
__________________
Работа программиста и шамана имеют много общего!- Оба бормочут непонятные слова, совершают непонятные действия и не могут объяснить как оно работает.... |
|
03.07.2012, 09:14 | #9 |
Участник
|
Нет никаких принципиальных отличий между добавлением второй таблицы и добавлением последующих. Лиса-а-а, вы попробуйте, если не получиться, то выложите свой код, кто-нибудь обязательно поможет и заодно раскажет в чём была проблема.
Получить готовое решение с нуля как-то не педагогично |
|
03.07.2012, 10:31 | #10 |
Участник
|
если вы пытались и у вас не получилось, то скорее всего у вас ошибка в fetchmode, нужно всем соединяемым таблицам задать:
X++: qbds.fetchMode(QueryFetchMode::One2One); |
|
|
За это сообщение автора поблагодарили: Лиса-а-а (1). |
03.07.2012, 10:47 | #11 |
Участник
|
такс.. начинаю с малого, но и тут засада
X++: Query query = this.queryRun().query(); QueryBuildDataSource dataSourceJourTest = query.addDataSource(tableNum(VendInvoiceJour)); dataSourceJourTest = dataSourceJourTest.addDataSource(VendInvoiceTrans,'VendInvoiceTrans'); dataSourceJourTest.addLink(fieldnum(VendInvoiceTrans, PurchId), fieldnum(VendInvoiceJour, PurchId)); dataSourceJourTest.relations(true); dataSourceJourTest.joinMode(joinMode::ExistsJoin); если dataSourceJourTest.relations(true); убераю то вообще по каким то непонятным палям их цепляет
__________________
Работа программиста и шамана имеют много общего!- Оба бормочут непонятные слова, совершают непонятные действия и не могут объяснить как оно работает.... |
|
03.07.2012, 10:57 | #12 |
Участник
|
X++: dataSourceJourTest.addLink(fieldnum(VendInvoiceJour, PurchId), fieldnum(VendInvoiceTrans, PurchId));
__________________
Sergey Nefedov Последний раз редактировалось SRF; 03.07.2012 в 11:02. |
|
|
За это сообщение автора поблагодарили: Лиса-а-а (1). |
03.07.2012, 11:40 | #13 |
Administrator
|
Лиса-а-а,
Во-первых, почему вы делаете joinMode(JoinMode::ExistsJoin), если в SQL запросе, который вы хотите получить, везде inner join? Во-вторых, relations(true) автоматически загружает связи между таблицами из AOT. Соответственно, все те связи, что вы в явном виде определили заранее перед этим через addLink(), будут проигнорированы. В-третьих, в addLink() первый параметр - fieldId поля из таблицы верхнего уровня, а второй - из таблицы текущего уровня. То есть, в вашем случае должно быть так: X++: dataSourceJourTest.addLink(fieldnum(VendInvoiceJour, PurchId), fieldnum(VendInvoiceTrans, PurchId));
__________________
Not registered yet? Register here! Have comments, questions, suggestions or anything else regarding our web site? Don't hesitate, send them to me |
|
|
За это сообщение автора поблагодарили: Лиса-а-а (1). |
03.07.2012, 11:42 | #14 |
Administrator
|
Да, и в догонку - связывать VendInvoiceJour и VendInvoiceTrans только по PurchId неправильно. Задумайтесь о том, что будет, если по одной закупке будет проведено две накладных.
__________________
Not registered yet? Register here! Have comments, questions, suggestions or anything else regarding our web site? Don't hesitate, send them to me |
|
03.07.2012, 11:48 | #15 |
NavAx
|
qbds = query.addDataSource(tableNum(VendInvoiceJour));
qbds.addRange(fieldnum(VendInvoiceJour, InvoiceDate)).value(QueryRange('2011/03/01','2011/03/20')); qbds.addRange(fieldnum(VendInvoiceJour, CENTERPROFIX)).value(QueryValue('008-001')); qbds = qbds.addDataSource(tableNum(VendInvoiceTrans)); qbds.relations(false); qbds.joinMode(joinMode::InnerJoin); qbds.addLink(fieldnum(VendInvoiceJour, PurchId), fieldnum(VendInvoiceTrans, PurchId)); qbds = qbds.addDataSource(tableNum(PurchTable)); qbds.relations(false); qbds.joinMode(joinMode::InnerJoin); qbds.addLink(fieldnum(VendInvoiceJour, PurchId), fieldnum(PurchTable, PurchId)); qbds = qbds.addDataSource(tableNum(PurchLine)); qbds.relations(false); qbds.joinMode(joinMode::InnerJoin); qbds.addLink(fieldnum(PurchTable, PurchId), fieldnum(PurchLine, PurchId)); qbds = qbds.addDataSource(tableNum(VSN_PURCHORDERJOUR)); qbds.relations(false); qbds.joinMode(joinMode::InnerJoin); qbds.addLink(fieldnum(PurchLine, VSN_PURCHORDERID), fieldnum(VSN_PURCHORDERJOUR, ORDERID)); qbds.addRange(fieldnum(VSN_PURCHORDERJOUR, CENTERPROFIX)).value(QueryValue('008-001')); // правильнее qbds = query.addDataSource(tableNum(VendInvoiceJour)); qbds.addRange(fieldnum(VendInvoiceJour, InvoiceDate)).value(QueryRange('2011/03/01','2011/03/20')); qbds.addRange(fieldnum(VendInvoiceJour, CENTERPROFIX)).value(QueryValue('008-001')); qbds = qbds.addDataSource(tableNum(VendInvoiceTrans)); qbds.relations(false); qbds.joinMode(joinMode::InnerJoin); qbds.addLink(fieldnum(VendInvoiceJour, PurchId), fieldnum(VendInvoiceTrans, PurchId)); qbds.addLink(fieldnum(VendInvoiceJour, PurchId), fieldnum(VendInvoiceTrans, PurchId)); qbds.addLink(fieldnum(VendInvoiceJour, InvoiceId), fieldnum(VendInvoiceTrans, InvoiceId)); qbds.addLink(fieldnum(VendInvoiceJour, InvoiceDate), fieldnum(VendInvoiceTrans, InvoiceDate)); qbds.addLink(fieldnum(VendInvoiceJour, numberSequenceGroup), fieldnum(VendInvoiceTrans, numberSequenceGroup)); qbds.addLink(fieldnum(VendInvoiceJour, InternalInvoiceId), fieldnum(VendInvoiceTrans, InternalInvoiceId)); qbds = qbds.addDataSource(tableNum(PurchLine)); qbds.relations(false); qbds.joinMode(joinMode::InnerJoin); qbds.addLink(fieldnum(VendInvoiceTrans, InventTransId), fieldnum(PurchLine, InventTransId)); qbds = qbds.addDataSource(tableNum(VSN_PURCHORDERJOUR)); qbds.relations(false); qbds.joinMode(joinMode::InnerJoin); qbds.addLink(fieldnum(PurchLine, VSN_PURCHORDERID), fieldnum(VSN_PURCHORDERJOUR, ORDERID)); qbds.addRange(fieldnum(VSN_PURCHORDERJOUR, CENTERPROFIX)).value(QueryValue('008-001')); |
|
|
За это сообщение автора поблагодарили: Лиса-а-а (1). |
04.07.2012, 11:11 | #16 |
MCITP
|
Цитата:
но возможно причина просто в том, что ваш параметр аналитики (bankPaymentOrderJourReport_RU.dimension()) - пустой? Тогда как я понимаю при такой записи рэндж действительно не добавится. Надо добавить queryValue() видимо...
__________________
Zhirenkov Vitaly |
|
|
Похожие темы | ||||
Тема | Ответов | |||
AddRange не фильтрует | 6 | |||
Расширенный AddRange и OuterJoin | 0 | |||
Расширенный AddRange | 3 | |||
addRange | 7 | |||
Можно ли редактировать форму, если на нее наложен addRange? | 10 |
|