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へのリンクが切断されます。アイテム/サイトごとにグループ化するのではなく、アイテムのみでグループ化されたすべてのサイトのすべてのアイテムの数量の合計を取得します。
これはなぜですか?
私はそれを知らなかった。私はいつもT-SQLと考えましたが、明らかにいくつかの違いがあります。 – AnthonyBlake
実際には、同じデータソースに対して2つ(またはそれ以上)の内部結合を持つことができます。結合されたデータソースのフェッチモードをQueryFetchMode:One2Oneに設定する必要があります。デフォルトはOne2Many(1:n)で失敗したようですが、後続の読み込みでは追加の結合テーブルが取得されます。 –