15.12.2006, 12:51 | #1 |
Участник
|
Запрос по двум таблицам
Подскажите, плиззз. Как из такого джоба создать запрос..
джоб: while select inventJournalTable join inventDim where inventDim.inventDimId == inventJournalTable.InventDimID && inventdim.InventLocationId =='А' join inventdim1 where inventdim1.inventDimId == inventJournalTable.ToInventDimID && inventdim1.InventLocationId =='Б' Создала запрос в таком виде, он отрабатывает только первый джойн... qbds1 = query.addDataSource(tableNum(InventJournalTable)); qbds2 = qbds1.addDataSource(tableNum(InventDim)); qbds2.addLink(fieldNum(InventJournalTable, InventDimId), fieldNum(InventDim, InventDimId)); qbds3 = qbds2.addDataSource(tableNum(InventLocation)); qbds3.addLink(fieldNum(InventDim, InventLocationId), fieldNum(InventLocation, InventLocationId)); qbds3.addRange(fieldNum(InventLocation, InventLocationId)).value('А'); Пыталась дальше делать по образу и подобию дописать... qbds4 = qbds1.addDataSource(tableNum(InventDim)); qbds4.addLink(fieldNum(InventJournalTable, ToInventDimId), fieldNum(InventDim, InventDimId)); qbds5 = qbds4.addDataSource(tableNum(InventLocation)); qbds5.addLink(fieldNum(InventDim, InventLocationId), fieldNum(InventLocation, InventLocationId)); qbds5.addRange(fieldNum(InventLocation, InventLocationId)).value('Б'); Но всё равно только qbds1,qbds2,qbds3 отрабатывают.... что ещё могла упустить? |
|
15.12.2006, 13:13 | #2 |
Участник
|
Что вы точно упустили, так это QueryFetchMode
X++: QueryBuildDataSource qbds1, qbds2, qbds3, qbds4, qbds5; Query query = new Query(); qbds1 = query.addDataSource(tableNum(InventJournalTrans)); qbds2 = qbds1.addDataSource(tableNum(InventDim)); qbds2.addLink(fieldNum(InventJournalTrans, InventDimId), fieldNum(InventDim, InventDimId)); qbds2.fetchMode(QueryFetchMode::One2One); qbds3 = qbds2.addDataSource(tableNum(InventLocation)); qbds3.addLink(fieldNum(InventDim, InventLocationId), fieldNum(InventLocation, InventLocationId)); qbds3.addRange(fieldNum(InventLocation, InventLocationId)).value('?'); qbds3.fetchMode(QueryFetchMode::One2One); qbds4 = qbds1.addDataSource(tableNum(InventDim)); qbds4.addLink(fieldNum(InventJournalTrans, ToInventDimId), fieldNum(InventDim, InventDimId)); qbds4.fetchMode(QueryFetchMode::One2One); qbds5 = qbds4.addDataSource(tableNum(InventLocation)); qbds5.addLink(fieldNum(InventDim, InventLocationId), fieldNum(InventLocation, InventLocationId)); qbds5.addRange(fieldNum(InventLocation, InventLocationId)).value('?'); qbds5.fetchMode(QueryFetchMode::One2One); info(query.dataSourceNo(1).toString()); |
|
15.12.2006, 13:16 | #3 |
----------------
|
да и зачем вам qbds3, qbds5
|
|
15.12.2006, 13:18 | #4 |
Участник
|
Во-первых не понятно зачем джоинить InventLocation, если условие накладывается на InventLocationId.
Можно попробовать добавить следующее: qbds2.fetchMode(QueryFetchMode::One2One); qbds4.fetchMode(QueryFetchMode::One2One); |
|
15.12.2006, 13:20 | #5 |
Участник
|
просто нужно выцепить по аналитике с какого склада на какой переместили?
вот и не знаю как подцепить... С какого склада по InventDimID, получается отфильтровать записи.. А вот второй раз прийти в inventdim по полю ToInventDimID , не получается... join inventdim1 where inventdim1.inventDimId == inventJournalTable.ToInventDimID && inventdim1.InventLocationId =='Б' можете ещё что посоветуете.. |
|
15.12.2006, 13:24 | #6 |
Участник
|
fetchMode не помог..., всё равно срабатывает только фильтр "С какого склада" (
|
|
15.12.2006, 13:37 | #7 |
Участник
|
А как вы проверяете некорректность?
|
|
15.12.2006, 13:44 | #8 |
Участник
|
Просто вывожу инфо после отработки джоба и запроса
В джобе выводятся нужные журналы. А вот когда запускаю Query , то выводятся журналы, которые удовлетворяют ограничению по дате и "Складу с ", который привязан к InventDimId. А то что привязка идёт по ToInventDimid- не срабатывает... |
|
15.12.2006, 13:57 | #9 |
Участник
|
Попробуйте отказаться от qbds3 и qbds5. А условия:
qbds3.addRange(fieldNum(InventLocation, InventLocationId)).value('А'); qbds5.addRange(fieldNum(InventLocation, InventLocationId)).value('Б'); замените на: qbds2.addRange(fieldNum(InventDim, InventLocationId)).value('А'); qbds4.addRange(fieldNum(InventDim, InventLocationId)).value('Б'); |
|
15.12.2006, 14:04 | #10 |
Участник
|
Цитата:
Сообщение от pdojn
Попробуйте отказаться от qbds3 и qbds5. А условия:
qbds3.addRange(fieldNum(InventLocation, InventLocationId)).value('А'); qbds5.addRange(fieldNum(InventLocation, InventLocationId)).value('Б'); замените на: qbds2.addRange(fieldNum(InventDim, InventLocationId)).value('А'); qbds4.addRange(fieldNum(InventDim, InventLocationId)).value('Б'); Как тогда это будет всё выглядеть? |
|
15.12.2006, 14:10 | #11 |
Участник
|
Вот так:
X++: while select inventJournalTable join inventDim where inventDim.inventDimId == inventJournalTable.InventDimID && inventdim.InventLocationId =='А' join inventdim1 where inventdim1.inventDimId == inventJournalTable.ToInventDimID && inventdim1.InventLocationId =='Б' |
|
15.12.2006, 14:12 | #12 |
Участник
|
Цитата:
Но этот запрос, у меня давно уже работает... А как это в executeQuery прописать)) |
|
15.12.2006, 14:12 | #13 |
Участник
|
А будет как раз то, что вам нужно - наложен фильтр по соответствующим складам.
|
|
15.12.2006, 14:15 | #14 |
Участник
|
Это был ответ на вопрос:
Именно так и будет выглядеть, а соответственно и это должно: |
|
15.12.2006, 14:19 | #15 |
Участник
|
То есть нижеприведенный job - это аналог написанного вами запроса с select
X++: static void QueryFetchModeExample(Args _args) { /* while select inventJournalTable join inventDim where inventDim.inventDimId == inventJournalTable.InventDimID && inventdim.InventLocationId =='?' join inventdim1 where inventdim1.inventDimId == inventJournalTable.ToInventDimID && inventdim1.InventLocationId =='?' */ QueryBuildDataSource qbds1, qbds2, qbds3; Query query = new Query(); qbds1 = query.addDataSource(tableNum(InventJournalTable)); qbds2 = qbds1.addDataSource(tableNum(InventDim)); qbds2.addLink(fieldNum(InventJournalTable, InventDimId), fieldNum(InventDim, InventDimId)); qbds2.fetchMode(QueryFetchMode::One2One); qbds2.addRange(fieldNum(InventDim, InventLocationId)).value(queryValue('?')); qbds3 = qbds1.addDataSource(tableNum(InventDim)); qbds3.addLink(fieldNum(InventJournalTable, ToInventDimId), fieldNum(InventDim, InventDimId)); qbds3.fetchMode(QueryFetchMode::One2One); qbds3.addRange(fieldNum(InventDim, InventLocationId)).value(queryValue('?')); info(query.dataSourceNo(1).toString()); } |
|
15.12.2006, 14:22 | #16 |
Участник
|
Цитата:
А мне нужно запрос на форме... и для меня это действительно большой вопрос, на который я не могу ответить... А также не могу до конца представить как должен выглядеть qwery... Буду очень благодарна, если ткнёте носом в чём я не права.... |
|
15.12.2006, 14:27 | #17 |
Участник
|
Ну если не верите... вот весь запрос...
public void executeQuery() { Query query = new Query(); QueryBuildDataSource qbds1, qbds2, qbds3,qbds4, qbds5; QueryRun queryRun; str dateFilter; ; // Установка фильтра строк заказов по дате поставки dateFilter = date2str(StartFilter.dateValue(), 123,2,2,2,2,2); dateFilter += '..' + date2str(EndFilter.dateValue(), 123,2,2,2,2,2); qbrFilterDate.value(dateFilter); qbds1 = query.addDataSource(tableNum(InventJournalTable)); qbds1.addRange(fieldNum(InventjournalTable, Posted)).value(SysQuery::value(NoYes::Yes)); qbds1.addRange(fieldNum(InventjournalTable, JournalType)).value(SysQuery::value(InventJournalType::Transfer)); qbds1.addRange(fieldNum(InventjournalTable, PostedDate)).value(dateFilter); qbds2 = qbds1.addDataSource(tableNum(InventDim)); qbds2.addLink(fieldNum(InventJournalTable, InventDimId), fieldNum(InventDim, InventDimId)); qbds2.fetchMode(QueryFetchMode::One2One); qbds3 = qbds2.addDataSource(tableNum(InventLocation)); qbds3.addLink(fieldNum(InventDim, InventLocationId), fieldNum(InventLocation, InventLocationId)); qbds3.addRange(fieldNum(InventLocation, InventLocationId)).value(FilterLocationFrom.text()); qbds3.fetchMode(QueryFetchMode::One2One); qbds4 = qbds1.addDataSource(tableNum(InventDim)); qbds4.addLink(fieldNum(InventJournalTable, ToInventDimId), fieldNum(InventDim, InventDimId)); qbds4.fetchMode(QueryFetchMode::One2One); qbds5 = qbds4.addDataSource(tableNum(InventLocation)); qbds5.addLink(fieldNum(InventDim, InventLocationId), fieldNum(InventLocation, InventLocationId)); qbds5.addRange(fieldNum(InventLocation, InventLocationId)).value(FilterLocationFrom.text()); qbds5.fetchMode(QueryFetchMode::One2One); queryRun = new QueryRun(query); // info(qbds1.toString() + '\n' + qbds2.toString()+ '\n' + qbds3.toString()); while (queryRun.next()) { if (queryRun.changed(tableNum(InventJournalTable))) { inventJournalTable = queryRun.get(tableNum(InventJournalTable)); info(inventJournalTable.JournalId ); } } super(); } |
|
15.12.2006, 14:36 | #18 |
Участник
|
Всё... Спасибо всем... Нашла свою ошибку... Убрала всё лишнее...;-)
|
|
|
Похожие темы | ||||
Тема | Ответов | |||
Суммы по двум таблицам | 17 | |||
Запрос по трем таблицам | 12 | |||
Почему join запрос разбивается на подзапросы!? | 59 | |||
Группировка по двум и более таблицам | 2 | |||
Как выполнить запрос созданный в переменной | 12 |
|