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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 29.07.2009, 14:41   #1  
PPL is offline
PPL
Участник
 
14 / 12 (1) ++
Регистрация: 21.02.2008
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  
Maximin is offline
Maximin
NavAx
NavAx Club
 
412 / 346 (12) ++++++
Регистрация: 09.10.2002
Адрес: Москва
А дальше - т.н. advanced "Расширенный фильтр".
http://www.axaptapedia.com/Expressions_in_query_ranges

Основная идея - через "дырку" в парсере запросов Axapta можно скормить ему такие query ranges, которые без. доп. обработки практически "напрямую" уйдут в SQL.
__________________
Жизнь прекрасна! Если, конечно, правильно подобрать антидепрессанты...
За это сообщение автора поблагодарили: lev (5).
Старый 29.07.2009, 21:58   #3  
ZVV is offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1,006 / 246 (11) ++++++
Регистрация: 13.02.2004
Адрес: Минск
->
Цитата:
Сообщение от Maximin Посмотреть сообщение
А дальше - т.н. advanced "Расширенный фильтр".
http://www.axaptapedia.com/Expressions_in_query_ranges

Основная идея - через "дырку" в парсере запросов Axapta можно скормить ему такие query ranges, которые без. доп. обработки практически "напрямую" уйдут в SQL.
Ну вовсе даже и не напрямую, конечно... Нормально всё будет распарсено и указано на ваши ошибки. Просто это позволяет задавать такие условия, которые нельзя задать через стандартный API "конструктора" кверей. я бы так лучше сказал.

На данном форуме эта тема тоже уже многократно обсасывалась...
__________________
Zhirenkov Vitaly
Старый 30.07.2009, 09:46   #4  
dech is offline
dech
Участник
Аватар для dech
Самостоятельные клиенты AX
 
647 / 350 (13) ++++++
Регистрация: 25.06.2009
Адрес: Омск
Записей в блоге: 3
Я бы не сказал, что все так просто. Линки не парсятся также как ренджи. Если у кого-то получилось связать по OR пару линков, поделитесь рабочим примером, плиззз!
__________________
// no comments
Старый 30.07.2009, 10:23   #5  
ZVV is offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1,006 / 246 (11) ++++++
Регистрация: 13.02.2004
Адрес: Минск
->
Цитата:
Сообщение от dech Посмотреть сообщение
Я бы не сказал, что все так просто. Линки не парсятся также как ренджи. Если у кого-то получилось связать по OR пару линков, поделитесь рабочим примером, плиззз!
Здесь в ответах речь и не идёт о "связывании двух линков", а об "подмене этих линков расширенным рэнджем"... почувствуйте разницу.
__________________
Zhirenkov Vitaly
Старый 30.07.2009, 11:43   #6  
dech is offline
dech
Участник
Аватар для dech
Самостоятельные клиенты AX
 
647 / 350 (13) ++++++
Регистрация: 25.06.2009
Адрес: Омск
Записей в блоге: 3
Смею заметить, что конструкция типа
X++:
qB2.addRange(tablenum(table2, RecId)).value("(table2.f1 == table1.f1 || table2.f1 == table1.f2)");
не канает.
__________________
// no comments
Старый 30.07.2009, 12:00   #7  
ZVV is offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1,006 / 246 (11) ++++++
Регистрация: 13.02.2004
Адрес: Минск
->
Цитата:
Сообщение от dech Посмотреть сообщение
Смею заметить, что конструкция типа
X++:
qB2.addRange(tablenum(table2, RecId)).value("(table2.f1 == table1.f1 || table2.f1 == table1.f2)");
не канает.
Смею заметить что на форуме есть поиск.
Не канает, потому что синтаксис хромает...

Запрос по таблице параметров.
__________________
Zhirenkov Vitaly
За это сообщение автора поблагодарили: dech (1).
Старый 13.01.2010, 12:58   #8  
kia is offline
kia
Участник
 
96 / 19 (1) ++
Регистрация: 07.10.2008
Адрес: Харьков
В продолжение темы есть такая задачка.
Нужно в гриде вывести информацию по сложному условию.
на обычном 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  
Lemming is offline
Lemming
Участник
Аватар для Lemming
 
1,144 / 343 (14) ++++++
Регистрация: 20.04.2004
Адрес: Москва, Чайнатаун в Люблино
Записей в блоге: 10
:)
Цитата:
Сообщение от 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  
SRF is offline
SRF
Участник
MCBMSS
Axapta Retail User
 
375 / 562 (19) +++++++
Регистрация: 08.08.2007
Записей в блоге: 1
Цитата:
Сообщение от kia Посмотреть сообщение
А как этот запрос построить динамически в АХ?
В 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  
kia is offline
kia
Участник
 
96 / 19 (1) ++
Регистрация: 07.10.2008
Адрес: Харьков
Цитата:
Сообщение от SRF Посмотреть сообщение
В AX 2009 можно примерно так :
Спасибо. Интересное решение.
К сожалению у нас AX4
Старый 14.01.2010, 11:41   #12  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,701 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Значений поля RPayFundMember.PayCostType для одного значения RPayFundMember.CounterUnit не должно быть очень уж много. Вряд ли больше 20..30 значений. Значит, вместо подзапросов можно просто сделать перечисление

PHP код:
SELECT FROM RPayTrans
WHERE 
(RPayTrans.SourceDate = :date
     
AND (RPayTrans.PayCtype Type1 OR RPayTrans.PayCtype Type2 OR ...)
           
  OR 

     
RPayTrans.PayPeriod = :date
     
AND NOT (RPayTrans.PayCtype Type1 OR RPayTrans.PayCtype Type2 OR ...)

А это уже вполне можно попытаться запихнуть в Range. Хотя и с трудом
Старый 14.01.2010, 15:06   #13  
kia is offline
kia
Участник
 
96 / 19 (1) ++
Регистрация: 07.10.2008
Адрес: Харьков
Цитата:
Сообщение от Владимир Максимов Посмотреть сообщение
Значений поля RPayFundMember.PayCostType для одного значения RPayFundMember.CounterUnit не должно быть очень уж много. Вряд ли больше 20..30 значений. Значит, вместо подзапросов можно просто сделать перечисление

Сейчас их всего 70. Но это далеко не предел.
И механизм групп расчитан на произвольную настройку.
Старый 14.01.2010, 15:24   #14  
Zabr is offline
Zabr
Участник
Axapta Retail User
 
1,202 / 345 (14) ++++++
Регистрация: 26.06.2002
Адрес: Москва
Цитата:
Сообщение от Lemming Посмотреть сообщение
Соберите все это во временную таблу(как сумеете) и выводите в грид.
Цитата:
Сообщение от Lemming Посмотреть сообщение
(как сумеете)
Если нужно собрать побыстрее, можно написать текст запроса в строку и передать её на исполнение через statement.executeQuery(). Результат запихнуть в таблицу для грида.
Старый 14.01.2010, 16:35   #15  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,701 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Цитата:
Сообщение от kia Посмотреть сообщение
Сейчас их всего 70. Но это далеко не предел.
Я говорил не об общем количестве записей в таблице RPayFundMember, а о количестве записей для одного конкретного значения поля CounerUnit. Т.е. список видов зарплат для одного конкретного счетчика.

Цитата:
Сообщение от kia Посмотреть сообщение
И механизм групп расчитан на произвольную настройку.
Так Вы же предполагаете использовать Query. Т.е. добавлять условие через Range.Value(). Т.е. Вам надо программно сформировать символьную строку, которую потом передать в Value(). Какие проблемы-то?

Ну, схематично, как-то так
X++:
while select RPayFundMember where RPayFundMember.CounterUnit = "unit"
{
    strValue = (strValue ? " || " : "") + "'" + RPayFundMember.PayCostType + "'";
}

Query.QueryBuildDataSource(...).AddRange(...).Value(strValue);
Теги
запрос (query), связи

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
перенос данных между методами класса exodus DAX: Программирование 7 01.11.2007 05:07
Передача данных между формами в Axapta AcNoD DAX: Программирование 2 03.08.2007 16:17
Как упростить, ускорить обмен данных: между 3-х уровневым клиентом и АОСом. Yura_Leon DAX: Администрирование 6 13.01.2005 08:55
Перенос данных между AOSами Mechanizm DAX: Программирование 2 19.07.2004 09:45
Cвязь данных между двумя формами Artild DAX: Программирование 11 24.06.2003 10:45

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

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

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