2012-04-24 23 views
1

Req Transテーブルのクエリを作成してアイテム/サイト別の集計を表示するコードがあります。クエリにリンクされたデータソースを追加するとグループ化が失敗する

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

基本的に、同じデータソースに対して2つの内部結合を使用することはできません(ただし、動作しません)。

AX 2012を使用している場合は、代わりにInventDimInventTableデータソースを追加することができます

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)); 
... 
:あなたが最初 InventTableを入れて、以前のバージョン( InventTableから1つのフィールドでグループに覚えている)で

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); 

+0

私はそれを知らなかった。私はいつもT-SQLと考えましたが、明らかにいくつかの違いがあります。 – AnthonyBlake

+0

実際には、同じデータソースに対して2つ(またはそれ以上)の内部結合を持つことができます。結合されたデータソースのフェッチモードをQueryFetchMode:One2Oneに設定する必要があります。デフォルトはOne2Many(1:n)で失敗したようですが、後続の読み込みでは追加の結合テーブルが取得されます。 –

関連する問題