22.01.2018, 20:18 | #1 |
Участник
|
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 |
Banned
|
Query в коде с использованием Query.AddCompanyRange() ?
query.allowCrossCompany(true); query.addCompanyRange(curext()); query.clearCompanyRange(); |
|
22.01.2018, 21:23 | #3 |
Banned
|
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 |
Участник
|
Спасибо, но это не то, что нужно.
Этот запрос создаст условие X++: AND (T1.DATAAREAID IN ('CurCompany')
AND (T1.DATAAREAID = T2.DATAAREAID) 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 |
Участник
|
Ура. Придумала
Может, не супер элегантно, но работает и, вроде, быстро : Я создала временную таблицу TempDB со свойством SaveDataPerCompany = No, в нее переливаю через insert_recordset одним махом нужные данные(в моем случае к счастью, только ID) из таблицы, что в текущей компании , а потом присоединяю ее в query к таблице, из которой выборка по всем компаниям производиться должна. У query ставлю свойство allowCrossCompany = true Получается в итоге один запрос Если есть иные предложения (через view это сделать, например, как-то) - с удовольствием рассмотрю Последний раз редактировалось kitty; 23.01.2018 в 14:56. |
|
23.01.2018, 18:52 | #6 |
Banned
|
Цитата:
Добавить индекс по .myDataAreaId Заполнять в InterCompanyPurchSalesReference.insert Job для заполнения InterCompanyPurchSalesReference.myDataAreaId в исторических данных CrossCompany query c фильтром по InterCompanyPurchSalesReference.myDataAreaId. По идее и AOT query c View получиться. В результате получаем простое и надежное решение. |
|