I am trying to make a query for a lookup which selects all purchase orders that are either in Received Status or in BackOrder status with at list one packingslip not received using this query:
Query query = new Query();
QueryBuildDataSource qbds;
QueryBuildDataSource QbdsJoin;
QueryBuildDataSource QbdsJoin2;
QueryBuildDataSource QbdsJoin3;
// Instantiate sysTableLookup object using table which will provide the visible fields
SysTableLookup sysTableLookup = sysTableLookup::newParameters(tableNum(PurchTable), _formControl);
// Create the query.
qbds = query.addDataSource(tableNum(PurchTable));
Qbds.addSelectionField(fieldNum(PurchTable, PurchId));
Qbds.addSortField(fieldNum(PurchTable, PurchId));
qbds.addRange(fieldNum(PurchTable, PurchStatus)).value(queryValue(PurchStatus::Received));
qbds.addRange(fieldNum(PurchTable, PurchStatus)).value(queryValue(PurchStatus::Backorder));
qbds.addRange(fieldNum(PurchTable, OrderAccount)).value(ISCPContrasenasHeader.AccountNum);
qbds.orderMode(OrderMode::GroupBy);
qbds.addGroupByField(fieldNum(PurchTable, PurchId));
QbdsJoin = qbds.addDataSource(tableNum(VENDPACKINGSLIPJOUR));
QbdsJoin.addLink(fieldNum(VENDPACKINGSLIPJOUR, PurchId),fieldNum(PurchTable, PurchId));
QbdsJoin.addSortField(fieldNum(VENDPACKINGSLIPJOUR, PurchId));
QbdsJoin.addOrderByField(fieldnum(VENDPACKINGSLIPJOUR,PurchId));
QbdsJoin.orderMode(OrderMode::GroupBy);
QbdsJoin2 = QbdsJoin.addDataSource(tableNum(vendinvoiceinfoline));
QbdsJoin2.joinMode(JoinMode::NoExistsJoin);
QbdsJoin2.addLink(fieldNum(VENDPACKINGSLIPJOUR, PurchId),fieldNum(vendinvoiceinfoline, origpurchid));
QbdsJoin3 = QbdsJoin2.addDataSource(tableNum(vendInvoiceInfoSubLine));
QbdsJoin3.addLink(fieldNum(VENDPACKINGSLIPJOUR, PACKINGSLIPID),fieldNum(vendInvoiceInfoSubLine, DocumentId));
QbdsJoin3.addLink(fieldNum(vendInvoiceInfoSubLine, LineRefRecId),fieldNum(vendinvoiceinfoline, recid));
Witch resulted on a duplicate PurchId.
I even try reducing my query to this:
Query query = new Query();
QueryBuildDataSource qbds;
QueryBuildDataSource QbdsJoin;
// Instantiate sysTableLookup object using table which will provide the visible fields
SysTableLookup sysTableLookup = sysTableLookup::newParameters(tableNum(PurchTable), _formControl);
// Create the query.
qbds = query.addDataSource(tableNum(PurchTable));
Qbds.addSelectionField(fieldNum(PurchTable, PurchId));
//Qbds.addSelectionField(fieldNum(PurchTable, OrderAccount));
qbds.addRange(fieldNum(PurchTable, PurchStatus)).value(queryValue(PurchStatus::Received));
qbds.addRange(fieldNum(PurchTable, PurchStatus)).value(queryValue(PurchStatus::Backorder));
qbds.addRange(fieldNum(PurchTable, OrderAccount)).value(ISCPContrasenasHeader.AccountNum);
QbdsJoin = qbds.addDataSource(tableNum(VENDPACKINGSLIPJOUR));
QbdsJoin.addLink(fieldNum(VENDPACKINGSLIPJOUR, PurchId),fieldNum(PurchTable, PurchId));
QbdsJoin.addSortField(fieldNum(VENDPACKINGSLIPJOUR, PurchId));
QbdsJoin.addOrderByField(fieldnum(VENDPACKINGSLIPJOUR,PurchId));
QbdsJoin.orderMode(OrderMode::GroupBy);
Qbds.addSortField(fieldNum(PurchTable, PurchId));
Qbds.addOrderByField(fieldNum(PurchTable, PurchId));
Qbds.orderMode(OrderMode::GroupBy);
When debugging I get the query into this:
SELECT PurchId FROM PurchTable(PurchTable_1) GROUP BY PurchTable.PurchId, VendPackingSlipJour.PurchId WHERE ((PurchStatus = 2) OR (PurchStatus = 1)) AND ((OrderAccount = N'1118676')) JOIN * FROM VendPackingSlipJour(VendPackingSlipJour_1) ON PurchTable.PurchId = VendPackingSlipJour.PurchId
Witch also return a duplicated purchid. In my understanding this translates to this SQL Statement:
SELECT PurchTable.PurchId FROM PurchTable
JOIN VendPackingSlipJour ON PurchTable.PurchId = VendPackingSlipJour.PurchId
WHERE ((PurchStatus = 2) OR (PurchStatus = 1)) AND ((PurchTable.OrderAccount = N'1118676'))
GROUP BY PurchTable.PurchId, VendPackingSlipJour.PurchId
Witch correctly result in only one PurchId as I expected.
What could it be wrong?