Показать сообщение отдельно
Старый 04.10.2017, 21:54   #1  
dech is offline
dech
Участник
Аватар для dech
 
471 / 198 (7) ++++++
Регистрация: 25.06.2009
Адрес: Омск
Как прицепить несколько джоинов к одному датасорсу в динамическом запросе?
Добрый день всем. Что-то голова не варит уже... Объясните пожалуйста, почему нельзя к одному датасорсу подсоединить несколько других. Пытаюсь через OuterJoin взять информацию о клиенте. Версия AX4.
X++:
    Query                   q = new SysQuery();
    QueryBuildDataSource    qbdsCustTable = q.addDataSource(tablenum(CustTable));
    QueryBuildDataSource    qbds;
    ;

    qbds = qbdsCustTable.addDataSource(tablenum(CustTable_APM));
    qbds.joinMode(JoinMode::OuterJoin);
    qbds.fetchMode(QueryFetchMode::One2Many);
    qbds.relations(true);

    qbds = qbdsCustTable.addDataSource(tablenum(CustTable_ACM));
    qbds.joinMode(JoinMode::OuterJoin);
    qbds.fetchMode(QueryFetchMode::One2Many);
    qbds.relations(true);

    info(q.dataSourceNo(1).toString());
Инфолог выдаёт только: SELECT * FROM CustTable.
Если оставить соединение только с одной таблицей, все отрабатывает замечательно.
И почему запрос подобной сложности отрабатывает к примеру в SysSecurityFormSetup.buildSecurityIdMenuAccessQuery(), где на один DS накидывают OuterJoin и ExistsJoin? См. переменную accessRightsListDataSource:
X++:
    securityFormDataSource = accessRightsListDataSource.addDataSource(tablenum(SysSecurityFormTable));
    securityFormDataSource.joinMode(JoinMode::OuterJoin);
    securityFormDataSource.fetchMode(QueryFetchMode::One2Many);
    securityFormDataSource.relations(true);

    queryBuildRange = securityFormDataSource.addRange(fieldnum(SysSecurityFormTable, FormName));
    queryBuildRange.value(_formName);

    queryBuildDataSource = accessRightsListDataSource.addDataSource(tablenum(UserGroupList));
    queryBuildDataSource.joinMode(JoinMode::ExistsJoin);
    queryBuildDataSource.fetchMode(QueryFetchMode::One2One);
    queryBuildDataSource.addLink(fieldnum(AccessRightsList, GroupId), fieldnum(UserGroupList, GroupId));
__________________
// no comments