[OutSystems]複合データ型の種類と用途（質問箱から）

[質問箱でもらった質問に](https://peing.net/ja/q/8bd07e2d-5625-483d-bcf0-54cb286d569d)対する回答。

質問箱だと画像を貼れないので、OutSystemsの複合データ型を列挙し、それぞれの役割と利用例を以下にまとめる。

# 質問箱でもらった質問
> これから OutSystemsを学ぼうと思っています。
レコード型やリスト型 ストラクチャーなど使い道があまりイメージつきません。 具体例とともに教えて頂けないでしょうか?

# 用語の整理
## 複合データ型 (Compound data type) とは？
複数の基本データ型を組み合わせて作成するデータ型のこと。
作成された複合データ型のデータは1つのデータ。

例えば、社員番号 （Integer型） 、氏名 (Text型)  、住所 (Text型) などの基本データ型データを複数組み合わせ、「従業員」というデータ型を作ったら、これが複合データ型。

この場合、「従業員」というデータは、内訳として社員番号、氏名、住所などを持つことになる。

OutSystemsの複合データ型は以下の通り
- Entity
- Structure
- Record
- Object

## Collectionデータ型 (Collection data type)とは？
同じ種類のデータが複数個あることを示すデータ型のこと。

OutSystemsのCollectionデータ型は、Listのみ。
List作成時には、基本データ型もしくは複合データ型を1つ指定し、その型のデータを複数格納するのに使う。

例えば、「従業員」のListは、複数の従業員のデータをまとめて管理する。

## ドキュメント
[使用できるデータ型 > 複合データ型](https://success.outsystems.com/ja-jp/documentation/11/reference/outsystems_language/data/data_types/available_data_types/#section-2)
ちょっと翻訳ミスっぽいところがあるが。

# Entity（複合データ型）
## 概要
Database上のテーブルにマッピングする複合データ型はEntityとして作成する。
作成するには、ODC Studio上で、Dataタブ > Entitiesフォルダ > Databaseを右クリックし、Add Entityを選択する。

以下の例は、OutSystemsSampleData (OutSystemsが提供するサンプルデータ集）が提供するEntityの定義。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/42894b84-4ef0-092b-07e0-45130f7ef7fd.png)

## 用途の例
Entityについては、用途は割と自明なので、スクリーンショットは省略
- アプリケーションで追加・更新されるデータの保存先
- アプリケーションで利用されるマスタデータの保存先
- 設定値の保存先

# Structure（複合データ型）
## 概要
独自に複合データ型を定義するが、テーブルへの保存は必要ない場合に使用する。
作成するには、ODC Studio上で、Dataタブ > Structuresフォルダを右クリックし、Add Structureを選択する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/6fd0ab79-663a-84c6-069a-210dbb018452.png)

## 用途の例
複数のデータをひとまとめにして管理したいときに使う。
具体的な例としては以下のようなものがある。
### 画面やAction内で、ひとかたまりのデータを定義する
特に画面の場合に多いのだが、あまりにも多くの変数を持っていると、見にくくなり、管理も難しくなる。
そこで、一定の基準で変数をまとめ上げてしまうのにStructureを定義することがある。

ある画面で、「名前の中間一致」・「住所の中間一致」・「年齢の範囲」の検索を行うUIがある場合に、検索条件に使う4つの変数を1つのStructureにまとめた例。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/30463b3f-1d68-a2ba-fc71-fd0bb729e4ee.png)

### 部品のI/Fとして
ActionのInput/Output Parameter、BlockのInput Parameter、REST APIのInput/Output Parameterのデータ型として利用する。
もちろんバラバラに基本データ型のParameterを複数持たせてもいいのだが、そうすると煩雑になるため、Structureを定義して利用する。Structureを定義した場合、そのデータ型を複数の場所で使えるのもよいところ。

OutSystems UIのあるActionの例。エラー時に設定されるOutput Parameter ErrorMessageは、Structure ErrorMessage_OSUIをデータ型としている。これにより、エラーコードとエラーメッセージという2つの異なるデータを1つのOutput Parameter内に持っている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/1e354576-da5a-b474-98f7-a6726de7647d.png)

# Record（複合データ型）
## 概要
Structureとほぼ同じ。ただし、こちらは、使う場所で複合データ型を定義し、他の場所では使い回さない。
通常、自分でデータ型を定義する場合はRecordではなくStructureを定義したほうが保守時に見やすく、あとで使いまわしが必要になったときにも楽。

## 用途の例
### Aggregateでジョインしたとき
Aggregateを定義し、内部で複数のEntityをジョインさせた場合、結果はRecordのListになる。
以下はAggregateの後で、結果を展開してみたところ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/ac604d78-d51a-80e9-76c1-1eb903ef45c7.png)

### Actionが複合データ型のParameterを必要とするが、Structureを作りたくない場合
以下はOutput ParameterをRecord型に設定し、Text型とInteger型の属性を追加した様子。List内の各要素がRecord型になっているのが確認できる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/a120a9aa-8dc5-8bf6-d330-69b6cc3ede75.png)


# Object（複合データ型）
## 概要
OutSystemsが背後で使用しているプログラミング言語の値を保持・やり取りするのに使う。
質問者は初心者ということなので、Objectは気にしなくて良いと思う。

## 用途の例
OutSystemsはプログラミング言語C#を使って開発した機能を、取り込んで使用することができる。
その機能と値のやり取りをするのに使う。

以下の例は、ForgeにあるAdvanced Excelという、C#を使ってExcelファイルを操作する部品。Excelファイルのバイナリを受取、OutSystemsサーバーのメモリ上で開いてそのハンドルをObject型で返している。皇族の処理で、このObject型のハンドルを別のActionに渡すことで開いたExcelファイルを操作できる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/f94027fd-a4a3-87b5-b3c6-5ef486949f99.png)

# List（複合データ型）
## 概要
あるデータ型を複数まとめて取り扱うためのデータ型。
基本データ型・複合データ型共にまとめる対象として選べる。

## 用途の例
- 画面上で一覧表示したいデータがある場合
- バッチ処理等で発生したデータを順次処理したい場合
- Dropdown等で表示したい選択肢を一括管理したい場合