ソ ー ト 


 戻る 



AS/400では基本的にはソート処理を行う設計はしないのですが、
他機種からの移植などの場合はソートが必要になる場合があります。
このような場合は、FMTDTAというコマンドでソート処理を行います。
ソートのマニュアルはめったにおめにかかれない上に、わかりにくいので
ここでは例題を中心に紹介します。



AS/400のソートコマンドは、

FMTDTA

というコマンドです。
このコマンドは、主として他機種からのシステムの移植などの場合に利用します。


出力は、次の3種類が選択できます。


通常の整列されたファイル
整列と合計計算をしたファイル
相対レコード番号(RRN)で並び順だけのファイル


コマンドの一般形

FMTDTAコマンドの一般形は次のとおりです。[  ]は省略可能を意味します。

   FMTDTA     INFILE((入力ファイル1)  [(入力ファイル2)]  [・・・]) +  
                OUTFILE(出力ファイル) +
                [SRCFILE(ソースファイル)] +
                SRCMBR(制御パラメータのメンバー)


入力ファイル
  入力ファイルはソート処理対象の入力ファイルです。複数指定できます。
  ライブラリー修飾する場合は、ライブラリー名/ファイル名のようにします。

出力ファイル
  出力ファイルはソートの結果を受け取るファイルです。
  ライブラリー修飾は入力ファイルの場合と同様です。

ソース・ファイル
  ソース・ファイルは、制御パラメータのメンバーが入っているファイルです。
  省略すると、ファイル名としてQFMTSRCが想定されます。

制御パラメータのメンバー
  制御パラメータのメンバーは、ソートの仕様を記述したソースのメンバーです。

例−1:FILE1をソートしてFILE2に出力。
      FMTDTA    INFILE((FILE1))  OUTFILE(FILE2)  +
                SRCFILE(*LIBL/QWRKSRC)  +
                SRCMBR(FMT1)

この例では、制御パラメータのメンバーFMT1がQFMTSRCでなく、QWRKSRCに入っています。
例−2:複数ファイルを入力としてソート
      FMTDTA  INFILE((LIB01/FILE1A)  (LIB02/FILE1B)  (LIB03/FILE1C))  +
              OUTFILE(FILE2) +
              SRCMBR(MBR1)  

複数ファイルを入力とする場合はINFILEパラメータに複数指定します。入力は最大8個までです。



制御パラメータ

制御パラメータはソースファイルQFMTSRCにパラメータ・ソースとして記述します。
制御パラメータは、固定カラムの様式です。大別して
見出し仕様
レコードレベルの仕様
フィールドレベルの仕様
からなります。

見出し仕様
見出し仕様では、出力ファイルのタイプ、ソートキーの最大長さなどを記述します。
6桁目の仕様書コードを'H'とします。6桁目を*にすると注釈となります。
見出し仕様の記述要領は次のとおりです。
6桁  仕様書コードを'H'とします。
7〜12桁  出力ファイルのタイプ。次の3種類が指定できます。
SORTR  通常のソート結果
SORTRS 通常のソートとサマリー
SORTA 出力ファイルは相対レコード番号(RRN)が4バイトの2進数で
セットされます。
15〜17桁  ソートキーのフィールドの最大長
ブランク 制御フィールドなしを意味します。
1-256 最大制御フィールド(ソートキー)のバイト数
18 昇順/降順の別
ブランク
A
制御フィールドによる昇順を意味します。
D 降順を意味します。
28 ソートキーのフィールドを出力への組込むか否かの指定
ブランク ソートキーのフィールドは出力レコードに組込まれる。
X 組込まれない。

例−1:ソートパラメータの例
*...+... 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6
    HSORTR     9A        X    
    FNC  05  10                     ←ソート第1キー
    FNC  02  04                     ←ソート第2キー
    FDC                             ←全フィールド指定

  この例では、第1キー5〜10、第2キー2〜4でソート。
全フィールドが出力されます。

入力ファイルは次のようになっているものとします。
*...+....1....+....2....+....3....+....4
 222CCCCCC0000000100000000000     
 222BBBBBB0000001000000000000
 111BBBBBB0000001000000000000           111AAAAAA0000010000000000000      111CCCCCC0000200000000000000        D444DDDDDD00044444000DDDDDDDD      

上記パラメータでソートをかけると出力は次のようになります。
 *...+....1....+....2....+....3....+....4
 111AAAAAA0000010000000000000  
 111BBBBBB0000001000000000000 
 222BBBBBB0000001000000000000  111CCCCCC0000200000000000000  222CCCCCC0000000100000000000  D444DDDDDD00044444000DDDDDDDD 

見出し仕様書で28桁目にをつけないと、ソートキーが出力され、
かつデータエリアも出力されるので、次のようになります。

|...+....1....+....2....+....3....+....4
AAAAAA111 111AAAAAA0000010000000000000  
BBBBBB111 111BBBBBB0000001000000000000  
BBBBBB222 222BBBBBB0000001000000000000  
CCCCCC111 111CCCCCC0000200000000000000
CCCCCC222 222CCCCCC0000000100000000000  
DDDDDD444D444DDDDDD00044444000DDDDDDDD

例−3:相対レコード番号のみの出力

|...+... 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 
     HSORTA    9A        X
     FNC  05  10                     ←ソート第1キー 
     FNC  02  04                     ←ソート第2キー 

入力
|...+... 1 ...+... 2 ...+... 3 ...+... 4 ... RRN 
 020AAAAAA000000001000000000000000000000    1
 010AAAAAA000000010000000000000000000000      2
 030BBBBBB000000200000000000000000000000     
 020BBBBBB000002000000000000000000000000      040CCCCCC000003000000000000000000000000      030CCCCCC000030000000000000000000000000     D444DDDDDD000400000000000000000000000000     

出力

出力タイプがSORTAの場合、RRNでその順番が表示されます。
論理レコード長さ4バイトの出力ファイルの場合、次のようになり
ます。(結果は16進数表示です)

00000002
00000001
00000004
00000003
00000006
00000005
00000007
FFFFFFFF


レコードレベルの仕様

レコードレベルの仕様では、入力レコードの選択(組込み、除外)を記述します。
仕様書コードは、I(組込み)とO(除外)です。


6桁目 仕様書コード
組込み(選択)
除外
7桁目 組込み/除外の条件の拡張
ブランク 新しい組込み/除外定義の開始
前の定義とANDの関係の定義
前の定義とORの関係
8桁目 演算項目1、項目2のデータタイプ
文字として解釈
ゾーン部分を比較に使用
デジット部分
項目1はパック10進数。項目2が定義されているときは同じ。
項目1はゾーン10進数。項目2が定義されているときは同じ
9〜12桁 項目1の開始位置
1〜9999 演算項目1のフィールドの開始位置
13〜16桁 項目1の終了位置
1〜9999 同フィールドの終了位置
17〜18桁 組込み/除外の比較条件
EQ 比較条件。項目1=項目2
NE 項目1≠項目2
LT 項目1<項目2
GT 項目1>項目2
LE 項目1≦項目2
GE 項目1≧項目2
19桁 項目2の約束
演算項目2は固定情報。20〜39桁の固定情報の項目も参照。
項目2は入力フィールドの中のフィールド
キーワード
固定情報であるが、比較の前に1文字シフトする。
20〜23桁 演算項目2のフィールドの開始位置
1〜9999 演算項目2のフィールドの開始位置
24〜27桁 演算項目2のフィールドの終了位置
1〜9999 演算項目2のフィールドの終了位置
20〜39桁 固定情報(定数)
任意 固定情報を記述する場合。 比較対象のフィールドがゾーン10進数の場合は
その桁数に同じだけの桁数が必要
40〜 注記


例−1:組込みの例


*...+... 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6
     HSORTR     9A         X                         
     I C  01  01NECD                                 
     FNC  05  10                                     
     FNC  02  04                                     
     FDC                                             55
この例では、第一カラムが'D'でないものを組込みしています。

例−2:除外の例
*...+... 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6
     HSORTR     9A         X                         
     O C  01  01GECD                                 
        以下略
この例では第一カラムが'D'またはそれ以上のレコードを除外します。

例−3:AND条件による除外の例

     *.. 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 
     HSORTR     9A         X                                 
     I C  01  01NECD                      第1バイトが'D'でないものを選択  
     IAC  11  20GTC0000000000             11から20バイトが0でないものを選択
     FNC  05  10                      
     FNC  02  04                      
     FDC                              
この例では、1バイト目が'D'でなく、11〜20バイトがゾーン10進数で0以上のものを選択している。
比較対象のフィールドが10桁(11〜20バイト)なので、固定情報も10桁となっていることに注意。9桁にするとエラーになる。


フィールドレベル

フィールドレベルの仕様では次の定義を行います。仕様書コードは'F'です。
 ソートフィールドの定義
 サマリーフィールドの定義
 出力フィールドの定義


6桁目 仕様書コード
フィールドレベルの仕様書コード
7桁目 フィールドの種類のコード。
フィールドの記述(9〜12、13〜16)の記述がデータ・フィールドで
あることを示します。出力ファイルにレイアウトされます。
フィールドの記述が正順の制御フィールドであることを示します。
フィールドの記述が逆順の制御フィールド
フィールドの記述が置換えの制御フィールド
フィールドの記述がサマリー対象のフィールド
8桁目 フィールドのデータタイプを表わすコード
フィールドはパック10進数(として解釈されます)
U フィールドはゾーン形式符号付き10進数データ
C フィールドは文字データ
Z フィールドのゾーン部分のみ分類に使用される
D フィールドの各文字のディジット部分だけが分類に使用される
V データ・フィールドに単一のデータ文字を挿入
E 清音カタカナ制御フィールド (注)
I 読み、部首、字画数、同音字の別読み順序を使用する日本語漢字制御フィールド(注)
J 読み、字画数、部首、同音字の別読み順序を使用する日本語漢字制御フィールド(注)
R 部首、字画数、同音字の別読み順序を使用する日本語漢字制御フィールド(注)
S 字画数、部首、同音字の別読み順序を使用する日本語漢字制御フィールド (注)
T 文字タイプ順序を使用する日本語漢字制御フィールド (注)
9-12桁目 フィールドの開始位置
1-9999 フィールドの始め位置。
13-16桁目 フィールドの終り位置。
1-9999 9-16桁目がブランクの場合は、フィールドは入力レコード全体になる。
17桁目 条件付置換え文字。
@(7桁目がFの場合)変更される置き換え文字。任意の文字を使用できます。
A(SORTRSの場合)サマリー・オーバーフロー標識。
任意の文字 オーバーフロー標識として使用される文字。
何も記入しない場合は'*'をオーバーフロー標識とする。
18桁目 @(7桁目がFの場合)17桁目で指定した制御フィールド文字に置き換わる文字、
または17桁目に記入がない場合は制御フィールド文字を完全に置き換えるのに使用される文字。
A非オーバーフロー標識 任意の文字 オーバーフローが起こらないときオーバーフロー標識フィールドに入る文字。
何も記入しない場合は出力レコードに文字は入らない。
任意の文字
19桁目
ブランク 新規フィールド定義
任意の文字 前のフィールド仕様の継続
20-22 1-256
(サマリー分類専用の場合)
新規オーバーフロー・フィールドの長さ。出力レコードの最大長を超えてはならない。
20 (見出し仕様の26桁目にFが入っている場合)代替照合順序に
よって変更される正順または逆順の制御フィールドにAを記入。
フィールド単位の代替照合順序
40-72 注記
任意 注記として使用します。

(注)

注:I,J,R,S,Tの場合は活動分類テーブルに現行の分類情報が必要です。ない場合は
次のようなエラーメッセージが表示されます。
活動分類テーブルに現行の分類情報が入っていない。


例−1:通常のソート
     *.. 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6         
     HSORTR     9A         X                                         
     FNC   5  10                        昇順                         
     FOC   2   4                        降順                         
     FDC                                全フィールドが出力されます。

入力ファイル
*...+....1....+....2....+....3....+....4 
 030CCCCCC000030000000000000000000000000 
 040CCCCCC000003000000000000000000000000 
 010AAAAAA000000010000000000000000000000 
 020AAAAAA000000001000000000000000000000 
 020BBBBBB000002000000000000000000000000 
 030BBBBBB000000200000000000000000000000 
D444DDDDDD000400000000000000000000000000
出力は次のようになります。

出力ファイル

*...+....1....+....2....+....3....+....4   
 020AAAAAA000000001000000000000000000000   
 010AAAAAA000000010000000000000000000000   
 030BBBBBB000000200000000000000000000000   
 020BBBBBB000002000000000000000000000000   
 040CCCCCC000003000000000000000000000000   
 030CCCCCC000030000000000000000000000000   
D444DDDDDD000400000000000000000000000000   

例−2:出力レコードのレイアウト入替えの例

     *.. 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 
     HSORTR     9A         X            制御フィールドを出力しない。
     FNC   5  10                        昇順                 
     FOC   2   4                        降順                 
     FDC   5  10                         B                    
     FDC   2   4                         A                    
     FDC   1   1                         @                    
     FDC  21  40                         C                    

@のフィールド Aのフィールド Bのフィールド Cのフィールド

上記B、A、@,Cのフィールドが次のように配置替えされます。
Bのフィールド Aのフィールド @のフィールド Cのフィールド

例−3:サマリーの例
*...+... 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6
     HSORTRS   06A         X             制御フィールドを出力しない。
     FNC  05  10                         
     FSU  11  20                         サマリーフィールド

入力レコードレイアウトは次の通りとします。
1〜 4 5〜 10 11〜 20 21〜              40
キーフィールド サマリーフィールド そのたのデータ          
制御フィールド(ソートのキーフィールド)は5〜10桁、サマリーフィールドは11〜20桁とします。
出力ファイルのレコード長さが同じ40バイトとすると出力レイアウトは次のようになります。

1〜 10 11 〜                            40
サマリーフィールド ダミー                    
見出し仕様書の28桁目がXなので制御フィールドは出力されません。



例−4:サマリーの例
*...+... 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6
     HSORTRS   06A                       制御フィールドを出力する。
     FNC  05  10                         制御フィールド
     FSU  11  20                         サマリーフィールド

例−3の見出し仕様書のXをブランクとすると、制御フィールドを出力するので、
出力のレイアウトは次のようになります。(出力レコード長さは40バイトとする)
1 〜     6 7〜      16 17〜  40
制御フィールド サマリーフィールド ダミー


例−5:出力レイアウトを入力と同じにする。
*...+... 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6
     HSORTRS   06A         X             
     FNC  05  10                         
     FDC  01  10                         (1)入力フィールド1-10
     FSU  11  20                         (2)サマリーフィールド
     FDC  21  40                         (3)入力フィールド21-40
(1)(2)(3)によって出力レイアウトを決めることができます。
出力は次のようになります。
01〜              10 11 〜     20 21 〜            40
入力フィールド+キーフィールド サマリーフィールド そのたのフィールド




 戻る 


(C)COPYRIGHT ISHIOKA KATSUHIDE 2000,2011