AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 06.01.2019, 23:02   #1  
AzatGDC is offline
AzatGDC
Участник
 
27 / 14 (1) ++
Регистрация: 08.11.2018
отображение полей из объединенного view в lookup
Добрый день,

Помогите пожалуйста разобраться. Необходимо в форме диалога
"Управление запасами / Отчеты/ Проводки/ Карточка учета материалов"
добавить возможность фильтрации в lookup к полю "Код номенклатуры" по наименованию продукта
Наименовани продукта есть во view "itemNameAzat" - поле Name.
вызывающий данный диалог класс - InventStdFormM17_RU
В классе есть метод itemIdLookup где как я понимаю и описывается поведение нужного мне lookup. Там я прописываю код как на скриншоте. Пытаюсь связать мое view c таблицей InventTable. Получаю ошибку как на скриншоте при попытке открыть lookup. При этом сам класс InventStdFormM17_RU компилируется без ошибок. Подскажите пожалуйста что я делаю не так. Заранее спасибо. Скришоты прилагаю.
Миниатюры
Нажмите на изображение для увеличения
Название: 111.JPG
Просмотров: 250
Размер:	71.8 Кб
ID:	12177   Нажмите на изображение для увеличения
Название: 112.JPG
Просмотров: 343
Размер:	165.7 Кб
ID:	12178  

Нажмите на изображение для увеличения
Название: 113.JPG
Просмотров: 222
Размер:	73.0 Кб
ID:	12179  
Старый 08.01.2019, 15:44   #2  
YoungPadawan is offline
YoungPadawan
Участник
 
21 / 23 (1) +++
Регистрация: 04.01.2017
Много полезной информации по работе с 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  
AzatGDC is offline
AzatGDC
Участник
 
27 / 14 (1) ++
Регистрация: 08.11.2018
Прочитал) спасибо. только дело в том, что query сформирован другим классом, которому передается таблица InventTable. а вот как подцепиться к этому query дальше. То есть добавить подичненный datasource пока не знаю. Но даже если это получится работать будет евда ли. класс SysTableLookup не может извлекать lookup поля из разных таблиц как я прочитал... есть класс SysMultiTableLookup но его нужно ставить:
https://360dynamics.blogspot.com/201...elds-from.html
каких то других способов как lookup поля из разных таблиц извлечь пока не знаю
Старый 09.01.2019, 08:22   #4  
Pandasama is offline
Pandasama
Участник
 
457 / 137 (5) +++++
Регистрация: 11.08.2014
Адрес: Барнаул
Цитата:
Сообщение от AzatGDC Посмотреть сообщение
каких то других способов как lookup поля из разных таблиц извлечь пока не знаю
Если не нужна фильтрация/сортировка - можно в лукап вывести дисплей-метод
За это сообщение автора поблагодарили: AzatGDC (1).
Старый 09.01.2019, 10:12   #5  
YoungPadawan is offline
YoungPadawan
Участник
 
21 / 23 (1) +++
Регистрация: 04.01.2017
Цитата:
Сообщение от AzatGDC Посмотреть сообщение
Прочитал) спасибо. только дело в том, что query сформирован другим классом, которому передается таблица InventTable. а вот как подцепиться к этому query дальше. То есть добавить подчиненный datasource пока не знаю.
у Вас:
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 нет в AX2012?

А в общем работа с SysMultiTableLookup не особо отличается SysLookup. Разобравшись с обычным сможете сделать и с SysMultiTableLookup.

Последний раз редактировалось YoungPadawan; 09.01.2019 в 10:14.
Старый 09.01.2019, 10:53   #6  
AzatGDC is offline
AzatGDC
Участник
 
27 / 14 (1) ++
Регистрация: 08.11.2018
Цитата:
Сообщение от 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();

}
в методе InventInventoriedPolicy::addInventoriedRangeToInventTable присоединяются другие источники данных, то есть строится запрос тоже:

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);
    }
}
По итогу как я вижу пока ситуацию. Нужно сделать view свое где связать все таблицы включая таблицы из метода addStockedProductRangeToInventTable и затем уже добавлять lookup fields из полей этого view? верно ли это? что-ти типа такого:

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  
YoungPadawan is offline
YoungPadawan
Участник
 
21 / 23 (1) +++
Регистрация: 04.01.2017
1. Проще импортировать себе класс SysMultiTableLookup, чем плодить Views. В будущем ещё пригодится.
2. Что бы достать QueryBuildDataSource c Query используй методы Query.dataSourceTable(), Query.dataSourceName() или Query.dataSourceNo().
За это сообщение автора поблагодарили: AzatGDC (1).
Старый 09.01.2019, 11:26   #8  
AzatGDC is offline
AzatGDC
Участник
 
27 / 14 (1) ++
Регистрация: 08.11.2018
Спасибо большое) понял суть) буду пробовать делать.
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Сломалось отображение полей типа ReferenceGroup на форме Bekus DAX: Программирование 2 20.10.2016 12:06
Заполнение нескольких полей одним lookup Emka DAX: Программирование 4 15.02.2016 11:24
paruvella: Ax 2012 EP Lookup as Tree view – Simple example Blog bot DAX Blogs 0 24.08.2013 04:19
dynamicsaxbi: Better together: Microsoft Dynamics AX 2012 R2 and SQL Server Power View Blog bot DAX Blogs 0 12.12.2012 13:11
Как перекрыть lookup для поля входящего в группу полей ATimTim DAX: Программирование 2 05.10.2005 11:26

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 21:42.