Dynamics CRM 4.0 の関連ビューをエンティティフォームの IFrame に表示する方法を掲載します。今回はサンプルとして、取引先企業のエンティティフォームの詳細メニューにデフォルトで子会社というラベルで表示される関連ビューを 取引先企業エンティティフォームの全般タブび追加したIFrameに表示する方法を掲載します。
本記事の動作確認は Dynamics CRM 4.0 Rollup8 が適用された環境で行っています。
1. フォームのカスタマイズ
最初に取引先企業のエンティティのフォームを変更します。
1.1 フォームへのIFrameの追加
取引先企業のエンティティフォームのカスタマイズ画面からセクションの追加を行います。ここでは名前をセクション名をグループ会社としています。
追加したセクションにIFrame を追加します。URLは /_static/blank.htm 、 セキュリティの クロスフレームスクリプト制限のチェックをオフにします。URLで指定する先はなんでもOKですが、Create時など関連ビューを表示できない場合の指定したURLを指定します。Dynamis に含まれる blank.htm を指定していますが、about:blank などでもOKだと思います。名前は IFRAME_SubAcctsとしています。
IFRAME のプロパティの形式タブを選択して 行レイアウトの行数を12にします。
以上でフォームのカスタマイズは完了です。次は画面表示時に IFRAME の URL を変更するようにスクリプトを編集します。
1.2 スクリプトの変更
フォームのプロパティの変更画面を表示し、OnLoad イベントのスクリプトを次のように編集します。IFRAME(名前:IFRAME_SubAccts)のsrc を 適切な URL に変更します。スクリプトでは、 関連ビューの既存の取引先企業を追加ボタンが押されたときにIFrame のビューがリフレッシュされるように、locAssocOneToMany をオーバーライドしています。locAssocOneToMany メソッド内で、関連がaccount_parent_account の場合にグリッドをリフレッシュさせています。
if(crmForm.ObjectId != null){ // デバッガを起動したい場合は以下のコメントを解除 // debugger; // IFrame に関連ビューのURLをセット var subAcctsPath = 'areas.aspx?oId=' + crmForm.ObjectId + '&oType=' + crmForm.ObjectTypeCode + '&security=' + crmFormSubmit.crmFormSubmitSecurity.value + '&tabSet=areaSubAccts'; crmForm.all.IFRAME_SubAccts.src = subAcctsPath; crmForm.all.IFRAME_SubAccts.onreadystatechange = function(){ if( crmForm.all.IFRAME_SubAccts.readyState != 'complete') return; var _locAssocOneToMany = locAssocOneToMany; locAssocOneToMany = function(iType, sRelationshipName){ // alert(sRelationshipName); _locAssocOneToMany(iType, sRelationshipName); if(sRelationshipName == 'account_parent_account'){ crmForm.all.IFRAME_SubAccts.contentWindow.crmGrid.Refresh(); } } } }
関連ビューのURLがどうなるかですが私は IISのログやFiddler 等でアクセス先のURLを確認しています。
取引先企業を追加ボタンがクリックされたときにIFrameをRefresh させるのに locAssocOneTOMany を書き換える方法は以下のサイトを参考にさせてもらいました。IFrameに関連ビューを表示する方法が洗練されていてとっても素敵です。
CRM 4.0 Show Associated-View in IFRAME (AssocViewer)
http://mscrm4ever.blogspot.com/2009/05/crm-40-show-associated-view-in-iframe.html
2. 動作確認
カスタマイズを公開したら動作確認を行います。
既存お取引先企業を表示すると以下の図のように関連する会社の一覧がIFrameに表示されます。新規作成モードでフォームを開くと空白の画面がIFrameに表示されます。
3. N:N(多対多)関連の場合のスクリプト
多対多関連の場合は例えば次のようにOnLoad時にスクリプトを設定します。多対多関連のビューの場合、URLパラメタにroleOrd というパラメタが必要になります。下のサンプルスクリプトでは、locAssocObje を上書きして、IFrameに表示している関連名が一致している場合に グリッドをリフレッシュするようにしています。例によってURLは IISログで確認したパスを設定しています。
// N:N 多対多関連の場合 if(crmForm.ObjectId != null){ // IFrame に関連ビューのURLをセット // debugger; var subAcctsPath = 'areas.aspx?oId=' + crmForm.ObjectId + '&oType=' + crmForm.ObjectTypeCode + '&security=' + crmFormSubmit.crmFormSubmitSecurity.value + '&tabSet=areanew_new_importdata_new_company&roleOrd=1'; crmForm.all.IFRAME_SubAccts.src = subAcctsPath; crmForm.all.IFRAME_SubAccts.onreadystatechange = function(){ if( crmForm.all.IFRAME_SubAccts.readyState != 'complete') return; var _locAssocObj = locAssocObj; locAssocObj = function(iType , sSubType, sAssociationName, iRoleOrdinal){ _locAssocObj(iType, sSubType, sAssociationName, iRoleOrdinal); if(sAssociationName = 'new_new_importdata_new_company'){ crmForm.all.IFRAME_SubAccts.contentWindow.crmGrid.Refresh(); } } } }
4. まとめ
今回の説明は以上です。誤り指摘点などありましたらご連絡ください。
本サンプルで上書きしているlocAssocOneToManyメソッドはスクリプト内で呼び出されると、取引先企業の追加ボタンをクリック時に表示されるレコードの検索画面(下図参照)を表示できます。例えば、子会社の関連を追加するためにはレコードの検索画面を呼び出すには、locAssocOneToMany("1","account_parent_account") のようにオブジェクトコードと関連名を設定します。