COMPRESS

  COMPRESS [NUMERIC] [FULL]
 

operand1 [(parameter)]
SUBSTRING (operand1,operand3,operand4) [(parameter)]
 
  INTO operand2

 
SUBSTRING (operand2,operand5,operand6)
 
  LEAVING [SPACE]  
LEAVING NO [SPACE]  
WITH [ALL] [DELIMITERS] [operand7]  

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

構文図で使用されている記号については、「構文記号」を参照してください。

関連ステートメント:ASSIGN | COMPUTE | EXAMINE | MOVE | MOVE ALL | SEPARATE

関連機能グループ:算術演算とデータ移動操作


関数

COMPRESS ステートメントは、1 つ以上のオペランドの内容を単一の英数字フィールドへ転送(結合)するために使用します。

構文説明

オペランド定義テーブル:

オペランド 構文要素 フォーマット オペランド参照 ダイナミック定義
operand1 C S A G N A U N P I F B D T     G O ×
operand2   S       A U         B            
operand3 C S           N P I   B*             ×
operand4 C S           N P I   B*             ×
operand5 C S           N P I   B*             ×
operand6 C S           N P I   B*             ×
operand7 C S       A U         B             ×

* operand3operand4operand5 および operand6 のフォーマット B は、4 以下の長さでのみ使用できます。

構文要素の説明:

構文要素 説明
NUMERIC
符号文字の処理:

このオプションは、符号文字や小数文字の扱いを指定します。

NUMERIC を指定しないと、数値の小数点や符号は値が転送される前に除外されます。例えば、次のようになります。

COMPRESS -123  1.23 INTO #TARGET WITH DELIMITER '*'
Content of #TARGET is: 123*123

NUMERIC を指定すると、数値の小数点や符号もターゲットフィールドに転送されます。

浮動小数点の値については、NUMERIC が指定されているかどうかに関係なく、小数点と符号が転送されます。

例 1
COMPRESS NUMERIC -123  1.23 INTO #TARGET WITH DELIMITER '*'
Content of #TARGET is: -123*1.23
例 2:
COMPRESS NUMERIC 'ABC' -0056.00 -0056.10 -0056.01 
INTO #TARGET WITH DELIMITER '*'
Content of #TARGET is: ABC*-56*-56.1*-56.01
例 3:
COMPRESS NUMERIC FULL 'ABC' -0056.00 -0056.10 -0056.01 
INTO #TARGET WITH DELIMITER '*'
Content of #TARGET is: ABC*-0056.00*-0056.10*-0056.01
FULL
ソースフィールド値の処理:

FULL を指定しないと、値が転送される前に次のものがソースフィールドから削除されます。

  • フォーマット N、P、または I のフィールドの小数点の前にある先頭のゼロ

  • フォーマット N または P のフィールドの小数点の後にある末尾のゼロ

  • フォーマット A のフィールドの末尾にある空白

  • フォーマット B のフィールドの先頭にあるバイナリの 0

すべて 0 の数値ソースフィールドについては 1 つの 0 が転送されます。例えば、次のようになります。

COMPRESS 'ABC '  001 INTO #TARGET WITH DELIMITER '*'
Content of #TARGET is: ABC*1

FULL を指定すると、ソースフィールドの実際の長さの値がターゲットフィールドに送られます。つまり、次のようになります。

  • フォーマット N、P、または I のフィールドの小数点の前にある先頭のゼロ

  • フォーマット N または P のフィールドの小数点の後にある末尾のゼロ

  • フォーマット A のフィールドの末尾にある空白

  • フォーマット B のフィールドの先頭にあるバイナリの 0

これらは入力したとおりに表示されます。例えば、次のようになります。

COMPRESS FULL 'ABC '  001 INTO #TARGET WITH DELIMITER '*'
Content of #TARGET is: ABC *001
operand1
ソースフィールド:

operand1 として、内容が転送されるフィールドを指定します。

注意:
operand1 がフォーマット A または B でない場合、その内容は転送される前に英数字表現に変換されます。必要に応じて、英数字表現は切り捨てられます。

operand1 が時刻変数(フォーマット T)の場合は、変数内容のうち時刻コンポーネントのみが転送され、日付コンポーネントは転送されません。

operand2
ターゲットフィールド:

operand2 として、ソースフィールドの値を受け取るフィールドを指定します。

ターゲットフィールドがフォーマット U(Unicode)であり、フォーマット B のソースフィールドが含まれている場合、送信するバイナリフィールドの長さを同じにする必要があります。

LEAVING SPACE
空白で区切られたターゲットフィールドの値:
追加オプションを一切指定しないで COMPRESS ステートメントを使用したか、または LEAVING SPACE(デフォルトでも適用される)を指定した場合、ターゲットフィールド内の値は互いに空白で区切られます。
LEAVING NO SPACE
区切られていないターゲットフィールドの値:
LEAVING NO SPACE が指定されると、ターゲットフィールド内の各値の間には、空白も文字も入りません。
parameter
出力モード/日付フォーマットパラメータ:
parameter では、セッションパラメータ PM またはセッションパラメータ DF を指定できます。
PM=I

右から左に記述する言語をサポートするために、PM=I を指定して、operand1 の値を逆(右から左)方向で operand2 に渡すことができます。例えば、次のステートメントの結果として、#B の内容は ZYXABC になります。

MOVE 'XYZ' TO #A
COMPRESS #A (PM=I) 'ABC' 
INTO #B LEAVING NO SPACE

operand1 の末尾にある空白はすべて削除され(FULL を指定した場合を除く)、値は 1 文字ずつ逆向きに並べ換えられて operand2 に転送されます。

DF operand1 が日付変数の場合、この変数に対する parameter としてセッションパラメータ DF を指定できます。
SUBSTRINGoperand1operand3operand4
SUBSTRING オプション:
operand1 が英数字(A)、Unicode(U)、またはバイナリ(B)フォーマットの場合、SUBSTRING オプションを使用して、ソースフィールドの特定部分だけを転送できます。フィールド名(『operand1』)の後に、まず開始位置(operand3)を指定してから、フィールドの転送される部分の長さ(operand4)を指定してください。
INTO SUBSTRINGoperand2operand5operand6
INTO 節:

INTO 節に SUBSTRING オプションを使用してソース値をターゲットフィールドの特定部分に転送することもできます。

どちらの場合も、COMPRESS ステートメントで SUBSTRING オプションを使用することは、MOVE ステートメントの SUBSTRING オプションに相当します。SUBSTRING オプションの詳細については、MOVE ステートメントを参照してください。

WITH DELIMITERS
入力デリミタ文字

DELIMITERS オプションは、ターゲットフィールドの値を特定の文字で区切ることができます。

WITH DELIMITERSoperand7 なしで指定した場合、値は入力デリミタ文字(セッションパラメータ ID で定義した値)で区切られます。

WITH DELIMITERS operand7
特定のデリミタ文字
WITH DELIMITERS operand7 を指定すると、値は operand7 に指定した文字で区切られます。operand7 は、1 文字にする必要があります。operand7 が変数の場合は、そのフォーマット/長さを(A1)または(B1)にする必要があります

ターゲットフィールドがフォーマット A または B の場合は、デリミタ文字のフォーマット/長さを(A1)、(B1)、または(U1)にする必要があります。

ターゲットフィールドがフォーマット U(Unicode)の場合は、デリミタ文字のフォーマット/長さを(A1)、(B2)、または(U1)にする必要があります。

WITH ALL
デリミタの処理:

ALL を指定しないと、ターゲットフィールドでは、実際に転送された値の間にのみデリミタ文字が挿入されます。例えば、次のようになります。

COMPRESS 'A' ' ' 'C' ' ' INTO #TARGET WITH DELIMITERS '*'
Content of #TARGET is: A*C

ALL を指定すると、ターゲットフィールドでは、実際には転送されない空値に対してもデリミタ文字が挿入されます。デリミタ文字の個数は、ソースフィールド数から 1 を引いた数になります。これは、ターゲットフィールドの内容を後続の SEPARATE ステートメントで再度分割するときなどに有用です。例えば、次のようになります。

COMPRESS 'A' ' ' 'C' ' ' INTO #TARGET WITH ALL DELIMITERS '*'
Content of #TARGET is: A**C*

処理

フォーマット B の転送先フィールドは、フォーマット A の転送先フィールドと同様に処理されます。

COMPRESS 操作は、全オペランドの処理が終了するか、またはターゲットフィールド(operand2)に空きがなくなると終了します。

ターゲットフィールドが全オペランドの合計桁数よりも大きい場合、operand2 の残りの部分は空白となります。ターゲットフィールドの方が小さい場合、値は切り捨てられます。

operand2 がダイナミック変数である場合、COMPRESS 操作は全ソースオペランドが処理されると終了します。値の切り捨ては行われません。COMPRESS 操作後の operand2 の長さは、ソースオペランドの合計の長さに対応します。ダイナミック変数の現在の長さは、システム変数 *LENGTH を使用して確認できます。

このセクションでは、次のトピックについて説明します。

例 1 - COMPRESS

** Example 'CMPEX1': COMPRESS                                           
************************************************************************
DEFINE DATA LOCAL                                                       
1 EMPLOY-VIEW VIEW OF EMPLOYEES                                         
  2 NAME                                                                
  2 FIRST-NAME                                                          
  2 MIDDLE-I                                                            
*                                                                       
1 #COMPRESSED-NAME (A20)                                                
END-DEFINE                                                              
*                                                                       
LIMIT 4                                                                 
READ EMPLOY-VIEW BY NAME                                                
  COMPRESS FIRST-NAME MIDDLE-I NAME INTO #COMPRESSED-NAME     
  DISPLAY NOTITLE                                                       
          FIRST-NAME MIDDLE-I NAME 5X #COMPRESSED-NAME                  
END-READ                                                                
*                                                                       
END

プログラム CMPEX1 の出力:

     FIRST-NAME      MIDDLE-I         NAME               #COMPRESSED-NAME  
-------------------- -------- --------------------     --------------------
                                                                           
KEPA                          ABELLAN                  KEPA ABELLAN        
ROBERT               W        ACHIESON                 ROBERT W ACHIESON   
SIMONE                        ADAM                     SIMONE ADAM         
JEFF                 H        ADKINSON                 JEFF H ADKINSON

例 2 - COMPRESS LEAVING NO SPACE

** Example 'CMPEX2': COMPRESS (with LEAVING NO SPACE)                   
************************************************************************
DEFINE DATA LOCAL                                                       
1 EMPL-VIEW VIEW OF EMPLOYEES                                           
  2 NAME                                                                
  2 CURR-CODE (1)                                                       
  2 SALARY    (1)                                                       
*                                                                       
1 #CCSALARY   (A20)                                                     
END-DEFINE                                                              
*                                                                       
LIMIT 4                                                                 
READ EMPL-VIEW BY NAME                                                  
 
  COMPRESS CURR-CODE (1) SALARY (1) INTO #CCSALARY                      
           LEAVING NO SPACE                                            
  DISPLAY NOTITLE                                                       
          NAME CURR-CODE (1) SALARY (1) 5X #CCSALARY                    
END-READ                                                                
*
END

プログラム CMPEX2 の出力:

        NAME         CURRENCY   ANNUAL            #CCSALARY      
                       CODE     SALARY                           
-------------------- -------- ----------     --------------------
                                                                 
ABELLAN              PTA         1450000     PTA1450000          
ACHIESON             UKL           11300     UKL11300            
ADAM                 FRA          159980     FRA159980           
ADKINSON             USD           34500     USD34500

例 3 - COMPRESS WITH DELIMITERS

** Example 'CMPEX3': COMPRESS (with delimiter)                          
************************************************************************
DEFINE DATA LOCAL                                                       
1 EMPL-VIEW VIEW OF EMPLOYEES                                           
  2 NAME                                                                
  2 CURR-CODE (1)                                                       
  2 SALARY    (1)                                                       
*                                                                       
1 #CCSALARY   (A20)                                                     
END-DEFINE                                                              
*                                                                       
LIMIT 4                                                                 
READ EMPL-VIEW BY NAME                                                  
  COMPRESS CURR-CODE (1) SALARY (1) INTO #CCSALARY                      
           WITH DELIMITER '*'
  DISPLAY NOTITLE NAME CURR-CODE (1) SALARY (1) 5X #CCSALARY            
END-READ                                                                
*                                                                       
END

プログラム CMPEX3 の出力:

        NAME         CURRENCY   ANNUAL            #CCSALARY      
                       CODE     SALARY                           
-------------------- -------- ----------     --------------------
                                                                 
ABELLAN              PTA         1450000     PTA*1450000         
ACHIESON             UKL           11300     UKL*11300           
ADAM                 FRA          159980     FRA*159980          
ADKINSON             USD           34500     USD*34500