2

我的 CRM 2011 插件有问题。

var QuoteProduct = crm.QuoteDetailSet.Where(c 
  => c.QuoteDetailId == QPID).First();
double Tax = (double)(
  (QuoteProduct.BaseAmount 
    - QuoteProduct.ManualDiscountAmount.GetValueOrDefault() 
    - QuoteProduct.VolumeDiscountAmount.GetValueOrDefault()) / 20);
QuoteProduct.Attributes["tax"] = Tax;
crm.UpdateObject(QuoteProduct);
crm.SaveChanges();

错误发生在保存更改行上。错误详情如下。

用户代码未处理 Microsoft.Xrm.Sdk.SaveChangesException
消息=处理此请求时发生错误。
Source=Microsoft.Xrm.Sdk
StackTrace:位于 C:\Users\mycrm\Desktop\BMSD.QuoteProduct 中 Plugin.TaxCreator(IOrganizationService 服务,Guid QPID)的
Microsoft.Xrm.Sdk.Client.OrganizationServiceContext.SaveChanges(SaveChangesOptions 选项) 。
Tax\BMSD.QuoteProduct.Tax\BMSD.QuoteProduct.Tax.cs:
C:\Users\mycrm\Desktop\BMSD.QuoteProduct.Tax\BMSD.QuoteProduct.Tax\BMSD 中 Plugin.Execute(IServiceProvider serviceProvider) 的第 62 行。 QuoteProduct.Tax.cs:
Microsoft.Crm.Extensibility.V5PluginProxyStep.ExecuteInternal(PipelineExecutionContext 上下文)的第 38 行
在 Microsoft.Crm.Extensibility.VersionedPluginProxyStepBase.Execute(PipelineExecutionContext context)
InnerException: System.ServiceModel.FaultException Message=System.InvalidCastException: Microsoft Dynamics CRM 遇到错误。管理员或支持的参考号:#BE061894
Source=Microsoft.Crm.Extensibility
StackTrace:
在 Microsoft.Crm.Extensibility.InprocessServiceProxy 上的 Microsoft.Crm.Extensibility.OrganizationSdkServiceInternal.Execute(OrganizationRequest request, CorrelationToken correlationToken, CallerOriginToken callerOriginToken, WebServiceType serviceType)
。 ExecuteCore(组织请求请求)
在 Microsoft.Xrm.Sdk.Client.OrganizationServiceContext.SaveChange(组织请求
请求,IList`1 结果)的 Microsoft.Xrm.Sdk.Client.OrganizationServiceContext.Execute(组织请求请求)内部
异常:

4

2 回答 2

4

从您的堆栈跟踪中有一个System.InvalidCastException

这意味着某些属性的值类型不正确。由于您仅更改“税”属性,因此其类型不正确。很可能“税”是一个 Money 字段,所以我想你应该给它分配类型的变量decimal,而不是double. 尝试这样的事情:

decimal Tax = (decimal)((QuoteProduct.BaseAmount 
  - QuoteProduct.ManualDiscountAmount.GetValueOrDefault() 
  - QuoteProduct.VolumeDiscountAmount.GetValueOrDefault()) / 20);
于 2013-03-10T08:43:36.780 回答
1

根据提供的信息,当您转换为 double 时,可能是转换问题。问题是 CRM 默认情况下以比您尝试将其装入的精度更高的精度呈现真实值。

  • double高 8 个字节,具有 15 位数字的重要性
  • 十进制是 12 字节高,具有 28 位的重要性

因此,即使您正在处理的实际值适合它们中的任何一个(并且double是 C# 中非整数的事实上的标准),计算机也会做出反应并警告您您正在(可能)真正放入某些东西大成一个(相对)小洞。

您需要按如下方式重新申报税款。

//double tax;
decimal tax = QuoteProduct.BaseAmount 
  - QuoteProduct.ManualDiscountAmount.GetValueOrDefault() 
  - QuoteProduct.VolumeDiscountAmount.GetValueOrDefault();
QuoteProduct.Attributes["tax"] = tax / 20;

或者您可以使用内置转换类手动将十进制值转换为双精度值。但是,鉴于您将结果放入一个字段(肯定管理十进制类型),我认为这是一个不必要的绕道。

您可以点击此处阅读有关不同类型的更多信息。

于 2013-03-10T09:29:04.803 回答