2013-03-10 67 views
1

我是CRM 2011插件的新手。我寫了一個插件來更新稅收價值。但在它下面的線拋出可爲空的對象必須具有值異常

"Nullable object must have value"

double Tax = (double)(QuoteProduct.BaseAmount - QuoteProduct.ManualDiscountAmount - 
      QuoteProduct.VolumeDiscountAmount)/20; 

發生錯誤時的錯誤,這些值是: 基量= 0,
手動折扣金額= NULL,
量折扣量= 0

+0

要聲明更多,在發生錯誤的電平的值是:基量= 0,手動discou nt amount = null,批量折扣金額= 0 – 2013-03-10 07:50:07

+0

檢查GetValueOrDefault方法 – NoviceProgrammer 2013-03-10 07:54:51

+0

當一個金額爲'null'時,您希望得到哪個稅?你想用零代替'null'嗎?或者你想讓你的結果爲'null'? – 2013-03-10 08:14:50

回答

3

假設所有的變量是類型Nullable<T>的,你可以使用GetValueOrDefault()方法(MSDN文章)。

該方法將返回該對象所具有的值,或者在爲null的情況下返回該類型的默認值(0.0表示double)。

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

謝謝你的回覆。我使用過你的方法,但它在savechanges行引發異常: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」] =稅; crm.UpdateObject(QuoteProduct); crm.SaveChanges(); – 2013-03-10 08:19:16

+0

我是否在CRM 2011中使用錯誤的方式設置貨幣字段? – 2013-03-10 08:21:27

+0

請分享例外的細節 - 或者可以提出一個單獨的問題,以便更多人可以提供幫助 – NoviceProgrammer 2013-03-10 08:22:20

2

您不能將null轉換爲double。

double x = null; 

產生錯誤:

Cannot convert null to 'double' because it is a non-nullable value type

所以,你必須確保你的值是0(零),而不是空。

+0

這是CRM。大多數的值都是可以爲空的,所以它是雙倍的? x = null;'在大多數情況下。或者'小數? x = null;'。 – 2013-03-10 09:46:52

+0

客戶關係管理與否:他試圖做雙重稅=(double)(null);這在C#中不起作用。 – 2013-03-10 09:59:35

+0

正確。我只是表示在這種特殊情況下的修正應該改變* double *改爲* double * *。 * null *值是正確的。這是接收變量是錯誤的類型。所以我沒有糾正你 - 而是延長你的答覆。 – 2013-03-10 18:29:21

2

你不能從null中減去!

if (... != null) 
1

我認識到你從另一篇文章中提出的公式。通常,在這種情況下,我使用下面的一個很好的語法。 (由其他回答者提到GetValueOrDefault的語法是確定的,但往往使你的代碼的可讀性和線waaay長。)

考慮以下變化(我假設,每一個部分都可能發生。可是

decimal tax = QuoteProduct.BaseAmount ?? 0; 
tax -= QuoteProduct.ManualDiscountAmount ?? 0; 
tax -= QuoteProduct.VolumeDiscountAmount ?? 0; 
QuoteProduct.Attribute["tax"] = tax/20; 

(我假定這是關係到your other question

+0

如果金額爲可以爲雙精度的,那麼'tax'必須是'double'(而不是'decimal')。否則,我喜歡使用'??'運算符。 – 2013-03-11 18:14:00

+0

@JeppeStigNielsen正確。但我相當肯定他的價值是*十進制*如果不是*金錢*。在我看來,CRM有點倒退。我喜歡你挑剔的性格。在示例中讓我停止給出分類代碼。謝謝! – 2013-03-12 11:06:33

相關問題