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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 30.07.2015, 16:42   #1  
skof is offline
skof
NavAx
NavAx Club
 
100 / 12 (1) ++
Регистрация: 09.01.2002
Адрес: РБ, Минск
Сложная выборка многие-ко-многим
Добрый день!
проблема такая - есть поставщик (VendTable) у него отношение многие ко многим с категориями (EcoResCategory) посредством (VendCategory)
[VendTable] 1--* [VendCategory] *--1 [EcoResCategory]
есть список категорий, выбрать поставщика у которого есть хотя бы одна из указанных категорий - легко. Но! Задача стоит чтобы выбрать поставщиков у которых есть все указанные категории.
Есть идеи как такое сделать?
Дополнительным условием стоит то что надо все это вложить в QueryBuild.
__________________
Начать что-либо, никогда не поздно - просто начни сейчас.
За это сообщение автора поблагодарили: Мартынов Дмитрий (1).
Старый 30.07.2015, 17:08   #2  
raz is offline
raz
NavAx
Аватар для raz
NavAx Club
Лучший по профессии 2014
Лучший по профессии 2009
 
1,494 / 1065 (38) ++++++++
Регистрация: 22.07.2003
Адрес: МО
Может быть сделать view, где будет field1 = count() по категориям, далее приджоинить этот view, где field1 >= нужного числа?
За это сообщение автора поблагодарили: skof (1), S.Kuskov (2).
Старый 30.07.2015, 17:19   #3  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5798 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Непонятно, в чем подвох. Есть VendCategory - кросс-таблица для комбинаций поставщик-категория. Если есть N категорий, и нужно отобрать поставщиков, по которым в кросс-таблице есть записи для каждой из этих N категорий, то по идее в Query надо сделать одну выборку (qbds) из VendCategory по 1-й категории и N-1 выборок из VendCategory по exists join для оставшихся категорий со связкой по ссылке на поставщика из 1-го qbds.
Старый 30.07.2015, 17:27   #4  
skof is offline
skof
NavAx
NavAx Club
 
100 / 12 (1) ++
Регистрация: 09.01.2002
Адрес: РБ, Минск
Цитата:
Сообщение от raz Посмотреть сообщение
Может быть сделать view, где будет field1 = count() по категориям, далее приджоинить этот view, где field1 >= нужного числа?
Да! Это мысль!
__________________
Начать что-либо, никогда не поздно - просто начни сейчас.
Старый 30.07.2015, 17:32   #5  
skof is offline
skof
NavAx
NavAx Club
 
100 / 12 (1) ++
Регистрация: 09.01.2002
Адрес: РБ, Минск
Цитата:
Сообщение от gl00mie Посмотреть сообщение
Непонятно, в чем подвох. Есть VendCategory - кросс-таблица для комбинаций поставщик-категория. Если есть N категорий, и нужно отобрать поставщиков, по которым в кросс-таблице есть записи для каждой из этих N категорий, то по идее в Query надо сделать одну выборку (qbds) из VendCategory по 1-й категории и N-1 выборок из VendCategory по exists join для оставшихся категорий со связкой по ссылке на поставщика из 1-го qbds.
т.е. нужно добавить столько qbds сколько категорий выбрал пользователь?
__________________
Начать что-либо, никогда не поздно - просто начни сейчас.
Старый 31.07.2015, 07:30   #6  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от raz Посмотреть сообщение
Может быть сделать view, где будет field1 = count() по категориям, далее приджоинить этот view, где field1 >= нужного числа?
А что при фильтрации пользователь гарантировано указывает полный исчерпывающий набор категорий поставщика?. В таком случае задачу можно решать от обратного - выбирать поставщиков у которых нет других(не выбранных) категорий, не забыв отсечь поставщиков вообще без категорий.

Иначе количество во View должно быть посчитано по уже отфильтрованным категориям!
Поэтому View либо нужно каким-то образом строить на лету(?), либо фильтровать View при помощи вспомогательной таблицы, в которую перед выборкой заполнять выбор пользователя. Но для этого в свою очередь нужно решить задачу разграничения данных для одновременной работы нескольких сессий с этой таблицей, и тащить в результирующий View ещё и идентификатор фильтрующей комбинации.

А насколько произвольным может быть выбор пользователя? Нельзя ли построить работу так, чтобы пользователи сначала формировали некие общие для всех комбинации, а потом при фильтрации не указывали набор категорий, а выбирали из уже готовых?

P.S. Сдаётся мне, что примерно для этих же целей в AX2012 ввели понятие "наборов аналитик".
Старый 31.07.2015, 08:11   #7  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5798 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Цитата:
Сообщение от skof Посмотреть сообщение
т.е. нужно добавить столько qbds сколько категорий выбрал пользователь?
Ну если пользователь выбирает разумное число категорий за раз, то да, а так, я бы, возможно, сделал итерационное сужение выборки:
  • взять первые 15 выбранных категорий,
  • сузить выборку по поставщикам
  • взять следующие 15 выбранных категорий, при этом фильтровать по поставщикам, отобранным на предыдущем шаге
  • etc
Дополнительно можно применить предложенную view'шку по количеству заданных для поставщика категорий. Но в целом решение сильно зависит от ваших конкретных данных.
Старый 31.07.2015, 12:09   #8  
Ruff is offline
Ruff
Дмитрий Ерин
Аватар для Ruff
1C
 
475 / 396 (14) ++++++
Регистрация: 18.09.2003
Адрес: Тула
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Иначе количество во View должно быть посчитано по уже отфильтрованным категориям!
Поэтому View либо нужно каким-то образом строить на лету(?), либо фильтровать View при помощи вспомогательной таблицы...
Мне кажется, тут поможет HAVING. Группируем кросстаблицу по поставщику, считаем число категорий и сравниваем с числом выбранных категорий (оно по идее должно быть известно из интерфейса).
Что то типа такого :
X++:
qbdsVendor = query.addDataSource(...);
...
qbdsVendCat = qbdsVendor.addDataSource(...);
...
qbdsVendCat.addGroupByField(fieldNum(VendCategory, VendorId));
qbdsVendCat.addSelectionField(fieldNum(VendCategory, CategoryId),SelectionField::Count);
...
query.addHavingFilter(qbdsVendCat, "Category", AggregateFunction::Count).value(strfmt("==%1", _selectedCatNum));
За это сообщение автора поблагодарили: gl00mie (5), S.Kuskov (5).
Старый 31.07.2015, 12:39   #9  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Ух ты! В 2012-ой появился HAVING. Не знал. Тогда да , наверное можно без View обойтись и на лету весь запрос собрать.

Но для полного счастья нужно ещё суметь присоеденить к таблице поставщиков этот ограниченный при помощи группировки подзапрос как вложенный. По опыту работы с предыдущими версиями группировка в сложном запросе выполняется после джойнов и применяется ко всему запросу (. Может быть если делать связи на уровне датасурсов формы оно сработает?

Последний раз редактировалось S.Kuskov; 31.07.2015 в 13:02.
Старый 31.07.2015, 13:01   #10  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5798 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
На лету может не получиться, если выбранных категорий может быть достаточно много, хотя, конечно, в пределах пары десятков категорий можно, наверно, выбрать и за раз.
Небольшое дополнение касаемо having: там, наверно, все же надо использовать условие >=
Старый 31.07.2015, 13:23   #11  
Ruff is offline
Ruff
Дмитрий Ерин
Аватар для Ruff
1C
 
475 / 396 (14) ++++++
Регистрация: 18.09.2003
Адрес: Тула
Цитата:
Сообщение от gl00mie Посмотреть сообщение
Небольшое дополнение касаемо having: там, наверно, все же надо использовать условие >=
Я не уточнил, что кросс-таблица должна быть уже отфильтрована по категориям (Range-ом или exists join-ом). И в этом случае условие "больше" просто никогда не выполнится. Так как если группировать нефильтрованную кросс-таблицу, то условие "больше" вполне может сработать для поставщиков, у которых просто много категорий, но части выбранных - нет:

пост кат
а 1
а 2
а 5
а 6
а 7
б 1
б 2
б 3
б 4

выбор польз-ля: 1, 2, 3

если не фильтровать, то получаем:
а 5 (>=3) - ОК
б 4 (>=3) - ОК

а если с фильтром "1,2,3" :
а 2 (==3) - FAIL
б 3 (==3) - OK

PS: решал похожую задачу, правда она была сложнее, в итоге пришлось вообще делать прямые SQL-запросы с HAVING-ом и кучей вложенных селектов
__________________
Старый 31.07.2015, 14:35   #12  
Alex_KD is offline
Alex_KD
Участник
AxAssist
MCBMSS
Соотечественники
 
522 / 362 (14) ++++++
Регистрация: 06.07.2006
Адрес: Melbourne, Down Under
Случаем не стандартную view хотите переписать?
ProcCategoryVendorView
__________________
AxAssist 2012 - Productivity Tool for Dynamics AX 2012/2009/4.0/3.0
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
выборка истории на дату или как перевести select в query. ax4 Kashesh DAX: Программирование 6 31.10.2014 08:08
Выборка данных: накладные Евгений88 DAX: Программирование 4 31.01.2013 09:43
Выборка произвольных записей одним запросом db DAX: Программирование 1 23.09.2010 14:15
Выборка данных через AOS vs SQL Server kashperuk DAX: Программирование 70 21.09.2010 14:09
Динамическая выборка DreamCreator DAX: Программирование 6 05.11.2004 15:26
Опции темы Поиск в этой теме
Поиск в этой теме:

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

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

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

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