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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 05.10.2007, 16:43   #1  
m_ax is offline
m_ax
Участник
 
4 / 10 (1) +
Регистрация: 18.06.2007
Помогите составить запрос
Всем привет!
Подскажите, пожалуйста, возможно ли в аксапте реализовать следующий запрос.

Есть 3 таблички: Table_1, Table_2 и Table_3. Хочу получить:
X++:
select * from Table_1
 where exists (select * from Table_2 
                     where  Table_1.tab1 = Table_2.tab1 and
                                exists (select * from Table_3 
                                           where Table_2.tab2 = Table_3.tab2 and
                                                    Table_3.name like '% SecondName%'))
 and
 exists (select * from Table_3 
            where  Table_1.tab3 = Table_3.tab3 and
                      Table_3.name like '% FirstName%')
Пишу следующее:
X++:
q = new Query();
qbds = q.addDataSource(tableNum(Table_1));
 
qbds2 = qbds.addDataSource(tablenum(Table_2));
qbds2.addLink(fieldNum(Table_1,tab1),fieldNum(Table_2,tab1));
qbds2.joinMode(JoinMode::ExistsJoin);
qbds2.fetchMode(0);
qbds2_3 = qbds2.addDataSource(tablenum(Table_3));
qbds2_3.addLink(fieldNum(Table_2,tab2),fieldNum(Table_3,tab2));
qbds2_3.joinMode(JoinMode::ExistsJoin);
qbds2_3.fetchMode(0);
qbds2_3.addRange(fieldnum(Table_3, Name)).value('*SecondName*');
 
qbds3 = qbds.addDataSource(tablenum(Table_3));
qbds3.addLink(fieldNum(Table_1,tab3),fieldNum(Table_3,tab3));
qbds3.joinMode(JoinMode::ExistsJoin);
qbds3.fetchMode(0);
qbds3.addRange(fieldnum(Table_3, Name)).value('*FirstName*');
queryRun = new queryRun(q);
while (queryRun.next())
{
    table = queryRun.get(tableNum(Table_1));
    info(table.tab1);
}
Range по SecondName учитывается, а по FirstName, НЕ учитывается.
Если поменять местами exest – ы
X++:
q = new Query();
qbds = q.addDataSource(tableNum(Table_1));
 
qbds3 = qbds.addDataSource(tablenum(Table_3));
qbds3.addLink(fieldNum(Table_1,tab3),fieldNum(Table_3,tab3));
qbds3.joinMode(JoinMode::ExistsJoin);
qbds3.fetchMode(0);
qbds3.addRange(fieldnum(Table_3, Name)).value('*FirstName*');
 
qbds2 = qbds.addDataSource(tablenum(Table_2));
qbds2.addLink(fieldNum(Table_1,tab1),fieldNum(Table_2,tab1));
qbds2.joinMode(JoinMode::ExistsJoin);
qbds2.fetchMode(0);
qbds2_3 = qbds2.addDataSource(tablenum(Table_3));
qbds2_3.addLink(fieldNum(Table_2,tab2),fieldNum(Table_3,tab2));
qbds2_3.joinMode(JoinMode::ExistsJoin);
qbds2_3.fetchMode(0);
qbds2_3.addRange(fieldnum(Table_3, Name)).value('*SecondName*');
 
queryRun = new queryRun(q);
while (queryRun.next())
{
    table = queryRun.get(tableNum(Table_1));
    info(table.tab1);
}
Получается обратная ситуация, Range по SecondName НЕ учитывается, а по FirstName, учитывается.
В SQL конечно от перемены мест, результат запроса не меняется. Подскажите, пожалуйста, что нужно сделать в аксапте, чтоб учитывались оба условия. Если это возможно.
Старый 05.10.2007, 17:29   #2  
sparur is offline
sparur
Участник
 
334 / 25 (1) +++
Регистрация: 19.05.2006
В Аксе такой запрос реализовать по-моему невозможно. Для решения задачи Вам скорее всего необходимо реализовать это дело через подзапросы.
Старый 05.10.2007, 17:53   #3  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
можно надо только

X++:
// qbds3 = qbds.addDataSource(tablenum(Table_3));
qbds3 = qbds2_3.addDataSource(tablenum(Table_3));
// qbds3.addLink(fieldNum(Table_1,tab3),fieldNum(Table_3,tab3));
qbds3.addRange(fieldNum(Table_3, RecID)).Value('(table_1.tab3==table_3.tab3)');
Ну может еще названия датасурсов проставить
За это сообщение автора поблагодарили: Borzaja (0).
Старый 05.10.2007, 17:57   #4  
sparur is offline
sparur
Участник
 
334 / 25 (1) +++
Регистрация: 19.05.2006
Цитата:
Сообщение от belugin Посмотреть сообщение
можно надо только

X++:
// qbds3 = qbds.addDataSource(tablenum(Table_3));
qbds3 = qbds2_3.addDataSource(tablenum(Table_3));
// qbds3.addLink(fieldNum(Table_1,tab3),fieldNum(Table_3,tab3));
qbds3.addRange(fieldNum(Table_3, RecID)).Value('(table_1.tab3==table_3.tab3)');
Ну может еще названия датасурсов проставить
и точно ведь, про сложные range как то запамятовал я имел ввиду что в аксе к одному датасорсу нельзя прикрутить 2 подчиненных Но эт на самом деле и не важно... Хотя...

Последний раз редактировалось sparur; 05.10.2007 в 21:02.
Старый 05.10.2007, 18:20   #5  
konopello is offline
konopello
SAP
SAP
 
628 / 76 (4) ++++
Регистрация: 08.11.2005
Адрес: Минск
да по мойму тоже можно, а вот и ссылочка которая в свое время мне и пригодилась http://www.axaptapedia.com/Expressions_in_query_ranges
Старый 05.10.2007, 18:22   #6  
konopello is offline
konopello
SAP
SAP
 
628 / 76 (4) ++++
Регистрация: 08.11.2005
Адрес: Минск
да и по моему в первый раз мне ее подогнал именно belugin
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
передача параметров в запрос while select tolstjak DAX: Программирование 13 15.02.2009 19:39
Нужно срочно дописать запрос помогите CRASH_505 DAX: Программирование 3 09.09.2008 10:49
Почему join запрос разбивается на подзапросы!? 3oppo DAX: Программирование 59 28.06.2007 11:52
Долго отрабатывает запрос по таблице InventItemLocation AlexeyBP DAX: Администрирование 1 30.05.2007 17:33
Помогите написать запрос Кандидат DAX: Программирование 7 17.10.2005 14:44

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

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

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