排查多个表的常见问题
本文可帮助你排查和解决Microsoft Dynamics 365 Sales中多个表(如商机、报价单、订单或发票)的常见问题。
问题 1 - 上下文窗体中可能出现在窗体选择器中
In Context Form 用于在交易管理器中显示和自定义侧面板,并在联系人、商机、潜在顾客和帐户的新界面中显示和自定义侧面板。
原因
如果你的环境具有将这些表的 formActivationState 设置为 Active 的任何自定义项,则 “上下文窗体” 将显示在窗体选择器下拉列表中,并允许用户选择此窗体以查看记录详细信息。
解决方案
如果 “上下文窗体中 ”的外观导致混淆,则可以停用“ 上下文表单” ,如以下屏幕截图所示。
问题 2 - 处理表时出现错误或意外行为
症状
处理 (表(如商机、报价单、订单、发票、报价产品和订单产品) )时,会发现销售Dynamics 365出现意外行为或错误。 以下是处理机会时可能会遇到的一些错误,这些错误可能适用于其他表:
- “修订报价后扩展金额错误”- 此错误可能是由于自定义插件导致的。
- “保存机会时出错”- 此错误可能因自定义 JavaScript 而发生。
- “关闭机会时出错”- 此错误可能因自定义工作流而发生。
原因
由于应用程序自定义不当,可能会出现这些问题。
解决方案
必须验证不正确的自定义项并解决它们。 执行以下验证方法以确定导致问题的自定义项,然后解决:
停用自定义插件
转到 “设置>自定义>”“自定义系统”。
选择“ Sdk 消息处理步骤”。
将显示可用 SDK 消息处理步骤的列表。
选择 “筛选器” 图标,选择“ 主要对象类型代码 (Sdk 消息筛选器) ”列,然后选择发生错误的表。
选择来自你拥有的解决方案的 SDK 消息处理步骤。
注意
若要查看自定义 SDK 消息处理步骤,请执行以下操作:
转到“设置解决方案”>,然后打开解决方案。
选择“ SDK 消息处理步骤”。 验证是否按如下所示选择了值:“组件类型”到“SDK 消息处理步骤”,以及“全部查看”。
选择“ 停用”。
发布自定义项。
验证问题,如果问题未发生,则问题出在自定义 SDK 消息处理步骤中。 解决此问题。
注意
如果出现此问题,请激活你现在停用的 SDK 消息处理步骤 ,并尝试 禁用自定义 JavaScript 或 停用自定义工作流进程。
禁用自定义 JavaScript
打开发生错误的表的窗体编辑器。 在此示例中,我们将表选为“机会”和默认解决方案窗体。
在 窗体 编辑器中选择“窗体属性”。
此时将打开“ 窗体属性 ”对话框。
在“事件”选项卡上,从“事件”下拉列表中选择“OnLoad”控件。
选择来自你拥有的解决方案的自定义 JavaScript 文件。
注意
查看自定义 JavaScript:
- 转到“设置解决方案”>,然后打开解决方案。
- 选择“ WebResources”。 验证值是否选择为: “组件类型 ”为 “WebResources” 和 “视图 ”为 “全部”。
- 选择 “筛选器” 图标,为列启用筛选选项。 选择“ 类型 ”,并将筛选器设置为 JScript) (脚本 。
选择“编辑”。 在此示例中,我们已选择要编辑的自定义 JavaScript 文件 eg_opportunity 。
清除 “已启用” 选项,然后选择“ 确定”。
发布自定义项。
请验证问题,如果问题未发生,则问题出在自定义 JavaScript 上。 解决此问题。
注意
如果出现问题,请启用现在禁用的 JavaScript,并尝试 停用自定义插件 或 停用自定义工作流进程。
停用自定义工作流进程
转到 “设置>自定义>”“自定义系统”。
选择“ 进程”。 这些流程包括工作流、业务流程和业务规则。
将显示可用进程列表。
选择 “筛选器” 图标,选择列“ 主要实体”,然后选择发生错误的表。
选择来自你拥有的解决方案的进程。
注意
若要查看自定义进程,请执行:
- 转到“设置解决方案”>,然后打开解决方案。
- 选择“ 进程”。 验证值是否选择为:“组件类型”为“进程”和“全部查看”。
选择“ 停用”。
发布自定义项。
验证问题,如果问题未发生,则问题出在自定义进程上。 解决此问题。
注意
如果出现问题,请激活你现在停用 的进程 ,并尝试 停用自定义插件 或 禁用自定义 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
}
}