Files
updsv7-rag/標準版/給与システム/business/画面設計書_QYO00070_基準情報登録_業務解析.md
guanxiangwei 060b7bf1fa init
2026-08-27 11:27:47 +09:00

8.2 KiB
Raw Permalink Blame History

画面設計書 QYO00070 基準情報登録 — 画面更新 → qinp1020 → xkkijun 業務解析

Description

  • 画面:QYO00070 基準情報登録
  • 业务语义:画面から給与計算基準情報(xkkijun 系列)の各项目値を変更した際、qinp1020 を経由して状態 machine で反映する2 段 commit パターン
  • 該当 SQL:INSERT 1 本 + UPDATE 1 本 (画面操作 1 回 = 2 クエリ)
  • 関連表:
    • qinp1020 (入力更新 状態 machine バッファ + 監査)
    • xkkijun (本番基準表、qinp1020 経由で更新)
  • 所属:UPDS-V7 給与システム

Key Facts

  • 画面 1 回更新で qinp1020 に 2 回アクセス (INSERT + UPDATE)
  • INSERT は防重 + 履歴行作成、UPDATE は実 payload 書き込み + 状態 machine 9→3 巻き戻し
  • 動的列 SET(「更新項目ID」=「項目値」)= xkkijun 200 槽位五花(ccode/cname/nnumber/ddate/nflag)のうち 1 列だけ書換

SQL 1: INSERT (防重首行)

INSERT INTO QINP1020(
    CCOMPKB,
    CQTAIKEIKB,
    DGAITONG,
    CSHAINNO,
    NMSGSHUB,
    CMSG,
    NMNFLG,
    NMNDATASHUB,
    NSTATEFLG,
    CCOLUMNID,
    DINSDATE,
    NINSSEQ
)
SELECT 
    入力パラメータ「会社区分」,
    '00',
    入力パラメータ「該当年月」,
    入力パラメータ「職員番号」,
    0,
    NULL,
    0,
    0,
    9,
    入力パラメータ「カラムID」,
    SYSDATE,
    0
FROM DUAL
WHERE
    Not Exists(
        SELECT 1 FROM QINP1020
        WHERE
            CCOMPKB = 入力パラメータ「会社区分」
            and CQTAIKEIKB = 入力パラメータ「給与体系区分」
            and DGAITONG = 入力パラメータ「該当年月」
            and CSHAINNO = 入力パラメータ「職員番号」
            and NMNFLG = 0
            and NMSGSHUB < 9
            and NSTATEFLG = 9
            and CCOLUMNID = 入力參參名「カラムID」
    );

業務読み取り

HEAD PK (固定):

  • CCOMPKB = 会社区分(入力)
  • CQTAIKEIKB = '00'(給与体系 = 00 固定 ハードコード)
  • DGAITONG = 該当年月(入力)
  • CSHAINNO = 職員番号(入力)

初期値:

  • NMSGSHUB = 0 (メッセージ種別 = 正常)
  • CMSG = NULL (メッセージなし)
  • NMNFLG = 0 (更新フラグ OFF)
  • NMNDATASHUB = 0 (データ種別 = INS = 新規)
  • NSTATEFLG = 9 (★状態フラグ = 更新終了)
  • CCOLUMNID = 対象カラムID
  • DINSDATE = SYSDATE (初回登録日時)
  • NINSSEQ = 0 (画面登録、取込ではない)

Not Exists 防重条件:

HEAD PK 一致 AND
NMNFLG = 0        -- 更新フラグ OFF
AND NMSGSHUB < 9  -- メッセージ種別 がエラー(9)以外
AND NSTATEFLG = 9  -- 既に「更新終了」状態
AND CCOLUMNID = 対象カラムID

→ 「同項目が既に"更新終了(NSTATEFLG=9)" + 正常(NMSGSHUB<9) で残ってたら INSERT しない」。

SQL 2: UPDATE (状態巻き戻し + 実 payload)

UPDATE QINP1020
SET 
    CCOLUMNID = 入力パラメータ「カラムID」,
    CCOLUMNNM = 入力パラメータ「項目名」,
    入力パラメータ「更新項目ID」 = 入力パラメータ「項目値」,
    CJTOQKB = 入力パラメータ「停止種別」,
    CJTOQNM = 入力パラメータ「停止名称」,
    NJTOQFLG = 入力パラメータ「停止フラグ」,
    NMSGSHUB = 0,
    CMSG = NULL,
    NMNFLG = 0,
    NMNDATASHUB = 1,
    NSTATEFLG = 3,
    CMNCLIENT = 入力パラメータ「端末ID」,
    CMNCOMP = 入力パラメータ「会社区分」,
    CMNUSER = 入力パラメータ「ログインユーザID」,
    DMNDATE = SYSDATE
WHERE 
    CCOMPKB = 入力パラメータ「会社区分」
    and CQTAIKEIKB = '00'
    and DGAITONG = 入力パラメータ「該当年月」
    and CSHAINNO = 入力パラメータ「職員番号」
    and NMNFLG = 0
    and NMSGSHUB < 9
    and NSTATEFLG = 9
    and CCOLUMNID = 入力パラメータ「カラムID」;

業務読み取り

SET 内容分類:

  1. 識別情報 (4 列):

    • CCOLUMNID = 対象カラムID (上書き確認)
    • CCOLUMNNM = 項目名(冗長表示名)
  2. 動的列 SET ★:

    • 入力パラメータ「更新項目ID」 = 入力パラメータ「項目値」
    • 「更新項目ID」が動的に変わる = 5 種(ccode/cname/nnumber/ddate/nflag) × 200 槽のうち 1 列だけ書換
    • 例:「更新項目ID=ccode05」 → SET ccode05 = 'XX'
    • 例:「更新項目ID=nflag12」 → SET nflag12 = 1
    • 例:「更新項目ID=nnumber05」 → SET nnumber05 = 5000
  3. 連携停止制御 (3 列、xkkijunctl 同型):

    • CJTOQKB = 停止種別 (01:当月のみ / 02:当月以降)
    • CJTOQNM = 停止名称
    • NJTOQFLG = 停止フラグ (0:非停止 / 1:停止)
  4. 状態 machine 遷移 ★:

    • NMSGSHUB = 0 (メッセージ種別クリア → 正常化)
    • CMSG = NULL (メッセージ内容クリア)
    • NMNFLG = 0 (更新フラグ OFF)
    • NMNDATASHUB = 1 (データ種別 = UPD = 上書き)
    • NSTATEFLG = 3 (★ 9 → 3 巻き戻し = 「更新終了 → エラーチェック前」)
  5. ログ列 (4 列):

    • CMNCLIENT / CMNCOMP / CMNUSER / DMNDATE = 端末/会社/ユーザ/更新日時

WHERE = SQL1 の Not Exists と同じ条件:

HEAD PK + NMNFLG=0 + NMSGSHUB<9 + NSTATEFLG=9 + CCOLUMNID 一致

2 段構成の意図 (qinp1020 状態 machine 連動)

qinp1020 状態値:

  • 0 = 取込後(取込完了、未チェック)
  • 3 = エラーチェック前(これから検証する)
  • 6 = エラーチェック後(検証済、反映待ち)
  • 9 = 更新終了(xkkijun 反映完了)

画面操作フロー:

[画面: 项目値変更(例 ccode05='XX')]
    ↓
[STEP 1: INSERT]
    HEAD PK + CCOLUMNID で NSTATEFLG=9 + 正常 の既存レコードが
    無ければ 新規 INSERT (NMNDATASHUB=0=INS, NSTATEFLG=9=更新終了)
    ↓
[STEP 2: UPDATE]
    既存 NSTATEFLG=9 レコードを
        NSTATEFLG=3 (エラーチェック前) に巻き戻し
        NMNDATASHUB=1 (UPD) に上書きモード
        動的列(payload)のみ更新
        ログ列書換
    ↓
[バッチ / 別プロセス]
    NSTATEFLG=3 → 6 (エラーチェック通過)
    NSTATEFLG=6 → xkkijun 本反映
    NSTATEFLG=6 → 9 (更新終了)

核心設計意図:

  1. 画面から xkkijun を直接 UPDATE しない。必ず qinp1020 経由
  2. qinp1020 = 入力更新の監査/履歴 + 一時バッファ + 状態 machine 制御 の3 役同時
  3. 画面操作は 状態 machine を介さず 即「9 (更新終了)」 INSERT し、後で「9 → 3」巻き戻し
  4. Not Exists で 同項目 重複登録 防止 (HEAD PK + CCOLUMNID + NSTATEFLG=9 + 正常)

不明点 (私が SQL 全体から読めない部分)

  1. Step 1 で NSTATEFLG=9 を直接 INSERT する設計の意味 — 普通 INSERT 直後は 0 か 3。「9 を INSERT」は「画面操作は状態 machine を介さず即完了とみなす」という業務ルール?それとも Step 2 で 9→3 に巻き戻すことで「画面側で扱うには 9 が開始点」というマーカー?

  2. NMNFLG=0 の意味 — "0 で更新しない"という意味?それとも"画面更新モード"のフラグ?NMNFLG 列だけ意味が読み切れない

  3. NMNDATASHUB=0(INS) / 1(UPD) / 2(DEL) / 3(間接DEL) のうち画面操作は INS(0) と UPD(1) しか使わない — DEL は batch 経由?

  4. NMSGSHUB < 9 の意味 — "メッセージ種別 が 9(エラー) 以外" = 「正常/警告レコードを巻き戻し対象にする、エラー状態のレコードは触らない」

  5. UPDATE の WHERE に NMNDATASHUB の条件が無い — UPD(1) で前回更新された行でも問答無用で NSTATEFLG=3 巻き戻し。何度も画面更新すると毎回 9→3 に戻る → NMNDATASHUB=0 が永久に増えない。履歴用途なら NMNDATASHUB=0 だけの初期 INSERT が"原本"でその後毎回 1=UPD がカウントされるが、NMNDATASHUB のカウントがどこで使われるか不明。

Relations

  • 上位システム:UPDS-V7 給与システム
  • 画面:QYO00070 基準情報登録
  • 入力バッファ:qinp1020 (画面 → qinp1020 → xkkijun の中継 + 状態 machine)
  • 本番基準:xkkijun (200 槽位五花)
  • 連携停止制御:xkkijunctl (qinp1020 に cjtoqkb/cjtoqnm/njtoqflg 3 列 同型組込)
  • 同 PK 头部系列:xkkijunhw / xkkihon / xkkijunctl (CCOMPKB/CQTAIKEIKB/DGAITONG/CSHAINNO 同型)