AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск Все разделы прочитаны

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 15.12.2006, 12:51   #1  
fialka is offline
fialka
Участник
 
347 / 16 (1) ++
Регистрация: 05.10.2006
Адрес: Екатеринбург
? Запрос по двум таблицам
Подскажите, плиззз. Как из такого джоба создать запрос..
джоб:
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  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Что вы точно упустили, так это 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());
Но я бы не советовал дальше еще расширять этот запрос, потому что после определенного числа источников и FetchMode не спасет.
Старый 15.12.2006, 13:16   #3  
Wamr is offline
Wamr
----------------
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
1,737 / 858 (32) +++++++
Регистрация: 15.01.2002
Адрес: Москва
Записей в блоге: 7
да и зачем вам qbds3, qbds5
Старый 15.12.2006, 13:18   #4  
pdojn is offline
pdojn
Участник
 
50 / 12 (1) ++
Регистрация: 24.06.2004
Адрес: Москва
Во-первых не понятно зачем джоинить InventLocation, если условие накладывается на InventLocationId.
Можно попробовать добавить следующее:
qbds2.fetchMode(QueryFetchMode::One2One);
qbds4.fetchMode(QueryFetchMode::One2One);
Старый 15.12.2006, 13:20   #5  
fialka is offline
fialka
Участник
 
347 / 16 (1) ++
Регистрация: 05.10.2006
Адрес: Екатеринбург
Цитата:
Сообщение от Wamr Посмотреть сообщение
да и зачем вам qbds3, qbds5
просто нужно выцепить по аналитике с какого склада на какой переместили?
вот и не знаю как подцепить... С какого склада по InventDimID, получается отфильтровать записи..
А вот второй раз прийти в inventdim по полю ToInventDimID , не получается...

join inventdim1
where inventdim1.inventDimId == inventJournalTable.ToInventDimID &&
inventdim1.InventLocationId =='Б'
можете ещё что посоветуете..
Старый 15.12.2006, 13:24   #6  
fialka is offline
fialka
Участник
 
347 / 16 (1) ++
Регистрация: 05.10.2006
Адрес: Екатеринбург
Цитата:
Сообщение от pdojn Посмотреть сообщение
Во-первых не понятно зачем джоинить InventLocation, если условие накладывается на InventLocationId.
Можно попробовать добавить следующее:
qbds2.fetchMode(QueryFetchMode::One2One);
qbds4.fetchMode(QueryFetchMode::One2One);
fetchMode не помог..., всё равно срабатывает только фильтр "С какого склада" (
Старый 15.12.2006, 13:37   #7  
pdojn is offline
pdojn
Участник
 
50 / 12 (1) ++
Регистрация: 24.06.2004
Адрес: Москва
А как вы проверяете некорректность?
Старый 15.12.2006, 13:44   #8  
fialka is offline
fialka
Участник
 
347 / 16 (1) ++
Регистрация: 05.10.2006
Адрес: Екатеринбург
Цитата:
Сообщение от pdojn Посмотреть сообщение
А как вы проверяете некорректность?
Просто вывожу инфо после отработки джоба и запроса
В джобе выводятся нужные журналы. А вот когда запускаю Query , то выводятся журналы, которые удовлетворяют ограничению по дате и "Складу с ", который привязан к InventDimId. А то что привязка идёт по ToInventDimid- не срабатывает...
Старый 15.12.2006, 13:57   #9  
pdojn is offline
pdojn
Участник
 
50 / 12 (1) ++
Регистрация: 24.06.2004
Адрес: Москва
Попробуйте отказаться от 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  
fialka is offline
fialka
Участник
 
347 / 16 (1) ++
Регистрация: 05.10.2006
Адрес: Екатеринбург
Цитата:
Сообщение от 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('Б');
И как же это будет тогда фильтровать по полю ToInventDimid?
Как тогда это будет всё выглядеть?
Старый 15.12.2006, 14:10   #11  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Вот так:
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  
fialka is offline
fialka
Участник
 
347 / 16 (1) ++
Регистрация: 05.10.2006
Адрес: Екатеринбург
Цитата:
Сообщение от kashperuk Посмотреть сообщение
Вот так:

X++:

while select inventJournalTable
join inventDim
where inventDim.inventDimId == inventJournalTable.InventDimID &&
inventdim.InventLocationId =='А'
join inventdim1
where inventdim1.inventDimId == inventJournalTable.ToInventDimID &&
inventdim1.InventLocationId =='Б'


Не.. я понимаю пятница
Но этот запрос, у меня давно уже работает...
А как это в executeQuery прописать))
Старый 15.12.2006, 14:12   #13  
pdojn is offline
pdojn
Участник
 
50 / 12 (1) ++
Регистрация: 24.06.2004
Адрес: Москва
А будет как раз то, что вам нужно - наложен фильтр по соответствующим складам.
Старый 15.12.2006, 14:15   #14  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Это был ответ на вопрос:
Цитата:
Сообщение от fialka Посмотреть сообщение
Как тогда это будет всё выглядеть?
Именно так и будет выглядеть, а соответственно и это должно:
Цитата:
Сообщение от fialka Посмотреть сообщение
Но этот запрос, у меня давно уже работает...
Старый 15.12.2006, 14:19   #15  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
То есть нижеприведенный 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  
fialka is offline
fialka
Участник
 
347 / 16 (1) ++
Регистрация: 05.10.2006
Адрес: Екатеринбург
Цитата:
Сообщение от kashperuk Посмотреть сообщение
Это был ответ на вопрос:


Именно так и будет выглядеть, а соответственно и это должно:
Но это в классе, джобе работает .
А мне нужно запрос на форме...
и для меня это действительно большой вопрос, на который я не могу ответить...
А также не могу до конца представить как должен выглядеть qwery...
Буду очень благодарна, если ткнёте носом в чём я не права....
Старый 15.12.2006, 14:27   #17  
fialka is offline
fialka
Участник
 
347 / 16 (1) ++
Регистрация: 05.10.2006
Адрес: Екатеринбург
Ну если не верите... вот весь запрос...
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  
fialka is offline
fialka
Участник
 
347 / 16 (1) ++
Регистрация: 05.10.2006
Адрес: Екатеринбург
Всё... Спасибо всем... Нашла свою ошибку... Убрала всё лишнее...;-)
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Суммы по двум таблицам ice DAX: Программирование 17 28.04.2008 15:53
Запрос по трем таблицам npokypatop DAX: Программирование 12 24.08.2007 11:07
Почему join запрос разбивается на подзапросы!? 3oppo DAX: Программирование 59 28.06.2007 11:52
Группировка по двум и более таблицам rrkrivov DAX: Программирование 2 27.12.2004 07:29
Как выполнить запрос созданный в переменной ddadream DAX: Программирование 12 27.02.2002 14:57
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 18:52.