Показать сообщение отдельно
Старый 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.