[OutSystems] CSVからEntityレコードを動的に生成する ※forge未使用

## はじめに
株式会社メディアテック所属の @mt-h2 です。
普段は OutSystems を利用したローコードでシステム開発を行っています。

[前回の記事](https://qiita.com/mt-h2/items/a4531dd97bde21d31fa2)で、CSV ファイルを読み込み任意の形式で変数に格納するところまで行いました。
今回はそこからの続きで、読み込んだデータを元にテスト用データ（Entity レコード）を生成して、テスト用の生成データ管理を CSV で管理できるようになる事をゴールとします。

:::note info
対象バージョンは OutSystems 11 となります。
:::

## 前提
レコード生成に用いる配列データは、[前回の記事](https://qiita.com/mt-h2/items/a4531dd97bde21d31fa2) の方法で CSV ファイルからデータを読み込みが完了した状態とします。

## 実装

### 特定の Entity にレコードを追加
下記 csv ファイルを利用して Employee Entity にレコードを追加します。
ここでは Employee Entity 固定のレコード追加となります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3803085/f208efc7-b7c9-03bf-d511-6bd6401adae1.png)

1. Employee Entity を作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3803085/ca9494b0-e1d2-bcde-2076-37967be519e4.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3803085/94deb910-e1b7-fa7b-f3d2-4979a7292472.png)
1. CSV ファイルのデータを、以下形式の配列（EmployeeEntity型の配列）に格納する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3803085/5bd3bdee-86a3-d7a1-899d-96d6fb5dc07a.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3803085/b839c2b4-5a05-5601-aaae-59d0b94a822d.png)
※ 格納時に Id Attribute は CSV データを使わず NullIdentifier() とする（AutoNumberのため）
1. CSV ファイルのデータを格納した配列を For Each でループ
1. ループ内に、Employee Entity にある「CreateEmployee」サーバアクションを配置してレコードを追加する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3803085/8b14458a-1ca9-d8eb-571c-7a021f9f3fd2.png)

これで完成です。最終的に以下アクションが配置されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3803085/82cf2283-f431-968c-bc42-626e7a7acdbb.png)

作成したサーバアクションを実行すると、CSV ファイルの内容で Employee Entity にレコードが追加されている事が確認できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3803085/b499cb20-08b2-84e8-211d-d25aa0fef72e.png)

### 複数の Entity にレコードを追加
下記の csv ファイルを利用して指定された Entity にレコードを追加します。
ここでは A 列で Entity を指定する列として扱います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3803085/b694bc96-0436-50b8-ba05-d4c04cf4da8b.png)
※ 「#」をつけているのは Entity の判定がしやすくなるよう Entity に使用不可な文字列を先頭に付与しています

1. Office Entity を作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3803085/5f971f87-71a2-c58e-e075-9a89e7e03408.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3803085/05854d0a-8641-fc81-9272-26bc9140fccb.png)
1. Office レコード格納配列を追加
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3803085/b5bdd5f3-dc37-e3c8-65ef-482146c20c6a.png)
1. CSV 取り込み時の continue 条件に「行テキストの先頭文字が"#"」である事を追加
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3803085/b424f04d-dea3-459d-80d1-93906f902500.png)
1. CSV の代入配列判定用の switch を配置
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3803085/f3a3f5db-4a6b-bbe7-11c3-7d4d567a7d2a.png)
1. switch の判定で「continue」「Employeeに代入」「Officeに代入」を振り分け、CSV 取り込み処理が完了
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3803085/e950979d-3010-1adf-2aca-c75df7649704.png)
1. 「Emloyee」「Office」それぞれの配列を For Each で1件ずつレコードを追加
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3803085/d47b2cc7-228b-9d61-ca22-73ee983095bc.png)

これで完成です。最終的にアクションが以下のようになっていると思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3803085/5a7922fb-e8e5-cb87-92d3-02cce24f153c.png)

作成したサーバアクションを実行すると、CSV ファイルの内容で Employee Entity と Office Entity にレコードが追加されている事が確認できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3803085/1fd546e1-078c-56ba-b75d-bbf5715991a5.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3803085/a37e841b-06b3-8226-aa35-5762d825be06.png)

### 外部キー制約のある Entity にレコードを追加
下記の CSV ファイルを利用して外部キー制約のある指定された Entity にレコードを追加します。
ここでは A 列で Entity を指定する列、そして E 列を Office Entity の Id を指定する列として扱います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3803085/5efb5189-0993-d91d-eb33-e0f332093764.png)
※ E2->B6、E3->B7、E4->B8 のような参照です

1. 「複数の Entity にレコードを追加」で作成した「行データをセル値ごとに構造体に代入」ForEach までの処理を複製する
1. 「行データをセル値ごとに構造体に代入」ForEach 内の Var_ImportDataEmployee に ListAppend している箇所で、今回追加した Office Id FK セルの値を代入するよう修正
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3803085/37004752-b253-5ed0-c59f-1b88bec3357a.png)
1. 上記ループを抜けた後に Var_ImportDataOffice の ForEach を配置
1. ループ内の最初の処理で Office のレコードを追加
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3803085/22b9e28f-2223-275f-6645-5752e20d7a13.png)
1. ListFilter で Var_ImportDataEmployee を CSV ファイルの Office のセル値が同一のものでフィルタ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3803085/b68791d7-e2b5-d376-624e-e67c057ccdd2.png)
1. 上記でフィルタしたものを ForEach
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3803085/e5efbd29-98d6-1dcc-9fa8-b43e4372f144.png)
1. フィルタしたものカレントの中にある Office の値を、作成した Office レコードの Id 値（CSV ファイルの値ではなく Entity 上の実値）で上書き
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3803085/14c9e36f-ca91-44a4-e417-8ef774a4dbed.png)
1. Office 値を上書きしたもので Employee レコードを作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3803085/486955d6-0407-153e-04df-083581ee9661.png)

これで完成です。最終的にアクションが以下のようになっていると思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3803085/cd1d7253-3c84-e00b-09b2-04c9845a8ee9.png)

作成したサーバアクションを実行すると、CSV ファイルの内容で Employee Entity と Office Entity にレコードが追加されており、Emloyee レコードの Office の値が Office Entity に登録されている Id で登録されている事が確認できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3803085/273f766a-add3-846a-2671-b401d735a704.png)
※ Id が CSV ファイルの値ではなく AutoIncrement での値となっている
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3803085/3fe115ae-babf-0a97-0616-26aeecf81eec.png)
※ Office が CSV ファイルの値ではなく、Office Entity の実レコードを参照している

## あとがき
今回は[前回作成した csv ファイルの内容を読み込んだ処理](https://qiita.com/mt-h2/items/a4531dd97bde21d31fa2)を利用し、テストデータのセットアップを作成してみました。
ここまでやっておいてなんですが、実は OutSystems には [Excel を取り込んでレコード変数に格納する処理](https://success.outsystems.com/ja-jp/documentation/11/reference/outsystems_language/logic/implementing_logic/logic_tools/record_list_to_excel/)が最初から用意されています。いいや、CSV でやりたいんだ！という状況（実は割とある？）の場合には、このような対応も可能であること思っていただければ幸いです。

## さいごに
株式会社メディアテックでは絶賛 [開発メンバを募集中](https://www.mediatech.jp/recruit) です。
ローコード開発だけではなく、RPAやBIエンジニア諸々多数の募集をしておりますので、みなさまのご応募をお待ちしております。