前回の[DynamicsCRM]IFrame 拡張アプリケーションを作るでは、IFrame拡張アプリケーションで、取引先企業フォームに新しいタブを追加し、所有者情報を表示するにようにしました。所有者情報は、表示するだけでしたが、今回は、フォームの保存ボタンをクリックしたときに、編集した所有者情報も保存できるようにします。
保存ボタンクリック時に、拡張したIFrameアプリケーションのポストバックを発生させるには、クライアントサイドスクリプトの拡張ポイントである、OnSaveメソッド時に拡張したアプリケーションのフォームに対して、submitを呼び出すようにします。
動作環境
- 確認環境:Windows 2003 Server , Dynamics CRM 4.0 IFD 構成
- 開発環境:Visual Studio 2008 Professional
- .NET 3.0
1. フォームにOnSave イベントを実装する
Dynamics CRM にログインし、サイドメニューの設定を選択し、メニュー項目のカスタマイズを選択します。中央に表示される項目の中で、エンティティのカスタマイズを選択し、リストの中から取引先企業をダブルクリックして、エンティティのカスタマイズフォームを表示します。

フォームが表示されるため、右側のコモンタスクの中で、フォームのプロパティを選択します。

フォームのプロパティ画面で、イベントタブのイベントリストの中でOnSaveを選択し、編集ボタンをクリックします。

イベントは有効ですにチェックをし、更新用に保存ボタンが押された場合に、IFramの名前で拡張アプリケーションのフォームを取得し、サブミット処理を実施します。

上手のスクリプトは次のようになっています。
var FORM_CREATE= 1; var FORM_UPDATE = 2; var FORM_READONLY = 3; var FORM_DISABLED = 4; var FORM_QUICKCREATE = 5; var FORM_BULKEDIT = 6; var accountOwnerInfo = document.frames("IFRAME_AccountOwnerInfo"); if(crmForm.FormType == FORM_UPDATE){ if( accountOwnerInfo != null && accountOwnerInfo.document != null && accountOwnerInfo.document.form1 != null){ accountOwnerInfo.document.form1.submit(); } }
OKボタンで変更を確定し、エンティティのカスタマイズフォームに戻り、メニューの操作→公開を選択し、変更を公開します。

以上の処理で更新用に開いた取引先企業のフォームで保存ボタンが押されたときに、IFrame 拡張アプリケーションのポストバック処理が発生するようになります。
2. OwnerInfoExt.aspx.csの修正
前回の[DynamicsCRM]IFrame 拡張アプリケーションを作るの続きで作成したOwnerInfoExt.aspx.csOwnerInfoExt.aspx.cs を修正します。修正箇所はPage_Load イベント処理のみです。
サンプルプログラムでは、ポストバック時に、拡張画面で入力された所有者の氏名を更新しています。
protected void Page_Load(object sender, EventArgs e) { if (IsPostBack) { using (new CrmImpersonator()) { CrmService service = GetCrmServiceFromRegistry(OrgName); ColumnSet accountColumns = new ColumnSet(); accountColumns.AddColumn("ownerid"); account ac = (account)service.Retrieve(EntityName.account.ToString(), new Guid(AccountId), accountColumns); ColumnSetBase systemUserColumn = new AllColumns(); string last = lastname.Value; string first = firstname.Value; systemuser su = new systemuser(); su.systemuserid = new Key(ac.ownerid.Value); su.firstname = first; su.lastname = last; service.Update(su); } } }
3. まとめ
以上で説明は終わりです。
同じようなカスタム処理で新規登録時に何らかの処理をしたり、OnLoadメソッドを実装して表示時に処理を行えるようになります。
いつもこの備忘録を見ています。よく勉強になりました。
誠にありがとうございます。
すこし聞きたいですが、
IFrame 拡張アプリケーションでもしOwnerInfoの更新を失敗すると、どうすればいいですか。
もしご回答いただければ、幸いです。:)