Query relation between wrong fields

public void lookup()

{

Query q = new Query();

QueryBuildDataSource qbds,qbds1, qbds2;

QueryBuildRange qbr;

SysTableLookup sysTableLookup = SysTableLookup::newParameters(tableNum(HcmWorker), this);

qbds = q.addDataSource(tableNum(HcmWorker));

qbds1 = qbds.addDataSource(tableNum(HcmEmployment));

qbds1.relations(false);

qbds1.joinMode(JoinMode::ExistsJoin);

qbds1.addLink(fieldNum(HcmWorker, RecId), fieldNum(HcmEmployment, Worker));

qbds2 = qbds.addDataSource(tableNum(HcmEmploymentContractor));

qbds2.relations(false);

qbds2.joinMode(JoinMode::ExistsJoin);

qbds2.addLink(fieldNum(HcmEmployment, RecId), fieldNum(HcmEmploymentContractor, Employment));

qbds2.addRange(fieldNum(HcmEmploymentContractor, CUSTOMContractorTypeEnum)).value(enum2str(CUSTOMContractorTypeEnum::Principal));

sysTableLookup.parmQuery(q);

sysTableLookup.addLookupfield(fieldNum(HcmWorker, PersonnelNumber), true);

sysTableLookup.addLookupMethod(tableMethodStr(HcmWorker, Name));

sysTableLookup.performFormLookup();

}

While debugging I found that, as soon as the code hits this :

qbds2.addLink(fieldNum(HcmEmployment, RecId), fieldNum(HcmEmploymentContractor, Employment));

It forms the relation between HCMWorker.RecId =HCMEmploymentContractor.Employment, and not HcmEmployment.RecId =HCMEmploymentContractor.Employment. I am not sure why is this happening?

Can anyone help, please?

You’re creating a relation between qbds2 (HcmEmploymentContractor) and its parent data source qbds (HcmWorker), therefore the relation is exactly what your code defines. You would make the bug more visible if you used a better naming convention.

fieldNum() merely returns a field ID (integer value); AX doesn’t check whether you’re using the ID for the right data source.