This commit is contained in:
guanxiangwei
2026-08-27 11:27:47 +09:00
parent 1fead85505
commit 060b7bf1fa
16 changed files with 1321 additions and 22 deletions
@@ -0,0 +1,164 @@
# 画面設計書 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)の意味
```sql
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() による一意化
```sql
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 条件 — 設計の核
```sql
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 では判定材料にしない(「存在するか」だけ)
@@ -0,0 +1,212 @@
# 画面設計書 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 (防重首行)
```sql
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)
```sql
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 同型)