プロジェクト

全般

プロフィール

レビュー指摘 #11940 » KS60750_詳細設計書.md

[参考資料]現行ソース解析資料AI生成版 - 幸塚 和久, 2026-10-15 02:46 午後

 

KS60750 詳細設計書

項目 内容
プログラムID KS60750(ソース名 KS60750P)
プログラム名 顧客法人マスター 郵送集約コード抽出
言語 PL/I(OPTIONS(MAIN))。パターン PPB0070P
業務ID KDHIRT00(ソースの +DC GYOM)
起動JOB DAISEQ4J ステップ No.15(JCL コメント「顧客法人管理マスター 郵送依頼店セット顧客出力」)
作成日 2026/10/13
作成方法 ソースコードからのリバース作成

前提

  • INCLUDE の CORPOMAN(顧客法人管理マスター)は、添付ソースを展開して解析した(付録A)。
  • 外部手続きの CALL はなく、ブラックボックス(BB)として扱う部分はない。
  • 帳票は出力しない。出力ファイルのイメージを6章に示す(値は架空)。
  • CORPOMAN の項目の意味(ZAND=集約代表、ZDTN=代表扱い店)は、KS60152P のソースのコメント(「集約代表コード」「代表コード扱い店」)からの推定である。
  • ★印は、ソースから読み取れる潜在的な問題点または注意点を示す。

1. 概要

1.1 機能

ソース先頭のコメント:「顧客法人マスター(郵送集約コードのみ)」

  1. 顧客法人管理マスター(INFILE)を先頭から全件読む。
  2. 荷主コード(CORPNICD)と集約代表コード(CORPZAND)が異なるレコードだけを選ぶ。つまり「自分以外の代表に集約される顧客」を抜き出す。
  3. 選んだレコードから「荷主コード・集約代表コード・代表扱い店」の3項目(18バイト)を OUTFILE に書く。
  4. 終了時に入力件数・出力件数を表示する。

出力は、後続の SORT(集約代表コード順)を経て KS60760P が読み、最終的に KS60790P(事業所用・エコデリバー用の配信帳票)で、集約された顧客の請求をまとめる際の対応表として使われる(推定)。

1.2 処理概要図

 VKAD.CORPOMAN.DTMASTER ──▶ INFILE ──▶ KS60750P ──▶ OUTFILE ──▶ TEMP.KS60750J.WORK0010
 (顧客法人管理マスター)              │           (荷主→集約代表の対応表、18バイト)
                                       ▼                    │
                                 件数メッセージ               ▼
                                                  No.16 SORT1(8,7=集約代表コード順)→ WORK0020
                                                            ▼
                                                  No.17 KS60760P(優先印刷マスターで2分割)→ …

2. 外部インターフェース

2.1 ファイル一覧

DD名 編成/属性(DCL) 入出力 内容 読込/書出領域
INFILE RECORD INPUT(順次) 入力 顧客法人管理マスター INAREA(CORPOMAN、120バイト)
OUTFILE RECORD OUTPUT(順次) 出力 郵送集約コードの対応表 OUTAREA(18バイト)

2.2 JCL との対応(DAISEQ4J No.15)

DD名 データセット DISP 属性 備考
INFILE VKAD.CORPOMAN.DTMASTER SHR VSAM KSDS(推定) KS60152P・KS60630P・KS60790P がキー読みするマスターを、本PGは順次に全件読む。並びはキー(荷主コード)の昇順
OUTFILE TEMP.KS60750J.WORK0010 (NEW,KEEP,DELETE) RECFM=FB、LRECL=18、BLKSIZE=9000、SPACE=(9000,(1000,100),RLSE)、DASD09 事前削除:No.14。利用:No.16 SORT1
  • プログラムの INFILE には ENV(VSAM) の指定がないが、DD が VSAM を指すため、順次の VSAM 読込みとして動作する。
  • JCL に SYSPRINT の DD がない。DISPLAY のメッセージはジョブログ(コンソール)に出る(PL/I の DISPLAY の既定動作)。

2.3 入出力ファイルの違い

観点 INFILE(入力) OUTFILE(出力)
中身 顧客法人管理マスターの全顧客 自分以外の代表に集約される顧客だけ
1件の長さ 120バイト(CORPOMAN) 18バイト(3項目)
項目 荷主コード、集約代表、各店所コード、名称、区分 等 荷主コード、集約代表コード、代表扱い店
並び 荷主コードの昇順 同左(後続の SORT で集約代表コード順に並べ替える)
件数 全件 入力以下

3. データ定義

3.1 入力エリア

名称 内容
INAREA %INCLUDE CORPOMAN(120バイト。付録A)。使う項目は CORPNICD、CORPZAND、CORPZDTN の3つ

3.2 出力エリア(OUTAREA、18バイト)

項目 位置 長さ 属性 内容 編集元
OUTKOCD 1 7 CHAR(7) 荷主コード(顧客) CORPNICD
OUTDAIH 8 7 CHAR(7) 集約代表コード CORPZAND
OUTTNCD 15 4 PIC'(4)9' 代表扱い店 CORPZDTN
  • JCL の LRECL=18 と一致する。
  • 後続の SORT1 のキー(8,7)は OUTDAIH(集約代表コード)。

3.3 ワークエリア

名称 属性 初期値 内容
EOF_SW BIT(1) '1'B INFILE の終了で '0'B
ICNT FIXED DEC(9) 0 入力件数
OCNT FIXED DEC(9) 0 出力件数
ECNT FIXED DEC(9) 0 未使用(エラー件数用と推定)
MS_SW、II、JJ、NUMR - - 未使用(NUMR は '0123456789'。数字チェック用の名残と推定)

4. 処理フロー

開始
 ├─ ON ENDFILE(INFILE) → EOF_SW='0'B
 ├─ OPEN INFILE、OUTFILE
 ├─ INFILE を1件読む
 ├─ DO WHILE(INFILE が終わるまで)
 │     ICNT +1
 │     CORPNICD ≠ CORPZAND ?
 │       ├ YES → OUTAREA をクリア
 │       │        OUTKOCD ← CORPNICD、OUTDAIH ← CORPZAND、OUTTNCD ← CORPZDTN
 │       │        OUTFILE に WRITE、OCNT +1
 │       └ NO  → 何もしない(自分が代表の顧客)
 │     INFILE を1件読む
 │  END
 ├─ DISPLAY 入力件数・出力件数
 ├─ CLOSE INFILE、OUTFILE
終了

5. 処理詳細

5.1 抽出条件

CORPNICD と CORPZAND 意味(推定) 出力
同じ 自分自身が集約代表(または集約なし) しない
異なる(CORPZAND に別の荷主コード) 別の代表に集約される顧客 する
異なる(CORPZAND が空白) 集約代表が未設定 ★ する(集約代表コード=空白の行になる)
  • 比較は CHAR(7) どうしの文字比較。
  • ★ ソースのコメントは「郵送集約コードのみ」だが、CORPZAND が空白(未設定)の顧客も「異なる」と判定されて出力される。マスターで未設定の顧客が CORPZAND に自分の荷主コードを入れている運用なら問題ない。空白の顧客がいる場合、後続の SORT1 で集約代表コード=空白の行が先頭にまとまる(要確認)。

5.2 出力の編集

  1. OUTAREA = '' でクリアする。
  2. OUTKOCD ← CORPNICD、OUTDAIH ← CORPZAND、OUTTNCD ← CORPZDTN。
  3. WRITE FILE(OUTFILE) FROM(OUTAREA)。OCNT +1。
  • OUTTNCD と CORPZDTN はどちらも PIC'(4)9'。CORPZDTN に数字以外が入っている場合、代入時に CONVERSION 条件の可能性がある(ON 定義なし)。

5.3 終了処理

  1. 次の2行を DISPLAY する。
    • <<< INPUT COUNT = ∥ ICNT
    • <<< OUTPUT COUNT = ∥ OCNT
  2. INFILE と OUTFILE を CLOSE する。

6. 入出力イメージ

6.1 入力(顧客法人管理マスター、主な項目のみ)

No CORPNICD(荷主) CORPZAND(集約代表) CORPZDTN(代表扱い店) 判定
1 0010083 0010083 1001 同じ → 出力しない
2 1209320 0010083 1001 異なる → 出力
3 1234567 7654321 1002 異なる → 出力
4 2345678 2345678 1003 同じ → 出力しない
5 4567890 (空白) 0000 ★ 異なる → 出力
6 5678901 7654321 1002 異なる → 出力
7 7654321 7654321 1002 同じ → 出力しない

6.2 出力(TEMP.KS60750J.WORK0010、FB 18バイト)

----+----1----+---
120932000100831001
123456776543211002
4567890       0000
567890176543211002
位置 1~7 8~14 15~18
項目 荷主コード 集約代表コード 代表扱い店
  • すべて文字(数字)項目のため、ダンプでもそのまま読める。

6.3 参考:後続 SORT1(8,7)後の並び(WORK0020)

----+----1----+---
4567890       0000
120932000100831001
123456776543211002
567890176543211002
  • 集約代表コードの順に並ぶ。空白(X'40')は数字(X'F0'~)より小さいため、集約代表が空白の行が先頭に来る。
  • 同じ集約代表に集約される顧客(1234567 と 5678901 → 7654321)が隣り合う。

6.4 メッセージ(ジョブログ)

<<<  INPUT COUNT =            7
<<< OUTPUT COUNT =            4
  • 件数の前の空白は、FIXED DEC(9) を文字に変換する規則によるもので、イメージは目安である。

7. 異常処理

事象 検出 処理
INFILE の終了 ENDFILE 条件 EOF_SW='0'B でループを終える(正常)
INFILE が0件 なし 出力0件で正常終了
CORPZDTN が数字でない CONVERSION 条件(の可能性) ON 定義なし → 異常終了
その他 - ON ERROR の定義なし → PL/I 標準のエラー処理(異常終了)
リターンコード - 設定なし(正常時は 0)

8. 留意事項(★)

  1. 集約代表が空白の顧客も出力される(5.1)。
  2. CORPZAND が自分の荷主コードと違えば、代表側のマスター登録の有無は確認しない。代表の荷主コードがマスターに存在しなくても出力される。
  3. 代表扱い店(CORPZDTN)を出力する。KS60630P の CSV の「扱い店」は CORPATTN で、別の項目である(KS60630 設計書 2.4)。
  4. SYSPRINT の DD がない:DISPLAY はジョブログに出る。
  5. 未使用の変数:MS_SW、II、JJ、NUMR、ECNT(パターンからの流用と推定)。
  6. 業務ID が他と異なる:本PG は KDHIRT00、KS60135P・KS60630P は NSSQNN50。別の業務(顧客法人管理側)で作られたプログラムを流用していると推定。

9. 未使用項目

項目 内容
CORPOMAN の CORPNICD、CORPZAND、CORPZDTN 以外 参照なし
MS_SW、II、JJ、NUMR、ECNT 宣言のみ
BUILTIN の ADDR、SUBSTR、HIGH、LOW、ROUND、STRING、VERIFY、UNSPEC 宣言のみ

付録A CORPOMAN(顧客法人管理マスター、120バイト)

LV 項目名 属性 繰返し 位置 長さ 本PGでの使用
02 CORPVKEY (集団項目) 1 7
03  CORPNICD CHAR(7) 1 7 キー(荷主コード)→ OUTKOCD。CORPZAND と比較
02 CORPAIX1 (集団項目) 8 7
03  CORPTKCD CHAR(7) 8 7
02 CORPAIX2 (集団項目) 15 7
03  CORPZAND CHAR(7) 15 7 集約代表コード → OUTDAIH。CORPNICD と比較
02 CORPATTN PIC'(4)9' 22 4
02 CORPTKTN PIC'(4)9' 26 4
02 CORPZDTN PIC'(4)9' 30 4 代表扱い店 → OUTTNCD
02 CORPJGKB CHAR(1) 34 1
02 CORPTKJG CHAR(1) 35 1
02 CORPDLKB CHAR(1) 36 1
02 CORPNINM CHAR(42) 37 42
02 CORPCOKB CHAR(1) 79 1
02 CORPDSTK CHAR(1) 80 1
02 CORPWARI FIXED DEC(3) 81 2
02 CORPNMKB CHAR(1) 83 1
02 CORPSPAC CHAR(14) 84 14
02 CORPPUDL CHAR(1) 98 1
02 CORPPUMD CHAR(6) 99 6
02 CORPJYCD CHAR(6) 105 6
02 CORPTRMD CHAR(4) 111 4
02 CORPUYMD CHAR(6) 115 6
  • CORPVKEY(CORPNICD)がキー、CORPAIX1(CORPTKCD)・CORPAIX2(CORPZAND)は代替索引(AIX)のキーと推定される(集団項目名より)。
(1-1/2)