|
![]() |
#1 |
Участник
|
Прочитал) спасибо. только дело в том, что query сформирован другим классом, которому передается таблица InventTable. а вот как подцепиться к этому query дальше. То есть добавить подичненный datasource пока не знаю. Но даже если это получится работать будет евда ли. класс SysTableLookup не может извлекать lookup поля из разных таблиц как я прочитал... есть класс SysMultiTableLookup но его нужно ставить:
https://360dynamics.blogspot.com/201...elds-from.html каких то других способов как lookup поля из разных таблиц извлечь пока не знаю ![]() |
|
![]() |
#2 |
Участник
|
|
|
|
За это сообщение автора поблагодарили: AzatGDC (1). |
![]() |
#3 |
Участник
|
Цитата:
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 ... Цитата:
Сообщение от AzatGDC
![]() Но даже если это получится работать будет евда ли. класс SysTableLookup не может извлекать lookup поля из разных таблиц как я прочитал... есть класс SysMultiTableLookup но его нужно ставить:
https://360dynamics.blogspot.com/201...elds-from.html каких то других способов как lookup поля из разных таблиц извлечь пока не знаю ![]() А в общем работа с SysMultiTableLookup не особо отличается SysLookup. Разобравшись с обычным сможете сделать и с SysMultiTableLookup. Последний раз редактировалось YoungPadawan; 09.01.2019 в 10:14. |
|
![]() |
#4 |
Участник
|
Цитата:
Сообщение от 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. |
|
![]() |
#5 |
Участник
|
1. Проще импортировать себе класс SysMultiTableLookup, чем плодить Views. В будущем ещё пригодится.
2. Что бы достать QueryBuildDataSource c Query используй методы Query.dataSourceTable(), Query.dataSourceName() или Query.dataSourceNo(). |
|
|
За это сообщение автора поблагодарили: AzatGDC (1). |
![]() |
#6 |
Участник
|
Спасибо большое) понял суть) буду пробовать делать.
|
|
|
|