プロジェクト

全般

プロフィール

レビュー指摘 #11947 » KS60770_詳細設計書.md

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

 

KS60770 詳細設計書

項目 内容
プログラムID KS60770(ソース名 KS60770P)
プログラム名 請求明細データ 見出し(ヘッダー部)抽出
言語 PL/I(OPTIONS(MAIN))。パターン PPB0010P(ファイルのIO・SINGLE)
業務ID NSSQNN50(ソースの +DC GYOM)
起動JOB DAISEQ4J ステップ No.18
作成日 2026/10/13
作成方法 ソースコードからのリバース作成

前提

  • INCLUDE の SQALLHED、SQALLDTB、SQALLDTC、SQALLDTD、SDPSQALA は、添付ソースを展開して解析した(付録A~E)。
  • 外部手続きの CALL はなく、ブラックボックス(BB)として扱う部分はない。
  • 帳票は出力しない。入出力のイメージを6章に示す(値は架空)。
  • データIDの意味は、同じ入力を読む KS60144P・KS60135P の解析結果による。
  • ★印は、ソースから読み取れる潜在的な問題点または注意点を示す。

1. 概要

1.1 機能

ソース先頭のコメント:「請求明細全送状データを読み、ヘッダー部のみ出力する。」

  1. 請求明細の全データ(INFILE)を先頭から読む。
  2. **見出しデータ(データID 00)**だけを対象にし、請求額=運賃+料金+消費税+保険料を計算する。
  3. 請求額が 0 でない見出しデータを、そのまま OUTFILE に書く。
  4. 明細データ(01、21、22、31、33、45 等)は読み飛ばす。
  5. 終了時に入力件数・出力件数を表示する。

出力は、後続の SORT(請求先番号順)を経て KS60780P の入力になり、KS60760P が作った郵送集約の対応表と突き合わせて、事業所用・エコデリバー用の配信帳票(KS60790P)の元データになる(推定)。

1.2 処理概要図

 TEMP.DAISEQ4J.WORK0620 ──▶ INFILE ──▶ KS60770P ──▶ OUTFILE ──▶ TEMP.KS60750J.WORK0050
 (請求明細 全店所・全件)             │      (見出しデータのうち請求額≠0)
                                       ▼                    │
                                 件数メッセージ              ▼
                                               No.21 SORT3(19,8,PD)→ WORK0090
                                                             ▼
                                     No.22・23 KS60780P(WORK0060/0080 と突合せ)→ …→ KS60790P

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

2.1 ファイル一覧

DD名 編成/属性(DCL) 入出力 内容 読込/書出領域
INFILE RECORD INPUT(順次・可変長) 入力 請求明細の全データ(見出し+明細) INAREA CHAR(560) VAR
OUTFILE RECORD OUTPUT(順次・可変長) 出力 見出しデータ(請求額≠0)だけ INAREA(読んだものをそのまま)

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

DD名 データセット DISP 属性 作成元/利用先
INFILE TEMP.DAISEQ4J.WORK0620 SHR VB 作成:No.3 SORT。KS60144P(No.8)、KS60135P(No.11)も同じデータを読む
OUTFILE TEMP.KS60750J.WORK0050 (NEW,KEEP,DELETE) RECFM=VB、BLKSIZE=12000、SPACE=(CYL,(300,100),RLSE)、DASD09 事前削除:No.14。利用:No.21 SORT3
  • JCL に SYSPRINT の DD がない。DISPLAY のメッセージはジョブログに出る。

2.3 入出力ファイルの違い

観点 INFILE(入力) OUTFILE(出力)
データセット WORK0620 KS60750J.WORK0050
中身 全店所の請求明細(見出し+明細の全データID) 見出しデータ(ID 00)のうち請求額が 0 でないものだけ
レコード長 80~560バイト(5種類) 560バイト(見出しデータのみ)
レイアウト SQALLHED/SQALLDTB/SQALLDTC/SQALLDTD/SDPSQALA SQALLHED のみ(内容は変えない)
件数 全件 請求先の数(請求額0を除く)程度
並び 配信店・請求先番号等の順 同左(後続の SORT3 で請求先番号順に並べ替え)

同じ WORK0620 から作られる他の中間ファイルとの違い:

ファイル 作成PG 抽出条件 中身
WORK062S KS60135P 郵送対象店所(SEQTRYTN)かつ 訂正以外 見出し+明細
KS60750J.WORK0050 KS60770P(本PG) 全店所。見出しのみ、請求額≠0 見出しのみ
  • 本PG は店所や優先印刷マスターでは絞り込まない。郵送集約の対象かどうかは、後続の KS60780P で KS60760P の対応表と突き合わせて決まる(推定)。

3. データ定義

3.1 入力エリア

名称 属性 内容
INAREA CHAR(560) VAR INFILE の読込域。OUTFILE にもそのまま書く
INARA DEF INAREA:DUMMYA BIN(15)+SQALLHED 見出し(ID 00)として参照
INARB/INARC/INARD/INARX DEF INAREA+SQALLDTB/SQALLDTC/SQALLDTD/SDPSQALA 宣言のみ(未使用)

参照する項目:

項目 位置 長さ 属性 用途
SDTADTID 33 2 PIC'(2)9' データID。全レイアウト共通の位置。00 のみ処理
SDTAUNTI 221 5 FIXED DEC(9) 鑑:運賃
SDTARYOK 226 5 FIXED DEC(9) 鑑:料金
SDTATTAX 231 5 FIXED DEC(9) 鑑:消費税
SDTAHOKR 236 5 FIXED DEC(9) 鑑:保険料
  • 請求額の計算式(運賃+料金+消費税+保険料)は、KS60151P・KS60152P が請求書4行目に印字する「ご請求額」と同じ。

3.2 ワークエリア

名称 属性 初期値 内容
EOF_SW BIT(1) '1'B INFILE の終了で '0'B
WKSYUJ FIXED DEC(9) 0 請求額(運賃+料金+消費税+保険料)
ICNT FIXED DEC(9) 0 入力件数(★ 加算されない)
OCNT FIXED DEC(9) 0 出力件数
CCNT、OUT_SW、II - - 未使用

4. 処理フロー

開始
 ├─ ON ENDFILE(INFILE) → EOF_SW='0'B
 ├─ OPEN INFILE、OUTFILE
 ├─ INFILE を1件読む
 ├─ DO WHILE(INFILE が終わるまで)
 │     SDTADTID = 00 ?
 │       ├ YES → WKSYUJ ← SDTAUNTI+SDTARYOK+SDTATTAX+SDTAHOKR
 │       │        WKSYUJ ≠ 0 なら OUTFILE に INAREA を WRITE、OCNT +1
 │       └ NO  → 何もしない(明細データ)
 │     INFILE を1件読む
 │  END
 ├─ DISPLAY 入力件数・出力件数
 ├─ CLOSE INFILE、OUTFILE
終了

5. 処理詳細

5.1 主処理

手順 内容
1 SDTADTID(33~34バイト目)が 00 か判定する。00 以外は何もしない
2 WKSYUJ ← SDTAUNTI + SDTARYOK + SDTATTAX + SDTAHOKR
3 WKSYUJ ≠ 0 なら WRITE FILE(OUTFILE) FROM(INAREA)(見出しデータを長さ・内容そのままで書く)、OCNT +1
4 INFILE を1件読む
  • 請求額がマイナス(訂正などで返金になる請求先)も「0 でない」ので出力される。
  • 請求額が 0 の請求先(請求する金額がない請求先)は出力されない。
  • 歩引(SDTAAAAA)、再計算税(SDTAATAX)、サーチャージ(SDTATENK)は計算に含めない。
  • ★ 4項目の合計が 9桁(999,999,999)を超えると、SIZE 条件が既定で無効のため上位桁が切り捨てられる。現実的な金額では起こらない。
  • ★ 見出しデータの金額項目に正しいパック10進でない値があると、データ例外(0C7)で異常終了する。

5.2 終了処理

  1. 次の2行を DISPLAY する。
    • <<< INPUT COUNT = ∥ ICNT
    • <<< OUTPUT COUNT = ∥ OCNT
  2. INFILE と OUTFILE を CLOSE する。
  • ★ ICNT は加算する処理がないため、INPUT COUNT は常に 0 と表示される。入力件数の確認には使えない。

6. 入出力イメージ

6.1 入力(WORK0620)と出力(WORK0050)の対比

No 配信店 請求先番号 データID 内容 請求額(運賃+料金+税+保険) 判定 出力
1 1001 1234567-00001 00 見出し 48,840 0 でない ○
2~4 1001 1234567-00001 01 送り状明細 - 明細のため対象外 ×
5 1001 1234567-00002 00 見出し 0 請求額 0 ×
6 1001 1234567-00002 01 送り状明細 - 対象外 ×
7 1001 2345678-00000 00 見出し −1,100 0 でない(マイナス) ○
8 1001 2345678-00000 33 一括訂正 - 対象外 ×
9 1002 3456789-00000 00 見出し 12,000 0 でない ○
10 1002 3456789-00000 45 POSメイト等 - 対象外 ×
11 1305 4567890-00000 00 見出し 3,300 0 でない ○
  • 出力の4件は、入力の見出しデータ(560バイト)とバイト単位で同じ。並びも入力の順のまま。
  • 配信店による絞り込みはないため、郵送対象店所(SEQTRYTN)以外の配信店(例:1002)も出力される。

6.2 出力ファイルのイメージ(レコードの先頭部分)

位置  1   5         15      22         33 35
      配信 予備       請求先番号 区分       ID …(以下 SQALLHED の見出し項目、全560バイト)
No.1  1001          (パック)  (空白)     00 …
No.7  1001          (パック)  (空白)     00 …
No.9  1002          (パック)  (空白)     00 …
No.11 1305          (パック)  (空白)     00 …
  • 15~21バイト目の請求先番号はパック10進(7バイト)のため、文字としては読めない。
  • 見出しデータ全体のダンプイメージは、KS60144 出力ファイル解説 10.3(2) の「見出しデータ(請求先A)」と同じ形式。

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

<<<  INPUT COUNT =            0
<<< OUTPUT COUNT =            4
  • ★ INPUT COUNT は入力件数(11件)に関係なく 0 になる(5.2)。

6.4 参考:後続 SORT3 のキー

  • SORT FIELDS=(19,8,PD,A):可変長レコードの4バイトのレコード長部(RDW)を含む位置のため、データの 15~22バイト目(8バイト)をパック10進として比較する。
  • 請求先番号 SDTASQNO は 15~21バイト目(7バイト)で、22バイト目は区分(SDTASPA1)の先頭バイトである。
  • ★ キーの長さが請求先番号より1バイト長く、区分の1バイト目がパック10進の最終桁(符号部)として扱われる。見出しデータの区分の先頭は通常空白(X'40')のため、並びは実質的に請求先番号順になると考えられるが、DFSORT のパック10進の扱いによっては順序が変わる可能性がある(要確認)。

7. 異常処理

事象 検出 処理
INFILE の終了 ENDFILE 条件 EOF_SW='0'B でループを終える(正常)
INFILE が0件 なし 出力0件で正常終了
金額項目が不正なパック10進 データ例外(0C7) ON 定義なし → 異常終了
その他 - ON ERROR の定義なし → PL/I 標準のエラー処理(異常終了)
リターンコード - 設定なし(正常時は 0)

8. 留意事項(★)

  1. INPUT COUNT が常に 0:ICNT の加算がない(5.2)。
  2. 請求額 0 の請求先は後続に渡らない:0円の請求先は、事業所用・エコデリバー用の配信帳票(KS60790P)の対象にならない(推定)。一方、KS60144P・KS60151P・KS60152P の請求書は請求額 0 でも作られるため、扱いが異なる。
  3. マイナスの請求額は出力される。
  4. 請求額にサーチャージ・歩引を含めない:KS60151P の「ご請求額」と同じ式だが、サーチャージ(SDTATENK)がある請求先でも、4項目の合計が 0 なら出力されない。
  5. 後続 SORT3 のキー長(6.4)。
  6. SYSPRINT の DD がない:メッセージはジョブログに出る。
  7. 未使用の変数:CCNT、OUT_SW、II(KS60135P と同じパターンからの流用と推定)。

9. 未使用項目

項目 内容
INARB、INARC、INARD、INARX 各レイアウトの重ね定義(SDTADTID は INARA の名前で参照)
SQALLHED の SDTADTID、SDTAUNTI、SDTARYOK、SDTATTAX、SDTAHOKR 以外 参照なし(出力にはそのまま含まれる)
ICNT 表示のみ(加算なし)
CCNT、OUT_SW、II 宣言のみ
BUILTIN の ADDR、SUBSTR、HIGH、LOW、LENGTH、STRING、VERIFY、UNSPEC 宣言のみ

付録A SQALLHED(見出し、データID 00、560バイト)

LV 項目名 属性 繰返し 位置 長さ 本PGでの使用
02 SDTASHTN PIC'(4)9' 1 4
02 SDTAKKKK CHAR(10) 5 10
02 SDTASQNO FIXED DEC(13) 15 7
02 SDTASPA1 CHAR(11) 22 11
02 SDTADTID PIC'(2)9' 33 2 データID:00 のレコードだけ対象
02 SDTAKARI PIC'(1)9' 35 1
02 SDTADPKB PIC'(1)9' 36 1
02 SDTAYYMM PIC'(4)9' 37 4
02 SDTAHYMD PIC'(6)9' 41 6
02 SDTACKTT PIC'(4)9' 47 4
02 SDTAKIKN (集団項目) 51 12
03  SDTAKYMD PIC'(6)9' 51 6
03  SDTASYMD PIC'(6)9' 57 6
02 SDTASQN1 CHAR(8) 63 8
02 SDTASQNI CHAR(64) 71 64
02 SDTASQN2 CHAR(5) 135 5
02 SDTASQNM CHAR(36) 140 36
02 SDTAPKEI PIC'(1)9' 176 1
02 SDTAPKBN CHAR(1) 177 1
02 SDTAHYOG (集団項目) 178 20
03  SDTANNNO PIC'(1)9' 20 178 1×20=20
02 SDTABIKB PIC'(1)9' 198 1
02 SDTAZKIN PIC'(1)9' 199 1
02 SDTAZKI1 PIC'(1)9' 200 1
02 SDTAJIKB PIC'(1)9' 201 1
02 SDTABBKB PIC'(1)9' 202 1
02 SDTAHHTN PIC'(4)9' 203 4
02 SDTASPAC CHAR(14) 207 14
02 SDTAHEAD (集団項目) 221 340
03  SDTAMTTO (集団項目) 221 30
04   SDTAUNTI FIXED DEC(9) 221 5 請求額の計算(運賃)
04   SDTARYOK FIXED DEC(9) 226 5 請求額の計算(料金)
04   SDTATTAX FIXED DEC(9) 231 5 請求額の計算(消費税)
04   SDTAHOKR FIXED DEC(9) 236 5 請求額の計算(保険料)
04   SDTAAAAA FIXED DEC(9) 241 5
04   SDTAATAX FIXED DEC(9) 246 5
03  SDTAYUNN CHAR(7) 251 7
03  SDTAYUNO PIC'(5)9' 258 5
03  SDTAJKAN (集団項目) 263 124
04   SDTAJKA1 CHAR(34) 263 34
04   SDTAJKA2 CHAR(38) 297 38
04   SDTAJKA3 CHAR(52) 335 52
03  SDTAJKNA (集団項目) 387 129
04   SDTAJKN1 CHAR(32) 387 32
04   SDTAJKN2 CHAR(47) 419 47
04   SDTAJKN3 CHAR(50) 466 50
03  SDTADTEL CHAR(12) 516 12
03  SDTABANK FIXED DEC(7) 528 4
03  SDTAKONO PIC'(1)9' 532 1
03  SDTAKOBA FIXED DEC(9) 533 5
03  SDTABAN1 FIXED DEC(7) 538 4
03  SDTAKON1 PIC'(1)9' 542 1
03  SDTAKOB1 FIXED DEC(9) 543 5
03  SDTATKB3 PIC'(1)9' 548 1
03  SDTATENK FIXED DEC(9) 549 5
03  SDTASPA2 CHAR(7) 554 7

付録B SQALLDTB(送り状明細、データID 01・21・31・95、230バイト)

LV 項目名 属性 繰返し 位置 長さ 本PGでの使用
02 SDTBSEHT PIC'(4)9' 1 4
02 SDTBKKKK CHAR(10) 5 10
02 SDTBSENO FIXED(13) 15 7
02 SDTBPSEQ CHAR(11) 22 11
02 SDTBDTID PIC'(2)9' 33 2 (SDTADTID として参照)
02 SDTBYYMD FIXED(7) 35 4
02 SDTBMOCH PIC'(1)9' 39 1
02 SDTBOKRN FIXED(11) 40 6
02 SDTBRECT PIC'(1)9' 46 1
02 SDTBTENS FIXED(5) 47 3
02 SDTBMONI (集団項目) 50 29
03  SDTBCHCD FIXED(5) 50 3
03  SDTBNIAD CHAR(12) 53 12
03  SDTBNINA CHAR(14) 65 14
02 SDTBKOSU FIXED(5) 79 3
02 SDTBKKGG FIXED(5) 82 3
02 SDTBKEIY (集団項目) 85 8
03  SDTBUUNN FIXED(7) 85 4
03  SDTBRYKE FIXED(7) 89 4
02 SDTBTATE FIXED(7) 93 4
02 SDTBWARI FIXED(5) 97 3
02 SDTBHOKN (集団項目) 100 7
03  SDTBFUTT PIC'(1)9' 100 1
03  SDTBKING FIXED(5) 101 3
03  SDTBEENN FIXED(5) 104 3
02 SDTBDAII (集団項目) 107 13
03  SDTBDAKU PIC'(1)9' 107 1
03  SDTBDAKI FIXED(7) 108 4
03  SDTBRONN FIXED(7) 112 4
03  SDTBTESO FIXED(7) 116 4
02 SDTBRYRY (集団項目) 120 44
03  SDTBWAWA (集団項目) 120 9
04   SDTBWAHA FIXED(5) 120 3
04   SDTBWACH FIXED(5) 123 3
04   SDTBWAFU FIXED(5) 126 3
03  SDTBTESU (集団項目) 129 6
04   SDTBTECH FIXED(5) 129 3
04   SDTBTERE FIXED(5) 132 3
03  SDTBSHSH FIXED(5) 135 3
03  SDTBHHAI FIXED(5) 138 3
03  SDTBKOSO FIXED(7) 141 4
03  SDTBCHOS FIXED(5) 145 3
03  SDTBKONP FIXED(7) 148 4
03  SDTBYUDO FIXED(7) 152 4
03  SDTBETCC FIXED(7) 156 4
03  SDTBYOBI FIXED(7) 160 4
02 SDTBKIRO (集団項目) 164 8
03  SDTBKISH FIXED(3) 164 2
03  SDTBKKRO FIXED(5) 166 3
03  SDTBKICC FIXED(5) 169 3
02 SDTBAINI CHAR(14) 172 14
02 SDTBSEKU CHAR(10) 186 10
02 SDTBTANO CHAR(13) 196 13
02 SDTBHNCD FIXED(7) 209 4
02 SDTBTELL CHAR(10) 213 10
02 SDTBJIKB PIC'(1)9' 223 1
02 SDTBBTAX FIXED(7) 224 4
02 SDTBSPAC CHAR(3) 228 3

付録C SQALLDTC(一括付替・訂正、データID 22・33、80バイト)

LV 項目名 属性 繰返し 位置 長さ 本PGでの使用
02 SDTCSEHA PIC'(4)9' 1 4
02 SDTCKKKK CHAR(10) 5 10
02 SDTCSENO FIXED(13) 15 7
02 SDTCETCC CHAR(11) 22 11
02 SDTCDDID PIC'(2)9' 33 2 (SDTADTID として参照)
02 SDTCTETU FIXED(7) 35 4
02 SDTCTTTN FIXED(5) 39 3
02 SDTCUNCH FIXED(9) 42 5
02 SDTCUNZK FIXED(9) 47 5
02 SDTCOLDS FIXED(13) 52 7
02 SDTCRIYU PIC'(2)9' 59 2
02 SDTCAINA CHAR(14) 61 14
02 SDTCJIKB PIC'(1)9' 75 1
02 SDTCSPAC CHAR(5) 76 5

付録D SQALLDTD(POSメイト等、データID 45・55・65、90バイト)

LV 項目名 属性 繰返し 位置 長さ 本PGでの使用
02 SDTDSEHA PIC'(4)9' 1 4
02 SDTDKKKK CHAR(10) 5 10
02 SDTDSENO FIXED(13) 15 7
02 SDTDETCC CHAR(11) 22 11
02 SDTDDDID PIC'(2)9' 33 2 (SDTADTID として参照)
02 SDTDYYYY FIXED(7) 35 4
02 SDTDYUDA FIXED(9) 39 5
02 SDTDMUDA FIXED(9) 44 5
02 SDTDUNCH FIXED(9) 49 5
02 SDTDUNZK FIXED(9) 54 5
02 SDTDSONO FIXED(9) 59 5
02 SDTDJIKB PIC'(1)9' 64 1
02 SDTDSPAC CHAR(26) 65 26

付録E SDPSQALA(デパート請求、データID 02、100バイト)

LV 項目名 属性 繰返し 位置 長さ 本PGでの使用
02 SSALSEHA PIC'(4)9' 1 4
02 SSALKKKK CHAR(10) 5 10
02 SSALSENO FIXED(13) 15 7
02 SSALPSEQ CHAR(11) 22 11
02 SSALDDID PIC'(2)9' 33 2 (SDTADTID として参照)
02 SSALUKET (集団項目) 35 7
03  SSALUKYM FIXED(7) 35 4
03  SSALUKTE FIXED(5) 39 3
02 SSALMIUN (集団項目) 42 10
03  SSALUNCN FIXED(9) 42 5
03  SSALRYOK FIXED(9) 47 5
02 SSALWARI FIXED(7) 52 4
02 SSALHONA (集団項目) 56 8
03  SSALHOKN FIXED(7) 56 4
03  SSALHOKE FIXED(7) 60 4
02 SSALDAIB (集団項目) 64 28
03  SSALDAII (集団項目) 64 14
04   SSALDAKI FIXED(9) 64 5
04   SSALDARO FIXED(9) 69 5
04   SSALDASO FIXED(7) 74 4
03  SSALDABE (集団項目) 78 14
04   SSALDABN FIXED(9) 78 5
04   SSALDABS FIXED(9) 83 5
04   SSALDABT FIXED(7) 88 4
02 SSALMAIS FIXED(7) 92 4
02 SSALJIKB PIC'(1)9' 96 1
02 SSALSPAC CHAR(4) 97 4
(1-1/2)