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 機能
ソース先頭のコメント:
請求集約コードから代表コード分のデータを出力する。
優先印刷マスターの有無でアウトファイルを分ける。
- KS60750P が作った「荷主 → 集約代表」の対応表(集約代表コード順に並べ替え済み)を読む。
- 集約代表コードが変わるたびに、代表自身のレコード(荷主コード=集約代表コード)を1件作る。
- 代表のレコードと、その代表に集約される各荷主のレコードを、それぞれの荷主コードで優先印刷マスターを引き、
- マスターに有る → OUTFIL1
- マスターに無い → OUTFIL2
に書き分ける。
- 終了時に入力件数・代表の件数を表示する。
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 終了処理
- 次の2行を DISPLAY する。
-
<<< INPUT COUNT = ∥ ICNT(入力件数=集約される荷主の数)
-
<<< DAIHYO COUNT = ∥ OCNT(代表の数)
- 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. 留意事項(★)
-
代表と配下の荷主が別のファイルに分かれる:振分けは荷主ごとに優先印刷マスターを引いて決める。後続(KS60780P・KS60790P)で、代表と配下が別々の配信になる可能性がある(要確認)。
-
明細不要(UPRNASKB='6')を区別しない:マスターに有れば OUTFIL1。KS60152P・KS60630P とは扱いが異なる。
-
集約代表が空白のグループ:KS60750P の抽出条件により、集約代表が空白の荷主が入ってくる。本PG では「荷主コード空白の代表のレコード」が作られ、OUTFIL2 に入る(6.3)。
-
代表のレコードの店所は先頭の荷主の値(5.1)。
-
キーエラーも「無い」扱い:優先印刷マスターの読込エラーが、メッセージなしで OUTFIL2 に振り分けられる。
-
VKSYUPR の OPEN 文がない、SYSPRINT の DD がない(2.2)。
-
未使用の変数:ECNT、II、JJ、NUMR(KS60750P と同じパターンからの流用と推定)。
-
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 |
|