排查多个表的常见问题

本文可帮助你排查和解决多个表中的常见问题,例如Microsoft Dynamics 365 Sales 中的商机、报价、订单或发票。

问题 1 - 在上下文窗体中,可能出现在窗体选择器中

In Context Form 用于在交易经理中显示和自定义侧面板,以及联系人、机会、潜在顾客和帐户的新界面。

原因

如果环境具有将 formActivationState 设置为 Active 的任何自定义项,则“上下文窗体将显示在窗体选择器下拉列表中,允许用户选择此窗体以查看记录详细信息。

显示“上下文窗体”选项的窗体选择器下拉列表。

解决方法

如果上下文窗体的外观导致混淆,则可以停用上下文窗体,如以下屏幕截图所示。

在上下文窗体中,具有停用选项。

问题 2 - 处理表时出现错误或意外行为

现象

处理表(如商机、报价、订单、发票、报价产品和订单产品),但在 Dynamics 365 for Sales 中观察到意外行为或错误。 以下是在处理机会时可能会遇到的一些错误,它们可能适用于其他表:

  • “修改报价后扩展金额错误”- 此错误可能是由于自定义插件导致的。
  • “保存机会时出错”- 此错误可能是由于自定义 JavaScript 导致的。
  • “关闭机会时出错”- 此错误可能是由于自定义工作流导致的。

原因

由于应用程序自定义不当,可能会出现这些问题。

解决方法

必须验证不正确的自定义项并解决它们。 执行以下验证方法以识别导致问题的自定义项,然后解决:

停用自定义插件

  1. 转到设置>自定义>自定义系统

  2. 选择 Sdk 消息处理步骤

    将显示可用 SDK 消息处理步骤的列表。

  3. 选择“筛选器”图标,选择列“主对象类型代码”(Sdk 消息筛选器),然后选择发生错误的表。

    转到自定义插件列表,选择发生错误的表。

  4. 选择来自你拥有的解决方案的 SDK 消息处理步骤。

    注意

    若要查看自定义 SDK 消息处理步骤,请执行以下操作:

    1. 转到“设置解决方案>,然后打开解决方案。

    2. 选择 SDK 消息处理步骤。 验证是否已按如下所示选择这些值:“组件类型SDK 消息处理步骤”,并查看所有值。

  5. 选择停用

  6. 发布自定义项。

    选择并停用非托管自定义插件。

  7. 验证问题,如果问题未发生,则问题与自定义 SDK 消息处理步骤有关。 解决此问题。

注意

如果出现问题,请激活你立即停用的 SDK 消息处理步骤 ,并尝试 禁用自定义 JavaScript停用自定义工作流进程

禁用自定义 JavaScript

  1. 打开发生错误的表的窗体编辑器。 在此示例中,我们将选择表作为“机会”和默认解决方案窗体。

    打开窗体编辑器。

  2. 窗体编辑器中选择“窗体属性 ”。

    在窗体编辑器中选择“窗体属性”。

    此时将打开“ 窗体属性 ”对话框。

  3. “事件”选项卡上,从“事件”下拉列表中选择“OnLoad”控件

    从“事件”下拉列表中选择控件 OnLoad。

  4. 选择来自你拥有的解决方案的自定义 JavaScript 文件。

    注意

    查看自定义 JavaScript:

    1. 转到“设置解决方案>,然后打开解决方案。
    2. 选择 WebResources。 验证是否已选择值:“组件类型WebResources”和查看所有视图”。
    3. 选择“筛选器图标可启用列的筛选器选项。 选择“类型”并将筛选器设置为“脚本”(JScript)。

    选择“类型”并将筛选器设置为“脚本”(JScript)。

  5. 选择“编辑” 。 在此示例中,我们已选择要编辑的自定义 JavaScript 文件 eg_opportunity

    处理程序属性对话框中的输入详细信息。

  6. 清除“启用”选项,然后选择“确定”。

    清除“处理程序属性”对话框中的“已启用”选项。

  7. 发布自定义项。

  8. 验证问题,如果问题未发生,则问题与自定义 JavaScript 有关。 解决此问题。

注意

如果出现问题,请启用你立即禁用的 JavaScript,并尝试 停用自定义插件停用自定义工作流进程

停用自定义工作流过程

  1. 转到设置>自定义>自定义系统

  2. 选择流程。 这些流程包括工作流、业务流程和业务规则。

    将显示可用进程的列表。

  3. 选择“筛选器”图标,选择列“主实体”,然后选择发生错误的表。

    转到自定义进程工作流列表,选择发生错误的表。

  4. 选择来自你拥有的解决方案的进程。

    注意

    查看自定义进程:

    1. 转到“设置解决方案>,然后打开解决方案。
    2. 选择流程。 验证值是否被选为:“进程组件类型”和全部查看”。
  5. 选择停用

  6. 发布自定义项。

    选择并停用非托管进程工作流。

  7. 验证问题,如果问题未发生,则问题与自定义进程有关。 解决此问题。

注意

如果出现问题,请激活你立即停用的进程,并尝试停用自定义插件禁用自定义 JavaScript

问题 3 - 使用共享变量进行自定义插件处理

现象

  • 创建和更新商机、报价、订单和发票表的操作会触发其父表的更新。
  • 检索有关商机、报价、订单和发票表的详细信息会内部触发价格计算服务,该服务随后会触发客户创建的自定义插件。

解决方法

自定义插件对商机、报价、订单和发票表执行创建、更新和保存操作。 这些表的创建和更新操作在内部触发价格计算服务,然后更新其父表的相关价格相关字段或属性。

可以使用内部价格计算服务或使用你自己的自定义插件,识别或区分机会、报价、订单或发票表或父机会、报价、订单或发票表中的任何更新。 可通过插件代码访问的布尔共享变量InternalSystemPriceCalculationEventIPluginExecutionContext。 使用价格计算服务处理的任何创建或更新事件都将将变量 InternalSystemPriceCalculationEvent 的值设置为 trueInternalSystemPriceCalculationEvent 的默认值为 false。 可以从自定义插件代码访问此变量,以控制现有业务逻辑的流。

注意

若要使用共享变量执行自定义插件操作,请确保禁用现成的价格计算服务。

代码示例

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
    }

}