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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 25.02.2005, 15:32   #1  
Ronin is offline
Ronin
aka awas
NavAx Club
 
16 / 30 (2) +++
Регистрация: 21.06.2004
Адрес: г. Москва
? 2 и более OUTER JOIN к одному паренту
Доброго времени суток, вам, господа и дамы!

Не подскажите, как построить селект с 2мя и более outer join'ами с одним парентом? Или объяснить мне в чем я не прав.

У меня на последнем Join'e ругается что

"Невозможно выбрать запись в 'Условия оплаты' ('PaymTerm')
Использован оператор объединения таблиц join, но выражение WHERE не содержит связи между таблицами."

static void Job10(Args _args)
{
SalesTable contractTable;
EmplTable emplTable;
PaymTerm paymTerm;
;

while
select SalesName
from contractTable

outer join NumOfDays, Description
from paymTerm
where paymTerm.PaymTermId == contractTable.Payment

outer join Name
from emplTable
where emplTable.EmplId == contractTable.SalesResponsible

{
info(strfmt("%1 %2", paymTerm.NumOfDays, contractTable.SalesName));
}

}

Хинт: с "обыкновенными", inner join'ами, все job запускается...
Старый 18.12.2005, 20:09   #2  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
Попробуйте так
X++:
    qbDS2.relations(false);                
    qbDS2.addRange(fieldNum(InventDim, InventDimId)).
        value(strfmt("(((%2.dataAreaId == %3.DataAreaId) || (%2.dataAreaId != %3.DataAreaId)) && " +
                     "(%1.inventDimId == %3.inventDimId))",
                        qbDS1.name(), 
                        q.dataSourceTable(tableNum(InventTable)).name(), 
                        qbDS2.name()));
__________________
Axapta v.3.0 sp5 kr2
Старый 19.12.2005, 07:38   #3  
Perc is offline
Perc
Участник
 
194 / 57 (2) ++++
Регистрация: 05.03.2005
Цитата:
Сообщение от AndyD
Попробуйте так
X++:
    qbDS2.relations(false);                
    qbDS2.addRange(fieldNum(InventDim, InventDimId)).
        value(strfmt("(((%2.dataAreaId == %3.DataAreaId) || (%2.dataAreaId != %3.DataAreaId)) && " +
                     "(%1.inventDimId == %3.inventDimId))",
                        qbDS1.name(), 
                        q.dataSourceTable(tableNum(InventTable)).name(), 
                        qbDS2.name()));
Спсб AndyD. Наставил на путь истинный. Я делал почти тоже самое, но наивно решил не заморачиваться с strfmt() в тесте своем и вбивал сразу же условие текстом
X++:
    qbDS2.addRange(fieldNum(InventDim, InventDimId)).
        value("(((InventTable.dataAreaId == InventDim.DataAreaId) || (InventTable.dataAreaId != InventDim.DataAreaId)) && (InventSum.inventDimId == InventDim.inventDimId))");
вот это меня и подвело. Ни разу даже мысли не возникло проверить что за текст там получается и как на самом деле датасорсы называются.
Не ошибайтесь так люди
Старый 19.12.2005, 08:16   #4  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
Можно было явно дать название датасоурсам

qbDS1 = q.addDataSource(tableNum(InventSum), "InventSum");
или qbDS1.Name("InventSum");
и т.д.
Тогда бы ваш вариант работал.
__________________
Axapta v.3.0 sp5 kr2

Последний раз редактировалось AndyD; 19.12.2005 в 09:08.
Старый 19.12.2005, 10:27   #5  
Wamr is offline
Wamr
----------------
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
1,737 / 858 (32) +++++++
Регистрация: 15.01.2002
Адрес: Москва
Записей в блоге: 7
Хочу отметить, что Job40 (см. тут ) замечательно работает на Oracle и никак не работает на MS SQL.
Старый 19.12.2005, 13:21   #6  
vallys is offline
vallys
Developer
 
146 / 108 (0) +++++
Регистрация: 18.01.2005
Цитата:
Сообщение от Wamr
Хочу отметить, что Job40 (см. тут ) замечательно работает на Oracle и никак не работает на MS SQL.
Если перед info добавить
Код:
qbDS2.addRange(fieldnum(InventDim, DataAreaId)).value(strfmt(
        "((%1.DataAreaId == %2.DataAreaId) || (%1.DataAreaId != %2.DataAreaId))",
        qbDS2.name(),
        q.dataSourceTable(tablenum(InventTable)).name()
        ));
то и на MS SQL заработает
Старый 19.12.2005, 13:29   #7  
Wamr is offline
Wamr
----------------
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
1,737 / 858 (32) +++++++
Регистрация: 15.01.2002
Адрес: Москва
Записей в блоге: 7
а включаешь
PHP код:
    qbDS2 qbDS1.addDataSource(tableNum(InventDim));
    
qbDS2.joinMode(JoinMode::OuterJoin);
    
qbDS2.fetchMode(QueryFetchMode::One2One);
    
qbDS2.relations(true);
//    qbDS2.addLink(fieldNum(InventSum, InventDimId), fieldNum(InventDim, InventDimId));
    
qbDS2.addRange(fieldnum(InventDimDataAreaId)).value(strfmt(
        
"((%1.DataAreaId == %2.DataAreaId) || (%1.DataAreaId != %2.DataAreaId))",
        
qbDS2.name(),
        
q.dataSourceTable(tablenum(InventTable)).name()
        )); 
- не работает
Наверно, это из-за SaveDataPerCompany = NO

Последний раз редактировалось Wamr; 19.12.2005 в 13:36.
Старый 19.12.2005, 13:36   #8  
vallys is offline
vallys
Developer
 
146 / 108 (0) +++++
Регистрация: 18.01.2005
Вот это у меня работает (Ax 3.0 SP 2, MS SQL Server 2000):
Код:
static void Job40(Args _args)
{
    Query       q = new Query();
    QueryRun    qr;
    QueryBuildDataSource qbDS1, qbDS2;
    InventSum   inventSum;
    InventTable inventTable;
    InventDim   inventDim;
    ;

    qbDS1 = q.addDataSource(tableNum(InventSum));

    qbDS2 = qbDS1.addDataSource(tableNum(InventTable));
    qbDS2.joinMode(JoinMode::OuterJoin);
    qbDS2.fetchMode(QueryFetchMode::One2One);
    qbDS2.relations(true);

    qbDS2 = qbDS1.addDataSource(tableNum(InventDim));
    qbDS2.joinMode(JoinMode::OuterJoin);
    qbDS2.fetchMode(QueryFetchMode::One2One);
    qbDS2.relations(true);
    qbDS2.addRange(fieldnum(InventDim, DataAreaId)).value(strfmt(
        "((%1.DataAreaId == %2.DataAreaId) || (%1.DataAreaId != %2.DataAreaId))",
        qbDS2.name(),
        q.dataSourceTable(tablenum(InventTable)).name()
        ));

    info(qbDS1.toString());

    qr = new QueryRun(q);
    qr.next();
    inventSum = qr.get(tablenum(InventSum));
    inventTable = qr.get(tablenum(InventTable));
    inventDim = qr.get(tablenum(InventDim));
    info(strfmt("%1 %2 %3", inventSum.ItemId, inventTable.ItemName, inventDim.inventDimId));
}
Старый 19.12.2005, 13:42   #9  
vallys is offline
vallys
Developer
 
146 / 108 (0) +++++
Регистрация: 18.01.2005
Sorry - не увидел "SaveDataPerCompany = NO"
Конечно из-за этого, я ж range на DataAreaId цеплял...

ааа... "SaveDataPerCompany = NO" появилось уже после прочтения сообщения мной... тогда понятно, почему не увидел...

Последний раз редактировалось vallys; 19.12.2005 в 14:32.
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Двойной Outer Join в Query LTA DAX: Программирование 2 21.01.2020 09:28
Несколько outer join в запросе _scorp_ DAX: Программирование 2 11.04.2008 10:56
Данные в Grid из таблиц, связанных по Outer Join cherv DAX: Программирование 2 17.02.2007 01:36
Outer Join Anais DAX: Программирование 3 20.05.2005 12:10
outer join для трех таблиц r25 DAX: Программирование 4 29.04.2004 15:42

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

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

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