EntityDataRecordManipulation.Console は 設定ファイルの内容に従って、エンティティレコードを作成、削除や更新を行うツールです。このツールを使えばカスタムプログラムを作らずに、各エンティティフォームにフィールドに配置されていなかたったり、javascript で読み取り専用にされたフォーム上のフィールドを更新できます。Dynamics CRM はデータベースに対する直接の変更操作をサポートしていないので地味に便利だと思います。

本ツールを使うことで、不具合のため不整合な状態となったデータの修正。エンティティレコードの操作に対する監査機能が適切に動作するかの確認を行うことができます。

ツールはDynamics CRM 4.0 TinyEntityRecordManipulationTool からダウンロードできます。

1. ツールの説明

ツールの使い方と機能の説明を記載します。

1.1 ツールの機能

任意のエンティティに対して次のような処理を行えます。

  • 検索 Retrieve
  • 複数検索 RetrieveMultiple, FetchXml
  • 作成 Create (作成時に属性値を設定可能)
  • 更新 Update (更新時の属性値を設定可能)
  • 削除 Delete
  • 割当 Assign
  • 状態変更 SetStateDynamic

検索に関しては複雑なことはできません。

1.2 ツールの設定(アプリケーション構成ファイルの設定)

アプリケーション構成ファイルTinyEntityRecordManipulation.Console.exe.config の次の項目を設定します。

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <!--
    crmurl          CRM server url ex. http://localhsot 
    orgname         organizationname (case sensitive)
    domain          domain name (required if IFD auth)
    authType        認証方式(AD or IFD)
    crmusername     crm useraccount (required if IFD auth)
    crmuserpassword crm userpassword (required if IFD auth)
  -->
  <appSettings>
    <add key="crmurl" value="http://localhost"/>
    <add key="orgname" value="dyn"/>
    <add key="domain" value="CRM"/>
    <add key="authType" value="AD"/>
    <add key="crmusername" value=""/>
    <add key="crmuserpassword" value=""/>
  </appSettings>
</configuration>

 設定値は次の通りです。

項目 設定値
crmurl CRMサーバへのURLです。http://付きで指定します。
orgname 接続対象の組織名です。大文字、小文字を区別しますので注意してください。
domain IFD環境の場合に必要です。Dynamics CRM の所属しているドメイン名を指定します。 ユーザの資格情報を組み立てるときに使用されます。
authtype 認証方式を指定します。 OnPremise の場合は AD, IFD環境の場合は IFD を指定します。
crmusername IFD環境の場合に必要です。Dynamics CRM のユーザアカウントを指定します。
crmuserpassword IFD環境の場合に必要です。Dynamics CRM のユーザのパスワードを指定します。

1.3 ツールの実行

ツールは操作内容を記載した 設定ファイルを引数として指定します。コマンドプロンプト上で次のようにコマンドを入力します。 taskset.xml は操作内容を記述した設定ファイルです。設定ファイルの内容は以降で説明します。

TinyEntityRecordManipulation.Console.exe /taskset:taskset.xml

2. 使い方

それぞれの操作は task ノードに記載します。設定ファイルには複数の task ノードを記述できます。メッセージごとの task ノードの設定例は以降を参照。task ノードには type 属性に操作を指定します。また、enabled 属性に false を設定することで、プログラムにtask ノードで指定されている処理のスキップをさせることができます。

2.1 検索 Retrieve

検索処理を行う場合は typeにretriefve を指定します。 param 要素の entityname に 対象エンティティの物理名、 entityid にエンティティレコードのGUIDを指定します。

<?xml version="1.0" encoding="utf-8" ?>
<taskset>
  <!-- Retrieve -->
  <task type='retrieve'>
    <param entityname='account' entityid='40ADE129-2424-DF11-B2DC-0003FFBF2D57' />
  </task>
</taskset>

2.2 複数検索 RetrieveMultiple FetchXml

複数検索を行う場合、 type に retrievemultiple か fetch を指定します。 param 要素のentityname に対象のエンティティ名を指定します。retrievemultiple の場合は RetrieveMultiple メッセージを作成し、fetch の場合は FetchXml 操作(Execute メッセージ)を実行します。

<?xml version="1.0" encoding="utf-8" ?>
<taskset>
  <!-- RetrieveMultiple -->
  <task type='retrievemultiple'>
    <param entityname='account' />
  </task>
  <!-- Fetch -->
  <task type='fetch'>
    <param entityname='account' />
  </task>
</taskset>

2.3 作成 Create

エンティティレコードの作成を行う場合は type に create を指定します。 param ノードの entityname に対象とするエンティティ名を指定します。 property 要素には設定する属性値の名前と型、値を指定することで属性値を指定してエンティティレコードを作成できます。下の例のように task ノードの enabled 属性を false にするとプログラムはこの処理をスキップします。createanddelete はエンティティレコードを作成したあとすぐに削除する場合に使用します。

<?xml version="1.0" encoding="utf-8" ?>

<taskset>
  <!-- Create-->
  <task type='create' enabled='false' >
    <param entityname='new_importdata'>
      <property name='new_name' type='nvarchar' value='custom entity name' />
      <property name='new_datetime' type='datetime' value='2010-12-03' />
      <property name='new_decimal' type='decimal' value='2000' />
    </param>
  </task>
  <!-- CreateAndDelete-->
  <task type='createanddelete'>
    <param entityname='new_importdata'>
      <property name='new_name' type='nvarchar' value='custom entity name' />
      <property name='new_datetime' type='datetime' value='2010-12-23' />
      <property name='new_decimal' type='decimal' value='-102000' />
    </param>
  </task>
</taskset>

property 要素のtype に指定できるのは bit, picklist, datetime, float, nvarchar, ntext, decimal, money, int, lookupのいづれかです。 lookup を指定した場合は extinfo という属性にlookup先のエンティティ名を指定する必要があります。lookupを使用する例は更新の説明を参照してください。

2.4 更新 Update

エンティティレコードを更新する場合は type を update にします。param要素の entityname にエンティティ名、 entityid に 更新対象のエンティティレコードのGUIDを指定します。作成と同様に property 要素に対して更新する属性と属性値を設定します。

<?xml version="1.0" encoding="utf-8" ?>

<taskset>
  <!-- Update -->
  <task type='update' enabled='false'>
    <param entityname='account' entityid='40ADE129-2424-DF11-B2DC-0003FFBF2D57'>
      <property name='accountnumber' type='nvarchar' value='EQUITY001' />
      <property name='description' type='ntext' value='Global Congromarit Company' />
      <property name='numberofemployees' type='int' value='20000' />
      <property name='donotbulkemail' type='bit' value='true' />
      <property name='ownershipcode' type='picklist' value='3' />
      <property name='address1_longitude' type='float' value='90.5' />
      <property name='revenue' type='money' value='2010000' />
      <property name='transactioncurrencyid' type='lookup' value='11D061EB-EDE9-DE11-ACA6-0003FFBF2D57' extinfo='transactioncurrency' />
    </param>
  </task>
</taskset>

2.5 削除 Delete

削除を行う場合は type にdeleteを指定します。param 要素のentityname は対象のエンティティ名, entityid に削除対象のエンティティレコードのGUIDを設定します。

<?xml version="1.0" encoding="utf-8" ?>
<taskset>
  <!-- Delete -->
  <task type='delete' enabled='false'>
    <param entityname='new_importdata' entityid='D0A55A19-4E24-DF11-B584-0003FFBF2D57'/>
  </task>
</taskset>

2.6 割当 Assign

割当を行う場合は type に assign を設定します。param要素の entityname, entityid に対象となるエンティティ名とエンティティレコードのGUIDを指定します。 principalid にユーザのGUID を指定します。principaltype には User を設定します。

<?xml version="1.0" encoding="utf-8" ?>
<taskset>
  <!-- Assign -->
  <task type='assign'>
    <param entityname='account' entityid='40ADE129-2424-DF11-B2DC-0003FFBF2D57' principalid='4088841C-41DF-DE11-805F-0003FF3B6B75' principaltype='User' />
  </task>
</taskset>

2.7 状態変更 SetStateDynamic

状態の変更(アクティブ化、非アクティブ化)を行う場合は type に setstatedynamic を指定します。 param 要素の entityname と entityid にはエンティティ名とレコードのGUID を指定します。 state 属性には有効化する場合は active, 非アクティブにする場合は inactive を指定します。

<?xml version="1.0" encoding="utf-8" ?>
<taskset>
  <!-- SetStateDynamic -->
  <task type='setstatedynamic'>
    <!-- inactivate -->
    <param entityname='account' entityid='40ADE129-2424-DF11-B2DC-0003FFBF2D57' state='inactive' />
  </task>
  <task type='setstatedynamic'>
    <!-- activate -->
    <param entityname='account' entityid='40ADE129-2424-DF11-B2DC-0003FFBF2D57' state='active' />
  </task>
</taskset>

3. 実行例

上記の更新の設定ファイルを引数に指定してプログラムを実行すると次のように取引先企業のレコードが更新されます。

4. まとめ

説明は以上です。ちっちゃなツールですが、異常データのピンポイント修正などさりげなく使えるのではと思います。

ツールに対してご要望や意見などありましたらご連絡ください。