Dynamics CRM Online 2015 Update 1 SDK 新機能: タイムゾーンに依存しない日付型への変換

みなさん、こんにちは。

今回は Dynamics CRM Online 2015 Update 1 で提供されるプラット
フォームと SDK の新機能より、タイムゾーン非依存の日付型列に
ついて紹介します。タイムゾーン非依存の日付列とカスタマイズ
については以下の記事をご覧ください。

Dynamics CRM Online 2015 Update 1: 日付列の新機能

こちらの記事では、日付型フィールドをタイムゾーン非依存型に
変換する SDK コードを紹介します。

概要

例えば従来の日付型フィールドに対して、2015 年 6 月 9 日 0:00:00
を UTC+9 タイムゾーンのユーザーが作成したレコードを考えます。
この場合、以下のパターンでタイムゾーン非依存型に変更する事が
できます。

※一旦変換した後に再変換はできません。

データベースの値をそのまま利用する
Dynamics CRM は日付型を UTC+0 に変換してでデーターベースに
保存し、表示する際に再度、ユーザーのタイムゾーンに合わせて
データを変換します。データベースの値をそのまま利用して変換
した場合、値は2015 年 6 月 8 日 15:00:00 となります。

レコード所有者のタイムゾーンを利用する
この場合レコード所有者のタイムゾーン設定が UTC-10 であれば、
2015 年 6 月 8 日 5:00:00 が値として使われます。

レコード作成者のタイムゾーンを利用する
この場合、レコード作成者のタイムゾーン設定に変更がなければ、
値は 2015 年 6 月 9 日 0:00:00 となります。

指定したタイムゾーンを利用する
任意のタイムゾーンを指定して変換を実行できます。

動作確認

今回は、取引先企業に日付列を作成してデータを入力した後、各
レコードの所有者のタイムゾーンで日付列を変換します。

日付フィールドの追加

1. ブラウザで Dynamics CRM Online に接続します。

2. 設定 | カスタマイズ | システムのカスタマイズより取引先企業
を展開します。

3. フィールドを選択して、「新規」ボタンをクリックします。

image

4. 表示名に「設立」名前に「established」と入れ、データの
種類から日付を選択します。他の項目は既定値のままです。
「保存して閉じる」をクリックしてフィールドを作成します。

image

5. フォーム上の任意の位置に、作成したフィールドを配置して
カスタマイズを公開します。

レコードに値を設定

1. ログインしているユーザーのタイムゾーンを UTC+9 に設定
して、任意の取引先企業レコードを開きます。

2. 設立に任意の値を入れて保存します。

image

3. ユーザーのタイムゾーンを UTC-4 変更して同じレコードを
開きます。設立の値が変わることを確認します。

image

4. ユーザーのタイムゾーンを UTC+9 に戻します。

プログラムの実装

事前準備が整ったので、最後に SDK でフィールドを変換します。

1. Visual Studio を起動します。新しいプロジェクトをクリック
して、Visual C# | Windows デスクトップ | コンソールアプリ
ケーションを選択します。.NET Framework 4.5.2 を指定します。
任意の名前を付けて、「OK」をクリックします。

image

2. ソリューションエクスプローラーより作成したプロジェクトを
右クリックして、NuGet パッケージの管理をクリックします。

image

3. 左ペインで「オンライン」を選択後、右上の検索ボックスにて
crmsdk を検索します。一覧より Microsoft Dynamics CRM 2015
SDK client and portal assemblies を選択して「インストール」を
クリックします。

image

4. インストールが完了したら「閉じる」で NuGet パッケージの
管理を閉じます。

5. Main メソッドに以下のコードを追加します。これで Dynamics
CRM 組織への接続が作成できます。接続文字は適宜変更します。

CrmConnection conn = CrmConnection.Parse("Url=https://contoso.crm.dynamics.com; Username=someone@contoso.onmicrosoft.com; Password=password;");
OrganizationService service = new OrganizationService(conn);

6. 以下のコードで日付列の変換要求を追加します。Attributes
プロパティに作成した日付型列を指定し、ConverRule に所有者
での変換を指定します。また指定したルールで変換を行うために
AutoConversion は false に設定しています。

ConvertDateAndTimeBehaviorRequest request = new ConvertDateAndTimeBehaviorRequest()
{
    Attributes = new EntityAttributeCollection()
    {
        new KeyValuePair<string, StringCollection>("account",
            new StringCollection(){ "new_established" })
    },
    ConversionRule = DateTimeBehaviorConversionRule.OwnerTimeZone.Value,
    AutoConvert = false
};

7. 以下のコードを追加して、要求を実行します。

// Execute the request
ConvertDateAndTimeBehaviorResponse response = (ConvertDateAndTimeBehaviorResponse)_serviceProxy.Execute(request);

8. F5 キーを押下してプログラムを実行します。

結果の確認

日付型の変換は同期処理として行われず、システムジョブとして
実行されます。

1. ブラウザで Dynamics CRM Online に接続します。

2. 設定 | システムジョブより「日時の動作の変換」を探します。

image

3. 結果が完了になるまで待ちます。

4. ジョブが完了した後、取引先企業レコードを開き、日付を
確認します。

image

5. ユーザーのタイムゾーン設定を変更して、同じレコードを
開きます。タイムゾーンに関係なく同じ値であることを確認
します。

image

まとめ

SDK を利用すれば、日付型の挙動を変換する場合、より柔軟に
設定が行えます。是非お試しください。

‐ 中村 憲一郎