Dynamics CRM 4.0 の開発を行っていて大量のデータを削除したいということはありませんか?実は、Dynamics CRM 4.0 では、データの大量削除は結構大変だったりします。ブラウザ画面上からこつこつデータを削除する場合は最大250ずつしかデータを削除できません。

エンティティのすべてのデータを削除する場合は一括削除ジョブを作成することもできます。ネットで公開されている汎用的な一括削除ジョブの作成ツールを使用することもできます。しかし、特定条件に該当するデータを大量に削除する場合は結構大変なのではないでしょうか。

データベースをバックアップしておき、リストアすれば対応できる場合もありますが、他の開発者やエンドユーザも使用している環境の場合、おいそれとバックアップしてリストアできないこともあると思います。独占的に環境を使用する必要があるでしょうから調整も大変です。

ということで、今回紹介する自作ツールは ”それならFilteredViewに対してクエリを発行して該当データをCrmService経由で削除するプログラムをつくればいんじゃね? ” というDynamics CRM用の ツール作成者としては、かなり怠けた発想から作成しプロジェクトで使っていたツールを一から作り直したものです。

本ツールでは次の機能があります。ただ、WPFではじめてまじめにいろいろ作成したため、エラー処理は甘くて切なめです。

  • CRMサーバーへの AD or IFD 認証での接続
  • SQL を使用したデータの抽出
  • 抽出データの一括削除、 非アクティブ化、 アクティブ化
  • 処理の途中キャンセル
  • 処理の多重化による高パフォーマンス化

需要があるかどうかは不明ですが、自分的には結構よく使いました。Dynamics CRM 4.0 CrmDataDeletionTool で公開しています。とりあえず画面ショットまで。英語は怪しいです笑って許してください。

動作環境

  • .NET 3.5SP1
  • CRM サーバには IFD or AD 認証 でログインできる環境
  • CRMの組織DBには Windows 認証 で接続(SQL 認証でもOKのはずですが環境の関係上動作確認していません。)できる環境。

1. CrmDataDeletionTool の使い方

ツールをダブルクリックして起動します。最初にメニューの Connect ボタンをクリックしてCrmServiceに接続します。

CRMサービスへの接続用のコンフィグ画面が表示されます。 ディスカバリサーバーへのURL(http://crmserver/など) や組織名(大文字、小文字に注意) 、認証方法( AD or IFD )や ユーザ名、パスワードを入力します。認証方法がIFDの場合のみ、ユーザ名、パスワードは必須です。

そのほか、CrmService ウェブサービス呼び出しのタイムアウト(ミリ秒)や、使用する接続文字列名(アプリケーション構成ファイルに存在すること) を設定します。 CrmServiceのサーバのURLを指定する場合は Automatically Resolve CrmService Url のチェックを外し、 http://crmserver/ のようにCrmServiceの サーバのURLを設定します。基本的には CrmServiceのURLはDiscoveryServiceから求めることができるCrmServerのURLで問題ありません。ただ、localhostでアクセスするとAD認証を行い、サーバー名でアクセスするとIFD認証を行うようにCrmサーバが設定してある場合は、明示的にCrmServiceのサーバーのURLを指定するとうまく動作する可能性があります。

OKボタンをクリックすると、接続の検証と、メタデータの取得が行われます。(10秒くらい時間がかかります。)

設定画面が閉じると、下図のようにコンボボックスにエンティティ情報がセットされていることが確認できます。削除や状態を変更させたいエンティティを選択します。コンボボックスにフォーカスがあたっている状態で、エンティティの論理名をキー入力してもエンティティを選択することもできます。

エンティティを選択すると、コンボボックス下のテキストボックスにSQLのひな形が作成されます。SQLのフィルタ条件を入力して、 Search ボタンをクリックします。このとき、列に必ずエンティティのID(GUID)列が含まれるようにしてください。

検索に成功すると ListView にレコードが表示されます。列数が多いと時間がかかるので注意してください。

削除や、状態を変更したいデータのチェックボックスにチェックします。すべて選択する場合は Check All ボタンをクリックします。

処理対象のレコードにチェックを入れた後、 削除する場合は Delete, 有効化する場合は Activate, 非有効化する場合は InActive をクリックします。ここではInActiveをクリックして選択したすべてのレコードを非アクティブにします。

Activate または、 InActivate をクリックした場合、次のダイアログが表示されるため、状態に対するステータスを選択します。

下図のダイアログが表示されるので、 Start ボタンをクリックします。 Close ボタンを押すと処理をせずに画面を閉じます。

処理を開始すると、 Start, Close ボタンは非アクティブになり、 Cancelボタンが有効になります。 Cancelをクリックすると処理を停止します。

全レコードを処理すると Closeボタンが有効になります。Close ボタンをクリックして画面を閉じます。

同じ条件で再検索すると、変更が反映されているいことが確認できます。

以上で一通り完了です。

2. まとめ

今回の説明は以上です。冒頭で述べましたが、エラー処理は少しあまくてせつなめです。プロジェクト中地味に何度もつかったので公開してみました。