オス!IT格闘じいじだ。
メインフレームの現場で、大量のデータの中から「重複しているレコードを綺麗に削除したい」「特定のキーごとに売上や件数を合算したい」って場面、よくあるよな。
そんなとき、わざわざCOBOLやPL/Iで集計プログラムを1本起動してねえだろうな?
その処理、すべてソートユーティリティの「SUMカード」だけで瞬殺できるぜ!
今回は、現場で最も多用される重複削除の鉄板コマンドSUM FIELDS=NONEの正しい使い方はもちろん、メインフレーム特有のデータ形式であるパック10進数(PD)やゾーン10進数(ZD)を集計する際のリアルなアベンド(強制終了)対策までJCLサンプル付きで徹底解説する。
「ソートカードのSUMって、結局どう書くのが正解?」という若手から、日々のデータクレンジングを高速化したいベテランまで、この記事をコピペして現場の修羅場をスマートに切り抜けてくれ!
💡 じいじの警告: 「ソートの全体像や基本JCLの形をまだ見てないぜ」という奴は、まずは俺の親記事である【z/OS】プログラム不要!DFSORT/SYNCSORTでできる7大機能まとめ(JCLサンプル付き)を先に脳細胞に叩き込んできてくれよな!
■ 基本編:『SUM FIELDS=NONE』で重複レコードを瞬殺する

まずは基本中の基本、データクレンジングの最強ジャブである「重複レコードの削除」だ。
「キーが同じレコードが複数存在する場合、先頭の1件だけを残して、2件目以降の重複データをすべてゴミ箱に捨てる」という処理を、プログラムレスで実現する。
【コピペ用】重複削除のSYSIN(制御カード)サンプル
//SYSIN DD *
SORT FIELDS=(1,10,CH,A)
SUM FIELDS=NONE
/*
🥊 格闘じいじのテクニカル解説
この2行のコンボが意味するのは以下の通りだ。
SORT FIELDS=(1,10,CH,A)
まず、1バイト目から10バイト分の文字(CH)をソートキーとして、昇順(A)に並び替える。SUMを使う時は、必ず先にSORT(またはMERGE)のキーを指定するのが絶対ルールだ。
SUM FIELDS=NONE:
「ソートキー(1〜10バイト目)が完全に一致するレコードが連続して現れたら、先頭の1件だけをSORTOUTに吐き出し、残りはすべて破棄せよ」という指示になる。
■ 応用編:『SUM FIELDS=(位置,長さ,フォーマット)』で数値を合計する

重複を消すだけでなく、特定のキーごとに「金額」や「数量」を足し算(マージ集計)したいときに使うのが、SUMカードの真の戦闘スタイルだ。
【コピペ用】数値集計のSYSIN(制御カード)サンプル
//SYSIN DD *
SORT FIELDS=(1,5,CH,A)
SUM FIELDS=(6,8,FI)
/*
🥊 格闘じいじのテクニカル解説
SORT FIELDS=(1,5,CH,A):
1バイト目から5バイト分の文字(CH/例:商品コードや拠点コード)を基準に昇順ソート。
SUM FIELDS=(6,8,FI):
ソートキー(1〜5バイト目)が同じレコードを見つけたら、6バイト目から8バイト分にある固定小数点(FI/バイナリ形式の数値)のデータを足し算して1件にまとめろ、という強力なコンボだ。
集計された結果、先頭レコードの6〜13バイト目に合計値が上書きされ、足し算に使われた2件目以降のレコードは自動的に破棄されるぜ。
■ 現場の罠:パック10進数(PD)とゾーン10進数(ZD)の集計・アベンド対策

さあ、ここからが27年メインフレームのリングで修羅場をくぐってきた俺から、若手への一番重いアドバイスだ。
メインフレームのデータには、オープン環境で一般的な文字列(CH)やバイナリ(FI)だけでなく、「パック10進数(PD)」や「ゾーン10進数(ZD)」という特有の数値形式がゴロゴロ転がっている。
これを集計するときにガードを怠ると、一発でジョブがアベンド(強制終了)を起こしてシステムが止まるぜ!
🚨 なぜアベンドが起きるのか?(原因)
ソートユーティリティのSUMは、指定されたフォーマット(PDやZD)に基づいて、データの末尾にある「符号ビット(正か負かを示すデータ)」を厳格にチェックして足し算を行う。
もし、入力データの中にスペース(空欄)が混ざっていたり、初期化されていない不正なデータ(データ例外:S0C7など)が1件でも混ざっていると、ソートユーティリティは「数値じゃないものを足そうとした」と判断し、容赦なくジョブを叩き落とすんだ。
🛠️ 格闘じいじ直伝:アベンドを未然に防ぐ2大防衛策
現場でアベンドのカウンターを食らわないために、以下のガードを必ず固めておけ!
① 正しいフォーマット(PD/ZD)を正しく指定する
パック10進数なら PD、ゾーン10進数(外部10進数)なら ZD をSUMカードに確実に指定すること。
SUM FIELDS=(20,5,PD)
②事前にINCLUDE/OMITカードで「不正データ」を間引く
データの中にスペースやヌル値(初期化漏れ)が混入する可能性がある場合は、SUMに回す前に INCLUDE COND を使って「まともな数値データだけ」をフィルタリングするのが鉄則だ。
ゾーン10進数のスペース(X’40’)を事前に弾くコンボ例:
INCLUDE COND=(20,5,CH,NE,C' ')
SORT FIELDS=(1,5,CH,A)
SUM FIELDS=(20,5,ZD)
(20バイト目からの5バイトがスペース「ではない」レコードだけを抽出してからソート・集計へ回す!)
■ まとめ:ソートを制する者は、メインフレーム運用を制す

一社のお見送りや面接のミスマッチ(※前回の記事参照)で凹んでいる暇があったら、このソートカードを1行でも多く組んで、自分の「テクニカルな武器」を研ぎ澄まそうぜ。
正しく組んだJCLやソートカードは、100%裏切らない最強のカウンターパンチになってくれる。データ形式(PD/ZD)の特性をしっかり理解して、アベンドのリスクを未然に防ぐガードを固めること。これができて初めて「プロのメインフレーマー」だ。
次回は、データの並び順を自由自在に変えるレイアウトの達人技、「INREC / OUTRECの極意」をリアルな実例付きで深掘りしていくぜ!
次戦に向けて、スキルもシステムも自動化(最適化)していこうぜ。
Status: Batch Processing (次戦のJCL投入準備完了だ!)
関連記事:




コメント