2013-03-10 48 views
2

我的CRM 2011插件存在问题。SaveChanges 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了未处理由用户代码
消息=处理此请求时发生错误。
源= Microsoft.Xrm.Sdk
堆栈跟踪:
在Microsoft.Xrm.Sdk.Client.OrganizationServiceContext.SaveChanges(SaveChangesOptions选项)用C
在Plugin.TaxCreator(IOrganizationService服务,的Guid QPID):\用户\ mycrm \ Desktop \ BMSD.QuoteProduct.Tax \ BMSD.QuoteProduct.Tax \ BMSD.QuoteProduct.Tax.cs:line 62
at C:\ Users \ mycrm \ Desktop \ BMSD.QuoteProduct中的Plugin.Execute(IServiceProvider serviceProvider)。 Tax \ BMSD.QuoteProduct.Tax \ BMSD.QuoteProduct.Tax.cs:line 38
at Microsoft.Crm.Extensibility.V5PluginProxyStep.ExecuteInternal(PipelineExecutionContext context)
at Microsoft.C rm.Extensibility.VersionedPluginProxyStepBase.Execute(PipelineExecutionContext上下文)
InnerException:System.ServiceModel.FaultException Message = System.InvalidCastException:Microsoft Dynamics CRM遇到错误。在
在Microsoft.Crm.Extensibility.OrganizationSdkServiceInternal.Execute(OrganizationRequest请求,CorrelationToken correlationToken,CallerOriginToken callerOriginToken,WebServiceType的serviceType)
:针对管理员或支持参考号:#BE061894
源= Microsoft.Crm.Extensibility
堆栈跟踪Microsoft.Crm.Extensibility.InprocessServiceProxy.ExecuteCore(OrganizationRequest请求)
在Microsoft.Xrm.Sdk.Client.OrganizationServiceContext.Execute(OrganizationRequest请求)
在Microsoft.Xrm.Sdk.Client.OrganizationServiceContext.SaveChange(OrganizationRequest请求,IList的`1结果)
的InnerException:

回答

4

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

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

decimal Tax = (decimal)((QuoteProduct.BaseAmount 
    - QuoteProduct.ManualDiscountAmount.GetValueOrDefault() 
    - QuoteProduct.VolumeDiscountAmount.GetValueOrDefault())/20); 
+0

谢谢谢尔盖。由于我是这些科目的新手,所以我的问题可能看起来很愚蠢! – 2013-03-10 08:54:56

+0

@PaymanBiukaghazadeh不,它没有。你可能会考虑改进你的问题的唯一方法是格式化。我这次为你做了这件事,但如果你精确地设置问题的话,你可能会在未来得到更好的回应。快乐的编码! – 2013-03-10 09:32:14

1

根据所提供的信息,这可能是转换问题,当您投入加倍。问题在于默认情况下,CRM提供的精确度比您试图将其放入的精度要高。

  • 是8个字节的高,持有的15位
  • 小数为12个字节高大的意义和持有的28个位数

那么重要,即使你的实际值”再处理将适合任何人(和是在C#中的非整数事实上的标准),计算机的反应,给你,你把东西(潜在的)真正的大到一个(相对)小的警告H OLE。

您需要重新声明税收如下。

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

或者你可以在十进制值使用手动转换为内置的转换类。但是,考虑到你将结果放入一个字段(肯定会管理十进制类型),在我看来这是不必要的绕行。

你可以阅读更多的不同类型的by clicking here

+0

非常感谢康拉德。 – 2013-03-10 12:49:36

+0

嗯!这听起来不错。 – 2013-03-10 12:51:01