TripPin パート 1 - OData サービス用のデータ コネクタ

このマルチパート チュートリアルでは、Power Query 用の新しいデータ ソース拡張機能の作成について説明します。 このチュートリアルは順番に実行することを目的としています。各レッスンは前のレッスンで作成したコネクタに基づいて構築され、コネクタに新しい機能が段階的に追加されます。

このレッスンの内容:

  • Visual Studio SDK を使用して新しいデータ コネクタ プロジェクトを作成する
  • ソースからデータをプルする基本関数を作成する
  • Visual Studio でコネクタをテストする
  • コネクタを Power BI Desktop に登録する

基本的な OData コネクタの作成

このセクションでは、新しいデータ コネクタ プロジェクトを作成し、いくつかの基本情報を入力した後、そのコネクタを Visual Studio でテストします。

Visual Studio を起動し、新しいプロジェクトを作成します。 [Power Query] フォルダーで、データ コネクタ プロジェクトを選択します。 このサンプルでは、プロジェクト名を TripPin に設定します。

VSProject.

TripPin.pq ファイルを開き、次のコネクタ定義を貼り付けます。

section TripPin;

[DataSource.Kind="TripPin", Publish="TripPin.Publish"]
shared TripPin.Feed = Value.ReplaceType(TripPinImpl, type function (url as Uri.Type) as any);

TripPinImpl = (url as text) =>
    let
        source = OData.Feed(url)
    in
        source;

// Data Source Kind description
TripPin = [
    Authentication = [
        Anonymous = []
    ],
    Label = "TripPin Part 1 - OData"
];

// Data Source UI publishing description
TripPin.Publish = [
    Beta = true,
    Category = "Other",
    ButtonText = { "TripPin OData", "TripPin OData" }
];

このコネクタ定義には、次の内容が含まれています。

  • TripPin コネクタのデータ ソース定義レコード
  • 暗黙的 (匿名) がこのソースの唯一の認証の種類であるという宣言
  • OData.Feed を呼び出す実装を含んだ関数 (TripPinImpl)
  • パラメーター型を Uri.Type に設定する共有関数 (TripPin.Feed)
  • Power BI の [データの取得] ダイアログにコネクタが表示されるようにするための、データ ソース公開レコード

TripPin.query.pq ファイルを開きます。 現在の内容を、エクスポートした関数の呼び出しに置き換えてます。

TripPin.Feed("https://services.odata.org/v4/TripPinService/")

[開始] ボタンを選択して、M クエリ ユーティリティを起動します。

<project>.query.pq ファイルは、拡張機能を Power BI Desktop の bin フォルダーに展開せずにテストするために使用されます。 [開始] ボタンを選択する (または F5 キーを押す) と、拡張機能が自動的にコンパイルされ、M クエリ ユーティリティが起動します。

クエリの初回実行時には、資格情報エラーが発生します。 Power Query では、ホスティング アプリケーションによって、このエラーが資格情報プロンプトに変換されます。 Visual Studio では、資格情報とデータ ソース パスが欠落しているデータ ソースを示す、同様のプロンプトが表示されます。 最短のデータ ソース パスの (https://services.odata.org/) を選択すると、そのパスの下のすべての URL に資格情報が適用されます。

資格情報の種類として [匿名] を選択し、[資格情報の設定] を選択します。

Image of M Query Output dialog, with the Errors tab selected, and the Data Source Path filled in and the Credential Type set to Anonymous.

[OK] を選択してダイアログを閉じ、もう一度 [開始] ボタンを選択します。 クエリの実行状態のダイアログが表示され、最終的に、クエリから返されたデータを示すクエリ結果テーブルが表示されます。

Query results.

テスト ファイル内でいくつかの異なる OData URL を試して、それぞれどのような結果が返されるのかを確認できます。 次に例を示します。

  • https://services.odata.org/v4/TripPinService/Me
  • https://services.odata.org/v4/TripPinService/GetPersonWithMostFriends()
  • https://services.odata.org/v4/TripPinService/People

TripPin.query.pq ファイルには、単一ステートメント、let ステートメント、またはフル セクション ドキュメントを含めることができます。

let
    Source = TripPin.Feed("https://services.odata.org/v4/TripPinService/"),
    People = Source{[Name="People"]}[Data],
    SelectColumns = Table.SelectColumns(People, {"UserName", "FirstName", "LastName"})
in
    SelectColumns

Fiddler を開いて HTTP トラフィックをキャプチャし、クエリを実行します。 マッシュアップ コンテナ プロセスによって生成された、services.odata.org へのいくつかの異なる要求が表示されるはずです。 サービスのルート URL にアクセスすることで 302 ステータスが発生し、より長いバージョンの URL にリダイレクトされるのが確認できます。 その後のリダイレクトも、基本ライブラリ関数から "無償" で取得される動作です。

URL を見ると、注目するべき点の 1 つとして、SelectColumns ステートメントで発生したクエリ フォールディングが確認できます。 https://services.odata.org/v4/TripPinService/People?$select=UserName%2CFirstName%2CLastName

クエリに変換をさらに追加すれば、生成される URL にどのような影響が出るかを確認できます。

この動作に注目することは重要です。 明示的なフォールディング ロジックを実装していない場合でも、コネクタは OData.Feed 関数からこれらの機能を継承します。 M ステートメントはコンポーザブルです。フィルター コンテキストは、可能な場合は必ず、1 つの関数から別の関数へと受け渡されます。 これは、概念としては、コネクタ内で使用されるデータ ソース関数が認証コンテキストと資格情報を継承するのと似ています。 この後のレッスンでは、ネイティブのフォールディング機能を備えた OData.Feed を、その機能がない Web.Contents に置き換えていきます。 同じレベルの機能を実現するには、Table.View インターフェイスを使用し、独自の明示的なフォールディング ロジックを実装する必要があります。

Power BI Desktop での拡張機能の読み込み

Power BI Desktop で拡張機能を使用するには、コネクタ プロジェクトの出力ファイル (TripPin.mez) を Custom Connectors ディレクトリにコピーする必要があります。

  1. Visual Studio で、メニュー バーから [ビルド] | [ソリューションのビルド] (F6) を選択します。 これにより、プロジェクトの .mez ファイルが生成されます。 既定では、これはプロジェクトの bin\Debug フォルダーに保存されます。
  2. [My Documents]\Power BI Desktop\Custom Connectors ディレクトリを作成します。
  3. このディレクトリに、拡張機能ファイルをコピーします。
  4. Power BI Desktop で、[(非推奨) 検証または警告せずに、あらゆる拡張機能の読み込みを許可する] をオンにします ([ファイル]>[オプションと設定]>[オプション]>[セキュリティ]>[データ拡張機能] の下)。
  5. Power BI Desktop を再起動します。
  6. [データの取得] > [その他] を選択して、[データの取得] ダイアログを表示します。

検索ボックスに名前を入力して、拡張機能を見つけることができます。

Get Data Dialog.

関数名を選択し、[接続] を選択します。 サード パーティのメッセージが表示されたら、[続行] を選択して続行します。 関数呼び出しダイアログが表示されます。 サービスのルート URL (https://services.odata.org/v4/TripPinService/) を入力し、[OK] を選択します。

Invoke Function.

このデータ ソースにアクセスするのは初めてなので、資格情報の入力を求めるメッセージが表示されます。 最短の URL が選択されているのを確認し、[接続] を選択します。

Image of credential prompt set to Anonymous and the level setting set to the shortest URL.

シンプルなデータ テーブルが取得される代わりに、ナビゲーターが表示されます。 これは、OData.Feed 関数が返すテーブルの上に特別なメタデータが適用されていて、Power Query によってナビゲーション テーブルとして表示されるためです。 このチュートリアルでは、今後のレッスンで、独自のナビゲーション テーブルを作成し、カスタマイズする方法について説明します。

Nav Table.

[Me] テーブルを選択し、[データの変換]を選択します。 列 (の多く) には、既に型が割り当てられていることに注目してください。 これは、基になる OData.Feed 関数のもう 1 つの機能です。 Fiddler で要求を見ると、サービスの $metadata ドキュメントがフェッチされているのがわかります。 これはエンジンの OData 実装によって自動的に行われ、これにより、サービスのスキーマ、データ型、およびリレーションシップが決定されます。

Me Record.

まとめ

このレッスンでは、OData.Feed ライブラリ関数に基づくシンプルなコネクタの作成について説明しました。 ご覧いただいたように、OData 基本関数を基にして、ほんのわずかなロジックでフル機能のコネクタを作成できます。 拡張機能に対応したその他の関数 (ODBC.DataSource など) でも、同様の機能を提供できます。

次のレッスンでは、OData.Feed を、より低機能の関数 (Web.Contents) に置き換えます。 レッスンごとに、追加のコネクタ機能 (ページング、メタデータ/スキーマ検出、OData クエリ構文へのクエリ フォールディングなど) を実装していき、カスタム コネクタで OData.Feed と同様の機能をサポートできるようにしていきます。

次のステップ

TripPin パート 2 - REST サービス用のデータ コネクタ