Dynamics365の営業案件ページに、同じ顧客で今動いている案件が他にあるかすぐ見れるようにしてほしいとの要望を受けて調べた結果以下のやり方で実現しました。
その際の手順をまとめます
目次
やり方
- オープンされている営業案件一覧ビューを確認する
- ビューをサブグリッドとして、営業案件フォームに配置する
- JavaScript(以下JS)を利用して、ビューの検索条件を変更する
ビューのフィルタ作成だけでできれば一番簡単でよかったのですが、
営業案件から、現在開いている営業案件フォームの取引先をフィルタにすることができなかったのでJSを利用しビューのフィルタ条件を変更するようにしました
営業案件フォームのカスタマイズ
営業案件フォームにサブグリットを配置し、ビューを設定する
デフォルトで「オープンされている営業案件」というビューが存在していると思いますので
そちらのビューを利用して設定します
- 詳細設定から、営業案件エンティティを開き、営業案件メインフォームをカスタマイズ画面を開きます
- サブグリッドを選択し、配置したい場所にドラッグ&ドロップします(今回はタイムラインの上にしています)

- テーブルを「営業案件」、既定のビューを「オープンされている営業案件」に設定し、【完了】をクリックします

- ラベルを「その他営業案件」、名前を「subGrid_SalesList」としました
ここでの名前をJS内で利用しますので、名前を違うものに設定シた場合にはJSのコードもあわせて修正してください

- この状態で、フォームを保存→公開します

JSをD365に登録する
以下のスクリプトを用意します
後ほどアップロードできるようにファイルで保存しておきます
function FetchSalesList(executionContext) {
var formContext = executionContext.getFormContext();
var parentaccountid = formContext.getAttribute("parentaccountid").getValue()[0].id;
console.log("fetch parentaccountid: " + parentaccountid);
var fetchXml = '<fetch version="1.0" output-format="xml-platform" mapping="logical" distinct="false">' +
'<entity name="opportunity">' +
'<attribute name="name" />' +
'<attribute name="estimatedvalue" />' +
'<attribute name="estimatedclosedate" />' +
'<attribute name="ownerid" />' +
'<attribute name="parentaccountid" />' +
'<attribute name="opportunityid" />' +
'<order attribute="estimatedvalue" descending="true" />' +
'<order attribute="estimatedclosedate" descending="false" />' +
'<filter type="and">' +
'<condition attribute="statecode" operator="eq" value="0" />' +
'<condition attribute="parentaccountid" operator="eq" value="' + parentaccountid + '" />' +
'</filter>' +
'</entity>' +
'</fetch>';
var subGrid_SalesListControl = formContext.getControl("subGrid_SalesList");
console.log(subGrid_SalesListControl);
if(subGrid_SalesListControl) {
subGrid_SalesListControl.setFilterXml(fetchXml);
subGrid_SalesListControl.refresh();
sleep(5, function() {
var rowCount = subGrid_SalesListControl.getGrid().getTotalRecordCount();
console.log("rowCount: " + rowCount);
});
}else {
setTimeout(FetchSalesList(),2000);
console.log("No GridContorl");
}
}
function sleep(waitSec, callbackFunc) {
var spanedSec = 0;
var waitFunc = function () {
spanedSec++;
if (spanedSec >= waitSec) {
if (callbackFunc) callbackFunc();
return;
}
clearTimeout(id);
id = setTimeout(waitFunc, 1000);
};
var id = setTimeout(waitFunc, 1000);
}
- 「新規」→「その他」→【Webリソース】をクリックします

- 以下のように設定し、【ファイルの選択】をクリックし、事前に作成したJSファイルを選択します
名前 new_fetchsubgridClassicUIAndUCI.js(当時なぜこういうファイル名にしたのかは不明・・・w) 表示名 任意でわかりやすい表示名をいれてください 説明 任意でいれてください 種類 スクリプト(JScript) 言語 日本語 - 【上書き保存】をクリックし、【公開】をクリックします

フォームロード時にJSが動作するよう設定する
- 「詳細設定」→「カスタマイズ」→「システムのカスタマイズ」を開きます


- 営業案件エンティティの営業案件メインフォームを開きます(クラッシクビューで開いて下さい)

- 【フォームのプロパティ】をクリックします

- イベントタブの、フォームライブラリ→【追加】をクリックします

- 追加JSファイルを検索し、【追加】をクリックします

- イベントハンドラー欄で、コントロール「フォーム」、イベント「OnLoad」を選択し、追加アイコンをクリックします

- ライブラリから追加JSファイルを選択し、関数に定義した関数名を入力します
パラメータの「実行コンテキストを最初のパラメータとして渡す」にチェックをつけ【OK】をクリックします

- フォームを保存し、公開をクリックします

動作を確認する
オープンしてる営業案件が複数ある顧客の営業案件を開きます
タイムラインの上に、その顧客の他のオープン状態の営業案件一覧が表示されることを確認します
JSの動作が完了するまですこし時間がかかるので、一瞬何十件か見えますが、フィルタが適用されると表示が切り替わります。
![]()
以上です
