|
![]() |
#1 |
Участник
|
Цитата:
Сообщение от YoungPadawan
![]() у Вас:
Query.addDataSource(table1); Query.addDataSource(table2); в примере: QueryBuildDataSourceTable1 = Query.addDataSource(table1); QueryBuildDataSourceTable2 = QueryBuildDataSourceTable1.addDataSource(table2); Так строится иерархия. В AX релейшн это всегда взгляд дочернего объекта на родителя. По этому добавляем линк и тип джоина на дочерний QueryBuildDataSourceTable2 QueryBuildDataSourceTable2.addLink(...); QueryBuildDataSourceTable2.joinMode(...); если вывести в инфолог QueryBuildDataSourceTable2.toString(); то там будет Код: SELECT * FROM table1 JOIN table2 ON ... Что означает "его нужно ставить"? SysMultiTableLookup нет в AX2012? А в общем работа с SysMultiTableLookup не особо отличается SysLookup. Разобравшись с обычным сможете сделать и с SysMultiTableLookup. SysMultiTableLooukp нет в AX2012 по умолчанию: https://community.dynamics.com/ax/f/33/t/180331 - здесь описано. Да я понял на счет построения запросов. Только в моем случае я не понимаю как подцепиться к родительскому источнику данных потому что родительский источник данных уходит в другой класс: X++: /// <summary> /// Provides a custom lookup for the <c>ItemId</c> field. /// </summary> /// <param name="_formControl"> /// The <c>FormControl</c> object that needs the lookup /// </param> private void itemIdLookup(FormControl _formControl) { Query query; SysTableLookup sysTableLookup; QueryBuildRange qbr; QueryBuildDataSource qbds; QueryBuildDataSource qbds1; sysTableLookup = SysTableLookup::newParameters(tableNum(InventTable), _formControl, true); query = new Query(); [COLOR="Red"]InventInventoriedPolicy::addInventoriedRangeToInventTable(query.addDataSource(tableNum(InventTable)));[/COLOR] /*qbds = query.addDataSource(tableNum(itemNameAzat)); qbds.joinMode(JoinMode::InnerJoin); qbds.fetchMode(QueryFetchMode::One2One); qbds.addLink(fieldNum(InventTable,ItemId), fieldNum(itemNameAzat,ItemId));*/ sysTableLookup.parmQuery(query); sysTableLookup.addLookupfield(fieldNum(InventTable, ItemId)); //sysTableLookup.addLookupfield(fieldNum(InventTable, Name)); sysTableLookup.addLookupfield(fieldNum(InventTable, NameAlias)); sysTableLookup.addLookupfield(fieldNum(InventTable, ItemType)); sysTableLookup.addLookupfield(fieldNum(InventTable, Product)); sysTableLookup.performFormLookup(); } X++: /// <summary> /// Adds a range for the <c>StockedProduct</c> field of the <c>InventModelGroup</c> table to the /// <paramref name="_inventTableQBDS" /> parameter. /// </summary> /// <param name="_inventTableQBDS"> /// The <c>QueryBuildDataSource</c> to which to add the range. /// </param> /// <param name="_stockedProductValue"> /// The value to use on the <c>StockedProduct</c> range. /// </param> /// <remarks> /// The added range that is on an item model group is joined with the <c>InventTable</c> table. /// </remarks> protected static void addStockedProductRangeToInventTable( QueryBuildDataSource _inventTableQBDS, str _stockedProductValue = '') { QueryBuildDataSource inventModelGroup; QueryBuildDataSource inventModelGroupItem; QueryBuildRange inventModelRange; if (_inventTableQBDS.table() != tableNum(InventTable)) { throw error(strFmt("@SYS19306",funcName())); } inventModelGroupItem = _inventTableQBDS.addDataSource(tableNum(InventModelGroupItem)); inventModelGroupItem.relations(true); inventModelGroupItem.joinMode(JoinMode::ExistsJoin); inventModelGroup = inventModelGroupItem.addDataSource(tableNum(InventModelGroup)); inventModelGroup.relations(true); inventModelGroup.joinMode(JoinMode::ExistsJoin); // Add an empty hidden range otherwise a range will be shown for ModelGroupId which is unwanted // since the join is only to filter non-inventoried lines. inventModelGroup.addRange(fieldNum(InventModelGroup, ModelGroupId)).status(RangeStatus::Hidden); if (_stockedProductValue != '') { inventModelRange = inventModelGroup.addRange(fieldNum(InventModelGroup,StockedProduct)); inventModelRange.value(_stockedProductValue); inventModelRange.status(RangeStatus::Hidden); } } It is actually very easy to combine multiple datasources in a sysTableLookup. Here is the trick I used to be able to filter on the name from the EcoResProductTranslation in the lookup for items. 1) Create a view that combines all your datasources and add the fields you would like to see in your lookup to the view. 2) Create a query from the view created in step 1. 3) Use these to perform your lookup as follows... X++: static client void lookupItemActive(FormStringControl _ctrl) { SysTableLookup sysTableLookup = SysTableLookup::newParameters(tablenum(<ViewName>),_ctrl); Query query = new Query(queryStr(<QueryName>)); sysTableLookup.addLookupfield(fieldnum(<ViewName>, ItemId)); sysTableLookup.addLookupfield(fieldNum(<ViewName>, Name)); sysTableLookup.addLookupfield(fieldNum(<ViewName>, ItemGroupId)); sysTableLookup.addLookupfield(fieldnum(<ViewName>, Status)); sysTableLookup.addLookupfield(fieldnum(<ViewName>, RevId)); sysTableLookup.addLookupfield(fieldnum(<ViewName>, ItemType)); sysTableLookup.parmQuery(query); sysTableLookup.performFormLookup(); } Последний раз редактировалось AzatGDC; 09.01.2019 в 11:10. |
|
![]() |
#2 |
Участник
|
1. Проще импортировать себе класс SysMultiTableLookup, чем плодить Views. В будущем ещё пригодится.
2. Что бы достать QueryBuildDataSource c Query используй методы Query.dataSourceTable(), Query.dataSourceName() или Query.dataSourceNo(). |
|
|
За это сообщение автора поблагодарили: AzatGDC (1). |
![]() |
#3 |
Участник
|
Спасибо большое) понял суть) буду пробовать делать.
|
|
|
Опции темы | Поиск в этой теме |
Опции просмотра | |
|