コンテンツフレーム起動

内部テーブルのソート 文書を SAP ライブラリストラクチャに組み込む

プログラムで、標準テーブルまたはハッシュテーブルをソートすることができます。テーブルをテーブルキーでソートするには、以下の命令を使用します。

SORT <itab> [ASCENDING|DESCENDING] [AS TEXT] [STABLE].

この命令では、内部テーブル <itab> がテーブルキーによって昇順でソートされます。この命令は、常にテーブル自体に適用され、ヘッダ行には適用されません。ソート順序は、内部テーブル内の標準キー項目の順序によって決まります。デフォルトキーはテーブル行の非数値項目で構成されており、それらの項目はそれらが出現する順序で並んでいます。

オプション ASCENDING および DESCENDING を使用して、ソートの方向を指定することができます。デフォルトは昇順です。

ソートキーが大きいほど、テーブルのソートに必要な時間が多くなります。ソートキーに内部テーブルが含まれている場合は、ソートプロセスはかなり遅くなります。

SORT 命令でソートテーブルをソートすることはできません。ソートテーブルは、常に自身のソート順序によって自動的に更新されます。内部テーブルがソートテーブルとして静的に認識できる場合、SORT 命令を使用すると構文エラーが発生します。テーブルがジェネリックソートテーブルである場合は、ソートキーがテーブルキーの先頭の抽出と同じでないときや、降順でソートするか AS TEXT オプションを使用したときに、SORT 命令によって実行時エラーが発生します。つまり、SORT 命令は、内部ソート順序に違反していない場合に限って、ジェネリック内部テーブルに対してのみ使用することができます。

別のソートキーによるソート

構造化された行データ型を持つ内部テーブルを別のキーでソートしたい場合、以下のように SORT 命令でそのキーを指定することができます。

SORT <itab> [ASCENDING|DESCENDING] [AS TEXT] [STABLE]
             BY <f1> [ASCENDING|DESCENDING] [AS TEXT]
                ...

                 <fn> [ASCENDING|DESCENDING] [AS TEXT].

テーブルは、テーブルキーによってではなく、指定したコンポーネント <f1> ... <fn> によってソートされます。ソート項目の数は、250 に制限されます。ソート順序は、項目 <f i >. の順序によって決まります。BY の前に指定したソート順序はすべての項目に適用されます。項目の後ろのソート順序は、テーブルの列にのみ適用されます。

<fi> の代わりに(<f>) を指定して、ソート項目を動的に指定することができます。項目 <f> の内容によって、ソート項目の名前が決定されます。命令の実行時に <f> が空である場合は、その項目はソートで無視されます。項目に無効なコンポーネント名が含まれている場合は、実行時エラーが発生します。

アルファベット順のソート

ASCENDING オプションや DESCENDING オプションのほかに、ソート全体または各ソート項目をアルファベット順にするように指定することができます。

SORT <itab> ...AS TEXT ... .

このオプションは、文字列のソート方法に影響します。オプションを使用しないと、文字列はハードウェアプラットフォームによって指定された順序に従ってソートされます。オプション AS TEXT を使用すると、文字項目は現在のテキスト環境に従ってアルファベット順にソートされます。デフォルトでは、テキスト環境はユーザマスタレコードに設定されています。ただし、以下の命令を使用してテキスト環境を明示的に設定することもできます。

SET LOCALE LANGUAGE

AS TEXT オプションを使用すると、文字列をソート可能な書式に変換しなくても済みます。このような変換は、以下の場合にのみ必要です。

        内部テーブルをアルファベット順でソートしてからバイナリ検索を使用する場合

        文字項目をキーとして使用して内部テーブルを複数回再ソートする場合 ( このようにすると、変換が1 回しか必要なくなるため)

        プログラムでデータベーステーブル用のアルファベット順の索引を作成する場合

AS TEXT オプションをソート全体に適用した場合は、C 型のソート項目にのみ影響します。AS TEXT オプションを単一のソート項目に適用する場合は、そのソート項目は C 型でなければなりません。

安定したソート

オプション

SORT <itab> ... STABLE.

を使用すると、安定したソートを実行することができます。つまり、ソートによって変化しない行の相対順序は変更されません。STABLE オプションを使用しない場合は、ソート順序は保持されません。テーブルを同一のキーで何回もソートした場合、テーブルエントリの順序はソートごとに変化します。ただし、安定したソートは、安定しないソートよりも時間がかかります。

 例

DATA: BEGIN OF LINE,
        LAND(3)  TYPE C,
        NAME(10) TYPE C,
        AGE      TYPE I,
        WEIGHT   TYPE P DECIMALS 2,
      END OF LINE.

DATA ITAB LIKE STANDARD TABLE OF LINE WITH NON-UNIQUE KEY LAND.

LINE-LAND = 'G'.   LINE-NAME   = 'Hans'.
LINE-AGE  = 20.    LINE-WEIGHT = '80.00'.
APPEND LINE TO ITAB.

LINE-LAND = 'USA'.LINE-NAME   = 'Nancy'.
LINE-AGE  = 35.    LINE-WEIGHT = '45.00'.
APPEND LINE TO ITAB.

LINE-LAND = 'USA'.LINE-NAME   = 'Howard'.
LINE-AGE  = 40.    LINE-WEIGHT = '95.00'.
APPEND LINE TO ITAB.

LINE-LAND = 'GB'.  LINE-NAME   = 'Jenny'.
LINE-AGE  = 18.    LINE-WEIGHT = '50.00'.
APPEND LINE TO ITAB.

LINE-LAND = 'F'.   LINE-NAME   = 'Michele'.
LINE-AGE  = 30.    LINE-WEIGHT = '60.00'.
APPEND LINE TO ITAB.

LINE-LAND = 'G'.   LINE-NAME   = 'Karl'.
LINE-AGE  = 60.    LINE-WEIGHT = '75.00'.
APPEND LINE TO ITAB.

PERFORM LOOP_AT_ITAB.

SORT ITAB.
PERFORM LOOP_AT_ITAB.

SORT ITAB.
PERFORM LOOP_AT_ITAB.

SORT ITAB STABLE.
PERFORM LOOP_AT_ITAB.

SORT ITAB DESCENDING BY LAND WEIGHT ASCENDING.
PERFORM LOOP_AT_ITAB.

FORM LOOP_AT_ITAB.
   LOOP AT ITAB INTO LINE.
     WRITE: / LINE-LAND, LINE-NAME, LINE-AGE, LINE-WEIGHT.
   ENDLOOP.
   SKIP.
ENDFORM.

出力は以下のようになります。

G   Hans               20         80.00
USA Nancy              35         45.00
USA Howard             40         95.00
GB  Jenny              18         50.00
F   Michele            30         60.00
G   Karl               60         75.00

F   Michele            30         60.00
G   Hans               20         80.00
G   Karl               60         75.00
GB  Jenny              18         50.00
USA Howard             40         95.00
USA Nancy              35         45.00

F   Michele            30         60.00
G   Karl               60         75.00
G   Hans               20         80.00
GB  Jenny              18         50.00
USA Howard             40         95.00
USA Nancy              35         45.00

F   Michele            30         60.00
G   Karl               60         75.00
G   Hans               20         80.00
GB  Jenny              18         50.00
USA Howard             40         95.00
USA Nancy              35         45.00

USA Nancy              35         45.00
USA Howard             40         95.00
GB  Jenny              18         50.00
G   Karl               60         75.00
G   Hans               20         80.00
F   Michele            30         60.00

このプログラムでは、標準テーブルが 1 つのキー項目で 4 回ソートされます。まず、STABLE オプションを使用しないで、キー項目 (LAND) 2 回ソートされます。ソートは安定していません。第 2 行と第 3 行の順序が変化しています。次に、STABLE オプションを使用して同じソートが実行されます。ソートは安定しています。行は同じ順序に保たれています。次に、LAND および WEIGHT として定義されたソートキーでテーブルがソートされます。一般のソート順序は降順として定義されますが、WEIGHT の場合、ソート順序は昇順として定義されます。

 例

DATA: BEGIN OF LINE,
        TEXT(6),
        XTEXT(160) TYPE X,
      END OF LINE.

DATA ITAB LIKE HASHED TABLE OF LINE WITH UNIQUE KEY TEXT.

LINE-TEXT = 'Muller'.
CONVERT TEXT LINE-TEXT INTO SORTABLE CODE LINE-XTEXT.
INSERT LINE INTO TABLE ITAB.

LINE-TEXT = 'Mller'.
CONVERT TEXT LINE-TEXT INTO SORTABLE CODE LINE-XTEXT.
INSERT LINE INTO TABLE ITAB.

LINE-TEXT = 'Moller'.
CONVERT TEXT LINE-TEXT INTO SORTABLE CODE LINE-XTEXT.
INSERT LINE INTO TABLE ITAB.

LINE-TEXT = 'Miller'.
CONVERT TEXT LINE-TEXT INTO SORTABLE CODE LINE-XTEXT.
INSERT LINE INTO TABLE ITAB.

SORT ITAB.
PERFORM LOOP_AT_ITAB.

SORT ITAB BY XTEXT.
PERFORM LOOP_AT_ITAB.

SORT ITAB AS TEXT.
PERFORM LOOP_AT_ITAB.

FORM LOOP_AT_ITAB.
  LOOP AT ITAB INTO LINE.
    WRITE / LINE-TEXT.
  ENDLOOP.
  SKIP.
ENDFORM.

この例は、文字項目のアルファベット順のソートを示しています。内部テーブル ITAB には、アルファベット順でソートできる、文字項目を持つ列とそれに対応するバイナリコードを持つ列が含まれています。バイナリコードは、CONVERT 命令を使用して作成されます ( 詳細については、ソート可能な書式への変換を参照してください) 。テーブルは 3 回ソートされます。1 回目は、TEXT 項目でバイナリコード順にソートされます。2 回目は、XTEXT 項目でバイナリコード順にソートされます。3 回目は、TEXT 項目でアルファベット順にソートされます。英語では適切な例がないので、ドイツ語のテキスト環境の場合の出力を以下に示します。

Miller
Moller
Muller
Mller

Miller
Moller
Mller
Muller

Miller
Moller
Mller
Muller

1 回目のソートのあと、'Mller' 'Muller' の後ろになっています。これは、文字 '' の内部コードが 'u' の内部コードの後ろにあるためです。2 回目と 3 回目のソート結果はアルファベット順になっています。XTEXT によるバイナリソートの結果は、項目 TEXT によるアルファベット順のソートと同じになります。

 

 

 

 

コンテンツフレーム終了