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                  

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

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

関連ステートメント:FINDSORTED BY オプションあり)

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


関数

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

注意:
Natural は、ソート処理中に一時ワークファイルを作成します。TMPSORTUNIQ プロファイルパラメータを指定した場合(『パラメータリファレンス』ドキュメントを参照)、Natural によって一時ソートワークファイルに一意の名前が生成されます。

制限

  • SORT ステートメントは、ソートするレコードを持つ処理ループと同じオブジェクト内に指定する必要があります。

  • SORT ステートメントのネスト構造は許可されていません。

  • ソートするレコードの合計長が 10240 バイトを超過しないようにする必要があります。

  • ソート条件の数は 10 を超過しないようにする必要があります。

構文説明

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

オペランド 構文要素 フォーマット オペランド参照 ダイナミック定義
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 節:

下記の「USING 節」を参照してください。

GIVE
GIVE 節:

下記の「GIVE 節」を参照してください。

END-SORT
SORT ステートメントの終了:

ストラクチャードモードでは、SORT ステートメントを終了するには、Natural の予約語 END-SORT を使用する必要があります。

レポーティングモードでは、Natural のステートメント LOOP を使用して SORT ステートメントを終了します。

LOOP

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) のように、前にアスタリスクを付ける必要があります。

注意:
キーワード GIVE の代わりに、キーワード GIVING を使用できます。

 

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.m)
桁あふれの防止:

このオプションは、システム関数 AVERNAVERSUM および TOTAL のみに適用されます。他のシステム関数では無視されます。『パラメータリファレンス』ドキュメントのセッションパラメータ NL も参照してください。

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

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 ステートメントの後でデータベースフィールドを参照するには、適切なステートメントラベルまたは参照番号を使用して正しく参照する必要があります。

例 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 段階:

  • EMPLOYEES ファイルから CITY=BOSTON のレコードが選択されます。

  • SALARY の最初の 2 オカレンスがフィールド #TOTAL-SALARY に加算されます。

  • #TOTAL-SALARY が 0 より大きいレコードのみが受け入れられます。

  • レコードが中間ソートストレージに書き込まれます。データベース配列 SALARY(最初の 2 オカレンス)、CURR-CODE(第 1 オカレンス)、データベースフィールド PERSONNEL-ID、およびユーザー定義変数 #TOTAL-SALARY が中間ストレージに書き込まれます。

  • #TOTAL-SALARY の平均が評価されます。

第 2 段階:

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

第 3 段階:

  • ソートされた中間ストレージが読み取られます。

  • AT START OF DATA 条件で #TOTAL-SALARY の平均値が表示されます。

  • #TOTAL-SALARY#TOTAL-TOTAL に追加され、フィールド PERSONNEL-IDSALARY(1)SALARY(2)#AVER-PERCENT および #TOTAL-SALARY が表示されます。

  • AT END OF DATA 条件で変数 #TOTAL-TOTAL が出力されます。

レポーティングモードの例については、次のプログラムを参照してください: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
--------------------

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

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

外部ソートプログラムとして、DMExpress SyncSort for UNIX がサポートされています。

外部ソートプログラムを使用するかどうかは、Natural のインストール時に決定できます。詳細については、『インストール』ドキュメントの「Natural ニュークリアスの再リンク」を参照してください。

ソート対象のレコードは、ローカルコンフィグレーションファイルインストール割り当て内の TMP_PATH で指定されたディレクトリに一時的に保存されます。