PCA 商魂・商管とExcel 予算データで予実管理をビジュアライズする方法

#はじめに
Microsoft Power BI はマイクロソフト社が提供するBI ツールです。RDBの他にAzureやExcel、Accessなどのファイルデータ、Dynamics、SharePointをはじめとするクラウドサービスなど、様々なデータソースに対応していますが、CData ODBC Driversを使うと、さらに多種多様なデータソースを活用することが可能となります。今回は、PCA商魂・商管DXのデータをPower BIからビジュアライズしてみます。PCA商魂・商管DXは、ピー・シー・エー株式会社が提供するSaaS型の基幹業務ソフトです。

#前提
- [Microsoft Power BI Desktop](https://powerbi.microsoft.com/ja-jp/desktop/)がインストール済みである

#使用するCData製品
- [CData ODBC Driver for PCA Sales](https://www.cdata.com/jp/drivers/pcasales/odbc/)

#CData ODBC Driver for PCA Salesのインストールと接続設定
インストール後は「DSN構成」画面が立ち上がります。これはインストール先のフォルダにあるConfigureODBC.exeファイルから起動することもできます。
<img width="488" alt="DSNConfig.png" src="https://qiita-image-store.s3.amazonaws.com/0/288655/d1293a82-73b4-9e6b-0360-48200ceebd95.png">

「DSN構成」では、下記の項目を入力する必要があります。

| PCA Salesの接続情報 | 設定項目 |
|:-----------------|:---------------|
| クライアントID | OAuth Client Id |
| クライアントシークレット | OAuth Client Secret |
| コールバックURL | Callback URL |
| デフォルトデータ領域 | Default Data Area |
| プロダクトコード | Product Code |
| Web APIサーバのURL | Url |

※コールバックURL、クライアントID、クライアントシークレットについては、[PCA Web API 利用準備](https://qiita.com/sugimomoto/items/8837226105891c92d574#pca-web-api-利用準備)をご覧ください。

入力後、「接続テスト」ボタンをクリックするとOAuth認証のためアプリケーションの認証画面がブラウザで立ち上がります。ここでは、「サービスユーザーID」と「パスワード」を入力し、サービス認証をクリックします。
<img width="307" alt="PCAExcelAddInAuth1.png" src="https://qiita-image-store.s3.amazonaws.com/0/288655/22b11321-038c-e85b-f522-7b8a85b59f76.png">

続いて、PCA商魂・商管DXのユーザーアカウントの情報を入力し、ログオンをクリックします。
<img width="263" alt="PCAExcelAddInAuth2.png" src="https://qiita-image-store.s3.amazonaws.com/0/288655/9b6a9988-3a3e-9f4f-743e-5d410b1b4595.png">

ログオンすると、アクセス許可画面が表示されるので、内容を確認の上、「データの利用を許可する」をクリックします。
<img width="318" alt="PCAExcelAddInAuth3_mod.png" src="https://qiita-image-store.s3.amazonaws.com/0/288655/94cabfa3-0803-3b26-7019-aae0f024f568.png">

ブラウザで「OAuth Authorization Successful!」の画面が表示されれば、認証完了です。
<img width="349" alt="PCAAuchSucceed.png" src="https://qiita-image-store.s3.amazonaws.com/0/288655/d37f40a2-0d32-1808-f149-b7b38f99a53f.png">

その後、Web APIサーバへの接続が完了すると、下記のようなダイアログが表示さます。最後に、「DSN構成」画面で「OK」をクリックして接続を確立します。
<img width="159" alt="PCAExcelAddInConnected.png" src="https://qiita-image-store.s3.amazonaws.com/0/288655/7192f841-27b5-ab8b-5f89-4703d10ed347.png">

#データを取得・加工する
Microsoft Power BI Desktopを起動します。起動すると下記のダイアログが表示されるので「データを取得」をクリックします。
![startBI.PNG](https://qiita-image-store.s3.amazonaws.com/0/288655/880ac530-ee9b-00cc-23c8-c38bf5407a2b.png)

「データの取得」ダイアログが表示されるので、「その他 > ODBC」を選択して「接続」をクリックします。
![selectDataSource2.PNG](https://qiita-image-store.s3.amazonaws.com/0/288655/2f082666-b25c-c607-702a-15e0fc8ba06f.png)

「ODBCからインポート」ダイアログが表示されるので、「データソース名（DSN）」に「CData PCASales Source」を選択します。
![selectDataSource3.PNG](https://qiita-image-store.s3.amazonaws.com/0/288655/cde8df43-bcbc-bf5d-2be9-8cd48a264b91.png)

「ナビゲータ」画面が表示されます。左側の階層を開いていくと、テーブルのリストが表示されます。適当なテーブルを選択すると右側にデータのプレビューが表示されますので「読み込み」ボタンをクリックします。今回は、下記のテーブルを読み込みます。

- InputJUC : 各受注案件
- MasterBumon : 会社の部門名
- MasterSms : 商品マスター

![selectTable.PNG](https://qiita-image-store.s3.amazonaws.com/0/288655/a630c0f2-8d00-21c0-50cc-6e8335749281.png)

データの読み込みが完了すると、下記のような「レポート」のキャンパスの画面が表示されます。画面右側には「フィールド」の欄に選択したテーブルの各フィールド名が表示されます。また画面左にある3つのアイコンから「レポート」、「データ」、「リレーションシップ」の3つの画面を行き来できます。「データ」画面では、読み込んだデータそのものを見ることができます。
![selectTable2.PNG](https://qiita-image-store.s3.amazonaws.com/0/288655/b9407544-4819-a846-e3c4-ce85015f7584.png)

先ず、テーブル名を分かりやすくするためリネームします。テーブル名を右クリックして表示されるメニューから「名前の変更」を選択して変更します。

- InputJUC　→　受注案件
- MasterBumon　→　部門
- MasterSms　→　商品

![renameTable.PNG](https://qiita-image-store.s3.amazonaws.com/0/288655/9a18756d-3749-aed1-0409-78b51aecd53c.png)

データを読み込んだ後は必要に応じてデータを加工します。ここでは「受注案件」テーブルを加工します。「クエリを編集」をクリックし「クエリエディター」を開きます。クエリエディターでは左側のペインで「受注案件」を選択した状態で「カスタム列」をクリックします。![openQueryEditor_arrow.png](https://qiita-image-store.s3.amazonaws.com/0/288655/7a432ef1-8003-a7f0-c998-c50f3ecadc47.png)

下記のようなウィンドウが開きますので「新しい列名」には“受注日”、式は下記のコードをコピー＆ペーストして「OK」をクリックください。受注案件を月単位で集計したいため受注日の情報が必要となりますが「受注案件」テーブルが元々持っている受注日フィールド、「InputJUCH_Juchubi」は数値データとなっているため日付情報として認識されません。そこで新しく「受注日」フィールドを追加します。
![customRow.PNG](https://qiita-image-store.s3.amazonaws.com/0/288655/83d19b50-5a52-f1f3-4f4f-d62e31326636.png)

```
= Date.From(Text.From([InputJUCH_Juchubi]))
```

同じ手順で“商品コード”フィールドを追加します。式は下記のとおりです。元データは「InputJUCDList」フィールドの中に商品コードの値を持っていますが、XML形式で商品コードとして使えないため、下記の式で先頭の商品コードを1つ抽出します。

```
Text.Middle([InputJUCDList], Text.PositionOf([InputJUCDList],"</SyohinCode>") - 4, 4)
```

その後は下記のように右端にカラムが追加されます。「閉じて適用」をクリックして「クエリエディター」を閉じてください。
![addRow.PNG](https://qiita-image-store.s3.amazonaws.com/0/288655/7c128655-82a7-15b3-d7d1-cda2fdc23f19.png)

次に、受注案件を月単位で集計するため使う日付テーブルを追加します。先ず、「モデリング」タブのメニューにある「新しいテーブル」をクリックします。下記のような画面が開きますので、「テーブル =」と書かれたエディアの中に、下記の式をコピー＆ペーストしてください。
![dateTable.PNG](https://qiita-image-store.s3.amazonaws.com/0/288655/3222ae8a-e4cc-44e9-a82e-a2855bb138c2.png)

```
dateTable = var FullCalendar = ADDCOLUMNS(CALENDAR("2017/1/1","2018/12/31"),"EveryDay",FORMAT([Date],"yyyy/MM/dd"),"Year-Month",LEFT(FORMAT([Date],"yyyy/MMdd"),7))
return 
SUMMARIZE(FullCalendar,[EveryDay],[Year-Month])
```

数式入力後は、下記のようにテーブルが作成されます。
![dateTable2.PNG](https://qiita-image-store.s3.amazonaws.com/0/288655/7f63d344-c271-7b2a-739c-986cd5b56245.png)

最後に、下記のような予算データをExcelファイルから読み込みます。先ほどと同様に「データを取得」から「Excel」を選択しExcelファイルを読み込みます。テーブル名は「Budget」とします。
![Budget.PNG](https://qiita-image-store.s3.amazonaws.com/0/288655/9445c7f2-a333-ea76-4c16-415ec8284853.png)

Excelファイル読み込み後は「クエリエディター」を開き、テーブルを加工します。1番下の行と1番右の列は不要なので削除し、また「1行目をヘッダーとして使用」をクリックします。
![queryEditor2.PNG](https://qiita-image-store.s3.amazonaws.com/0/288655/b564428d-5df4-e348-e492-db606d7c987d.png)

次に「部門」カラムを選択後に右クリックし、表示されるメニューから「その他の列のピボット解除」をクリックします。
![queryEditor3.PNG](https://qiita-image-store.s3.amazonaws.com/0/288655/a30f00d7-f579-671a-ebae-af89cea70f6e.png)

下記のようにテーブルが変換されます。「属性」カラムが作られるので、分かりやすいように「年月」とリネーム後「閉じて適用」をクリックし、「クエリエディター」を閉じます。
![queryEditor4.PNG](https://qiita-image-store.s3.amazonaws.com/0/288655/5accdbc1-bf39-34c1-01b0-50613bea9d85.png)

#リレーションを設定する
ここで、これまで追加・加工したテーブルのリレーションを設定します。テーブルの適当なフィールドを、もう1つのテーブルの適当なフィールドにドラッグ＆ドロップすることで、リレーションの設定を行います。下記のようにリレーションを設定します。

- 「部門」テーブルの「BumonCode」フィールド　→　「受注案件」テーブルの「InputJUCH_BumonCode」フィールド
- 「受注案件」テーブルの「受注日」フィールド　→　「dateTable」テーブルの「EveryDay」フィールド
- 「Budget」テーブルの「年月」フィールド　→　「dateTable」テーブルの「EveryDay」フィールド
- 「受注案件」テーブルの「商品コード」フィールド　→　「商品」テーブルの「SyohinCode」フィールド
![setRelation_arrow.png](https://qiita-image-store.s3.amazonaws.com/0/288655/1192b825-2986-8fae-6270-b6f9f62566a0.png)

#メジャーを追加する
「データ」画面で適当なテーブルを選択した状態で「モデリング」タグから「新しいメジャー」をクリックすると、エディターが有効となる（デフォルトは“メジャー =”）ため数式を入力します。
※数式の左辺が、そのままメジャーの名称となります。
![addMeasure.PNG](https://qiita-image-store.s3.amazonaws.com/0/288655/9229dbe2-0e4a-04ac-dc62-2d5d462f72d0.png)

各テーブルに追加するメジャーは下記のとおりです。

- Budgetテーブル

```
予算総額 = SUM(Budget[値])
```

- 受注案件テーブル

下記の3つのメジャーを追加します。

```
最終受注日 = MAX('受注案件'[受注日])
```

```
受注総額 = SUM('受注案件'[InputJUCT_KingakuGokei])　// InputJUCT_KingakuGokei は受注金額のフィールドです
```

```
予算達成率 = '受注案件'[受注総額] / 'Budget'[予算総額]
```


#ビジュアライズする
「レポート」画面に移動し、適当な位置に「積み上げ縦棒グラフ」を追加し、下記のように各項目に適当なフィールドをドラッグ＆ドロップします。

- 軸　：　「dateTable」テーブルの「Year-Month」フィールド
- 凡例　：　「部門」テーブルの「BumonMei」フィールド
- 値　：　「受注案件」テーブルの「InputJUCT_KingakuGokei」フィールド

![visualize1_arrow.png](https://qiita-image-store.s3.amazonaws.com/0/288655/32f48997-2580-d33e-b62e-e2fefcb8b7a6.png)

グラフは必要に応じて「並べ替え」を行ってください。下記のように「並べ替え条件」で「Year-Month」を選択すると、グラフの棒が時系列にソートされます。このグラフでは、毎月の実績が部門で内訳されて可視化されます。
![visualize1_sort.PNG](https://qiita-image-store.s3.amazonaws.com/0/288655/be3fcecd-4848-ab36-0b9c-9177eaa45654.png)

続いて、「集合縦棒グラフ」を追加します。各項目のフィールドは下記のとおりです。

- 軸　：　「dateTable」テーブルの「Year-Month」フィールド
- 値　：　「Budget」テーブルの先ほど追加した「予算総額」メジャーと「受注案件」テーブルの「InputJUCT_KingakuGokei」フィールド

このグラフでは毎月の予算と実績を比較することができます。
![visualize2.PNG](https://qiita-image-store.s3.amazonaws.com/0/288655/b9c83654-bbb4-d74f-42ff-9799631b04be.png)

さらに、3つの「カード」を追加します。先ほど追加したメジャー「最終受注日」、「受注総額」、「予算達成率」を選択します。
![visualize3.PNG](https://qiita-image-store.s3.amazonaws.com/0/288655/d485e2c3-5e74-1fe7-98a1-66944c51dcc3.png)

「受注総額」と「予算達成率」の書式を変更します。データ画面で書式を変更するメジャーを選択し、「モデリング」タブの「書式設定」メニューで「書式」を選択します。「受注総額」の書式は「通貨全般」、「予算達成率」は「パーセンテージ」を選択します。
![visualize4.PNG](https://qiita-image-store.s3.amazonaws.com/0/288655/68b88f33-68a2-eb2c-cb21-91326d9a1457.png)

最後に「テーブル」を追加し、「値」の項目に下記の項目を追加します。

- 「受注案件」テーブル

  - 「InputJUCH_Id」フィールド　※受注案件のID
  - 「受注日」フィールド
  - 「TokuisakiMei1」フィールド　※顧客名
  - 「InputJUCT_KingakuGokei」フィールド　※受注金額
  - 「商品コード」フィールド

- 「商品」テーブル

  - 「SyohinMei」フィールド　※商品名

また、このテーブルには、全てのレコードではなく、金額が大きい案件のみを表示したいのでフィルターを追加します。下記のように「ビジュアルレベルフィルター」の中から金額のフィールドである「InputJUCT_KingakuGokei」に「次の値より大きい」を選択し、適当な値を設定します。
![visualize5.PNG](https://qiita-image-store.s3.amazonaws.com/0/288655/f6996eb3-d20f-7b7a-84ca-e92fed83a24c.png)

視覚化コンポーネントの見出しや色などを設定し、最終的には下記のようなダッシュボードが完成しました。
![result.PNG](https://qiita-image-store.s3.amazonaws.com/0/288655/43d8dbed-1a89-e5b9-b47d-005f0d3ef46c.png)

必要に応じて左上の保存ボタンをクリックして作成したレポートを「Power BI ファイル（*.pbix）」として保存してください。今回は、Microsoft Power BI Desktopを使ってPCA商魂・商管DXのデータをビジュアライズしてみました。