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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 02.03.2005, 11:11   #1  
Юлия Кузнецова is offline
Юлия Кузнецова
Участник
 
3 / 10 (1) +
Регистрация: 02.03.2005
Адрес: Санкт-Петербург
Query: 2 присоединенные таблицы 1:n
Задача: отобрать номенклатуры, которые
1) есть в строках заказов с ценой = 10
2) есть в строках закупок с ценой = 20

На справочнике номенклатур строим стандартный фильтр: цепляем к картотеке номенклатур строки заказа и строки закупки. Добавляем фильтры:
Строки заказа, Цена/ед., "10"
Строки закупки, Цена/ед., "20"

Т.о. у нас к одной таблице присоединены 2 со связями 1:n и с фильтром по ним. Я не знаю, как программно строить такие запросы.

Стандартный фильтр работает. Смотрим через мониторинг SQL запросов, что он строит:

------------------
SELECT

<куча полей>

FROM INVENTTABLE A(NOLOCK) ,INVENTTABLEMODULE B(NOLOCK) ,INVENTTABLEMODULE C(NOLOCK) ,INVENTTABLEMODULE D(NOLOCK) ,INVENTITEMLOCATION E(NOLOCK) WHERE (A.DATAAREAID='fin') AND ((B.DATAAREAID='fin') AND ((B.MODULETYPE=1) AND (A.ITEMID=B.ITEMID))) AND ((C.DATAAREAID='fin') AND ((C.MODULETYPE=0) AND (A.ITEMID=C.ITEMID))) AND ((D.DATAAREAID='fin') AND ((D.MODULETYPE=2) AND (A.ITEMID=D.ITEMID))) AND ((E.DATAAREAID='fin') AND ((E.INVENTDIMID=' Axapta') AND (A.ITEMID=E.ITEMID))) AND

EXISTS (SELECT 'x' FROM SALESLINE F(NOLOCK)
WHERE ((F.DATAAREAID='fin') AND ((F.SALESPRICE=1.E1) AND (A.ITEMID=F.ITEMID))) AND

EXISTS (SELECT 'x' FROM PURCHLINE G(NOLOCK) WHERE ((G.DATAAREAID='fin') AND ((G.PURCHPRICE=2.E1) AND (A.ITEMID=G.ITEMID)))))
ORDER BY A.DATAAREAID,A.ITEMID OPTION(FAST 1,LOOP JOIN)
------------------

Видим 2 вложенных подзапроса.

Вопрос: как такое построить программно, используя Query?
Старый 02.03.2005, 12:16   #3  
online
Dron AKA andy
Moderator
 
944 / 253 (10) ++++++
Регистрация: 27.03.2002
Адрес: Москва
Если Вы умеете пользоваться механизмом QueryBuild, то здесь нет ничего сложного. Разве что нужно для qbds указать joinMode, чтобы сгенерился exists join:
PHP код:
qbds.joinMode(JoinMode::ExistsJoin); 
Добавление:
To Mazzy:
Сергей, тут вроде все проще, ведь используются не outer joins, а exists.
__________________
Андрей.
Старый 02.03.2005, 12:21   #4  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Изначально опубликовано Dron AKA andy
Если Вы умеете пользоваться механизмом QueryBuild...
Зачем так сложно? Запрос нужно мышкой создать в АОТ.
А в коде написать Query q = new Query(querystr(MySuperQuery));

Цитата:
Изначально опубликовано Dron AKA andy
Добавление:
To Mazzy:
Сергей, тут вроде все проще, ведь используются не outer joins, а exists.
Exists в SQLьном запросе.
Надо бы проверить... Но можно я просто спрошу?
А outer join Аксапты разве не в exists на СКЛе отображается?
Старый 02.03.2005, 12:44   #5  
Vasilenko Alexsandr is offline
Vasilenko Alexsandr
Участник
Дети Юза
 
90 / 16 (1) ++
Регистрация: 05.09.2002
Адрес: Одесса
А как быть если условие должно выполняться одновременно?! Как мне помнится Аксапта сначала отберет номенклатуры в привязке к первому вложенному источнику данных, а потом в привязке ко второму! А если необходима одновременность условий?!
Старый 02.03.2005, 12:55   #7  
online
Dron AKA andy
Moderator
 
944 / 253 (10) ++++++
Регистрация: 27.03.2002
Адрес: Москва
Сергей, нет, outer join на SQL остается outer`ом. А как иначе? Exists отсек бы несуществующие в связанной таблице записи, а задача outer`a как раз вывести их по-любому.
__________________
Андрей.
Старый 02.03.2005, 12:59   #8  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Изначально опубликовано Dron AKA andy
Сергей, нет, outer join на SQL остается outer`ом.
Тогда виноват.
Старый 02.03.2005, 13:02   #9  
online
Dron AKA andy
Moderator
 
944 / 253 (10) ++++++
Регистрация: 27.03.2002
Адрес: Москва
To Vasilenko Alexsandr:

Нет, по умолчанию АХАРТА при добавлении нового источника данных присоединит его по И со всеми фильтрами.
__________________
Андрей.
Старый 02.03.2005, 13:14   #10  
Vasilenko Alexsandr is offline
Vasilenko Alexsandr
Участник
Дети Юза
 
90 / 16 (1) ++
Регистрация: 05.09.2002
Адрес: Одесса
Цитата:
Изначально опубликовано mazzy
ФАК: http://forum.mazzy.ru/index.php?showtopic=294
Это отлично отработает, если источники данных находятся на разных уровнях, а если два или более источников в Query находятся на одном уровне, то это так не отработает!! Между Join-ами AND не получается!! Или я ошибаюсь?!
Старый 02.03.2005, 13:15   #11  
Vasilenko Alexsandr is offline
Vasilenko Alexsandr
Участник
Дети Юза
 
90 / 16 (1) ++
Регистрация: 05.09.2002
Адрес: Одесса
Цитата:
Изначально опубликовано Dron AKA andy
To Vasilenko Alexsandr:

Нет, по умолчанию АХАРТА при добавлении нового источника данных присоединит его по И со всеми фильтрами.
Почему-то не разу не удалось добиться И!! Может я что-то не так делаю?!
Старый 02.03.2005, 13:19   #12  
Vasilenko Alexsandr is offline
Vasilenko Alexsandr
Участник
Дети Юза
 
90 / 16 (1) ++
Регистрация: 05.09.2002
Адрес: Одесса
Re: а по существу вопроса?
Цитата:
Изначально опубликовано ta_and
Maxim Gorbunov: Часть сообщения удалена модератором на основании пункта правил 4.1
По существу уже ответили!!) Есть 2 спопоба:
1) Создать Query и AOT и в коде его использовать
2) Программно создать Query с помощью класса QueryBuild (ссылки на примеры были)
Старый 02.03.2005, 13:45   #13  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Re: а по существу вопроса?
Цитата:
Изначально опубликовано ta_and
Вопрос поставлен ясно и понятно.
Услвия задачи.
В стандартном функционале есть ситуация...
Maxim Gorbunov: Часть сообщения удалена модератором на основании пункта правил 4.1
Как скажете, конечно. Но отвечать на подобным образом поставленный вопрос нет никакого желания.

Правила: 2. Рекомендации - Как правильно задать вопрос, чтобы быть услышанным
http://www.axforum.info/forums/showt...postid=13070#2

Или вы здесь соревнование устраиваете?

Maxim Gorbunov: Часть сообщения удалена модератором на основании пунктов правил 4.1 и 4.2
Старый 02.03.2005, 13:55   #14  
Maxim Gorbunov is offline
Maxim Gorbunov
Administrator
Соотечественники
Лучший по профессии 2009
 
2,483 / 645 (26) +++++++
Регистрация: 27.11.2001
Адрес: Dubai, UAE
На сколько я помню, И между DataSource действительно не получится, если класть их на один уровень. Будет ИЛИ.

"Выпрямляйте" запрос. Например так:

InventTable
PurchLine
SalesLine

InventTable - PurchLine: ExistJoin
InventTable.ItemId == PurchLine.ItemId

PurchLine - SalesLine: ExistJoin
PurchLine.ItemId == SalesLine.ItemId
(не забудьте сбросить другие Relations).

Добавьте Range на PuchLine.PurchPrice и на SalesLine.SalesPrice.
__________________
Not registered yet? Register here!
Have comments, questions, suggestions or anything else regarding our web site? Don't hesitate, send them to me
Старый 02.03.2005, 14:05   #15  
Maxim Gorbunov is offline
Maxim Gorbunov
Administrator
Соотечественники
Лучший по профессии 2009
 
2,483 / 645 (26) +++++++
Регистрация: 27.11.2001
Адрес: Dubai, UAE
mazzy, ta_and, как модератор раздела "Программирование в Axapta", я удалил Ваши сообщения. Пожалуйста, выясняйте отношения либо в Курилке, либо в личной переписке.

ta_and, пожалуйста, смените тон.
__________________
Not registered yet? Register here!
Have comments, questions, suggestions or anything else regarding our web site? Don't hesitate, send them to me
Старый 02.03.2005, 14:27   #16  
Vasilenko Alexsandr is offline
Vasilenko Alexsandr
Участник
Дети Юза
 
90 / 16 (1) ++
Регистрация: 05.09.2002
Адрес: Одесса
Юлия Кузнецова вот программный вариант предложенный Максимом:
PHP код:
    
    Query                                query 
= new Query();
    
QueryBuildDataSource inventTableDSpurchLineDS,salesLineDS;
    
PurchPrice                       purchPriceValue;
    
SalesPrice                       salesPriceValue;
    ;
    
salesPriceValue 10;
    
purchPriceValue 20;
    
inventTableDS query.addDataSource(tablenum(InventTable));
    
purchLineDS inventTableDS.addDataSource(tablenum(PurchLine));
    
purchLineDS.relations(true);
    
purchLineDS.fetchMode(QueryFetchMode::One2Many);
    
purchLineDS.joinMode(JoinMode::ExistsJoin);
    
purchLineDS.addRange(fieldnum(PurchLine,PurchPrice )).value(SysQuery::value(purchPriceValue));
    
    
salesLineDS purchLineDS.addDataSource(tablenum(salesLine));
    
salesLineDS.addLink(fieldnum(PurchLine,ItemId),fieldnum(SalesLine,ItemId));
    
salesLineDS.joinMode(JoinMode::ExistsJoin);
    
salesLineDS.addRange(fieldnum(SalesLine,SalesPrice)).value(SysQuery::value(salesPriceValue)); 
Если подходит - берите и пользуйтесь!
Старый 02.03.2005, 15:21   #17  
Юлия Кузнецова is offline
Юлия Кузнецова
Участник
 
3 / 10 (1) +
Регистрация: 02.03.2005
Адрес: Санкт-Петербург
Дорогие друзья!

То, что можно "выпрямить запрос", слинковать датасорсы иначе - это понятно.

Стандарт добавляет новый датасорс в Query вот здесь, никак не "выпрямляя" запрос:
\Classes\SysQueryBuilder\newDatasource

Меня интересовала возможность программно повторить это, для известных заранее таблиц и полей связи, точно так же слинковав, как Аксапта.

Насколько я поняла, решения без изменения структуры запроса пока никто не знает.
Старый 02.03.2005, 15:35   #18  
online
Dron AKA andy
Moderator
 
944 / 253 (10) ++++++
Регистрация: 27.03.2002
Адрес: Москва
Извините, Юлия, не понял тогда, что же Вам мешает решить задачу, опираясь на приведенный метод класса?
__________________
Андрей.
Старый 02.03.2005, 15:53   #19  
Юлия Кузнецова is offline
Юлия Кузнецова
Участник
 
3 / 10 (1) +
Регистрация: 02.03.2005
Адрес: Санкт-Петербург
Как выяснилось, ничего не мешает))

Решение оказалось простым:

PHP код:

    Query                   q   
= new Query();
    
QueryBuildDataSource    qbds;
    
QueryBuildDataSource    sales;
    
QueryBuildDataSource    purch;
    ;
    
qbds    q.addDataSource(tableNum(InventTable));

    
sales   qbds.addDataSource(tableNum(SalesLine));
    
sales.relations(true);
    
sales.joinMode(JoinMode::ExistsJoin);
    
sales.fetchMode(QueryFetchMode::One2One);
    
sales.addRange(fieldNum(SalesLineSalesPrice)).value(SysQuery::value(10));

    
purch   qbds.addDataSource(tableNum(PurchLine));
    
purch.relations(true);
    
purch.joinMode(JoinMode::ExistsJoin);
    
purch.fetchMode(QueryFetchMode::One2One);
    
purch.addRange(fieldNum(PurchLinePurchPrice)).value(SysQuery::value(20)); 
Забавно, что подобные вопросы всплывают с завидной периодичностью, и на них как правило отвечают что-то типа: "Насколько я помню, И между DataSource действительно не получится, если класть их на один уровень".

Поправьте меня, если это не так
Старый 02.03.2005, 15:54   #20  
online
Dron AKA andy
Moderator
 
944 / 253 (10) ++++++
Регистрация: 27.03.2002
Адрес: Москва
Кстати, возвращаясь к AND между DS.
Я, похоже, неудачно выразился По умолчанию вообще не получится добавить 2 DS на одном уровне, нужно добавлять QueryFetchMode::One2One. Вот тогда и получится связь по И

Добавление:
Смешно, но я это написал, еще не прочитав ответа Юлии
__________________
Андрей.
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Advanced query range value expressions: поле таблицы - имя вcтроенной функции year(). ATimTim DAX: Программирование 12 27.03.2009 18:16
palleagermark: Sample union query from AX 2009 Blog bot DAX Blogs 0 11.07.2008 20:05
И снова Query и временные таблицы Def DAX: Программирование 19 08.12.2006 15:46
Dynamics AX Geek: Using query() Blog bot DAX Blogs 0 28.10.2006 16:40
Можно делать join таблицы к себе же через Query? korvin DAX: Программирование 13 02.03.2006 11:51

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

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

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