Power Apps でNetSuite のデータを連携利用
MS PowerApps は、データに連携するモバイルおよびタブレット向けアプリをドラッグ&ドロップとリッチな関数で実現します。CData API ServerとADO.NET Provider for NetSuite (もしくは250+ の他のADO.NET Providers)を組み合わせて使い、PowerApps のリモートデータソースへの連携機能を拡張することができます。PowerApps のCommon Data Service に別途データをコピーする必要はありません。CData API Server は、NetSuite のデータにデータベースのようなアクセスを可能にし、SaaS API やNoSQL をインメモリのSQL-92 エンジンで操作できるようにします。
CData API Server は、Swagger のメタデータ標準をサポートします。Azure App Service、Microsoft Flow、およびPowerApps でSwagger メタデータからのUI 生成やコード生成が可能です。Swagger 定義を使えば、PowerApps からNetSuite に連携する関数が生成できます。本記事では、それらの関数をPowerApps から使って、リモートのNetSuite に連携する方法を説明します。
NetSuite データ連携について
CData は、Oracle NetSuite のライブデータにアクセスし、統合するための最も簡単な方法を提供します。お客様は CData の接続機能を以下の目的で使用しています:
- Standard、CRM、OneWorld を含む、すべてのエディションの NetSuite にアクセスできます。
- SuiteTalk API(SOAP ベース)のすべてのバージョンと、SQL のように機能し、より簡単なデータクエリと操作を可能にする SuiteQL に接続できます。
- Saved Searches のサポートにより、事前定義されたレポートとカスタムレポートにアクセスできます。
- トークンベースおよび OAuth 2.0 で安全に認証でき、あらゆるユースケースで互換性とセキュリティを確保します。
- SQL ストアドプロシージャを使用して、ファイルのアップロード・ダウンロード、レコードや関連付けのアタッチ・デタッチ、ロールの取得、追加のテーブルやカラム情報の取得、ジョブ結果の取得などの機能的なアクションを実行できます。
お客様は、Power BI や Excel などのお気に入りの分析ツールからライブ NetSuite データにアクセスするために CData ソリューションを使用しています。また、CData Sync を直接使用するか、Azure Data Factory などの他のアプリケーションとの CData の互換性を活用して、NetSuite データを包括的なデータベースやデータウェアハウスに統合しています。CData は、Oracle NetSuite のお客様が NetSuite からデータを取得し、NetSuite にデータをプッシュするアプリを簡単に作成できるよう支援し、他のソースからのデータを NetSuite と統合することを可能にしています。
当社の Oracle NetSuite ソリューションの詳細については、ブログをご覧ください:Drivers in Focus Part 2: Replicating and Consolidating ... NetSuite Accounting Data
はじめに
API Server の設定
以下のリンクからAPI Server の無償トライアルをスタートしたら、セキュアなNetSuite OData サービスを作成していきましょう。
NetSuite への接続
PowerApps からNetSuite のデータを操作するには、まずNetSuite への接続を作成・設定します。
- API Server にログインして、「Connections」をクリック、さらに「接続を追加」をクリックします。
- 「接続を追加」をクリックして、データソースがAPI Server に事前にインストールされている場合は、一覧から「NetSuite」を選択します。
- 事前にインストールされていない場合は、コネクタを追加していきます。コネクタ追加の手順は以下の記事にまとめてありますので、ご確認ください。
CData コネクタの追加方法はこちら >> - それでは、NetSuite への接続設定を行っていきましょう!
-
NetSuiteへの接続
NetSuite では、2種類のAPI でデータにアクセスできます。どちらのAPI を使用するかは、Schema 接続プロパティで以下のいずれかを選択して指定してください。
- SuiteTalk は、NetSuite との通信に使用されるSOAP ベースの従来から提供されているサービスです。幅広いエンティティをサポートし、INSERT / UPDATE / DELETE の操作も対応しています。ただし、SuiteQL API と比べるとデータの取得速度が劣ります。また、サーバーサイドでのJOIN に対応していないため、これらの処理はCData 製品がクライアントサイドで実行します。
- SuiteQL は、より新しいAPI です。JOIN、GROUP BY、集計、カラムフィルタリングをサーバーサイドで処理できるため、SuiteTalk よりもはるかに高速にデータを取得できます。ただし、NetSuite データへのアクセスは読み取り専用となります。
データの取得のみが目的でしたらSuiteQL をお勧めします。データの取得と変更の両方が必要な場合は、SuiteTalk をお選びください。
NetSuite への認証
CData 製品では、以下の認証方式がご利用いただけます。
- トークンベース認証(TBA)はOAuth1.0に似た仕組みです。2020.2以降のSuiteTalk とSuiteQL の両方で利用できます。
- OAuth 2.0 認証(OAuth 2.0 認可コードグラントフロー)は、SuiteQL でのみご利用いただけます。
- OAuth JWT 認証は、OAuth2.0 クライアント認証フローの一つで、クライアント認証情報を含むJWT を使用してNetSuite データへのアクセスを要求します。
トークンベース認証(OAuth1.0)
トークンベース認証(TBA)は、基本的にOAuth 1.0 の仕組みです。この認証方式はSuiteTalk とSuiteQL の両方でサポートされています。管理者権限をお持ちの方がNetSuite UI 内でOAuthClientId、OAuthClientSecret、OAuthAccessToken、OAuthAccessTokenSecret を直接作成することで設定できます。 NetSuite UI でのトークン作成手順については、ヘルプドキュメントの「はじめに」セクションをご参照ください。
アクセストークンを作成したら、以下の接続プロパティを設定して接続してみましょう。
- AuthScheme = Token
- AccountId = 接続先のアカウント
- OAuthClientId = アプリケーション作成時に表示されるコンシューマーキー
- OAuthClientSecret = アプリケーション作成時に表示されるコンシューマーシークレット
- OAuthAccessToken = アクセストークン作成時のトークンID
- OAuthAccessTokenSecret = アクセストークン作成時のトークンシークレット
その他の認証方法については、ヘルプドキュメントの「はじめに」をご確認ください。
- 接続情報の入力が完了したら、「保存およびテスト」をクリックします。
NetSuiteへの接続
NetSuite では、2種類のAPI でデータにアクセスできます。どちらのAPI を使用するかは、Schema 接続プロパティで以下のいずれかを選択して指定してください。
- SuiteTalk は、NetSuite との通信に使用されるSOAP ベースの従来から提供されているサービスです。幅広いエンティティをサポートし、INSERT / UPDATE / DELETE の操作も対応しています。ただし、SuiteQL API と比べるとデータの取得速度が劣ります。また、サーバーサイドでのJOIN に対応していないため、これらの処理はCData 製品がクライアントサイドで実行します。
- SuiteQL は、より新しいAPI です。JOIN、GROUP BY、集計、カラムフィルタリングをサーバーサイドで処理できるため、SuiteTalk よりもはるかに高速にデータを取得できます。ただし、NetSuite データへのアクセスは読み取り専用となります。
データの取得のみが目的でしたらSuiteQL をお勧めします。データの取得と変更の両方が必要な場合は、SuiteTalk をお選びください。
NetSuite への認証
CData 製品では、以下の認証方式がご利用いただけます。
- トークンベース認証(TBA)はOAuth1.0に似た仕組みです。2020.2以降のSuiteTalk とSuiteQL の両方で利用できます。
- OAuth 2.0 認証(OAuth 2.0 認可コードグラントフロー)は、SuiteQL でのみご利用いただけます。
- OAuth JWT 認証は、OAuth2.0 クライアント認証フローの一つで、クライアント認証情報を含むJWT を使用してNetSuite データへのアクセスを要求します。
トークンベース認証(OAuth1.0)
トークンベース認証(TBA)は、基本的にOAuth 1.0 の仕組みです。この認証方式はSuiteTalk とSuiteQL の両方でサポートされています。管理者権限をお持ちの方がNetSuite UI 内でOAuthClientId、OAuthClientSecret、OAuthAccessToken、OAuthAccessTokenSecret を直接作成することで設定できます。 NetSuite UI でのトークン作成手順については、ヘルプドキュメントの「はじめに」セクションをご参照ください。
アクセストークンを作成したら、以下の接続プロパティを設定して接続してみましょう。
- AuthScheme = Token
- AccountId = 接続先のアカウント
- OAuthClientId = アプリケーション作成時に表示されるコンシューマーキー
- OAuthClientSecret = アプリケーション作成時に表示されるコンシューマーシークレット
- OAuthAccessToken = アクセストークン作成時のトークンID
- OAuthAccessTokenSecret = アクセストークン作成時のトークンシークレット
その他の認証方法については、ヘルプドキュメントの「はじめに」をご確認ください。
API Server のユーザー設定
次に、API Server 経由でNetSuite にアクセスするユーザーを作成します。「Users」ページでユーザーを追加・設定できます。やってみましょう。
- 「Users」ページで ユーザーを追加をクリックすると、「ユーザーを追加」ポップアップが開きます。
-
次に、「ロール」、「ユーザー名」、「権限」プロパティを設定し、「ユーザーを追加」をクリックします。
-
その後、ユーザーの認証トークンが生成されます。各ユーザーの認証トークンとその他の情報は「Users」ページで確認できます。
NetSuite 用のAPI エンドポイントの作成
ユーザーを作成したら、NetSuite のデータ用のAPI エンドポイントを作成していきます。
-
まず、「API」ページに移動し、
「 テーブルを追加」をクリックします。
-
アクセスしたい接続を選択し、次へをクリックします。
-
接続を選択した状態で、各テーブルを選択して確認をクリックすることでエンドポイントを作成します。
OData のエンドポイントを取得
以上でNetSuite への接続を設定してユーザーを作成し、API Server でNetSuite データのAPI を追加しました。これで、OData 形式のNetSuite データをREST API で利用できます。API Server の「API」ページから、API のエンドポイントを表示およびコピーできます。
また、CORS を有効にして[Server]とクリックして次のセクションを定義する必要があります。[*]なしですべてのドメインを許可するオプションを選択することもできます。
- Access-Control-Allow-Origin:値を[*]またはAPI Server を呼び出すドメインに設定します。
- Access-Control-Allow-Methods:値を[GET,PUT,POST,OPTIONS]または使用する必要のあるHTTP メソッドに設定します。
- Access-Control-Allow-Headers:[x-ms-client-request-id, authorization, content-type]に設定します。
最後に、URL の一部としてauthtoken を渡すことにより、ユーザーが認証できるようにAPI Server を構成する必要があります。そのために、インストール先のwww/app_data フォルダに移動し、settings.cfg ファイルを変更して[Application] セクションに次の行を追加します。
AllowAuthTokenInURL = true
Swagger メタデータの取得
メタデータを使用してCustom API 接続を作成します。Swagger 定義を取得するには、ブラウザで次の要求を行い、結果のJSON ファイルを保存します。
http://MySite:MyPort/api.rsc/$oas?version=2
API Server を介してNetSuite に接続
以下のステップで、リモートNetSuite を検索する簡単なアプリを作成する方法を説明します。
- Microsoft Power Apps で、[Custom connectors]をクリックします。
- [Create custom connector]をクリックし、[Import an OpenAPI]ファイルを選択します。
- コネクタに名前を付け、JSON ファイルを参照して[Continue]をクリックします。
- 関連する一般情報を入力し、ベースURL が/api.rsc/@myauthtoken (myauthtoken はconfigure API Server ユーザーのAuthToken) の形式であることを確認して[Continue]をクリックします。
- Authentication タイプには[No authentication]を選択します。[Continue]をクリックします。
- アクションと参照の定義を確認し、[Create connector]をクリックします。
- コネクタをテストするには、新しい接続を作成する必要があります。[Test]をクリックし、[Connections]の下の[New Connection]をクリックして[Create]を選択します。
- [Custom connectors]メニューからコネクタに戻り、[Test]をクリックします。ここから使用可能な操作をテストできます。
データソースをPowerApp に接続
以下のステップに従って、PowerApp からNetSuite に接続します。
- Power Apps のメインメニューから[Create an app]をクリックし、オンプレミスまたはクラウドのPowerApp Studio を選択します。
- 空のアプリを選択し、携帯レイアウトまたはタブレットレイアウトのどちらかを選択します。
- [View]タブで[Data Sources]をクリックし、[Add Data Source]をクリックします。
- 作成した接続をクリックしてコネクタをテストします。
ギャラリーの事前設定
以下のステップに従って、NetSuite を検索できる簡単なアプリを作成します。Power Apps の数式を使用してNetSuite の行をギャラリーコントロールの行にバインドします。
[View]タブで[Gallery]->[Vertical]をクリックしてギャラリーを追加します。
-
ギャラリーを選択し、ギャラリー設定の[Advanced]タブでギャラリーの[Items]プロパティをNetSuite に割り当てます。以下の式を使用すると、SalesOrder テーブルの例にアクセスできます。
ForAll(CDataSwaggerAPI.getAllSalesOrder().value, {myCustomerName: CustomerName, mySalesOrderTotal: SalesOrderTotal}) -
要素をクリックし、[Text]プロパティ(UI 要素の[Advanced]タブ) をThisItem.myCustomerName またはThisItem.mySalesOrderTotal に設定してNetSuite 列をUI 要素に割り当てます。
NetSuite のデータの検索
ギャラリーに表示されるレコードをフィルタリングするには、[Screen]にTextInput を追加し、TextInput の[Text]プロパティをクリアしてギャラリーの[Items]プロパティを以下のような式にます。また、必要に応じてTextInput1 をギャラリーのTextInput コントロール名に置き換えます。
If(IsBlank(TextInput1.Text),
ForAll(CDataSwaggerAPI.getAllSalesOrder().value, {myCustomerName: CustomerName, mySalesOrderTotal: SalesOrderTotal}),
ForAll(CDataSwaggerAPI.getAllSalesOrder({'$filter':Concatenate("contains(CustomerName,",TextInput1.Text,")")}).value, {myCustomerName: CustomerName, mySalesOrderTotal: SalesOrderTotal}))
この式は、API Server がリモートNetSuite に対して実行するOData クエリを作成し、最初にすべてのレコードをアプリに取り込むことをせずに現在のデータに対して検索が実行されるようにします。 サポートされているOData の詳細については、API Server のヘルプドキュメントを参照してください。
NetSuite のデータの編集
以下のステップに従って、ギャラリーで選択されたNetSuite レコードのフィールドを表示する編集可能な画面をロードします。
- [Insert]タブで、[New Screen]->[Blank]とクリックし、スクリーンの名前を[Details]に設定します。
- ギャラリーを新しいスクリーンに結び付けます。ギャラリーの最初のエントリで矢印ボタンを選択し、[Advanced]プロパティの[OnSelect]フィールドに以下のように入力します。
Navigate( Details, None )
- [Details]スクリーンの[Insert]タブで、[Id]と[Id]値の別のラベルを追加します。[Text]プロパティをBrowseGallery.Selected.Id に設定します。
各カラムについて、以下のことを行う必要があります。Custom API の場合、フォーム要素はAPI Server に対してどのリクエストを作成する必要があるかを検出できないため、データ変更式を手動で書く必要があることに注意してください。
- フィールドのラベルを追加します。
- [Text]メニューからのテキスト入力を画面に追加し、text プロパティをギャラリーから選択したアイテムの値に設定します。(例: BrowseGallery.Selected.myCustomerName).
アプリに基本的な更新機能とナビゲーションを提供するには、[Submit]ボタンと[Back]ボタンを追加します。
- [Submit]ボタンでOnChange プロパティを以下のように設定します。
CDataSwaggerAPI.updateSalesOrder(BrowseGallery.Selected.myId,BrowseGallery.Selected.myId,{CustomerName:TextInput1.Text,SalesOrderTotal:TextInput2.Text}) - [Back]ボタンの場合は、[OnSelect]フィールドを以下のように設定します。
Navigate( BrowseScreen, None )
これで、モバイルアプリまたはタブレットアプリでNetSuite を参照、検索、更新できるようになりました。