💪

Power BI Desktop の外部ツールの作り方

2024/05/04に公開

はじめに

先日、展示会(4/24~26)に出展して、お客様との「データ活用って、中小企業でやるのは難しい」という会話の流れで、「Power BI なら、なんとかなるんじゃないの?」となったのですが、お恥ずかしい話、もちろん Power BI という名前は知ってるけど、おいしいかどうか全く知らず「何それ?おいしいの?」レベルだったので、やってみました。

何それ?

私と同レベルの「何それ?」の人は、まず、これをやりましょう。1日で終わるはず。(私は、ここに行き着く時間を含めて3日(4/30~5/2)かかったけど)
https://powerbi.microsoft.com/ja-jp/diad/

やってみる

上のトレーニングも Power BI も良くできていることはわかりました。何を分析するか決まっていて、作業するだけなら、これで良いのでしょうが、何を分析するか?から試行錯誤するなら、Power BI を使いながらも、Power BI の外部の情報も欲しいのではないか?ということで、うろうろしていると、どうやら「外部ツール」というものがあるらしいということがわかりました。
https://learn.microsoft.com/ja-jp/power-bi/transform-model/desktop-external-tools

ですが「以上。」ということで、マイクロソフトさんの情報もここだけ。グーグル先生で探しても日本語の情報は見つからず「もう Power BI あきらめるか」と思っていたところ、見つけました。
https://www.powerbidevcamp.net/sessions/session31/

これだ!すばらしい。

ここに動画も資料もソースコードもあるから終了なんだけど、動画中の言葉ではないが「Windows Form 2002 は、ジョージ・ブッシュの大統領1期目」なので、自分を含めて浦島太郎状態の(生まれてない?)人もいるだろうから記事にしてみます。

準備

以下をインストールします。(VSCodeではありません。Visual Studioです)

  • Visual Studio Community 2022
  • Power BI Desktop

https://visualstudio.microsoft.com/ja/vs/community/
https://powerbi.microsoft.com/ja-jp/downloads/

ソースコード

https://github.com/PowerBiDevCamp/DevCampExternalToolDemo
を以下にフォークしました(↑フォーク1なのは、私だな)
https://github.com/take0a/DevCampExternalToolDemo

環境構築

Visual Studio を起動して、最初のダイアログで「開始する」「リポジトリのクローン」を選びます。「リポジトリの場所」は、GitHub のリポジトリの URL を貼ります。
私の場合はhttps://github.com/take0a/DevCampExternalToolDemo.gitそうすると、パスはC:\Users\araki\Source\Repos\DevCampExternalToolDemoになるので、「クローン」します。

ソリューションエクスプローラが「▲このプロジェクトは、インストールされていないバージョンの.NETをターゲットにしています。」と言ってきた場合は、.NET 6を要求しているので、「インストール」します。(.NET のバージョンも整数になって、毎年になって、サポートが長いのと短いのが交互になって、時代の移り変わりを感じます。)

で、「ビルド」から「ソリューションのビルド」します。Visual Studio をインストールしたばかりの人は、たぶんエラーになります。
ソリューションエクスプローラの「依存関係」の「パッケージ」で右クリックして「NuGetパッケージの管理」へ行って「このソースでは利用できません」となっていたら、歯車のアイコン(いろんなメニューの設定とかオプションとかでも同じところへ行く)で「オプション」ダイアログを開いて「NuGetパッケージマネージャ」の「パッケージソース」を開きます。

上の「+」ボタンを押して、名前をNuGet.org、ソースをhttps://api.nuget.org/v3/index.jsonにします。これが追加されると、パッケージ管理対象となって、パッケージを持ってきてくれるので、ビルドできます。(自前でやってるなら、最初から登録しておけばいいのに。と思うのだけど、オープンであることが大事なんだろうな(歴史的にも))

ビルドが成功して、ソリューションエクスプローラの下のタブを「Git変更」に切り替えるとウジャウジャいるので、「変更を無視する」すると.gitignoreに追加されます。が、「おいおい、そうじゃなくて、bin の下全部にしとけよ」と思う人は、ソリューションエクスプローラの上のアイコンで「すべてのファイルを表示」すると、.gitignore が見えるので、そのまま編集できます。

関係ないけど、個人的に、Eclipse とか Visual Studio が嫌いで、エディタで書いて、スクリプトでビルドして、たまーにデバッガーしか使わない人になった理由は、プロジェクトだのなんだのと触ってほしくないものを隠す(ちゃんとできる人にとっては、お前が邪魔だ)からなので、この機能はうれしい。(同じ理由で、エクスプローラの拡張子と隠しファイルのチェックも必ず入れてるし、lsls -alだ。最後のは、パイプでファイル処理するからlsで正解なのだが)

試す

Power BI Desktop を起動します。
「開く」で一番下の「このデバイスを参照する」から、クローンしたリポジトリのDevCampExternalToolDemo\PBIX\COVID-19 US.pbixを開きます。(これも、一番下のわかりにくいところに置きやがって、なんでもかんでもクラウドに置かせようとするな。という爺です)

Visual Studio からデバック実行(上のツールバーの緑の三角形の再生ボタン)でDevCampExternalToolDemoを動かします。
「Dataset Connection」の「Connect」で「localhost:xxxxx」(xxxxxはランダムなポート番号)を選択すると、Youtubeの状態になります。

次にリポジトリのDevCampExternalToolDemo\DevCampExternalToolDemo\DeployExternalTool\DevCampExternalToolDemo.pbitool.jsonPathをデバックモジュールのパスに変更します。変更したらC:\Program Files (x86)\Common Files\Microsoft Shared\Power BI Desktop\External Toolsフォルダにコピーします。このフォルダが無ければ作ります。(コピー先を直接編集するには、管理者権限で起動したエディタが必要です。)

Power BI Desktop を再起動すると「外部ツール」タブとその中にExternal Tool Demoアイコンが作られます。Product Sales.pbixを開いて、アイコンから起動すると、Youtubeの状態になります。

これで、このデモの作者と同じ実行可能な開発環境が構成されました。

つぶやく

外部ツールの仕組みは、マイクロソフトさんの貴重な2ページ内の図のとおりです。

古き良き時代の接続と同様、ホスト名とポート番号とデータベース名が渡されるので接続します。何を渡して欲しいかは、先程の JSON ファイルのargumentsに書きます。

DevCampExternalToolDemo.pbitool.json
{
  "version": "1.0",
  "name": "External Tool Demo",
  "description": "A developer sample for building external tools for Power BI Desktop.",
  "path": "C:\\(略)\\bin\\Debug\\net6.0-windows\\DevCampExternalToolDemo.exe",
  "arguments": "\"%server%\" \"%database%\"",
  "iconData": "data:image/png;base64,(略)"
}

この情報で接続に行くのですが、Power BI Desktop 固定、同一マシン固定にすれば、OSからプロセス選んで、OSからTCPのListenを拾えば、渡してくれなくても繋ぎにいけます。こうすることで、外部ツールの起動を Power BI Desktop任せにせず、Visual Studio主体にできるので、Visual Studioのデバック実行状態での連携ができますよ。というのが、このあたり。

https://github.com/take0a/DevCampExternalToolDemo/blob/main/DevCampExternalToolDemo/Services/PowerBiDesktopUtilities.cs#L18-L41

そして、Power BI 側のデータをとっているのは、このあたり。

https://github.com/take0a/DevCampExternalToolDemo/blob/main/DevCampExternalToolDemo/Services/TomApi.cs#L77-L94

そして、なめるなら、このあたりのように書く(書いてないけど)

https://github.com/take0a/DevCampExternalToolDemo/blob/main/DevCampExternalToolDemo/Services/TomApi.cs#L106-L130

Microsoft.AnalysisServices.Tabular のリファレンス
https://learn.microsoft.com/ja-jp/dotnet/api/microsoft.analysisservices.tabular?view=analysisservices-dotnet

伝統的なマイクロソフト社のアクセス方法(Dataset)にのっとっている。(古き、悪しき、芋づる式であるが、ここはメタデータだと思うので、オンメモリでも破綻しないと思う)

以下は、デモでやっているように、Power BI desktop ユーザーが自動化したいであろうサンプルたち

https://github.com/take0a/DevCampExternalToolDemo/blob/main/DevCampExternalToolDemo/Services/TomApi.cs#L133

おわりに

ということで、独自の外部ツールを開発してみたいと思います。

GitHubで編集を提案
株式会社ROBONの技術ブログ

Discussion