Считайте элементы SalesOrder более элегантно в SuiteTalk - PullRequest
0 голосов
/ 05 июля 2019

Я работаю над созданием серверной части для приложения на основе NetSuite с помощью SuiteTalk.Я пытаюсь подсчитать общее количество элементов в SalesOrders.

Моя проблема в том, что при выполнении операции поиска для получения всех SalesOrders возвращаемый объект Record[] теряет точность при приведении к SalesOrder[](используя Array.ConvertAll(...) и вручную).В моем случае это означает получение исключения Null Reference при попытке доступа к полю itemList.

Мое возможное решение было следующим:

for (SearchResult searchResult = _service.search(salesOrderSearch); searchResult.pageIndex <= searchResult.totalPages; searchResult = _service.searchNext()) {

                if (searchResult.status.isSuccess) {

                    // Convert Record[] to SalesOrder[]. Note that direct conversion causes some fields to become Null 
                    SalesOrder[] salesOrdersNull = Array.ConvertAll(searchResult.recordList, item => (SalesOrder)item);

                    // To avoid the null issue, send a get request for each order by its internalId
                    foreach (SalesOrder salesOrderNull in salesOrdersNull) {
                        SalesOrder salesOrder = getSalesOrder(salesOrderNull.internalId);

                        // Increment the count by the total number of items
                        count += salesOrder.itemList.item.Length;
                    }
                } else {
                    string errorCodes = Helpers.generateErrorString(searchResult.status.statusDetail);
                    throw new SuiteTalkServiceException("count Sales Order Lines. Failed with error code(s) " + errorCodes);
                }
            }

Однако это вызывает запрос get для каждогоЗаказ на продажу, т. Е. Он занимает много времени и очень не элегантен.Есть ли более элегантное решение, которое мне не хватает?У кого-нибудь еще была подобная проблема, или у меня проблема?

Определение класса для записи:

public abstract partial class Record {

        private string[] nullFieldListField;

        /// <remarks/>
        [System.Xml.Serialization.XmlArrayItemAttribute("name", IsNullable=false)]
        public string[] nullFieldList {
            get {
                return this.nullFieldListField;
            }
            set {
                this.nullFieldListField = value;
            }
        }
    }

Определение класса для SalesOrder - это несколько тысяч строк кода, но Запись в SchemaBrowser довольно понятна.

1 Ответ

1 голос
/ 05 июля 2019

Я нашел ответ на свой вопрос здесь .

По сути, чтобы поле itemList не стало null, необходимо установить для поля searchPreferences.bodyFieldsOnly значение false. Теперь это выполняется в 1/10 времени моего решения.

...