Files
updsv7-rag/標準版/給与システム/business/画面設計書_QCL00030_退職後一括更新(給与)_02_一括更新対象職員一覧の取得SQL.md
T
guanxiangwei 060b7bf1fa init
2026-08-27 11:27:47 +09:00

7.8 KiB
Raw Blame History

画面設計書 QCL00030 退職後一括更新(給与) — 02_一括更新対象職員一覧の取得SQL

1. SQL 全景

SELECT
    CSHAINNO,           -- 職員番号
    CNAMEKNJ,           -- 漢字氏名
    BKYK_CDE,           -- 部局コード
    BKYK_NME,           -- 部局名称
    DTAISHA,            -- 退職年月日
    CMNUSER,            -- 更新ユーザ
    DMNDATE,            -- 更新年月日
    NJINJIFLG,          -- 人事クリア
    NQYOCALCFLG         -- 給与計算フラグ
FROM (
    SELECT
        A.CSHAINNO, A.CNAMEKNJ, A.BKYK_CDE, A.BKYK_NME, A.DTAISHA,
        L.CMNUSER, L.DMNDATE,
        DECODE(J.CSHAINNO, NULL, NULL, '済') NJINJIFLG,
        A.NQYOCALCFLG,
        ROW_NUMBER() OVER(PARTITION BY A.CSHAINNO ORDER BY L.DMNDATE DESC) RID
    FROM XKKIHON A
    LEFT JOIN (
        SELECT CSHAINNO FROM DJND7500LOG
        WHERE CCOMPKB  = 入力パラメータ「会社区分」
          AND CTEIINKB = 入力パラメータ「定員区分」
        GROUP BY CSHAINNO
    ) J
        ON J.CSHAINNO = A.CSHAINNO
    LEFT JOIN UCLR1000LOG L
        ON L.CCOMPKB  = A.CCOMPKB
       AND L.CSHAINNO = A.CSHAINNO
       AND L.DTAISHA  = A.DTAISHA
    WHERE
        A.CCOMPKB    = 入力パラメータ「会社区分」
        AND A.CQTAIKEIKB = 入力パラメータ「体系区分」
        AND A.DGAITONG   = 入力パラメータ「該当年月」
        AND A.NQSHOYOKB  = 入力パラメータ「給与賞与区分」
        AND A.NQSHOYOSEQ = 0
        AND A.DTAISHA >= 入力パラメータ「開始退職年月日」
        AND A.DTAISHA <= 入力パラメータ「終了退職年月日」
        AND (
              (入力パラメータ「定員区分」='1' AND A.CTEIINKB = '1')
           OR (入力パラメータ「定員区分」<>'1' AND A.CTEIINKB <> '1')
        )
)
WHERE RID = 1

2. 業務位置づけ

  • 機能 ID: QCL00030 退職後一括更新(給与)
  • 用途: 「退職後一括更新」実行画面の一覧グリッド表示用 SELECT
  • 入力: 会社区分 / 体系区分 / 該当年月 / 給与賞与区分 / 定員区分 / 開始退職年月日 / 終了退職年月日
  • 出力: 当該会社/処理月の退職者一覧(職員番号/氏名/部局/退職日/更新者/更新日時/人事クリア済フラグ/給与計算フラグ)
  • 後続: 一覧確認後にユーザが「一括更新実行」押下 → 03_給与一括更新実行SQL が本一覧の CSHAINNO 群に対して走る

3. 結合 3 表の物理構造

エイリアス 物理表 行粒度 主役役割
A XKKIHON 社員×処理月×給与賞与 退職者抽出の母集団
J DJND7500LOG 社員単位(GROUP BY 済) 人事クリア済フラグ生成源
L UCLR1000LOG 社員×処理月×退職日 給与クリア実行の最新履歴(操作者/日時)

XKKIHON(情報スキーマ実測 2026-08-20)

  • NOT NULL: ccompkb(2), cqtaikeikb(2), dgaitong(date), nqshoyokb, nqshoyoseq, cshainno(10)
  • dtaisha(date) は NULLABLE — 同処理月内に同社員の複数 dtaisha 存在を許容
  • cteiinkb(varchar 10) — 他表は varchar(1) だが比較上は問題なし

DJND7500LOG(情報スキーマ実測)

  • ヘッダ 3 列 NOT NULL: ccompkb, cteiinkb, cshainno
  • cnameknj / bkyk_cde / bkyk_nme は冗長表示用(NULLABLE)
  • tsyk_dte / dtsyk_dte 等の他カラムは本 SQL では未参照
  • nclearflg01〜40: 人事系クリア対象 40 槽位フラグ

UCLR1000LOG(情報スキーマ実測)

  • ヘッダ 4 列 NOT NULL: ccompkb, cqtaikeikb, cteiinkb, cshainno
  • dtaisha(date) NULLABLE
  • nclearflg_s01〜s40: 給与支給 40 槽位、nclearflg_k01〜k40: 給与控除 40 槽位(合計 80 槽位五花)
  • njinjiflg は存在するが本 SQL では参照しない(L.CMNUSER/L.DMNDATE のみ使用)

4. SELECT 各列の意味

列 物理列 業務 semantic
CSHAINNO A.CSHAINNO 一覧キー(後続更新SQL の絞り込みキー)
CNAMEKNJ A.CNAMEKNJ 表示用氏名
BKYK_CDE A.BKYK_CDE 表示用部局コード
BKYK_NME A.BKYK_NME 表示用部局名称
DTAISHA A.DTAISHA 退職年月日 — 期間絞り込み対象
CMNUSER L.CMNUSER 給与クリア実行の最終操作者
DMNDATE L.DMNDATE 給与クリア実行の最終操作日時
NJINJIFLG DECODE(J.CSHAINNO, NULL, NULL, '済') 人事クリア済フラグ(後述)
NQYOCALCFLG A.NQYOCALCFLG 給与計算フラグ(給与計算実行済か)

5. NJINJIFLG(DECODE)の意味

DECODE(J.CSHAINNO, NULL, NULL, '済') NJINJIFLG
  • 副問合せ J は DJND7500LOG の存在チェック専用 — CSHAINNO 列だけを GROUP BY で取る
  • J.CSHAINNO = NULL → 人事クリア未実行 → 出力 NULL
  • J.CSHAINNO に値あり → 人事クリア実行済 → 出力 '済'
  • 一覧画面で「済」表示行はグレーアウト → 二重クリア防止 UI
  • DECODE は Oracle 関数。本番 Oracle 想定、CI 検証時は PostgreSQL

6. ROW_NUMBER() による一意化

ROW_NUMBER() OVER(PARTITION BY A.CSHAINNO ORDER BY L.DMNDATE DESC) RID
WHERE RID = 1
  • UCLR1000LOG は同社員で複数回クリア実行履歴が残り得る(再退職処理/修正実行)
  • 1 社員に対して複数行が JOIN されるのを防ぐため、最新 DMNDATE 行のみ採用
  • xkkihon.dtaisha が NULLABLE な点とも整合(同処理月内の同社員複数 dtaisha は RID=1 で代表 1 行に集約)

7. WHERE 句 9 条件の意味

# 条件 業務 semantic
1 A.CCOMPKB = 会社区分 会社ロック(ログイン所属会社)
2 A.CQTAIKEIKB = 体系区分 給与体系(一般/再任用/特地等)固定絞り込み
3 A.DGAITONG = 該当年月 退職処理を行う処理月(月末日)
4 A.NQSHOYOKB = 給与賞与区分 0=給与、1=賞与
5 A.NQSHOYOSEQ = 0 通常明細のみ。賞与明細(1〜n)は退職処理対象外
6 A.DTAISHA BETWEEN 開始/終了 画面で指定した退職日範囲内のみ抽出
7 定員区分 OR 条件 一般職/一般以外 の母集団切替(次節)

8. 定員区分 OR 条件 — 設計の核

AND (
      (入力パラメータ「定員区分」='1' AND A.CTEIINKB = '1')
   OR (入力パラメータ「定員区分」<>'1' AND A.CTEIINKB <> '1')
)
  • 定員区分='1' = 一般職員 → cteiinkb='1' のみ抽出
  • 定員区分<>'1' = 一般以外(再任用/特地/嘱託等)→ cteiinkb<>'1' を抽出
  • 業務 background: 一般職 と 一般以外で 退職後の社会保険/住民税/共済等の継続/停止が異なるため、一括更新バッチを分けて流す必要がある
  • 画面では「一般職一括更新」「一般以外一括更新」を別ボタンで起動する設計

9. 全体処理フロー(01〜04 接続)

[01_対象項目取得]   UCLR1000MST → クリア対象項目マスタ(40 槽位)
                          ↓ ccompkb, cteiinkb 共通
[02_対象職員一覧]   XKKIHON + DJND7500LOG + UCLR1000LOG  ← 本 SQL
                          ↓ cshainno 群
[03_一括更新実行]   UCLR1000LOG に INSERT(実行履歴) + xkkihon の各項目を CLEAR(NULL 化)
                          ↓ 槽位一致
[04_クリア対象項目] UCLR1000MST × UCLR1000LOG × xkkihon → クリア実行

10. 補足事項

  • DECODE / ROW_NUMBER / 副問合せ 等は Oracle 方言。本番は Oracle、CI は PostgreSQL(updsv7_opho_ci)で動作確認
  • ORDER BY なし — 一覧表示順は画面/MyBatis 側の default-sort で制御する設計
  • LIMIT/OFFSET なし — 一覧表示件数の paging は呼び側責務
  • DJND7500LOG 副問合せは CSHAINNO のみ取得 — 槽位フラグ(nclearflg01〜40)は本 SQL では判定材料にしない(「存在するか」だけ)