Power BI Desktop の外部ツールの作り方
はじめに
先日、展示会(4/24~26)に出展して、お客様との「データ活用って、中小企業でやるのは難しい」という会話の流れで、「Power BI なら、なんとかなるんじゃないの?」となったのですが、お恥ずかしい話、もちろん Power BI という名前は知ってるけど、おいしいかどうか全く知らず「何それ?おいしいの?」レベルだったので、やってみました。
何それ?
私と同レベルの「何それ?」の人は、まず、これをやりましょう。1日で終わるはず。(私は、ここに行き着く時間を含めて3日(4/30~5/2)かかったけど)
やってみる
上のトレーニングも Power BI も良くできていることはわかりました。何を分析するか決まっていて、作業するだけなら、これで良いのでしょうが、何を分析するか?から試行錯誤するなら、Power BI を使いながらも、Power BI の外部の情報も欲しいのではないか?ということで、うろうろしていると、どうやら「外部ツール」というものがあるらしいということがわかりました。
ですが「以上。」ということで、マイクロソフトさんの情報もここだけ。グーグル先生で探しても日本語の情報は見つからず「もう Power BI あきらめるか」と思っていたところ、見つけました。
これだ!すばらしい。
ここに動画も資料もソースコードもあるから終了なんだけど、動画中の言葉ではないが「Windows Form 2002 は、ジョージ・ブッシュの大統領1期目」なので、自分を含めて浦島太郎状態の(生まれてない?)人もいるだろうから記事にしてみます。
準備
以下をインストールします。(VSCodeではありません。Visual Studioです)
- Visual Studio Community 2022
- Power BI Desktop
ソースコード
を以下にフォークしました(↑フォーク1なのは、私だな)
環境構築
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 が嫌いで、エディタで書いて、スクリプトでビルドして、たまーにデバッガーしか使わない人になった理由は、プロジェクトだのなんだのと触ってほしくないものを隠す(ちゃんとできる人にとっては、お前が邪魔だ)からなので、この機能はうれしい。(同じ理由で、エクスプローラの拡張子と隠しファイルのチェックも必ず入れてるし、ls
は ls -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.json
のPath
をデバックモジュールのパスに変更します。変更したら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
に書きます。
{
"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のデバック実行状態での連携ができますよ。というのが、このあたり。
そして、Power BI 側のデータをとっているのは、このあたり。
そして、なめるなら、このあたりのように書く(書いてないけど)
Microsoft.AnalysisServices.Tabular のリファレンス
伝統的なマイクロソフト社のアクセス方法(Dataset)にのっとっている。(古き、悪しき、芋づる式であるが、ここはメタデータだと思うので、オンメモリでも破綻しないと思う)
以下は、デモでやっているように、Power BI desktop ユーザーが自動化したいであろうサンプルたち
おわりに
ということで、独自の外部ツールを開発してみたいと思います。
Discussion