uCosminexus Interschema ユーザーズガイド

[目次][用語][索引][前へ][次へ]

6.7.3 関数

FDLエディタ及びMDLエディタの式中に使用できる関数について説明します。FDLエディタ及びMDLエディタで記述する式中には,Interschemaが標準で提供している関数以外に,ユーザが定義した関数を組み込んで使用できます。ここでは,標準で提供している関数について説明します。ユーザが定義した関数を組み込む方法については,「11. ユーザ組み込み関数」を参照してください。

FDLエディタ及びMDLエディタで記述する式中で使用できる関数の一覧を次に示します。

表6-14 関数一覧

関数種別 関数の書式 戻り値型 説明
数字操作 ROUND (i_num1, 整数定数i) i_num i_num1を指定桁で四捨五入した値を返します。
  • i >= 0のとき,小数点以下第i+1桁を四捨五入
  • i < 0のとき,整数部第-i桁を四捨五入
FLOOR (i_num1, 整数定数i) i_num i_num1を指定桁で切り捨てた値を返します。
  • i >= 0のとき,小数点以下第i+1桁を切り捨てる
  • i < 0のとき,整数部第-i桁を切り捨てる
CEIL (i_num1, 整数定数i) i_num i_num1を指定桁で切り上げた値を返します。
  • i >= 0のとき,小数点以下第i+1桁を切り上げる
  • i < 0のとき,整数部第-i桁を切り上げる
SUM (i_num1, ...)※1 i_num i_num1...の和を返す。
文字列
操作
LEFT (i_string1, i_num1) i_string
※2
i_string1の左端(先頭)からINT(i_num1)文字目までの文字列を取り出します。i_string1の文字数がINT(i_num1)文字より小さい場合,i_string1全体を返します。
RIGHT (i_string1, i_num1) i_string1の右端(末尾)からINT(i_num1)文字目までの文字列を取り出します。i_string1の文字数がINT(i_num1)文字より小さい場合,i_string1全体を返します。
MID (i_string1, i_num1, i_num2) i_string1の左端(先頭)のINT(i_num1)文字目からINT(i_num2)文字目までの文字列を取り出します。INT(i_num1)が0の場合,文字列の先頭からINT(i_num2)文字目までの文字列を取り出します。INT(i_num2)が0の場合,INT(i_num1)文字目以降のすべての文字列を取り出します。
STRLEN (i_string1) i_num i_string1の文字数を返します。
ADDSTRING (i_string1, ...)※1 i_string i_string1...を指定された順序で連結します。※3
バイト列
操作
ADDSTREAM (i_stream1, ...)※1 i_stream i_stream1...を指定された順序で連結します。
CUTSTREAM (i_stream1, i_num1. i_num2) i_stream
※2
i_stream1の先頭INT(i_num1)バイト目からINT(i_num2)バイト目までのバイト列を取り出します。INT(i_num1)が0の場合,バイト列先頭からINT(i_num2)バイトのバイト列を取り出します。INT(i_num2)が0の場合,INT(i_num1)バイト目以降のすべてのバイト列を取り出します。
日時操作 CURRENTDATE ( ) i_dtm 現在の日付を返します。
CURRENTTIME ( ) 現在の時刻を返します。
CURRENTDTM ( ) 現在の日付時刻を返します。
SETDATETIME (CC,YY,MM,DD,hh,mm,ss,zz)
CC〜ss:i_num
zz:i_string or i_null
日付時刻型の値を設定します。パラメタの意味は,次のとおりです。

CC=西暦年上位2桁,YY=西暦年下位2桁,MM=月,DD=日,hh=時,mm=分,ss=秒,zz=ゾーン
ゾーン部なしとする場合は,zzに%NULLを指定します。
GETDATETIME (整数定数i, i_dtm) i_num 整数定数iの値に応じて次のパート値を返します。
 i = 0 CCYY (西暦年)
 i = 1 CC (西暦年上位2桁)
 i = 2 YY (年)
 i = 3 MM (月)
 i = 4 DD (日)
 i = 5 hh (時)
 i = 6 mm (分)
 i = 7 ss (秒)
GETDTMZONE (i_dtm) i_string 日付時刻型のゾーン部文字列を返す。ゾーン部がない場合はi_nullを返します。
型変換 TOSTRING (i_num1, i_string1) i_string i_num1を書式文字列i_string1に従ってi_string型に変換します。変換結果の文字列の文字コードはJIS8になります。
書式文字列の形式は次のとおりです。形式に従って1バイト文字で指定します。[ ]内は省略できます。符号は,先頭又は末尾のどちらかにだけ指定できます。

書式1
形式:
[I] [符号] [整数部桁数] [.[小数部桁数]] [符号]
  • 符号:
    「*」は必ず付けます。「-」は負の場合だけ付けます。
桁数の指定がない場合は有効数字だけ出力します。指定された桁数が実際の桁数より小さい場合,整数部は上位桁,小数部は下位桁が切り捨てられます(エラーにはなりません)。指定された桁数が実際の桁数より大きい場合,不足桁分には0を補います。桁数に0を指定した場合は,その整数部又は小数部の数値を出力しません(0も出力しません)。符号指定がない場合は負の値であっても符号を付けません。
書式の先頭に「I」を指定した場合は,小数点文字を出力しません。書式の先頭に「I」を指定する場合は,小数部桁数の指定は省略できません。
前負符号,整数部2桁,小数部1桁を指定する書式文字列は,“-2.1”となります。

書式2
形式:H[0][X] 又は h[0][x]
  • 0:
    偶数バイトで出力します。奇数バイトになるデータの場合は,前に「0」が付加されます。
  • x/X:
    先頭に「0x」が付加されます。
  • H:
    英大文字で文字列化されます。
  • h:
    英小文字で文字列化されます。
16進表記文字列に変換します。小数部及び負符号は無視されます。
HEXSTRTONUM (i_string1) i_num 16進表記文字列i_string1をi_num型に変換します。文字列先頭の「0x」の有無,及び英大文字/英小文字の使用は任意です。また,文字列は奇数バイトでも使用できます。
HEXSTRTOSTREAM (i_string1) i_stream 16進表記文字列i_string1をi_stream型に変換します。文字列先頭の「0x」の有無,及び英大文字/英小文字の使用は任意です。また,文字列は奇数バイトでも使用できます。
STREAMTOHEXSTR (i_stream1) i_string i_stream1を16進表記文字列に変換します。文字列先頭の「0x」は付加されません。英小文字で文字列化されます。変換結果文字列の文字コードはJIS7です。出力文字列は偶数バイトになります。
条件 IF (条件式, any1, any2) any1
又は
any2
条件式の評価結果がTRUEならany1,FALSEならany2を評価して返します。戻り値型は評価結果に依存します。
IFEXIST (グローバル名, any) any グローバル名が指すコンポーネントがあれば該当するコンポーネント,なければanyを返します。
対象が型要素の場合は,値がある場合にあると見なします。対象が構造の場合は,子コンポーネント以下の要素のどれかに値があればあると見なします。セパレータしか現れない場合は,ないと見なします。
コンポーネントがあるかないかの判定は,「その他」のEXIST関数と同じです。
XML操作 GETTAGNAME (グローバル名) i_string グローバル名がXML要素を表す場合,対応するXMLタグ名を返します。グローバル名がXML属性を表す場合,該当する属性名を返します。その他の場合はi_nullを返します。
GETANYTEXT (ANY型グローバル名, 整数定数i) i_string ANY型のコンポーネントのデータから,タグ間テキストだけを抽出して連結したデータを返します。指定したコンポーネントがANY型でないなどの不正時はi_nullを返します。最上位要素(ANY型自身)のテキストデータのwhite spaceの扱いは,実行時オプション「-XWS」に従った結果に対して処理します。
テキスト連結方法は,整数定数iの指定に従います。
  • i =0の場合
    タグ間テキストをそのまま連結します。
  • i =1の場合
    タグごとに前後のwhite spaceを削除して連結します。
  • i =2の場合
    文字列中のwhite spaceをスペース文字に置換し,連結後の文字列前後のwhite spaceを削除します。また,連続するスペースを1スペース文字に置換します。
EXISTXML (グローバル名) i_bool 評価済みのコンポーネントがあればTRUE,なければFALSEを返します。
対象が型要素の場合は,値がある場合にあると見なします。対象が構造の場合は,子コンポーネント以下の要素のどれかに値があればあると見なします。セパレータしか現れない場合は,ないと見なします。対象がXML要素又はXML属性の場合は,タグ又は属性名が出現すれば,データがなくてもあると見なします(空要素をあると見なします)。
EXISTXML関数は,XML要素又はXML属性に対しての判定以外は,「その他」のEXIST関数と同じです。
EXISTCOUNTXML (グローバル名, ...)※1 i_num 引数すべてにEXISTXML関数を適用して,TRUEになった数を返します。
対象がXML要素又はXML属性の場合は,タグ又は属性名が出現すれば,データがなくてもあると見なします(空要素をあると見なします)。
EXISTCOUNTXML関数は,XML要素又はXML属性に対しての判定以外は,「その他」のEXISTCOUNT関数と同じです。
ARRAYREALSIZEXML (グローバル名) i_num 評価済みのコンポーネントの配列要素数を返します(空の要素はカウントしません,XMLの空要素はカウントします)。
対象がXML要素又はXML属性の場合は,タグ又は属性名が出現すれば,データがなくてもあると見なします(空要素をあると見なします)。
ARRAYREALSIZEXML関数は,XML要素又はXML属性に対しての判定以外は,「その他」のARRAYREALSIZE関数と同じです。
GETCOMPXML (整数定数i, グローバル名, ...)※1
整数定数は1以上
any グローバル名で指定されたコンポーネントの中から,整数定数i番目に出現したコンポーネントを返します。
対象がXML要素又はXML属性の場合は,タグ又は属性名が出現すれば,データがなくてもあると見なします(空要素をあると見なします)。
GETCOMPXML関数は,XML要素又はXML属性に対しての判定以外は,「その他」のGETCOMP関数と同じです。
GETCOMPIFXML (基点パス名, 条件式,整数定数i, 連結パス名, ...)※1
整数定数は1以上
any 連結パス名で指定されたコンポーネントで指定条件式を満たすもののうち,整数定数i番目に出現したコンポーネントを返します。
対象がXML要素又はXML属性の場合は,タグ又は属性名が出現すれば,データがなくてもあると見なします(空要素をあると見なします)。
GETCOMPIFXML関数は,XML要素又はXML属性に対しての判定以外は,「その他」のGETCOMPIF関数と同じです。
IFEXISTXML (グローバル名, any) any グローバル名が指すコンポーネントがあれば該当するコンポーネント,なければanyを返します。
対象が型要素の場合は,値がある場合にあると見なします。対象が構造の場合は,子コンポーネント以下の要素のどれかに値があればあると見なします。セパレータしか現れない場合は,ないと見なします。対象がXML要素又はXML属性の場合は,タグ又は属性名が出現すれば,データがなくてもあると見なします(空要素をあると見なします)。
コンポーネントがあるかないかの判定は,「XML操作」のEXISTXML関数と同じです。
特殊 ORDEROFFSET (i_num1, i_num2) 現在の位置からi_num1相対オフセット位置にあるi_num2長のバイト列を,順序決定式の値とします。
順序決定式を定義する場合だけ使用できます。
EXISTWHILE (i_num1, i_num2, i_bool1, i_stream1) 現在の位置からi_num1相対オフセット位置にあるi_num2長のバイト列を,関数引数として指定されたi_stream1バイト列と比較します。
条件i_bool1が%TRUEの場合,比較した結果が一致する間,コンポーネントが出現すると見なします。
条件i_bool1が%FALSEの場合は,比較した結果が不一致の間,コンポーネントが出現すると見なします。
第4パラメタi_stream1は,コンポーネントの出現を判定するごとに毎回評価されます。
出現回数決定式を定義する場合だけ使用できます。
WHILE (条件式) 条件式が満たされる間,コンポーネントが出現すると見なします。条件式は,コンポーネントの出現を判定するごとに毎回評価されます。
出現回数決定式を定義する場合だけ使用できます。
その他 LENGTH (グローバル名) i_num グローバル名が指すコンポーネントのバイト長を返します。ただし,対象がXML要素(含む属性)の場合は,常に0を返します。
グローバル名で指定されたコンポーネントの子孫がグループ単位出力指定で処理済みの場合,そのコンポーネント分のサイズは0として計算します。
INDEX (整数定数)
整数定数は0以上
i_num 対象コンポーネント(現在評価中の式が定義されているコンポーネント)の整数定数で指定された分だけ上の階層にあるコンポーネントの,現在のインデクスを返します。
構造に対する評価規則中のINDEX関数は,その構造がコンポーネントとして使われている場所を0として適用します。
ARRAYSIZE (グローバル名) i_num 評価済みのコンポーネントの配列要素数を返します(空の要素もカウントします)。
ARRAYREALSIZE (グローバル名) i_num 評価済みのコンポーネントの配列要素数を返します(空の要素はカウントしません)。
EXIST (グローバル名) i_bool 評価済みのコンポーネントがあればTRUE,なければFALSEを返します。
対象が型要素の場合は,値がある場合にあると見なします。対象が構造の場合は,子コンポーネント以下の要素のどれかに値があればあると見なします。セパレータしか現れない場合は,ないと見なします。
対象がXML要素で,データを持たない場合(EMPTY要素などタグだけ出現するもの)は,FALSEを返します。
EXISTCOUNT (グローバル名,...) ※1 i_num 引数すべてにEXIST関数を適用して,TRUEになった数を返します。
VALUEMAP(入力側要素グローバル名, 出力側要素グローバル名, {入力側項目番号, 出力側項目番号}, ...) 出力要素の型 値定義を持つ要素間で,値を対応付けます。対応付ける値の項目番号(値定義での出現順)を組にして複数指定します。項目番号「0」は,値定義に現れない値を意味します。
GETCOUNT( ) i_num システムが持っているカウンタの値を返します。FDL又はMDLの中でカウンタが指定されていない場合は,何も返しません。
GETCOMP(整数定数i, グローバル名, ...)※1
整数定数は1以上
any グローバル名で指定されたコンポーネントの中から,整数定数i番目に出現したコンポーネントを返します。GETCOMP関数は,ほかの関数(GETCOMPIF関数,GETCOMPIFXML関数を除く)の引数のグローバル名として使用できます。
GETCOMPIF(基点パス名, 条件式,整数定数i, 連結パス名, ...)※1
整数定数は1以上
any 連結パス名で指定されたコンポーネントで指定条件式を満たすもののうち,整数定数i番目に出現したコンポーネントを返します。GETCOMPIF関数はGETCOMPIF関数,GETCOMPIFXML関数
を除いたほかの関数の引数のグローバル名として使用できます。また,GETCOMPIF関数の引数にGETCOMP関数,GETCOMPXML関数,GETCOMPIF関数,及びGETCOMPIFXML関数は使用できません。

(凡例)
−:戻り値はありません。

注※1
引数のインデクスに「*」を使用できる関数です。

注※2
取り出す文字列(又はバイト列)がない場合はi_null型を返します。なお,文字列(又はバイト列)の先頭の文字数(又はバイト数)は1です。

注※3
文字コードが異なる文字列を連結する場合,文字セットとして大きい側の文字コードへ変換します。

VALUEMAP関数,GETCOMP関数,及びGETCOMPIF関数については,例を挙げて次に説明します。

<この項の構成>
(1) VALUEMAP関数
(2) GETCOMP関数
(3) GETCOMPIF関数

(1) VALUEMAP関数

VALUEMAP関数を使用した,要素の値同士のマッピング例を次に示します。

入力側要素:IN@A
値リスト:{"AAA", "BBB", "CCC" } 値定義のエラー検証なし

出力側要素:OUT@X
値リスト:{"XX", "YY", "ZZ" } 値定義のエラー検証なし

マップ式を次のように記述します。

 
= VALUEMAP(IN@A, #, 1, 2, 2, 3, 3, 1, 0, 0);
 

この場合のマッピング関係を次に示します。「その他」は,値定義されていない値を意味し,入力された値をそのまま出力する指定になります。

図6-26 VALUEMAP関数を使用した値のマッピング例

[図データ]

(2) GETCOMP関数

GETCOMP関数は,入力側にある選択構造の子コンポーネントで,何番目に出現するか分からないコンポーネントを取り出す場合などに使用します。

GETCOMPの例を次に説明します。

図6-27 GETCOMP関数を使用した例

[図データ]

入力側フォーマット「IN」は,選択構造「TFD」の要素「x1」から「xn」が順不同で現れ,出力側フォーマット「OUT」は,要素「y1」から「yn」を順番に出力すると仮定します。また,入力側の要素「xi」を出力側の要素「yi」へマッピングすると仮定します。

この場合,要素「yi」に対するマップ式は次のようになります。

 
= GETCOMP( 1, IN@...@MSG@TFD[*]@xi) ;
 

入力側の構造「TFD」の子コンポーネントのうち,1番目に現れた「xi」を「yi」へ代入する」意味になります。

(3) GETCOMPIF関数

GETCOMPIF関数は,GETCOMP関数によって取り出されるコンポーネントに対する条件を追加したものです。例えば,入力側で繰り返し出現する構造コンポーネントがコードを表す子コンポーネントと値を表すコンポーネントを持つ場合に,その構造コンポーネントが特定のコードを持つときの値(要素)を取り出すために使用します。

基点パス名には検索対象のコンポーネントを指定します。連結パス名は実際に取り出す対象のコンポーネントを指定します。条件式内のパス名及び連結パス名では,基点パスで指定したコンポーネントの子に対して,基点パス部分を「&」とし,パス名を「&@xxx」と記述できます。基点パスコンポーネントそのものを表す場合は「&&」と指定します。基点パス名及び連結パス名ではインデクスに「*」を使用できますが,条件式内では使用できません。

GETCOMPIF関数の使用例を次に示します。

図6-28 GETCOMPIF関数を使用した例

[図データ]

例のように,入力側フォーマット「IN」の構造「SEG」から,codeが「1」であるときのvalueをOUTフォーマットのdata1へ,codeが「2」のときのvalueをOUTフォーマットのdata2へ出力する場合,data1及びdata2のマップ式は次のようになります。

 
data1 = GETCOMPIF(IN@...@MSG@SEG[*], &@code == 1, 1, &@value);
data2 = GETCOMPIF(IN@...@MSG@SEG[*], &@code == 2, 1, &@value);