Dynamics CRM 2013/Fall '13 SDK Xrm.Page.ui の新機能 その 1 - 参照コントロール関連

みなさん、こんにちは。

今回は Microsoft Dynamics CRM 2013 および、Microsoft Dynamics
CRM Online Fall '13 SDK の新機能から参照コントロールに関連する
機能を紹介します。

参照コントロールの変更

今回のバージョンから参照アイコンをクリックすると 10 件の候補
を表示するようになりました。またダイアログを表示する場合も
ポップアップではなくオーバーレイ表示します。

[10件の候補表示]
image

[参照ダイアログ]
image

効率よく作業を行うためには 10 件の候補にレコードをいかに表示
するかが重要になります。

PreSearch イベントと addCustomFilter

PreSearch イベントを利用することで、ユーザーが参照アイコンを
クリックした際に処理を差し込むことが可能です。また差し込む
処理として addCustomFilter を利用することで検索クエリに対して
フィルター条件を追加することが可能です。

尚、PreSearch イベントは新 UI を持つフォームでのみ動作します。

シナリオ

営業案件レコードの取引先担当者を選択する際に、設定した取引先
企業に紐づくレコードだけを表示する。

例えばレコードが以下の状態の場合、取引先担当者を選択する際に
ファブリカム (サンプル) に紐づく担当者のみを表示する。

image

スクリプトの開発

上記シナリオを満たすスクリプトを開発します。

1. 任意のソリューションに対してスクリプト Web リソースを追加
します。ここでは以下の様に設定しました。

image

2. テキストエディターボタンをクリックします。

3. フィルターを設定するフィールドを取得する関数を追加します。
また取得したフィールドに対してフィルターを追加する関数を
実行します。

function addCustomFilterForContact()
{
  Xrm.Page.getControl("parentcontactid").addPreSearch(addLookupFilterForContact);
}

4. 上記関数から呼び出される関数を追加します。

function addLookupFilterForContact(){
  // フィルタに使う取引先企業の情報を取得
  var accountname = Xrm.Page.getAttribute("parentaccountid").getValue()[0].name;
  var accountid = Xrm.Page.getAttribute("parentaccountid").getValue()[0].id;

  // フィルタ条件を作成
  var filter = "<filter type='and'>" +
   "<condition attribute='parentcustomerid' operator='eq' uiname='" +
  accountname + "' uitype='account' value='" + accountid + "'  />" +
  "</filter>";

  // カスタムフィルタの追加
  Xrm.Page.getControl("parentcontactid").addCustomFilter(filter);
}

5. 保存して公開します。

6. 任意の営業案件フォームをフォームエディタで開きます。

7. 取引先企業の OnChange イベントに addLookupFilterForContact を
指定します。

image

8. フォームを保存した後、公開します。

動作確認

1. 任意の営業案件レコードを開きます。

2. 取引先企業を変更します。

image

3. 取引先担当者の結果がフィルターされることを確認します。

image

4. 取引先企業を空欄にして取引先担当者の参照をクリック
すると反応せず、画面遷移時にエラーが出ることを確認
します。これは取引先企業の参照が空欄である場合を考慮
していないからです。

removePreSearch

取引先企業参照がない場合を考慮したスクリプトに改修
します。

1. スクリプト内の addCustomFilterForContact 関数を以下の
ように書き換えます。

function addCustomFilterForContact() {
  // 取引先企業が設定せれていない場合
  if(Xrm.Page.getAttribute("parentaccountid").getValue()==null)
  {
    // 設定済の PreSearch を削除する
    Xrm.Page.getControl("parentcontactid").removePreSearch(addLookupFilterForContact);
  }
  else
  {
    // PreSearch を設定する
    Xrm.Page.getControl("parentcontactid").addPreSearch(addLookupFilterForContact);
  }
}

2. スクリプトを保存後、公開します。

3. 再度検証を行います。

まとめ

addCustomFilter を addPreSearch と組み合わせて使うことで、
フォーム上の値を利用した動的なフィルタを設定することが
可能です。また removePreSearch を活用することでフィルタを
解除できます。是非お試しください。

- 中村 憲一郎