Dynamics CRM 2011 のエンティティのフォーム画面で入力や変更を行ったあとブラウザの×ボタンやジュエル(ファイル)メニューの閉じるボタンクリックによって画面を閉じようとすると次の警告画面が表示されます。下図はブラウザのXボタンをクリックして画面を閉じようとした場合の警告メッセージ。IEのバージョンによって表示内容は変わります。

下図はジュエルの閉じるメニューをクリックしたときに表示される警告画面です。

今回は、上記の警告画面が表示されないようにする方法を紹介します。動作確認は次の環境で行っています。

  • Dynamics CRM 2011 Online
  • 確認したIEのバージョンは IE8, IE9

今回紹介するスクリプトをそのまま実行するとフィールドの値が入力した値で設定できなくなるはずです(未検証です)。スクリプトの内容と副作用を理解して使ってください。今回のスクリプトのヒント(てかほぼそのまんまですが)となったMSDNフォーラムのスレッドのURLを掲載しておきます。

How to avoid dialog displayed when Xrm.Page.ui.close() is called?
http://social.microsoft.com/Forums/en-US/crmdevelopment/thread/e9527a7a-5924-401d-8030-e20fb6fb9301/

1.サンプルスクリプト

次のJavascriptのWebリソースを作成して取引先企業などのフォームのOnLoadイベントで呼ばれるようにします。何をしているかというと、サブミットモードを never にして変更内容をサーバーに送られないようにしているだけです。サンプルスクリプトではおまけでコメントにDynamics CRM 4.0 で同様のことをするメソッドを記載しています。

function suppressCloseAlert(){
  // crmForm.detachCloseAlert();
  Xrm.Page.data.entity.attributes.forEach(function (attribute, index) {
    attribute.setSubmitMode("never");
  });
}

上記スクリプトをOnLoad等で実行することでフィールド値を変更して保存せずにフォームを閉じようとした場合に警告が表示されるされなくなります。

2.まとめ

説明は以上です。指摘点などがあればご連絡ください。また、スクリプトの副作用を十分に理解して使ってください。

本来警告メッセージは保存忘れのための重要な機能です。じゃぁなんで警告画面を抑制する方法を調べてんだよって思われるのではないでしょうか。用途を紹介してみます。多システムにパラメタを渡すための入力用の箱として意味のない空のエンティティのフォームを使用し、リボンなどに配置したボタンクリックなどをトリガーとして連携した後画面を閉じるといったシナリオで使用します。このとき、閉じるボタンやXボタンで警告画面が表示されるという問題がありました。正直、外法な使い方するなぁと思い対処方法なんてあるんだろうかと調べてみたら、まさかの解決方法があったので検証と紹介をしてみました。