ユーザー定義変数

ユーザー定義変数は、プログラム内でユーザーが定義するフィールドです。ユーザー定義変数は、追加の処理または表示のためにプログラム処理の特定のポイントで得られた値または中間結果を保存するために使用します。

このドキュメントでは、次のトピックについて説明します。

Natural の使用』ドキュメントの「ユーザー定義変数の命名規則」も参照してください。


変数の定義

ユーザー定義変数を定義するには、DEFINE DATA ステートメントで名前とフォーマット/長さを指定します。

以下の表記に従って、変数の特徴を定義します。

(r,format-length/index)

この表記は変数名の後に、任意で 1 つ以上の空白で区切って記述します。

各表記要素の間に空白を入れることはできません。

各要素は、必要に応じて個別に指定できます。まとめて指定する場合は、上記の文字で区切る必要があります。

例:

以下の例では、英数字フォーマットで 10 桁の長さのユーザー定義変数が、#FIELD1 という名前で定義されています。

DEFINE DATA LOCAL 
1 #FIELD1 (A10)      
... 
END-DEFINE

注意:

  1. ストラクチャードモードで操作している場合、またはプログラムに DEFINE DATA LOCAL 節が含まれている場合、ステートメント内で変数をダイナミックに定義することはできません。
  2. これは、アプリケーションに依存しない変数(AIV)には適用されません。「アプリケーションに依存しない変数の定義」も参照してください。

表記 (r) を使用したデータベースフィールドの参照

ステートメントラベルまたはソースコード行番号は、前の Natural ステートメントを参照するために使用できます。この参照は、Natural のデフォルトの参照を変更したり(各ステートメントの記述に従って実行可能な場合)、処理内容を説明したりするために使用できます。「ループ処理」の「プログラム内のステートメント参照」も参照してください。

以下では次のトピックについて説明します。

データベースフィールドのデフォルトの参照

ステートメント参照表記を指定しない場合、通常は以下の参照が適用されます。

  • デフォルトでは、最も内側のアクティブなデータベースループ(FINDREADHISTOGRAM)で読み込まれているフィールドが参照されます。

  • アクティブなデータベースループでフィールドが読み込まれていない場合、まだクローズされていないループ内にあり、かつ、当該フィールドが読み込まれている、直前の 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
...

注意:
技術的な理由から、プログラムエディタ画面に表示される行番号は 6 桁ですが、内部的に処理されるのは下 4 桁のみです。

参照するソースコード行番号の変更

ソース内の行番号参照(「表記(r)を使用したデータベースフィールドの参照」および「プログラム内のステートメント参照」は、関連する行番号が RENUMBER コマンドによって変更された場合は、変更されます。番号の変更は、英数字または Unicode 定数内を除くすべての行の参照パターンに適用されます。例えば、次のようになります。

#FIELD1 := '(1150)'   /* is not renumbered
RESET NAME(1150)      /* is renumbered

注意:
デフォルトでは、英数字と Unicode 定数内の行番号参照が再設定されません。また、これらの番号も変更する場合は、RNCONST プロファイルパラメータを ON に設定する必要があります。

有効なソースコード行番号参照として認識され、番号が振り直されるパターンは以下のとおりです(nnnn は 4 桁の数字)。

パターン ステートメントの例
(nnnn) ESCAPE BOTTOM (0150)
(nnnn/ DISPLAY ADDRESS-LINE(0010/1:5)
(nnnn, DISPLAY ADDRESS-LINE (0010,A10/1:5)

左カッコの直後に nnnn がない場合、または nnnn の後に右カッコ、カンマ、またはスラッシュ以外の文字が続く場合、パターンは行番号の参照とは見なされず、変更されません。

注意:
技術的な理由から、プログラムエディタ画面に表示される行番号は 6 桁ですが、内部的に処理されるのは下 4 桁のみです。

ユーザー定義変数のフォーマットおよび長さ

ユーザー定義変数のフォーマットおよび長さは、変数名の後のカッコ内に指定します。

固定長の変数は、以下のフォーマットおよび対応する長さで定義できます。

ダイナミック変数のフォーマットおよび長さについては、「ダイナミック変数の定義」を参照してください。

Format 説明 定義可能な長さ 内部的な長さ(バイト)
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 は小数点後の桁数を表します。nnm を合計した値は 29 を超えることはできません。また、m の値は 7 を超えることはできません。

注意:

  1. フォーマット P のユーザー定義変数を DISPLAYWRITEINPUT の各ステートメントで出力する場合、Natural によって、出力のために内部的にフォーマット N に変換されます。
  2. レポーティングモードでは、ユーザー定義変数のフォーマットおよび長さを指定しません。デフォルトの割り当てがプロファイル/セッションパラメータ 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 - 属性制御

フォーマット C で定義されている変数は、DISPLAYINPUTPRINTPROCESS PAGE または 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 で定義されている変数は、日付および時刻の演算や表示に使用できます。フォーマット D には、日付情報のみを指定できます。フォーマット T には、日付および時刻の両方の情報を指定できます。つまり、日付情報は時刻情報のサブセットです。時刻は、1/10 秒単位でカウントされます。

フォーマット D および T の変数には、長さを指定できません。フォーマット D の変数には常に 4 バイトの長さ(P6)が、フォーマット T の変数には常に 7 バイトの長さ(P12)が、Natural によって割り当てられます。プロファイルパラメータ MAXYEAR9999 に設定されている場合、フォーマット 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 - 論理

フォーマット 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 以下の場合にのみ使用できます。

システム変数、システム関数、修飾された変数は、インデックス表記に使用できません。

配列の定義例:

  1. #ARRAY (3)
    オカレンス数 3 の 1 次元配列を定義します。

  2. FIELD (label.,A20/5) または label.FIELD(A20/5)
    label. でマークしたステートメントを参照するデータベースフィールドを基にした、英数字フォーマットで長さ 20、オカレンス数 5 の配列を定義します。

  3. #ARRAY (N7.2/1:5,10:12,1:4)
    最初のオカレンス数が 5、2 番目のオカレンス数が 3、3 番目のオカレンス数が 4 である、フォーマット/長さが N7.2 の 3 次元配列を定義します。

  4. FIELD (label./i:i + 5) または label.FIELD(i:i + 5)
    label. でマークしたステートメントを参照するデータベースフィールドを基にした配列を定義します。

    FIELD は、マルチプルバリューフィールド、またはピリオディックグループのフィールドを表します。i を使用して、データベースオカレンス内のインデックスのオフセットを指定します。プログラム内では、この配列のサイズはオカレンス数 6(i:i + 5)と定義されます。マルチプルバリューフィールドまたはピリオディックグループのオカレンスに対する、プログラムの配列の位置を指定するには、データベースインデックスのオフセットを変数として指定します。i を再位置決めすると、GET または GET SAME ステートメントを使用してデータベースに新規にアクセスする必要があります。

Natural では、インデックスが 1 で始まらない配列を定義できます。ランタイムに Natural によって、参照で指定しているインデックス値が、定義で指定されている次元の最大サイズを超えていないかどうかがチェックされます。

注意:

  1. 以前の Natural バージョンとの互換性を維持するために、コロン(:)の代わりにハイフン(-)を使用してデータベース配列の範囲を指定することもできます。
  2. ただし、両方の表記を混在させることはできません
  3. ハイフン表記は DEFINE DATA ステートメントに使用できません。
  4. 新しいコードの場合は、コロン(:)表記を使用することをお勧めします。

インデックスの最大値は、1,073,741,824(1 GB)です。

添字の参照には、プラス(+) およびマイナス(-)演算子を使用した単純な演算式を使用できます。演算式を添字として使用する場合、これらの演算子の前後に空白を入れる必要があります。

グループ構造内の配列は、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)

配列の参照例:

  1. #ARRAY (1)
    1 次元配列の最初のオカレンスを参照します。

  2. #ARRAY (7:12)
    1 次元配列の 7~12 番目のオカレンスを参照します。

  3. #ARRAY (i + 5)
    1 次元配列の i + 5 番目のオカレンスを参照します。

  4. #ARRAY (5,3:7,1:4)
    3 次元配列の、第 1 次元の 5 番目のオカレンス、第 2 次元の 3~7 番目のオカレンス(オカレンス数 5)、第 3 次元のオカレンス 1~4 番目のオカレンス(オカレンス数 4)を参照します。

  5. アスタリスクは、次元内のすべてのオカレンスを参照するために使用できます。

    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)

注意:

  1. 同じ下限のインデックス値を使用できるのは、配列ごとに一度だけです。これは、変数インデックスだけでなく定数インデックスの場合も同様です。
  2. 変数インデックスを使用した配列定義では、変数自身を使用して下限を、下限と同じ変数 + 定数を使用して上限を指定する必要があります。

定数を使用して定義されている配列の参照

定数を使用して定義されている配列は、定数または変数のいずれかを使用して参照できます。ただし、配列の上限を超えることはできません。定数を使用すると、コンパイル時に 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

データベース配列の内部カウントの参照(C* 表記)

レコードにいくつの値/オカレンスが存在するかが不明なマルチプルバリューフィールドやピリオディックグループの参照が必要になることがあります。Adabas は、各マルチプルバリューフィールドの値の個数および各ピリオディックグループのオカレンス数の内部カウントを管理します。このカウントは、フィールド名の直前に C* を指定することにより参照できます。

Adabas 以外のデータベースに関する注意事項:

Tamino XML データベースでは、C* 表記は使用できません。
SQL SQL データベースでは、C* 表記は使用できません。

エディタ』ドキュメントに記載されている、データエリア行コマンド * の説明も参照してください。

C* フィールドで明示的に宣言できるフォーマットおよび長さは、以下のいずれかです。

  • 2 バイト(I2)または 4 バイト(I4)の長さの整数値(I)

  • 整数の桁数のみ(精度なし)が指定されている数値(N)またはパック型(P)。例:(N3)。

フォーマットおよび長さが明示的に指定されていない場合、フォーマット/長さ(N3)がデフォルトとして使用されます。

例:

C*LANG マルチプルバリューフィールド LANG の値の個数を返します。
C*INCOME ピリオディックグループ INCOME のオカレンス数を返します。
C*BONUS(1) ピリオディックグループの最初のオカレンスのマルチプルバリューフィールド BONUS 値の個数を返します(BONUS はピリオディックグループ内のマルチプルバリューフィールドとします)。

C* 変数を使用したプログラム例:

** 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*

ピリオディックグループ内のマルチプルバリューフィールドに対し、インデックス範囲を使用して C* 変数を定義することもできます。

以下の例は、ピリオディックグループ INCOME の一部分であるマルチプルバリューフィールド BONUS を使用しています。以下の 3 つの例は、いずれも同じ結果になります。

例 1 - レポーティングモード:

** 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

例 2 - ストラクチャードモード:

** 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

例 3 - ストラクチャードモード:

** 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