Conditional
Joins in x++
Here is the code to apply joins conditionally in Microsoft
Dynamics AX.
query = new Query();
dsInventTable = query.addDataSource(tableNum(InventTable),
"InventTable");
dsInventItemBarCode = dsInventTable.addDataSource(tableNum(InventItemBarCode),
"InventItemBarCode");
dsInventItemBarCode.joinMode(JoinMode::ExistsJoin);
// Add any two ranges
queryBuildRange1 = dsInventTable.addRange(fieldNum(InventTable, DataAreaId));
queryBuildRange2 = dsInventItemBarCode.addRange(fieldNum(InventItemBarCode,
DataAreaId));
Find all records where either the ItemType is Service, or
the ItemType is Item and a barcode exists. The join criteria is only applied in
the second half of the expression, so all Service items will appear
irrespective of whether they have a bar code. Again, this is not possible to
achieve using the standard query ranges.
queryBuildRange2.value(strFmt('((%1.%2 == %3) || ((%1.%2 == %4)
&& (%1.%5 == %6)))',
query.dataSourceTable(tableNum(InventTable)).name(), // InventTable %1
fieldStr(InventTable, ItemType), // ItemType %2
any2int(ItemType::Service), // %3
any2int(ItemType::Item), // %4
fieldStr(InventTable, ItemId), // ItemId %5
fieldStr(InventItemBarCode, ItemId))); // %
-Harry
dsInventTable = query.addDataSource(tableNum(InventTable), "InventTable");
dsInventItemBarCode = dsInventTable.addDataSource(tableNum(InventItemBarCode), "InventItemBarCode");
dsInventItemBarCode.joinMode(JoinMode::ExistsJoin);
// Add any two ranges
queryBuildRange1 = dsInventTable.addRange(fieldNum(InventTable, DataAreaId));
queryBuildRange2 = dsInventItemBarCode.addRange(fieldNum(InventItemBarCode, DataAreaId));
query.dataSourceTable(tableNum(InventTable)).name(), // InventTable %1
fieldStr(InventTable, ItemType), // ItemType %2
any2int(ItemType::Service), // %3
any2int(ItemType::Item), // %4
fieldStr(InventTable, ItemId), // ItemId %5
-Harry