本章では mfsort ユーティリティの使用方法を説明します。
COBOL プログラムで SORT 文を実行する場合、デフォルトでは、ランタイム COBOL ソートモジュールを使用します。さらに、この COBOL システムには、ファイルのソートとマージを行うユーティリティもあります。
ソート方法 | 説明 |
---|---|
ランタイム COBOL ソートモジュール | COBOLプログラム内の SORT文を処理する デフォルトのモジュール。 CALL文で直接呼び出すこともできます。詳細は、 ソート モジュール の項を参照してください。 |
mfsort ユーティリティ | コマンド行から起動し、データファイルのソートとマージを可能にします。 |
Mfsort ユーティリティは、コマンド行から起動し、データファイルのソートとマージを可能にします。 IBMメインフレームの DFSORT リリース 14 をほぼ完全にエミュレート しており、以下のサポートを含んでいます:
DFSORT の詳細については IBM の DFSORT Web site を参照してください。
Mfsort は、次のどちらかの方法で、コマンド行から起動されます。
mfsort instructions
mfsort take filename
各パラメータの内容は次のとおりです。
instructions |
後述の『Mfsort 命令』の項を参照してください。 コマンド行で命令を指定する場合は、必ず次を実行してください。
|
filename | Mfsort 命令を含むテキストファイル。後述の『Mfsort 命令』の項を参照してください。この方法は、多数の命令を指定する必要がある場合に使用してください。 |
ソート操作中やマージ操作中に、Mfsort は一時作業ファイルを使用します。この作業ファイルは現行ディレクトリのディスクにページングされるます。または、 TMP 環境変数で指定されたディレクトリがある場合はそのディレクトリにページングされます。
Mfsort は、各入力ファイルからすべてのレコードを一時作業ファイルにコピーするときに、適宜、レコードの切り捨てや埋め込みを行います。次に、キー記述にしたがって、作業ファイルでソートやマージを行います。作業ファイルでのソートやマージが済むと、レコードは各出力ファイルにコピーされ、適宜、切り捨てられるか、埋め込まれます。
mfsort コマンドの一般的な形式を次に示します。
mfsort [*] [CHAR-EBCDIC] [SIGN-EBCDIC] [SORT-EBCDIC] {SORT|MERGE} fields(instructions,...) [record definition] {USE input-file}... {GIVE output-file}...
命令 | 説明 |
* | 行の残りの部分はコメントとして処理されます。この命令は、ファイルに各命令の目的を説明するコメントを追加できるため、テキスト ファイルで命令を指定する場合に便利です。 |
CHAR-EBCDIC | EBCDIC データを指定します。CHAR-EBCDIC は SORT 命令、MERGE 命令、USE 命令、GIVE 命令のすべてより先に指定する必要があります。 |
SIGN-EBCDIC | 数字の DISPLAY 項目を指定し、符合は EBCDIC 規則にしたがって解釈されます。CHAR-EBCDIC が指定されている場合には SIGN-EBCDIC は不要ですが、データを作成したプログラムが SIGN"EBCDIC" コンパイラ指令でコンパイルされている場合のように、ASCII 以外のデータには SIGN-EBCDIC を設定する必要があります。 SIGN-EBCDIC は、すべての SORT 命令、MERGE 命令、USE 命令、GIVE命令より先に指定する必要があります。 |
SORT-EBCDIC | レコード順編成ファイル中のASCIIデータを EBCDIC照合順序でソートします。 |
SORT | ソート操作を指定します。SORT 命令の次には、ソート操作に使用するフィールドを指定する FIELDS 命令を続ける必要があります。オプションで、ソート作業ファイルのレコードサイズと形式を指定する RECORD 命令を設定する場合は、SORT 命令の次に続けます。SORT 命令と MERGE 命令は相互に排他的に機能します。 |
MERGE | マージ操作を指定します。この命令の次には、マージ操作に使用するフィールドを指定する FIELDS 命令を続けます。オプションで、ソート作業ファイルのレコードサイズと形式を指定する RECORD 命令を設定する場合は、MERGE 命令の次に続けます。MERGE 命令と SORT 命令は相互排他的に機能します。 |
fields (instructions) |
ファイルのソートやマージを行うフィールド。後述の『FIELDS 命令』の項を参照してください。 |
record definition | レコードサイズと形式。RECORD 命令は、作業ファイル、入力ファイル、出力ファイルの詳細を指定するために使用します。後述の『RECORD 命令』の項を参照してください。 |
USE input-file | 各 USE 命令では、入力ファイルを指定します。USE 命令は必ず GIVE 命令の前に指定する必要があります。後述の『Mfsort の入力ファイルと出力ファイル』の項を参照してください。 |
GIVE output-file | 各 GIVE 命令では、出力ファイルを指定します。後述の『Mfsort の入力ファイルと出力ファイル』の項を参照してください。 |
INCLUDE/OMIT | ソートプロセスからレコードをインクルードまたは省略する条件を指定します。 詳細については、IBM マニュアルの『Using DFSORT Program Control Statements』を参照してください。 INCLUDE 命令と OMIT 命令は相互排他的に機能します。 |
INREC | SORT/MERGE プロセスを行う前にレコードを再フォーマットします。 |
OUTREC | SORT/MERGE プロセスを行った後にレコードを再フォーマットします。 |
MODS | SORT/MERGE プロセスにレコードがリリースされるか SORT/MERGE プロセスからレコードが返されるたびに実行される外部プロシージャ (ユーザ出口) を指定します。 この実装は、E15 と E35 のユーザ出口をサポートします。 |
SUM | 同じキー値を持つレコードを単一レコードとして返すことを指定します。 オプションで、1 つのフィールドを指定して同じキーを持つすべてのレコードの合計値を累積できます。 |
OUTFIL | この命令は、1 つ以上の出力ファイルに対する複雑な編集およびレポート処理を指定する場合に使用します。 各出力ファイルは、GIVE コマンドを使用して指定する必要があります。 出力ファイルを指定しない場合には、OUTFIL は IBM マニュアルの『Using DFSORT Program Control Statements』で説明されているように動作します。 |
OPTION | この命令は、さまざまなオプションを指定する場合に使用します。 これらのオプションの 1 つに COPY があります。このオプションでは、レコードはソートされず、出力ファイルにコピーされます。 |
SORT 命令や MERGE 命令の次には、入力ファイルのソートやマージを行うフィールドを指定する FIELDS 命令を続ける必要があります。
FIELDS 命令の形式を次に示します。
fields({start,length,type,order},...)
start | レコード中のフィールドの開始位置。バイト 1 からカウントします。 |
length | フィールドの長さ (バイト数)。 |
type | フィールドのデータ型。後述の『フィールドの型』の項を参照してください。 |
order | 出力の順番で、次のどちらかになります。 A - 昇順 D - 降順 |
パラメータセット (start、length、type、order) を繰り返すことにより、最大 16 フィールドを指定することができます。パラメータとパラメータセットはコンマで区切る必要があります。
フィールドの型は、次のどれかになります。
型 | 定義 |
AQ | 代替文字の大小順序を持つ文字。 |
BI | COMP |
C5 | COMP-5 |
C6 | COMP-6 |
CH | PIC X DISPLAY |
CX | COMP-X |
FL | 浮動小数点数、符号付き。 |
FS/CSF | 符号付き数字。オプションで先頭に浮動符号を使用できます。 |
LI/OL/CLO | PIC S9 LEADING INCLUDED |
LS/CSL | PIC S9 LEADING SEPARATE |
NU | PIC 9 DISPLAY |
PD | PIC S9 COMP-3 |
PD0 | パック 10 進数。最初の半バイトと符号半バイトは無視されます。 |
SB/FI | PIC S9 COMP |
S5 | S9 COMP-5 |
SS | サブ文字列。 条件でのみ使用されます。 |
TS/CST | PIC S9 TRAILING SEPARATE |
TI/ZD/OT/CTO | PIC S9 TRAILING INCLUDED |
Y2B | 2 桁。1 バイトバイナリの年データ。 |
Y2C/Y2Z | 2 桁。2 バイトの年データ。オプションで、後ろに符号を含めることができます。 PIC 99 または PIC S99。 |
Y2D | 2 桁。2 バイトパック 10 進数の年データ。 PIC 99 COMP-6。 |
Y2P | 2 桁。2 バイトパック 10 進数の年データ。 PIC 99 COMP-3。 |
Y2S | 2 桁。2 バイト文字の年データ。特殊なインジケータを含みます。 バイナリのゼロ、空白およびバイナリ文字は、特殊なケースとして扱われます。 |
Y2T | 完全な日付形式 yyx...。 |
Y2U | 完全な日付形式 yyx...、COMP-3。 |
Y2V | 完全な日付形式 yyx...、COMP-3。最初の半バイトは無視されます。 |
Y2W | 完全な日付形式 x...yy。 |
Y2X | 完全な日付形式 x...yy、COMP-3。 |
Y2Y | 完全な日付形式 x...yy、COMP-3。最初の半バイトは無視されます。 |
例えば、golf.dat という相対ファイルを COBOL プログラムで次のように定義することができます。
file-control. select members-file assign to "/mydir/golf.dat" organization is relative access mode is random relative key is relative-key. data division. file section. fd members-file record contains 28 characters. 01 members-record. 03 members-number pic 9(6). 03 members-lname pic x(10). 03 members-fname pic x(10). 03 members-handicap pic 9(2).
次の mfsort コマンドを使用すると、メンバーシップ番号を含むフィールドでファイル golf.dat をソートすることができます。
mfsort sort fields"(1,6,nu,a)" use golf.dat record f,28 org rl give members.dat
ソートしたファイルは、ファイル、 members.dat に書き込まれます。
入力ファイルを定義するには、次の命令を使用します。
USE input-file [record definition] [org organization] [key structure]
また、出力ファイルを定義するには、次の命令を使用します。
GIVE output-file [record definition] [org organization] [key structure]
これらの命令は、関連付けた USE 命令や GIVE 命令のすぐ後に配置する必要があります。上記の命令を一部でも省略すると、前回に指定した値が使用されます。そのため、入力ファイルと出力ファイルをすべて同じ型と形式にする場合は、最初にファイルの値を指定すると後で指定し直す必要がありません。
RECORD 命令は、必要に応じて使用します。RECORD 命令を使用して、ソート作業ファイルで、レコードの形式と長さを指定します。また、関連付けられた USE 命令または GIVE 命令にしたがう場合は、入力ファイルと出力ファイルでもレコードの形式と長さを指定します。
RECORD 命令の形式は次のとおりです。
record format,rec-len,max-len
format |
レコード形式で、次のどちらかになります。 F - 長さが rec-len の固定長レコード V - 最小長が rec-len で、最大長が max-len の可変長レコード |
ソート作業ファイルに対して RECORD 命令を指定しない場合は、ソート作業ファイルがデフォルトの固定長レコード形式になり、レコード サイズは USE 命令や GIVE 命令で指定された最大レコード長になります。
ORG 命令では、ファイル編成を指定します。ファイル編成は、次のどれかになります。
IX - 索引
RL - 相対
SQ - 順
LS - 行順
ORG のデフォルト値は SQ です。
KEY 命令では、ファイルのキー構造体を指定するため、索引ファイルには必ず指定する必要があります。他のファイル編成には関係ありません。
KEY 命令の形式を次に示します。
key ({start,length,ixkey},...)
start | レコード中のキーの開始位置。バイト 1 からカウントします。 |
length | キーのバイト数。 |
ixkey | 次のどれかになります。 P - 主キー (常に最初に定義します) A - 副キー AD - 重複指定した副キー C - 前回指定した主キーまたは副キーの構成要素 |
KEY 命令は、キー構造体全体を記述するために必要に応じて反復します。パラメータとパラメータセット (start, length, ixkey) はコンマで区切る必要があります。
キーは、重要な順に定義します。主キー、主キーが分割されている場合はすべての構成要素、最初の副キー、そのすべての構成要素という順序で定義する必要があります。
次の例では、3 つのキーを定義します。
key (4,5,p,10,5,c,20,2,ad,40,2,a,46,10,c)
最初のキーである主キーは、文字位置 4 から始まる長さ 5 バイトの最初の構成要素と文字位置 10 から始まる長さ 5 バイト 2 番目の構成要素に分割されます。
2 番目のキー (副キー) は重複可能で、文字位置 20 で始まり、長さが 2 バイトになります。
3 番目のキーは副キーで、文字位置 40 から始まる長さが 2 バイトの最初の構成要素と、文字位置 46 から始まる長さ 10 バイトの 2 番目の構成要素に分割されます。
MFJSORTは、メインフレームの場合と同様で、E15 Read Exit、および E35 Write Exit に対するユーザ Exit プログラムを呼び出します。Exit プログラムは COBOL で記述し、Micro Focus の 構文チェッカー(syntax checker)でコンパイルする必要があります。プログラムは通常の他の COBOL プログラムと同様に実行され、デバッグされます。Exit プログラムの記述とテストに関しては、メインフレームのドキュメントを参照してください。
MFJSORT は、E15 および E35 のExit プログラムの標準の連絡領域を提供します。メインフレームのユティリティと互換があり、次のように定義します。
COBOL 文 |
値 |
RECORD-FLAGS PIC 9(8) COMP. | 0 は、最初のレコードが渡されたことを示します。4 は、後続のレコードが渡されたことを示します。8 は、最後のレコードが渡されたことを示します。 |
ENTRY-BUFFER PIC X(n). | 入力レコードの内容。この領域は変更しないでください。 |
EXIT-BUFFER PIC X(n). | Exitによって提供される新規、あるいは変更されたレコードの内容。 |
UNUSED-ENTRY PIC 9(8) COMP. | 使用不可。 |
UNUSED-ENTRY PIC 9(8) COMP. | 使用不可。 |
ENTRY-RECORD-LENGTH PIC 9(8) COMP. | 入力レコードの長さ。 |
EXIT-RECORD-LENGTH PIC 9(8) COMP. | Exitによって提供される新規または変更されたレコードの長さ。 |
UNUSED-ENTRY PIC 9(8) COMP. | 使用不可。 |
EXIT-AREA-LENGTH PIC 9(4) COMP. | Exit領域のスクラッチパッドの長さ。このフィールドは変更しないでください。 |
EXIT-AREA PIC X(n). | Exitで使用するExit領域のスクラッチパッドで、Exitプログラムに対する呼び出しの間の変数を保持します。 |
MFJSORT は、Exitプログラムからのリターンコードをメインフレームのユティリティからのリターンコードと同じものと認識します。次のリターンコードが返されます。
リターンコード |
意味 |
0 | アクションは必要ありません。 |
4 | カレントレコードを削除します。E15では、レコードは格納されません。E35では、レコードは出力データセットには書き込まれません。 |
8 | このExitを再度呼び出さないでください。Exit処理はこれ以上必要ありません。 |
12 | カレントレコードを挿入します。E15では、レコードは挿入されソート対象となります。E35では、レコードは出力データセットに書き込まれます。 |
16 | MFJSORT を終了します。ジョブステップは、16 に設定された状態コード(condition code)で終了します。 |
20 | カレントレコードを変更します。E15では、変更されたレコードはソートに渡されます。E35では、変更されたレコードは出力データセットに書き込まれます。 |
ここでは、mfsort コマンドの例とジョブストリームをいくつか紹介します。
その他の例については、IBM マニュアルの『Examples of DFSORT Job Streams』を参照してください。
国内の東西南北の 4 地域について、国内大会で国内組織のメンバーが達成したスコアを記録した索引ファイル (north.dat、south.dat、east.dat および west.dat) がそれぞれ 1 つずつ、計 4 つあると仮定します。 このうち north.dat を定義するには、次のような COBOL 構文を使用します。
file-control. select idxfile assign to "north.dat" organization is indexed record key is member-id. data division. file section. fd idxfile record contains 39 characters. 01 idxfile-record. 03 member-id pic 9(6). 03 surname pic x(15). 03 first-name pic x(15). 03 score pic 9(3).
さらに、他のファイルも同様の方法で作成し、大会の結果をファイルに入力したと仮定します。 以降の例では、これらのファイルを使用します。
次の mfsort コマンドでは、4 つのファイルそれぞれからすべてのレコードを取り出し、メンバーの姓で昇順にソートしてから、相対ファイル members.dat に結果を出力します。
mfsort sort fields(7,15,ch,a) use north.dat use south.dat use east.dat use west.dat give members.dat org rl
次の mfsort コマンドでは、4 つのファイルを取り出し、メンバーのスコア順 (スコアの高い順に並べる) でソートしてから、その結果を相対ファイル scores.dat に出力します。
mfsort sort fields(37,3,nu,d) use north.dat use south.dat use east.dat use west.dat give scores.dat org rl
次の mfsort コマンドでは、4 つのファイルを取り出し、会員番号順 (主キー) でソートしてから、その結果を索引ファイル national.dat に出力します。 スコアフィールドが 20 未満のレコードはすべて省略されます。
mfsort sort fields(1,6,nu,a) use north.dat use south.dat use east.dat use west.dat give national.dat omit cond (37,3,nu,lt,20)
次の mfsort コマンドでは、行順ファイル sortin.dat を取り出し、そのレコードを長さが 4 バイトの位置 11 から始まる文字フィールドでソートします。 結果はファイル sortout.dat に出力され、長さが 3 バイトで位置 15 から開始するサブ文字列が、文字列 'J69,L92,J82'
の連続する 3 文字と同じレコードのみが含まれます。
mfsort sort fields=(11,4,ch,a) use sortin.dat org ls record (f 80) give sortout.dat include cond=(15,3,ss,eq,c'J69,L92,J82')
次の mfsort コマンドでは、形式が cyymmdd のフィールドを含むレコードを、形式が yyymmdd のフィールドを含むレコードに変換します。
Sort C'cyymmdd' SORT FIELDS=(1,7,BI,A) * sort C'cyymmdd' use mfs110a.in org ls record (f 40) * C'cyymmdd' を C'yyyymmdd' に変換 OUTFIL OUTREC=(1,1,CHANGE=(2, * C'c' を次のように変換 C'0',C'19', * C'0' から C'19' へ C'1',C'20', * C'1' から C'20' へ C'2',C'21'), * C'2' から C'21' へ NOMATCH=(C'99') 2,6) * C'yymmdd' をコピー give sortout.dat
次に示す例では、OUTFIL コマンドを使用して複雑なレポートを作成します。この例では、4 つの部門の 1 つに関する損益計算書レポートを作成します。 入力ファイル mfs121a.dat は最初の 2 つのフィールドでソートされ、西地域からのレコードのみが出力されます。 この SECTIONS 命令では、位置が 3 から始まる長さが 10 バイトのフィールドが変更されるとページが作成されます。 次の例を示します。
Chips San Martin 0088902203 West Chips Oakland 0023412432 West Chips San Jose 0123213335 West Ice Cream Marin 0054234123 West Chips Gilroy 0055484342 West Ice Cream Napa 0085734283 West Pretzels San Jose 0123488534 West Ice Cream San Francisco 0092231245 West Chips San Francisco 000324343q West Chips San Jose 0123213335 South Ice Cream San Martin 0100346730 West Pretzels Marin 0534332344 West Chips Gilroy 0055484342 South Chips Morgan Hill 0098732232 West Pretzels Morgan Hill 0084384340 West Ice Cream San Jose 000002345u West Pretzels Napa 0531234856 West Chips Oakland 0023412432 South Pretzels San Martin 000023438r West Chips Los Angeles 000223401t West Ice Cream Marin 0054234123 South Pretzels San Francisco 0541230005 West Ice Cream Napa 0085734283 South Pretzels San Jose 0123488534 South Ice Cream San Francisco 0092231245 South Chips San Francisco 000324343q South Ice Cream San Martin 0100346730 South Pretzels Marin 0534332344 South Chips Morgan Hill 0098732232 South Pretzels Morgan Hill 0084384340 South Ice Cream San Jose 000002345u South Pretzels Napa 0531234856 South Pretzels San Martin 000023438r South Chips Los Angeles 0002234014 South Pretzels San Francisco 0541230005 South
SORT FIELDS=(3,10,A,16,13,A),FORMAT=CH use mfs121a.dat org ls record (f 80) OUTFIL INCLUDE=(42,6,CH,EQ,C'West'), HEADER1=(5/,18:' Western Region',3/, 18:'Profit and Loss Report',3/, 18:' for ',&DATE,3/, 18:' Page',&PAGE), OUTREC=(6:16,13,24:31,10,ZD,M5,LENGTH=20,75:X), SECTIONS=(3,10,SKIP=P, HEADER3=(2:'Division: ',3,10,5X,'Page:',&PAGE,2/, 6:'Branch Office',24:' Profit/(Loss)',/, 6:'-------------',24:'--------------------'), TRAILER3=(6:'=============',24:'====================',/, 6:'Total',24:TOTAL=(31,10,ZD,M5,LENGTH=20),/, 6:'Lowest',24:MIN=(31,10,ZD,M5,LENGTH=20),/, 6:'Highest',24:MAX=(31,10,ZD,M5,LENGTH=20),/, 6:'Average',24:AVG=(31,10,ZD,M5,LENGTH=20),/, 3/,2:'Average for all Branch Offices so far:', X,SUBAVG=(31,10,ZD,M5))), TRAILER1=(8:'Page ',&PAGE,5X,'Date: ',&DATE,5/, 8:'Total Number of Branch Offices Reporting: ', COUNT,2/, 8:'Summary of Profit/(Loss) for all', ' Western Division Branch Offices',2/, 12:'Total:', 22:TOTAL=(31,10,ZD,M5,LENGTH=20),/, 12:'Lowest:', 22:MIN=(31,10,ZD,M5,LENGTH=20),/, 12:'Highest:', 22:MAX=(31,10,ZD,M5,LENGTH=20),/, 12:'Average:', 22:AVG=(31,10,ZD,M5,LENGTH=20)) give outfil1.dat
Western Region Profit and Loss Report for 11/05/95 Page 1 ************************************************************ Division: Chips Page: 2 Branch Office Profit/(Loss) ------------- -------------------- Gilroy 554,843.42 Los Angeles (22,340.14) Morgan Hill 987,322.32 Oakland 234,124.32 San Francisco (32,434.31) San Jose 1,232,133.35 San Martin 889,022.03 ============= ==================== Total 3,842,670.99 Lowest (32,434.31) Highest 1,232,133.35 Average 548,952.99 Average for all Branch Offices so far: 548,952.99 ************************************************************ Division: Ice Cream Page: 3 Branch Office Profit/(Loss) ------------- -------------------- Marin 542,341.23 Napa 857,342.83 San Francisco 922,312.45 San Jose (234.55) San Martin 1,003,467.30 ============= ==================== Total 3,325,229.26 Lowest (234.55) Highest 1,003,467.30 Average 665,045.85 Average for all Branch Offices so far: 597,325.02 ************************************************************ Division: Pretzels Page: 4 Branch Office Profit/(Loss) ------------- -------------------- Marin 5,343,323.44 Morgan Hill 843,843.40 Napa 5,312,348.56 San Francisco 5,412,300.05 San Jose 1,234,885.34 San Martin (2,343.82) ============= ==================== Total 18,144,356.97 Lowest (2,343.82) Highest 5,412,300.05 Average 3,024,059.49 Average for all Branch Offices so far: 1,406,236.51 ************************************************************ Page 5 Date: 11/05/95 Total Number of Branch Offices Reporting: 18 Summary of Profit/(Loss) for all Western Division Branch Offices Total: 25,312,257.22 Lowest: (32,434.31) Highest: 5,412,300.05 Average: 1,406,236.51
mfsort エラーメッセージの完全な一覧は、 Mfsort エラーメッセージ のトピックを参照してください。
Copyright © 2006 Micro Focus (IP) Ltd. All rights reserved.