2013-03-10 41 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