Microsoft Dynamics 365 フォームのコードを記述する

 

公開日: 2017年1月

対象: Dynamics 365 (online)、Dynamics 365 (on-premises)、Dynamics CRM 2016、Dynamics CRM Online

フォーム プログラミングでは、フォームで発生するイベントに対して実行される JavaScript を使用することにより、エンティティ フォームと対話する方法を提供できます。

このトピックの内容

フォーム プログラミングの用途

フォーム プログラミングを使用するときの考慮事項

ライブラリの依存関係

優れたフォーム スクリプトを記述する

異なるフォームの表示

開発ツール

フォーム プログラミングの用途

Microsoft Dynamics 365 には、ビジネス プロセスを制御するためのオプションが数多く用意されています。 フォーム プログラミングもその 1 つです。 しかし業務ルールという別のオプションがあることに注意してください。 ビジネス ルールは JavaScript を知らない、開発者ではないユーザー向けにフォームでのビジネス プロセスのロジックを適用する手段を提供します。 詳細については、カスタマイズ ガイドトピックの 「TechNet: 業務ルールの作成および編集」を参照してください。

フォームのプログラムおよびビジネス ルールの主な利点は、即時性にあります。 データをサーバーに送信する必要がないので、多くのシナリオで最良のパフォーマンスを発揮します。 これらはユーザーとの対話を想定しているので、最も柔軟なオプションでもあります。

開発者以外のユーザーによって作成され管理できるという点がビジネス ルールの利点ですが、特定の制限があり、フォーム スクリプトの代わりとなることを想定したものではありません。 フォーム プログラミングを使用すると、ビジネス ルールではできないことを達成できます。

フォーム プログラミングを使用して頻繁に実行されるタスクには次のものがあります。

  • データ検証: 可能な限り、データの編集時にデータの有効性を検証することが大切です。 Form フィールドの定義では、最も一般的なデータ検証が実行されます。 たとえば、電子メール アドレス用に書式化された Single Line of Text フィールドの場合、そこに無効な値を入力することはできません。

    フォーム プログラミングを使用すると、組織に固有のデータ検証を追加できます。 たとえば、サービス活動において電話番号の書式設定や Subject フィールドの最小長に関する固有のルールを定めている組織もあるでしょう。

  • 自動化: フォーム スクリプトを使用して一般的なタスクを自動化すると、生産性を大きく向上させることができます。 フォームに入力されるデータに依存するフィールド値を設定できるので、それによってユーザーのデータ入力時間を大幅に短縮できます。 自動化のためにフォーム プログラミングを使用するのは有益です。なぜなら、ある特定のケースで標準のプロセスが有効であるかどうかをユーザーが検証できるからです。 ユーザーはレコードを保存する前に必要な調整を行えます。

  • プロセスの強化と実施: フォームに表示するデータやフォームのレイアウトをカスタマイズして、組織で実行される特定のタスクに合わせて最適化することができます。 フォーム プログラミングを使用すると、個別のフォーム要素を表示したり非表示にしたり、特定のエンティティに対して定義されている複数のフォームを開いたりすることができます。 フォーム内または関連レコード内のデータに基づいて、必須となるフィールドを制御できます。

    Microsoft Dynamics CRM 2015 および Microsoft Dynamics CRM Online 2015 更新プログラム では、コードを記述して、フォームの上部に表示される業務プロセス フローを管理できます。詳細:業務プロセス フローのスクリプトを作成する.

フォーム プログラミングを使用するときの考慮事項

フォーム プログラミングで適用されたロジックは、Microsoft Dynamics 365 アプリケーション エンティティ フォーム内で対話するユーザーのブラウザーでのみ実行できます。 したがって、使用するデータに関連するプロセスを開始したり実施したりするためにフォーム プログラミングだけに頼ることは避けてください。 レコードの作成や更新は、Web サービス API によって、またはフォームのコンテキスト外のワークフローによって直接行えます。 フォーム プログラミングでは、プラグンとプロセスを使用することで適用されるビジネス ロジックを補完して、どのようなやり方で作成または更新されたレコードでも同じプロセスに適合するようにします。

業務ルールはエンティティ スコープで実行するように定義され、アクションがどこで開始されたかにかかわりなく、同じロジックがサーバーに適用されます。詳細:TechNet: 業務ルールの作成および編集

フォーム プログラミングでは、フォームのフィールドを非表示にすることで、一部のエンティティ データをユーザーが表示または更新できないようにすることはできます。しかし、フォーム プログラミングは、セキュリティ要件を強制的に適用するための完全なソリューションを提供するわけではありません。 フォーム上では見えないエンティティ データでも、[高度な検索] などの種々の方法を使用してそれらのデータを見ることができます。詳細:Microsoft Dynamics 365 のセキュリティ モデル

ライブラリの依存関係

パフォーマンスの最適化のゆえに、Microsoft Dynamics 365 フォームは JavaScript Web リソースを非同期的に並列に読み込みます。 このことは、1 つのライブラリが完全にダウンロードされ初期化された後に、別のライブラリがそのライブラリで定義されるオブジェクトの 1 つを使用するということが、ライブラリがフォームに対して構成される順序によって決定されないことを意味しています。

他のライブラリに依存するコードを完全にダウンロードして初期化する場合、もっとも簡単な方法は、単一の JavaScript Web リソース内の両方のライブラリと自分のコードをライブラリ コードの下のところで結合することです。 より高度な方法は、head.js または require.js などのライブラリを使用して、別々になっているライブラリの読み込みの方法を制御することです。

優れたフォーム スクリプトを記述する

フォームのスクリプトを作成する際には、パフォーマンスが最大になるよう、次のように使用します。

  • 不要な JavaScript Web リソース ライブラリの組み込みの回避
    フォームにより多くのスクリプトを追加すると、それらをダウンロードする時間が余計にかかります。 通常、スクリプトは最初に読み込まれた後、ブラウザーにキャッシュされますが、フォームを最初に表示するときのパフォーマンスがきわめて強い印象を与えます。

    特定の場合では、XMLHttpRequests を使用するので、フォームのスクリプトに jQuery を含めないでください。 jQuery には、これらの要求の実行する際に多くのユーザーが使い慣れている、$.ajax 関数がありますが、開発者の好みの問題であるため必須ではありません。Microsoft Dynamics 365 でサポートされるすべてのブラウザーにあるネイティブの XMLHttpRequest オブジェクトを使用してこれらの要求を実行できます。詳細:jQuery の使用

  • Onload イベントでのすべてのスクリプトの読み込みの回避
    フィールドの OnChange イベント、または OnSave イベントのみをサポートするコードがある場合は、OnLoad イベントの代わりに、これらのイベントのイベント ハンドラーを使用して、スクリプト ライブラリを設定するようにしてください。 このように、フォームを読み込むとき、これらのライブラリの読み込みを延期することができるし、パフォーマンスを向上させることもあります。

    OnLoad イベント ハンドラー内の addOnChange メソッドを単に便利なためという理由で使用することはお勧めしません。 これにより、イベント ハンドラーの追加に必要な手順の数を減らすことができますが、フォームの読み込みがゆっくりになります。

  • 折りたたまれたタブを使用して Web リソースの読み込みを延期
    Web リソースと IFRAME が折りたたみまれたタブ内のセクションに含まれているとき、タブが折りたたまれている場合、Web リソースと IFRAME は読み込まれません。 Web リソースと IFRAME は、タブが展開されているときに読み込まれます。 タブの状態が変化すると、TabStateChange イベントが発生します。 折りたたまれたタブ内で Web リソースまたは IFRAME をサポートするのに必要なすべてのコードが、TabStateChange イベントのイベント ハンドラーを使用することができ、別の方法だと OnLoad イベントで必要となる可能性のあるコードを減らすことができます。

  • 既定の表示オプションの設定
    フォーム要素を非表示にする、OnLoad イベントのフォーム スクリプトの使用を避けてください。 代わりに、表示されていない場合もあるフォーム要素の既定の表示オプションを設定して、フォーム読み込み時に既定で表示されないようにします。 次に、OnLoad イベントのスクリプトを使用して、表示対象のフォーム要素を表示させます。

異なるフォームの表示

フォームを表示するさまざまな方法があります。 表示方法により、それぞれで使用可能なイベントまたはコードの種類が変わります。

レガシ フォームのレンダリング

Microsoft Dynamics CRM Online 2015 更新プログラム 1 および Dynamics 365 (設置型) では、[レガシ フォーム レンダリングを使用する] という新しいシステム設定が導入されました。 これらのリリースでは、フォームのレンダリングが改善され、ページの内部構造が変更されています。 これにより、サポートされていないメソッドを使用していたフォーム スクリプトは、以前のリリースで使用可能であった DOM の要素にアクセスすることはできません。 これらのリリースにアップグレード後に新しいエラーが発生した場合は、この設定を適用して、エラーが解決するかどうかを確認できます。 その場合は、これらのエラーを引き起こしているスクリプトがサポートされていないメソッドを使用しているということが十分ありえます。

[レガシ フォームのレンダリングを使用する] を設定して、これらの問題に対処する時間をとることができます。ただし、新しいフォーム レンダリングのインフラストラクチャが提供するパフォーマンスの向上を体験しません。

注意

[レガシ フォームのレンダリングを使用する] の設定は、次のメジャー リリースから削除されます。 そのとき、すべてのフォーム スクリプトは、新しいフォーム レンダリングで機能する必要があります。

更新されたエンティティ

すべてのユーザー定義エンティティおよび特定のシステム エンティティに、コマンド バーおよび新しいフォーム API の使用を含む新しくなったユーザー インターフェイスがあります。 更新したシステム エンティティを次の表に示します。

取引先企業

予定

キャンペーン

キャンペーン活動

キャンペーンの​​反応

サポート案件​​

競合企業

取引先担当者

契約

契約品目 (ContractDetail)

電子メールの送信

権利

権利テンプレート

FAX

請求書

請求書の製品 (InvoiceDetail) *

リード​​

レター

マーケティング リスト

営業案件​​

提案製品

受注

受注製品 (SalesOrderDetail) *

電話

ポジション

価格表品目

製品

製品の関連付け

製品の関連付け (ProductSubstitute)

キュー

簡易キャンペーン (一括操作)

見積もり

見積もり製品 (QuoteDetail) *

定期的な予定 (RecurringAppointmentMaster)

営業資料

SLA

SLA KPI インスタンス

ソーシャル活動

ソーシャル プロファイル

タスク

チーム

ユーザー

* これらのエンティティは CRM Online 2016 更新プログラム 1 および Dynamics 365 Service Pack 1 (設置型) で更新されました。

注意

更新エンティティの一部には複合エンティティの属性が含まれます。 以下に示す特別な考慮事項があります。詳細:複合の属性のスクリプトを記述する.

更新されたエンティティ フォームには、メモ、アクティビティ、および投稿がエンティティに対して有効になっていれば、それらへのアクセスを可能にするコラボレーション コントロールを含めることができます。 Xrm.Page オブジェクトはコラボレーション コントロールへはアクセスできません。 スクリプトを使用してコラボレーション コントロールを表示または非表示にする場合、コラボレーション コントロールが含まれているセクション要素にアクセスできます。

フォーム プログラミング メソッドと更新されたエンティティのための PreSearch イベント

次の表に、更新エンティティのみで使用できるフォームのプログラミング メソッドを示します。

方法

説明

Xrm.Page.context.クライアント.getClient

どのクライアントでスクリプトを実行するかを示す値を返します。

Xrm.Page.context.クライアント.getClientState

クライアントの状態を示す値を返します。

Xrm.Page.context.getUserName

現在のユーザー名を返します。

Xrm.Page.data.entity.getPrimaryAttributeValue

エンティティのプライマリ属性値の文字列を取得します。

Xrm.Page.data.refresh

ページを再読み込みせずに、非同期でフォームのデータを更新します。

Xrm.Page.data.上書き保存​​

レコードを非同期で、保存操作の完了後にコールバック関数を実行するようにオプションが設定された状態で保存します。

Xrm.Page.data.entity attribute.getIsPartyList

検索属性が関係者リスト検索を表すかどうかを指定します。

Xrm.Page.ui control.clearNotification

コントロールで既に表示されているメッセージを削除します。

Xrm.Page.ui control.setNotification

コントロール付近に、データが無効であることを示すメッセージを表示します。

Xrm.Page.ui.clearFormNotification

このメソッドを使用して、フォーム レベル通知を削除します。

Xrm.Page.ui.setFormNotification

このメソッドを使用して、フォーム レベル通知を表示します。

Xrm.Page.ui control.addCustomFilter

検索に表示される結果に、フィルターを追加するには fetchXml を使用します。 各フィルターは "AND" 条件として、前に追加したフィルターと結合します。

Xrm.Page.ui control.setShowTime

日付コントロールで日付の時間の部分を表示するかどうかを指定します。

Xrm.Utility.alertDialog

コールバック関数のノンブロッキングの警告ダイアログが表示されます。

Xrm.Utility.confirmDialog

ノンブロッキングを確認するダイアログが、ユーザーがクリックしたボタンによって異なるコールバックで表示されます。

PreSearch イベント

検索の値を設定する際、検索ダイアログ ボックスが開く直前に、新しい PreSearch イベント が発生します。 このイベントには、アプリケーションにイベント ハンドラーを設定するユーザー インターフェイスがなく、それは Xrm.Page.ui control.addPreSearch メソッドを使用してのみ設定できます。 このイベントは、addCustomFilteraddCustomView、および setDefaultView メソッドと共に使用して、ユーザーがレコードを検索して、それを検索フィールドの値として設定するときに開くビューを制御します。

従来のフォームを使用したエンティティ

更新されなかったシステム エンティティでは、従来のフォームの表示が使用されます。 CRM 2011 で更新した場合、これらのエンティティのフォームは引き続きリボンを使用し、このリリースで追加されたフォーム API にはアクセスできません。 次の表に、これらのエンティティの一覧を示します。

住所

記事

記事のコメント

一括削除操作

部署

つながり

値引き

値引き表

ドキュメントの場所

電子メールの添付ファイル

フォロー

目標

目標の指標

インポート ソース ファイル

請求書の製品

受注製品

価格表

キュー アイテム

見積もり製品

ロールアップ フィールド

ロールアップ クエリ

保存されているビュー

サービス

サービス活動

SharePoint サイト

サービス拠点

担当地域

出荷単位

出荷単位一覧

タブレット PC 用 Dynamics 365 に有効なエンティティ

選択されたシステムのエンティティおよびユーザー定義エンティティだけが利用可能で、タブレット PC 用 Microsoft Dynamics 365を使用して表示されます。 次のシステム エンティティは タブレット PC 用 Dynamics 365 に編集可能フォームがあります。

取引先企業

活動

予定​​

サポート案件​​

競合企業

つながり

取引先担当者

潜在顧客​​

メモ

営業案件

提案製品

電話​​

キュー アイテム

ソーシャル活動

ソーシャル プロファイル

タスク​​

タブレット PC 用 Dynamics 365 には Web アプリケーションと同じ動作がないので、一部の API は使用できません。 たとえば、タブレット PC 用 Dynamics 365 タブでは展開または折りたたみできません。したがって、タブ TabStateChange イベント は発生せず、Xrm.Page.ui tab. setDisplayState を使用してタブを展開したり折りたたむことはできません。詳細:電話用およびタブレット PC 用 Dynamics 365 のスクリプトの記述とデバッグ

開発ツール

すぐれたツールを使用するとき、Dynamics 365 フォームの JavaScript を記述するエクスペリエンスはより向上します。

すぐれた作成ツールの使用

JavaScript はインタープリター型言語なので、特別な開発ツールは必要ありません。JavaScript は単なるテキストなので、アプリケーションまたはメモ帳などのテキスト エディターで編集することができます。 ただし、JavaScript ファイルの編集をサポートする機能を備えた、Microsoft Visual Studio や Microsoft Visual Studio Express などの作成ツールを使用すれば、生産性を大幅に高めることができます。Visual Studio Community 2013 は無料で取得できます。

ブラウザー開発ツールの使用

すべての最新のブラウザーには、スクリプトのデバッグを有効にする組み込みツールが用意されています。 これらのツールは、Dynamics 365 フォームのスクリプトを記述する場合に非常に役に立ちます。 これらの開発ツールは F12 と呼ばれることがよくあります。それは、開発ツールを開くのにこのキーが使用されることに起因します。 これらのツールの使用に関する情報については、W3Schools の Javascript デバッグ を参照してください。

スクリプトの Web リソースとしてアップロードするスクリプトの構文を検証するには、開発者用ツールを使用します。 これらのツールを使用すると、プログラミングの対象のオブジェクト モデルをもっとよく理解することもできます。 たとえば、フォーム内の特定のオブジェクトにアクセスするためのコードを記述するとき、それらのオブジェクトに名前でアクセスする必要がよくあります。 フォーム エディターでオブジェクトの名前を検索するよりも、開発者ツールのコンソールを使用して、Xrm.Page オブジェクト モデルに照会して、アクセスの対象となる属性またはコントロールの名前を取得します。 たとえば、特定のサブグリッド コントロールに名前でアクセスする場合は、ブラウザーの開発者ツールのコンソールを使用して、以下のコードを記述できます。

Xrm.Page.ui.controls.get(
function(ctrl,i){
 if(ctrl.getControlType() == "subgrid")
  console.log(ctrl.getName()
  );
});

すべてのサブグリッド コントロールの名前が、コンソールの出力ウィンドウに出力されます。 このスクリプトは、コレクション内の get メソッドと、オブジェクト上にあるその他のメソッドに匿名の代理人関数を渡して、種類でフィルタリングをして、この例で使用されている Xrm.Page.ui control.getControlType および Xrm.Page.ui control.getName などのオブジェクト名を返します。

重要

Dynamics 365フォームは、複数のフレームで構成されます。 コンソールでコードを動作させるためには、正しいフレームを選択する必要があります。Dynamics 365 Web クライアント フォームの場合は、ClientApiWrapper.aspx という名前のフレームを選択してください。 新しい対話型サービス ハブ クライアント フォームの場合は、engagementhub.aspx という名前のフレームを選択します。

その他の例を示します。

  • フォーム内のすべての属性の名前をそれらの種類付きで表示

    Xrm.Page.getAttribute(
    function (att, i) {
     console.log(att.getName() + " : " + att.getAttributeType())
    });
    
  • optionset 属性の有効なオプション値を表示

    Xrm.Page.getAttribute(
    function (att, i) {
     if (att.getAttributeType() == "optionset") {
      console.log(att.getName())
      var options = att.getOptions();
      var optionsLength = options.length;
      for (var i = 0; i < optionsLength; i++) {
       var option = options[i];
       console.log("   value: " + option.value + " Label: " + option.text)
      }
     }
    });
    

関連項目

クライアントの Microsoft Dynamics 365 の拡張
URL を使用してフォーム、ビュー、ダイアログ、およびレポートを開く
フォーム スクリプトの簡易参照
Microsoft Dynamics 365 での JavaScript の使用
Microsoft Dynamics 365 用 JavaScript ライブラリの使用
Microsoft Dynamics 365 アプリケーションをカスタマイズする
フォームおよびフィールド イベントの使用
Xrm.Page オブジェクト モデルの使用
電話用およびタブレット PC 用 Dynamics 365 のスクリプトの記述とデバッグ
複合の属性のスクリプトを記述する
業務プロセス フローのスクリプトを作成する
サブグリッドに対するスクリプトの作成
実行コンテキストとフォーム イベント パイプラインの使用
フォーム上で IFRAME および Web リソース コントロールを使用する
Microsoft Dynamics 365 Web API に関する入門情報 (クライアント側 JavaScript)

Microsoft Dynamics 365

© 2017 Microsoft. All rights reserved. 著作権