Dynamics CRM 2011 設置型 グラフの集計レコード数上限を変更する

みなさん、こんにちは。

ゴールデンウィークも終わりましたが、みなさんはどのように過ごされたでしょうか。

さて今回は最近よくサポートにお問い合わせをいただく、グラフ機能のエラーに
関して情報をお届けします。

グラフの集計レコード数上限

通常のグリッドと異なり、グラフではより多くのレコードに対してクエリを実行する
必要があります。これは、グラフがレコードそのものではなく、集計値を扱うため
必然の動作です。しかし同時に、パフォーマンスに影響があることも否めません。

現在の Microsft Dynamics CRM 2011 では、集計レコード数の上限が 50000 と
なっています。しかし集計したい内奥によってはこの数値は十分ではない場合も
あります。今回はこの値を変更する方法を紹介します。

※尚、この変更は設置型でのみ利用が可能です。

サンプルプログラム

現在この値を変更できるツールは提供されていませんが、値の確認と変更を
行えるメッセージが SDK で公開されています。今回は簡単なコンソール
アプリケーションを開発して、値の確認と変更を行います。尚、 SDK 5.0.10 を
利用しています。

1. Visual Studio 2010 を起動します。

2. 新しいプロジェクトを作成します。コンソールアプリケーションを使用します。
image

3. プロジェクトを作成したら、まずは .NET Framework のバージョンを
変更します。ソリューションエクスプローラよりプロジェクトを右クリック
して、プロパティをクリックします。

4. 対象のフレームワークで、.NET Framework 4.0 を選択します。
image

5. 次に以既存のヘルパークラスを追加します。プロジェクトを右クリック
し、追加 | 既存の項目をクリックします。

6. sdk\samplecode\cs\helpercode フォルダより、 以下 2 つのクラス
を追加します。
image

7. 次に以下の参照を追加します。
microsoft.xrm.sdk.deployment.dll
microsoft.xrm.sdk.dll
System.Runtime.Serialization
System.Security
System.ServiceModel
System.DirectoryServices.AccountManagement

8. Program.cs ファイルを開いて、Main メソッドに以下のコードを
追加します。

ServerConnection serverConnect = new ServerConnection();
ServerConnection.Configuration config = serverConnect.GetServerConfiguration();
var app = new Program();
app.Run(config);

クラスの冒頭に以下の using ステートメントを追加します。

using Microsoft.Crm.Sdk.Samples;
using Microsoft.Xrm.Sdk.Client;
using Microsoft.Xrm.Sdk.Deployment;
using Microsoft.Xrm.Sdk.Query;

そしてクラス直下に以下のプロパティを追加します。

private OrganizationServiceProxy _serviceProxy;

9. Run メソッドを追加します。ここでは一切のエラー処理を
していませんので、あくまで利用方法の参考程度にしてください。

public void Run(ServerConnection.Configuration serverConfig)
{
    using (_serviceProxy = ServerConnection.GetOrganizationProxy(serverConfig))
    {
        // このコードは事前バインドには必須です
        _serviceProxy.EnableProxyTypes();

        // 展開サービスを取得
        DeploymentServiceClient serviceClient = Microsoft.Xrm.Sdk.Deployment.Proxy.ProxyClientHelper.CreateClient(
            new Uri(serverConfig.DiscoveryUri.ToString()
                .Replace("Services", "Deployment")
                .Replace("Discovery", "Deployment")));

        // 現在の設定を確認
        RetrieveAdvancedSettingsRequest request = new RetrieveAdvancedSettingsRequest()
        {
            ConfigurationEntityName = "Deployment",
            ColumnSet = new ColumnSet("AggregateQueryRecordLimit")
        };

        ConfigurationEntity ce = ((RetrieveAdvancedSettingsResponse)serviceClient.Execute(request)).Entity;               

        // 結果を表示
        foreach (var setting in ce.Attributes)
        {
            if(setting.Key == "AggregateQueryRecordLimit")
                Console.WriteLine(setting);
        }

        // 新しい値を入力。※エラーチェックをしていないが、数値を期待
        Console.WriteLine("Enter New Value");
        string newValue = Console.ReadLine();

        // 新しい設定を追加
        ConfigurationEntity entity = new ConfigurationEntity();
        entity.LogicalName = "Deployment";
        entity.Attributes = new AttributeCollection();
        entity.Attributes.Add(new KeyValuePair<string, object>("AggregateQueryRecordLimit", newValue));

        // 新しい設定に更新
        UpdateAdvancedSettingsRequest request2 = new UpdateAdvancedSettingsRequest();
        request2.Entity = entity;
        serviceClient.Execute(request2);
    }
}

10. F5 を押下してプログラムを実行します。途中組織を選択しますが
設置自体は構成データベースに対する変更のため、どの組織を
選択しても結果は同じです。

以下では数値を 50000 から 5 に変更しました。

image

動作の確認

変更が有効になっているか確認するために、活動のグラフを表示してみます。
サンプルデータしか入っていない状況でも、集計レコード数の上限が 5 件の
ため、以下のようなエラーになります。
image

逆に、上記エラーが出ている場合には、設定値をより大きく変更することで
エラーが解消されますが、その分パフォーマンスに配慮してください。

まとめ

今回はグラフの集計レコード数上限変更を、プログラムから行う方法を簡単に
紹介しました。ヘルパーコードを再利用していることや、エラーをハンドルして
いない点からも実用には耐えませんが、イメージだけでも伝わればと思います。

尚、この変更は PowerShell で行う事も可能です。簡単かつ安全に変更したい
場合には、 PowerShell の利用もご検討ください。

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