前回の[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の更新を失敗すると、どうすればいいですか。
もしご回答いただければ、幸いです。:)