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 は、ソート処理中に一時ワークファイルを作成します。TMPSORTUNIQ
プロファイルパラメータを指定した場合(『パラメータリファレンス』ドキュメントを参照)、Natural によって一時ソートワークファイルに一意の名前が生成されます。
SORT
ステートメントは、ソートするレコードを持つ処理ループと同じオブジェクト内に指定する必要があります。
SORT
ステートメントのネスト構造は許可されていません。
ソートするレコードの合計長が 10240 バイトを超過しないようにする必要があります。
ソート条件の数は 10 を超過しないようにする必要があります。
オペランド定義テーブル:
オペランド | 構文要素 | フォーマット | オペランド参照 | ダイナミック定義 | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
operand1 |
S | A | N | P | I | F | B | D | T | × | × |
構文要素の説明:
構文要素 | 説明 |
---|---|
END-ALL |
現在アクティブなループをすべて閉じる:
ストラクチャードモードでは、 注意: |
operand1 |
ソート条件:
|
ASCENDING |
ソート順序:
デフォルトのソート順は昇順です。値を降順でソートする場合、
|
DESCENDING |
|
USING |
USING 節:
下記の「USING 節」を参照してください。 |
GIVE |
GIVE 節:
下記の「GIVE 節」を参照してください。 |
END-SORT |
SORT ステートメントの終了:
ストラクチャードモードでは、 レポーティングモードでは、Natural のステートメント |
LOOP |
USING
節では、中間ソートストレージに書き込むフィールドを指定します。レポーティングモードでは任意で、ストラクチャードモードでは必須です。ただし、これにより必要なメモリが軽減されるため、レポーティングモードでも使用することを強くお勧めします。
|
オペランド定義テーブル:
オペランド | 構文要素 | フォーマット | オペランド参照 | ダイナミック定義 | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
operand2 |
S | A | A | N | P | I | F | B | D | T | L | C | × | × |
構文要素の説明:
構文要素 | 説明 |
---|---|
USING
operand2 |
追加のフィールド:
ソートキーフィールド( |
USING
KEYS |
ソートキーフィールドのみ:
|
レポーティングモードの場合:USING
節を省略した場合、SORT
ステートメントの前に開始された処理ループのすべてのデータベースフィールドおよび SORT
ステートメントの前に定義されたすべてのユーザー定義変数が中間ソートストレージに書き込まれます。
ソートの実行終了後、中間ソートストレージに書き込まれなかったフィールドを参照した場合、フィールドの値はソート前のフィールドの最終値になります。
GIVE
節は、SORT
ステートメントの第 1 段階で評価される Natural システム関数(MAX
、MIN
など)を指定するために使用します。これらのシステム関数を第 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 |
フィールド名:
|
(NL=nn.m) |
桁あふれの防止:
このオプションは、システム関数 このオプションを使用して、システム関数の評価中の桁あふれを防ぐことができます。『システム関数』ドキュメントの「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
が出力されます。
レポーティングモードの例については、次のプログラムを参照してください: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 の内部ソートプログラムの代わりにソート処理を実行します。
外部ソートプログラムとして、DMExpress SyncSort for UNIX がサポートされています。
外部ソートプログラムを使用するかどうかは、Natural のインストール時に決定できます。詳細については、『インストール』ドキュメントの「Natural ニュークリアスの再リンク」を参照してください。
ソート対象のレコードは、ローカルコンフィグレーションファイルのインストール割り当て内の TMP_PATH
で指定されたディレクトリに一時的に保存されます。