Dynamics CRM 2011 SDK サンプル紹介 : システムビューの状態変更

みなさん、こんにちは。

今回は SDK サンプルを組み合わせた、システムビューのステータス変更の
サンプルを紹介します。

シナリオ

Microsoft Dynamics CRM 2011 において、開発と本番環境の組織が存在
する環境で、ソリューションを移行します。この際、一部のシステムビューを
非アクティブに変更してると想定します。

ソリューションの移行後、本番環境で非アクティブにしたシステムビューを
確認すると、アクティブになっています。これはソリューション内のシステム
ビュー定義にステータス情報が含まれないためです。

複数のエンティティの複数のシステムビューを非アクティブにする作業は
手間がかかります。

解決策

システムビューのステータスは、SDK を利用して変更できます。今回は
複数のサンプルを組み合わせて、その要件を実現してみます。

サンプル

SDK のヘルパーコードを利用しつつ、サンプルを極力再利用するため
コンソールアプリケーションを作成します。

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

2. コンソール アプリケーションプロジェクトを作成します。今回は
UpdateSavedQueryStatus としました。

3. 作成されたプロジェクトを右クリックして、プロパティをクリックします。
対象のフレームワークより .NET Framework 4.0 を指定します。

4. 以下の参照を追加します。

Microsoft.Xrm.Sdk.dll
Microsoft.Crm.Sdk.Proxy.dll

System.Runtime.Serialization
System.Security
System.ServiceModel
System.DirectoryServices.AccountManagement

5. 以下のファイルを sdk\samplecode\cs\helpercode より
既存のアイテムとして追加します。

crmservicehelpers.cs
deviceidmanager.cs
myorganizationcrmsdktypes.cs

6. Program.cs ファイルを開いて、クラスプロパティを追加します。

private OrganizationServiceProxy _serviceProxy; // 開発環境用
private OrganizationServiceProxy _serviceProxy2; // 本番環境用

7. using ステートメントを追加します。

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

8. Main メソッドに以下のコードを追加します。

// 開発環境用
ServerConnection serverConnect = new ServerConnection();
ServerConnection.Configuration config = serverConnect.GetServerConfiguration();

// 本番環境用
ServerConnection serverConnect2 = new ServerConnection();
ServerConnection.Configuration config2 = serverConnect2.GetServerConfiguration();

Program app = new Program();
app.Run(config, config2);

9. Run メソッドを追加します。

public void Run(ServerConnection.Configuration serverConfig, ServerConnection.Configuration serverConfig2)
{
    try
    {
        // 開発環境の組織 Web サービスに接続 
        // using を利用することで、Dispose を確実に行う
        using (_serviceProxy = ServerConnection.GetOrganizationProxy(serverConfig))
        {
            // 事前バインドを利用するためには、以下コードが必須
            _serviceProxy.EnableProxyTypes();

            // SavedQuery を取得するクエリを作成
            QueryExpression mySavedQuery = new QueryExpression
            {
                ColumnSet = new ColumnSet("savedqueryid","name"), // ID と Name 列を取得
                EntityName = SavedQuery.EntityLogicalName,
                Criteria = new FilterExpression
                {
                    Conditions =
                    {
                        new ConditionExpression
                        {
                            // 現在非アクティブになっている SavedQuery のみ取得
                            AttributeName = "statecode",
                            Operator = ConditionOperator.Equal,
                            Values = {(int)SavedQueryState.Inactive}
                        },
                        new ConditionExpression
                        {
                            AttributeName = "querytype",
                            Operator = ConditionOperator.Equal,
                            Values = {0}
                        }                           
                    }
                }
            };
                   
            // クエリを実行
            EntityCollection savedQueries = _serviceProxy.RetrieveMultiple(mySavedQuery);

            // 本番環境の組織 Web サービスに接続
            // using を利用することで、Dispose を確実に行う
            using (_serviceProxy2 = ServerConnection.GetOrganizationProxy(serverConfig2))
            {
                // 事前バインドを利用するためには、以下コードが必須
                _serviceProxy2.EnableProxyTypes();

                // 取得した結果を利用して、本番環境の SavedQuery を非アクティブにする
                foreach (SavedQuery savedQuery in savedQueries.Entities)
                {
                    // SetStateRequest を利用してステータスを変更
                    SetStateRequest req = new SetStateRequest();
                    req.State = new OptionSetValue((int)SavedQueryState.Inactive);
                    req.Status = new OptionSetValue(2);
                    req.EntityMoniker = new EntityReference(SavedQuery.EntityLogicalName, savedQuery.SavedQueryId.Value);

                    SetStateResponse res = (SetStateResponse)_serviceProxy2.Execute(req);
                }
            }
        }
    }
    catch { }
}

10. アプリケーションをビルドします。

11. アプリケーションを実行します。通常のサンプルと異なり、組織の情報を
2 度聞かれますが、初めが開発環境、後が本番環境として利用します。

利用したサンプルの紹介

まず Main メソッド内のコードは、ほぼすべてのサンプルで利用されている
ものをそのまま再利用しました。唯一の違いは、2 つの組織の構成を作成
している点です。

次に SavedQuery の取得やステータス変更は、以下内容を利用しました。
Microsoft Dynamics CRM でのエンティティ ビューのカスタマイズ
こちらのページにはビューを扱う様々な方法が紹介されています。

まとめ

今回のサンプルではエラー処理を行っていないことや、ビュー取得のクエリ
の条件が非常にシンプルなため、より実用的にするには改修が必要ですが
ヘルパークラスを利用していることから、設置型やオンライン等、環境を
問わず利用できるメリットがあります。

是非色々なサンプルをお試しください。

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