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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 22.01.2018, 20:18   #1  
kitty is offline
kitty
Участник
 
328 / 23 (1) +++
Регистрация: 24.05.2005
crossCompany запрос с join
Есть форма с grid. На него нужно добавить поле. По полю пользователь должен иметь возможность фильтровать.

Поле вычисляется так;
К текущему DS(отображающему данные текущей компании) нужно подцепить InterCompanyPurchSalesReference текущей компании и сделать crossCompany join salesLines и показать одно из полей строки заказа. (при этом )

Но, проблема - как связать в одном запросе две таблицы, одна из которых выбирает данные только из текущей компании, а вторая - crossCompany без использования курсоров?

В идеале хотелось бы:
1) Сделать query в AOT
2) View на основе этого запроса
3) подцепить его на форму

Ну или же Temp табличку заполнить и подцепить (но тоже заполнив ее без использования курсоров, одним выражением)

Результат:
Если я создаю в AOT query со свойством CrossCompany = yes; DS1= InterCompanyPurchSalesReference, к нему привязываю DS2=SalesLines
То, при попытке указать у InterCompanyPurchSalesReference range DataAreaId = curExt(), я получаю(по носу) ошибку "Filtering at the data source level is not allowed for a cross-company query"

Поиск в инете привел к вот такому, немного извращенному способу

Может, есть более адекватное решение? Вроде, не повседневная, но и не сказать, чтобы супер необычная постановка задачи была

Спасибо
Старый 22.01.2018, 21:14   #2  
ax_mct is offline
ax_mct
Участник
Аватар для ax_mct
 
2,015 / 736 (29) +++++++
Регистрация: 10.10.2005
Адрес: Westlands
Query в коде с использованием Query.AddCompanyRange() ?

query.allowCrossCompany(true);

query.addCompanyRange(curext());

query.clearCompanyRange();
Старый 22.01.2018, 21:23   #3  
ax_mct is offline
ax_mct
Участник
Аватар для ax_mct
 
2,015 / 736 (29) +++++++
Регистрация: 10.10.2005
Адрес: Westlands
class VendAccountQueryBuilder

VendTable что per company join c DirPartyTable что cross-company

X++:
public void initialize()
{
    DataAreaId              company;
    VendAccount             vendAccount;
    DirPartyName            vendName;
    Query                   vendAccountQuery;
    QueryBuildDataSource    vendAccountQbds;
    QueryBuildDataSource    dirPartyTableQbds;

    company = this.getArgs().parmCompany();
    vendAccount = this.getArgs().parmVendAccount();
    vendName = this.getArgs().parmVendName();

    vendAccountQuery = new query();

    if(!company)
    {
        //Company cannot be empty
        throw AifFault::Fault("@SYS4007574", #NoSuchCompany);
    }

    vendAccountQuery.allowCrossCompany(true);
    vendAccountQuery.addCompanyRange(SysQuery::value(company));
    vendAccountQbds = vendAccountQuery.addDataSource(tableNum(VendTable));

    vendAccountQbds.orderMode(OrderMode::OrderBy);
    vendAccountQbds.addSelectionField(fieldNum(VendTable, AccountNum));
    vendAccountQbds.addSortField(fieldNum(VendTable, AccountNum));

    if (vendAccount)
    {
        vendAccountQbds.addRange(fieldNum(VendTable,AccountNum)).value(vendAccount);
    }

    dirPartyTableQbds = vendAccountQbds.addDataSource(tableNum(DirPartyTable));
    dirPartyTableQbds.relations(true);
    dirPartyTableQbds.addSelectionField(fieldNum(DirPartyTable, Name));

    if (vendName)
    {
        dirPartyTableQbds.addRange(fieldNum(DirPartyTable, Name)).value(vendName);
    }

    query = vendAccountQuery;
    queryRun = new QueryRun(query);
}
Старый 23.01.2018, 14:26   #4  
kitty is offline
kitty
Участник
 
328 / 23 (1) +++
Регистрация: 24.05.2005
Спасибо, но это не то, что нужно.
Этот запрос создаст условие
X++:
AND (T1.DATAAREAID IN ('CurCompany') 
	AND (T1.DATAAREAID = T2.DATAAREAID)
То есть, это как crossCompany запрос , но с указанием контейнера с компаниями, в которых искать данные
X++:
con = [ "CurCompany", "AnotherCompany"];
While Select CrossCompany : Con * from vendTable join DirPartyTable ....

Тогда как в моем случае, данные в InterCompanyPurchSalesReference должны выбираться только в текущей компании, а в salesLine - искаться по всем компаниям

Последний раз редактировалось kitty; 23.01.2018 в 14:31.
Старый 23.01.2018, 14:53   #5  
kitty is offline
kitty
Участник
 
328 / 23 (1) +++
Регистрация: 24.05.2005
Ура. Придумала
Может, не супер элегантно, но работает и, вроде, быстро :
Я создала временную таблицу TempDB со свойством SaveDataPerCompany = No, в нее переливаю через insert_recordset одним махом нужные данные(в моем случае к счастью, только ID) из таблицы, что в текущей компании , а потом присоединяю ее в query к таблице, из которой выборка по всем компаниям производиться должна.
У query ставлю свойство allowCrossCompany = true

Получается в итоге один запрос

Если есть иные предложения (через view это сделать, например, как-то) - с удовольствием рассмотрю

Последний раз редактировалось kitty; 23.01.2018 в 14:56.
Старый 23.01.2018, 18:52   #6  
ax_mct is offline
ax_mct
Участник
Аватар для ax_mct
 
2,015 / 736 (29) +++++++
Регистрация: 10.10.2005
Адрес: Westlands
Цитата:
Сообщение от kitty Посмотреть сообщение
Если есть иные предложения (через view это сделать, например, как-то) - с удовольствием рассмотрю
Добавить .myDataAreaId в InterCompanyPurchSalesReference
Добавить индекс по .myDataAreaId

Заполнять в InterCompanyPurchSalesReference.insert
Job для заполнения InterCompanyPurchSalesReference.myDataAreaId в исторических данных

CrossCompany query c фильтром по InterCompanyPurchSalesReference.myDataAreaId.
По идее и AOT query c View получиться.

В результате получаем простое и надежное решение.
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
как оформить запрос union или full join trudel DAX: Программирование 4 05.05.2015 11:00
Не отрабатывает запрос EXISTS JOIN Paul_ST DAX: База знаний и проекты 8 21.03.2008 17:21
запрос с 4 таблицами. Загадка с Join Андрей К. DAX: Программирование 7 19.09.2007 17:12
Почему join запрос разбивается на подзапросы!? 3oppo DAX: Программирование 59 28.06.2007 11:52
можно ли сделать с помощью join следующий запрос: SergAY DAX: Программирование 1 29.07.2003 11:39
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

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

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

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