プロジェクト

全般

プロフィール

レビュー指摘 #11936 » KS60151P_KS60152P_差異分析.md

幸塚 和久, 2026-10-15 01:57 午後

 

KS60151P/KS60152P 差異分析報告書

項目 内容
対象 KS60151P(新請求書電子帳票出力:通常分)と KS60152P(新請求書電子帳票出力:エコデリバー分)
資料 KS60151P.txt(2,104行)、KS60152P.pl1(2,274行)、DAISEQ4J.jcl、上流確認用の KS60135P.pl1
体制 監督者が全体を統括し、作業者Aがソースから出力結果の差異を、作業者BがJCLから位置づけ・実行環境の差異を分析
作成日 2026-10-15

表記

  • 行番号は各ファイルの物理行です。「151 L○○」「152 L○○」はソース、「JCL L○○」は JCL の行です。
  • 推測を含む記述には「(推測)」と付けています。
  • KS60151P.txt は Shift-JIS で保存されているため、日本語コメントが文字化けしています。根拠にはコード部分だけを使いました。

1. 結論(要旨)

  1. 帳票を組み立てるロジックは実質的に同じです。 見出し、明細、計、改ページ、住所の分割などは、行単位で比較しても差がありません。違いは次の3点に集中しています。
    • どの顧客を、どのファイルに出すか
    • 1行目の店所コード(A-SPOOL の振分けキー)
    • 2行目の内容
  2. 出力の構成が違います。
    • 151 は2本です。全顧客を「控え」(KS601511)に出し、明細不要以外の顧客は「送付用」(KS601512)にも重ねて出します。
    • 152 は3本です。優先印刷マスター(VKSYUPR)に顧客があるかどうかで、出力先をどちらか一方に決めます。
      • マスターに無い顧客:インフォコム(KS601521)とインフォコム送付用(KS601523)
      • マスターに有る顧客:事業所送付用(KS601522)
      • 明細不要の顧客:どこにも出さない
  3. 152 だけが顧客法人管理マスター(VKCORPO)を読みます。 読んだ値で、2行目に集約代表コードを印字し、KS601521 の1行目の店所を代表扱い店に置き換えます。JCL の DD が増えているのは、VKCORPO と OUTFIL3 の2つだけです。
  4. 入力データの範囲が違います。 151 は全配信店分のデータを、訂正分も含めて読みます。152 は KS60135P が郵送対象店所(SEQTRYTN)に絞り、訂正(データID 31〜33)を除いたデータを読みます。そのため、郵送対象店所の請求先は、151 と 152 の両方の帳票に出ます。
  5. 要確認事項があります。
    • 152 には不具合の可能性が1件あります(§4 の D-11)。
    • 明細不要の顧客が帳票に一切出ない点は、仕様どおりか確認が必要です。
    • 再実行すると帳票が二重に配信されるリスクがあります。

2. JCL 上の位置づけ(作業者B)

2.1 データフロー

            TEMP.DAISEQ4J.WORK0620(全件・訂正を含む)
        ┌──────────────┴───────────────────────┐
  【通常分(特積)】                     【郵送/エコデリバー】
  KS60144P 1回目 (L460)                  KS60135P (L528)
        │                                 ・SEQTRYTN の店所の荷主だけ抽出
        │                                 ・データID 31〜33(訂正)を除外
        │                                       ▼ WORK062S ──▶ KS60630P (CSV)
        │                                KS60144P 2回目 (L545)
        ▼ WORK0635                              ▼ WORK0700
  KS60151P (L494)                        KS60152P (L579)
   OUTFILE → KS601511 控え                OUTFILE → KS601521 インフォコム
   OUTFIL2 → KS601512 送付用              OUTFIL2 → KS601522 事業所送付用
                                          OUTFIL3 → KS601523 インフォコム送付用

151 と 152 の間でデータの受け渡しはありません。共通の上流は WORK0620 だけです。

2.2 DD の比較

DD名 DSN/SYSOUT 151 152 備考
ALTFILE ADG.ALTLIB(SEQPRTNC) ○ L497 ○ L582 同じメンバー
SQHAIDA 151=WORK0635、152=WORK0700 ○ L498 ○ L583 DD名は同じで、DSN だけ異なる
VKTENMS/VKBANKM/VKSYUPR 店所マスター、銀行マスター、優先印刷マスター ○ ○ 同じ
VKCORPO VKAD.CORPOMAN.DTMASTER × ○ L590 152 だけ(152 L25 の宣言と一致)
MDMIKAN VKAD.MISYUKAN.DTMASTER ○ L505 ○ L591 どちらのソースにも宣言がない。外部手続き LKN0010 が使っていると推測
VKCHINM 地名マスター コメント化 コメント化 ソース側の READ もコメントアウトされている(151 L1725/152 L1888)
OUTFILE SYSOUT=(E,…,99) KS601511 KS601521
OUTFIL2 同上 KS601512 KS601522
OUTFIL3 同上 × KS601523 152 だけ(152 L28 の宣言と一致)

整合性チェックの結果

  • ソースで宣言しているのに JCL に DD が無いファイルは、2本ともありません。
  • JCL にだけあってソースに宣言が無いのは MDMIKAN だけです。

2.3 実行・運用面の差異と注意点

  • COND:各ステップに COND は指定されておらず、効くのは JOB 文の COND=(9,LT) だけです。そのため、151 が異常終了または RC≥10 になると、データ上は関係のない 152 も実行されません。
  • RC:どちらのソースにも RC を設定する処理(PLIRETC)がありません。異常で止まるのは ABEND のときだけです。
  • 再実行:どちらも SYSOUT に直接出力するため、再実行すると帳票が二重に配信されます。また KS60144P のステップ名が重複しているので(L460/L545)、RESTART でステップ名を指定すると、どちらの KS60144P から始まるかが一意に決まりません。
  • KS60144P の副出力:WORK0642・0646・0701・0702 は、151 と 152 のどちらでも読まれていません。JCL 全体でも、作成と SCRATCH の行にしか出てきません。
  • 後片付けの非対称:最終削除ステップ(L833〜838)は WORK0635 を消しますが、WORK0700 は消しません。

3. 出力結果の差異(作業者A)

3.1 顧客の状態と出力先

顧客の状態(優先印刷マスター VKSYUPR) KS60151P KS60152P
マスターに無い 控え(KS601511)+送付用(KS601512) KS601521+KS601523
マスターに有る(UPRNASKB≠'6') 控え+送付用 KS601522 だけ
マスターに有る(UPRNASKB='6':明細不要) 控えだけ(1行目57桁目に #) どこにも出さない

根拠:151 L556〜569、L648〜661/152 L572〜585、L676〜700

  • 151 の控え(OUTFILE)は、OUT_SW に関係なく全行を無条件に書き出します(151 L648〜649 ほか)。
  • 152 には無条件に書き出す行が無く、すべての WRITE が OUT_SW で振り分けられます。そのため、152 には全顧客分がそろった帳票がありません。

3.2 差異一覧

No 分類 KS60151P KS60152P 根拠
D-1 出力本数 2本(KS601511/512) 3本(KS601521/522/523) 151 L23〜24、152 L26〜28
D-2 振分け区分 OUT_SW 2値('1'=控え+送付、'0'=控えのみ) 3値('1'=OUTFILE+OUTFIL3、'2'=OUTFIL2、'0'=出力なし) 151 L556〜569/152 L572〜585
D-5 明細不要の顧客 控えに # を付けて出力する 出力しない。# を設定する処理は残っているが、使われない死にコードになっている(152 L655〜657)
D-7 1行目の店所CD 控え=発行店。送付用=条件を満たせば未収管理店(MISYU_TC) KS601521=代表扱い店(CORPZDTN)。KS601523=発行店。KS601522=151 の送付用と同じ規則 151 L622、L655〜656/152 L680〜685、L692〜693
D-8 2行目 西暦表示の案内文。最初のレコードの終了日が 190610 より後なら空白になるため、今のデータでは空白行 集約代表コード(7桁、ASA を除いた印字位置で126〜132桁)を3本すべてに出す 151 L122〜127、L531〜534/152 L131〜134、L601
D-9 参照マスター VKTENMS、VKBANKM、VKSYUPR 左記に加えて VKCORPO 152 L587〜597
D-10 CORPOMAN に該当が無いとき - 集約代表コード=自分の荷主CD、代表扱い店=発行店。このとき KS601521 と KS601523 は完全に同じ内容になる 152 L588、L591〜597
D-11 2ページ目以降の2行目 - 不具合の可能性あり(§4 参照) 152 L566〜601
D-12 OUTFIL3 の OPEN/CLOSE - OPEN 文と CLOSE 文に OUTFIL3 が無い。最初の WRITE で暗黙に開かれる 152 L514〜521、L2153〜2160
D-14 ALTFILE(SEQPRTNC) 送付用の1行目の店所置換にだけ効く 事業所送付用(KS601522)にだけ効く。インフォコム系の2本には効かない 151 L602〜618/152 L630〜646
D-15 0件のとき 入力が0件なら2本とも0行 入力が0件なら3本とも0行。顧客の構成によっては、一部の帳票だけ0行になりやすい

3.3 違いが無い部分

次の部分は、行単位で比較して差がないことを確認しています。

  • 出力行のレイアウト(OUT_2 を除く)
  • 1行目の編集(店所CD と # を除く)
  • 見出し2(1ページ目と2ページ目以降)
  • 検品料・サーチャージの処理
  • 小計・合計
  • 明細行
  • 改ページと行数の制御
  • 住所・荷主名の分割サブルーチン
  • マスターの読み方
  • エラー処理(ON ERROR が無いこと、PLIRETC が無いことを含む)

4. 監督者による検証結果

作業者の報告のうち、影響の大きいものについて、監督者がソースを直接確認しました。

対象 確認内容 結果
振分けロジック 151 L548〜662、152 L555〜700 を読み合わせた ✅ 作業者A・Bの報告どおり
VKCORPO と OUTFIL3 の宣言 152 L25、L28 ✅ 確認した
MDMIKAN 両ソースを Grep した ✅ どちらのソースにも宣言が無い
D-11 152 L566〜601 を確認した ✅ 作業者Aの指摘は正しい

D-11 の詳細(KS60152P の不具合の可能性)

  • 152 では、見出し1のたびに DISKEY = SQNO_1_7(自分の荷主CD)に戻しています(L567)。
  • 一方、VKCORPO を読んで DISKEY に集約代表コードを入れる処理(L587〜597)は、IF UPRNNICD = SYUKEY THEN ; ELSE DO … の ELSE 側の中(L568〜598)にあります。つまり、優先印刷マスターのキーが前回と変わったときにしか実行されません。
  • 優先印刷マスターに有る顧客(KS601522 に出る顧客)の場合、マスターの読み込みに成功するので UPRNNICD がこの顧客の荷主CDになります。そのため、同じ荷主の2回目以降の見出し1(2ページ目以降や枝番違い)では ELSE 側に入らず、2行目が集約代表コードではなく自分の荷主CDになります。
  • マスターに無い顧客(KS601521/523 に出る顧客)の場合、読み込みに失敗して UPRNNICD が更新されないため、見出し1のたびに読み直します。そのため、正しい値が出ます。
  • 既存の KS60152_詳細設計書.md 6.5 は、この現象がインフォコム側で起きると書いていますが、ソースとは逆です。設計書の修正が必要です。

5. 要確認事項(業務・運用担当への確認依頼)

No 内容 出典
1 D-11:152 の事業所送付用(KS601522)で、2ページ目以降の2行目が自分の荷主CDになる。不具合として扱うか、現行仕様として Java 移行でも同じ動きにするか A・監督者
2 152 では明細不要の顧客が帳票に一切出ない(151 では控えに # 付きで残る)。意図どおりか A
3 郵送対象店所の請求先は、151(特積)と 152(郵送)の両方に出る。しかも訂正を含むかどうかで、金額が違う帳票が2種類出る可能性がある。業務上の想定どおりか B
4 MDMIKAN が LKN0010 の内部で使われているか、LKN0010 のソースで確認する A・B
5 OUTFIL3 が OPEN 文から漏れている。対象が0件のとき、KS601523 が空の帳票として出るのかどうか、実機で確認する A・B
6 SYSOUT のライター名(KS601511〜523)が、A-SPOOL でどこへ振り分けられるか。インフォコム、NEOSS、事業所の対応を運用定義で確認する(本書の用途名は推測を含む) B
7 KS60144P の副出力(WORK0642/0646/0701/0702)がジョブの外で使われているか。WORK0700 などを最終削除しないのは意図的か B
8 ALTFILE が101件以上のとき、範囲外の TAB_PRTN(101) を参照する(151・152 共通)。KS60135P の SEQTRYTN テーブルには件数の上限チェックが無い A・B

6. 付録:作業の経過

担当 作業内容 所要時間
作業者B JCL・DD・データフローの分析。KS60135P も確認 約3分半(ツール操作23回)
作業者A 両ソースを全行読み、行単位の差分を取って確認 約5分(ツール操作30回)
監督者 主要な指摘をソースで裏付け、報告を統合 -

作業者ごとの詳細レポート(全差異 D-1〜D-15、要確認 Q-1〜Q-9、DD 整合性の全表)は、セッションの一時フォルダにあります。必要であれば作業フォルダにコピーします。

(4-4/4)