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 の内部ソートプログラムが使用されます。 別の外部ソートプログラムを使用することもできます。
SORT
ステートメントは、ソートするレコードを持つ処理ループと同じオブジェクト内に指定する必要があります。
SORT
ステートメントのネスト構造は許可されていません。
ソートするレコードの合計長が 10240 バイトを超過しないようにする必要があります。
ソート条件の数は 10 を超過しないようにする必要があります。
オペランド定義テーブル:
オペランド | 構文要素 | フォーマット | ステートメント参照 | ダイナミック定義 | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
operand1 | S | A | N | P | I | F | B | D | T | 不可 | 不可 |
構文要素の説明:
END-ALL |
ストラクチャードモードでは、 注意: |
---|---|
operand1 |
ソート条件:
operand1 は、ソート条件として使用するフィールド/変数を表します。 1~10 個のデータベースフィールド(ディスクリプタおよび非ディスクリプタ)またはユーザー定義変数を指定できます。 マルチプルバリューフィールドまたはピリオディックグループ内のフィールドを使用できます。 グループまたは配列は指定できません。 |
ASCENDING |
デフォルトのソート順は昇順です。 値を降順でソートする場合、
|
DESCENDING | |
USING | 下記の「USING 節」を参照してください。 |
GIVE | 下記の「GIVE 節」を参照してください。 |
END-SORT | SORT ステートメントを終了するには、Natural 予約語 END-SORT を使用する必要があります。
|
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
節は、SORT
ステートメントの第 1 段階で評価される Natural システム関数(MAX
、MIN
など)を指定するために使用します。 これらのシステム関数を第 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) |
このオプションは このオプションを使用して、システム関数の評価中の桁あふれを防ぐことができます。『システム関数』ドキュメントの「AVER、NAVER、SUM、TOTAL での桁あふれ」を参照してください。 |
SORT
ステートメントを含むプログラムは、3 つの段階で実行されます。
SORT
ステートメントより前のステートメントが実行されます。 USING
節に指定されたデータが中間ソートストレージに書き込まれます。
レポーティングモードでは、ソートの後で累計用に使用する変数は、SORT
ステートメントの前で定義しないでください。 ストラクチャードモードでは、それらを USING
節に指定しないでください。 中間ソートストレージに書き込まれるフィールドを累計用として使用することはできません。処理の第 3 段階で個々のレコードが読み直されるためです。 各レコードについて、フィールドが読み直された個々のレコードの値で上書きされるため、累計機能として正しく処理されません。
中間ストレージに書き込まれるレコードの数は、処理ループの回数とループ当たりの処理レコードの数によって決まります。 処理ループで SORT
ステートメントが出現するたびに内部中間ストレージに 1 レコードが作成されます。 ネスト構造のループの場合、内側のループが実行される場合にのみ、レコードは中間ストレージに書き込まれます。 次の例で、内側の(FIND
)ループで該当レコードが見つからない場合でも中間ストレージにレコードを書き込むためには、FIND
ステートメントに IF NO RECORDS FOUND
節を指定しないでください。
READ ... ... FIND ... ... END-ALL SORT ... DISPLAY ... END-SORT ...
レコードがソートされます。
SORT
ステートメントより後のステートメントが、指定のソート順で中間ストレージのすべてのレコードに対して実行されます。 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
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
上記の例は次のように実行されます。
EMPLOYEES ファイルから CITY=BOSTON
のレコードが選択されます。
SALARY
の最初の 2 オカレンスがフィールド #TOTAL-SALARY
に加算されます。
#TOTAL-SALARY
で、0 より大きいレコードのみが受け入れられます。
レコードが中間ソートストレージに書き込まれます。 データベース配列 SALARY
(最初の 2 オカレンス)、CURR-CODE
(第 1 オカレンス)、データベースフィールド PERSONNEL-ID
、およびユーザー定義変数 #TOTAL-SALARY
が中間ストレージに書き込まれます。
#TOTAL-SALARY
の平均値が評価されます。
レコードがソートされます。
ソートされた中間ストレージが読み取られます。
AT START OF DATA 条件で #TOTAL-SALARY
の平均値が表示されます。
#TOTAL-SALARY
が #TOTAL-TOTAL
に加算され、フィールド PERSONNEL-ID
、SALARY(1)
、SALARY(2)
、#AVER-PERCENT
、および #TOTAL-SALARY
が表示されます。
AT END OF DATA 条件で変数 #TOTAL-TOTAL
が出力されます。
レポーティングモードの例はライブラリ SYSEXRM のプログラム SRTEX1R を参照してください。
** 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
MAKE YEAR --------------- ----- FIAT 1980 1982 1984 -------------------- PEUGEOT 1980 1982 1985 -------------------- RENAULT 1980 1980 1982 1982 --------------------
Natural では、ソート処理はデフォルトで Natural の内部ソートプログラムによって実行されます(上記参照)。 ただし、外部ソートプログラムを使用することもできます。 この外部ソートプログラムでは、Natural の内部ソートプログラムの代わりにソート処理を実行します。
使用する外部ソートプログラムは、Natural 管理者によって Natural パラメータモジュールのマクロ NTSORT
で決定されます。 外部ソートプログラムを使用するには、追加の JCL が必要です。 詳細については、Natural 管理者に確認してください。