ユーザー定義定数

定数は、Natural プログラム全体で使用できます。このドキュメントでは、サポートされている定数のタイプとその使用方法について説明します。

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


数値定数

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

数値定数

数値定数には、1~29 桁の数字と小数点記号としての特殊文字(ピリオドまたはコンマ)を指定できます。

例:

1234   +1234   -1234 

12.34  +12.34  -12.34
MOVE 3 TO #XYZ
COMPUTE #PRICE = 23.34 
COMPUTE #XYZ = -103
COMPUTE #A = #B * 6074

注意:
内部的には、小数点なしの数値定数は整数フォーマット(フォーマット I)で表されます。一方、小数点付きの数値定数、およびフォーマット I に収まらないほど大きな値を持つ小数点なしの数値定数は、パック型フォーマット(フォーマット P)で表されます。

例:

数値定数 Format  データ長
From To    
  <= -2147483649 P >=10
-2147483648 -32769 I 4
-32768 32767 I 2
32768 2147483647 I 4
>= 2147483648   P >=10

数値定数の検証

INIT オプションを使用した COMPUTEMOVEDEFINE DATA の各ステートメント内で数値定数を使用すると、コンパイル時に Natural によって、対応するフィールドに対して定数値が適しているかどうかが確認されます。これにより、コンパイル時にエラー条件が検出されるため、ランタイムエラーを回避できます。

英数字定数

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

英数字定数

英数字定数には、1~1073741824 バイト(1 GB)の英数字を指定できます。

英数字定数は、次のいずれかで囲む必要があります。:アポストロフィ(')

'text'

または引用符(")

"text"

例:

MOVE 'ABC' TO #FIELDX
MOVE '% INCREASE' TO #TITLE 
DISPLAY "LAST-NAME" NAME

注意:
ユーザー定義変数に割り当てるために使用する 1 つの英数字定数は、複数のステートメント行に分割できません。

英数字定数内のアポストロフィ

アポストロフィで囲まれた英数字定数内で 1 つのアポストロフィを表すには、2 つのアポストロフィまたは 1 つの引用符を使用する必要があります。

引用符で囲まれた英数字定数内で 1 つのアポストロフィを表すには、1 つのアポストロフィを指定します。

例:

以下を出力するとします。

HE SAID, 'HELLO'

以下のいずれの表記も使用できます。

WRITE 'HE SAID, ''HELLO'''
WRITE 'HE SAID, "HELLO"'
WRITE "HE SAID, ""HELLO""" 
WRITE "HE SAID, 'HELLO'"

注意:
上述したように引用符がアポストロフィに変換されない場合、これはプロファイルパラメータTQMARK(Translate Quotation Marks)の設定が原因です。詳細については、Natural の管理者に問い合わせてください。

英数字定数の連結

ハイフンを使用すると、複数の英数字定数を 1 つの値として連結できます。

例:

MOVE 'XXXXXX' - 'YYYYYY' TO #FIELD
MOVE "ABC" - 'DEF' TO #FIELD

上記の方法で、英数字定数を 16 進定数と連結することもできます。

Unicode 定数

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

Unicode テキスト定数

Unicode テキスト定数は、先頭に文字 U を指定し、その後の文字列を次のいずれかで囲む必要があります。アポストロフィ(')

U'text'

または引用符(")

U"text"

例:

U'HELLO'

コンパイラは、このテキスト定数を Unicode フォーマット(UTF-16)で生成プログラムに格納します。

Unicode テキスト定数内のアポストロフィ

アポストロフィで囲まれた Unicode テキスト定数内で 1 つのアポストロフィを表すには、2 つのアポストロフィまたは 1 つの引用符を使用する必要があります。

引用符で囲まれた Unicode テキスト定数内で 1 つのアポストロフィを表すには、1 つのアポストロフィを指定します。

例:

以下を出力するとします。

HE SAID, 'HELLO'

以下のいずれの表記も使用できます。

WRITE U'HE SAID, ''HELLO'''
WRITE U'HE SAID, "HELLO"'
WRITE U"HE SAID, ""HELLO""" 
WRITE U"HE SAID, 'HELLO'"

注意:
上述したように引用符がアポストロフィに変換されない場合、これはプロファイルパラメータ TQ(Translate Quotation Marks)の設定が原因です。詳細については、Natural の管理者に問い合わせてください。

Unicode 16 進定数

以下の構文は、Unicode 文字または Unicode 文字列を 16 進表記で指定するために使用します。

UH'hhhh...'

h は、16 進数の桁(0 ~ 9、A ~ F)を表します。UTF-16 Unicode 文字はダブルバイトであるため、指定する 16 進の文字数は 4 の倍数である必要があります。

例:

以下の例は、文字列 45 を定義しています。

UH'00340035'

Unicode 定数の連結

Unicode テキスト定数(U)および Unicode 16 進定数(UH)は、連結できます。

有効な例:

MOVE U'XXXXXX' - UH'00340035' TO #FIELD

Unicode テキスト定数または Unicode 16 進定数は、コードページ英数字定数または H 定数とは連結できません。

無効な例:

MOVE U'ABC' - 'DEF' TO #FIELD
MOVE UH'00340035' - H'414243' TO #FIELD

その他の有効な例:

DEFINE DATA LOCAL
1 #U10 (U10)               /* Unicode variable with 10 (UTF-16) characters, total byte length = 20
1 #UD  (U)  DYNAMIC        /* Unicode variable with dynamic length
END-DEFINE
*
#U10 := U'ABC'             /* Constant is created as X'004100420043' in the object, the UTF-16 representation for string 'ABC'.

#U10 := UH'004100420043'   /* Constant supplied in hexadecimal format only, corresponds to U'ABC'

#U10 := U'A'-UH'0042'-U'C' /* Constant supplied in mixed formats, corresponds to U'ABC'.
END

日付/時刻の定数

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

日付定数

日付定数は、フォーマット D の変数とともに使用します。

日付定数は、以下の形式で定義します。

D'yyyy-mm-dd' 国際式
D'dd.mm.yyyy' ドイツ式
D'dd/mm/yyyy' ヨーロッパ式
D'mm/dd/yyyy' US 日付フォーマット

上記の dd は日、mm は月、yyyy は年を表します。

例:

DEFINE DATA LOCAL
1 #DATE (D)
END-DEFINE
...
MOVE D'2004-03-08' TO #DATE
...

デフォルトの日付形式は、プロファイルパラメータ DTFORM(日付形式)を使用して、Natural 管理者が制御します。

時刻定数

時刻定数は、フォーマット T の変数とともに使用します。

時刻定数は、以下の形式で定義します。

T'hh:ii:ss'

上記の hh は時間、ii は分、ss は秒を表します。

例:

DEFINE DATA LOCAL
1 #TIME (T)
END-DEFINE
...
MOVE T'11:33:00' TO #TIME
...

拡張時刻定数

日付情報は時刻情報のサブセットであるため、時刻変数(フォーマット T)には、日付および時刻の情報を格納できます。ただし、"標準の" 時刻定数(接頭辞 T)では、時刻変数の時刻情報のみを処理できます。

T'hh:ii:ss'

拡張時刻定数(接頭辞 E)を使用すると、日付情報を含む、時刻変数のすべての内容を処理できます。

E'yyyy-mm-dd hh:ii:ss'

この点を除き、拡張時刻定数と時刻変数の使用方法は、標準の時刻定数の場合と同じです。

注意:
拡張時刻定数に指定する必要のある日付情報の形式は、プロファイルパラメータ DTFORM の設定によって決まります。上記の拡張時刻定数は、DTFORM=I(国際式)を想定しています。

16 進の定数

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

16 進の定数

16 進定数では、標準のキーボード文字で入力できない値を指定できます。

16 進定数には、1~1073741824 バイト(1 GB)の英数字を指定できます。

接頭文字 H で、16 進定数を示します。定数自身は、16 進数を表す文字(0~9、A~F)で構成される文字列をアポストロフィで囲む必要があります。1 バイトのデータを表すには、2 つの 16 進文字が必要です。

16 進文字表現は、コンピュータが ASCII 文字セットを使用しているか、EBCDIC 文字セットを使用しているかによって異なります。したがって、16 進定数を別のコンピュータに転送する場合、文字変換が必要になることがあります。

ASCII の例:

H'313233'    (equivalent to the alphanumeric constant '123')
H'414243'    (equivalent to the alphanumeric constant 'ABC')

EBCDIC の例:

H'F1F2F3'    (equivalent to the alphanumeric constant '123')
H'C1C2C3'    (equivalent to the alphanumeric constant 'ABC')

16 進定数を別のフィールドに転送する場合は、英数字値(フォーマット A)として扱われます。

フォーマット A、U、B 以外で定義されているフィールドに、英数字値(フォーマット A)をデータ転送することはできません。したがって、対応する変数がフォーマット A、U、B ではない場合に DEFINE DATA ステートメントで 16 進定数を初期値として使用すると、構文エラー NAT0094 で拒否されます。

例:

DEFINE DATA LOCAL                 
1 #I(I2) INIT <H'000F'>      /* causes a NAT0094 syntax error 
END-DEFINE                         

注意:
H'00'H'1F' または H'80'H'A0' の範囲内の任意の文字を含む 16 進定数を出力する場合、これらの文字は端末制御文字として解釈されるため、出力されません。バージョン 2.2 の時点では、これらの 16 進定数は抑制されていません。

16 進定数の連結

定数の間にハイフンを使用すると、16 進定数を連結できます。

ASCII の例:

H'414243' - H'444546' (equivalent to 'ABCDEF')

EBCDIC の例:

H'C1C2C3' - H'C4C5C6' (equivalent to 'ABCDEF')

上記の方法で、16 進定数を英数字定数と連結することもできます。

論理定数

論理定数 TRUE および FALSE は、フォーマット L で定義されたフィールドに論理値を割り当てるために使用できます。

例:

DEFINE DATA LOCAL
1 #FLAG (L)
END-DEFINE
...
MOVE TRUE TO #FLAG
...
IF #FLAG ...
  statement ...
  MOVE FALSE TO #FLAG 
END-IF
 ...

浮動小数点定数

浮動小数点定数は、フォーマット F で定義された変数で使用できます。

例:

DEFINE DATA LOCAL
1 #FLT1 (F4)
END-DEFINE
...
COMPUTE #FLT1 = -5.34E+2
...

属性定数

属性定数は、フォーマット C で定義された変数(制御変数)で使用できます。属性定数は、カッコで囲む必要があります。

次の属性を使用できます。

属性 説明
AD=D デフォルト
AD=B 点滅
AD=I 高輝度
AD=N 非表示
AD=V 反転
AD=U 下線付き
AD=C イタリック
AD=Y ダイナミック属性
AD=P 保護
CD=BL
CD=GR
CD=NE デフォルト色
CD=PI ピンク
CD=RE
CD=TU 空色
CD=YE 黄色

セッションパラメータ AD および CD の説明も参照してください。

例:

DEFINE DATA LOCAL
1 #ATTR (C)
1 #FIELD (A10)
END-DEFINE 
...
MOVE (AD=I CD=BL) TO #ATTR 
...
INPUT #FIELD (CV=#ATTR)
...

ハンドル定数

ハンドル定数 NULL-HANDLE は、オブジェクトハンドルで使用できます。

オブジェクトハンドルの詳細については、「NaturalX」を参照してください。

名前付き定数の定義

同じ定数値を何度も使用する必要がある場合、以下のように名前付き定数を定義してメンテナンスの労力を減らすことができます。

  • DEFINE DATA ステートメント内でフィールドを定義します。

  • フィールドに定数値を割り当てます。

  • プログラムで定数値ではなくフィールド名を使用します。

これにより、値を変更する必要があるときには、プログラム内の関連するすべての場所を変更するのではなく、DEFINE DATA ステートメントを 1 回変更するだけですべての値を変更できます。

DEFINE DATA ステートメントのフィールド定義の後に、キーワード CONSTANT を付けた山カッコ(< と >)内に定数値を指定します。

  • 値が英数字の場合、アポストロフィで囲む必要があります。

  • 値が Unicode テキストフォーマットの場合、先頭に文字 U を指定し、その後の文字列をアポストロフィで囲む必要があります。

  • 値が Unicode 16 進フォーマットの場合、先頭に文字 UH を指定し、その後の文字列をアポストロフィで囲む必要があります。

例:

DEFINE DATA LOCAL 
1 #FIELDA (N3) CONSTANT <100> 
1 #FIELDB (A5) CONSTANT <'ABCDE'>
1 #FIELDC (U5) CONSTANT <U'ABCDE'>
1 #FIELDD (U5) CONSTANT <UH'00410042004300440045'>
END-DEFINE 
...

プログラム実行中は、名前付き定数の値を変更できません。