CData Software Blog

クラウド連携のCData Software の技術ブログです。

CData NetSuiteドライバで保存検索を利用する方法

こんにちは。CData Software Japanエンジニアの浦邊です。

本記事ではNetSuiteの保存検索機能をCData NetSuiteドライバから利用する方法を紹介します。

NetSuiteの保存検索とは、データの検索効率を高めるために、指定した表示項目や検索条件等で絞り込んだ結果を表示し、さらにそれらの条件を再現可能なように保存する機能です。 保存検索を作成しておくことで見たいデータに瞬時にアクセスできるようになります。 一方NetSuite ドライバは保存検索のスキーマ(ビュー)を作成することができます。 作成したスキーマに対して、通常のテーブルと同じようにSelect文を発行し、保存検索で表示される結果を取得することが可能です。

保存検索の作成

ここでは顧客の住所データを例にとり、NetSuiteの画面で保存検索を作成する方法を説明します。

メニューの[リスト]から[検索][保存検索][新規作成]の順にクリックしてください。

f:id:urabe_shintaro:20210113170452p:plain

次にレコードタイプを選択します。 今回は[顧客]を選択します。

f:id:urabe_shintaro:20210113170503p:plain

[検索タイトル][ID]を入力します。 IDが空白の場合は自動で設定されます。

f:id:urabe_shintaro:20210113170518p:plain

[結果]タブを選択し、検索結果に含める項目を選択します。 [条件]タブで検索条件を指定できますが、今回は全レコードを対象とするため特に設定しません。

f:id:urabe_shintaro:20210113170559p:plain

設定が完了したら[保存]をクリックしてください。

保存検索の表示

作成した保存検索を実行してレコードを表示します。 メニューの[リスト][検索]にある[保存検索]をクリックしてください。 [種類][顧客]を選択すると、作成した保存検索が表示されます。

f:id:urabe_shintaro:20210113170649p:plain

[表示]をクリックすると以下のように検索結果が表示されます。

f:id:urabe_shintaro:20210113170701p:plain

保存検索スキーマの作成

NetSuiteドライバで保存検索結果を取得するスキーマ(ビュー)を作成する方法を説明します。

スキーマを作成するにあたり保存検索IDを取得する必要があります。 保存検索表示画面のURLにあるsearchidの数字が保存検索IDとなりますので、これを控えておいてください。

f:id:urabe_shintaro:20210113170728p:plain

スキーマを作成するにはドライバでCreateSavedSearchSchemaストアドプロシージャを実行します。

exec CreateSavedSearchSchema 
@SearchType=<検索タイプ>,
@SavedSearchId=<保存検索ID>, 
@SavedSearch=<スキーマ名>

今回は顧客を対象とするため@SearchTypeに「Customer」を指定します。 @SavedSearchIdには取得した保存検索ID「936」を指定します。 @SavedSearchには任意のスキーマ名を指定します。

今回の例では以下のストアドプロシージャを実行します。

exec CreateSavedSearchSchema 
@SearchType='Customer',
@SavedSearchId='936', 
@SavedSearch='MyCustomers'

ストアドプロシージャの実行に成功すると実行環境にMyCustomersという名前のビューが作成されます。 以下のようにビューを呼び出すと保存検索の結果を表示できます。

select * from MyCustomers;

スキーマのフィールドが足りない場合の対応

CreateSavedSearchSchemaでスキーマを作成すると、対象の保存検索に存在する項目が含まれていないケースがあります。 ドライバがスキーマを作成するとき、各フィールドのデータからフィールドのタイプを推定するために、保存検索結果の最初の50行をスキャンします。 この時最初の50行にデータが存在しない場合はフィールド自体が作成されません。 この仕様により、データが少ないフィールドは作成されたスキーマに含まれないという現象が発生します。

そこで、スキャンする行数を50行から増やすことでこの問題を解決できます。 CreateSavedSearchSchemaストアドプロシージャのResultsToSampleパラメータでスキャンする行数を変更できます。 以下のようにResultsToSampleに大きい値を設定することでフィールドの検出漏れを防ぐことができます。 ただしResultsToSampleが多いほどスキーマの作成に時間がかかることは留意してください。

exec CreateSavedSearchSchema 
@SearchType='Customer',
@SavedSearchId='936', 
@SavedSearch='MyCustomers',
@ResultsToSample=1000;

保存検索を利用した子テーブルへのアクセス高速化

保存検索を利用することで、時間がかかる子テーブルのデータアクセスを高速化することができます。

NetSuiteドライバの子テーブルとは

NetSuiteは取引先、顧客などのリストを持ちます。 さらに顧客リスト内の個々の顧客は支店住所などのリストを保持します。 以下に顧客「テスト株式会社」が3つの住所を持つ例を示します。

f:id:urabe_shintaro:20210113170329p:plain

このようにリストに入れ子関係があるとき、NetSuiteドライバは顧客リストを「親テーブル」、顧客の住所リストを「子テーブル」として扱います。

f:id:urabe_shintaro:20210113170248p:plain

例えば顧客リストはCustomerテーブル、顧客の住所リストはCustomer_AddressbookListテーブルとしてアクセスできます。 子テーブルはデフォルトの設定では表示されないため、IncludeChildTablesプロパティをtrueに設定してください。

以下は顧客の顧客名、メールアドレス、住所、電話番号をリストアップするクエリの例です。

select 
    CompanyName,
    Email,
    AddressbookList_AddressbookAddress_Addressee as Addressee,
    AddressbookList_AddressbookAddress_Country as Country,
    AddressbookList_AddressbookAddress_City as City,
    AddressbookList_AddressbookAddress_Addr1 as Address,
    AddressbookList_AddressbookAddress_Zip as Zip,
    AddressbookList_AddressbookAddress_AddrPhone as Phone
from Customer_addressbookList

実行結果

f:id:urabe_shintaro:20210113181157p:plain

しかし、上の例にように子テーブルのデータを直接取得すると、各レコードごとに子要素へのアクセスが発生するため親テーブルの取得と比較して時間がかかります。 例えば手元の環境で実行した場合、Customerテーブルでは100レコードの取得に0.5秒程度かかりますが、Customer_AddressbookListテーブルでは100レコードの取得に20秒以上かかります。 数万レコードのデータを取得するタスクでは現実的な時間で終えることは困難です。

保存検索による高速化

このような問題に対し、保存検索機能を利用して取得時間を短縮することができます。 取得したい子テーブルの項目を含めた保存検索と、この保存検索にアクセスするスキーマを作成します。 保存検索スキーマへのアクセスの仕組みは通常のテーブルと変わりません。 これにより、子テーブルのデータ取得を通常のテーブルと同程度の時間で実行することができます。

例えば今回作成した保存検索スキーマを以下のように実行することで、上記子テーブルへのクエリと同等の結果を実現できます。 子要素へのリクエストが発生しないため前者よりも高速にデータを取得できます。

select
    basic_entityid as CompanyName,
    basic_email as Email,
    basic_addressee as Addressee,
    basic_country as Country,
    basic_city as City,
    basic_address1 as Address,
    basic_zipcode as Zip,
    basic_addressphone as Phone
from MyCustomers

ただし、保存検索スキーマはビューとして扱われるためデータの更新はできないことにご注意ください。 子テーブルの更新は子テーブルに直接クエリを発行する従来の方法で行う必要があります。