3.5 主なマッパー関数の使い方

ここでは、よく使われるマッパー関数の使い方について、実際にフローを実行しながら確認しましょう。

3.5.1 準備

説明に入る前に、少しだけ準備をしましょう。この章で説明に使用するフローは、あらかじめ用意してあります。「350_Mapper.xfp」を開いてください。なお、このプロジェクトファイルは付録のCD-ROMからコピーすれば何度でも元の状態に戻せますので、自由に改造してみてください。

マッパー関数の一覧は、巻末資料をご覧ください。

ここで説明していないマッパー関数やプロパティの使い方については、各マッパー関数のヘルプを参照してください。

3.5.2 文字列関数(文字列の生成・加工)

まずは、文字列を操作するためのマッパー関数のうち、使用頻度が高いものをいくつか取り上げて説明します。

ここでは、下記の処理をするサンプルを見ることができます。

説明番号処理内容使用するマッパー関数アイコン
1 固定値をセットする(文字列) CONST
2 文字列を連結する CON
3 文字列を切り出す(左から) LEFT
4 文字列を切り出す(中央部分) MID
5 文字列を切り出す(右から) RIGHT
6 文字列を検索して切り出す EXTSTR
7 文字数を取得する LEN
8 余分な空白を除去する(トリミング) TRIM
9 テンプレートへ値を埋め込む EMBED

文字列を操作するためのマッパー関数は、サービスパレットの「文字列」タブの中に入っています。

「文字列操作関数」フローを開いてください。

このフローにはMapperコンポーネントのほかにVelocityコンポーネントも含まれています。このVelocityコンポーネントは、マッパー関数の処理結果を見やすく表示するためにデータを整形しているだけですので、ここで説明したい内容の本質とは関係ありません。

フローを開いたら、今度はフロー上のMapperコンポーネントを開いてください。このマッパーには13個のマッパー関数が配置されています。

個別の内容は後から見ていくこととして、ひとまずASTERIAデザイナからフローを実行してみましょう。結果は次のようになります。

それでは、個別の内容を見ていきましょう。

(1) 固定値をセットする(文字列)

固定値のセットには、CONST関数を使います。CONST関数のDataプロパティに文字列を設定すると、その内容が関数の出力コネクタから出力されます。

CONST関数は数値の固定値をセットする場合にも使います。詳しくは次の項で説明します。

マッパー内の下図の枠で囲まれた部分が、固定値をセットする方法のサンプルです。

ここでは、2つのCONST関数をそれぞれ次のように設定しています。

上のCONST関数:
CONST
Data ASTERIA

下のCONST関数:
CONST
Data 実践ガイド

Descriptionプロパティはコメント欄です。Descriptionプロパティに設定した内容は、マッパー画面上にふきだし状のコメントとして表示されるので便利です。ここの例では、Dataプロパティと同じ内容を設定しています。

ASTERIA 3 Service Pack 3 (Build 3.3.2300)以降では、Dataプロパティに値を入力すると同じ内容が自動的にDescriptionプロパティに設定されるようになりました。

また、CONST関数アイコンをダブルクリックするとDataプロパティの入力ダイアログが表示され、編集することができます。

(2) 文字列を連結する

文字列を連結するには、CON関数を使います。CON関数では、入力コネクタに入力された値が入力された順番に連結され、その連結結果の文字列が出力コネクタから出力されます。

マッパー内の下図の枠で囲まれた部分が、文字列を連結する方法のサンプルです。

ここでは、2つのCONST関数の出力をCON関数に入力(マッピング)しています。 CON関数では何も設定していません。

「ASTERIA」が1番目、「実践ガイド」が2番目に入力されていますので、結果として「ASTERIA実践ガイド」が出力されます。

入力順を変更する方法
CON関数のように複数の入力を受け付けるマッパー関数で入力順を変更したい場合、次の2つの方法ので入力順を変更することができます。(どちらでも結果は同じです。)

  • プロパティの「Input1」「Input2」...のプルダウンを1つずつ変更する。
  • 右クリックメニューの「入力パラメータの並べ替え」を選択後、入力したい順にマッピングの矢印を順次クリックする。

(3) 文字列を切り出す(左から)

LEFT関数を使うと、「入力された文字列を左からn文字目まで切り出す」という処理ができます。

マッパー内の下図の枠で囲まれた部分が、文字列を左から切り出す方法のサンプルです。

ここでは、LEFT関数を次のように設定しています。

LEFT
Count 2

この設定で、「左から2文字分切り出す」という意味になります。サンプルでは「実践ガイド」の文字が入力されていますので、結果として「実践」が出力されます。

このLEFT関数や、この後に説明するMID関数、RIGHT関数、LEN関数では、桁数の指定はバイト数ではなく文字数です。つまり、全角文字も1文字は1としてカウントされます。バイト数でカウントする場合は「バイナリ」タブにあるLEFTB関数、MIDB関数、RIGHTB関数、LENB関数をお使いください。

(4) 文字列を切り出す(中央部分)

MID関数を使うと、「入力された文字列のa文字目からb文字分を切り出す」という処理ができます。

マッパー内の下図の枠で囲まれた部分が、文字列の中央部分を切り出す方法のサンプルです。

ここでは、MID関数を次のように設定しています。

MID
Offset 2
Count 3

この設定で、「文字列を左から見て、2文字目から3文字を切り出す」という意味になります。サンプルでは「実践ガイド」の文字が入力されていますので、結果として「践ガイ」が出力されます。

「2文字目から3文字目まで」ではありませんので注意しましょう。

(5) 文字列を切り出す(右から)

RIGHT関数を使うと、「入力された文字列を右からn文字目まで切り出す」という処理ができます。

マッパー内の下図の枠で囲まれた部分が、文字列を右から切り出す方法のサンプルです。

ここでは、RIGHT関数を次のように設定しています。

RIGHT
Count 2

この設定で、「右から2文字分切り出す」という意味になります。サンプルでは「実践ガイド」の文字が入力されていますので、結果として「イド」が出力されます。

(6) 文字列を検索して切り出す

EXTSTR関数を使うと、「ある文字列を入力文字列の中で検索し、ヒットした箇所の左側または右側を切り出す」という処理ができます。

マッパー内の下図の枠で囲まれた部分が、文字列を検索して切り出す方法のサンプルです。

ここでは、EXTSTR関数を次のように設定しています。

EXTSTR
Search 実践
SearchDir Left
GetDir Right

Searchプロパティは入力文字列の中で検索する文字列の設定です。

SearchDirプロパティは、文字列の検索を入力文字列の左側から行なうのか、右側から行なうのかの設定です。

GetDirプロパティは、検索にヒットした箇所から左側を切り出すのか、右側を切り出すのかの設定です。

サンプルでは、「実践」の文字列を入力文字列の「実践ガイド」の中で左から検索し、ヒットした部分の右側を切り出す設定ですので、結果として「ガイド」が出力されます。

なお、検索文字列が入力文字列に複数含まれる場合は、最初にヒットした文字列が評価されます。 たとえばここのサンプルで、入力文字列が「ASTERIA実践ガイドでフローの作り方を実践しましょう」だったとしますと、左から見ていった最初の「実践」から右側の「ガイドでフローの作り方を実践しましょう」が出力されることになります。

(7) 文字数を取得する

文字列の文字数を取得するには、LEN関数を使います。

マッパー内の下図の枠で囲まれた部分が、文字数を取得する方法のサンプルです。

プロパティ設定はありません。 入力された文字列の文字数が出力されます。ここでは「実践ガイド」が入力されていますので、出力値は「5」となります。

入力がNULLだった場合は、出力値は0になります。

(8) 余分な空白を除去する(トリミング)

TRIM関数を使うと、入力文字列の両端から余分な空白を取り除くことができます。設定により、左端のみ、右端のみの空白除去も可能です。

TRIM関数は、たとえばRDBからCHAR型のデータを読み込んだときにしばしばついてくる末尾の空白を除去したい時などに使うと便利です。

マッパー内の下図の枠で囲まれた部分が、余分な空白を除去する方法のサンプルです。

ここでは、TRIM関数を次のように設定しています。

TRIM
Trim Both

この設定で、「両端から空白を取り除く」という意味になります。Trimプロパティを「Left」にすれば左端のみ空白除去、「Right」に右端のみ空白除去する設定になります。 ここでは「[半角スペース]両端が空白[半角スペース]」という文字列が入力されていますので、結果は「両端が空白」となります。

なお、複数の空白文字が端に付いていた場合、それらはまとめて削除されます。

例)「[半角スペース][半角スペース]文字列[半角スペース][半角スペース]」→TRIM→「文字列」

ここでの「空白文字」とは、簡単には半角スペースおよび全角スペースと考えてください。タブ文字は含みません。より厳密に言えば、Unicodeで0020,00A0,2000-200B,3000の文字コードを持つ文字を指します。

(9) テンプレートへ値を埋め込む

EMBED関数を使うと、「あらかじめ設定しておいたテンプレート(定型文)に入力文字列を埋め込む」という処理ができます。

マッパー内の下図の枠で囲まれた部分が、テンプレートへ値を埋め込む方法のサンプルです。

ここでは、EMBED関数を次のように設定しています。

EMBED
Data 本書を参考にして$input1を実践的に$input2しましょう!

Dataプロパティの内容がテンプレートとなります。テンプレートの中にある「$input1」や「$input2」は変数のようなものです。これをテンプレート中に書いておくと、たとえば$input1の部分にはInput1に入力された内容が埋め込まれます。

ここではInput1が「ASTERIA」、Input2が「活用」ですから、結果として「本書を参考にしてASTERIAを実践的に活用しましょう!」が出力されます。

3.5.3 数値関数(四則演算・整形)

つづいて、数値の計算(加減乗除)やフォーマット整形をするためのマッパー関数をいくつか見てみましょう。

ここでは、下記の処理をするサンプルを見ることができます。

説明番号処理内容使用するマッパー関数アイコン
1 固定値をセットする(数値) CONST - 文字列タブ
2 二値の足し算 ADD - 数値タブ
3 三値以上の足し算 SUM - 数値タブ
4 二値の引き算 SUBTRACT - 数値タブ
5 二値の掛け算 MULTIPLY - 数値タブ
6 二値の割り算 DIVIDE - 数値タブ
7 固定値との計算 CALC - 数値タブ
8 数値フォーマット整形 FORMATDECIMAL - 変換タブ

「数値計算関数と数値整形関数」フローを開いてください。

このフローにも文字列操作関数フローと同様に、見た目を整形するためのVelocityコンポーネントが含まれていますが、内容の本質には関係はありません。

フローを開いたら、今度はフロー上のMapperコンポーネントを開いてください。このマッパーには11個のマッパー関数が配置されています。

個別の内容は後から見ていくこととして、ひとまずASTERIAデザイナからフローを実行してみましょう。結果は次のようになります。

それでは、個別の内容を見ていきましょう。

(1) 固定値をセットする(数値)

数値の固定値をセットする場合も、文字列と同じくCONST関数を使います。CONST関数のDataプロパティに数値を設定すると、その内容は自動的に数値として解釈され、出力コネクタから出力されます。

少し専門的な表現をすれば、自動的にデータ型をキャストしてくれるというわけです。キャストについては、「4.2.1 基本型のデータ」もあわせてご覧ください。

マッパー内の下図の枠で囲まれた部分が、固定値をセットする方法のサンプルです。

ここでは、3つのCONST関数をそれぞれ次のように設定しています。

上のCONST関数:

CONST
Data 1

中のCONST関数:

CONST
Data 2

下のCONST関数:

CONST
Data 3

(2) 二値の足し算

ADD関数を使うと、2つの値の足し算ができます。

マッパー内の下図の枠で囲まれた部分が、足し算をする方法のサンプルです。

ここでは、2つのCONST関数の出力をADD関数に入力(マッピング)しています。 ADD関数には何も設定はありません。

ここでは、「1」と「2」が入力されていますので、1 + 2 =「3」が出力されます。

ただし、ADD関数では2つの値の加算しかできません。3つ以上の値の和をとるには、次のSUM関数を使います。

(3) 三値以上の足し算

SUM関数を使うと、三値以上の足し算(和の計算)をすることができます。

三値以上の掛け算(積の計算)ができる多項演算の関数は、残念ながらありません。二値の掛け算を複数組み合わせて実現する必要があります。

マッパー内の下図の枠で囲まれた部分が、三値以上の足し算をする方法のサンプルです。

ここでは、3つのCONST関数の出力をSUM関数に入力しています。 SUM関数には何も設定はありません。

ここでは「1」「2」「3」入力されていますので、1 + 2 + 3 =「6」が出力されます。

(4) 二値の引き算

引き算をするには、SUBTRACT関数を使います。

マッパー内の下図の枠で囲まれた部分が、引き算をする方法のサンプルです。

ここでは、2つのCONST関数の出力をSUBTRACT関数に入力しています。 SUBTRACT関数には何も設定はありません。

SUBTRACT関数では、1番目に入力コネクタに入力された値から、2番目に入力された値が引かれます。要するに、「OUTPUT = [Input1] - [Input2] 」ということです。ですから、入力の順番に注意する必要があります。

「2」が1番目、「1」が2番目に入力されていますので、2 - 1 =「1」が出力されます。

(5) 二値の掛け算

掛け算をするには、MULTIPLY関数を使います。

マッパー内の下図の枠で囲まれた部分が、掛け算をする方法のサンプルです。

ここでは、2つのCONST関数の出力をMULTIPLY関数に入力しています。 MULTIPLY関数には何も設定はありません。

ここでは「2」と「3」入力されていますので、2 * 3 =「6」が出力されます。

(6) 二値の割り算

割り算をするには、DIVIDE関数を使います。

割り算は、ASTERIAに限らずコンピュータを使った数値計算において最も問題の起こりやすい特殊な演算です。従って、数値関数の中では特に注意する必要があります。

主な注意点は2点です。

  • ゼロで割ったらランタイムでExceptionが発生する
  • 演算の内容によって丸め誤差が発生する(有効数字)

以下の例では、特に有効数字の問題を中心に説明していきます。

マッパー内の下図の枠で囲まれた部分が、割り算をする方法のサンプルです。

ここでは、DIVIDE関数は2つのサンプルを用意しました。 2つのCONST関数の出力が入力されている点は上下ともに同じです。 上下で異なる点は、Scaleプロパティで設定する有効桁数の設定内容です。

上のDIVIDE関数のScaleプロパティは、デフォルトの「8」になっています。

DIVIDE
Scale 8

これは、小数点以下の有効桁数を8にするという意味です。この意味は、計算結果が小数第9位かそれ以上に細かくなった場合、小数第9位で四捨五入した値が出力されるということです(たとえば、0.123456789 は 0.12345679 になります)。計算結果が小数第8位までに収まった場合は、足りない桁数は0で埋められます。

ここでは、1番目に「2」、2番目に「3」が入力されていますので、3 / 2 = 1.5 です。ただし、有効桁数8桁なので、「1.50000000」が出力されます。

下のDIVIDE関数のScaleプロパティは、「0」に設定されています。

DIVIDE
Scale 0

これは有効桁数が0ということですから、計算結果が小数を含む場合には、小数第1位で四捨五入された値が計算結果として出力されることになります。

ここでは、1番目に「3」、2番目に「2」が入力されていますので、3 / 2 = 1.5 です。ただし、有効桁数0桁なので、小数第1位が四捨五入され、「2」が出力されます。

なお、ここまでは簡単なため丸め誤差を単に四捨五入として説明してきましたが、ASTERIAのバージョンがASTERIA 3 Service Pack 2 (Build 3.2.1341)までの場合、DIVIDE関数が行う四捨五入は正確にはIEEE 754という少し特殊な四捨五入になっていました。

これは、丸めの位の数が「5」の場合、四捨五入なら「五入」ということで常に繰り上げ扱いなのですが、IEEE 754の場合には上位桁が偶数になる方向に丸めるというものです。つまり、「2.5」は「2」になり、「3.5」は「4」になります。これは、有効数字の制約がある計算を何度も行う際に、累積されていく丸め誤差の影響を最小限にとどめることができる方式ですが、直観的には理解が難しいかも知れません。データの精度が求められる場合にはROUND関数であらかじめ四捨五入しておくのが確実です。

ASTERIA 3 Service Pack 3 (Build 3.3.2300)以降では、この仕様は改善されました。

(7) 固定値との計算

CALC関数を使うと、「マッピングで入力される動的に変化しうる値と、固定値の計算」をより簡単におこなうことができます。

単純に「1を足す」などの場合には、CONST関数とADD関数を使うよりもCALC関数を使ったほうがアイコン配置数が少ないので手間が減りますし、マッパーウインドウ上のスペースも節約できます。

マッパー内の下図の枠で囲まれた部分が、固定値との計算をする方法のサンプルです。

ここでは、1つのCONST関数の出力をCALC関数に入力しています。 CALC関数は次のようにプロパティ設定しています。

CALC
Calculation Divide
Data 100
Formula Data +|-|*|/ Input
Scale 0

Calculationプロパティは、入力値(Input)と固定値(Data)の計算方法です。ここでは、「Divide」(割り算)を選択しています。

Dataプロパティは、固定値の内容です。ここでは「100」を設定しています。

Formulaプロパティは、入力値と固定値をどちらの順番で計算するかを設定しています。「Input +|-|*|/ Data」を選択すると、たとえば 入力値 - 固定値 の順番で計算されます。逆に「Data +|-|*|/ Input」を選択すれば、固定値 - 入力値 の順番で計算されます。ここでは「Data +|-|*|/ Input」としており、Calculationプロパティが「Divide」ですので、 固定値 / 入力値 が計算されます。

Scaleプロパティは、DIVIDE関数と同じく有効桁数の設定です。ここでは「0」を設定していますので、小数第1位で四捨五入されます。

ここでは、入力値は「2」ですので、100 / 2 =「50」が出力されます。

(8) 数値フォーマット整形

FORMATDECIMAL関数を使うと、たとえば次のような数値フォーマット整形をすることができます。

  • 数値の左側を0埋めする
  • 3桁ごとにカンマを入れる

マッパー内の下図の枠で囲まれた部分が、数値フォーマット整形をする方法のサンプルです。

ここでは、1つのCONST関数の出力をFORMATDECIMAL関数に入力しています。 FORMATDECIMAL関数には次の設定をしています。

FORMATDECIMAL
Format 00000

Formatプロパティには、フォーマット方法を指定する記号を設定します。 たとえば、ここで設定している「00000」は、「入力された数値が5桁に満たない場合は、足りない桁数を0で埋める」という意味になります。(5桁以上の場合は、入力された数値がそのまま出力されます。)

ここでは「3」が入力されていますので、結果として「00003」が出力されます。

なお、フォーマットを次のように設定すれば、3桁ごとにカンマを入れ、小数部の有効数字を1桁にする処理が実現できます。

FORMATDECIMAL
Format #,###.#

FORMATDECIMAL関数では、「6. 二値の割り算」のDIVIDE関数の説明にあるように小数部の丸め方がIEEE 754という特殊な方法になっています。データの精度が求められる場合にはROUND関数であらかじめ四捨五入しておくのが確実です。

この他のフォーマット指定方法についての詳細は、ヘルプをご覧ください。

3.5.4 日付関数(日時の取得・演算・整形)

今度は、日付や時刻に関する処理の方法を見てみましょう。

ここでは、下記の処理をするサンプルを見ることができます。

説明番号 処理内容 使用するマッパー関数 アイコン
1 現在日時を取得する NOW - 日付タブ
2 日時フォーマットの変換 FORMATDATE - 変換タブ
3 文字列から日時型への変換 STRTODATE - 日付タブ
4 日時の加減算 DATECALC - 日付タブ

「日時操作関数」フローを開いてください。

このフローにもこれまでのフローと同様に、見た目を整形するためのVelocityコンポーネントが含まれていますが、内容の本質には関係はありません。

フローを開いたら、今度はフロー上のMapperコンポーネントを開いてください。このマッパーには7個のマッパー関数が配置されています。

個別の内容は後から見ていくこととして、ひとまずASTERIAデザイナからフローを実行してみましょう。結果は次のようになります。

それでは、個別の内容を見ていきましょう。

(1) 現在日時を取得する

現在日時を取得するには、NOW関数を使います。

マッパー内の下図の枠で囲まれた部分が、現在日時を取得する方法のサンプルです。

NOW関数には、設定する項目はありません。 実行結果を見ると「2005-02-27T14:13:02.873 JST」のように表示されます。これは、ASTERIA内部での日時型(DateTime型)を文字列として表現する場合のデフォルトのフォーマット形式です。

他のフォーマットに変換する方法は、次の項目をご覧ください。

(2) 日時フォーマットの変換

FORMATDATE関数を使うと、日付型データの文字列表現を任意の形式に変換することができます。

NOW関数の項目で説明したように、日付型を文字列表現する場合のデフォルトのフォーマット形式は、あまり日常では見かけない形式になっています。そこで、よくある「2005/02/27」や「2005年2月27日 14時13分」のような表現にしたい場合は、このFORMATDATE関数を使ってフォーマット形式を変換します。

マッパー内の下図の枠で囲まれた部分が、日時フォーマットの変換をする方法のサンプルです。

上のFORMATDATE関数は、次のように設定されています。

FORMATDATE
Format yyyy年M月d日 H時m分s秒

Formatプロパティで、フォーマット形式を指定しています。 ここでの設定内容を細かく解説すると、次のようになっています。
項目 フォーマット指定 意味
yyyy 年を西暦4桁で表示
M 1月〜9月は1桁で、10月〜12月は2桁で表示
d 日付を1日〜9日は1桁で、10日〜31日は2桁で表示
H 時刻を24時間制で、0時〜9時は1桁で、10時〜24時は2桁で表示
m 分を0分〜9分は1桁で、10分〜59分は2桁で表示
s 秒を0秒〜9秒は1桁で、10秒〜59秒は2桁で表示

なお、Formatプロパティに指定された文字列のうち、フォーマット指定として意味を持たない文字列はそのまま出力されます。上の例では、「年」「月」「日」「時」「分」「秒」の文字と、日と時の間の半角スペースが、フォーマット指定として意味を持たない文字列に該当します。

月、日、時、分、秒の値を常に2桁で表示したい場合は、MM、dd、HH、mm、ssのように指定してください。実例はこのあとすぐに出てきます。

また、「時刻を12時間制で表示する」「曜日を表示する」などのフォーマット指定も可能です。詳しくはヘルプをご覧ください。

中のFORMATDATE関数は、次のように設定されています。

FORMATDATE
Format yyyy年MM月dd日 HH時mm分ss秒

ここでは月、日、時、分、秒をいずれも常に2桁で表示するように指定しています(「MM」など)。 これにより、たとえば2月は「02月」のように表示されます。

下のFORMATDATE関数は、次のように設定されています。

FORMATDATE
Format yyyy/MM/dd

ここでは年、月、日までをスラッシュで区切って表示するように設定しています。

(3) 文字列から日時型への変換

文字列で表現された日時データを日時型データに変換するには、STRTODATE関数を使います。

マッパー内の下図の枠で囲まれた部分が、文字列から日時型への変換をする方法のサンプルです。

STRTODATE関数は、次のように設定されています。

STRTODATE
Format yyyy/MM/dd

Formatプロパティの設定内容に従って、入力された文字列を解釈し、日付型データとして出力します。「yyyy」などの意味はFORMATDATE関数と同じです。 たとえば、ここでは入力文字列を「2005/02/27」のような形式として解釈するように設定されています。

STRTODATE関数に入力された文字列が日付として解釈できなかった場合、エラーとはならずに「1970-01-01T09:00:00.000 JST」という日付が出力されます。たとえば、Formatプロパティを「yyyyMMdd」と設定しているSTRTODATE関数に文字列「2005/03/24」を入力すると、フォーマットが不一致となるため日付として解釈できません。

(4) 日時の加減算

DATECALC関数を使うと、たとえば「10日後の日付を取得する」といった、日時を加減算する処理を簡単に実現することができます。特に、年月の切り替わりやうるう年も自動的に考慮されますので、大変便利です。

マッパー内の下図の枠で囲まれた部分が、日時の計算をする方法のサンプルです。

DATECALC関数は、次のように設定されています。

DATECALC
Position Day
Calc 10

Positionプロパティは、年月日時分秒のうちのどこを加減算するかの設定です。ここでは「Day」ですので、日を計算対象としています。

Calcプロパティは、Positionプロパティで指定された箇所に加減算する値の設定です。ここでは「10」を設定していますので、(日を)10だけ足すという意味になります。たとえば「-20」とすれば(日を)20だけ引く、という意味になります。

ここではNOW関数の出力が入力されていますので、フローを実行した日時の10日後の日時が出力されます。サンプルは2005年2月27日に実行しましたので、出力は2005年3月9日となっています。

3.5.5 テーブル関数(変換表によるコード変換)

つづいて、変換表によるコード変換の方法を説明します。

ここでは、「コード変換」とは「顧客コードから顧客名を取得する」「営業部門の体系で発番された商品コードを、製造部門の体系での商品コードに変換する」といった処理を指しており、「変換表」とはその処理をする場合に用いる「顧客コードと顧客名の対照表」「営業部門体系での商品コードと製造部門体系での商品コードの対照表」を指しています。なお、変換内容の定義は固定ですので、N:1対応での変換となります。

M:N対応での変換を実現するには、何らかの情報に基づく場合分けや条件分岐が必要になりますので、変換表だけでは定義できません。 たとえば次の例では、1つの商品コードを場合により2通りの単価へと変換しています。

 「商品コード「S01」から変換表に基づき単価を取得する。ただし、セール期間中は単価を20%オフとする。」

このような処理を実現するには、このあとに説明する制御関数を組み合わせるなどの方法が必要になります。

サンプルでは、日本語で入力された色の名前を英語に変換して表示するという処理を例としてとりあげます。

「変換表によるコード変換」フローを開いてください。

処理内容はとても簡単です。マッパー内にはTABLE関数がひとつあるだけです。

このTABLE関数は、次のように設定されています。

TABLE
Mode File
FilePath input_data/table.csv
IllegalKey Key

Modeプロパティは、使用する変換表をファイルから読み込むか、「InlineTable」プロパティから読み込むかの設定です。ここでは「File」(変換表をファイルから読み込む)を選択しています。

FilePathプロパティは、変換表として使用するファイルの設定です。ここで使用するファイルは次の内容になっています。

一部の色名は、複数の日本語名を1つの英語名に変換しています。

このTABLE関数の動作を図であらわすと、次のようになります。

「白」が入力されると、変換表を検索し、「白」に対応する値として定義されている「White」を出力します。

なお、ここでは、1カラム目が変換元の値(キー)で、2カラム目が変換先の値です。 (KeyColumnプロパティが「1」で、ValueColumnが「2」のため。この設定を変えれば、どのカラムをキーとするか、どのカラムを変換先の値とするかを変更できます。)

IlligalKeyプロパティは、入力値が変換表のキーと一致せず、変換できなかった場合にどのような値を出力するかの設定です。ここでは「Key」を選択していますので、入力値がそのまま出力されます。「null String」を選択すると、null文字列が出力されます。

それでは、実行してみましょう。たとえば「白」と入力すると、変換されて「White」と出力されます。

〜FileモードとInlineモードの使い分け〜
2つのモードの使い分けは、変換表の更新頻度で判断するとよいでしょう。 更新頻度が低い場合は、「Inline」モードがおすすめです。それは、ASTERIAデザイナ内で設定が完結するため、フロー作成作業がよりスムーズに進むためです。 更新頻度が高い場合は、「File」モードがおすすめです。それは、変換表が通常のテキストファイルのため、ASTERIAデザイナを使うことなく変換表の更新ができるためです。

3.5.6 制御関数(値の選択・置換)

実際の業務では「○○フラグが1または2のときは固定値"A"を、3のときは固定値"B"を出力」というような、条件判断をして値を変換する処理がよく出てきます。ASTERIAでそのような処理を実現する場合、条件のパターンによって若干対応方法が異なります。パターンによっては理解が難しいものもありますので、典型例を分類してご説明します。

No. 出力値の選択方法 選択肢 使用する関数
1 条件式による 2択(固定値のみ) - 制御タブ
2 整数による N択 - 制御タブ
3 条件式による 2択
3 文字列による N択

「N択」とは、選択肢の数が任意という意味です。

(1) パターン1:条件式による選択(2択、固定値のみ)

1つめのパターンは、たとえば引数に入力された数値が、もし100未満ならば「入力値は100未満でした」、100以上ならば「入力値は100以上でした」というメッセージを返す処理の実現方法です。

「条件式による選択1」フローを開いてください。条件判断とメッセージの出力はマッパー内で行なっています。

処理内容は次のようになっています。Mapperコンポーネントを開いてください。

IF関数が配置されており、次のように設定されています。なお、「入力値」はInput1にマッピングされた値を指し、その値は条件式の左辺として評価されます。

IF
Data 100
Compare <
True 入力値は100未満でした
False 入力値は100以上でした

Dataプロパティは、条件式の右辺となる値で、入力値の比較対照となる値です。ここでは「100」がセットされています。

Compareプロパティは、左辺と右辺の比較条件の設定です。ここでは「<」となっていますので、
Input1 Compare Data
入力値 < 100
であるかどうかの条件判断をすることになります。

Trueプロパティは、比較条件を満たしていた場合にIF関数から出力される値の設定です。ここでは「入力値は100未満でした」という文字列が設定されています。

Falseプロパティは、比較条件を満たしていなかった場合にIF関数から出力される値の設定です。ここでは「入力値は100以上でした」という文字列が設定されています。

この設定で、引数に入力された数値が、もし100未満ならば「入力値は100未満でした」、100以上ならば「入力値は100以上でした」というメッセージを画面表示するという処理が実現されています。

なお、右辺はIF関数のInput2へのマッピングで設定することも可能です。Input2へのマッピングが存在する場合は、Dataプロパティの設定は使用されません。

それでは、実行してみましょう。まずは「入力値は100未満でした」が表示される例です。たとえば、実行時に引数として「99」を入力してから実行してみましょう。

実行するフローのStartコンポーネントにArgumentが設定されている場合、自動的に実行ダイアログのArgumentタブが開いて、引数に値をセットしてからフローを実行できるようになっています。

つづいて、「入力値は100以上でした」が表示される例です。たとえば、実行時の引数に「100」を入力して実行してみてください。

(2) パターン2:整数による選択(N択)

2つめのパターンは、たとえばCSVファイルを読み込み、その1カラム目の値をキーとして、キーが「2」ならばそのレコードの2カラム目の値を、キーが「3」ならば3カラム目の値を、キーが「4」ならば4カラム目の値を出力するという処理の実現方法です。

ポイントは、キーとなる値が元々「連続した整数」となっている場合はCHOICE関数だけで出力する値を選択できるという点と、CHOICE関数では3択以上の複数の選択肢から出力値を選択することもできるという点です。

「整数による選択」フローを開いてください。

読み込むCSVファイルは次の内容になっています。

この処理は、マッパーの中で次のようにして実現されています。

CHOICE関数のInput1にfield1が、Input2にfield2が、Input3にfield3が、Input4にfield4がマッピングされています。

また、次のプロパティ設定がされています。

CHOICE
Base 2

ここで、CHOICE関数の動作を解説します。最初はわかりにくいかも知れませんが、実際の動作と照らし合わせながら考えると、だんだんわかってくるかと思います。

CHOICE関数は、ちょうどオーディオについているセレクターのような動作をします。オーディオについているセレクターは、ツマミをまわして入力ソースを選ぶと、そこから入ってきた音をアンプに流して、やがてスピーカーから音が出ます。

CHOICE関数では、Input1に入力した値が「どこから入力された値を出力するのか」の設定(=ツマミがどこに合っているか)で、Input2以降に入力した値が「出力の選択肢」(=入力ソース)になります。

今回のサンプルでは、Input1には「2」または「3」または「4」が入力されてきます。Input2にはfield2の値、Input3にはfield3の値、Input4にはfield4の値が入力されています。

ですから、たとえばサンプルデータの1レコード目の場合、Input1の値は「2」ですから、Input2の値「レコード1カラム2」が選択され、出力されます。

BaseプロパティはInput1に入力される値(選択肢の連番)がいくつから始まるのかの設定です。ここでは「2」「3」「4」のいずれかが入力されますので、連番は「2」で始まっています。そこで、Baseプロパティを「2」に設定しています。

それでは、実行してみましょう。キー項目の番号に従ったデータが出力されています。

(3) パターン3:条件式による選択(2択、変数可)

3つめのパターンは、条件式による選択(パターン1)の応用です。パターン1では出力は固定値でしたが、ここではたとえば、引数に入力された数値が、もし100未満ならば「入力値は100未満でした」、100以上ならば入力された数値そのものを画面表示するという処理を実現したいとします。

これはパターン1の処理と似ていますが、入力された数値そのもの(変数値)を、条件式の左辺だけでなく出力としても扱う部分が異なります。

そして、この処理はIF関数だけでは実現することができません。IF関数のInput1とInput4に同じ値をマッピングすることができないためです。

このとき、IF関数とCHOICE関数を組み合わせれば、問題をクリアすることができます。

「条件式による選択2」フローを開いてください。

処理内容は、次のようになっています。

それぞれのマッパー関数の役割分担は次のようになっています。特に、CHOICE関数に注目してください。

IF関数 条件判断をします。ただし、出力内容は条件を満たしていたか、いなかったかを示す数値です。
CONST関数 「入力値は100未満でした」の文字列を設定しています。
CHOICE関数 IFでの条件判断の結果を受けて、実際に出力する値の選択をしています。ここでは、Input1(CONST関数からの値)か、Input2(引数"InputNumber"からの値)のどちらかを出力することになります。

もっと細かく設定内容を見ると、次のようになっています。

IF
Data 100
Compare <
True 1
False 2

プロパティの意味は、パターン1の場合と同じです。ここでは、「入力値 < 100」を満たしていたら「1」が、満たしていなかったら「2」が出力されます。

CONST
Data 入力値は100未満でした

「入力値は100未満でした」の文字列を出力しています。

CHOICE関数: CHOICE関数ではなにも設定していません。 このサンプルでは、CHOICE関数には「IF関数の出力」「CONST関数の出力」「引数"InputNumber"」がこの順番で入力されています。

それでは、実行してみましょう。まずは「入力値は100未満でした」が表示される例です。たとえば、実行時に引数として「99」を入力してから実行してみましょう。

つづいて、入力した数値がそのまま表示される例です。たとえば、実行時の引数に「100」を入力して実行してください。

(4) パターン4:文字列による選択(N択)

4つめのパターンは、たとえばCSVファイルを読み込み、その1カラム目が「UPPER」ならば2カラム目の値をすべて大文字に変換し、「lower」ならばすべて小文字に変換し、「None」ならば変換せずにそのまま出力するという処理の実現方法です。

このパターンは、基本的にはCHOICE関数を使う「パターン2」と同じような処理です。しかし「パターン2」と異なり、入力された値をそのままCHOICE関数のパラメータにすることができません。そこでこのパターンでは、入力値をパラメータとして使えるようにTABLE関数を使って変換する前処理をしています。

もっと詳しく言えば、CHOICE関数のInput1に入力する値は「連続した正の整数」が必要なため、入力値を連続する整数へ変換する前処理をする、というわけです。

では、「文字列による選択」フローを開いてください。

このフローのマッパーでは、2カラムのCSVファイルから読み込んだデータをCHOICE関数で変換し、結果を3カラム目に追加して出力しています。

ポイントは、TABLE関数とCHOICE関数です。 TABLE関数では、読み込んだCSVファイルの1カラム目の入力値を数値に変換しています。この数値がCHOICE関数に渡すパターン番号となります。ここでは、次のように設定されています。

TABLE
Mode Inline
InlineTable UPPER,1
lower,2
None,3

これは、Inlineモードで、入力値が「UPPER」ならば「1」を、「lower」ならば「2」を、「None」ならば「3」を出力する設定です。

3.5.5の例と違い、Inlineモードで変換しています。

CHOICE関数は、Input1にTABLE関数の出力が、Input2にUPPER関数の出力が、Input3にLOWER関数の出力が、Input4に読み込んだCSVファイルの2カラム目の値がそのままマッピングされています。

それでは実行してみましょう。読み込むCSVファイルは次の内容です。

たしかにマッパーでの設定どおりに変換され、

  • Input1 = 1のときは、大文字化された文字列が
  • Input1 = 2のときは、小文字化された文字列が
  • Input1 = 3のときは、なにも変換されていない文字列が
出力されました。