22.06.2009, 19:20 | #1 |
Участник
|
связанные данные из разных компаний
DAX 2009
Kernel version: 5.0.1000.52 Application version: 5.0.1000.52 SP: SP1 SQL 2005 Привет, всем Подскажите, пожалуйста, может ли отработать данный запрос X++: query = new Query(); query.allowCrossCompany(true); qbsSalesLineCentral = query.addDataSource(tablenum(SalesLine), "SalesLineCentral"); qbsSalesLineOrig = qbsSalesLineCentral.addDataSource(tablenum(SalesLine), "SalesLineOrig"); qbsSalesLineOrig.addLink(fieldnum(salesline, recid), fieldnum(salesline, SBA_CentralSalesLine), "SalesLineCentral"); qbsSalesLineOrig.addRange(fieldnum(salesLine, SBA_CentralSalesLine)).value(SysQuery::valueNotEmptyString()); Пробовал задавать Range для dataareaid, query.addCompanyRange() успехов не принесло. |
|
23.06.2009, 00:09 | #2 |
Участник
|
По-моему, нельзя
Axapta добавляет в запросе на сервер A.DATAAREAID = B.DATAAREAID к любым линкам или рэйнжам Отличие allowCrossCompany() от обычных запросов в том, что либо вовсе не указывается в выборке компания (если не использовать вызовы addCompanyRange()), либо добавляется условие DataAreaID IN (список компаний, добавленных с помощью addCompanyRange()) на каждую таблицу, участвующую в запросе. К связям же между таблицами в любом случае добавляется условие равенства DATAAREAID PS. Можно создать таблицу, в которой указано поле связи (recId из первой компании), добавлены два поля для кодов компаний и отключено свойство SaveDataPerCompany Если связь делать не напрямую, а через эту таблицу (для одной связи можно прописать релейшен на таблице с участием нужного кода компании, а связь с другой таблицей делать через расширенный рэйнж), то получить записи из разных компаний получится
__________________
Axapta v.3.0 sp5 kr2 Последний раз редактировалось AndyD; 23.06.2009 в 00:37. |
|
|
За это сообщение автора поблагодарили: lev (2), PavelX (2), nano3 (1), S.Kuskov (5). |
23.06.2009, 10:40 | #3 |
Moderator
|
Цитата:
A.DATAAREAID = 'dat' AND B.DATAAREAID = 'tst'. Естественно, коды компаний могут быть разными при использовании виртуальных компаний.
__________________
Андрей. |
|
23.06.2009, 11:03 | #4 |
MCITP
|
Цитата:
Другое дело, что ни то, ни другое не поможет топикстартеру решить его проблему в том виде, как он хочет.
__________________
Zhirenkov Vitaly |
|
23.06.2009, 11:30 | #5 |
Участник
|
Хм.
Выше приведенный запрос по SalesLine будет выглядеть примерно так X++: SELECT * FROM SalesLine A, SalesLine B WHERE A.RecId = B.SBA_CentralSalesLine and A.DataAreaId = B.DataAreaId and not (B.SBA_CentralSalesLine = 0) X++: SELECT * FROM SalesLine A, SalesLine B WHERE A.DataAreaId in ( ) and B.DataAreaId in ( ) and A.RecId = B.SBA_CentralSalesLine and A.DataAreaId = B.DataAreaId and not (B.SBA_CentralSalesLine = 0)
__________________
Axapta v.3.0 sp5 kr2 |
|
|
За это сообщение автора поблагодарили: Dron AKA andy (2). |
23.06.2009, 11:38 | #6 |
Moderator
|
А, не заметил, что это ж для DAX2009, да еще и с новой для меня функцией allowCrossCompany()
__________________
Андрей. |
|
23.06.2009, 11:42 | #7 |
Участник
|
Жалко
Я уже думал, что что-то проглядел и можно для каждой таблицы указывать свою компанию
__________________
Axapta v.3.0 sp5 kr2 |
|
23.06.2009, 12:05 | #8 |
Участник
|
Хотя, с другой стороны, если не использовать allowCrossCompany() и связь нужна только между двумя компаниями, то можно сделать так
X++: SalesLine SalesLineA; SalesLine SalesLineB; QueryRun qr; ; SalesLineA.company('A'); SalesLineB.company('B'); query = new Query(); qbsSalesLineCentral = query.addDataSource(tablenum(SalesLine), "SalesLineCentral"); qbsSalesLineOrig = qbsSalesLineCentral.addDataSource(tablenum(SalesLine), "SalesLineOrig"); qbsSalesLineOrig.addLink(fieldnum(salesline, recid), fieldnum(salesline, SBA_CentralSalesLine), "SalesLineCentral"); qbsSalesLineOrig.addRange(fieldnum(salesLine, SBA_CentralSalesLine)).value(SysQuery::valueNotEmptyString()); qr = new QueryRun(query); qr.setCursor(SalesLineA, 1); qr.setCursor(SalesLineB, 2);
__________________
Axapta v.3.0 sp5 kr2 Последний раз редактировалось Dron AKA andy; 23.06.2009 в 15:49. |
|
|
За это сообщение автора поблагодарили: Logger (7), MironovI (4), AlexArh (1). |
23.06.2009, 14:28 | #9 |
Участник
|
Цитата:
Сообщение от AndyD
По-моему, нельзя
PS. Можно создать таблицу, в которой указано поле связи (recId из первой компании), добавлены два поля для кодов компаний и отключено свойство SaveDataPerCompany Если связь делать не напрямую, а через эту таблицу (для одной связи можно прописать релейшен на таблице с участием нужного кода компании, а связь с другой таблицей делать через расширенный рэйнж), то получить записи из разных компаний получится |
|
23.06.2009, 14:39 | #10 |
Участник
|
Не могу отредактировать предыдущее сообщение.
В предыдущем примере надо убрать query.allowCrossCompany(true).
__________________
Axapta v.3.0 sp5 kr2 |
|
23.06.2009, 15:27 | #11 |
Аманд
|
Просто ремарка: Обратите внимание, что в системе существует функциональность и запросы по работе с дургими компаниями, например:
- Можно посмотреть заказы/закупки в другой компани - Можно посмотреть производства - Можно посмотреть В наличии с учётом остатков другой компании и т.д. Всё это просматривается по кнопочке "Внутрихолдинговый". При этом в 4.0 это хорошо работало. Я не проверял, но в 2009 должно быть как минимум аналогично. Поэтому проверьте, возможно, Вам подойдёт то, что уже есть. Ищите информацию по AIF Последний раз редактировалось Vals; 23.06.2009 в 15:44. |
|
|
За это сообщение автора поблагодарили: nano3 (1). |
23.06.2009, 15:50 | #12 |
Moderator
|
Убрал.
__________________
Андрей. |
|
24.06.2009, 12:02 | #13 |
Участник
|
Тема интересна, но...
хм.... убрал ^^... получаю "Невозможно сменить компанию в "Строки заказа" ("SalesLine") Буфер содержит запись, которая относится к другой компании." ax3.0 sp5 kr2... Что делаю не так ? |
|
24.06.2009, 12:04 | #14 |
Участник
|
Сценарий в AX 4.0
Цитата:
Сообщение от AndyD
Хотя, с другой стороны, если не использовать allowCrossCompany() и связь нужна только между двумя компаниями, то можно сделать так
X++: SalesLine SalesLineA; SalesLine SalesLineB; QueryRun qr; ; SalesLineA.company('A'); SalesLineB.company('B'); query = new Query(); qbsSalesLineCentral = query.addDataSource(tablenum(SalesLine), "SalesLineCentral"); qbsSalesLineOrig = qbsSalesLineCentral.addDataSource(tablenum(SalesLine), "SalesLineOrig"); qbsSalesLineOrig.addLink(fieldnum(salesline, recid), fieldnum(salesline, SBA_CentralSalesLine), "SalesLineCentral"); qbsSalesLineOrig.addRange(fieldnum(salesLine, SBA_CentralSalesLine)).value(SysQuery::valueNotEmptyString()); qr = new QueryRun(query); qr.setCursor(SalesLineA, 1); qr.setCursor(SalesLineB, 2); как вариант реализации - использование метода QueryBuildDataSource.company( CompanyId )? Тестировался примерно похожий сценарий на AX 4.0: имеются 2 компании DMO и TST, которые не входят в виртуальную. В справочнике групп складских моделей (InventModelGroup) помимо всего прочего есть группа с кодом 'Основная' (своя в каждой из компаний) и в справочнике номеклатур (InventTable) свой набор позиций с этой группой. В компании TST выполняется выборка данных: X++: select inventTable where inventTable.ItemType == ItemType::BOM join inventModelGroup where inventModelGroup.ModelGroupId == inventTable.ModelGroupId && inventModelGroup.InventModel == InventModel::FIFO X++: static void jbCheckCompany(Args _args) { QueryBuildDataSource qbdsInventTable ; QueryBuildDataSource qbdsInventModelGroup; Query query = new Query() ; void inventTableFromQuery( Query _query ) { InventTable inventTable ; InventModelGroup inventModelGroup ; QueryRun queryRun ; CompanyId companyIdInventTable = _query.dataSourceTable( tableNum( InventTable ) ).company() ; ; setPrefix( strfmt( "Company: %1", companyIdInventTable ? companyIdInventTable : curext() ) ) ; queryRun = new QueryRun( _query ) ; while( queryRun.next() ) { inventTable = queryRun.get( tableNum( InventTable ) ) ; inventModelGroup = queryRun.get( tableNum( InventModelGroup ) ) ; info( strfmt( "InventTable [%1]: %2 - %3 (InventModelGroup [%4]: %5)", inventTable.dataAreaId, inventTable.ItemId, inventTable.ItemName, inventModelGroup.dataAreaId, inventModelGroup.ModelGroupId ) ) ; } } ; qbdsInventTable = query.addDataSource( tableNum( InventTable ) ) ; qbdsInventTable.addSelectionField( fieldNum( InventTable, ItemId ) ) ; qbdsInventTable.addSelectionField( fieldNum( InventTable, ItemName ) ) ; qbdsInventTable.addRange( fieldNum( InventTable, ItemType ) ).value( SysQuery::value( ItemType::BOM ) ) ; qbdsInventModelGroup = qbdsInventTable.addDataSource( tableNum( InventModelGroup ) ) ; qbdsInventModelGroup.fetchMode( QueryFetchMode::One2One ) ; qbdsInventModelGroup.addLink( fieldNum( InventTable, ModelGroupId ), fieldNum( InventModelGroup, ModelGroupId ) ) ; qbdsInventModelGroup.addSelectionField( fieldNum( InventModelGroup, ModelGroupId ) ) ; qbdsInventModelGroup.addRange( fieldNum( InventModelGroup, InventModel ) ).value( SysQuery::value( InventModel::FIFO ) ) ; info( 'InventTable cross company select' ) ; inventTableFromQuery( query ) ; query.dataSourceTable( tableNum( InventTable ) ).company( 'dmo' ) ; inventTableFromQuery( query ) ; } Цитата:
InventTable cross company select
- Company: tst -- InventTable [tst]: P-2000/B - Окрашенная подставка 2000 Черный (InventModelGroup [tst]: Основная) -- InventTable [tst]: P-2000/R - Окрашен. подставка 2000 красный (InventModelGroup [tst]: DEF) -- InventTable [tst]: P-2000/W - Окрашен. подставка 2000 белый (InventModelGroup [tst]: DEF) -- InventTable [tst]: PB-модел_ламп - Включено моделирование лампы (InventModelGroup [tst]: DEF) -- InventTable [tst]: PB-Моделир_абажура - Включено моделирование абажура (InventModelGroup [tst]: DEF) -- InventTable [tst]: А-абажур/R30 - Абажур для лампы, красный, 30 см (InventModelGroup [tst]: DEF) - Company: dmo -- InventTable [dmo]: 1 - Светильник Ramzes (InventModelGroup [tst]: Основная) -- InventTable [dmo]: 2 - Светильник Ramzes (InventModelGroup [tst]: Основная) -- InventTable [dmo]: Лампа - Лампа для светильника (InventModelGroup [tst]: Основная) -- InventTable [dmo]: с1_Кофеварка007 - Кофеварка007 (InventModelGroup [tst]: Основная) -- InventTable [dmo]: Светильник Ramzes - Светильник Ramzes (InventModelGroup [tst]: Основная) -- InventTable [dmo]: Светильник RamzesSup - Светильник RamzesSuper (InventModelGroup [tst]: Основная) Цитата:
SELECT A.ITEMID,A.ITEMNAME,A.RECID,B.MODELGROUPID,101090
FROM INVENTTABLE A,INVENTMODELGROUP B WHERE ((A.DATAAREAID=N'tst') AND (A.ITEMTYPE=1)) AND ((B.DATAAREAID=N'tst') AND ((B.INVENTMODEL=0) AND (A.MODELGROUPID=B.MODELGROUPID))) ORDER BY A.DATAAREAID,A.ITEMTYPE,A.ITEMID Цитата:
SELECT A.ITEMID,A.ITEMNAME,A.RECID,B.MODELGROUPID,101090
FROM INVENTTABLE A,INVENTMODELGROUP B WHERE ((A.DATAAREAID=N'dmo') AND (A.ITEMTYPE=1)) AND ((B.DATAAREAID=N'tst') AND ((B.INVENTMODEL=0) AND (A.MODELGROUPID=B.MODELGROUPID))) ORDER BY A.DATAAREAID,A.ITEMTYPE,A.ITEMID
__________________
Dynamics AX 4.0 SP2 |
|
|
За это сообщение автора поблагодарили: AndyD (5). |
24.06.2009, 12:38 | #15 |
Участник
|
Цитата:
В моей конфигурации все работает
__________________
Axapta v.3.0 sp5 kr2 |
|
24.06.2009, 14:18 | #16 |
Участник
|
X++: static void test(Args _args) { query query; SalesLine SalesLineA; SalesLine SalesLineB; QueryRun qr; QueryBuildDataSource qbsSalesLineCentral, qbsSalesLineOrig; ; SalesLineA.company('A'); SalesLineB.company('B'); query = new Query(); //query.allowCrossCompany(true); qbsSalesLineCentral = query.addDataSource(tablenum(SalesLine), "SalesLineCentral"); qbsSalesLineOrig = qbsSalesLineCentral.addDataSource(tablenum(SalesLine), "SalesLineOrig"); qbsSalesLineOrig.addLink(fieldnum(salesline, recid), fieldnum(salesline, Salesid)); qbsSalesLineOrig.addRange(fieldnum(salesLine, Salesid)).value(SysQuery::valueNotEmptyString()); qr = new QueryRun(query); qr.setCursor(SalesLineA, 1); qr.setCursor(SalesLineB, 2); } |
|
24.06.2009, 14:26 | #17 |
Участник
|
Хм.
А компании A и B у вас заведены? Надо указывать существующие. Кроме того, связывать recId с SalesId как-то неправильно
__________________
Axapta v.3.0 sp5 kr2 |
|
24.06.2009, 14:39 | #18 |
Участник
|
Цитата:
Нет, не заведены.Ок, щас попробую рабочие. >> Кроме того, связывать recId с SalesId как-то неправильно. Это просто не удачный пример , хотя сообщение об ошибке немного не то сообщает. Ок, пасибо, сейчас проверю еще раз.. |
|