Reusing Query Filters with SysQuery::mergeRanges()

When working with the Query framework in Dynamics 365 Finance & Operations (D365FO), you may sometimes need to apply the same filter conditions across different queries. Instead of manually duplicating ranges, you can use the SysQuery::mergeRanges() method to copy filters from one query to another.

Example

Query query, targetQuery;
QueryBuildDataSource qbds;

//Source query
query = new Query();
qbds = query.addDataSource(tableNum(SalesLine));

//Add InventDim
qbds = qbds.addDataSource(tableNum(InventDim));
qbds.addLink(fieldNum(SalesLine, InventDimId), fieldNum(InventDim, InventDimId));
qbds.joinMode(JoinMode::ExistsJoin);
qbds.addRange(fieldNum(InventDim, InventColorId)).value(queryValue("Black"));
qbds.addRange(fieldNum(InventDim, InventSizeId)).value(queryValue("XL"));

//Target Query
targetQuery = new Query();
qbds = targetQuery.addDataSource(tableNum(PurchLine));

//Add InventDim
qbds = qbds.addDataSource(tableNum(InventDim));
qbds.addLink(fieldNum(PurchLine, InventDimId), fieldNum(InventDim, InventDimId));
qbds.joinMode(JoinMode::ExistsJoin);

//Source query
Info(query.toString());
// SELECT * FROM SalesLine(SalesLine_1) EXISTS JOIN * FROM InventDim(InventDim_1) 
// WHERE SalesLine.InventDimId = InventDim.inventDimId 
// AND ((InventColorId = N'Black')) AND ((InventSizeId = N'XL'))

//Target query before merge
Info(targetQuery.toString());
// SELECT * FROM PurchLine(PurchLine_1) EXISTS JOIN * FROM InventDim(InventDim_1)
// WHERE PurchLine.InventDimId = InventDim.inventDimId

SysQuery::mergeRanges(targetQuery, query, 2);

//Target query After merge
Info(targetQuery.toString());
// SELECT * FROM PurchLine(PurchLine_1) EXISTS JOIN * FROM InventDim(InventDim_1) 
// WHERE PurchLine.InventDimId = InventDim.inventDimId 
// AND ((InventColorId = N'Black')) AND ((InventSizeId = N'XL'))