Dynamics CRM 2011 設置型 グラフの集計レコード数上限を変更する
みなさん、こんにちは。
ゴールデンウィークも終わりましたが、みなさんはどのように過ごされたでしょうか。
さて今回は最近よくサポートにお問い合わせをいただく、グラフ機能のエラーに
関して情報をお届けします。
グラフの集計レコード数上限
通常のグリッドと異なり、グラフではより多くのレコードに対してクエリを実行する
必要があります。これは、グラフがレコードそのものではなく、集計値を扱うため
必然の動作です。しかし同時に、パフォーマンスに影響があることも否めません。
現在の Microsft Dynamics CRM 2011 では、集計レコード数の上限が 50000 と
なっています。しかし集計したい内奥によってはこの数値は十分ではない場合も
あります。今回はこの値を変更する方法を紹介します。
※尚、この変更は設置型でのみ利用が可能です。
サンプルプログラム
現在この値を変更できるツールは提供されていませんが、値の確認と変更を
行えるメッセージが SDK で公開されています。今回は簡単なコンソール
アプリケーションを開発して、値の確認と変更を行います。尚、 SDK 5.0.10 を
利用しています。
1. Visual Studio 2010 を起動します。
2. 新しいプロジェクトを作成します。コンソールアプリケーションを使用します。
3. プロジェクトを作成したら、まずは .NET Framework のバージョンを
変更します。ソリューションエクスプローラよりプロジェクトを右クリック
して、プロパティをクリックします。
4. 対象のフレームワークで、.NET Framework 4.0 を選択します。
5. 次に以既存のヘルパークラスを追加します。プロジェクトを右クリック
し、追加 | 既存の項目をクリックします。
6. sdk\samplecode\cs\helpercode フォルダより、 以下 2 つのクラス
を追加します。
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 に変更しました。
動作の確認
変更が有効になっているか確認するために、活動のグラフを表示してみます。
サンプルデータしか入っていない状況でも、集計レコード数の上限が 5 件の
ため、以下のようなエラーになります。
逆に、上記エラーが出ている場合には、設定値をより大きく変更することで
エラーが解消されますが、その分パフォーマンスに配慮してください。
まとめ
今回はグラフの集計レコード数上限変更を、プログラムから行う方法を簡単に
紹介しました。ヘルパーコードを再利用していることや、エラーをハンドルして
いない点からも実用には耐えませんが、イメージだけでも伝わればと思います。
尚、この変更は PowerShell で行う事も可能です。簡単かつ安全に変更したい
場合には、 PowerShell の利用もご検討ください。
‐ Dynamics CRM サポート 中村 憲一郎