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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 01.11.2014, 20:34   #1  
Music is offline
Music
Участник
 
33 / 10 (1) +
Регистрация: 01.07.2014
? Конструкция WHERE (x==x) && (x==x). Каков аналог при использовании QUERY?
Коллеги, прошу вашей подсказки.

При использовании сиквела конструкция запроса следующая:
X++:
while select Table1
    join Table2
            where (Table1.id1 == Table2.id1)
                &&(Table1.id2 == Table3.id2)
Т.е. таблица Table1 имеет двойную связь - с двумя таблицами Table2 и Table3.

Каков аналог построения конструкции && при использовании QUERY ?

Как продолжить или откорректировать код по аналогии с построением одной связи:
X++:
    qbds.joinMode(JoinMode::OuterJoin);
    qbds.addLink(FieldNum(Table1, id1), fieldNum(Table2, id1));
    ...
Заранее благодарю за помощь.
Старый 01.11.2014, 20:49   #2  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,429 / 1772 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Использовать addLink дважды?

В вашем while select примере не вижу join для Table3? Если Table3 не джойнится, а вычисляется до запроса то это не link, а range.

Последний раз редактировалось S.Kuskov; 01.11.2014 в 21:01.
Старый 01.11.2014, 22:21   #3  
Music is offline
Music
Участник
 
33 / 10 (1) +
Регистрация: 01.07.2014
В while select join для Table3 есть, просто я его упустил в описании.
Вариант с двумя Link подряд пробовал, но не дает нужного эффекта к сожалению.
Старый 01.11.2014, 22:49   #4  
CHESER85 is offline
CHESER85
Участник
 
93 / 11 (1) +
Регистрация: 04.08.2011
Адрес: Ufa
Записей в блоге: 1
Может попробовать inner join? И еще попробуй addrange по расширенному синтаксису
Старый 02.11.2014, 01:25   #5  
Ruff is offline
Ruff
Дмитрий Ерин
Аватар для Ruff
1C
 
475 / 396 (14) ++++++
Регистрация: 18.09.2003
Адрес: Тула
Цитата:
Сообщение от Music Посмотреть сообщение
Вариант с двумя Link подряд пробовал
а они не должны быть "подряд" (если я правильно понял смысл этой фразы), так как относятся к разным datasource. Примерно так (пишу без проверки синтаксиса):
X++:
...
QueryBuildDataSource qbdsTable1, 
                                 qbdsTable2,
                                 qbdsTable3;

qbdsTable1 = query.addDataSource(tablenum(Table1));

qbdsTable2 = qbdsTable1.addDataSource(tablenum(Table2));
qbdsTable2.joinMode(JoinMode::OuterJoin);
qbdsTable2.addLink(fieldNum(Table1, id1), fieldNum(Table2, id1));

qbdsTable3 = qbdsTable1.addDataSource(tablenum(Table3));
qbdsTable3.joinMode(JoinMode::OuterJoin);
qbdsTable3.addLink(fieldNum(Table1, id2), fieldNum(Table3, id2));
Пример актуален для простого случая, когда в Table1 есть два внешних ключа id1 и id2, и требуется просто выбрать все записи из Table1 и привязать к ним расширенную информацию (при ее наличии) из таблиц Table2 и Table3. Но вполне возможно, что это совсем не то, чего вы хотите добиться, так как исходный запрос приведен не полностью. Из-за чего непонятно, для чего присутствует условие "&&(Table1.id2 == Table3.id2)" в джойне между 1-й и 2-й таблицами...
__________________
Старый 02.11.2014, 13:09   #6  
Music is offline
Music
Участник
 
33 / 10 (1) +
Регистрация: 01.07.2014
Ребята, я совершил ошибку, сократив свой вопрос и из-за этого тема не раскрылась и стала не совсем понятной.
Попытаюсь исправиться и подробно описать проблемку. На самом деле это задачка из учебного курса по X++

Итак, есть три таблицы:

VetSpeciesTable - таблица типа животных (справочник: SpeciesID и Name).
VetBreedTable - таблица пород (справочник: SpeciesID, BreedID и Name).
VetCustPetTable - основная таблица (CustAccount, SpeciesID, BreedID).

Есть запрос в котором проиллюстрированы все типы связей по этим таблицам. В запросе мы подтягиваем поля Name из таблиц VetSpeciesTable и VetBreedTable по соответствующим ID из таблицы VetCustPetTable:
X++:
{
    AAL_VetCustPetTable     CustPetTable;
    AAL_VetBreedTable       BreedTable;
    AAL_VetSpeciesTable     SpeciesTable;

    while select CustPetTable order CustAccount
        join SpeciesTable
            where CustPetTable.SpeciesId == SpeciesTable.SpeciesId
        join BreedTable
            where (CustPetTable.SpeciesId == BreedTable.SpeciesId)
                &&(CustPetTable.BreedId == BreedTable.BreedId)
    {
        info(CustPetTable.CustAccount + ' - ' + int2str(CustPetTable.SpeciesId) + ' - ' + SpeciesTable.Name + ' - ' + int2str(CustPetTable.BreedId) + ' - ' + BreedTable.Name);
        countTable++;
    }
}
Так вот, вопрос в том как реализовать этот запрос через QUERY ? И загвоздка именно в моменте двойной связи на таблице VetBreedTable.
Мой вариант выдает размножение записей:

X++:
 { 
    Query                      query;
    QueryRun                queryRun;

    QueryBuildDataSource    dsCust, dsSpecies, dsBreed;
    QueryBuildRange            qbr;

    VetCustPetTable     CustPetTable;
    VetSpeciesTable     SpeciesTable;
    VetBreedTable        BreedTable;

    query = new Query();

    dsCust = query.addDataSource(tableNum(VetCustPetTable));
    dsSpecies = dsCust.addDataSource(tableNum(VetSpeciesTable));
    dsSpecies.joinMode(JoinMode::OuterJoin);
    dsSpecies.addLink(FieldNum(VetCustPetTable, SpeciesId), fieldNum(VetSpeciesTable, SpeciesId));

    dsBreed = dsCust.addDataSource(tableNum(VetBreedTable));
    dsBreed.joinMode(JoinMode::InnerJoin);
    dsBreed.addLink(fieldNum(VetCustPetTable, SpeciesId), fieldNum(VetBreedTable, SpeciesId));
    dsBreed.addLink(fieldNum(VetCustPetTable, BreedId), fieldNum(VetBreedTable, BreedId));

    queryRun = new QueryRun(query);

    while (queryRun.next())
    {
        CustPetTable = queryRun.get(TableNum(VetCustPetTable));
        SpeciesTable = queryRun.get(TableNum(VetSpeciesTable));
        BreedTable   = queryRun.get(TableNum(VetBreedTable));

        info(CustPetTable.CustAccount + ' - ' + int2str(CustPetTable.SpeciesId) + ' - ' + SpeciesTable.Name + ' - ' + int2str(CustPetTable.BreedId) + ' - ' + BreedTable.Name);
        countTable++;
    }
}
Старый 02.11.2014, 13:21   #7  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2476 (88) +++++++++
Регистрация: 20.08.2005
Добавьте
X++:
dsSpecies.fetchMode(QueryFetchMode::One2One);
...
dsBreed.fetchMode(QueryFetchMode::One2One);
и outer join лучше передвинуть после inner join - не очень любит Аксапта смешивать эти связи на одном уровне

И еще.
Если у вас на таблицах прописаны релейшены, то можно не вызывать addLink(), а прописать relations(true); на датасорсах
__________________
Axapta v.3.0 sp5 kr2

Последний раз редактировалось AndyD; 02.11.2014 в 13:26.
За это сообщение автора поблагодарили: Music (1).
Старый 02.11.2014, 13:42   #8  
Music is offline
Music
Участник
 
33 / 10 (1) +
Регистрация: 01.07.2014
Цитата:
Сообщение от AndyD Посмотреть сообщение
Добавьте
X++:
dsSpecies.fetchMode(QueryFetchMode::One2One);
...
dsBreed.fetchMode(QueryFetchMode::One2One);
и outer join лучше передвинуть после inner join - не очень любит Аксапта смешивать эти связи на одном уровне

И еще.
Если у вас на таблицах прописаны релейшены, то можно не вызывать addLink(), а прописать relations(true); на датасорсах

Сработали оба варианта!
Часть кода (вариант 1):
X++:
    dsCust = query.addDataSource(tableNum(VetCustPetTable));
    dsSpecies = dsCust.addDataSource(tableNum(VetSpeciesTable));
    dsSpecies.joinMode(JoinMode::OuterJoin);
    dsSpecies.relations(true);
    dsSpecies.fetchMode(QueryFetchMode::One2One);

    dsBreed = dsCust.addDataSource(tableNum(VetBreedTable));
    dsBreed.joinMode(JoinMode::OuterJoin);
    dsBreed.relations(true);
    dsBreed.fetchMode(QueryFetchMode::One2One);
Часть кода (вариант 2):
X++:
    dsCust = query.addDataSource(tableNum(VetCustPetTable));
    dsSpecies = dsCust.addDataSource(tableNum(VetSpeciesTable));
    dsSpecies.joinMode(JoinMode::OuterJoin);
    dsSpecies.fetchMode(QueryFetchMode::One2One);
    dsSpecies.addLink(FieldNum(VetCustPetTable, SpeciesId), fieldNum(VetSpeciesTable, SpeciesId));

    dsBreed = dsCust.addDataSource(tableNum(VetBreedTable));
    dsBreed.joinMode(JoinMode::OuterJoin);
    dsBreed.fetchMode(QueryFetchMode::One2One);
    dsBreed.addLink(fieldNum(VetCustPetTable, SpeciesId), fieldNum(VetBreedTable, SpeciesId));
    dsBreed.addLink(fieldNum(VetCustPetTable, BreedId), fieldNum(VetBreedTable, BreedId));

Огромное спасибо всем, кто участвовал в решении проблемки!!!
Старый 02.11.2014, 13:53   #9  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2476 (88) +++++++++
Регистрация: 20.08.2005
Ну, говоря о передвижении outer, я имел в виду - перенести добавление датасорса dsSpecies после dsBreed, а не установки связи для dsBreed в outer))

Сейчас, ваш запрос в Query не эквивалентен запросу в select - за счет отличия типа связей вы можете получить разный состав выборки записей
__________________
Axapta v.3.0 sp5 kr2
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
emeadaxsupport: Microsoft Dynamics AX general performance analysis scripts page 5 Blog bot DAX Blogs 0 01.09.2014 14:11
emeadaxsupport: Where to find hotfixes for Microsoft Dynamics AX 2009 & 2012 Blog bot DAX Blogs 1 09.11.2012 15:54
jinx: Dynamics AX – Query-Ranges und Filtereinstellungen des Benutzers Blog bot DAX auf Deutsch 0 04.02.2010 00:05
Расширенные возможности Query - арифметические операции в условие Where. Lemming DAX: Программирование 10 07.02.2008 14:38

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

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

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