複数のテーブルに関する一般的な問題のトラブルシューティング
この記事は、Microsoft Dynamics 365 Sales の営業案件、見積もり、注文、請求書など、複数のテーブルで発生する一般的な問題のトラブルシューティングと解決に役立ちます。
問題 1 - コンテキスト フォームがフォーム セレクターに表示される
In Context Form は、取引マネージャーのサイド パネルの表示とカスタマイズ、および連絡先、営業案件、潜在顧客、および取引先企業の新しいインターフェイスで使用されます。
原因
これらのテーブルに対して formActivationState を Active に設定するカスタマイズがある場合は、フォーム セレクターのドロップダウンに In Context Form が表示され、ユーザーはこのフォームを選択してレコードの詳細を表示できます。
解決方法
In Context Form の外観が混乱する場合は、次のスクリーンショットに示すように、In Context Form を非アクティブ化できます。
問題 2 - テーブルでの作業中のエラーまたは予期しない動作
現象
テーブル (営業案件、見積もり、注文、請求書、見積もり製品、注文製品など) で作業しているときに、Dynamics 365 for Sales で予期しない動作またはエラーが発生します。 営業案件の作業中に発生する可能性のあるエラーの一部を次に示します。これらは他のテーブルに適用される可能性があります。
- "見積もりを修正した後に拡張金額が間違っています"- このエラーは、カスタム プラグインが原因で発生する可能性があります。
- "営業案件の保存中にエラーが発生しました" - このエラーは、カスタム JavaScript が原因で発生する可能性があります。
- "営業案件のクローズ中にエラーが発生しました" - このエラーは、カスタム ワークフローが原因で発生する可能性があります。
原因
これらの問題は、アプリケーションの不適切なカスタマイズが原因で発生する可能性があります。
解決方法
不適切なカスタマイズを確認し、解決する必要があります。 次の検証方法を実行して、問題の原因となっているカスタマイズを特定し、解決します。
カスタム プラグインを非アクティブ化する
設定>カスタマイズ>システムのカスタマイズに移動します。
Sdk メッセージ処理ステップを選択します。
使用可能な SDK メッセージ処理手順の一覧が表示されます。
Filter アイコンを選択し、[Primary Object Type Code (Sdk Message Filter)]\(Primary オブジェクトの種類コード (Sdk メッセージ フィルター)\) 列を選択し、エラーが発生しているテーブルを選択します。
自分が所有するソリューションから取得した SDK メッセージ処理手順を選択します。
Note
カスタム SDK メッセージ処理手順を表示するには:
Settings>Solutions に移動し、ソリューションを開きます。
[
SDK メッセージ処理ステップ を選択します。 値が選択されていることを確認します。 Component Type to SDK Message Processing Step, and View to All.
無効化を選択します。
カスタマイズを公開します。
問題を確認し、発生しない場合は、カスタム SDK メッセージ処理手順に問題があります。 問題を解決します。
Note
問題が発生した場合は、現在非アクティブ化した SDK メッセージ処理ステップ をアクティブにして、カスタム JavaScript を できないか カスタム ワークフロー プロセス 無効にしてみてください。
カスタム JavaScript を無効にする
エラーが発生しているテーブルのフォーム エディターを開きます。 この例では、営業案件と既定のソリューション フォームとしてテーブルを選択します。
フォーム エディターで Form プロパティ を選択します。
Form プロパティ ダイアログ ボックスが開きます。
[Events タブで、Events ドロップダウン リストからコントロール OnLoad を選択します。
自分が所有するソリューションから取得したカスタム JavaScript ファイルを選択します。
Note
カスタム JavaScript を表示するには:
- Settings>Solutions に移動し、ソリューションを開きます。
- WebResources を選択します。 Component Type WebResources View to All として値が選択されていることを確認します。
- フィルター アイコンを選択して、列のフィルター オプションを有効にします。 Typeを選択し、フィルターを Script (JScript)として設定します。
編集を選択します。 この例では、編集するカスタム JavaScript ファイル eg_opportunity を選択しました。
Enabled オプションをオフにして、OK を選択します。
カスタマイズを公開します。
問題を確認し、発生しない場合は、カスタム JavaScript に問題があります。 問題を解決します。
Note
問題が発生した場合は、無効にした JavaScript を有効にして、カスタム プラグインのアクティブ化を試みるかカスタム ワークフロー プロセスを有効に。
カスタム ワークフロー プロセスを非アクティブ化する
設定>カスタマイズ>システムのカスタマイズに移動します。
プロセスを選択します。 これらのプロセスには、ワークフロー、業務プロセス フロー、ビジネス ルールが含まれます。
使用可能なプロセスの一覧が表示されます。
Filter アイコンを選択し、列 Primary Entity を選択し、エラーが発生しているテーブルを選択します。
自分が所有するソリューションから取得するプロセスを選択します。
Note
カスタム プロセスを表示するには:
- Settings>Solutions に移動し、ソリューションを開きます。
- プロセスを選択します。 Component Type to Processes View to All として値が選択されていることを確認します。
無効化を選択します。
カスタマイズを公開します。
問題を確認し、発生しない場合は、カスタム プロセスに問題があります。 問題を解決します。
Note
問題が発生した場合は、現在非アクティブ化した Processes をアクティブにして、カスタム プラグインの無効化またはカスタム JavaScript の無効化を試。
問題 3 - 共有変数を使用したカスタム プラグインの処理
現象
- 営業案件、見積もり、注文、請求書のテーブルに対する操作を作成および更新すると、親テーブルの更新がトリガーされます。
- 営業案件、見積もり、注文、請求書の各テーブルに関する詳細を取得すると、内部的に Price Calculation サービスがトリガーされ、その後、顧客によって作成されたカスタム プラグインがトリガーされます。
解決方法
カスタム プラグインは、営業案件、見積もり、受注、請求書テーブルの作成、更新、保存操作を実行します。 これらのテーブルに対する作成操作と更新操作によって内部的に Price Calculation サービスがトリガーされ、関連する価格関連のフィールドまたは親テーブルの属性が更新されます。
内部の価格計算サービスを使用する、または独自のカスタム プラグインを使用して営業案件、見積書、注文書、請求書のテーブル、または親営業案件、親見積書、親注文書、親請求書のテーブルの更新を識別や区別することができます。 IPluginExecutionContext
からアクセスできるブール型の共有変数 InternalSystemPriceCalculationEvent
は、プラグインのコード内で利用可能です。 価格計算サービスを使用して処理された作成、更新イベントは、変数 InternalSystemPriceCalculationEvent
の値を true
に設定します。 InternalSystemPriceCalculationEvent
の既定値は false
です。 カスタム プラグイン コードからこの変数にアクセスして、既存のビジネス ロジックのフローを制御できます。
Note
共有変数を使用してカスタム プラグインの操作を実行するには、既成の価格計算サービスが無効になっていることを確認してください。
サンプル コード
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
}
}