排查多个表的常见问题
本文可帮助你排查和解决多个表中的常见问题,例如Microsoft Dynamics 365 Sales 中的商机、报价、订单或发票。
问题 1 - 在上下文窗体中,可能出现在窗体选择器中
In Context Form 用于在交易经理中显示和自定义侧面板,以及联系人、机会、潜在顾客和帐户的新界面。
原因
如果环境具有将 formActivationState 设置为 Active 的任何自定义项,则“上下文窗体”将显示在窗体选择器下拉列表中,允许用户选择此窗体以查看记录详细信息。
解决方法
如果上下文窗体的外观导致混淆,则可以停用上下文窗体,如以下屏幕截图所示。
问题 2 - 处理表时出现错误或意外行为
现象
处理表(如商机、报价、订单、发票、报价产品和订单产品),但在 Dynamics 365 for Sales 中观察到意外行为或错误。 以下是在处理机会时可能会遇到的一些错误,它们可能适用于其他表:
- “修改报价后扩展金额错误”- 此错误可能是由于自定义插件导致的。
- “保存机会时出错”- 此错误可能是由于自定义 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 - 使用共享变量进行自定义插件处理
现象
- 创建和更新商机、报价、订单和发票表的操作会触发其父表的更新。
- 检索有关商机、报价、订单和发票表的详细信息会内部触发价格计算服务,该服务随后会触发客户创建的自定义插件。
解决方法
自定义插件对商机、报价、订单和发票表执行创建、更新和保存操作。 这些表的创建和更新操作在内部触发价格计算服务,然后更新其父表的相关价格相关字段或属性。
可以使用内部价格计算服务或使用你自己的自定义插件,识别或区分机会、报价、订单或发票表或父机会、报价、订单或发票表中的任何更新。 可通过插件代码访问的布尔共享变量InternalSystemPriceCalculationEvent
IPluginExecutionContext
。 使用价格计算服务处理的任何创建或更新事件都将将变量 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
}
}