Цитата:
Сообщение от
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);
Этот код будет работать и в Ax 3.0 тоже
как вариант реализации - использование метода
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
тестовый job:
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