1
0

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

Last updated at Posted at 2024-09-20

はじめに

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

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

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

前提

レコード生成に用いる配列データは、前回の記事 の方法で CSV ファイルからデータを読み込みが完了した状態とします。

実装

特定の Entity にレコードを追加

下記 csv ファイルを利用して Employee Entity にレコードを追加します。
ここでは Employee Entity 固定のレコード追加となります。
image.png

  1. Employee Entity を作成
    image.png
    image.png
  2. CSV ファイルのデータを、以下形式の配列(EmployeeEntity型の配列)に格納する
    image.png
    image.png
    ※ 格納時に Id Attribute は CSV データを使わず NullIdentifier() とする(AutoNumberのため)
  3. CSV ファイルのデータを格納した配列を For Each でループ
  4. ループ内に、Employee Entity にある「CreateEmployee」サーバアクションを配置してレコードを追加する
    image.png

これで完成です。最終的に以下アクションが配置されています。
image.png

作成したサーバアクションを実行すると、CSV ファイルの内容で Employee Entity にレコードが追加されている事が確認できました。
image.png

複数の Entity にレコードを追加

下記の csv ファイルを利用して指定された Entity にレコードを追加します。
ここでは A 列で Entity を指定する列として扱います。
image.png
※ 「#」をつけているのは Entity の判定がしやすくなるよう Entity に使用不可な文字列を先頭に付与しています

  1. Office Entity を作成
    image.png
    image.png
  2. Office レコード格納配列を追加
    image.png
  3. CSV 取り込み時の continue 条件に「行テキストの先頭文字が"#"」である事を追加
    image.png
  4. CSV の代入配列判定用の switch を配置
    image.png
  5. switch の判定で「continue」「Employeeに代入」「Officeに代入」を振り分け、CSV 取り込み処理が完了
    image.png
  6. 「Emloyee」「Office」それぞれの配列を For Each で1件ずつレコードを追加
    image.png

これで完成です。最終的にアクションが以下のようになっていると思います。
image.png

作成したサーバアクションを実行すると、CSV ファイルの内容で Employee Entity と Office Entity にレコードが追加されている事が確認できました。
image.png
image.png

外部キー制約のある Entity にレコードを追加

下記の CSV ファイルを利用して外部キー制約のある指定された Entity にレコードを追加します。
ここでは A 列で Entity を指定する列、そして E 列を Office Entity の Id を指定する列として扱います。
image.png
※ E2->B6、E3->B7、E4->B8 のような参照です

  1. 「複数の Entity にレコードを追加」で作成した「行データをセル値ごとに構造体に代入」ForEach までの処理を複製する
  2. 「行データをセル値ごとに構造体に代入」ForEach 内の Var_ImportDataEmployee に ListAppend している箇所で、今回追加した Office Id FK セルの値を代入するよう修正
    image.png
  3. 上記ループを抜けた後に Var_ImportDataOffice の ForEach を配置
  4. ループ内の最初の処理で Office のレコードを追加
    image.png
  5. ListFilter で Var_ImportDataEmployee を CSV ファイルの Office のセル値が同一のものでフィルタ
    image.png
  6. 上記でフィルタしたものを ForEach
    image.png
  7. フィルタしたものカレントの中にある Office の値を、作成した Office レコードの Id 値(CSV ファイルの値ではなく Entity 上の実値)で上書き
    image.png
  8. Office 値を上書きしたもので Employee レコードを作成
    image.png

これで完成です。最終的にアクションが以下のようになっていると思います。
image.png

作成したサーバアクションを実行すると、CSV ファイルの内容で Employee Entity と Office Entity にレコードが追加されており、Emloyee レコードの Office の値が Office Entity に登録されている Id で登録されている事が確認できました。
image.png
※ Id が CSV ファイルの値ではなく AutoIncrement での値となっている
image.png
※ Office が CSV ファイルの値ではなく、Office Entity の実レコードを参照している

あとがき

今回は前回作成した csv ファイルの内容を読み込んだ処理を利用し、テストデータのセットアップを作成してみました。
ここまでやっておいてなんですが、実は OutSystems には Excel を取り込んでレコード変数に格納する処理が最初から用意されています。いいや、CSV でやりたいんだ!という状況(実は割とある?)の場合には、このような対応も可能であること思っていただければ幸いです。

さいごに

株式会社メディアテックでは絶賛 開発メンバを募集中 です。
ローコード開発だけではなく、RPAやBIエンジニア諸々多数の募集をしておりますので、みなさまのご応募をお待ちしております。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0