前回の[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メソッドを実装して表示時に処理を行えるようになります。