#c# #quickbooks #qbfc
#c# #quickbooks #qbfc
Вопрос:
Я пытаюсь получить список элементов внутри базы данных quickbooks. У меня есть следующий фрагмент кода:
IItemServiceRet itemServiceRet = itemRet.ItemServiceRet;
TestItem item = new TestItem();
item.Name = itemServiceRet.Name.GetValue();
item.Desc = itemServiceRet.ORSalesPurchase.SalesOrPurchase.Desc.GetValue();
item.Rate = itemServiceRet.ORSalesPurchase.SalesOrPurchase.ORPrice.Price.GetValue().ToString();
item.ItemType = "Service";
item.QBID = itemServiceRet.ListID.GetValue();
item.EditSeq = itemServiceRet.EditSequence.GetValue();
Ошибка кода в строке:
item.Desc = itemServiceRet.ORSalesPurchase.SalesOrPurchase.Desc.GetValue();
"Object reference not set to an instance of an object"
Потому что у этого конкретного сервисного элемента в базе данных QB нет описания. Мне было любопытно, существует ли «чистый» способ проверки нулевых значений без необходимости включать в каждую строку if
инструкцию, проверяющую, GetValue()
возвращает ли значение null?
Редактировать: после попытки решения Эндрю Купера:
item.Desc = itemServiceRet.ORSalesPurchase.SalesOrPurchase.Desc == null ? null : itemServiceRet.ORSalesPurchase.SalesOrPurchase.Desc.GetValue();
Он по-прежнему выдает исключение:
Object reference not set to an instance of an object
Как будто GetValue() вообще ничего не возвращает, если нет описания, что не имеет особого смысла.
Комментарии:
1. элемент. Desc ищет значение. Таким образом, вам нужно будет поместить пустую строку вместо null. Также вам может потребоваться использовать простой If Then , а не троичный оператор.
Ответ №1:
Вы могли бы использовать тернарный оператор следующим образом:
item.Desc = itemServiceRet.ORSalesPurchase.SalesOrPurchase.Desc == null ? null : itemServiceRet.ORSalesPurchase.SalesOrPurchase.Desc.GetValue();
Но это довольно некрасиво.
Лучше всего создать вспомогательный метод, который принимает любой тип Desc
и обертывает вышеуказанную логику.
Комментарии:
1. Я попробовал это, и я все еще получаю «Ссылка на объект, не установленная для экземпляра объекта», как будто GetValue() не возвращает null, если там ничего нет, но вообще ничего не возвращает.
2. Это свойство
Desc
, которое имеет значение null..GetValue()
Источником исключения является вызов нулевой ссылки. ЕслиDesc
имеет ненулевое значение, то.GetValue()
будет работать нормально.
Ответ №2:
Я не думаю, что есть лучшее решение, поскольку вы не можете получить доступ к функциям нулевого объекта. Обычно я создаю конструктор для своих элементов, который выполняет проверку, поэтому мне нужно сделать это только один раз. Итак, в вашем примере:
TestItem item = new TestItem(itemRet.ItemServiceRet);
Конструктор будет выглядеть следующим образом:
public TestItem(IItemServiceRet i)
{
if(i.Name != null) this.Name = i.Name.GetValue();
if(i.ORSalesPurchase != null)
if(i.ORSalesPurchase.SalesOrPurchase != null)
{
if(i.ORSalesPurchase.SalesOrPurchase.Desc != null) this.Desc = i.ORSalesPurchase.SalesOrPurchase.Desc.GetValue();
if(i.ORSalesPurchase.SalesOrPurchase.ORPrice != null)
if(i.ORSalesPurchase.SalesOrPurchase.ORPrice.Price != null) this.Price = i.ORSalesPurchase.SalesOrPurchase.ORPrice.Price.GetValue();
}
}
Имейте в виду, что это хорошо работает для строк, поскольку пустая строка обычно совпадает с пустым полем, но для числовых полей в QuickBooks это может вызвать проблемы. Например, строка счета-фактуры может иметь пустое поле количества (которое является двойным). Значение double по умолчанию равно 0.0, но пустое поле количества в QuickBooks обрабатывается как количество 1.0. Это также может вызвать проблемы с датами, поскольку в QuickBooks могут быть пустые поля даты.