ユーザー定義変数は、プログラム内でユーザーが定義するフィールドです。 ユーザー定義変数は、追加の処理または表示のためにプログラム処理の特定のポイントで得られた値または中間結果を保存するために使用します。
このドキュメントでは、次のトピックについて説明します。
『Natural の使用』ドキュメントの「ユーザー定義変数の命名規則」も参照してください。
ユーザー定義変数を定義するには、DEFINE DATA
ステートメントで名前とフォーマット/長さを指定します。
以下の表記に従って、変数の特徴を定義します。
(r,format-length/index) |
この表記は変数名の後に、任意で 1 つ以上の空白で区切って記述します。
各表記要素の間に空白を入れることはできません。
各要素は、必要に応じて個別に指定できます。まとめて指定する場合は、上記の文字で区切る必要があります。
例:
以下の例では、英数字フォーマットで 10 桁の長さのユーザー定義変数が、#FIELD1
という名前で定義されています。
DEFINE DATA LOCAL 1 #FIELD1 (A10) ... END-DEFINE
注意:
DEFINE DATA LOCAL
節が含まれている場合、ステートメント内で変数をダイナミックに定義することはできません。
ステートメントラベルまたはソースコード行番号は、前の Natural ステートメントを参照するために使用できます。 この参照は、Natural のデフォルトの参照を変更したり(各ステートメントの記述に従って実行可能な場合)、処理内容を説明したりするために使用できます。 「ループ処理」の「プログラム内のステートメント参照」も参照してください。
以下では次のトピックについて説明します。
ステートメント参照表記を指定しない場合、通常は以下の参照が適用されます。
デフォルトでは、最も内側のアクティブなデータベースループ(FIND
、READ
、HISTOGRAM
)で読み込まれているフィールドが参照されます。
アクティブなデータベースループでフィールドが読み込まれていない場合、まだクローズされていないループ内にあり、かつ、当該フィールドが読み込まれている、直前の GET
ステートメント(レポーティングモードでは FIND FIRST
または FIND UNIQUE
ステートメントも可)が参照されます。
ループ処理を開始したり、データ要素によるデータベースへのアクセスを実行したりする Natural ステートメントには、後で参照するための記号ラベルをマークできます。
ラベルは、参照するオブジェクトの前に label.
という形式で指定するか、または参照するオブジェクトの後に (label.)
という形式で指定します。ただし、同時に指定することはできません。
ラベルの命名規則は、変数の名前の命名規則と同一です。 ラベル名の後のピリオドは、そのエントリをラベルとして識別するために機能します。
例:
... RD. READ PERSON-VIEW BY NAME STARTING FROM 'JONES' FD. FIND AUTO-VIEW WITH PERSONNEL-ID = PERSONNEL-ID (FD.) DISPLAY NAME (RD.) FIRST-NAME (RD.) MAKE (FD.) END-FIND END-READ ...
ステートメントは、ステートメントが記述されているソースコード行を使用して参照することもできます。
4 桁すべての行番号を指定する必要があります(先行ゼロは省略不可能)。
例:
... 0110 FIND EMPLOYEES-VIEW WITH NAME = 'SMITH' 0120 FIND VEHICLES-VIEW WITH MODEL = 'FORD' 0130 DISPLAY NAME (0110) MODEL (0120) 0140 END-FIND 0150 END-FIND ...
Natural ソースプログラムの行番号が変更されると、ステートメントを参照する 4 桁のソースコード行番号(「表記 (r) を使用したデータベースフィールドの参照」を参照)も変更されます。 ユーザーの使いやすさ、読みやすさ、およびデバッグのしやすさのために、ステートメント、英数字定数、またはコメントで行われるソースコード行番号への参照はすべて、番号が振り直されます。 ステートメントや英数字定数内のソースコード行番号参照の位置(先頭、中間、最後)は影響しません。
有効なソースコード行番号参照として認識され、番号が振り直されるパターンは以下のとおりです(nnnn は 4 桁の数字)。
パターン | ステートメントの例 |
---|---|
(nnnn) |
ESCAPE BOTTOM (0150) |
(nnnn / |
DISPLAY ADDRESS-LINE(0010/1:5) |
(nnnn, |
DISPLAY NAME(0010,A10/1:5) |
左側のカッコまたは 4 桁の数字 nnnn
の後に空白がある、または 4 桁の数字 nnnn
の後にピリオドがある場合、そのパターンは有効なソースコード行参照とみなされません。
英数字定数内の 4 桁の数字が不用意に変更されないようにするには、定数を複数に分割し、ハイフンを使用して単一の値に連結する必要があります。
例:
Z := 'XXXX (1234,00) YYYY'
上記の例は、以下のように変更します。
Z := 'XXXX (1234' - ',00) YYYY'
ユーザー定義変数のフォーマットおよび長さは、変数名の後のカッコ内に指定します。
固定長の変数は、以下のフォーマットおよび対応する長さで定義できます。
ダイナミック変数のフォーマットおよび長さについては、「ダイナミック変数の定義」を参照してください。
フォーマット | Explanation | 定義可能な長さ | 内部的な長さ(バイト) |
---|---|---|---|
A | 英数字 | 1~1073741824(1 GB) | 1 - 1073741824 |
B | バイナリ | 1~1073741824(1 GB) | 1 - 1073741824 |
C | 属性制御 | - | 2 |
D | 日付 | - | 4 |
F | 浮動小数点 | 4 または 8 | 4 または 8 |
I | 整数 | 1、2 または 4 | 1、2 または 4 |
L | 論理 | - | 1 |
N | 数値(アンパック) | 1 - 29 | 1 - 29 |
P | パック型数値 | 1 - 29 | 1 - 15 |
T | 時刻 | - | 7 |
U | Unicode(UTF-16) | 1~536870912(0.5 GB) | 2 - 1073741824 |
長さは、フォーマットを指定した場合にのみ指定できます。 フォーマットによっては、長さを明示的に指定する必要のないものもあります(上記の表を参照)。
フォーマット N または P で定義するフィールドには、nn.m
という形式で小数点の位置を指定できます。 nn は小数点の前の桁数を、m
は小数点の後の桁数を表します。 nn
と m を合計した値は 29 を超えることはできません。また、m の値は 7 を超えることはできません。
最大の "定義可能な長さ"(英数字、バイナリ、Unicode フィールドの場合は 1 GB)は、Natural コンパイラの制限によるものです。 ただし、実際には、データストレージとして取得可能なメモリ量はずっと少なくなります。 特に "Natural スレッド" 環境で実行する場合、セッションのサイズはユーザーエリアに依存します。したがって、データエリア内のユーザーフィールドのサイズは、マクロ NTSWPRM
内のキーワードパラメータ MAXSIZE
で定義されている値に制限されます。
注意:
DISPLAY
、WRITE
、INPUT
の各ステートメントで出力する場合、Natural によって、出力のために内部的にフォーマット N に変換されます。
FS
によって無効化されていない限り、デフォルトのフォーマット/長さの N7 が使用されます。
データベースフィールドの場合、DDM でフィールドに対して定義されているフォーマット/長さが適用されます。 レポーティングモードでは、データベースフィールドに対し、異なるフォーマット/長さをプログラム内で定義することもできます。
ストラクチャードモードでは、データエリア定義または DEFINE DATA
ステートメントでのみ、フォーマットおよび長さを指定できます。
DEFINE DATA LOCAL 1 EMPLOY-VIEW VIEW OF EMPLOYEES 2 NAME 2 FIRST-NAME 1 #NEW-SALARY (N6.2) END-DEFINE ... FIND EMPLOY-VIEW ... ... COMPUTE #NEW-SALARY = ... ...
レポーティングモードでは、DEFINE DATA
ステートメントを使用していなければ、プログラムの本体でフォーマット/長さを定義できます。
... ... FIND EMPLOYEES ... ... COMPUTE #NEW-SALARY(N6.2) = ... ...
英数字(A)、数値(B、F、I、N、P)の各標準フォーマットの他に、Natural では以下の特殊フォーマットがサポートされています。
フォーマット C で定義されている変数は、DISPLAY
、INPUT
、WRITE
の各ステートメントで使用されているフィールドに属性をダイナミックに割り当てるために使用できます。
フォーマット C の変数には、長さを指定できません。 この変数には常に 2 バイトの長さが Natural によって割り当てられます。
例:
DEFINE DATA LOCAL 1 #ATTR (C) 1 #A (N5) END-DEFINE ... MOVE (AD=I CD=RE) TO #ATTR INPUT #A (CV=#ATTR) ...
詳細については、セッションパラメータ CV
の説明を参照してください。
フォーマット D および T で定義されている変数は、日付および時刻の演算や表示に使用できます。 フォーマット D には、日付情報のみを指定できます。 フォーマット T には、日付および時刻の両方の情報を指定できます。つまり、日付情報は時刻情報のサブセットです。 時刻は、1/10 秒単位でカウントされます。
フォーマット D および T の変数には、長さを指定できません。 フォーマット D の変数には常に 4 バイトの長さ(P6)が、フォーマット T の変数には常に 7 バイトの長さ(P12)が、Natural によって割り当てられます。 プロファイルパラメータ
MAXYEAR
が 9999
に設定されている場合、フォーマット D の変数には常に 4 バイトの長さ(P7)が、フォーマット T の変数には常に 7 バイトの長さ(P13)が、Natural によって割り当てられます。
例:
DEFINE DATA LOCAL 1 #DAT1 (D) END-DEFINE * MOVE *DATX TO #DAT1 ADD 7 TO #DAT1 WRITE '=' #DAT1 END
詳細については、セッションパラメータ EM
と、システム変数 *DATX
および *TIMX
の説明を参照してください。
日付フィールドの値は、1582 年 1 月 1 日~2699 年 12 月 31 日の範囲内の値である必要があります。
フォーマット L で定義されている変数は、論理条件の基準として使用できます。 この変数の値は、TRUE
または FALSE
になります。
フォーマット L の変数には、長さを指定できません。 フォーマット L の変数には常に 1 バイトの長さが Natural によって割り当てられます。
例:
DEFINE DATA LOCAL 1 #SWITCH(L) END-DEFINE MOVE TRUE TO #SWITCH ... IF #SWITCH ... MOVE FALSE TO #SWITCH ELSE ... MOVE TRUE TO #SWITCH END-IF
論理値表示の詳細については、セッションパラメータ EM
の説明を参照してください。
HANDLE OF OBJECT
として定義されている変数は、オブジェクトハンドルとして使用できます。
オブジェクトハンドルの詳細については、「NaturalX」を参照してください。
インデックス表記は、配列フィールドに対して使用します。
インデックス表記には、整数値定数またはユーザー定義変数を使用できます。 ユーザー定義変数は、フォーマット N(数値)、P(パック型)、I(整数)、B(バイナリ)のいずれかを使用して指定できます。フォーマット B は、長さが 4 以下の場合にのみ使用できます。
システム変数、システム関数、修飾された変数は、インデックス表記に使用できません。
#ARRAY (3)
オカレンス数 3 の 1 次元配列を定義します。
FIELD (label.,A20/5) または label.FIELD(A20/5)
label.
でマークしたステートメントを参照するデータベースフィールドを基にした、英数字フォーマットで長さ 20、オカレンス数 5 の配列を定義します。
#ARRAY (N7.2/1:5,10:12,1:4)
最初のオカレンス数が 5、2 番目のオカレンス数が 3、3 番目のオカレンス数が 4 である、フォーマット/長さが N7.2 の 3 次元配列を定義します。
FIELD (label./i:i + 5) または label.FIELD(i:i + 5)
label.
でマークしたステートメントを参照するデータベースフィールドを基にした配列を定義します。
FIELD
は、マルチプルバリューフィールド、またはピリオディックグループのフィールドを表します。i
を使用して、データベースオカレンス内のインデックスのオフセットを指定します。 プログラム内では、この配列のサイズはオカレンス数 6(i:i + 5
)と定義されます。 マルチプルバリューフィールドまたはピリオディックグループのオカレンスに対する、プログラムの配列の位置を指定するには、データベースインデックスのオフセットを変数として指定します。 i
を再設定すると、GET
または GET SAME
ステートメントを使用してデータベースに新規にアクセスする必要があります。
Natural では、インデックスが 1
で始まらない配列を定義できます。 ランタイムに Natural によって、参照で指定しているインデックス値が、定義で指定されている次元の最大サイズを超えていないかどうかがチェックされます。
注意:
DEFINE DATA
ステートメントでは使用できません。
インデックスの最大値は 1,073,741,824 です。 プログラミングオブジェクトごとのデータエリアの最大サイズは 1,073,741,824 バイト(1 GB)です。
注意: メインフレーム用の Natural バージョン 4.1 との互換性を維持するには: CMPO プロファイルパラメータまたは NTCMPO マクロの V41COMP コンパイルオプションを使用して、メインフレーム用の Natural バージョン 4.1 に適用可能な値になるよう、これらの最大値を小さくします。 |
添字の参照には、プラス(+) およびマイナス(-)演算子を使用した単純な演算式を使用できます。 演算式を添字として使用する場合、これらの演算子の前後に空白を入れる必要があります。
グループ構造内の配列は、Natural によって、グループのオカレンスごとではなくフィールドごとに分解されます。
DEFINE DATA LOCAL 1 #GROUP (1:2) 2 #FIELDA (A5/1:2) 2 #FIELDB (A5) END-DEFINE ...
上記のように定義されているグループを、以下の WRITE
ステートメントで出力します。
WRITE #GROUP (*)
オカレンスは、以下の順序で出力されます。
#FIELDA(1,1) #FIELDA(1,2) #FIELDA(2,1) #FIELDA(2,2) #FIELDB(1) #FIELDB(2)
以下の順序ではありません。
#FIELDA(1,1) #FIELDA(1,2) #FIELDB(1) #FIELDA(2,1) #FIELDA(2,2) #FIELDB(2)
#ARRAY (1)
1 次元配列の最初のオカレンスを参照します。
#ARRAY (7:12)
1 次元配列の 7~12 番目のオカレンスを参照します。
#ARRAY (i + 5)
1 次元配列の i + 5 番目のオカレンスを参照します。
#ARRAY (5,3:7,1:4)
3 次元配列の、第 1 次元の 5 番目のオカレンス、第 2 次元の 3~7 番目のオカレンス(オカレンス数 5)、第 3 次元のオカレンス 1~4 番目のオカレンス(オカレンス数 4)を参照します。
アスタリスクは、次元内のすべてのオカレンスを参照するために使用できます。
DEFINE DATA LOCAL 1 #ARRAY1 (N5/1:4,1:4) 1 #ARRAY2 (N5/1:4,1:4) END-DEFINE ... ADD #ARRAY1 (2,*) TO #ARRAY2 (4,*) ...
変数名の後にカッコで囲んだ 4 桁の数字を指定すると、この番号はステートメントに対する行番号参照だと Natural によって解釈されます。 したがって、4 桁の配列オカレンスを指定する場合、以下の例のように、番号の前にスラッシュ(/)を指定して、その番号が配列オカレンスであることを示す必要があります。
#ARRAY(/1000)
以下のように指定しないでください。
#ARRAY(1000)
後者の例は、ソースコード行 1000 への参照と解釈されます。
添字の変数名がフォーマット/長さ指定と間違って解釈される可能性がある場合、スラッシュ(/)を指定して、添字が指定されていることを示す必要があります。 例えば、配列のオカレンスを N7
という変数の値で定義する場合、以下のようにオカレンスを指定する必要があります。
#ARRAY (/N7)
以下のように指定しないでください。
#ARRAY (N7)
後者の例は、7 バイトの数値フィールド定義と解釈されます。
以下では次のトピックについて説明します。
注意:
以下のサンプルプログラムを実行する前に、SYSEXPG
ライブラリ内の INDEXTST
プログラムを実行して、10 種類の言語コードを使用するサンプルレコードを作成してください。
ビュー/DDM 内のマルチプルバリューフィールドまたはピリオディックグループフィールドは、さまざまなインデックス表記を使用して定義および参照できます。
例えば、以下のように、データベースレコード内の同じマルチプルバリューフィールド/ピリオディックグループフィールドの 1~10 番目の値、および I~I + 10 番目の値を参照できます。
DEFINE DATA LOCAL 1 I (I2) 1 EMPLOY-VIEW VIEW OF EMPLOYEES 2 LANG (1:10) 2 LANG (I:I+10) END-DEFINE
または
RESET I (I2) ... READ EMPLOYEES OBTAIN LANG(1:10) LANG(I:I+10)
注意:
定数を使用して定義されている配列は、定数または変数のいずれかを使用して参照できます。 ただし、配列の上限を超えることはできません。 定数を使用すると、コンパイル時に Natural によって、上限を超えているかどうかがチェックされます。
** Example 'INDEX1R': Array definition with constants (reporting mode) *********************************************************************** * READ (1) EMPLOYEES WITH NAME = 'WINTER' WHERE CITY = 'LONDON' OBTAIN LANG (1:10) /* WRITE 'LANG(1:10):' LANG (1:10) // WRITE 'LANG(1) :' LANG (1) / 'LANG(5:9) :' LANG (5:9) LOOP * END
** Example 'INDEX1S': Array definition with constants (structured mode) *********************************************************************** DEFINE DATA LOCAL 1 EMPLOY-VIEW VIEW OF EMPLOYEES 2 NAME 2 FIRST-NAME 2 CITY 2 LANG (1:10) END-DEFINE * READ (1) EMPLOY-VIEW WITH NAME = 'WINTER' WHERE CITY = 'LONDON' WRITE 'LANG(1:10):' LANG (1:10) // WRITE 'LANG(1) :' LANG (1) / 'LANG(5:9) :' LANG (5:9) END-READ END
定数を使用して複数回定義されているマルチプルバリューフィールドまたはピリオディックグループフィールドを、変数を使用して参照する場合、以下のような構文を使用します。
** Example 'INDEX2R': Array definition with constants (reporting mode) ** (multiple definition of same database field) *********************************************************************** DEFINE DATA LOCAL 1 EMPLOY-VIEW VIEW OF EMPLOYEES 2 NAME 2 CITY 2 LANG (1:5) 2 LANG (4:8) END-DEFINE * READ (1) EMPLOY-VIEW WITH NAME = 'WINTER' WHERE CITY = 'LONDON' DISPLAY 'NAME' NAME 'LANGUAGE/1:3' LANG (1.1:3) 'LANGUAGE/6:8' LANG (4.3:5) LOOP * END
** Example 'INDEX2S': Array definition with constants (structured mode) ** (multiple definition of same database field) *********************************************************************** DEFINE DATA LOCAL 1 EMPLOY-VIEW VIEW OF EMPLOYEES 2 NAME 2 CITY 2 LANG (1:5) 2 LANG (4:8) END-DEFINE * READ (1) EMPLOY-VIEW WITH NAME = 'WINTER' WHERE CITY = 'LONDON' DISPLAY 'NAME' NAME 'LANGUAGE/1:3' LANG (1.1:3) 'LANGUAGE/6:8' LANG (4.3:5) END-READ * END
変数を使用して定義されている配列内のマルチプルバリューフィールドまたはピリオディックグループフィールドは、同じ変数を使用して参照する必要があります。
** Example 'INDEX3R': Array definition with variables (reporting mode) *********************************************************************** RESET I (I2) * I := 1 READ (1) EMPLOYEES WITH NAME = 'WINTER' WHERE CITY = 'LONDON' OBTAIN LANG (I:I+10) /* WRITE 'LANG(I) :' LANG (I) / 'LANG(I+5:I+7):' LANG (I+5:I+7) LOOP * END
** Example 'INDEX3S': Array definition with variables (structured mode) *********************************************************************** DEFINE DATA LOCAL 1 I (I2) * 1 EMPLOY-VIEW VIEW OF EMPLOYEES 2 NAME 2 CITY 2 LANG (I:I+10) END-DEFINE * I := 1 READ (1) EMPLOY-VIEW WITH NAME = 'WINTER' WHERE CITY = 'LONDON' WRITE 'LANG(I) :' LANG (I) / 'LANG(I+5:I+7):' LANG (I+5:I+7) END-READ END
別のインデックスを使用すると、変数インデックスを使用した配列の最初の定義を明確に参照できます。 これは、以下のようなインデックス表現を使用すると実行できます。
** Example 'INDEX4R': Array definition with variables (reporting mode) *********************************************************************** RESET I (I2) J (I2) * I := 2 J := 3 * READ (1) EMPLOYEES WITH NAME = 'WINTER' WHERE CITY = 'LONDON' OBTAIN LANG (I:I+10) /* WRITE 'LANG(I.J) :' LANG (I.J) / 'LANG(I.1:5):' LANG (I.1:5) LOOP * END
** Example 'INDEX4S': Array definition with variables (structured mode) *********************************************************************** DEFINE DATA LOCAL 1 I (I2) 1 J (I2) 1 EMPLOY-VIEW VIEW OF EMPLOYEES 2 NAME 2 CITY 2 LANG (I:I+10) END-DEFINE * I := 2 J := 3 READ (1) EMPLOY-VIEW WITH NAME = 'WINTER' WHERE CITY = 'LONDON' WRITE 'LANG(I.J) :' LANG (I.J) / 'LANG(I.1:5):' LANG (I.1:5) END-READ END
式 I.
は、その配列定義への明示的な参照を作成し、"位置" を読み込み配列の範囲(LANG(I.1:5)
)内の最初の値とするために使用します。
データベースにアクセスした時点での I
の値によって、データベース配列の最初のオカレンスが決まります。
複数定義配列の場合は通常、適切な配列の範囲を明確に参照できるように、インデックス表現に修飾子を使用する必要があります。
** Example 'INDEX5R': Array definition with constants (reporting mode) ** (multiple definition of same database field) *********************************************************************** DEFINE DATA LOCAL /* For reporting mode programs 1 EMPLOY-VIEW VIEW OF EMPLOYEES /* DEFINE DATA is recommended 2 NAME /* to use multiple definitions 2 CITY /* of same database field 2 LANG (1:10) 2 LANG (5:10) * 1 I (I2) 1 J (I2) END-DEFINE * I := 1 J := 2 * READ (1) EMPLOY-VIEW WITH NAME = 'WINTER' WHERE CITY = 'LONDON' WRITE 'LANG(1.1:10) :' LANG (1.1:10) / 'LANG(1.I:I+2):' LANG (1.I:I+2) // WRITE 'LANG(5.1:5) :' LANG (5.1:5) / 'LANG(5.J) :' LANG (5.J) LOOP END
** Example 'INDEX5S': Array definition with constants (structured mode) ** (multiple definition of same database field) *********************************************************************** DEFINE DATA LOCAL 1 EMPLOY-VIEW VIEW OF EMPLOYEES 2 NAME 2 CITY 2 LANG (1:10) 2 LANG (5:10) * 1 I (I2) 1 J (I2) END-DEFINE * * I := 1 J := 2 * READ (1) EMPLOY-VIEW WITH NAME = 'WINTER' WHERE CITY = 'LONDON' WRITE 'LANG(1.1:10) :' LANG (1.1:10) / 'LANG(1.I:I+2):' LANG (1.I:I+2) // WRITE 'LANG(5.1:5) :' LANG (5.1:5) / 'LANG(5.J) :' LANG (5.J) END-READ END
インデックス変数を使用してマルチプルバリューフィールドまたはピリオディックグループフィールドが定義されている場合も、同様の構文を使用します。
** Example 'INDEX6R': Array definition with variables (reporting mode) ** (multiple definition of same database field) *********************************************************************** DEFINE DATA LOCAL 1 I (I2) INIT <1> 1 J (I2) INIT <2> 1 N (I2) INIT <1> 1 EMPLOY-VIEW VIEW OF EMPLOYEES /* For reporting mode programs 2 NAME /* DEFINE DATA is recommended 2 CITY /* to use multiple definitions 2 LANG (I:I+10) /* of same database field 2 LANG (J:J+5) 2 LANG (4:5) * END-DEFINE * READ (1) EMPLOY-VIEW WITH NAME = 'WINTER' WHERE CITY = 'LONDON' * WRITE 'LANG(I.I) :' LANG (I.I) / 'LANG(1.I:I+2):' LANG (I.I:I+10) // * WRITE 'LANG(J.N) :' LANG (J.N) / 'LANG(J.2:4) :' LANG (J.2:4) // * WRITE 'LANG(4.N) :' LANG (4.N) / 'LANG(4.N:N+1):' LANG (4.N:N+1) / LOOP END
** Example 'INDEX6S': Array definition with variables (structured mode) ** (multiple definition of same database field) *********************************************************************** DEFINE DATA LOCAL 1 I (I2) INIT <1> 1 J (I2) INIT <2> 1 N (I2) INIT <1> 1 EMPLOY-VIEW VIEW OF EMPLOYEES 2 NAME 2 CITY 2 LANG (I:I+10) 2 LANG (J:J+5) 2 LANG (4:5) * END-DEFINE * READ (1) EMPLOY-VIEW WITH NAME = 'WINTER' WHERE CITY = 'LONDON' * WRITE 'LANG(I.I) :' LANG (I.I) / 'LANG(1.I:I+2):' LANG (I.I:I+10) // * WRITE 'LANG(J.N) :' LANG (J.N) / 'LANG(J.2:4) :' LANG (J.2:4) // * WRITE 'LANG(4.N) :' LANG (4.N) / 'LANG(4.N:N+1):' LANG (4.N:N+1) / END-READ END
レコードにいくつの値/オカレンスが存在するかが不明なマルチプルバリューフィールドやピリオディックグループの参照が必要になることがあります。 Adabas は、各マルチプルバリューフィールドの値の個数および各ピリオディックグループのオカレンス数の内部カウントを管理します。
このカウントは、フィールド名の直前に C*
を指定することにより参照できます。
SQL | SQL データベースでは、C* 表記は使用できません。
|
---|---|
VSAM | VSAM データベースおよび DL/I データベースでは、C* 表記は、値/オカレンスの数ではなく、DDM(MAXOCC )に定義されている値/オカレンスの最大数を返します。
|
DL/I |
『エディタ』ドキュメントに記載されている、データエリア行コマンド .*
の説明も参照してください。
C
* フィールドで明示的に宣言できるフォーマットおよび長さは、以下のいずれかです。
2 バイト(I2)または 4 バイト(I4)の長さの整数値(I)
整数の桁数のみ(精度なし)が指定されている数値(N)またはパック型(P)。例:(N3)。
フォーマットおよび長さが明示的に指定されていない場合、フォーマット/長さ(N3)がデフォルトとして使用されます。
C*LANG |
マルチプルバリューフィールド LANG の値の個数を返します。
|
C*INCOME |
ピリオディックグループ INCOME のオカレンス数を返します。
|
C*BONUS(1) |
ピリオディックグループの最初のオカレンスのマルチプルバリューフィールド BONUS 値の個数を返します(BONUS はピリオディックグループ内のマルチプルバリューフィールドとします)。
|
** Example 'CNOTX01': C* Notation ************************************************************************ DEFINE DATA LOCAL 1 EMPL-VIEW VIEW OF EMPLOYEES 2 NAME 2 CITY 2 C*INCOME 2 INCOME 3 SALARY (1:5) 3 C*BONUS (1:2) 3 BONUS (1:2,1:2) 2 C*LANG 2 LANG (1:2) * 1 #I (N1) END-DEFINE * LIMIT 2 READ EMPL-VIEW BY CITY /* WRITE NOTITLE 'NAME:' NAME / 'NUMBER OF LANGUAGES SPOKEN:' C*LANG 5X 'LANGUAGE 1:' LANG (1) 5X 'LANGUAGE 2:' LANG (2) /* WRITE 'SALARY DATA:' FOR #I FROM 1 TO C*INCOME WRITE 'SALARY' #I SALARY (1.#I) END-FOR /* WRITE 'THIS YEAR BONUS:' C*BONUS(1) BONUS (1,1) BONUS (1,2) / 'LAST YEAR BONUS:' C*BONUS(2) BONUS (2,1) BONUS (2,2) SKIP 1 END-READ END
プログラム CNOTX01
の出力:
NAME: SENKO NUMBER OF LANGUAGES SPOKEN: 1 LANGUAGE 1: ENG LANGUAGE 2: SALARY DATA: SALARY 1 36225 SALARY 2 29900 SALARY 3 28100 SALARY 4 26600 SALARY 5 25200 THIS YEAR BONUS: 0 0 0 LAST YEAR BONUS: 0 0 0 NAME: CANALE NUMBER OF LANGUAGES SPOKEN: 2 LANGUAGE 1: FRE LANGUAGE 2: ENG SALARY DATA: SALARY 1 202285 THIS YEAR BONUS: 1 23000 0 LAST YEAR BONUS: 0 0 0
ピリオディックグループ内のマルチプルバリューフィールドに対し、インデックス範囲を使用して C*
変数を定義することもできます。
以下の例は、ピリオディックグループ INCOME
の一部分であるマルチプルバリューフィールド BONUS
を使用しています。 以下の 3 つの例は、いずれも同じ結果になります。
** Example 'CNOTX02': C* Notation (multiple-value fields) ************************************************************************ * LIMIT 2 READ EMPLOYEES BY CITY OBTAIN C*BONUS (1:3) BONUS (1:3,1:3) /* DISPLAY NAME C*BONUS (1:3) BONUS (1:3,1:3) LOOP * END
** Example 'CNOTX03': C* Notation (multiple-value fields) ************************************************************************ DEFINE DATA LOCAL 1 EMPL-VIEW VIEW OF EMPLOYEES 2 NAME 2 CITY 2 INCOME (1:3) 3 C*BONUS 3 BONUS (1:3) END-DEFINE * LIMIT 2 READ EMPL-VIEW BY CITY /* DISPLAY NAME C*BONUS (1:3) BONUS (1:3,1:3) END-READ * END
** Example 'CNOTX04': C* Notation (multiple-value fields) ************************************************************************ DEFINE DATA LOCAL 1 EMPL-VIEW VIEW OF EMPLOYEES 2 NAME 2 CITY 2 C*BONUS (1:3) 2 INCOME (1:3) 3 BONUS (1:3) END-DEFINE * LIMIT 2 READ EMPL-VIEW BY CITY /* DISPLAY NAME C*BONUS (*) BONUS (*,*) END-READ * END
注意: Adabas フォーマットバッファではカウントフィールドの範囲指定が認められていないため、個別のフィールドとして生成されます。したがって、大規模な配列に対して C* インデックス範囲を指定すると、Adabas フォーマットバッファがオーバーフローする可能性があります。 |
参照するフィールドを指定するために、そのフィールドを修飾できます。つまり、フィールド名の前に、そのフィールドが配置されているレベル 1 のデータ要素名とピリオドを指定します。
フィールド名によってフィールドを一意に識別できない場合(複数のグループ/ビューで同じ名前のフィールド名が使用されている場合など)、参照するフィールドを修飾する必要があります。
レベル 1 のデータ要素とフィールド名の組み合わせは一意である必要があります。
DEFINE DATA LOCAL 1 FULL-NAME 2 LAST-NAME (A20) 2 FIRST-NAME (A15) 1 OUTPUT-NAME 2 LAST-NAME (A20) 2 FIRST-NAME (A15) END-DEFINE ... MOVE FULL-NAME.LAST-NAME TO OUTPUT-NAME.LAST-NAME ...
修飾語はレベル 1 のデータ要素である必要があります。
DEFINE DATA LOCAL 1 GROUP1 2 SUB-GROUP 3 FIELD1 (A15) 3 FIELD2 (A15) END-DEFINE ... MOVE 'ABC' TO GROUP1.FIELD1 ...
同じ名前のユーザー定義変数とデータベースフィールドを使用している場合(好ましくない状態)、参照するときにデータベースフィールドを修飾する必要があります。
注意: 参照するときにデータベースフィールドを修飾しない場合、代わりにユーザー定義変数が参照されます。 |
DEFINE DATA LOCAL 1 #A1 (A10) /* Alphanumeric, 10 positions. 1 #A2 (B4) /* Binary, 4 positions. 1 #A3 (P4) /* Packed numeric, 4 positions and 1 sign position. 1 #A4 (N7.2) /* Unpacked numeric, /* 7 positions before and 2 after decimal point. 1 #A5 (N7.) /* Invalid definition!!! 1 #A6 (P7.2) /* Packed numeric, 7 positions before and 2 after decimal point /* and 1 sign position. 1 #INT1 (I1) /* Integer, 1 byte. 1 #INT2 (I2) /* Integer, 2 bytes. 1 #INT3 (I3) /* Invalid definition!!! 1 #INT4 (I4) /* Integer, 4 bytes. 1 #INT5 (I5) /* Invalid definition!!! 1 #FLT4 (F4) /* Floating point, 4 bytes. 1 #FLT8 (F8) /* Floating point, 8 bytes. 1 #FLT2 (F2) /* Invalid definition!!! 1 #DATE (D) /* Date (internal format/length P6). 1 #TIME (T) /* Time (internal format/length P12). 1 #SWITCH (L) /* Logical, 1 byte (TRUE or FALSE). /* END-DEFINE