06.01.2019, 23:02 | #1 |
Участник
|
отображение полей из объединенного view в lookup
Добрый день,
Помогите пожалуйста разобраться. Необходимо в форме диалога "Управление запасами / Отчеты/ Проводки/ Карточка учета материалов" добавить возможность фильтрации в lookup к полю "Код номенклатуры" по наименованию продукта Наименовани продукта есть во view "itemNameAzat" - поле Name. вызывающий данный диалог класс - InventStdFormM17_RU В классе есть метод itemIdLookup где как я понимаю и описывается поведение нужного мне lookup. Там я прописываю код как на скриншоте. Пытаюсь связать мое view c таблицей InventTable. Получаю ошибку как на скриншоте при попытке открыть lookup. При этом сам класс InventStdFormM17_RU компилируется без ошибок. Подскажите пожалуйста что я делаю не так. Заранее спасибо. Скришоты прилагаю. |
|
08.01.2019, 15:44 | #2 |
Участник
|
Много полезной информации по работе с Query.
Прочитайте полностью, в дальнейшем будет намного проще.http://www.axaptapedia.com/Expressions_in_query_ranges Грубо говоря, у Вас нет подчиненных датасорсов. Вы добавили два датасорса на один уровень P.S. Помещайте результат метода AddDataSource() в переменную типа QueryBuildDataSource, в них виден текст запроса. Так проще дебажить. Последний раз редактировалось YoungPadawan; 08.01.2019 в 15:47. |
|
08.01.2019, 21:52 | #3 |
Участник
|
Прочитал) спасибо. только дело в том, что query сформирован другим классом, которому передается таблица InventTable. а вот как подцепиться к этому query дальше. То есть добавить подичненный datasource пока не знаю. Но даже если это получится работать будет евда ли. класс SysTableLookup не может извлекать lookup поля из разных таблиц как я прочитал... есть класс SysMultiTableLookup но его нужно ставить:
https://360dynamics.blogspot.com/201...elds-from.html каких то других способов как lookup поля из разных таблиц извлечь пока не знаю |
|
09.01.2019, 08:22 | #4 |
Участник
|
|
|
|
За это сообщение автора поблагодарили: AzatGDC (1). |
09.01.2019, 10:12 | #5 |
Участник
|
Цитата:
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. |
|
09.01.2019, 10:53 | #6 |
Участник
|
Цитата:
Сообщение от 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. |
|
09.01.2019, 11:11 | #7 |
Участник
|
1. Проще импортировать себе класс SysMultiTableLookup, чем плодить Views. В будущем ещё пригодится.
2. Что бы достать QueryBuildDataSource c Query используй методы Query.dataSourceTable(), Query.dataSourceName() или Query.dataSourceNo(). |
|
|
За это сообщение автора поблагодарили: AzatGDC (1). |
09.01.2019, 11:26 | #8 |
Участник
|
Спасибо большое) понял суть) буду пробовать делать.
|
|
|
|