4

論理 OR 演算子を示す複数の検索語を指定して、SuiteTalk (NetSuite Web API) 検索クエリを作成するにはどうすればよいですか?

たとえば、作成日または最終更新日が特定の範囲内にある TimeBill レコードを取得したいと考えています。これは、単一の検索用語に対してうまく機能する私のコードです。別の検索語を追加するだけで、論理 AND 演算が作成されるように見えます。

    /// <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();
        searchDateField.@operator = 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;
    }
4

1 に答える 1

1

NetSuite ユーザー コミュニティ (フォーラム) によると、これが現在可能であるとは思えません (少なくとも、SuiteTalk/Web サービスの WSDL には表示されません): https://usergroup.netsuite.com/users/showthread.php? t=29818

ただし、nlobjSearchFilter メソッド setLeftParens()、setRightParens()、および setOr() を使用して、AND/OR と括弧を含む複雑な保存済み検索を動的に作成できます (スイートレットで SuiteScript を使用)。 " は、複数のフィルターが存在する場合の既定の動作です)。

動的に作成された保存された検索 (ここでは用語が紛らわしいですが、私は知っています) を保存して、後で再利用するためにロードすることもできます。したがって、Web サービス コードで保存済み検索を呼び出して結果を取得することで、NetSuite サーバー上で動的に作成された保存済み検索を利用できる可能性がありますが、それでもすべてが動的です (ハードコーディングされた検索フィルター/値はありません)。

フォーラムで言及されているように、複数の検索を実行し、結果を自分で (SuiteTalk C#/Java などのコードで) つなぎ合わせることができる可能性もあります。

于 2012-06-08T11:53:07.460 に答える