|
12.01.2011, 09:53 | #1 |
Участник
|
Объединение таблиц по 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); //как добавить условие объединения таблиц - по полю критерия? |
|
12.01.2011, 09:58 | #2 |
северный Будда
|
qbds1.addLink(field, parentField) попробуйте
Но вообще ИМХО структура данных нелогична - я бы добавил в первую таблицу GroupId и убрал бы RangeNum из второй
__________________
С уважением, Вячеслав |
|
|
За это сообщение автора поблагодарили: Gustav (1). |
12.01.2011, 10:11 | #3 |
Участник
|
Цитата:
Если одним запросом это у вас не получится на SQL, то что тогда можто требовать от аксапты |
|
12.01.2011, 10:26 | #4 |
Участник
|
Цитата:
Каким образом формализованы критерии? Вы сможете реализовать то что вы хотите на стандартном 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 |
Участник
|
Не обязательно, можно использовать запятые.
А вот это самое главное. Универсальность задания критерия реализуется средствами не SQL а самой аксапты. Аксапта просто заранее формирует необходимый запрос. Вам же нужно динамически менять запрос, а это уже возможно только с использованием вложенных подзапросов |
|
12.01.2011, 11:01 | #6 |
Участник
|
Цитата:
Не обязательно, можно использовать запятые.
Подводя итог - к сожалению, напрямую и одним запросом объединить таблицы по полю критерия и полю, которое для него является составляющим, нельзя |
|
12.01.2011, 11:07 | #7 |
Moderator
|
А один номер может входить в разные группы?
|
|
12.01.2011, 11:07 | #8 |
Участник
|
К стати, для того чтобы проверить удовлетворяет ли значение произвольному кретерию в системе есть стандартный метод Global::inRange
|
|
|
За это сообщение автора поблагодарили: Gustav (3), DesertBrowser (1). |
12.01.2011, 11:09 | #9 |
Участник
|
Цитата:
А один номер может входить в разные группы?
|
|
13.01.2011, 12:06 | #10 |
Участник
|
Ещё один вопрос. Возможно, ответ на поверхности, но найти поиском по форуму не удалось.
Подскажите, как на одно поле (например Nums.Num) наложить два условия со значениями типа Range (userRangeNum и curRangeNum) по И. |
|
13.01.2011, 12:30 | #11 |
северный Будда
|
А как это? Одно поле должно содержать два значения?
__________________
С уважением, Вячеслав Последний раз редактировалось pitersky; 13.01.2011 в 12:32. |
|
13.01.2011, 13:00 | #12 |
Участник
|
|
|
13.01.2011, 15:15 | #13 |
NavAx
|
Цитата:
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, 13:24 | #14 |
Участник
|
2 pitersky
Значение поля должно удовлетворять и первому, и второму условию. Оба условия имеют тип Range 2S.Kuskov Спасибо за ссылку, буду пробовать вариант с 2 объединёнными таблицами, на каждую из которых накладывается по условию |
|
13.01.2011, 15:23 | #15 |
Участник
|
Ух ты! Жаль что так объеденить можно не больше двух условий.
|
|
13.01.2011, 16:50 | #16 |
Участник
|
Цитата:
этого хотелось?
|
|