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 機能
ソース先頭のコメント:「顧客法人マスター(郵送集約コードのみ)」
- 顧客法人管理マスター(INFILE)を先頭から全件読む。
- 荷主コード(CORPNICD)と集約代表コード(CORPZAND)が異なるレコードだけを選ぶ。つまり「自分以外の代表に集約される顧客」を抜き出す。
- 選んだレコードから「荷主コード・集約代表コード・代表扱い店」の3項目(18バイト)を OUTFILE に書く。
- 終了時に入力件数・出力件数を表示する。
出力は、後続の 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 出力の編集
-
OUTAREA = '' でクリアする。
- OUTKOCD ← CORPNICD、OUTDAIH ← CORPZAND、OUTTNCD ← CORPZDTN。
-
WRITE FILE(OUTFILE) FROM(OUTAREA)。OCNT +1。
- OUTTNCD と CORPZDTN はどちらも PIC'(4)9'。CORPZDTN に数字以外が入っている場合、代入時に CONVERSION 条件の可能性がある(ON 定義なし)。
5.3 終了処理
- 次の2行を DISPLAY する。
-
<<< INPUT COUNT = ∥ ICNT
-
<<< OUTPUT COUNT = ∥ OCNT
- 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. 留意事項(★)
-
集約代表が空白の顧客も出力される(5.1)。
-
CORPZAND が自分の荷主コードと違えば、代表側のマスター登録の有無は確認しない。代表の荷主コードがマスターに存在しなくても出力される。
-
代表扱い店(CORPZDTN)を出力する。KS60630P の CSV の「扱い店」は CORPATTN で、別の項目である(KS60630 設計書 2.4)。
-
SYSPRINT の DD がない:DISPLAY はジョブログに出る。
-
未使用の変数:MS_SW、II、JJ、NUMR、ECNT(パターンからの流用と推定)。
-
業務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)のキーと推定される(集団項目名より)。