Morning Girl

Windows, C#, .NET, Dynamics CRM etc..

【Dynamics 365】【8.2新機能】【Xrm.Page】EditableGridのクライアント拡張を試してみた

以前の記事でEditableGridの基本的な使い方、設定方法を紹介しました。

kageura.hatenadiary.jp

kageura.hatenadiary.jp

標準でも結構便利なEditableGridですが、フォームなどと同様にJavaScriptおよびXrm.Pageオブジェクトをベースとした拡張性がサポートされています。

今回はEditableGridがサポートしている拡張性の全体的な概要と簡単なサンプルスクリプトをお伝えしたいと思います。

サポートされるイベント

サポートされるイベントは以下の通り。OnRecordSelectがEditableGrid固有のイベントですね。

https://technet.microsoft.com/ja-jp/library/mt788311.aspx#BKMK_events

【OnRecordSelect】

EditableGridの状態でレコードが選択された時のイベント

同じレコード内でセルを移動した時、複数レコードを選択した時には発生しないようですので、注意。

今のところあんまり使いみちが思いつかない。

レコード選択した時にユーザーのコンテキストを読み取って制御したり、とか?

【OnChange】

EditableGridでフィールドの値が編集された時のイベント

合計値を計算したり、入力チェックをしたりと、一番使い道があるかなと思います。

【OnSave】

保存処理が走ったときですが、EditableGridの保存イベントは結構多いです。

レコードを移動した時、Enterを押した時、保存ボタン押した時。色々と制約もあるので、使う場合は、ちゃんとTechNetを読んでおいたほうがいいです。

レコードのアクセス方法

ちょっとややこしいのが、レコードの各データに対するアクセス方法。

まず、グリッドで提供されているオブジェクトの階層構造が以下のようになっています。実際のAttributeの値にアクセスするには、6階層アクセスしなければいけません。

・GridControl

・Grid

・GridRow

・GridRowData

・GridEntity

・GridAttribute

・GridCell

なので、営業案件の「トピック(name)」の値を取得しようと単純に記載してしまうと、

Xrm.Page.getControl("crmGrid").getGrid().getRows().

getByIndex(0).getData().getEntity().getAttributes().

getByName(“name”).getValue()

(もしくは「Xrm.Page.getControl("crmGrid").getGrid().getRows().

getByIndex(0).data.entity.attributes.getByName(“name”).getValue()」)

実行コンテキストを使えば、気持ちアクセスが楽ですが

ExecuteContext.getFormContext()

.data.entity.attributes.getByName("name").getValue()

何が面倒って、Formであればサポートされていたショートカット「Xrm.Page.getAttribute」が無いことが一番の難点!

げろろ(゚⊿゚)

とりあえず、もう少しアクセスを手軽にしてほしい次第です。(MSさんショートカットメソッド作って……)

また、どうしてもGetRowsやAttributesがコレクションのため、Indexなどを元に探り当てる必要が出てしまいます。

個人的にも理解するのに時間がかかりましたので、少しイメージと各オブジェクトをまとめてみました。

とりあえず、各データへのアクセスイメージ

f:id:sugimomoto:20161231151357p:plain

そして、それぞれのオブジェクトの役割です。

f:id:sugimomoto:20161231151404p:plain

以下に書いているものをもう少しマトリクス的にまとめました。

https://technet.microsoft.com/ja-jp/library/mt788311.aspx#BKMK_methods

GridRowDataやら、GridEntityやらと書いていますが、基本はXrm.PageのdataやEntityに対応している(これが使えるわけではないですよ)ものだと理解できれば、既存の開発者の方はわかりやすいかなと思います。

サンプルコード

試しに、営業案件で「確率」と「売上見込」が入力されたら、予測を自動入力するスクリプトを書いてみました。

実行コンテキストから対象のレコードを特定し、計算結果を「予測」フィールドに入力しています。

ついでに通知も試してみました。

設定方法

設定場所はEditableGridを設定した画面に追加されたタブ「イベント」から行います。

EditableGridを追加していると、以下のように「イベント」タブが選択できるようになります。

f:id:sugimomoto:20161231151420p:plain

あとは、いつものFormScriptと同じなので割愛します。

Webリソースとして、今回のScriptを登録し、対象フィールドのOnChangeイベントを追加します。

f:id:sugimomoto:20161231151430p:plain

関数と実行コンテキストを登録します。同じように「確率」にもイベントを設定しています。

f:id:sugimomoto:20161231151439p:plain

以上で完了です。

実際にEditableGridを入力してみると、以下のような感じで計算結果が表示されました。

f:id:sugimomoto:20161231151445p:plain

通知部分も以下のような感じで動作します。

f:id:sugimomoto:20161231151453p:plain

所感

EditableGridの登場で明細系レコードの作成機会が増えるかなと思っていますが、その場合このような処理周りを実装することも増えるかと思います。

一番最初のAttributeアクセスを理解するのがちょっと面倒ですが、慣れてしまえば、今までのFormScriptと同様に実装をすすめることが可能かと思います。

ただ、やっぱり手軽に試すためにも、ショートカットメソッドはほしいなぁと思う次第です。