Проверка наличия нулевых значений в quickbooks с использованием QBFC

#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 могут быть пустые поля даты.