複数のテーブルに関する一般的な問題のトラブルシューティング
この記事では、Microsoft Dynamics 365 Salesの営業案件、見積もり、注文、請求書など、複数のテーブルで発生する一般的な問題のトラブルシューティングと解決に役立ちます。
問題 1 - コンテキスト フォームがフォーム セレクターに表示される
[コンテキスト内] フォームは、取引マネージャーのサイド パネルの表示とカスタマイズ、および連絡先、営業案件、潜在顧客、およびアカウントの新しいインターフェイスで使用されます。
原因
環境にこれらのテーブルの formActivationState を Active に設定するカスタマイズがある場合は、フォーム セレクターのドロップダウンに [コンテキスト内フォーム] が表示され、ユーザーはこのフォームを選択してレコードの詳細を表示できます。
解決方法
コンテキスト内フォームの外観が混乱する場合は、次のスクリーンショットに示すように、コンテキスト内フォームを非アクティブ化できます。
問題 2 - テーブルでの作業中のエラーまたは予期しない動作
現象
テーブル (営業案件、見積もり、注文、請求書、見積もり製品、注文製品など) で作業している間、Sales のDynamics 365で予期しない動作やエラーが発生します。 次に示すエラーの一部は、営業案件の作業中に発生する可能性があり、他のテーブルに適用される可能性があります。
- "見積もりを変更した後に延長金額が間違っています"-このエラーは、カスタム プラグインが原因で発生する可能性があります。
- "営業案件の保存中にエラーが発生しました" - このエラーは、カスタム JavaScript が原因で発生する可能性があります。
- "営業案件のクローズ中にエラー" - このエラーは、カスタム ワークフローが原因で発生する可能性があります。
原因
これらの問題は、アプリケーションの不適切なカスタマイズが原因で発生する可能性があります。
解決方法
不適切なカスタマイズを確認し、解決する必要があります。 次の検証方法を実行して、問題の原因となっているカスタマイズを特定し、解決します。
カスタム プラグインを非アクティブ化する
[設定のカスタマイズ][システムの>カスタマイズ] > の順に移動します。
[ Sdk メッセージ処理ステップ] を選択します。
使用可能な SDK メッセージ処理手順の一覧が表示されます。
[ フィルター ] アイコンを選択し、[ プライマリ オブジェクトの種類コード (Sdk メッセージ フィルター)] 列を選択し、エラーが発生しているテーブルを選択します。
自分が所有するソリューションから取得する SDK メッセージ処理手順を選択します。
注:
カスタム SDK メッセージ処理手順を表示するには:
[設定] [ソリューション] > の順に移動し、ソリューションを開きます。
[ SDK メッセージ処理ステップ] を選択します。 [ コンポーネントの種類 ] から [SDK メッセージ処理ステップ] 、および [ すべて表示] の値が選択されていることを確認 します。
[ 非アクティブ化] を選択します。
カスタマイズを発行します。
問題を確認し、問題が発生しない場合は、カスタム SDK メッセージ処理手順に関する問題です。 問題を解決します。
注:
問題が発生した場合は、現在非アクティブ化した SDK メッセージ処理手順 をアクティブ化し、 カスタム JavaScript を無効 にするか、 カスタム ワークフロー プロセスを非アクティブ化します。
カスタム JavaScript を無効にする
エラーが発生しているテーブルのフォーム エディターを開きます。 この例では、テーブルを営業案件と既定のソリューション フォームとして選択しています。
フォーム エディターで [ フォームのプロパティ ] を選択します。
[ フォームのプロパティ ] ダイアログ ボックスが開きます。
[イベント] タブで、[イベント] ドロップダウン リストから [OnLoad] コントロールを選択します。
自分が所有するソリューションから取得するカスタム JavaScript ファイルを選択します。
注:
カスタム JavaScript を表示するには:
- [設定] [ソリューション] > の順に移動し、ソリューションを開きます。
- [ WebResources] を選択します。 [ コンポーネントの種類 ] から [WebResources ] と [ すべて表示] として値が選択されていることを確認 します。
- [ フィルター ] アイコンを選択して、列のフィルター オプションを有効にします。 [ 種類] を 選択し、フィルターを [スクリプト (JScript)] に設定します。
[編集] を選択します。 この例では、編集するカスタム JavaScript ファイル eg_opportunity を選択しました。
[有効] オプションをオフにし、[OK] を選択します。
カスタマイズを発行します。
問題を確認し、問題が発生しない場合は、カスタム JavaScript に問題があります。 問題を解決します。
注:
問題が発生した場合は、無効にした JavaScript を有効にして、 カスタム プラグインの非アクティブ化 または カスタム ワークフロー プロセスの非アクティブ化を試みます。
カスタム ワークフロー プロセスを非アクティブ化する
[設定のカスタマイズ][システムの>カスタマイズ] > の順に移動します。
[ プロセス] を選択します。 これらのプロセスには、ワークフロー、ビジネス プロセス フロー、ビジネス ルールが含まれます。
使用可能なプロセスの一覧が表示されます。
[ フィルター ] アイコンを選択し、 列 [プライマリ エンティティ] を選択し、エラーが発生しているテーブルを選択します。
自分が所有するソリューションから取得するプロセスを選択します。
注:
カスタム プロセスを表示するには:
- [設定] [ソリューション] > の順に移動し、ソリューションを開きます。
- [ プロセス] を選択します。 [ コンポーネントの種類 ] から [ プロセス ] と [ すべて表示] として値が選択されていることを確認 します。
[ 非アクティブ化] を選択します。
カスタマイズを発行します。
問題を確認し、問題が発生しない場合、問題はカスタム プロセスにあります。 問題を解決します。
注:
問題が発生した場合は、現在非アクティブ化した プロセス をアクティブ化し、 カスタム プラグインの非アクティブ化 または カスタム JavaScript の無効化を試みます。
問題 3 - 共有変数を使用したカスタム プラグイン処理
現象
- 営業案件、見積もり、注文、請求書の各テーブルに対する操作を作成および更新すると、親テーブルの更新がトリガーされます。
- 営業案件、見積もり、注文、請求書の各テーブルに関する詳細を取得すると、内部的に Price Calculation サービスがトリガーされ、その後、顧客によって作成されたカスタム プラグインがトリガーされます。
解決方法
カスタム プラグインは、営業案件、見積もり、注文、請求書の各テーブルに対して作成、更新、保存操作を実行します。 これらのテーブルに対する作成および更新操作は、内部的に Price Calculation サービスをトリガーし、関連付けられている価格関連のフィールドまたは親テーブルの属性を更新します。
内部価格計算サービスを使用するか、独自のカスタム プラグインを使用して、営業案件、見積もり、注文、または請求書のテーブルまたは親の営業案件、見積もり、注文、請求書の各テーブルの更新を識別または区別できます。 を介してIPluginExecutionContext
アクセスできるブール型の共有変数InternalSystemPriceCalculationEvent
は、プラグイン コード内で使用できます。 Price Calculation サービスを使用して処理された作成または更新イベントは、変数 InternalSystemPriceCalculationEvent
の値を に true
設定します。 の既定値 InternalSystemPriceCalculationEvent
は です false
。 カスタム プラグイン コードからこの変数にアクセスして、既存のビジネス ロジックのフローを制御できます。
注:
共有変数を使用してカスタム プラグイン操作を実行するには、すぐに使用できる Price Calculation サービスが無効になっていることを確認します。
サンプル コード
public void Execute(IServiceProvider serviceProvider)
{
// Obtain the tracing service
ITracingService tracingService = (ITracingService)serviceProvider.GetService(typeof(ITracingService));
// Obtain the execution context from the service provider.
IPluginExecutionContext executionContext = (IPluginExecutionContext)
serviceProvider.GetService(typeof(IPluginExecutionContext))
bool isInternalSystemPriceCalculationEvent = false;
//Check existence of shared variable and fetch the value from executionContext
if (executionContext.ParentContext != null && executionContext.ParentContext.SharedVariables.ContainsKey("InternalSystemPriceCalculationEvent"))
{
isInternalSystemPriceCalculationEvent = (bool)executionContext.ParentContext.SharedVariables["InternalSystemPriceCalculationEvent"];
}
if (isInternalSystemPriceCalculationEvent)
{
//TO DO - Add or skip custom business logic
}
}