排查多个表的常见问题

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

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

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

原因

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

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

解决方案

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

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

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

症状

处理 (表(如商机、报价单、订单、发票、报价产品和订单产品) )时,会发现销售Dynamics 365出现意外行为或错误。 以下是处理机会时可能会遇到的一些错误,这些错误可能适用于其他表:

  • “修订报价后扩展金额错误”- 此错误可能是由于自定义插件导致的。
  • “保存机会时出错”- 此错误可能因自定义 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 - 使用共享变量的自定义插件处理

症状

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

解决方案

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

通过使用内部价格计算服务或使用自己的自定义插件,可以识别或区分机会、报价、订单或发票表或父机会、报价、订单或发票表中的任何更新。 可通过 访问IPluginExecutionContext的布尔共享变量InternalSystemPriceCalculationEvent在插件代码中可用。 使用价格计算服务处理的任何创建或更新事件都将变量 InternalSystemPriceCalculationEvent 的值设置为 true。 的 InternalSystemPriceCalculationEvent 默认值为 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
    }

}