4.2 データモデル

ここでは、フロー内でどのような形でデータを扱うことができるのかをご説明します。

ASTERIAのデータ形式には大きく分けて「ストリーム」と「変数」の2種類があります。これらの違いは、大きくは次の2点があげられます。

ストリーム 変数
主な用途 外部とのデータの入出力 内部的なデータの一時退避
データ構造 単一フィールド形式
およびレコード形式
単一フィールド形式

単一フィールド形式とは、繰り返しの構造を持たないデータのことです。

レコード形式とは、データベースのテーブルのように、いくつかのフィールド(列)の組からなるレコード(行)が同じ構造で繰り返される、2次元の表形式のデータのことです。それぞれのフィールドには基本型のデータを入れることができます。

ストリームはフローの接続(矢印)に従って流れていきます。一方、変数はフローの接続に関係なく、実行時の順序にのみ従って、決められたデータの読み書き可能範囲(スコープ)から自由に読み書きができます。

4.2.1 基本型のデータ

ストリームと変数・定数の説明に入る前に、基本型(基本となるデータ型)について少し学んでおきましょう。

一般に、コンピュータでは扱うデータの内容に応じて、たとえば「文字列」「数値」「日時」「バイナリ」など、いくつかのデータ型を使い分けます。これは、データの意味をより明確化したり、コンピュータ内部での処理を効率化するためです。 ASTERIAでは、基本となるデータ型として次の7種類を持っています。ここでは、細かい内容はともかくとして「いくつかの基本となるデータ型というものがある」「データの意味内容に応じて使い分ける」という点を覚えておいていただければ十分です。

データ型、ASTERIA Users Guideの「4.3.データ型の詳細」もあわせてご覧ください。

名前 特徴
Integer 64ビット整数型。扱える値の範囲は、-9,223,372,036,854,775,808 以上,9,223,372,036,854,775,807 (約922京) 以下の整数です。
Decimal 無限精度の数値型。金額データなどにもっとも適しています。Integerが使えるところではDecimalを使わずにIntegerを使った方が若干パフォーマンス面で有利です。
String 文字列型。1つのString型変数やフィールドで扱える文字数は、最大 2,147,483,647 (約21億) 文字までです。
Binary バイナリ型。1つのBinary型変数やフィールドで扱えるバイト数は、最大 2,147,483,647 (約2ギガ) バイトまでです。
Double 64ビット浮動小数点型。扱える値の範囲は、-1.79769313486231570e+308 から+1.79769313486231570e+308 までです。主に科学技術計算で用います。
DateTime 日時型。西暦で、年、月、日、時、分、秒、ミリ秒までを扱うことができます。なお、扱える最も古い日付は、西暦 1年 1月 1日 0時 0分 0秒 000 です。
Boolean 真偽値を扱う型です。真は「true」または「1」、偽は「false」または「0」であらわします。

ただし、Boolean型は現在のASTERIA 3 「SP2」では変数・定数としては使うことができません。次期リリースの「SP3」で使えるようになる予定です。

なお、データ型は変換することが可能です。データ型の変換はキャストとも呼ばれます。ASTERIAでは自動的にキャストが実行されますので、たとえば文字列型データを整数型の変数に代入する場合などは、フローを作るときに設定をすることなく、自動的に文字列型から整数型へキャストされてデータが代入されます。

ただし、変換できないデータであった場合はエラーとなります。詳しくはASTERIA Users Guideの「4.3.2 データ型の変換」をご覧ください。

4.2.2 ストリーム

ストリームとは、フロー上を流れるデータオブジェクトです。ストリームには「Text」や「Record」などいくつかのストリームフォーマットがあります。

ASTERIA Users Guide の「4.2.ストリームフォーマットとフィールド」もご参照ください。

データ構造ストリームフォーマット名フロー上での表示特徴
レコード系CSVいわゆる「カンマ区切り」のデータです。ASTERIAでは、タブ区切りのデータなどもCSV形式の一種として扱います。
RecordたとえばRDBから読み込まれたテーブルなどの、レコードとフィールドの2次元からなるデータです。
FixedLengthいわゆる「固定長」のデータです。固定長を扱う場合に限り、文字コード「EBCDIC」を扱うことができます。なお、この形式ではフィールドのデータ型として「ゾーン10進(ZonedDecimal)」「パック10進(PackedDecimal)」を使うことができます。
単一フィールド系Textプレーンなテキストデータを扱うストリームフォーマットです。
HTMLHTML形式のデータを扱うストリームフォーマットです。この形式を使うと、レスポンスをウェブブラウザに返した際にHTMLデータとして正しく認識されます。
Binaryバイナリデータを扱うためのストリームフォーマットです。たとえば、Excelデータを扱う場合などに用います。
その他 XMLXMLデータを扱うためのストリームフォーマットです。この形式を使うと、XMLの要素や属性を直接読み書きすることができます。
MIMEMIMEデータはヘッダ、ボディ、マルチパートなどの特殊な構造を持っています。たとえば、添付メールやHTTP POSTでアップロードされたファイルを受信する場合などに用います。
ParameterListパラメータリストは、主に基本型データをストリームに流すためのストリームフォーマットです。なお、この形式ではフィールドのデータ型として「文字列の配列(String[])」を使うことができます。

FixedLengthに関して:固定長やEBCDICについては、付録で詳しく解説しています。

HTMLに関して:MIMEタイプが「text/plain」ではなく「text/html」になる、ということです。

レコード系のストリームフォーマットには、「ループ」の概念が関係してきます。ループについては次の節で解説していますので、あわせてご参照ください。

レコード系ストリームと単一フィールド系ストリームの違い

たとえばCSV形式のファイルは元々はテキストファイルですから、テキストストリームとして扱うことも可能です。しかし、CSVストリームとして扱うことで、各フィールドのデータへのアクセスが簡単になるというメリットがあります。

レコード系ストリーム(例:CSV)

単一フィールド系ストリーム(例:Text)

4.2.3 変数・定数

ASTERIAでの変数・定数には次の種類があります。

  • フロー変数
  • セッション変数
  • プロジェクト定数
  • システム変数
  • コンポーネント変数
  • ストリーム変数

変数・定数の種類と有効範囲を図示すると次のようになります。

なお、上図には「システム変数」「ストリーム変数」は含まれていません。これは、この2つは他の変数・定数と少し性格が異なるためです。詳しくは、それぞれの項目でご説明します。

(1) フロー変数

もっとも頻繁に使用する変数です。変数ですので、フロー中で自由に値を読み書きすることができます。フロー変数を読み書きできる範囲(スコープ)は、同一のフロー内のみです。

フロー変数は、プロパティウインドウの「Variables」タブ内の下図の箇所で用意します。

サンプル: 「423_Variables.xfp」の中にある、「フロー変数」フローを開いてください。

このフローには、2つのフロー変数「Sample1」と「Sample2」が用意されています。 このうち、フロー変数「Sample1」にはデフォルト値として文字列「デフォルト値をセット」がセットされています。

一方、フロー変数「Sample2」には、1つめのマッパー内でマッピングによって値がセットされています。ここではCONST関数の出力(値は「マッパー内からデータ書き込み」)がセットされています。

2つめのマッパーでは、2つのフロー変数から値を読み込み、CSVストリームへマッピングしています。

このフローを実行すると、次のような結果になります。

なお、フロー変数はフロー間でのデータの受け渡しに使うこともできます。詳しくは、次節の「サブフロー」の項目をご覧ください。

(2) セッション変数

これも自由に値を読み書きできる変数です。フロー変数との違いは、「セッション変数を読み書きできる範囲は、同一セッションの同一プロジェクトに含まれるすべてのフローである」という点です。よって、セッション変数を利用するとフロー間で値の受け渡しを行なうことができます。しかし、処理全体の見通しが悪くなるため、なるべくセッション変数は使用しないほうがいいでしょう。たとえば、サブフローとの値の受け渡しは前述のフロー変数(コンポーネントプロパティ)を使う方法がおすすめです。

セッション変数は、従来のプログラミング言語で言うところのグローバル変数と似た性格を持っています。

セッション変数は、プロパティウインドウの「Variables」タブ内の下図の箇所で用意します。

サンプル: 「423_Variables.xfp」の中にある、「セッション変数1」フローを開いてください。

このサンプルでは説明のために、後述する「サブフロー」を用いています。サブフローについての詳細は次節をご覧ください。

繰り返しになりますが、このサンプルでは説明のために異なるフロー間でのデータ受け渡しにセッション変数を用いています。しかしこの方法は、フローの見通しを良くするという観点からはおすすめできない方法です。フロー間でのデータ受け渡しにはフロー変数とコンポーネントプロパティを使う方法をご利用ください。

このフローでは、「セッション変数2」フローの呼び出しと、セッション変数「Sample3」からストリームへのデータ読み込みをしています。

ポイントは、この「セッション変数1」フローでは、セッション変数「Sample3」へのデータ書き込みは行なっていないという点です。「Sample3」へのデータ書き込みは、「セッション変数2」フローの中で行なっています。

「セッション変数1」フローの実行結果は、次のようになります。

(3) プロジェクト定数

これは定数ですので、値の読み出しは自由にできますが、値の書き込みはできません。プロジェクト定数の値はフロー作成時に定義した値となります。

プロジェクト定数は、プロパティウインドウの「Variables」タブ内の下図の箇所で用意します。 プロジェクト定数はこのように、変数のデフォルト値を設定するのと同じ方法で値をセットします。

サンプル: 「423_Variables.xfp」の中にある、「プロジェクト定数」フローを開いてください。

マッピングは、次のようになっています。

このフローを実行すると次のようになります。

(4) システム変数

システム変数の一覧は、付録をご覧ください。

これは特殊な変数です。値の読み出しは自由にできますが、値の書き込みはシステム以外はすることができません。設定できる変数名もあらかじめ決められており、必要に応じて使用するシステム変数をプルダウンで選択するようになっています。主に、セッションIDやエラーメッセージの取得に用います。

システム変数は、プロパティウインドウの「Variables」タブ内の下図の箇所で用意します。 ここでは、「セッションID(SessionId)」を取得するように設定されています。

サンプル: 「423_Variables.xfp」の中にある、「システム変数」フローを開いてください。

マッピングは、次のようになっています。

このフローを実行すると次のようになります。

実行結果にはなにやら意味不明な文字列が表示されていますが、これが「セッションID」です。フローが実行されるごとに「セッション」がASTERIA内部で自動的に生成され、IDとしてユニークな文字列が発行されます。

(5) コンポーネント変数

コンポーネント変数は、一部のコンポーネントに用意されている変数です。そのコンポーネントの中でしか読み書きすることはできません。たとえば、Velocityコンポーネントの例で見てみましょう。

コンポーネント変数は、フロー変数などとは異なり、そのコンポーネントの「LocalVariables」タブで設定します。

サンプル: 「423_Variables.xfp」の中にある、「コンポーネント変数」フローを開いてください。

マッピングの方法は、他の変数と同様です。

Velocityテンプレートの内容は以下の通りです。

Velocityのテンプレートから、コンポーネント変数の値を読み出す方法

たとえば、この例では「LocalVariables」タブにコンポーネント変数
「Sample5」が用意され、マッパーから値がマッピングされています。
その値をテンプレート内で取得するには、次のように記述します。

$local.Sample5 (注:実際には、「$」記号は半角です。)

実際に値を取得すると、次のようになります。

$local.Sample5

このフローを実行すると、次のような結果になります。

コンポーネント変数が用意されているコンポーネントは、Velocity、XMLMerge、XMLUpdateなどです。

(6) ストリーム変数

これは、ストリームに関連付いた変数です。この変数は、ストリームの個々の内容に対してファイル名や更新日時などの属性情報(メタデータ)を付加するためのものと考えればよいでしょう。たとえば、ファイル取得時のファイルパスの取得や、添付ファイル付メール送信時の添付ファイル名設定に使用します。

なお、「RecordNo」というストリーム変数については、次節の「ループ」の項目を参照してください。

ストリーム変数の読み込みは、マッパー内で直接行なうことができます。 ストリーム変数の書き込みには、StreamVariablesコンポーネントを使用します。

まず、ストリーム変数の読み込みのサンプルを見てみましょう。 「423_Variables.xfp」の中にある、「ストリーム変数の読み込み」フローを開いてください。

ここではまず、FileSystem(Get)コンポーネントのFilePathプロパティにワイルドカードを設定することで、複数のファイルが取得されるようにしています。

FileSystem(Get)
FilePath input_data/StreamVariables*.txt
OutputStreamFormat Text
Encoding Windows-31J

ワイルドカードとは、「任意の文字」を表現するために用いる特殊な記号です。ASTERIAでは「*」と「?」がワイルドカードとして使用できます。「*」は「0個以上の任意の文字」、「?」は「任意の1文字」という意味になります。

つづいてマッパーで、ストリーム変数から「ファイルのフルパス(FilePath)」と「ファイルの最終更新日時(FileDate)」を取得し、ファイルの中身とあわせてCSVストリームにマッピングしています。

このフローを実行すると、次のように表示されます。

ストリーム変数が自動的に付加されるコンポーネントは、FileGet、FTPGet、UNZIPなどです。

つづいて、ストリーム変数の書き込みのサンプルを見てみましょう。 「423_Variables.xfp」の中にある、「ストリーム変数の書き込み」フローを開いてください。

ここでは、マッパーでテキストストリームとファイル名を動的に生成し、StreamVariablesコンポーネントでZIPの中身となるテキストファイルのファイル名をストリーム変数に書き込んでいます。そしてZIPコンポーネントでそのテキストストリームを圧縮し、ファイルに保存しています。ZIPファイルの保存先は「[HOME]/output_data/WriteStreamVariables.zip」です。

ストリーム変数は、StreamVariablesコンポーネントの「StreamVariables」タブで設定します。

マッピングは、他の変数と同様に行なえます。ここでは、現在日時を取得して、テキストファイルの中身とファイル名に加工しています。

フローを実行後、生成されたZIPファイルを確認してください。次のようなファイル名になりましたか?(数字の部分はフローの実行日時ですので、実行タイミングにより変わります。)

ストリーム変数をファイル名の決定などに利用するコンポーネントは、AttachmentMail、ZIPなどです。