SDK 4.0.12 の xRM を使ってみよう パート 1

みなさん、こんにちは。

前回紹介した Dynamics CRM 4.0 用 SDK 4.0.12 はお試しいただけたでしょうか。今回は実際に触ってみた
感触を、サンプルを交えて紹介したいと思います。尚、今回は以下の環境で試しました。

- 設置型で、URL は https://crm:5555
- 組織名は AdventureWorks
- Visual Studio 2008 Professional SP1 日本語を使用
- CRM 4.0 + UR10
- カスタムエンティティ (MyEntity) を追加

CrmSvcUtil で事前準備

xRM ソリューションの第一歩は、CrmSvcUtil を使ってのコード生成です。以下の手順でツールを実行します。

1. コマンドプロンプト起動。

2. sdk\microsoft.xrm\tools フォルダに移動

3. 以下のコマンドを実行 (サーバー名等は適宜変更してください。)

crmsvcutil /server:”https://crm:5555/AdventureWorks” /namespace:Xrm
    /dataContextPrefix:ADV /out:Xrm.cs

4. 実行が終了するまで待って、sdk\microsoft.xrm\tools フォルダに Xrm.cs ができたことを確認。

以上で終了です。簡単です。

ソリューション作成と参照の追加

1. C# のコンソールアプリを選択。.NET Framework 3.5 を選択。

image

2. 参照設定で以下を追加。

ファイル:
sdk\bin\microsoft.crm.sdk.dll (※)
sdk\bin\microsoft.crm.sdktypeproxy.dll (※)
sdk\bin\microsoft.crm.sdktypeproxy.xmlserializers.dll (※)
sdk\microsoft.xrm\bin\microsoft.xrm.client.dll
sdk\microsoft.xrm\bin\microsoft.xrm.portal.dll
sdk\microsoft.xrm\bin\microsoft.xrm.portal.files.dll

※32bit と 64bit でフォルダが違うため注意。64bit は sdk\bin\64bit

.NET
System.Data.Services
System.Data.Services.Client

3. ソリューションを右クリックして、既存の項目の追加より、出力された Xrm.cs の追加。

image

4. 新しい項目の追加より、アプリケーション構成ファイルを追加。

image

5. Program.cs に参照を追加します。

using Xrm;
using Microsoft.Crm.Sdk;
using Microsoft.Crm.SdkTypeProxy;

アプリケーション構成ファイルの変更

xRM のソリューションでは、CRM サーバーへの接続情報を App.config に保持します。これにより、複数環境へ
柔軟に配置が可能になります。従来の SDK でも構成ファイルを使用して URL だけ外出しすることが可能でしたが、
今回は初めからその手法が採用されていることと、設置型、IFD 関わらず同じコードが使えるところが魅力です。

1. 追加した App.config を開いて以下のように情報を追加します。

<configuration>
  <connectionStrings>
    <add name="OnPremise" connectionString="Authentication Type=Integrated;
Server=https://crm:5555/AdventureWorks" />
  </connectionStrings>
</configuration>

2. IFD や、ユーザー名を指定して接続する場合は、SDK の Connect to the Microsoft Dynamics CRM Server を
参照してください。

name は自由に設定ができますので、環境とタイプなどを組み合わせた名前にしてもいいかもしれません。

Web サービスの作成

準備が整いましたので、早速サービスを作成したいと思います。以下のコードを Program.cs に追加してください。

var crm = new Xrm.ADVDataContext("OnPremise");

ここで注意ですが ADVDataContext は、crmsvcutil の dataContextPrefix によって変わります。今回は ADV を
指定したため、ADVDataContext となっています。 SDK のサンプルでは Xrm.XrmDataContext となっていることが
多いのですが、これはパラメータ指定時に、 Xrm を指定しているためです。

また引数の OnPremise は、アプリケーション構成ファイルで指定した名前です。つまりここを入れ替えることで
接続が切り替えられるわけです。これはなかなか柔軟なオプションではないでしょうか。

レコードの取得

では実際にレコードを取得してみます。

以下のコードをご覧ください。

foreach (var c in crm.new_myentitynew_myentities)
            {
                System.Console.WriteLine(c.new_name);
            }

このコードからわかることは、フィルタ条件もなにもなければ、crm.new_myentitynew_myentities と記述するだけで
実際にレコードが取得できているということです。今までのことを考えると、かなり手軽ですね!裏で実行されているクエリ
は以下のような感じです。 (実際はsp_executesql で実行されています。)

select [全ての列] from New_myentity where deletionstatecode=0

つまり、有効なレコードすべてを取得しています。これはパフォーマンス観点から望ましくありませんね。ということで、
次にフィルタを利かせたレコードの取得を LINQ を使った例で紹介します。以下のコードをご覧ください。

var query = from new_myentity in crm.new_myentitynew_myentities
                        where new_myentity.new_name.Contains("Record")
                        select new { new_myentity.new_name };

            foreach (var c in query)
            {
                System.Console.WriteLine(c.new_name);
            }

この場合のクエリは、以下のような感じです。(実際はsp_executesql で実行されています。)

select New_name, New_myentityId, from New_myentity where deletionstatecode=0 and
New_name like N'%Record%'

これで列も絞れましたし、where 句も指定できました。(インデックスが使えないクエリですが。。)
そのほかの取得方法も SDK にはサンプルがありますので、ご覧ください。

レコードの作成

最後のレコード作成のサンプルです。

var myEntity = new Xrm.new_myentity()
            {
                new_name = "Record_NEW"
            };

            crm.AddTonew_myentitynew_myentities(myEntity);
            crm.SaveChanges();

ここでのポイントは、SaveChanges() を実行するまではレコードが作成されない点です。
同じような手法で、レコードの更新、削除も可能です。是非 SDK からサンプルを探してみてください。

以下参考までに、今回作成したサンプルプログラムのコードです。

Program.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Xrm;
using Microsoft.Crm.Sdk;
using Microsoft.Crm.SdkTypeProxy;

namespace xRMConsoleApp
{
    class Program
    {
        static void Main(string[] args)
        {
            // Program インスタンスの作成
            Program pg = new Program();
            // すべてのレコードの取得
            pg.ShowAllRecords();
            // 検索条件を指定しての取得
            pg.ShowFilteredRecord();
            // レコードの作成
            pg.CreateMyEntityRecord();       
        }

        // すべてのレコードの取得
        public void ShowAllRecords()
        {
            // サービス作成
            var crm = new Xrm.ADVDataContext("OnPremise");

            // レコードの取得および表示
            foreach (var c in crm.new_myentitynew_myentities)
            {
                System.Console.WriteLine(c.new_name);
            }
        }

        public void ShowFilteredRecord()
        {
            // サービス作成
            var crm = new Xrm.ADVDataContext("OnPremise");

            // レコードの取得および表示
            var query = from new_myentity in crm.new_myentitynew_myentities
                        where new_myentity.new_name.Contains("Record")
                        select new { new_myentity.new_name };

            foreach (var c in query)
            {
                System.Console.WriteLine(c.new_name);
            } 
        }

        public void CreateMyEntityRecord()
        {
            // サービス作成
            var crm = new Xrm.ADVDataContext("OnPremise");

            // レコード情報の作成
            var myEntity = new Xrm.new_myentity()
            {
                new_name = "Record_NEW"
            };

            // レコードの追加
            crm.AddTonew_myentitynew_myentities(myEntity);

            // 実際に反映
            crm.SaveChanges();
        }
    }
}

App.config

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <connectionStrings>
    <add name="OnPremise" connectionString="Authentication Type=Integrated; Server=https://crm:5555/AdventureWorks" />
  </connectionStrings>
</configuration>

<参考>
Linq: (https://msdn.microsoft.com/en-us/netframework/aa904594.aspx)

Microsoft Dynamics CRM SDK 4.0.12 and the Advanced Developer Extensions (英語)
https://blogs.msdn.com/b/crm/archive/2010/05/13/microsoft-dynamics-crm-sdk-4-0-12-and-the-advanced-developer-extensions.aspx

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