ソ ー ト
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 仕様書コードを'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桁目にXをつけないと、ソートキーが出力され、
かつデータエリアも出力されるので、次のようになります。
|...+....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 3 020BBBBBB000002000000000000000000000000 4 040CCCCCC000003000000000000000000000000 5 030CCCCCC000030000000000000000000000000 6 D444DDDDDD000400000000000000000000000000 7
出力
出力タイプがSORTAの場合、RRNでその順番が表示されます。
論理レコード長さ4バイトの出力ファイルの場合、次のようになります。(結果は16進数表示です)
00000002
00000001
00000004
00000003
00000006
00000005
00000007
FFFFFFFF
レコードレベルの仕様
レコードレベルの仕様では、入力レコードの選択(組込み、除外)を記述します。
仕様書コードは、I(組込み)とO(除外)です。
6桁目 仕様書コード I 組込み(選択) O 除外 7桁目 組込み/除外の条件の拡張 ブランク 新しい組込み/除外定義の開始 A 前の定義とANDの関係の定義 O 前の定義とORの関係 8桁目 演算項目1、項目2のデータタイプ C 文字として解釈 Z ゾーン部分を比較に使用 D デジット部分 P 項目1はパック10進数。項目2が定義されているときは同じ。 U 項目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の約束 C 演算項目2は固定情報。20〜39桁の固定情報の項目も参照。 F 項目2は入力フィールドの中のフィールド K キーワード S 固定情報であるが、比較の前に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桁目 仕様書コード F フィールドレベルの仕様書コード 7桁目 フィールドの種類のコード。 D フィールドの記述(9〜12、13〜16)の記述がデータ・フィールドで
あることを示します。出力ファイルにレイアウトされます。N フィールドの記述が正順の制御フィールドであることを示します。 O フィールドの記述が逆順の制御フィールド F フィールドの記述が置換えの制御フィールド S フィールドの記述がサマリー対象のフィールド 8桁目 フィールドのデータタイプを表わすコード P フィールドはパック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を記入。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