END-ALL |
||||||||||
[AND]
|
||||||||||
SORT |
|
THEM |
|
[BY]
|
|
operand1 |
|
ASCENDING |
|
|
RECORDS |
DESCENDING |
|||||||||
| USING-clause | ||||||||||
| [GIVE-clause] | ||||||||||
| statement |
||||||||||
END-SORT |
* ステートメントラベルを指定する場合、キーワード SORT の前、かつ END-ALL(および AND)の後に指定する必要があります。
SORT |
|
THEM |
|
[BY]
|
|
operand1 |
|
ASCENDING |
|
|
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 で指定されたディレクトリに一時的に保存されます。