Dynamics CRM 2013/Fall '13 SDK サーバー API の新機能

みなさん、こんにちは。

今回は Microsoft Dynamics CRM 2013 および、Microsoft Dynamics
CRM Online Fall '13 SDK サーバー API の新機能を紹介します。

組織サービスの非同期実行

これまで組織サービスの API はすべて同期で処理を行いましたが、
今回のバージョンより非同期処理が追加されました。現時点では
ソリューションのインポートのみが対象となります。

非同期での実行は Excute メソッドに対して ExecuteAsyncRequest
を渡して実行します。ExecuteAsyncRequest の Request メンバと
して ImportSolutionRequest を渡してください。

// ImportSolutionRequest 作成
ImportSolutionRequest importRequest = new ImportSolutionRequest()
{
    CustomizationFile = System.IO.File.ReadAllBytes(“<ソリューションファイルのパス>")
};

// ExecuteAsyncRequest 作成
ExecuteAsyncRequest request = new ExecuteAsyncRequest()
{
    // 作成した ImportSolutionRequest をアサイン
    Request = importRequest                    
};

// response.AsyncJobId でジョブ ID を取得可能
ExecuteAsyncResponse response = (ExecuteAsyncResponse)_serviceProxy.Execute(request);

非同期で実行されているため、作業完了を確認する場合は取得
した AsyncJobId を利用して AsyncOperation レコードの Status
を確認します。例えば以下のような方法が考えられます。

任意のループ内
// AsyncJob を取得
AsyncOperation myjob = (AsyncOperation)_serviceProxy.Retrieve( 
AsyncOperation.EntityLogicalName, response.AsyncJobId, new ColumnSet(true)); 
// ステータスが完了なら終了、それ以外なら 2 秒後再トライ 
if (myjob.StateCode == AsyncOperationState.Completed) 
  break; 
else 
  System.Threading.Thread.Sleep(2000);

イメージの操作

エンティティでイメージを利用する場合、以下スキーマが自動的
に追加されます。エンティティのイメージサポートについては
こちらを参照してください。

EntityImage_Timestamp : 最後に更新されたバージョン
EntityImage_URL : エンティティイメージへの直接アクセス URL
EntityImageId : エンティティイメージの固有 ID

イメージデータの取得

イメージ自体は EntityImage 属性に格納されていますが、サイズ
とパフォーマンスを考慮して、明示的に列を指定して取得しない
限りデータは取得できません。以下にコードを示します。

// 全ての列を取得。この場合イメージは含まれない。
ColumnSet cols = new ColumnSet(true);
Account retrievedAccount = (Account)_serviceProxy.Retrieve("account", _accountId, cols);

// イメージのデータを取得したい場合、明示的に entityimage を列として指定。
cols = new ColumnSet( new String[]{"name","entityimage"});
Account retrievedAccount2 = (Account)_serviceProxy.Retrieve("account", _accountId, cols);

はじめのコードでは EntityImage 列は null が返されます。

イメージの更新

イメージはバイトアレイとして画像を格納し、更新することで
変更が可能です。以下にコードを示します。

Account myAccount = new Account();                   
byte[] myimage = System.IO.File.ReadAllBytes(@"C:\sample.JPG");

myAccount.AccountId = _accountId;
myAccount.EntityImage = myimage;

_serviceProxy.Update(myAccount);

サイズは自動的に 144x144 にリサイズされます。

新機能に伴うメッセージの追加

フィールドの暗号化やアクセスチームなどの新機能に対応するため
メッセージが追加されています。

アクセスチーム関連
アクセスチームについてはこちらを参照してください。

AddUserToRecordTeamRequest
レコードに紐づく自動生成されたチームに対してユーザーを追加します。

RemoveUserFromRecordTeamRequest
レコードに紐づく自動生成されたチームよりユーザーを削除します。

ConvertOwnerTeamToAccessTeamRequest
所有タイプのチームをアクセスチームに変換します。
 
フィールドレベル暗号化関連
フィールドレベル暗号化についてはこちらを参照してください。

IsDataEncryptionActiveRequest
暗号化が有効か確認します。
 
RetrieveDataEncryptionKeyRequest
暗号化キーを取得します。

SetDataEncryptionKeyRequest
暗号化キーを更新します。

メタデータ関連の変更

AttributeMetadata.AttributeType は廃止となります。その代わり
AttributeMetadata.AttributeTypeName を利用してください。
この変更は ImageAttributeMetadata クラスをサポートするため
の変更となります。

まとめ

主に新機能に対応するための機能追加ですが、非同期での実行は
今後もサポートするメッセージが増えるようであれば期待できる
機能だと感じます。是非お試しください!!

- 中村 憲一郎