【BluePrism】DBを活用したマスタ管理

##概要
UiPathでロボットを作っていたとき、**「設定マスタ」**ファイルをExcelであらかじめ用意しておき、
dictionary型の変数に格納して使い回していました。

BPの場合、dictionary変数は作れなさそうだったので、前述の方法は断念。

**環境変数**を使えばマスタ管理はできそうなのですが、
ロボットが増えたときに、環境変数が大量にできるのは避けたいなーとも思う。。。
（ロボットごとに環境変数をまとめておくだけなら、命名規則で解決すると思います）

非エンジニア向きではないですが。。。
今回は**SQLServerにマスタを作って管理する方法**を試したいと思います。

##SQL Serverにマスタテーブルを作る
**Microsoft SQL Server Management Studio**（以下、SSMS）を起動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186221/8841d91f-8d68-b895-f9e3-9098fcabf53f.png)

「サーバー名」をメモしておきましょう。BPから接続するときに使います。
※今回はWindows認証で接続する前提で進めます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186221/74560cdb-a0a2-7c4a-5168-9e781fcf95a0.png)

BPのテーブル一覧の一部です。
ビューも含めると160～170くらいでしょうか。

余談ですが、以前ロボットの稼働実績をまとめた統計資料を作る際に、
BPの各テーブルのデータを参照して、SQLでいい感じの統計データを抽出してましたｗ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186221/fb5dd4d4-cba5-4b28-7469-be0c5324ac58.png)

「データベース」を右クリックし、「新しいデータベース」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186221/795d0d81-c705-ad44-87b1-966da5a09674.png)

データベース名は**bpmaster**としておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186221/0e0f3f4e-7bc2-bead-a6f5-aaeb99c33267.png)

bpmasterが作成されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186221/5a2483db-2cbc-9be0-1242-c988d374bccc.png)

bpmasterにテーブルを作ります。

本当は、どのロボットのマスタなのか分かるように、
命名規則を定めてテーブル名を定義するのが良いのですが。。。
今回は分かりやすく**m_setting**というテーブルを作ることにします。

「データベース」を右クリックし、「新しいクエリ」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186221/fdb2a2ca-d8c7-7cef-245e-8fa1e2d0605e.png)

クエリウインドウに以下SQLを書き、「実行」ボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186221/affbc1b7-fa91-e477-fd83-b3dbec99eea6.png)

```sql
create table m_setting (
    name nvarchar(128) not null
  , description nvarchar(max)
  , value nvarchar(max)
  , primary key (name)
);
```
m_settingテーブルが作成されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186221/fe6852bc-5580-4a7a-df9f-e2d242955f11.png)

今度はデータを入れてみましょう。
クエリウインドウに以下SQLを書き、実行ボタンをクリックします。

```sql
insert into m_setting (name, description, value) values ('test', 'testtest', 'sssss');
```

m_settingテーブルを右クリックし、「上位1000行の選択」もしくは「上位200行の編集」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186221/ee3be340-ddfa-3637-20f7-06245a2c5c93.png)

データが投入されたことが確認できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186221/07fd9907-4733-b5da-c7b0-b0395375bff4.png)

##BPからSQL Serverに接続する
今度はBPからSQL Serverに作ったm_settingテーブルの
マスタデータを参照する実装です。

DBへの接続を確立した後、SQLを発行してデータを抽出するという流れになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186221/e39216d0-7ae4-eecd-fc1c-33d92ddb0c4f.png)

DB接続系のオブジェクトは**「Data - SQL Server」**を使います。
アクションは**「Set Connection」**ですね。

「DB接続」アクションで行う設定は以下の通りです。

**Server：SSMSの起動時にメモした「サーバー名」
Database："bpmaster"
User：（Windows認証のため空欄）
Password：（Windows認証のため空欄）**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186221/90e40c39-3a78-0ca4-4cb1-884d8ee5a11f.png)

「select」アクションで行う設定は以下の通り。
使うアクションは「Get Text」もしくは「Get Collection」です。
今回は取得するデータが1つのみなので、Get Textを使います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186221/ca3321fe-dd33-dbe7-9105-cabbdee0dade.png)

発行するSQLですが、**WHERE句に指定するパラメータは必ず変数化**しておきましょう。
※今回は簡略化のため直書きにしてます。

```sql
"SELECT value FROM m_setting WHERE name = 'test'"
```

##実行結果
DBから値が取れていることが確認できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186221/64117123-389c-8949-3d38-e8511fb6a70e.png)

Get Collectionを使った場合
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186221/b9e91d54-0ca1-e18e-2a6d-86adb4f9b8c4.png)

複数行・列でもコレクションとして取得できています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186221/e457967f-4959-7207-39ef-d9b745ff6e79.png)

##まとめ
DB接続時の接続NGの場合やデータが0件だった場合などの
エラーハンドリングはきっちり実装するとして、
DBがある程度分かる人であれば、こういうやり方もアリかもしれないです。

以前、大量のデータをコレクションに格納していたため、処理途中で固まってしまったことがありました。
ワークテーブルに一旦データを退避させ、ちょっとずつデータを引っ張り出して処理する方法に変えたら
うまく動いたことがあります。

マシンのスペックにもよりますが、
コレクションデータ数が10000～20000件くらいで発生した記憶があります。

マスタ管理や大量データの扱いなど、DBを活用することで解決できることも多いと思いますので、
DBについての知見を深めることをおススメします。