2016-11-04 5 views
0

У меня есть небольшое консольное приложение C#, единственная цель которого - получать записи из «Сохраненного поиска» в NetSuite (через SuiteTalk). Мне удалось успешно подключиться и получить записи из NetSuite для моего сохраненного поиска (поиск также проходит через веб-интерфейс), однако, когда я пытаюсь получить доступ к результатам «Сохраненного поиска» через мое приложение, я не могу для их просмотра, так как объект поиска, который возвращается не содержит каких-либо данных в свойстве «recordList»:NetSuite SuiteTalk TransactionSearchAdvanced: recordList равно null

//Connect 
var dataCenterAwareNetSuiteService = new DataCenterAwareNetSuiteService("XXXXXX"); 
dataCenterAwareNetSuiteService.Timeout = 1000 * 60 * 60 * 2; 

//Adds Credentials etc... 
dataCenterAwareNetSuiteService.tokenPassport = createTokenPassport(); 

//Setup Preferences 
var prefs = new Preferences(); 
prefs.warningAsErrorSpecified = true; 
prefs.warningAsError = false; 
dataCenterAwareNetSuiteService.preferences = prefs; 

var searchPrefs = new SearchPreferences(); 
dataCenterAwareNetSuiteService.searchPreferences = searchPrefs; 
dataCenterAwareNetSuiteService.searchPreferences.pageSize = 5; 
dataCenterAwareNetSuiteService.searchPreferences.pageSizeSpecified = true; 
dataCenterAwareNetSuiteService.searchPreferences.bodyFieldsOnly = false; 
dataCenterAwareNetSuiteService.searchPreferences.returnSearchColumns = false; 

//Search 
var tranSearchAdv = new TransactionSearchAdvanced(); 
var tranSearchRow = new TransactionSearchRow(); 
var tranSearchRowBasic = new TransactionSearchRowBasic(); 

tranSearchAdv.savedSearchId = "XXXX"; 
tranSearchRowBasic.internalId = 
    new SearchColumnSelectField[] { new SearchColumnSelectField() }; 
tranSearchRowBasic.tranId = 
    new SearchColumnStringField[] { new SearchColumnStringField() }; 
tranSearchRowBasic.dateCreated = 
    new SearchColumnDateField[] { new SearchColumnDateField() }; 
tranSearchRowBasic.total = 
    new SearchColumnDoubleField[] { new SearchColumnDoubleField() }; 
tranSearchRowBasic.entity = 
    new SearchColumnSelectField[] { new SearchColumnSelectField() }; 

tranSearchRow.basic = tranSearchRowBasic; 
tranSearchAdv.columns = tranSearchRow; 

//No errors, 
//this works correctly and returns the "Saved Search" with the correct "totalRecords" 
//but results.recordList == null while results.totalRecords = 10000000+ 
var results = dataCenterAwareNetSuiteService.search(tranSearchAdv); 

Я мне кажется, что объект «recordList» является основным способом извлечения данных из результатов поиск (Related Java Example, Another Here). Это также способ, которым это делает example API.

Я запустил это на нескольких «сохраненных поисковых системах» с теми же результатами. Я не понимаю, как вы можете иметь более одной записи в «totalRecords», и все же «recordList» остается нулевым? Есть ли какой-либо параметр конфигурации, который должен быть установлен, чтобы позволить мне получить доступ к этому свойству. Или, может быть, это вопрос безопасности, у пользователя API, который у меня есть настройка, должен быть полный доступ, есть ли что-нибудь еще, что нужно получить доступ?

NetSuite SuiteTalk - not well documented, и большинство примеров онлайн не находятся на C# и not dealing с проблемами, которые я испытываю. Эти факторы затрудняют определение того, почему ранее упоминалось поведение, или даже, чтобы обнаружить любые альтернативные методы для получения результирующих данных из источника «Сохраненный поиск».

У кого-нибудь есть понимание этого поведения? Является ли это правильным методом получения результатов из SuiteTalk? Есть ли какая-либо конфигурация из API или веб-сайта, которую необходимо изменить?

Update 1

Я также попытался использовать альтернативный способ получения результирующих данных путем доступа к «searchRowList» объект из объекта «SEARCHRESULT» (предложенный @AdolfoGarza) Однако она возвращает в основном пустые поля (null), аналогичное свойству «recordList», я не вижу способа получить данные «Сохраненный поиск» из этого метода.

ответ

0

Я был в состоянии решить эту проблему путем удаления этой строки в коде:

tranSearchRow.basic = tranSearchRowBasic; 

Тогда как @AdolfoGarza Рекомендуемые, получение результатов от «основного» поля «results.searchRowList»

По какой-то причине API-интерфейс шаблона, который я использовал, настраивал «TransactionSearchAdvanced», ссылаясь на пустую запись TransactionSearchBasic, но не уверен, почему, но это привело к тому, что результаты «searchRowList» были равны нулю. После удаления я теперь получаю ненулевые значения в соответствующих полях.

Что касается «recordList», он по-прежнему недействителен, но не уверен, почему, но поскольку у меня есть данные, я не думаю, что продолжу копаться в этом.

+0

SuiteTalk, к сожалению, оставляет выделение разработчику, чтобы выяснить, как извлекать и обрабатывать результирующие наборы. Я думаю, что этот вопрос/ответ помогает прояснить некоторые из них (по крайней мере, в моем случае). Другая часть уравнения - это то, что делать с данными, когда вы можете получить к нему доступ, я думаю, что этот пост [https://community.boomi.com/thread/2736] помогает прояснить некоторые из вопросов вокруг этого. –

1

Попробуйте получить результаты с результатами. SearchRowList.searchRow, вот как это работает в php.

+0

Да, хорошее предложение. У меня есть еще один пример API, который делает именно это, но когда я принимаю этот подход, я получаю ряд результатов, соответствующих «pageSize», но результаты (TransactionSearchRow/TransactionSearchRowBasic) вернулись почти все поля, заданные как null (за исключением полей total, entitiy, internalID и dateCreated), я не вижу способа получить любые данные, сгенерированные из запроса «Сохраненный поиск» с помощью этого метода. Симптомы кажутся похожими на первую проблему, когда запрос получает результаты, но по какой-то причине я не могу их восстановить. –

+0

Да, используйте расширенный, чтобы получить больше информации. Кроме того, даже заблаговременно вы не сможете получить нужные данные за один раз. Поиски сложны в Suitetalk, поэтому вам может потребоваться настроить поиск, чтобы получить нужные данные. Возможно, вы захотите изучить кодировку Restlet или защищенного Suitelet, чтобы получить результаты поиска и воспользоваться преимуществами Suitescript, который имеет лучшие и быстрые API. –

+0

Что вы подразумеваете под «advanced», я считаю, что я уже использую «Расширенный поиск» (TransactionSearchAdvanced), но, конечно, все возвращаемое значение по-прежнему равно нулю. Что касается запроса, он возвращает именно данные, которые я ищу через интерфейс NetSuite, я просто не могу получить это через API. –