バージョン 4.2.5
 —  ステートメント  —

SORT

ストラクチャードモード構文

END-ALL                    
[AND]                    
SORT

THEM

[BY]

operand1

ASCENDING

10
RECORDS DESCENDING
    USING-clause                
    [GIVE-clause]                
    statement                
END-SORT                    

* ステートメントラベルを指定する場合、キーワード SORT、かつ END-ALL(および AND)のに指定する必要があります。

レポーティングモード構文

SORT

THEM

[BY]

operand1

ASCENDING

10
RECORDS DESCENDING
    [USING-clause]                
    [GIVE-clause]                
    statement                
[LOOP]                  

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

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

関連ステートメント:FIND(SORTED BY オプション付き)

関連機能グループ:「ループ実行


機能

SORT ステートメントは、ソート処理を実行するために使用します。SORT ステートメントを実行すると、アクティブなすべての処理ループからのレコードがソートされます。

ソート処理には、Natural の内部ソートプログラムが使用されます。 別の外部ソートプログラムを使用することもできます。

Top of page

制限事項

Top of page

構文説明

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

オペランド 構文要素 フォーマット ステートメント参照 ダイナミック定義
operand1   S       A N P I F B D T         不可 不可

構文要素の説明:

END-ALL

ストラクチャードモードでは、SORT ステートメントの前に必ず END-ALL ステートメントを指定して、アクティブなすべての処理ループを終了する必要があります。 SORT ステートメント自体では新しい処理ループを開始し、END-SORT ステートメントでループを終了する必要があります。

注意:
レポーティングモードでは、SORT ステートメントはアクティブなすべての処理ループを終了させ、新しい処理ループを開始します。

operand1
ソート条件:

operand1 は、ソート条件として使用するフィールド/変数を表します。 1~10 個のデータベースフィールド(ディスクリプタおよび非ディスクリプタ)またはユーザー定義変数を指定できます。 マルチプルバリューフィールドまたはピリオディックグループ内のフィールドを使用できます。 グループまたは配列は指定できません。

ASCENDING

デフォルトのソート順は昇順です。 値を降順でソートする場合、DESCENDING を指定します。

ASCENDING/DESCENDING は、各ソートフィールドに指定できます。

DESCENDING
USING 下記の「USING 節」を参照してください。
GIVE 下記の「GIVE 節」を参照してください。
END-SORT SORT ステートメントを終了するには、Natural 予約語 END-SORT を使用する必要があります。

USING 節

USING 節では、中間ソートストレージに書き込むフィールドを指定します。 レポーティングモードでは任意で、ストラクチャードモードでは必須です。 ただし、これにより必要なメモリが軽減されるため、レポーティングモードでも使用することを強くお勧めします。

USING {operand2}...

USING KEYS

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

オペランド 構文要素 フォーマット ステートメント参照 ダイナミック定義
operand2   S A     A N P I F B D T L C     不可 不可

構文要素の説明:

USING operand2 ソートキーフィールド(operand1 で指定)に加えて、中間ソートストレージに書き込む追加のフィールドを指定できます。
USING KEYS operand1 で指定したソートキーフィールドのみが中間ソートストレージに書き込まれます。

レポーティングモードの場合:USING 節を省略した場合、SORT ステートメントの前に開始された処理ループのすべてのデータベースフィールドおよび SORT ステートメントの前に定義されたすべてのユーザー定義変数が中間ソートストレージに書き込まれます。

ソートの実行終了後、中間ソートストレージに書き込まれなかったフィールドを参照した場合、フィールドの値はソート前のフィールドの最終値になります。

GIVE 節

GIVE 節は、SORT ステートメントの第 1 段階で評価される Natural システム関数(MAXMIN など)を指定するために使用します。 これらのシステム関数を第 3 段階で参照できます(「SORT ステートメント処理」を参照)。 SORT ステートメントの後のシステム関数を参照するときには、*AVER(SALARY) のように、前にアスタリスクを付ける必要があります。

 

MAX          
  MIN          
  NMIN          
  COUNT          
GIVE NCOUNT [OF]

(operand3 )

[(NL=nn)]
OLD operand3
  AVER          
  NAVER          
  SUM          
  TOTAL          

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

オペランド 構文要素 フォーマット ステートメント参照 ダイナミック定義
operand3   S A     *                       不可

* 使用するシステム関数に依存

構文要素の説明:

MAX | MIN | NMIN | COUNT | NCOUNT | OLD | AVER | NAVER | SUM | TOTAL 各システム関数の詳細については、『システム関数』ドキュメントを参照してください。
operand3 operand3 はフィールド名です。
(NL=nn)

このオプションは AVERNAVERSUM、および TOTAL にのみ適用され、他のシステム関数では無視されます。

このオプションを使用して、システム関数の評価中の桁あふれを防ぐことができます。『システム関数』ドキュメントの「AVER、NAVER、SUM、TOTAL での桁あふれ」を参照してください。

Top of page

SORT ステートメント処理(3 段階)

SORT ステートメントを含むプログラムは、3 つの段階で実行されます。

第 1 段階 - ソートするレコードの選択

SORT ステートメントより前のステートメントが実行されます。 USING 節に指定されたデータが中間ソートストレージに書き込まれます。

レポーティングモードでは、ソートの後で累計用に使用する変数は、SORT ステートメントの前で定義しないでください。 ストラクチャードモードでは、それらを USING 節に指定しないでください。 中間ソートストレージに書き込まれるフィールドを累計用として使用することはできません。処理の第 3 段階で個々のレコードが読み直されるためです。 各レコードについて、フィールドが読み直された個々のレコードの値で上書きされるため、累計機能として正しく処理されません。

中間ストレージに書き込まれるレコードの数は、処理ループの回数とループ当たりの処理レコードの数によって決まります。 処理ループで SORT ステートメントが出現するたびに内部中間ストレージに 1 レコードが作成されます。 ネスト構造のループの場合、内側のループが実行される場合にのみ、レコードは中間ストレージに書き込まれます。 次の例で、内側の(FIND)ループで該当レコードが見つからない場合でも中間ストレージにレコードを書き込むためには、FIND ステートメントに IF NO RECORDS FOUND 節を指定しないでください。

READ ...
  ...
  FIND ...
...
END-ALL
SORT ...
  DISPLAY ...   
END-SORT
...

第 2 段階 - レコードのソート

レコードがソートされます。

第 3 段階 - ソートされたレコードの処理

SORT ステートメントより後のステートメントが、指定のソート順で中間ストレージのすべてのレコードに対して実行されます。 SORT ステートメントの後でデータベースフィールドを参照するには、適切なステートメントラベルまたは参照番号を使用して正しく参照する必要があります。

Top of page

例 1 - SORT

** Example 'SRTEX1S': SORT (structured mode)                            
************************************************************************
DEFINE DATA LOCAL                                                       
1 EMPL-VIEW VIEW OF EMPLOYEES                                           
  2 CITY                                                                
  2 SALARY      (1:2)                                                   
  2 PERSONNEL-ID                                                        
  2 CURR-CODE   (1:2)                                                   
*                                                                       
1 #AVG          (P11)                                                   
1 #TOTAL-TOTAL  (P11)                                                   
1 #TOTAL-SALARY (P11)                                                   
1 #AVER-PERCENT (N3.2)                                                  
END-DEFINE                                                              
*                                                                       
LIMIT 3                                                                 
FIND EMPL-VIEW WITH CITY = 'BOSTON'                                     
  COMPUTE #TOTAL-SALARY = SALARY (1) + SALARY (2)                       
  ACCEPT IF #TOTAL-SALARY GT 0                                          
  /*                                                           
END-ALL                                                        
AND                                                            
SORT BY PERSONNEL-ID USING #TOTAL-SALARY SALARY(*) CURR-CODE(1)
     GIVE AVER(#TOTAL-SALARY)                             
  /*                                                           
  AT START OF DATA                                             
    WRITE NOTITLE '*' (40)                                     
         'AVG CUMULATIVE SALARY:' *AVER (#TOTAL-SALARY) /      
    MOVE *AVER (#TOTAL-SALARY) TO #AVG                         
  END-START                                                    
  COMPUTE ROUNDED #AVER-PERCENT = #TOTAL-SALARY / #AVG * 100   
  ADD #TOTAL-SALARY TO #TOTAL-TOTAL                            
  /*                                                           
  DISPLAY NOTITLE PERSONNEL-ID SALARY (1) SALARY (2)           
          #TOTAL-SALARY CURR-CODE (1)                          
          'PERCENT/OF/AVER' #AVER-PERCENT                      
  AT END OF DATA                                               
    WRITE / '*' (40) 'TOTAL SALARIES PAID: ' #TOTAL-TOTAL      
  END-ENDDATA
END-SORT  
*            
END         

プログラム SRTEX1S の出力:

PERSONNEL   ANNUAL     ANNUAL   #TOTAL-SALARY CURRENCY PERCENT
     ID       SALARY     SALARY                   CODE     OF
                                                          AVER
  --------- ---------- ---------- ------------- -------- -------
  
  **************************************** AVG CUMULATIVE SALARY:        41900
  
  20007000       16000      15200        31200  USD        74.00
  20019200       18000      17100        35100  USD        83.00
  20020000       30500      28900        59400  USD       141.00
  
  **************************************** TOTAL SALARIES PAID:        125700

上記の例は次のように実行されます。

第 1 段階:

第 2 段階:

第 3 段階:

レポーティングモードの例はライブラリ SYSEXRM のプログラム SRTEX1R を参照してください。

例 2 - SORT

** Example 'SRTEX2': SORT                                               
************************************************************************
DEFINE DATA LOCAL                                                       
1 VEHIC-VIEW VIEW OF VEHICLES                                           
  2 MAKE                                                                
  2 YEAR                                                                
END-DEFINE                                                              
*                                                                       
LIMIT 10                                                                
*                                                                       
READ VEHIC-VIEW                                                         
END-ALL                                                                 
SORT BY MAKE YEAR USING KEY                                       
  DISPLAY NOTITLE (AL=15) MAKE (IS=ON) YEAR                             
  AT BREAK OF MAKE                                                      
    WRITE '-' (20)                                                      
  END-BREAK                                                             
END-SORT                                                           
END  

プログラム SRTEX2S の出力:

     MAKE       YEAR 
--------------- -----
                     
FIAT             1980
                 1982
                 1984
-------------------- 
PEUGEOT          1980
                 1982
                 1985
-------------------- 
RENAULT          1980
                 1980
                 1982
                 1982
--------------------

Top of page

外部ソートプログラムの使用

Natural では、ソート処理はデフォルトで Natural の内部ソートプログラムによって実行されます(上記参照)。 ただし、外部ソートプログラムを使用することもできます。 この外部ソートプログラムでは、Natural の内部ソートプログラムの代わりにソート処理を実行します。

使用する外部ソートプログラムは、Natural 管理者によって Natural パラメータモジュールのマクロ NTSORT で決定されます。 外部ソートプログラムを使用するには、追加の JCL が必要です。 詳細については、Natural 管理者に確認してください。

Top of page