Показать сообщение отдельно
Старый 09.07.2014, 15:29   #1  
iCloud is offline
iCloud
Enjoy!
Аватар для iCloud
MCP
Злыдни
 
195 / 108 (4) +++++
Регистрация: 06.03.2012
Адрес: Moscow/Ukraine/Malta
Post QueryRange и QueryFilter [AX2012]
День добрый. Наткнулся на ранее не изведанную мною тему.
Начну с наглядного, есть Job, внутри запрос реализующий InnerJoin и OuterJoin.
X++:
    QueryRun                    qr;
    Query                       query = new Query();
    QueryBuildDataSource        qbdsEcoResProduct,
                                qcoEcoResProductDimensionGroupProduct,
                                qcoEcoResProductTranslation,
                                qbdsInventTable,
                                qbdsRetailAssortmentExploded;
    RetailStoreTable            _storeTable;
    TransDate                   _effectiveDate = systemDateGet();

    qbdsEcoResProduct = query.addDataSource(tableNum(EcoResProduct));    
    qbdsInventTable = qbdsEcoResProduct.addDataSource(tableNum(InventTable));
    qbdsInventTable.joinMode(JoinMode::InnerJoin);
    //qbdsInventTable.fetchMode(QueryFetchMode::One2One);
    qbdsInventTable.addLink(fieldNum(EcoResProduct, RecId),
                            fieldNum(InventTable, Product),
                            qbdsEcoResProduct.name());

    qbdsRetailAssortmentExploded = qbdsInventTable.addDataSource(tableNum(RetailAssortmentExploded));
    qbdsRetailAssortmentExploded.joinMode(JoinMode::OuterJoin);
    qbdsRetailAssortmentExploded.relations(true);    
    qbdsRetailAssortmentExploded.addRange(fieldNum(RetailAssortmentExploded, OMOperatingUnitId)).value(queryValue(_storeTable.OMOperatingUnitID));
            
// --> User: DBOwner
    //qbdsRetailAssortmentExploded.addRange(fieldNum(RetailAssortmentExploded, ValidFrom)).value(queryRange(dateNull(), _effectiveDate));
    //qbdsRetailAssortmentExploded.addRange(fieldNum(RetailAssortmentExploded, ValidTo)).value(queryRange(_effectiveDate, datemax()));
        
    query.addQueryFilter(qbdsRetailAssortmentExploded, fieldStr(RetailAssortmentExploded, ValidFrom)).value(queryRange(dateNull(), systemDateGet()));
    query.addQueryFilter(qbdsRetailAssortmentExploded, fieldStr(RetailAssortmentExploded, ValidTo)).value(queryRange(systemDateGet(), datemax()));
// <-- User: DBOwner
Если вначале раскомментировать 2 строки которые реализуют добавление фильтра через класс QueryRange, то результат запроса таков:
X++:
SELECT * FROM EcoResProduct(EcoResProduct_1) 
JOIN * FROM InventTable(InventTable_1) 
ON EcoResProduct.RecId = InventTable.Product 
OUTER JOIN * FROM RetailAssortmentExploded(RetailAssortmentExploded_1) 
ON InventTable.ItemId = RetailAssortmentExploded.ItemId AND ((OMOperatingUnitId = 0)) AND ((ValidFrom<={ts '2014-07-09 00:00:00.000'})) AND ((ValidTo>={ts '2014-07-09 00:00:00.000'} AND ValidTo<={ts '2154-12-31 00:00:00.000'}))
Если же запустить данный Job без изменений, тем самым реализовать добавление
фильтра через класс QueryFilter то фильтры гарантированно уйдут после оператора WHERE:
X++:
SELECT * FROM EcoResProduct(EcoResProduct_1) 
JOIN * FROM InventTable(InventTable_1) 
ON EcoResProduct.RecId = InventTable.Product 
OUTER JOIN * FROM RetailAssortmentExploded(RetailAssortmentExploded_1) 
ON InventTable.ItemId = RetailAssortmentExploded.ItemId AND ((OMOperatingUnitId = 0)) 
WHERE ((RetailAssortmentExploded(RetailAssortmentExploded_1).ValidFrom<={ts '2014-07-09 00:00:00.000'})) AND ((RetailAssortmentExploded(RetailAssortmentExploded_1).ValidTo>={ts '2014-07-09 00:00:00.000'} AND ValidTo<={ts '2154-12-31 00:00:00.000'}))
Теперь о физике:
Для inner join никакой разницы между ними нет; для outer join записи, не
удовлетворяющие условиям выражения ON, включаются в результирующую
выборку, а записи, не удовлетворяющие условиям выражения where, не включаются.

Использование QueryFilter гарантированно опускает условия выборки после WHERE.

Вопрос: QueryRange правильнее использовать только при простых запросах и когда необходимо поместить в ON фиксированный ключ/релейшн?

UPD: Буду благодарен за любую информацию на данную тему.

Последний раз редактировалось iCloud; 09.07.2014 в 15:34.
За это сообщение автора поблагодарили: mazzy (5), Logger (3), S.Kuskov (5), Kabardian (2).