Цитата:
Сообщение от
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();
}