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

212 lines
8.2 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 画面設計書 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 同型)