2012-04-24 19 views
1

我有以下代碼,它在Req Trans表上構建查詢以顯示按項目/網站統一的數量;將鏈接的數據源添加到查詢時,Group-by失敗

query = new Query(); 
dsReqTrans = query.addDataSource(tablenum(ReqTrans)); 

dsReqTrans.addRange(fieldnum(ReqTrans, ReqPlanId)).value(_reqPlanId); 
dsReqTrans.addRange(fieldnum(ReqTrans, RefType)).value(enum2str(_reqRefType)); 

dsReqTrans.addGroupByField(fieldnum(ReqTrans, ItemId)); 
dsReqTrans.addSelectionField(fieldnum(ReqTrans, Qty), SelectionField::Sum); 

dsInventDim = dsReqTrans.addDataSource(tablenum(InventDim)); 
dsInventDim.joinMode(JoinMode::InnerJoin); 
dsInventDim.relations(false); 
dsInventDim.addLink(fieldnum(ReqTrans, CovInventDimId), fieldnum(InventDim, InventDimId)); 

dsInventDim.addGroupByField(fieldnum(InventDim, InventSizeId)); 
dsInventDim.addGroupByField(fieldnum(InventDim, InventSiteId)); 

rangeInventSiteId = dsInventDim.addRange(fieldnum(InventDim, InventSiteId)); 
rangeInventSiteId.value(_parmSiteId); 

這很有效。我按項目/網站獲得數量列的總和。

但是,如果我還想在ItemGroupId上添加範圍。爲此,我需要像這樣鏈接到InventTable;

dsInventTable = dsReqTrans.addDataSource(tablenum(InventTable)); 
dsInventTable.joinMode(JoinMode::InnerJoin); 
dsInventTable.relations(false); 
dsInventTable.addLink(fieldnum(ReqTrans, ItemId), fieldnum(InventTable, ItemId)); 

dsInventTable.addRange(fieldnum(InventTable, ItemGroupId)).value(_parmItemGroupId); 

當我添加此數據源時,InventDim的鏈接已損壞。我只收到按項目分組的所有站點的所有項目數量的總和,而不是按項目/站點分組。

這是爲什麼?

回答

3

基本上你不能有兩個內部連接到同一個數據源(你可以,但它不會工作)。

如果使用AX 2012可以將InventTable數據源添加到InventDim代替:

dsInventTable = dsInventDim.addDataSource(tablenum(InventTable)); 
dsInventTable.joinMode(JoinMode::ExistsJoin); 
dsInventTable.relations(false); 
// OBS 3 arguments next: 
dsInventTable.addLink(fieldnum(ReqTrans, ItemId), fieldnum(InventTable, ItemId), dsReqTrans.name()); 
dsInventTable.addRange(fieldnum(InventTable, ItemGroupId)).value(_parmItemGroupId); 

在早期版本中,你把InventTable第一(從InventTable記住組由一個字段):

query = new Query(); 
dsInventTable = dsReqTrans.addDataSource(tablenum(InventTable)); 
dsInventTable.addGroupByField(fieldnum(InventTable, ItemId)); // You have to group/sum something 
dsReqTrans = dsInventTable.addDataSource(tablenum(ReqTrans)); 
dsReqTrans.joinMode(JoinMode::InnerJoin); 
dsReqTrans.relations(false); 
dsReqTrans.addLink(fieldnum(InventTable, ItemId).fieldnum(ReqTrans, ItemId)); 
... 
+0

我從來不知道。我一直認爲它是T-SQL,但顯然有一些區別 – AnthonyBlake 2012-04-24 12:24:14

+0

實際上,你可以有2個(或更多)內部連接到同一個數據源。您需要將連接數據源的獲取模式設置爲QueryFetchMode:One2One。默認值是One2Many(1:n),看起來會失敗 - 但在後續讀取時,您將獲得附加的連接表。 – 2014-12-16 15:23:02