EM - 編集マスク

このセッションパラメータでは、適用可能なステートメントの次の表に示されているいずれかのステートメントで使用される入力/出力フィールドに編集マスクを指定できます。

可能な設定 EM パラメータの構文」を参照してください。
デフォルト設定 なし  
適用可能なステートメント FORMAT パラメータは FORMAT ステートメントを使用してダイナミックに指定できます。

DEFINE DATA
DISPLAY
INPUT
PRINT
PROCESS PAGE/PROCESS PAGE UPDATE
WRITE

パラメータはステートメントレベルでもエレメントレベルでも指定できます。
MOVE EDITED パラメータはエレメントレベルで指定できます。
適用可能なコマンド なし  

注意:

  1. Unicode 編集マスクの詳細については、セッションパラメータ EMU を参照してください。
  2. パラメータ EM は、U フォーマットのフィールドでも使用できます。Unicode フォーマットの詳細については、「Natural プログラミング言語の Unicode とコードページのサポート」の「セッションパラメータ」の項にある「EMUICULCUTCUEMICLCTC の比較」を参照してください。
  3. プログラミングガイド』の「編集マスク - EM パラメータ」も参照してください。

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


EM パラメータの構文

入力フィールドについては、値は編集マスクと正確に一致するように入力する必要があります。入力フィールドに編集マスクを表示する場合、フィールドを変更可能フィールド(AD=M)として定義する必要があります。

データベースフィールドについては、デフォルトの編集マスクが DDM で定義されている場合があります。データベースフィールドに EM パラメータで編集マスクを指定した場合、指定した編集マスクがデフォルトの編集マスク(DDM でフィールドに定義)の代わりに使用されます。

フィールドに EM=OFF を指定した場合、DDM で編集マスクが定義されていても、フィールドには編集マスクは使用されません。

DISPLAYFORMATINPUT、または WRITE ステートメントのステートメントレベルでは、EM=OFF 以外に、詳細なフィールド編集マスクは指定できません。

編集マスクの指定は、セッションパラメータ ALNL、および SG の設定を上書きします。

文字 9HX、および Z は、数値(9,Z)、16 進数(H)、および英数字(X)編集マスクの有効な出力桁を表します。9Z の違いについては、下記の「数値フィールドの編集マスク」を参照してください。

DISPLAY AA(EM=OFF) AB(EM=XX.XX) 
WRITE SALARY (EM=ZZZ,ZZ9)

同じ有意文字のシーケンスを数値表記に置き換えることができます(xxxxxxxxx(8) に変換するなど)。次の例は、数値(Z,9)、16 進数(H)、英数字(X)、および日付(N,L)の有意文字の編集マスクに使用できる省略表記を示しています。

EM=9(4)-9(5)         is equivalent to: EM=9999-99999
EM=H(10)             is equivalent to: EM=HHHHHHHHHH
EM=X(6)..X(3)        is equivalent to: EM=XXXXXX..XXX
EM=YYYY-L(8)-DD-N(8) is equivalent to: EM=YYYY-LLLLLLLL-DD-NNNNNNNN

編集マスク内の空白

EM パラメータの等号(=)の後ろには空白は使用できません(例:EM=<blank>XXX)。

編集マスク内の空白は、使用しているキーボードの文字で表され、16 進コードの H'20'(ASCII)または H'5F'(EBCDIC)に対応します。つまり、文字 ^(または ¬)です。

デフォルトの編集マスク

フィールドに編集マスクを指定しなかった場合、フィールドフォーマットに応じて、デフォルトの編集マスクが割り当てられます。

フィールドフォーマット デフォルトの編集マスク
A X
B H
N、P、I Z9
F 技術表記
D デフォルトの日付フォーマット(プロファイルパラメータ DTFORM で設定)によって異なる
T HH:II:SS
L 空白/X

数値フィールドの編集マスク

フォーマット N、P、I、または F のフィールドに指定した編集マスクには、1 つ以上の 9 または Z が含まれている必要があります。

フィールド値の桁数より多くの 9 または Z を含めると、編集マスクの出力桁は、フィールド値に定義されている桁数に調整されます。

逆に、フィールド値の桁数よりも 9 または Z が少ないと、小数点記号よりも前の桁または後の桁が切り捨てられます。

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

数値編集マスクの定義用文字

文字 関数
9 出力桁(フィールド値の 1 桁)
.(ピリオド) 挿入された最初のピリオドは小数点記号として使用されます。後続のピリオドはリテラル文字として扱われます。

注意:
このとき、ピリオドは、現在小数点のセパレータ文字として定義されている記号を表します。セッションまたはプロファイルパラメータ DC を使用して別の文字(コンマなど)が選択されている場合は、この文字が代わりに使用されます。

Z 先頭のゼロの省略。数値フィールドのデフォルト値です。文字 Z は浮動位置のゼロ省略を明示するために繰り返し指定できます。Z は、小数点のセパレータ文字より右の桁には指定できません。編集マスクですべて Z を指定し、ゼロ値を空白として表示することもできます(セッションパラメータ ZP も参照)。

9 または Z は、1 文字以上の他の文字の後に続けることができます。

符号文字

9 または Z の前の最初の文字が +-S、または N の場合、符号が表示されます。

文字 関数
+ 浮動位置の符号は、値の直前(先頭の符号文字)または直後(末尾の符号文字)に表示されます。符号は、フィールドの値に応じて、プラスまたはマイナスとして生成されます。
- 浮動位置のマイナス記号は、フィールド値が負の場合に、値の直前(先頭の符号文字)または直後(末尾の符号文字)に表示されます。
S 符号は、列の左側に表示されます。正の値にはプラス記号が表示され、負の値にはマイナス記号が表示されます。
N フィールド値が負の場合に、列の左側にマイナス記号が表示されます。

リテラルリーディング文字

最初の出力桁(Z または 9 で示される)の前に任意の数のリテラルリーディング文字を表示できます。これらの文字は、符号文字の後に続く必要があります。符号文字がなく、最初のリテラルリーディング文字が +-S、または N の場合、アポストロフィで囲む必要があります。リテラルリーディング文字が HXZ、または 9 の場合、アポストロフィで囲む必要があります。

値に先頭のゼロが含まれており、編集マスクが Z(先頭のゼロの省略)で定義されている場合にのみ、指定された最初のリテラルリーディング文字が出力に表示されます。そのとき、この文字は、先頭のゼロに対する空白の代わりに、充填文字として表示されます。後続のリテラルリーディング文字は、入力されたとおりに表示されます。

リテラル挿入および末尾文字

リテラル挿入および末尾文字も使用できます。記号(^)は、先頭の空白、挿入された空白、または末尾の空白を表すために使用できます。有意文字(9HZX)をアポストロフィで囲むことで、先頭文字、挿入文字、または末尾文字として一般の文字と同じように使用できます。有意性のない編集マスク文字については、アポストロフィで囲む必要はありません。同様の編集マスク表記で、先頭文字、挿入文字、または末尾文字をグループとして扱うこともできます。アポストロフィで囲む必要がある場合と、そうでない場合があるので注意してください。

末尾の符号文字

末尾の符号文字は、数値編集マスクの最後に + または - 文字を使用して指定できます。+ のときは、フィールドの値に応じて、末尾の + 記号または - 記号が生成されます。- のときは、フィールドの値に応じて、末尾のスペースまたは - 記号が生成されます。編集マスクに先頭符号と末尾符号の両方を指定した場合は、どちらも出力されます。

数値編集マスクの例

次の表は、各列の先頭に示した値を編集マスクに従って編集した結果を示しています。列ヘッダーとして使用されている値はすべて N フォーマットのフィールドです。先頭の列の下の行は、異なる編集マスクを使用して得られたフォーマットです。

0000.03 (N4.2) -0054 (N4) +0087 (N4) 0962 (N4) 1830 (N4)
編集マスク
EM=9.9 0.0 4. 7. 2. 0.
EM=99 00 54 87 62 30
EM=S99 +00 -54 +87 +62 +30
EM=+Z9 +0 -54 +87 +62 +30
EM=-9.99 0.03 -4. 7. 2. 0.
EM=N9 0 -4 7 2 0
EM=*9.99 0.03 4. 7. 2. 0.
EM=Z99 00 54 87 962 830
EM=*EURZZ9.9 EUR**0.0 EUR*54. EUR*87. EUR962. EUR830.
EM=999+ 000+ 054- 087+ 962+ 830+
EM=999- 000 054- 087 962 830
IC=$ EM=ZZZ.99 $.03 $54. $87. $962. $830.
EM=H(6)
- ASCII: 303030303033 30303574 30303837 30393632 31383330
- EBCDIC: F0F0F0F0F0F3 F0F0F5D4 F0F0F8F7 F0F9F6F2 F1F8F3F0

パラメータ IC および TC を組み合わせれば、負の数でも DISPLAY ステートメントを使用してさまざまな形式で出力できます。

英数字フィールドの編集マスク

A フォーマットのフィールドにのみ使用される英数字編集マスクには、出力される文字を表す X が 1 つ以上含まれている必要があります。最初の文字が H のときは、16 進の編集マスクとなります。空白は(^)記号で表されます。閉じカッコを除くすべての文字は、先頭文字、末尾文字、および挿入文字として使用できます。アポストロフィで囲まれた先頭文字、挿入文字、または末尾文字を指定することも可能です。文字 X、閉じカッコ、または引用符を挿入文字として指定する場合は、アポストロフィで囲む必要があります。

先頭文字を英数字編集マスクの最初の出力桁 X の前に使用した場合、これらの先頭文字の最初の文字は出力されず、充填文字として英数字出力フィールドの先頭のすべての空白を置き換えるために使用されます。

例:

DEFINE DATA LOCAL                                          
1 #X (A4)  INIT <'  34'>                                   
END-DEFINE                                                 
WRITE #X (EM=*A:X:)                                        
   6X #X (EM=*A:XX:)                                       
   6X #X (EM=*A:XXX:)                                      
   6X #X (EM=*A:XXXX:)                                     
   6X #X (EM=1234XXXX5678)                                 
END

出力の生成:

A:*:      A:**:      A:**3:      A:**34:      23411345678

最後の出力桁の直後の末尾文字は出力されます。

マスクで指定した桁数がフィールド長より短い場合、マスクの長さに合わせて出力されます。

マスクで指定した桁数がフィールド長より長い場合、マスクの先頭の余分な桁が切り捨てられます。

例:

DEFINE DATA LOCAL                                                
1 #TEXT  (A4) INIT <'BLUE'>                                      
END-DEFINE                                                       
WRITE #TEXT (EM=X-X-X)        /* 'B-L-U', 3 bytes of field only. 
WRITE #TEXT (EM=X-X-X-X-X)    /* 'B-L-U-E-', with truncated mask.
END

英数字編集マスクの例

次のプログラムでは、値 BLUE を含むフィールド(フォーマット/長さ A4)の英数字編集マスクのリストを作成しています。

** Example 'EMMASK1': Edit mask                                         
************************************************************************
DEFINE DATA LOCAL                                                       
1 #TEXT  (A4)                                                           
END-DEFINE                                                              
*                                                                       
ASSIGN #TEXT = 'BLUE'                                                   
WRITE NOTITLE 'MASK 1:' 5X #TEXT (EM=X.X.X.X)                           
      /       'MASK 2:' 5X #TEXT (EM=X^X^X^X)                           
      /       'MASK 3:' 5X #TEXT (EM=X--X--X)                           
      /       'MASK 4:' 5X #TEXT (EM=X-X-X-X-X-X)                       
      /       'MASK 5:' 5X #TEXT (EM=X' 'X' 'X' 'X)                     
      /       'MASK 6:' 5X #TEXT (EM=XX....XXX)                         
      /       'MASK 7:' 5X #TEXT (EM=1234XXXX)                          
END

プログラム EMMASK1 の出力:

MASK 1:     B.L.U.E 
MASK 2:     B L U E 
MASK 3:     B--L--U 
MASK 4:     B-L-U-E-
MASK 5:     B L U E 
MASK 6:     BL....UE
MASK 7:     234BLUE

バイナリフィールド(フォーマット B)の編集マスク

バイナリフィールドの編集マスクは、X または H 表記を使用して設定できます。バイナリフィールドについては、X 表記は、X の代わりに H が指定した場合のようにサポートされます。

16 進編集マスク

編集マスクの最初の文字として H を指定した場合、英数字フィールドまたは数値フィールドの内容は 16 進形式で出力されます。各 H は、ソースフィールドの 1 バイトに対する 2 つの出力桁を表します。H 以外の文字は、マスク内の挿入文字または末尾文字として扱われます。編集マスクの長さがフィールド長より短い場合、出力桁はマスクの長さに調整されます。フィールド長が編集マスクの長さより短い場合、マスクの長さがフィールド長に調整されます。

挿入文字または末尾文字は、必要に応じてアポストロフィで囲んで指定することもできます。

16 進編集マスクで出力されたフィールドはすべて英数字として扱われます。そのため、編集マスクが編集対象のフィールドよりも短い場合、数値または英数字の桁は、小数点位置を無視して左から右へ出力されます。

16 進編集マスクを入力編集マスクとして使用する場合、0-9a-f,A-F、空白、および 16 進ゼロは、16 進数字として入力されます。

注意:
空白と 16 進ゼロは 0 としてみなされ、小文字(a-f)は大文字としてみなされます。

16 進フィールドの編集マスクの例:

次の表は、16 進編集マスクの例を示しています。この結果は、各列の上部に示したフィールドと値に基づいています。編集マスクが適用されているすべての数値(-10+1001)が、N2 フォーマットで定義されたフィールドに格納されています。英数字値 AB は、フォーマット/長さ A2 で定義されたフィールドに格納されています。

ASCII:

値 => AB -10 +10 01
EM=HH 4142 3170 3130 3031
EM=H^H 41 42 31 70 31 30 30 31
EM=HH^H 4142 3170 3130 3031
EM=H-H 41-42 31-70 31-30 30-31
EM=H 41 31 31 30

EBCDIC:

値 => AB -10 +10 01
EM=HH C1C2 F1D0 F1F0 F0F1
EM=H:H C1 C2 F1 D0 F1 F0 F0 F1
EM=HH:H C1C2 F1D0 F1F0 F0F1
EM=H-H C1-C2 F1-D0 F1-F0 F0-F1
EM=H C1 F1 F1 F0

16 進編集マスクを使用したプログラムの例:

** Example 'EMMASK2': Edit mask                                         
************************************************************************
DEFINE DATA LOCAL                                                       
1 #TEXT1 (A2)                                                           
1 #TEXT2 (N2)                                                           
END-DEFINE                                                              
*                                                                       
ASSIGN #TEXT1 = 'AB'                                                    
ASSIGN #TEXT2 =  10                                                     
*                                                                       
WRITE NOTITLE                                                           
        'MASK (EM=HH)  :' 18T #TEXT1 (EM=HH)    30T #TEXT2 (EM=HH)      
      / 'MASK (EM=H^H) :' 18T #TEXT1 (EM=H^H)   30T #TEXT2 (EM=H^H)     
      / 'MASK (EM=HH^H):' 18T #TEXT1 (EM=HH^H)  30T #TEXT2 (EM=HH^H)    
      / 'MASK (EM=H-H) :' 18T #TEXT1 (EM=H-H)   30T #TEXT2 (EM=H-H)     
      / 'MASK (EM=H)   :' 18T #TEXT1 (EM=H)     30T #TEXT2 (EM=H)       
END

プログラム EMMASK2 の出力(ASCII):

MASK (EM=HH)  :  4142        3130 
MASK (EM=H^H) :  41 42       31 30
MASK (EM=HH^H):  4142        3130 
MASK (EM=H-H) :  41-42       31-30
MASK (EM=H)   :  41          31

プログラム EMMASK2 の出力(EBCDIC):

MASK (EM=HH)  :  C1C2        F1F0 
MASK (EM=H^H) :  C1 C2       F1 F0
MASK (EM=HH^H):  C1C2        F1F0 
MASK (EM=H-H) :  C1-C2       F1-F0
MASK (EM=H)   :  C1          F1

日付(フォーマット D)と時刻(フォーマット T)のフィールドの編集マスク

フォーマット D(日付)またはフォーマット T(時刻)で定義されたフィールドの編集マスクでは、次に示す文字を指定できます。

日付(フォーマット D)および時刻(フォーマット T)

文字 使用方法
DD
ZD 日、ゼロ省略
MM
ZM 月、ゼロ省略
YYYY 年、4 桁(「入力編集マスクのヒント」を参照)
YY 年、2 桁(「入力編集マスクのヒント」を参照)
Y 年、1 桁入力フィールドでは使用しないでください。
WW 週(「入力編集マスクのヒント」および「出力編集マスクでの週表示のヒント」を参照)
ZW 週、ゼロ省略(「入力編集マスクのヒント」および「出力編集マスクでの週表示のヒント」を参照)
JJJ ユリウス日
ZZJ ユリウス日、ゼロ省略
NN... または N(n) 曜日名(言語に依存)最大長は N の個数または n の値で決まります。名前が最大長より長い場合、切り捨てが発生します。短い場合には、実際の長さの名前が使用されます。
O 曜日番号プロファイルパラメータ DTFORM によって、週の開始が月曜日か日曜日かが決まります。DTFORM=U の場合:(日曜日 = 1、月曜日 = 2 など)DTFORM=other の場合:(月曜日 = 1、火曜日 = 2 など)
LL... または L(n) 月名(言語に依存)最大長は L の個数または n の値で決まります。名前が最大長より長い場合、切り捨てが発生します。短い場合には、実際の長さの名前が使用されます。
R ローマ数字の年(最大 13 桁)入力フィールドでは使用しないでください。

日付文字の構文制限

入力および出力編集マスクに対して、次のものを使用することはできません

テキスト 文字
with 月名 MM または ZM with LL または L(n)
曜日名 with 曜日番号 NN または N(n) with O

入力編集マスクに対して、次のものを使用することはできません

テキスト 文字
1 桁年 nor ローマ数字の年 Y nor R
without 月または月名 DD または ZD without MM または ZM または LL または L(n)
without WW または ZW without YYYY または YY
without MM または ZM without YYYY または YY
ユリウス日 without JJJ または ZZJ without YYYY または YY
曜日名 without NN または N(n) without WW または ZW
曜日番号 without O without WW または ZW
ユリウス日 with JJJ または ZZJ with MM または ZM
ユリウス日 with JJJ または ZZJ with WW または ZW
with MM または ZM with WW または ZW

入力編集マスクのヒント

有効な年の値(YYYY)の範囲は 1582 - 2699 です。プロファイルパラメータ MAXYEAR9999 に設定した場合は、有効な年の値の範囲は 1582 - 9999 です。

入力編集マスクに年(YY または YYYY)のみを指定し、月や日を指定しなかった場合、月と日の値は両方とも 01 に設定されます。入力編集マスクに年(YY または YYYY)と月(MM)のみを指定し、日を指定しなかった場合、日の値は 01 に設定されます。

2 桁年(YY)を使用する場合、年表記を満たすために使用される世紀は、デフォルトで現在の世紀になります。ただし、スライディングまたは固定ウィンドウが設定されているとき、これは適用されません。詳細については、『パラメータリファレンス』ドキュメントのプロファイルパラメータ YSLW を参照してください。

週番号(WW または ZW)を曜日番号(O)または曜日名(NN...)なしで指定した場合、週の最初の曜日とみなされます。

出力編集マスクでの週表示(WW または ZW)のヒント

DTFORM=U(USA 形式)が設定されている場合、週は日曜日から始まります。他のすべての DTFORM 設定については、最初の曜日は月曜日です。週が旧年の 52/53 週であるか、新年の 01 週であるかどうかは、年にその週を超える日が含まれているかに依存します。つまり、その週の木曜日(DTFORM=U では水曜日)が前年にある場合、その週は前年に属します。翌年にある場合、その週は翌年に属します。

週番号(WW または ZW)と年表記(YYYYYY、または Y)が同じ編集マスク内にある場合、年の表示は、基礎となる日付フィールドの年に関係なく、常に週番号に対応します。

例:

DEFINE DATA LOCAL
1 D (D)
END-DEFINE
MOVE EDITED '31-12-2003' TO D(EM=DD-MM-YYYY)
DISPLAY D(EM=DD-MM-YYYY_N(10)) D(EM=DD-MM-YYYY/WW)
END

週番号 WW が編集マスクに含まれている場合、基礎となる日付が 2003 年 12 月 31 日であっても、次のように表示されます。

D                 D
--------------------  -------------
31-12-2003_Wednesday  31-12-2004/01

時刻(フォーマット T)

文字 使用方法
T 10 分の 1 秒
SS 秒。
ZS 秒、ゼロ省略
II 分。
ZI 分、ゼロ省略
HH 時間。
ZH 時間、ゼロ省略
AP AM/PM 要素

日付と時刻の編集マスクの例

** Example 'EMDATI': Edit mask for date and time variables              
************************************************************************
*                                                                       
WRITE NOTITLE                                                           
  'DATE INTERNAL :' *DATX (DF=L) /                                      
  '              :' *DATX (EM=N(9)' 'ZW.'WEEK 'YYYY)  /                 
  '              :' *DATX (EM=ZZJ'.DAY 'YYYY)        /                  
  '     ROMAN    :' *DATX (EM=R)  /                                     
  '     AMERICAN :' *DATX (EM=MM/DD/YYYY)      12X 'OR  ' *DAT4U /      
  '     JULIAN   :' *DATX (EM=YYYYJJJ)         15X 'OR  ' *DAT4J /      
  '     GREGORIAN:' *DATX (EM=ZD.''L(10)''YYYY) 5X 'OR  ' *DATG ///     
*                                                                       
  'TIME INTERNAL :' *TIMX                      14X 'OR  ' *TIME /       
  '              :' *TIMX (EM=HH.II.SS.T) /                             
  '              :' *TIMX (EM=HH.II.SS' 'AP) /                          
  '              :' *TIMX (EM=HH)                                       
END

プログラム EMDATI の出力:

DATE INTERNAL : 2005-01-12                                
              : Wednesday  2.WEEK 2005                    
              :  12.DAY 2005                              
     ROMAN    : MMV                                       
     AMERICAN : 01/12/2005            OR   01/12/2005     
     JULIAN   : 2005012               OR   2005012        
     GREGORIAN: 12.January2005        OR   12January  2005
                                                          
                                                          
TIME INTERNAL : 16:04:14              OR   16:04:14.8     
              : 16.04.14.8                                
              : 04.04.14 PM                               
              : 16

論理フィールド(フォーマット L)の編集マスク

フォーマット L(論理フィールド)のフィールドに対しては、次のように編集マスクを定義できます。

(EM=[false-string/]true-string)

false-string は 31 文字を超えないようにする必要があります。

論理フィールドの編集マスクの例

** Example 'EMLOGV': Edit mask for logical variables                    
************************************************************************
DEFINE DATA LOCAL                                                       
1 #SWITCH (L)  INIT <true>                                              
1 #INDEX  (I1)                                                          
END-DEFINE                                                              
*                                                                       
FOR #INDEX 1 5                                                          
  WRITE NOTITLE #SWITCH (EM=FALSE/TRUE) 5X 'INDEX =' #INDEX             
  WRITE NOTITLE #SWITCH (EM=OFF/ON)     7X 'INDEX =' #INDEX             
  IF #SWITCH                                                            
    MOVE FALSE TO #SWITCH                                               
  ELSE                                                                  
    MOVE TRUE TO #SWITCH                                                
  END-IF                                                                
  /*                                                                    
  SKIP 1                                                                
END-FOR                                                                 
END

プログラム EMLOGV の出力:

TRUE      INDEX =    1
ON        INDEX =    1
                      
FALSE     INDEX =    2
OFF       INDEX =    2
                      
TRUE      INDEX =    3
ON        INDEX =    3
                      
FALSE     INDEX =    4
OFF       INDEX =    4
                      
TRUE      INDEX =    5
ON        INDEX =    5