2012-06-05 2 views
2

Как создать поисковый запрос SuiteTalk (NetSuite web api) с указанием нескольких условий поиска, указывающих логический оператор OR?Как создать поиск NetSuite SuiteTalk с несколькими терминами?

Например, я хочу, чтобы получить TimeBill записи, в которых создать ИЛИ даты последнего изменения находятся в пределах определенного диапазона. Вот мой код, который отлично подходит для одного поискового запроса. Просто добавив еще один поисковый запрос, создается логическая операция И.

/// <summary> 
    /// Return the list of time bills whose last modified date is within 
    /// the indicated date range. 
    /// </summary> 
    /// <param name="from">Required from date</param> 
    /// <param name="to">Optional to date</param> 
    /// <returns>List of time bills</returns> 
    public IEnumerable<TimeBill> GetTimeBills(DateTime from, DateTime to) 
    { 
     _log.Debug(String.Format("Enter TimeBill(DateTime from='{0}', DateTime to='{1}')", from, to)); 

     // Build search criteria. 
     TimeBillSearch search = new TimeBillSearch(); 
     TimeBillSearchBasic searchBasic = new TimeBillSearchBasic(); 
     SearchDateField searchDateField = new SearchDateField(); 
     searchDate[email protected] = SearchDateFieldOperator.within; 
     searchDateField.operatorSpecified = true; 
     searchDateField.searchValue = from; 
     searchDateField.searchValueSpecified = true; 
     searchDateField.searchValue2 = to; 
     searchDateField.searchValue2Specified = true; 
     searchBasic.dateCreated = searchDateField;    
     search.basic = searchBasic; 

     return this.Get<TimeBill>(search); 
    } 

    /// <summary> 
    /// Perform a paged search and convert the returned record to the indicated type. 
    /// </summary> 
    private IEnumerable<T> Get<T>(SearchRecord searchRecord) 
    { 
     _log.Debug("Enter Get<T>(SearchRecord searchRecord)"); 

     // This is returned. 
     List<T> list = new List<T>(); 

     // The suitetalk service return this. 
     SearchResult result = null; 

     using (ISuiteTalkService service = SuiteTalkFactory.Get<SuiteTalkService>()) 
     { 
      do 
      { 
       // .search returns the first page of data. 
       if (result == null) 
       { 
        result = service.search(searchRecord); 
       } 
       else // .searchMore returns the next page(s) of data. 
       { 
        result = service.searchMoreWithId(result.searchId, result.pageIndex + 1); 
       } 

       if (result.status.isSuccess) 
       { 
        foreach (Record record in result.recordList) 
        { 
         if (record is T) 
         { 
          list.Add((T)Convert.ChangeType(record, typeof(T))); 
         } 
        } 
       } 
      } 
      while (result.pageIndex < result.totalPages); 
     } 
     return list; 
    } 

ответ

0

согласно NetSuite сообщества пользователей (форум), я не считаю, что это возможно в настоящее время (по крайней мере, он не появляется в WSDL для SuiteTalk/Web Services): https://usergroup.netsuite.com/users/showthread.php?t=29818

Однако, вы можете динамически создавать сложный сохраненный поиск (используя SuiteScript в Suitelet), который включает AND/OR и круглые скобки, используя методы nlobjSearchFilter setLeftParens(), setRightParens() и setOr() (как вы предполагали, логическое «AND» является стандартным поведение при наличии нескольких фильтров).

Динамически созданный Сохраненный поиск (запутанная терминология здесь, я знаю) также можно сохранить и загрузить для последующего повторного использования. Таким образом, вы могли бы потенциально воспользоваться динамически созданным сохраненным поиском на сервере NetSuite, указав, что ваш код веб-служб вызывает сохраненный поиск и извлекает результаты, но все еще имеет все динамическое (без жестко запрограммированных фильтров/значений).

Как уже упоминалось на Форуме, вы также можете выполнить несколько поисков и сшить результаты вместе (в вашем коде SuiteTalk C#/Java и т. Д.).