30.07.2015, 16:42 | #1 |
NavAx
|
Сложная выборка многие-ко-многим
Добрый день!
проблема такая - есть поставщик (VendTable) у него отношение многие ко многим с категориями (EcoResCategory) посредством (VendCategory) [VendTable] 1--* [VendCategory] *--1 [EcoResCategory] есть список категорий, выбрать поставщика у которого есть хотя бы одна из указанных категорий - легко. Но! Задача стоит чтобы выбрать поставщиков у которых есть все указанные категории. Есть идеи как такое сделать? Дополнительным условием стоит то что надо все это вложить в QueryBuild.
__________________
Начать что-либо, никогда не поздно - просто начни сейчас. |
|
|
За это сообщение автора поблагодарили: Мартынов Дмитрий (1). |
30.07.2015, 17:08 | #2 |
NavAx
|
Может быть сделать view, где будет field1 = count() по категориям, далее приджоинить этот view, где field1 >= нужного числа?
|
|
|
За это сообщение автора поблагодарили: skof (1), S.Kuskov (2). |
30.07.2015, 17:19 | #3 |
Участник
|
Непонятно, в чем подвох. Есть VendCategory - кросс-таблица для комбинаций поставщик-категория. Если есть N категорий, и нужно отобрать поставщиков, по которым в кросс-таблице есть записи для каждой из этих N категорий, то по идее в Query надо сделать одну выборку (qbds) из VendCategory по 1-й категории и N-1 выборок из VendCategory по exists join для оставшихся категорий со связкой по ссылке на поставщика из 1-го qbds.
|
|
30.07.2015, 17:27 | #4 |
NavAx
|
Да! Это мысль!
__________________
Начать что-либо, никогда не поздно - просто начни сейчас. |
|
30.07.2015, 17:32 | #5 |
NavAx
|
Цитата:
Сообщение от gl00mie
Непонятно, в чем подвох. Есть VendCategory - кросс-таблица для комбинаций поставщик-категория. Если есть N категорий, и нужно отобрать поставщиков, по которым в кросс-таблице есть записи для каждой из этих N категорий, то по идее в Query надо сделать одну выборку (qbds) из VendCategory по 1-й категории и N-1 выборок из VendCategory по exists join для оставшихся категорий со связкой по ссылке на поставщика из 1-го qbds.
__________________
Начать что-либо, никогда не поздно - просто начни сейчас. |
|
31.07.2015, 07:30 | #6 |
Участник
|
Цитата:
Иначе количество во View должно быть посчитано по уже отфильтрованным категориям! Поэтому View либо нужно каким-то образом строить на лету(?), либо фильтровать View при помощи вспомогательной таблицы, в которую перед выборкой заполнять выбор пользователя. Но для этого в свою очередь нужно решить задачу разграничения данных для одновременной работы нескольких сессий с этой таблицей, и тащить в результирующий View ещё и идентификатор фильтрующей комбинации. А насколько произвольным может быть выбор пользователя? Нельзя ли построить работу так, чтобы пользователи сначала формировали некие общие для всех комбинации, а потом при фильтрации не указывали набор категорий, а выбирали из уже готовых? P.S. Сдаётся мне, что примерно для этих же целей в AX2012 ввели понятие "наборов аналитик". |
|
31.07.2015, 08:11 | #7 |
Участник
|
Ну если пользователь выбирает разумное число категорий за раз, то да, а так, я бы, возможно, сделал итерационное сужение выборки:
|
|
31.07.2015, 12:09 | #8 |
Дмитрий Ерин
|
Цитата:
Что то типа такого : 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 |
Участник
|
Ух ты! В 2012-ой появился HAVING. Не знал. Тогда да , наверное можно без View обойтись и на лету весь запрос собрать.
Но для полного счастья нужно ещё суметь присоеденить к таблице поставщиков этот ограниченный при помощи группировки подзапрос как вложенный. По опыту работы с предыдущими версиями группировка в сложном запросе выполняется после джойнов и применяется ко всему запросу (. Может быть если делать связи на уровне датасурсов формы оно сработает? Последний раз редактировалось S.Kuskov; 31.07.2015 в 13:02. |
|
31.07.2015, 13:01 | #10 |
Участник
|
На лету может не получиться, если выбранных категорий может быть достаточно много, хотя, конечно, в пределах пары десятков категорий можно, наверно, выбрать и за раз.
Небольшое дополнение касаемо having: там, наверно, все же надо использовать условие >= |
|
31.07.2015, 13:23 | #11 |
Дмитрий Ерин
|
Цитата:
пост кат а 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 |
Участник
|
Случаем не стандартную view хотите переписать?
ProcCategoryVendorView
__________________
AxAssist 2012 - Productivity Tool for Dynamics AX 2012/2009/4.0/3.0 |
|