29.07.2009, 14:41 | #1 |
Участник
|
link по ИЛИ между источниками данных
как можно организовать query по следующему:
select table1 exists join table2 where (table2.f1 == table1.f1 || table2.f1 == table1.f2) ; так работает. не пойму как можно сделать addlink по ИЛИ между двуми datasourse? q = new Query(); qB = q.addDataSource(tablenum(table1)); qB2 = qB.addDataSource(tablenum(table2)); qB2.joinMode(joinMode::ExistsJoin); а дальше? |
|
29.07.2009, 15:22 | #2 |
NavAx
|
А дальше - т.н. advanced "Расширенный фильтр".
http://www.axaptapedia.com/Expressions_in_query_ranges Основная идея - через "дырку" в парсере запросов Axapta можно скормить ему такие query ranges, которые без. доп. обработки практически "напрямую" уйдут в SQL.
__________________
Жизнь прекрасна! Если, конечно, правильно подобрать антидепрессанты... |
|
|
За это сообщение автора поблагодарили: lev (5). |
29.07.2009, 21:58 | #3 |
MCITP
|
Цитата:
Сообщение от Maximin
А дальше - т.н. advanced "Расширенный фильтр".
http://www.axaptapedia.com/Expressions_in_query_ranges Основная идея - через "дырку" в парсере запросов Axapta можно скормить ему такие query ranges, которые без. доп. обработки практически "напрямую" уйдут в SQL. На данном форуме эта тема тоже уже многократно обсасывалась...
__________________
Zhirenkov Vitaly |
|
30.07.2009, 09:46 | #4 |
Участник
|
Я бы не сказал, что все так просто. Линки не парсятся также как ренджи. Если у кого-то получилось связать по OR пару линков, поделитесь рабочим примером, плиззз!
__________________
// no comments |
|
30.07.2009, 10:23 | #5 |
MCITP
|
Здесь в ответах речь и не идёт о "связывании двух линков", а об "подмене этих линков расширенным рэнджем"... почувствуйте разницу.
__________________
Zhirenkov Vitaly |
|
30.07.2009, 11:43 | #6 |
Участник
|
Смею заметить, что конструкция типа
X++: qB2.addRange(tablenum(table2, RecId)).value("(table2.f1 == table1.f1 || table2.f1 == table1.f2)");
__________________
// no comments |
|
30.07.2009, 12:00 | #7 |
MCITP
|
Цитата:
Не канает, потому что синтаксис хромает... Запрос по таблице параметров.
__________________
Zhirenkov Vitaly |
|
|
За это сообщение автора поблагодарили: dech (1). |
13.01.2010, 12:58 | #8 |
Участник
|
В продолжение темы есть такая задачка.
Нужно в гриде вывести информацию по сложному условию. на обычном SQL это может выглядеть примерно так: Код: SELECT FROM RPayTrans WHERE (RPayTrans.SourceDate = :date AND EXISTS SELECT FROM RPayFundMember WHERE RPayFundMember.PayCostType == RPayTrans.PayCtype AND RPayFundMember.CounterUnit == :unit OR RPayTrans.PayPeriod = :date AND NOT EXISTS SELECT FROM RPayFundMember WHERE RPayFundMember.PayCostType == RPayTrans.PayCtype AND RPayFundMember.CounterUnit == :unit ) Через "Expressions in query ranges" пока не получилось |
|
13.01.2010, 13:06 | #9 |
Участник
|
Цитата:
Сообщение от kia
В продолжение темы есть такая задачка.
Нужно в гриде вывести информацию по сложному условию. на обычном SQL это может выглядеть примерно так: Код: SELECT FROM RPayTrans WHERE (RPayTrans.SourceDate = :date AND EXISTS SELECT FROM RPayFundMember WHERE RPayFundMember.PayCostType == RPayTrans.PayCtype AND RPayFundMember.CounterUnit == :unit OR RPayTrans.PayPeriod = :date AND NOT EXISTS SELECT FROM RPayFundMember WHERE RPayFundMember.PayCostType == RPayTrans.PayCtype AND RPayFundMember.CounterUnit == :unit ) Через "Expressions in query ranges" пока не получилось p.s. От таких решений, этому модулю хуже уже не станет |
|
14.01.2010, 09:14 | #10 |
Участник
|
В AX 2009 можно примерно так :
X++: Query query; QueryBuildDataSource qbdsRPayTrans; QueryBuildDataSource qbdsRPayFundMember; ; query = new Query(); query.queryType(QueryType::Union); qbdsRPayTrans = query.addDataSource(tableNum(RPayTrans)); qbdsRPayTrans.unionType(UnionType::Union); qbdsRPayTrans.addRange(fieldNum(RPayTrans, SourceDate)).value(...); qbdsRPayFundMember = qbdsRPayTrans.addDataSource(tableNum(RPayFundMember)); qbdsRPayFundMember.addLink(fieldNum(RPayTrans, PayCtype), fieldNum(RPayFundMember, PayCostType)); qbdsRPayFundMember.addRange(fieldNum(RPayFundMember, CounterUnit)).value(...); qbdsRPayTrans = query.addDataSource(tableNum(RPayTrans)); qbdsRPayTrans.unionType(UnionType::Union); qbdsRPayTrans.addRange(fieldNum(RPayTrans, PayPeriod)).value(...); qbdsRPayFundMember = qbdsRPayTrans.addDataSource(tableNum(RPayFundMember)); qbdsRPayFundMember.addLink(fieldNum(RPayTrans, PayCtype), fieldNum(RPayFundMember, PayCostType)); qbdsRPayFundMember.addRange(fieldNum(RPayFundMember, CounterUnit)).value(...); qbdsRPayFundMember.joinMode(JoinMode::NoExistsJoin);
__________________
Sergey Nefedov |
|
|
За это сообщение автора поблагодарили: Red Stranger (1). |
14.01.2010, 11:31 | #11 |
Участник
|
|
|
14.01.2010, 11:41 | #12 |
Участник
|
Значений поля RPayFundMember.PayCostType для одного значения RPayFundMember.CounterUnit не должно быть очень уж много. Вряд ли больше 20..30 значений. Значит, вместо подзапросов можно просто сделать перечисление
PHP код:
|
|
14.01.2010, 15:06 | #13 |
Участник
|
Цитата:
Сейчас их всего 70. Но это далеко не предел. И механизм групп расчитан на произвольную настройку. |
|
14.01.2010, 15:24 | #14 |
Участник
|
Если нужно собрать побыстрее, можно написать текст запроса в строку и передать её на исполнение через statement.executeQuery(). Результат запихнуть в таблицу для грида.
|
|
14.01.2010, 16:35 | #15 |
Участник
|
Я говорил не об общем количестве записей в таблице RPayFundMember, а о количестве записей для одного конкретного значения поля CounerUnit. Т.е. список видов зарплат для одного конкретного счетчика.
Так Вы же предполагаете использовать Query. Т.е. добавлять условие через Range.Value(). Т.е. Вам надо программно сформировать символьную строку, которую потом передать в Value(). Какие проблемы-то? Ну, схематично, как-то так X++: while select RPayFundMember where RPayFundMember.CounterUnit = "unit" { strValue = (strValue ? " || " : "") + "'" + RPayFundMember.PayCostType + "'"; } Query.QueryBuildDataSource(...).AddRange(...).Value(strValue); |
|