Building queries with fetchmode property in AX 2012

static void custTableSelect(Args _args)
{
CustTable custTable;
CustGroup custGroup;
DlvTerm dlvTerm;
#define.custGroup('Net30')
#define.dlvTerm(LogisticsLocationRoleType::None)
while select custTable
join custGroup
where custGroup.CustGroup == custTable.CustGroup
&& custGroup.PaymTermId == #custGroup
join dlvTerm
where dlvTerm.Code == custTable.DlvTerm
&& dlvTerm.TaxLocationRole == #dlvTerm
{
info(custTable.AccountNum);
}
}
We can use standard QueryBuildDataSource classes:
static void custTableQuery(Args _args)
{
CustTable custTable;
QueryBuildDataSource dsCustTable, dsCustGroup, dsDlvTerm;
Query query = new Query();
QueryRun queryRun;
#define.custGroup('Net30')
#define.dlvTerm(LogisticsLocationRoleType::None)
dsCustTable = query.addDataSource(tableNum(CustTable));
dsCustGroup = dsCustTable.addDataSource(tableNum(CustGroup));
dsCustGroup.addLink(fieldNum(CustTable, CustGroup), fieldNum(CustGroup, CustGroup));
dsCustGroup.addRange(fieldNum(CustGroup, PaymTermId)).value(#custGroup);
dsDlvTerm = dsCustTable.addDataSource(tableNum(dlvTerm));
dsDlvTerm.addLink(fieldNum(CustTable, DlvTerm), fieldNum(DlvTerm, Code));
dsDlvTerm.addRange(fieldNum(dlvTerm, TaxLocationRole)).value(queryValue(#dlvTerm));
queryRun = new queryRun(query);
while (queryRun.next())
{
custTable = queryRun.get(tableNum(custTable));
info(custTable.AccountNum);
}
}
The problem is that above code will not work properly. The built queries will be separated, not joined. To make it work as expected we have to use FetchMode property for QueryBuildDataSource. By default QueryBuildDataSource has property FetchMode == QueryFetchMode::One2Many. We need to set this property to FetchMode == QueryFetchMode::One2One. See below:
static void custTableQuery(Args _args)
{
dsCustGroup = dsCustTable.addDataSource(tableNum(CustGroup));
dsCustGroup.addLink(fieldNum(CustTable, CustGroup), fieldNum(CustGroup, CustGroup));
dsCustGroup.addRange(fieldNum(CustGroup, PaymTermId)).value(#custGroup);
dsCustGroup.fetchMode(QueryFetchMode::One2One);
dsDlvTerm = dsCustTable.addDataSource(tableNum(dlvTerm));
dsDlvTerm.addLink(fieldNum(CustTable, DlvTerm), fieldNum(DlvTerm, Code));
dsDlvTerm.addRange(fieldNum(dlvTerm, TaxLocationRole)).value(queryValue(#dlvTerm));
dsCustGroup.fetchMode(QueryFetchMode::One2One);
}
See more

AGA pomaga – poznaj inteligentnego asystenta do przetwarzania zapytań ofertowych: ANEGIS Generative Assistant

Jak z pomocą narzędzi Power Platform, Microsoft Fabric i AI zrealizować plan na cyfrową transformację? ANEGIS Power Center

Obowiązkowy KSeF startuje za 4 miesiące! Umów się na bezpłatne konsultacje i przygotuj swój system na zmiany
Looking for a Microsoft partner? Let's talk about your project
Work with a team that has delivered implementations and projects for dozens of companies. Schedule an introductory call and see:
How to tailor Dynamics 365 to your company's processes, rather than the other way around
Which areas are worth automating to save time and reduce costs
Here is the step-by-step implementation process with Anegis: from analysis to post-launch support

