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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 12.01.2011, 09:53   #1  
DesertBrowser is offline
DesertBrowser
Участник
 
55 / 10 (1) +
Регистрация: 04.08.2010
Объединение таблиц по Range-полю одной из них
Добрый день.
Подскажите, как можно решить следующую задачу.
В упрощённом варианте выглядит так:
есть 2 таблицы:
таблица Nums - номера
Num
Description

таблица NumGroups - группы номеров
GroupID
Amount
RangeNum - поле служит для связи между таблицами. Здесь задаются критерии, согласно которым группируются номера.

Также на форме пользователь также задаёт произвольный критерий отбора по полю Num с использованием стандартных символов (*, !, .. и т.п.) - UserRangeNum типа Range.
Каким должен быть Query, чтобы найти сумму по всем группам номеров, попадающих под условие, заданное пользователем? Можно ли сделать это одним запросом?
X++:
    query                               q = new Query();
    QueryRun                        qr;
    QueryBuildDataSource      qbds, qbds1;
    NumGroups                      numGroups;
    Range                              userRangeNum;
    ;
    qbds = q.addDataSource(tablenum(numGroups));
    qbds.addSelectionField(fieldnum(numGroups, Amount),SelectionField::Sum);
    qbds.orderMode(OrderMode::GroupBy);

    qbds1 = qbds.addDataSource(tablenum(nums));
    qbds1.fetchMode(0);
    qbds1.joinMode(JoinMode::ExistsJoin);
    qbds1.addRange(fieldnum(nums, num)).value(userRangeNum);
    //как добавить условие объединения таблиц - по полю критерия?
PS AX v 3.0
Старый 12.01.2011, 09:58   #2  
pitersky is offline
pitersky
северный Будда
Аватар для pitersky
Ex AND Project
Соотечественники
 
1,486 / 408 (16) +++++++
Регистрация: 26.09.2007
Адрес: Солнечная система
qbds1.addLink(field, parentField) попробуйте
Но вообще ИМХО структура данных нелогична - я бы добавил в первую таблицу GroupId и убрал бы RangeNum из второй
__________________
С уважением,
Вячеслав
За это сообщение автора поблагодарили: Gustav (1).
Старый 12.01.2011, 10:11   #3  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,429 / 1772 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от DesertBrowser Посмотреть сообщение
RangeNum - поле служит для связи между таблицами. Здесь задаются критерии, согласно которым группируются номера.
Каким образом формализованы критерии? Вы сможете реализовать то что вы хотите на стандартном SQL?
Цитата:
Сообщение от DesertBrowser Посмотреть сообщение
Можно ли сделать это одним запросом?
Если одним запросом это у вас не получится на SQL, то что тогда можто требовать от аксапты
Старый 12.01.2011, 10:26   #4  
DesertBrowser is offline
DesertBrowser
Участник
 
55 / 10 (1) +
Регистрация: 04.08.2010
Цитата:
Каким образом формализованы критерии? Вы сможете реализовать то что вы хотите на стандартном SQL?
Критерии задаются по правилам Аксапты, с использованием её стандартных символов (*, !, .. и т.п.)
На стандартном SQL в таком случае я бы сделала разбор полей поля, в котором задан критерий, для каждой строки, с добавлением во вспомогательную таблицу, и дальше работала бы с ней
Цитата:
Если одним запросом это у вас не получится на SQL, то что тогда можто требовать от аксапты
В Аксапте есть замечательная возможность задавать условие на поле с использованием критерия, как
X++:
qbds1.addRange(fieldnum(nums, num)).value(userRangeNum);
но критерий в таком случае единичный и задан заранее. Поэтому по аналогии и хотелось сделать нечто подобное для объединения таблиц.
Цитата:
qbds1.addLink(field, parentField)
Попробовала.
X++:
    qbds1 = q.addDataSource(tablenum(nums));
    qbds1.addRange(fieldnum(nums, num)).value(userRangeNum);
    
    qbds = qbds1.addDataSource(tablenum(numGroups));

    qbds.addSelectionField(fieldnum(numGroups, Amount),SelectionField::Sum);
    qbds.orderMode(OrderMode::GroupBy);

    qbds.addLink(fieldnum(nums, num),fieldnum(NumGroups, RangeNum));
не помогло
Старый 12.01.2011, 10:55   #5  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,429 / 1772 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от DesertBrowser Посмотреть сообщение
но критерий в таком случае единичный
Не обязательно, можно использовать запятые.
Цитата:
Сообщение от DesertBrowser Посмотреть сообщение
и задан заранее.
А вот это самое главное. Универсальность задания критерия реализуется средствами не SQL а самой аксапты. Аксапта просто заранее формирует необходимый запрос. Вам же нужно динамически менять запрос, а это уже возможно только с использованием вложенных подзапросов
Старый 12.01.2011, 11:01   #6  
DesertBrowser is offline
DesertBrowser
Участник
 
55 / 10 (1) +
Регистрация: 04.08.2010
Цитата:
Не обязательно, можно использовать запятые.
Я не совсем точно выразилась. Конечно, можно использовать запятые и подстановочные знаки. Единичный - т.е. он единственный, один; в соотвествующем поле нескольких записей таблицы критериев соответственно будет несколько, по числу записей.
Подводя итог - к сожалению, напрямую и одним запросом объединить таблицы по полю критерия и полю, которое для него является составляющим, нельзя
Старый 12.01.2011, 11:07   #7  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
А один номер может входить в разные группы?
Старый 12.01.2011, 11:07   #8  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,429 / 1772 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
К стати, для того чтобы проверить удовлетворяет ли значение произвольному кретерию в системе есть стандартный метод Global::inRange
За это сообщение автора поблагодарили: Gustav (3), DesertBrowser (1).
Старый 12.01.2011, 11:09   #9  
DesertBrowser is offline
DesertBrowser
Участник
 
55 / 10 (1) +
Регистрация: 04.08.2010
Цитата:
А один номер может входить в разные группы?
Сейчас нет
Старый 13.01.2011, 12:06   #10  
DesertBrowser is offline
DesertBrowser
Участник
 
55 / 10 (1) +
Регистрация: 04.08.2010
Ещё один вопрос. Возможно, ответ на поверхности, но найти поиском по форуму не удалось.
Подскажите, как на одно поле (например Nums.Num) наложить два условия со значениями типа Range (userRangeNum и curRangeNum) по И.
Старый 13.01.2011, 12:30   #11  
pitersky is offline
pitersky
северный Будда
Аватар для pitersky
Ex AND Project
Соотечественники
 
1,486 / 408 (16) +++++++
Регистрация: 26.09.2007
Адрес: Солнечная система
Цитата:
Сообщение от DesertBrowser Посмотреть сообщение
Ещё один вопрос. Возможно, ответ на поверхности, но найти поиском по форуму не удалось.
Подскажите, как на одно поле (например Nums.Num) наложить два условия со значениями типа Range (userRangeNum и curRangeNum) по И.
А как это? Одно поле должно содержать два значения?
__________________
С уважением,
Вячеслав

Последний раз редактировалось pitersky; 13.01.2011 в 12:32.
Старый 13.01.2011, 13:00   #12  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,429 / 1772 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от DesertBrowser Посмотреть сообщение
Подскажите, как на одно поле (например Nums.Num) наложить два условия со значениями типа Range (userRangeNum и curRangeNum) по И.
Простого способа к сожалению нет
Диапазон условий
Старый 13.01.2011, 13:24   #13  
DesertBrowser is offline
DesertBrowser
Участник
 
55 / 10 (1) +
Регистрация: 04.08.2010
2 pitersky
Значение поля должно удовлетворять и первому, и второму условию. Оба условия имеют тип Range
2S.Kuskov
Спасибо за ссылку, буду пробовать вариант с 2 объединёнными таблицами, на каждую из которых накладывается по условию
Старый 13.01.2011, 15:15   #14  
raz is offline
raz
NavAx
Аватар для raz
NavAx Club
Лучший по профессии 2014
Лучший по профессии 2009
 
1,490 / 1060 (38) ++++++++
Регистрация: 22.07.2003
Адрес: МО
Цитата:
Сообщение от DesertBrowser Посмотреть сообщение
Ещё один вопрос. Возможно, ответ на поверхности, но найти поиском по форуму не удалось.
Подскажите, как на одно поле (например Nums.Num) наложить два условия со значениями типа Range (userRangeNum и curRangeNum) по И.
X++:
    qBDS.addRange(fieldNum(LedgerTable, AccountNum)).value(userRangeNum);
    qBDS.addRange(fieldId2Ext(fieldNum(LedgerTable, AccountNum), 1)).value(curRangeNum);
этого хотелось?
За это сообщение автора поблагодарили: mazzy (5), alex55 (1), S.Kuskov (2), pitersky (2), DesertBrowser (1).
Старый 13.01.2011, 15:23   #15  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,429 / 1772 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Ух ты! Жаль что так объеденить можно не больше двух условий.
Старый 13.01.2011, 16:50   #16  
DesertBrowser is offline
DesertBrowser
Участник
 
55 / 10 (1) +
Регистрация: 04.08.2010
Цитата:
этого хотелось?
Да! Именно. Спасибо
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Пустые названия системных таблиц в report data range (DAX 4.0) Qaz Qwerty DAX: Функционал 3 06.08.2008 00:05
Range по Display полю Андрей К. DAX: Программирование 2 15.08.2007 21:39
объединение таблиц Freeangel DAX: Программирование 3 21.04.2005 13:08
Join трех таблиц (две к одной) ATimTim DAX: Программирование 25 03.02.2005 11:31
Как получить записи двух таблиц в виде одной таблицы? chi DAX: Программирование 32 16.12.2004 11:44

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

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

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 18:36.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.