【DFSORT/SYNCSORT】カラムのズレはこれで解消!INREC/OUTRECによるデータ加工とパディングの現場実例マスター

美しい朝焼けの都会を背景に、IT格闘じいじがスーツ姿で鋭いストレートパンチを放っている。彼の背後には無秩序なデータ構造のホログラムが浮かぶが、拳から放たれる黄金のエネルギー流がそれらを瞬時にクレンジングし、再フォーマットされた検証済みのパンチカードへとトランスフォームしている。上部には『■ INREC/OUTRECによるデータ加工とパディングの現場実例マスター』と英語サブタイトルのホログラムテキストが浮かぶ。現場を制する力。 【技術深掘り】メインフレーム遺産
現場の修羅場を制するのは、COBOLプログラムではなく、数行のソートカードだ。じいじ直伝の『INREC/OUTREC』で、どんな無秩序なデータレイアウトも一撃で支配してやるぜ!

オス!IT格闘じいじだ。

メインフレームの現場で、送られてきたデータのレイアウトを変更したり、特定の項目をひっくり返したり、空白やゼロで桁数を合わせる(パディング)なんて処理、日常茶飯事だよな。

そんなとき、わざわざCOBOLのMOVE文を並べただけのデータ変換プログラムを1本起動してねえだろうな?

その処理、すべてソートユーティリティの「INRECカード」と「OUTRECカード」だけで瞬殺できるぜ!

今回は、現場で最も多用されるBUILDを使った項目入れ替えやスペース埋め、ゼロパディング(前ゼロ詰め)の具体的な書き方はもちろん、若手が絶対に一度はやらかす「INRECを使ったことによるソートキーの位置ズレ・アベンド」の回避策までJCLサンプル付きで徹底解説する。

「INRECとOUTREC、結局どっちに何を書けばいいの?」と迷う若手から、プログラムレスで爆速データ加工を極めたいベテランまで、この記事をコピペして現場の修羅場をスマートに切り抜けてくれ!

💡 じいじの警告: 「ソート全体の流れや、基本JCLの形をまだ頭に入れてないぜ」という奴は、まずは俺の親記事である**【z/OS】プログラム不要!DFSORT/SYNCSORTでできる7大機能まとめ(JCLサンプル付き)**を先に脳細胞に叩き込んできてくれよな!

■ 基本編:『INREC / OUTREC』の違いと使い使い分けの鉄則

美しい朝焼けの都会を背景に、IT格闘じいじがスーツ姿で自信満々に黄金のデジタルフローチャートを展開している。このチャートは、データの事前加工(INREC)と事後加工(OUTREC)の違いを視覚化しており、INRECでは不要なデータフィールドが砕け散って軽量化され、ソートエンジンを通過した後にOUTRECで美しく整列され検証済みのデータとして出力されるデータパイプラインが描かれている。技術の最適化。
ソートをかける前に削る(INREC)か、ソートが終わった後に整える(OUTREC)か。このデータパイプラインの『処理位置』の根本的な違いを理解することこそが、夜間バッチを爆速化させるプロのディフェンスだぜ!

データを自在に変形させるこの2つのカード。名前は似ているが、「ソート処理(並び替え)のどのタイミングでデータを加工するか」が根本的に違う。

この違いを理解していないと、無駄なCPUコストを払ったり、思わぬバグを生む原因になる。まずはそれぞれの戦闘スタイル(ポジション)を具体的なサンプルで脳内にデプロイしてくれ。

🔄 処理の流れる順番とJCLの基本形

メインフレーム内部では、データは以下の順番でリング(処理)を通過する。まずはこの「位置関係」を SYSINのサンプルで掴んでくれ。

//SYSIN    DD *
  INREC  FIELDS=(1,80)  * 🥊 ① ソートをかける「前」に加工
  SORT   FIELDS=(1,5,CH,A)
  OUTREC FIELDS=(1,80)  * 🥊 ② ソートが終わった「後」に加工
/*
  1. SORTIN(入力ファイルの読み込み)
  2. 🥊 INREC:ソートエンジンにデータが渡るに、あらかじめデータを加工する。
  3. ⚙️ SORT / MERGE:並び替え処理を実行。
  4. 🥊 OUTREC:ソートがすべて終わった、ファイルに出くわす直前に最終加工する。
  5. SORTOUT(出力ファイルへの書き出し)

🥊 格闘じいじの使い分け鉄則(超具体例付き)

「どっちに書いても同じ結果になるなら、どっちでもいいじゃん」と思った奴、甘いぜ!ガードがガラ空きだ。現場では以下の具体的シチュエーションで明確に使い分ける。

①『INREC』を使うべき場面:ソートの処理効率(スピード)を爆上げしたいとき

例えば、元のデータ(SORTIN)が「1レコード:1,000バイト」もある巨大なファイルだったとする。だけど、実際にソートで使いたいキーは「先頭の5バイト(社員番号)」だけで、最終的に出力したいデータも「先頭から50バイト分だけ」だったとするよな。

このとき、INRECを使わずに1,000バイトのままソートに放り込むと、ソートエンジンは無駄な950バイト分も一緒に抱えて並び替えのステップを踏むことになる。これじゃあワークファイル(SORTWK)の容量も食うし、処理も重くなる。

そこで、ソートをかける前にINRECで必要な50バイトだけをギュッと引っこ抜くんだ!

* 【INRECの具体例】
* 入力1,000バイトのファイルから、必要な50バイトだけをソート前に引っこ抜く
//SYSIN    DD *
  INREC FIELDS=(1,50)
  SORT  FIELDS=(1,5,CH,A)
/*

効果: ソートエンジンに渡る時点でデータが50バイトに縮小されているため、処理速度が爆速になり、システム全体のCPUコストを大幅に削減できる。 これがプロの防衛策だ。

②『OUTREC』を使うべき場面:最後の出力用にレイアウトを綺麗に整えたいとき

逆に、ソートや重複削除(SUM)の処理自体は「元のデータレイアウトのまま」安全に行い、最後の最後、ファイル(SORTOUT)に書き出す直前で、他システムへ送るために形をトランスフォームさせたい場合は、OUTRECの出番だ。

* 【OUTRECの具体例】
* 元のレイアウト(80バイト)でソートし、出力の直前で項目をひっくり返す
//SYSIN    DD *
  SORT   FIELDS=(1,5,CH,A)
  OUTREC FIELDS=(6,10,1,5,11,70)  * 6〜15バイト目を先頭に、1〜5バイト目を後ろに入れ替え
/*

効果: ソート処理そのものは元のカラム位置で安全に実行されるため、キーの位置計算で混乱するリスクを減らせる。最後の出力だけをスマートに変形させたいときの鉄板スタイルだぜ!

■ 実践編:『BUILD』を使ったデータの入れ替えとパディング(埋め処理)

美しい朝焼けの都会を背景に、IT格闘じいじがスーツ姿で鋭いストレートパンチを放っている。彼の拳の先にある『BUILD Engine: Reformat』と書かれたデジタルの光のリングを通過することで、複雑なデータレイアウトが瞬時に再構築されている。右下のコンソールには、項目の入れ替え(Swap & Rearrange)、空白埋め(Blank Space Padding)、ゼロ詰め(Zero Padding)のチェックマーク付きリストが表示され、完璧に加工された検証済みのパンチカードが出力されているダイアグラム。
ソートカードに『BUILD』を定義し、一撃のストレートを叩き込む。これだけで項目の入れ替えからスペース埋め、前ゼロ詰め(ゼロパディング)まで、複雑なデータ加工を一瞬でトランスフォーム完了だぜ!

ここからは、現場で最も多用される具体的なレイアウト加工テクニックを伝授する。

INRECでもOUTRECでも、データを再構築するときは BUILD(または FIELDS)というキーワードに続けて、新しい配置を指定していく。

【コピペ用】現場で一番使うデータ変形・パディングサンプル

//SYSIN    DD *
  SORT   FIELDS=(1,5,CH,A)
  OUTREC BUILD=(11,20,      * ① 11〜30バイト目を先頭に持ってくる
                1,10,       * ② 元の先頭10バイトをその後に繋ぐ
                10X,        * ③ 後ろに10バイト分のスペース(空白)を埋める
                5Z)         * ④ 最後に5バイト分のゼロ(C'00000')をパディングする
/*

🥊 格闘じいじのテクニカル解説

上のサンプルコードで叩き込んでいるコンボの正体はこれだ!

11,20 と 1,10(項目の入れ替え):

元のデータから指定した「位置, 長さ」の項目を引っこ抜き、書いた順番通りに左からギュッと詰め込んで再配置する。

10X(空白・スペース埋め):

長さX と書くことで、指定した長さ分のスペース(X’40’)を自動的に挿入してくれる。文字項目の桁数合わせや、将来用の予備領域(リザーブエリア)を確保したいときに一撃で使える便利技だ。

5Z(ゼロパディング・前ゼロ詰め):

長さZ と書くと、指定した長さ分の文字としてのゼロ(C’0′ / X’F0’)を自動的に埋めてくれる。 金額や数量などの数値項目で、「8桁固定にするために足りない前方の桁をゼロで埋めたい」というパディング要件の時に大活躍するぜ!

■ 現場の罠:レイアウト変更による「ソートキー位置ズレ」のアベンド

美しい朝焼けの都会を背景に、IT格闘じいじが厳しい表情で真っ赤に光るエラーシステムパネルを凝視している。図解には、元のデータ(Key=10, Len=4)がINRECによって全体で5バイトに縮小(Key shrunk to 5B total)されたにもかかわらず、古い位置を参照した(Old Position reference)ことでソートエンジン(SORT Engine)が『S0C7 ABEND!』『DATA EXCEPTION』の火花を散らして異常終了(アベンド)するメカニズムが描かれている。現場の罠の可視化。
INRECでレイアウトを削った後は、SORTカードの開始位置も『新しい位置』に計算し直さなきゃいけない。元の位置のまま突っ込むと、存在しないカラムを踏み抜いて容赦なくS0C7アベンドのカウンターを食らうぜ!

さあ、今回も27年のキャリアから、若手が100%一度は涙を流す致命的なカウンターパンチ(罠)について警告しておく。

それは、**「INRECでデータレイアウトを縮小した後に、SORTカードを書くときの位置計算ミス」**だ。

🚨 なぜ位置ズレでアベンドが起きるのか?(原因)

基本編で解説した通り、処理の順番は INREC が先で、SORT が後だ。

例えば、元の入力ファイル(SORTIN)のレイアウトが「10バイト目が商品コード(キー)」「20バイト目が金額」だったとするよな。

ここで、INRECを使って「20バイト目の金額」だけを先頭に引っこ抜く加工をしたとする。

* 【アベンドする危険な例】
  INREC FIELDS=(20,5)         * 🥊 20バイト目からの5バイト(金額)だけを切り出した!
  SORT  FIELDS=(10,4,CH,A)    * 🚨 ガラ空き!ここでジョブがアベンドする!

お分かりだろうか?INRECを通った時点で、データは「20バイト目からあった金額データの5バイト分」しか存在しない。元々10バイト目にあった商品コードなんて、ソートエンジンに届く前にもうゴミ箱に捨てられて存在しないんだ!

それなのに、SORTカードで元のレイアウトの感覚のまま「10バイト目から4バイト分をキーにしてソートせよ」なんて命令を出すから、ソートユーティリティは「指定されたカラムがデータ内に存在しねえぞ!」と怒り狂い、構文エラーや位置不正でジョブを容赦なく叩き落とす(アベンド)んだ。

🛠️ 格闘じいじ直伝:位置ズレを防ぐ防衛策

INRECを使うときは、「ソートキーも含めて切り出すこと」、精度高くSORTカードには「INREC加工“後”の新しいカラム位置を指定すること」が絶対条件だ!

* 【大正解のガードスタイル】
//SYSIN    DD *
  INREC FIELDS=(10,4,20,5)   * ① 商品コード(4B)と金額(5B)を並べて切り出す
  SORT  FIELDS=(1,4,CH,A)    * ② 新レイアウトの1バイト目になった商品コードでソート!
/*

この計算さえ間違えなければ、位置ズレのカウンターを食らうことは100%ない。INRECを使う時は、常に「今のデータの形はどうなっているか」のガードを意識しろよ!

💡 コラム:DFSORTとSyncsortって何が違うの?

朝焼けのオフィスバルコニーで、銀髪のIT格闘じいじ(スーツ姿)が検証済みのJCLパンチカードを手に不敵に笑う。彼の上空には、ゴールドとシアンのデジタルエネルギーで描かれた、IBM DFSORTとSyncsort(MF/S)それぞれの処理フロー(ICEGENER、SYNCSORT、MFSORT、最適化メモリ経路)の比較図解が浮かび、技術的な違いが視覚化されている。
純正か、俊足か。じいじが実戦で培ったDFSORTとSyncsortの見極め方を、このフローに凝縮したぜ。お前なら、どっちのカウンターを叩き込む?

ブログの中で当たり前のように DFSORT/SYNCSORT って並べて書いているけど、「そもそもSyncsort(シンクソート)って何者?」って若手に聞かれたら、こう答えてやってくれ。

「IBM純正のソートツール(DFSORT)のライバルであり、現場でめちゃくちゃシェアを持っている互換製品(サードパーティ製ツール)だぜ!」

メインフレームのソートの世界は、実質この2大巨頭がリングを支配しているんだ。

項目 DFSORT(ディーエフソート) Syncsort(シンクソート)
開発元 IBM純正 Syncsort社(現:Precisely社)
特徴 OS(z/OS)に標準で組み込まれている王道ツール。 処理速度がとにかく速い。
互換性 基準となる標準仕様。 DFSORTのカード(SYSIN)がそのまま動く完全互換。

昔の日本のメインフレームの現場(特に大規模な金融や製造業のバッチ処理)では、「ソートの処理時間を1分でも短縮して、夜間バッチを朝までに終わらせる」のが至上命題だった。そこで、「IBMのDFSORTより、Syncsortを入れたほうがCPUの効率が良いし爆速だぜ!」ってことで、多くの現場でエースとして採用されてきたんだ。

■ まとめ:レイアウトを支配する者が、バチバチのバッチ処理を制す

朝焼けのオフィスバルコニーで、銀髪のIT格闘家じいじが「LAYOUT」と書かれたゴールドに輝くパンチカードを掲げ、襲いかかる「ABEND(S0C7など)」の赤いエラーエネルギーをガードする。足元にはゴールドの「BATCH」の文字が並び、背後には最適化されたデータフローのフローチャートが展開。技術の最適化。
レイアウト(ガード)が完璧なら、どんなアベンド(カウンターパンチ)も怖くない。バッチ処理のリングを支配するのは、データ構造を理解した者だけだぜ。

一社のお見送りや面接のミスマッチで凹んでいる暇があったら、このINREC/OUTRECを1行でも多く組んで、プログラムレスでデータを自在にトランスフォームさせる「テクニカルな武器」を研ぎ澄まそうぜ。

COBOLで何何十行もMOVE文を書くより、ソートカードのBUILD、X、Zを数行パパッと組み合わせる方が、遥かにスマートで、処理速度も速く、100%裏切らない最強のカウンターパンチになってくれる。

次回は、別々のファイルをJCLだけでガッチャンコと結合させる達人技、「JOINKEYSの極意」をリアルな実例付きで深掘りしていくぜ!

次戦に向けて、スキルもシステムも自動化(最適化)していこうぜ。

Status: Batch Processing (次戦のJCL投入準備完了だ!)

関連記事:

【z/OS】プログラム不要!DFSORT/SYNCSORTでできる全機能まとめ(JCLサンプル付き)
27年のメインフレーム経験を持つIT格闘じいじが、z/OSのソートユーティリティ(DFSORT/SYNCSORT)の全機能をJCLサンプル付きで徹底網羅!並び替え、重複削除(SUM)、OUTREC、OUTFILからICETOOLの戻り値制御まで、プログラム不要の高速データ処理術を解説。
【DFSORT/SYNCSORT】SUM FIELDS=NONE だけじゃない!重複削除と数値集計(SUM)の現場実例マスター
DFSORT/SYNCSORTの「SUMカード」を徹底攻略!基本の重複削除(SUM FIELDS=NONE)の仕組みから、パック10進数(PD)・ゾーン10進数(ZD)の集計で絶対にアベンドを起こさないためのプロの指定方法まで、サンプル付きで解説。

コメント

タイトルとURLをコピーしました