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

相关问题