Dynamics CRM 2011 では、主として検索対象となるエンティティの任意の表示列を使用してソートを行えます。逆に関連エンティティの属性をビューに含めている場合はソートその列でソートを行えません。

データ件数が多くない場合は 任意の列でソートを行っても特に問題はありません。件数が多いとソート列によって、また検索条件によって非常に検索に時間がかかるようになりパフォーマンスが問題となる場合があります。画面からエンティティをカスタマイズしている場合、特定の列に対してソートの可能/不可能を制御することはできません。

今回はエクスポートをしたソリューションの customizations.xml のビューのレイアウト情報を編集して 特定の列のソートを行えないようにする方法を紹介します。

今回紹介する方法では 個人ビューや高度な検索画面でのアドホックに作成したビューに対するソートの禁止は行えません。あらゆる検索に対して ソートを制御したい場合は、プラグインを作成して ソート条件を強制的に書き換えたり、エラーを発生させる などをする方法が必要になります。この場合 検索結果画面の UI が適切なものにならないかもしれません。

そのほか、 未検証ですが、 userqueryや savedquery の検索を トリガーとするプラグインを作成し、 検索結果のレイアウト情報/検索条件情報を書き換える(後述する disalbeSorting を付与したり, ソート条件を書き換える)ことで意図しないフィールドによるソートを行えないようにできるかもしれません。

1. カスタマイズを編集してソートの可/不可 を設定する

ソートの可/不可を制御したい エンティティを含む ソリューションをエクスポートします。zipファイルを展開し、 customizations.xml をメモ帳などで開きます。変更対象のビューの定義 <layoutxml>タグ を名前などで検索してください。 layoutxml タグの子要素に cell 要素があるので、 属性に disableSorting="1" を設定しファイルを保存します。

下記ビューのレイアウトのxmlは編集例です。 new_datetime1, new_price, transactioncurrencyid フィールド に対するソートを行えないようにしています。

            <layoutxml>
              <grid name="resultset" object="10000" jump="new_name" select="1" icon="1" preview="1">
                <row name="result" id="new_sampleid">
                  <cell name="new_name" width="300"  />
                  <cell name="new_datetime1" width="100" disableSorting="1" />
                  <cell name="new_price" width="100"  disableSorting="1" />
                  <cell name="transactioncurrencyid" width="100"  disableSorting="1" />
                </row>
              </grid>
            </layoutxml>

disableSorting に関しては、 下記URL の説明を参照してください。disableSorting="1" を設定した フィールドに対してビューを表示している画面からソート処理が行えないようになります。

<cell> (SavedQuery)
http://msdn.microsoft.com/ja-jp/library/gg328458.aspx

2. まとめ

説明は以上です。今回記載した方法は ソリューションに含まれる 定義済みのビューに対して ソートの可/不可を制御する方法です。個人ビューや高度な検索で作成したアドホックなビューに対しては別の方法を考える必要があります(方法は記事冒頭で記載しています)。