Dynamics CRM 2011 より深い関連レコードをサブグリッドで取得する

みなさん、こんにちは。

今回は開発者向けの記事として、サブグリッドのクエリに関する情報を提供します。

情報元 : Deep queries for subgrids

この記事では以下の内容を紹介します。

・ 問題の概要
・ サンプル定義
・ カスタマイズの追加
・ Customization.xml の修正
・ 結論

問題の概要

現在 Microsoft Dynamics CRM 2011 では、サブグリッドの結果を取得するために
開いているレコードに関連のある結果だけを取得できます。Update Rollup 7 で、
さらに拡張された機能が提供されたので、紹介します。

※ FetchXML および Customizations.xml 編集の知識がある前提とします。

サンプル定義

新機能を紹介するにあたり、以下にサンプルエンティティの構造を紹介します。
親エンティティとして Legal Account エンティティが存在し、 1:N の子エンティティ
として Portfolio エンティティ、同様に孫エンティティとして Holding エンティティ
が存在します。新機能はより深い階層に対しても機能しますが、説明を簡潔に
するため、今回はこちらのサンプル定義を利用します。

Update Rollup 7 以前では、Legal Account のフォーム上にあるサブグリッド
に、Holding エンティティのレコードを表示することは出来ず、1 階層下にある
Portfolio エンティティのみが表示可能でした。

カスタマイズの追加

Update Rollup 7 からはさらに深い階層のレコードまでサブグリッドに出力
出来るようになりました。この機能を利用する手順を以下に紹介します。
最終ゴールは Legal Account のフォームに Holding エンティティのサブ
グリッドを表示することです。

事前に Legal Account、Portfolio、Holding エンティティが存在し、それぞれ
1:N の関連を作成します。ここでは new_legalaccount、new_portfolio、
new_holding を作成し、関連を作成しています。レコードは Legal Account に
1 つ、それに関連した Portfolio を 1 つ、さらにその Portfolio に関連した
Holding  を 2 つ作成し、関連がまったくない Holding も 2 つ作成しています。

image

image

image

まずシステムのカスタマイズより、Holding エンティティを開き、新しいビューを
1 つ作成します。このビューは後ほど FetchXML を編集して、Legal Account
フォームで利用できるようにします。新規に作成するビューの名前をここでは
HoldingsRelatedToLegalAccount としました。

image

次に Legal Account エンティティに移動して、フォームを編集します。フォーム
エディターにてサブグリッドの挿入を行います。以下のように名前とラベルを
指定します。レコードより 「すべてのレコードの種類」 を選択、エンティティより
Holding を選択し、作成した HoldingsRelatedToLegalAccount ビューを
を指定します。

この時点では、Legal Account レコードとは関連のない Holding エンティティ
のレコードもすべて表示されることになります。後ほど FetchXML を変更して
関連のあるレコードのみを表示するよう編集します。

image

その後 OK をクリックし、フォームで 「保存して閉じる」 をクリックします。
編集完了後、すべてのカスタマイズを公開します。

この時点で Legal Account レコードを開くと、関連に関係なくすべての
Holding レコードが表示されています。

image

Customization.xml の修正

カスタマイズをアンマネージドソリューションとしてエクスポートします。
エクスポートされた zip ファイルを開き、 Customization.xml を任意の
場所に保存、いつも利用している XML Editor で開きます。Legal Account
エンティティのフォーム定義より、追加したサブグリッドを検索します。
※ここでは Related_Holdings という文字列で検索しました。

<RelationshipName> が空になっています。これはサブグリッドを
挿入した際、すべてのレコードを選択したためです。今回はこの箇所を
Legal Account と Portfolio の関連名に置き換えます。関連名は
カスタマイズの 1:N を確認することで取得できます。

これにより、取得された結果が Legal Account と関連のある Holding
エンティティのみとなります。しかしこれだけでは不十分です。

<control id="Related_Holdings" classid="{E7A81278-8635-4d9e-8D4D-59480B391C5B}">
<parameters>
<ViewId>{EAF865E1-6C88-E111-82E8-00155D40F11A}</ViewId>
<IsUserView>false</IsUserView>
 <RelationshipName>new_new_legalaccount_new_portfolio</RelationshipName>
<TargetEntityType>new_holding</TargetEntityType>
<AutoExpand>Fixed</AutoExpand>
<EnableQuickFind>false</EnableQuickFind>
<EnableViewPicker>false</EnableViewPicker>
<ViewIds>{EAF865E1-6C88-E111-82E8-00155D40F11A},{7359F958-CC13-4836-9F14-8DA9C3D99B5E}</ViewIds>
<EnableJumpBar>false</EnableJumpBar>
<ChartGridMode>All</ChartGridMode>
<VisualizationId></VisualizationId>
<IsUserChart>false</IsUserChart>
<EnableChartPicker>true</EnableChartPicker>
<RecordsPerPage>4</RecordsPerPage>
</parameters>
</control>
…………

次のステップは、はじめに追加したビューを検索して、定義を編集することです。
この例では、ビュー ID ‘eaf865e1-6c88-e111-82e8-00155d40f11a’ となります。

ビューの定義に link-entity ステートメントを追加し、Holding エンティティと
Porfolio エンティティの関連を指定します。

<fetchxml>
<fetch version="1.0" output-format="xml-platform" mapping="logical">
<entity name="new_holding">
<order attribute="new_name" descending="false" />
<attribute name="new_name" />
<attribute name="new_holdingid" />
 <link-entity name="new_portfolio" from="new_portfolioid" to="new_portfolioid"></link-entity>
</entity>
</fetch>
</fetchxml>

もし階層階層構造がより深い場合には、ここで階層の情報を追加していきます。
例えば、Holding エンティティが Assets エンティティと関連があり、その情報を
表示したい場合には、以下のように link-entity を追加します。

<fetchxml>
<fetch version="1.0" output-format="xml-platform" mapping="logical">
<entity name="msdyn_asset">

<link-entity name="new_portfolio" from="new_portfolioid" to="new_portfolioid">
<link-entity name="new_holding" from="new_holdingid" to="new_portfolioid">
</link-entity>
</link-entity>

</fetch>

FetchXML 内の Link-Entity 要素は T-SQL の Join に変換されます。最後の
Link-Entity (この場合 Portfolio から Legal Account) がサブグリッドエンジン
により追加されます。 サブグリッドエンジンは、クエリ実行時のタイミングで、
RelationshipName 要素を利用して関連を取得します。よって最後の階層を
除いたすべての階層の情報を順に追加しておく必要があります。

編集が完了したら、再度 zip ファイルに Customization.xml を戻してから
ソリューションを再インポートし、カスタマイズを公開します。Legal Account を
開けば、関連する Holding エンティティが表示されます。

image

結論

この記事では、サブグリッドにより深い階層の関連レコードを表示する方法を
紹介しました。繰り返しになりますが、この機能は Update Rollup 7 で提供
されています。

‐ Dynamics CRM サポート 中村 憲一郎