プロジェクト

全般

プロフィール

レビュー指摘 #11944 » KS60760_詳細設計書.md

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

 

KS60760 詳細設計書

項目 内容
プログラムID KS60760(ソース名 KS60760P)
プログラム名 郵送集約データの代表分作成・優先印刷マスターによる振分け
言語 PL/I(OPTIONS(MAIN))。パターン PPB0070P
業務ID KDHIRT00(ソースの +DC GYOM)
起動JOB DAISEQ4J ステップ No.17
作成日 2026/10/13
作成方法 ソースコードからのリバース作成

前提

  • INCLUDE の SSYUPRNT(優先印刷マスター)は、添付ソースを展開して解析した(付録A)。
  • 入出力のレコード(18バイト)はソース内で定義されており、KS60750P の出力と同じ形式である。
  • 外部手続きの CALL はなく、ブラックボックス(BB)として扱う部分はない。
  • 帳票は出力しない。入出力ファイルのイメージを6章に示す(値は架空。KS60750 設計書 6章の例の続き)。
  • ★印は、ソースから読み取れる潜在的な問題点または注意点を示す。

1. 概要

1.1 機能

ソース先頭のコメント:

請求集約コードから代表コード分のデータを出力する。
優先印刷マスターの有無でアウトファイルを分ける。

  1. KS60750P が作った「荷主 → 集約代表」の対応表(集約代表コード順に並べ替え済み)を読む。
  2. 集約代表コードが変わるたびに、代表自身のレコード(荷主コード=集約代表コード)を1件作る。
  3. 代表のレコードと、その代表に集約される各荷主のレコードを、それぞれの荷主コードで優先印刷マスターを引き、
    • マスターに有る → OUTFIL1
    • マスターに無い → OUTFIL2
      に書き分ける。
  4. 終了時に入力件数・代表の件数を表示する。

1.2 処理概要図

 KS60750P → SORT1(集約代表順)
          │
          ▼
 TEMP.KS60750J.WORK0020 ──▶ INFILE ──▶ KS60760P ──┬─▶ OUTFIL1 ──▶ WORK0030(優先印刷マスターに有る)
                                         ▲          │        → SORT2 → WORK0060 → KS60780P → … → KS60790P 事業所用(KS607902)
          VKAD.SSYUPRNT.DTMASTER ──▶ VKSYUPR      └─▶ OUTFIL2 ──▶ WORK0040(優先印刷マスターに無い)
          (優先印刷マスター)                                → SORT2 → WORK0080 → KS60780P → … → KS60790P エコデリバー用(KS607901)

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

2.1 ファイル一覧

DD名 編成/属性(DCL) 入出力 内容 読込/書出領域
INFILE RECORD INPUT(順次) 入力 郵送集約の対応表(集約代表順) INAREA(18バイト)
VKSYUPR RECORD KEYED DIRECT INPUT ENV(VSAM) 入力 優先印刷マスター PRAREA(SSYUPRNT、40バイト)。キー=荷主コード7桁
OUTFIL1 RECORD OUTPUT(順次) 出力 優先印刷マスターに有る荷主の対応表 INAREA または OUTAREA(18バイト)
OUTFIL2 RECORD OUTPUT(順次) 出力 優先印刷マスターに無い荷主の対応表 同上

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

DD名 データセット DISP 属性 作成元/利用先
VKSYUPR VKAD.SSYUPRNT.DTMASTER SHR VSAM KS60130P、KS60151P、KS60152P、KS60630P も使用
INFILE TEMP.KS60750J.WORK0020 SHR FB 18(推定) 作成:No.16 SORT1(KS60750P の出力を 8,7=集約代表で並替え)
OUTFIL1 TEMP.KS60750J.WORK0030 (NEW,KEEP,DELETE) RECFM=FB、LRECL=18、BLKSIZE=9000、DASD09 利用:No.19 SORT2(1,7)→ WORK0060 → No.22 KS60780P → No.24 SORT4 → No.25 KS60790P(事業所用配信、SYSOUT ライター KS607902)
OUTFIL2 TEMP.KS60750J.WORK0040 (NEW,KEEP,DELETE) 同上 利用:No.20 SORT2(1,7)→ WORK0080 → No.23 KS60780P → No.26 SORT4 → No.27 KS60790P(エコデリバー用配信、ライター KS607901)
  • JCL に SYSPRINT の DD がない。DISPLAY のメッセージはジョブログに出る。
  • VKSYUPR の OPEN 文はない。最初の READ で暗黙にオープンされ、終了時に自動でクローズされる。
  • 後続の流れ(KS60780P 以降)は JCL からの推定。KS60780P・KS60790P のソースは未解析。

2.3 入出力ファイルの違い

観点 INFILE(入力) OUTFIL1(出力) OUTFIL2(出力)
中身 代表以外の集約される荷主(KS60750P の抽出結果) 優先印刷マスターに有る荷主 優先印刷マスターに無い荷主
代表自身のレコード 含まない 代表がマスターに有れば含む 代表がマスターに無ければ含む
レイアウト 荷主7+集約代表7+店所4(18バイト) 同じ 同じ
並び 集約代表コード順 集約代表コード順(後で荷主コード順に並べ替え) 同左
件数 N OUTFIL1+OUTFIL2 = N+代表の数 ←
後続の用途(推定) - 事業所用の配信(KS60790P、KS607902) エコデリバー用の配信(KS60790P、KS607901)
  • OUTFIL1/OUTFIL2 の振分けは、KS60152P(請求書)・KS60630P(CSV)と同じく「優先印刷マスターの有無」で行う。有る=事業所(優先)、無い=エコデリバー(インフォコム)という対応になる。
  • ★ ただし本PG は UPRNASKB(明細不要 '6')を見ない。明細不要の顧客もマスターに有れば OUTFIL1 に入る(KS60152P では出力しない、KS60630P では「不要」と区別している)。

3. データ定義

3.1 入出力エリア(18バイト)

名称 項目 位置 長さ 属性 内容
INAREA INKOCD 1 7 CHAR(7) 荷主コード
INDAIH 8 7 CHAR(7) 集約代表コード
INTNCD 15 4 PIC'(4)9' 代表扱い店
OUTAREA OUTKOCD 1 7 CHAR(7) 荷主コード(代表のレコードでは集約代表コード)
OUTDAIH 8 7 CHAR(7) 集約代表コード
OUTTNCD 15 4 PIC'(4)9' 代表扱い店
PRAREA (SSYUPRNT) - 40 - 優先印刷マスターの読込域(項目は使わない)
  • 集約される荷主のレコードは、INAREA をそのまま書く。代表のレコードだけ OUTAREA で作る。

3.2 ワークエリア

名称 属性 初期値 内容
EOF_SW BIT(1) '1'B INFILE の終了で '0'B
MS_SW CHAR(1) - 優先印刷マスターの該当('Y'=有る/'N'=無い)
BREAKA CHAR(7) - 処理中の集約代表コード(区切りの判定用)
ICNT FIXED DEC(9) 0 入力件数(集約される荷主の数)
OCNT FIXED DEC(9) 0 代表の件数(集約代表コードの種類数)
ECNT、II、JJ、NUMR - - 未使用

4. 処理フロー

開始
 ├─ ON ENDFILE(INFILE) → EOF_SW='0'B、ON KEY(VKSYUPR) → MS_SW='N'
 ├─ OPEN INFILE、OUTFIL1、OUTFIL2
 ├─ INFILE を1件読む
 ├─ DO WHILE(INFILE が終わるまで)                      … 集約代表の単位
 │     BREAKA ← INDAIH
 │     【代表のレコードを作る】
 │       OUTAREA をクリア、OUTKOCD ← INDAIH、OUTDAIH ← INDAIH、OUTTNCD ← INTNCD
 │       MS_SW='Y'、VKSYUPR を KEY(OUTKOCD=代表) で READ
 │       有る → OUTFIL1、無い → OUTFIL2 に OUTAREA を WRITE
 │       OCNT +1
 │     DO WHILE(終わっていない かつ INDAIH が BREAKA と同じ) … 集約される荷主の単位
 │         ICNT +1
 │         MS_SW='Y'、VKSYUPR を KEY(INKOCD=荷主) で READ
 │         有る → OUTFIL1、無い → OUTFIL2 に INAREA を WRITE
 │         INFILE を1件読む
 │     END
 │  END
 ├─ DISPLAY 入力件数・代表件数
 ├─ CLOSE INFILE、OUTFIL1、OUTFIL2
終了

5. 処理詳細

5.1 代表のレコードの作成(集約代表コードが変わったとき)

手順 内容
1 BREAKA ← INDAIH(集約代表コード)
2 OUTAREA をクリアし、OUTKOCD ← INDAIH、OUTDAIH ← INDAIH、OUTTNCD ← INTNCD
3 MS_SW ← 'Y'。READ FILE(VKSYUPR) INTO(PRAREA) KEY(OUTKOCD)(代表の荷主コードで引く)
4 MS_SW='Y'(有る)なら OUTFIL1、'N'(無い)なら OUTFIL2 に OUTAREA を書く
5 OCNT +1
  • 代表は KS60750P の抽出条件(荷主≠集約代表)で除外されているため、入力には代表自身のレコードがない。本PG がここで補う(ソースコメント「代表コード分のデータを出力する」)。
  • 代表のレコードの店所(OUTTNCD)は、そのグループの先頭の荷主の代表扱い店をそのまま使う。
  • ★ 同じ代表のグループ内で荷主ごとに代表扱い店が違う場合でも、代表のレコードは先頭の荷主の値になる。

5.2 集約される荷主のレコード(同じ集約代表の間)

手順 内容
1 ICNT +1
2 MS_SW ← 'Y'。READ FILE(VKSYUPR) INTO(PRAREA) KEY(INKOCD)(その荷主自身のコードで引く)
3 有る → OUTFIL1、無い → OUTFIL2 に INAREA をそのまま書く
4 INFILE を1件読む
  • 振分けは荷主ごとに行う。代表と、その代表に集約される荷主が、別々のファイルに分かれることがある(6章の例の 7654321 グループ)。
  • ★ 優先印刷マスターのレコードの内容(UPRNASKB 等)は見ない。KEY 条件はキーなし以外のエラーでも MS_SW='N' になり、OUTFIL2 に入る。

5.3 終了処理

  1. 次の2行を DISPLAY する。
    • <<< INPUT COUNT = ∥ ICNT(入力件数=集約される荷主の数)
    • <<< DAIHYO COUNT = ∥ OCNT(代表の数)
  2. INFILE、OUTFIL1、OUTFIL2 を CLOSE する。
  • 確認方法:OUTFIL1 の件数 + OUTFIL2 の件数 = INPUT COUNT + DAIHYO COUNT。

6. 入出力イメージ

KS60750 設計書 6章の例の続き。優先印刷マスターには 0010083 と 1234567 だけが登録されているものとする。

6.1 入力(WORK0020、集約代表順)

----+----1----+---
4567890       0000
120932000100831001
123456776543211002
567890176543211002
  • 1行目は、KS60750P で集約代表が空白のまま抽出された荷主(KS60750 設計書 8章 No.1)。空白は数字より小さいため先頭に来る。

6.2 処理の様子

順 区分 荷主コード 集約代表 店所 優先印刷マスター 出力先
1 代表(作成) (空白) (空白) 0000 無い OUTFIL2
2 集約される荷主 4567890 (空白) 0000 無い OUTFIL2
3 代表(作成) 0010083 0010083 1001 有る OUTFIL1
4 集約される荷主 1209320 0010083 1001 無い OUTFIL2
5 代表(作成) 7654321 7654321 1002 無い OUTFIL2
6 集約される荷主 1234567 7654321 1002 有る OUTFIL1
7 集約される荷主 5678901 7654321 1002 無い OUTFIL2

6.3 出力

OUTFIL1(WORK0030:優先印刷マスターに有る)

----+----1----+---
001008300100831001
123456776543211002

OUTFIL2(WORK0040:優先印刷マスターに無い)

----+----1----+---
              0000
4567890       0000
120932000100831001
765432176543211002
567890176543211002
  • 代表 0010083 は OUTFIL1、その配下の 1209320 は OUTFIL2 に分かれる。代表 7654321 は OUTFIL2、配下の 1234567 は OUTFIL1 に分かれる。
  • ★ 集約代表が空白のグループでは、荷主コード・集約代表がともに空白の「代表のレコード」が作られ、OUTFIL2 に入る。

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

<<<  INPUT COUNT =            4
<<< DAIHYO COUNT =            3
  • OUTFIL1(2件)+OUTFIL2(5件)= 7件 = 入力 4件+代表 3件。

7. 異常処理

事象 検出 処理
INFILE の終了 ENDFILE 条件 EOF_SW='0'B でループを終える(正常)
INFILE が0件 なし 出力0件で正常終了
優先印刷マスターに該当なし・キーエラー KEY 条件 MS_SW='N'。OUTFIL2 に出力(メッセージなし)
優先印刷マスターの DD がない UNDEFINEDFILE 条件 ON 定義なし → 異常終了
INTNCD が数字でない(代表のレコード作成時) CONVERSION 条件(の可能性) ON 定義なし → 異常終了
その他 - ON ERROR の定義なし → PL/I 標準のエラー処理
リターンコード - 設定なし(正常時は 0)

8. 留意事項(★)

  1. 代表と配下の荷主が別のファイルに分かれる:振分けは荷主ごとに優先印刷マスターを引いて決める。後続(KS60780P・KS60790P)で、代表と配下が別々の配信になる可能性がある(要確認)。
  2. 明細不要(UPRNASKB='6')を区別しない:マスターに有れば OUTFIL1。KS60152P・KS60630P とは扱いが異なる。
  3. 集約代表が空白のグループ:KS60750P の抽出条件により、集約代表が空白の荷主が入ってくる。本PG では「荷主コード空白の代表のレコード」が作られ、OUTFIL2 に入る(6.3)。
  4. 代表のレコードの店所は先頭の荷主の値(5.1)。
  5. キーエラーも「無い」扱い:優先印刷マスターの読込エラーが、メッセージなしで OUTFIL2 に振り分けられる。
  6. VKSYUPR の OPEN 文がない、SYSPRINT の DD がない(2.2)。
  7. 未使用の変数:ECNT、II、JJ、NUMR(KS60750P と同じパターンからの流用と推定)。
  8. INFILE の並びに依存:集約代表コード順に並んでいることが前提。並んでいないと、同じ代表のレコードが複数作られる。

9. 未使用項目

項目 内容
SSYUPRNT の全項目 読込域として使うだけで、項目は参照しない(該当の有無だけを使う)
ECNT、II、JJ、NUMR 宣言のみ
BUILTIN の ADDR、SUBSTR、HIGH、LOW、ROUND、STRING、VERIFY、UNSPEC 宣言のみ

付録A SSYUPRNT(優先印刷マスター、40バイト)

LV 項目名 属性 繰返し 位置 長さ 本PGでの使用
02 UPRNNICD PIC'(7)9' 1 7 キー(荷主コード7桁)。該当の有無だけを判定に使う
02 UPRNKUBN PIC'(1)9' 8 1
02 UPRNTHKB CHAR(1) 9 1
02 UPRNSPAC CHAR(1) 10 1
02 UPRNAIXK (集団項目) 11 23
03  UPRNATEN PIC'(4)9' 11 4
03  UPRNAKBK PIC'(1)9' 15 1
03  UPRNAKUB PIC'(1)9' 16 1
03  UPRNASKB CHAR(1) 17 1
03  UPRNASCN CHAR(9) 18 9
03  UPRNANIC PIC'(7)9' 27 7
02 UPRNSPA2 CHAR(7) 34 7
(1-1/2)