02.03.2005, 11:11 | #1 |
Участник
|
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:08 | #2 |
Участник
|
|
|
02.03.2005, 12:16 | #3 |
Moderator
|
Если Вы умеете пользоваться механизмом QueryBuild, то здесь нет ничего сложного. Разве что нужно для qbds указать joinMode, чтобы сгенерился exists join:
PHP код:
To Mazzy: Сергей, тут вроде все проще, ведь используются не outer joins, а exists.
__________________
Андрей. |
|
02.03.2005, 12:21 | #4 |
Участник
|
Цитата:
Изначально опубликовано Dron AKA andy
Если Вы умеете пользоваться механизмом QueryBuild... А в коде написать Query q = new Query(querystr(MySuperQuery)); Цитата:
Изначально опубликовано Dron AKA andy
Добавление: To Mazzy: Сергей, тут вроде все проще, ведь используются не outer joins, а exists. Надо бы проверить... Но можно я просто спрошу? А outer join Аксапты разве не в exists на СКЛе отображается? |
|
02.03.2005, 12:44 | #5 |
Участник
|
А как быть если условие должно выполняться одновременно?! Как мне помнится Аксапта сначала отберет номенклатуры в привязке к первому вложенному источнику данных, а потом в привязке ко второму! А если необходима одновременность условий?!
|
|
02.03.2005, 12:51 | #6 |
Участник
|
|
|
02.03.2005, 12:55 | #7 |
Moderator
|
Сергей, нет, outer join на SQL остается outer`ом. А как иначе? Exists отсек бы несуществующие в связанной таблице записи, а задача outer`a как раз вывести их по-любому.
__________________
Андрей. |
|
02.03.2005, 12:59 | #8 |
Участник
|
Цитата:
Изначально опубликовано Dron AKA andy
Сергей, нет, outer join на SQL остается outer`ом. |
|
02.03.2005, 13:02 | #9 |
Moderator
|
To Vasilenko Alexsandr:
Нет, по умолчанию АХАРТА при добавлении нового источника данных присоединит его по И со всеми фильтрами.
__________________
Андрей. |
|
02.03.2005, 13:14 | #10 |
Участник
|
Цитата:
Изначально опубликовано mazzy
ФАК: http://forum.mazzy.ru/index.php?showtopic=294 |
|
02.03.2005, 13:15 | #11 |
Участник
|
Цитата:
Изначально опубликовано Dron AKA andy
To Vasilenko Alexsandr: Нет, по умолчанию АХАРТА при добавлении нового источника данных присоединит его по И со всеми фильтрами. |
|
02.03.2005, 13:19 | #12 |
Участник
|
Re: а по существу вопроса?
Цитата:
Изначально опубликовано ta_and
Maxim Gorbunov: Часть сообщения удалена модератором на основании пункта правил 4.1 1) Создать Query и AOT и в коде его использовать 2) Программно создать Query с помощью класса QueryBuild (ссылки на примеры были) |
|
02.03.2005, 13:45 | #13 |
Участник
|
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 |
Administrator
|
На сколько я помню, И между 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 |
Administrator
|
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 |
Участник
|
Юлия Кузнецова вот программный вариант предложенный Максимом:
PHP код:
|
|
02.03.2005, 15:21 | #17 |
Участник
|
Дорогие друзья!
То, что можно "выпрямить запрос", слинковать датасорсы иначе - это понятно. Стандарт добавляет новый датасорс в Query вот здесь, никак не "выпрямляя" запрос: \Classes\SysQueryBuilder\newDatasource Меня интересовала возможность программно повторить это, для известных заранее таблиц и полей связи, точно так же слинковав, как Аксапта. Насколько я поняла, решения без изменения структуры запроса пока никто не знает. |
|
02.03.2005, 15:35 | #18 |
Moderator
|
Извините, Юлия, не понял тогда, что же Вам мешает решить задачу, опираясь на приведенный метод класса?
__________________
Андрей. |
|
02.03.2005, 15:53 | #19 |
Участник
|
Как выяснилось, ничего не мешает))
Решение оказалось простым: PHP код:
Поправьте меня, если это не так |
|
02.03.2005, 15:54 | #20 |
Moderator
|
Кстати, возвращаясь к AND между DS.
Я, похоже, неудачно выразился По умолчанию вообще не получится добавить 2 DS на одном уровне, нужно добавлять QueryFetchMode::One2One. Вот тогда и получится связь по И Добавление: Смешно, но я это написал, еще не прочитав ответа Юлии
__________________
Андрей. |
|