Files
updsv7-rag/標準版/汎用マスタ/entity/DJND4001_DJND4002_汎用マスタ通用字典知识点.md
T
guanxiangwei 060b7bf1fa init
2026-08-27 11:27:47 +09:00

135 lines
6.1 KiB
Markdown

# DJND4001 / DJND4002 汎用マスタ(通用字典)知识点
> 数据源:updsv7_opho_ci @ 192.168.1.72:5432 (opho profile の Postgres MCP)
> 表コメントは PG `pg_class.obj_description` より
## 1. 位置付け — 汎用マスタとは何か
DJND4001 と DJND4002 はどちらも **汎用マスタ**(generic / common code master)、すなわち「共通辞書」。
業務テーブルにある `cde_*` 系カラムの値は、すべてこの 2 テーブルを参照している。
- **DJND4001** = コードDB (コード値の本体:コード値ごとの表示名・有効期間)
- **DJND4002** = コード一覧DB (cde_sybt ごとの辞書定義:項目名・入力制御・桁数・表示順)
| 項目 | DJND4001 (コードDB) | DJND4002 (コード一覧DB) |
| ----------- | -------------------------- | ----------------------- |
| 行数 | 277,926 | 427 |
| 列数 | 43 | 111 |
| 一意制約 | `(cde_sybt, cde_val, dstart)` | `(cde_sybt)` |
## 2. 4 フィールドで必ず絞り込む(必須)
> 中文导览:查代码必须同时带 `(ccompkb, dstart, dend, cde_sybt)` 这四个字段,缺任何一个都会串到别的字典。
DJND4001 / DJND4002 を問わず、コードを特定するには **次の 4 フィールドを同時に指定** すること:
```
(ccompkb, dstart, dend, cde_sybt)
```
- `ccompkb` (2) — 会社区分
- `dstart` (date, NOT NULL in 4001) — 有効開始日
- `dend` (date, NOT NULL in 4001) — 有効終了日
- `cde_sybt` (3) — コード種別(辞書 ID)
**どれか 1 つでも欠けると、別の辞書に流れる(串数据)。**
ある日付時点で有効なコード値を引く書き方:
```sql
WHERE ccompkb = :ccompkb
AND cde_sybt = :cde_sybt
AND cde_val = :cde_val
AND dstart <= :date
AND dend >= :date
```
## 5. inp シリーズの値ルール(4002 全 inp に共通)
> 中文导览:inp 系列(全部统一)取值规则:`'000'` 表示直接文本输入,其它值表示引用别的 `cde_sybt`。
DJND4002 の **すべての inp 系カラム** — `inp0..inp12`、および `inp_name / inp_dname / inp_sname / inp_rname / inp_kname01/02/03` — は同じルール:
| 値 | 意味 |
| ------- | ----------------------------------------------------- |
| `'000'` | **入力文字列**(直接テキスト入力) |
| その他 | **他 汎用マスタ を参照**(当該 cde_sybt の値を引く) |
つまり:
- `inp0 = '000'` → nme0 はテキストボックス
- `inp0 = '597'` → nme0 はプルダウン、値は cde_sybt='597' (俸給月額) の 4001 から取る
4002 の 1 行で、4001 の項目が「テキスト」なのか「どの辞書を引きに行くのか」が分かる構造になっている。
## 6. 4001 ↔ 4002 の対応関係
```
4002 (cde_sybt ごとに 1 行) ──── 定義 ────► 4001 ((cde_sybt, cde_val) ごとに 1 行)
cde_nme name / dname / sname / rname / kname01..03
nme0..nme12 (項目名) dta1..dta12 (実データ)
use0..use12 (入力制御:必須/任意) — (対応なし、UI 層のバリデーション)
inp0..inp12 ('000' テキスト / 他 cde_sybt) — (形式定義のみ、実値は dta* 側)
ord0..ord12 (桁数) — (対応なし、UI 層の制約)
ctrl_cde1..5 (連携参照の定義) ctrl_cde1..5 (連携参照の実際の値)
disp_hyoji / disp_jun — (UI 表示制御のみ)
```
> 中文导览:`use` 是输入校验(必填/可选),`inp` 是输入形式(文本 vs 字典引用) — 不要混淆。
## 7. よく使うクエリテンプレート
### 7.1 ある cde_sybt の、ある日付時点で有効な全コード値
```sql
SELECT cde_val, name, dname, kname01
FROM djnd4001
WHERE ccompkb = '01'
AND cde_sybt = :cde_sybt
AND :date BETWEEN dstart AND dend
ORDER BY ord0, cde_val; -- 注:4001 自体に ord 列は無し、並び順は 4002 定義に依る
```
### 7.2 ある cde_sybt の項目定義(4002)
```sql
SELECT cde_nme, cde_exp, cde_num_nme,
nme0, use0, inp0, ord0,
nme1, use1, inp1, ord1,
-- ...
disp_hyoji, disp_jun
FROM djnd4002
WHERE ccompkb = '01'
AND cde_sybt = :cde_sybt
AND :date BETWEEN dstart AND dend;
```
### 7.3 ある項目がどの辞書を参照しているか
```sql
-- "cde_sybt=597 の nme5(俸給月額)が参照している辞書は?"
SELECT inp5 FROM djnd4002
WHERE ccompkb = '01' AND cde_sybt = '597';
-- inp5='000' → 直接入力;それ以外 → 参照先の cde_sybt
```
### 7.4 cde_sybt ごとの行数分布
```sql
SELECT cde_sybt, COUNT(*) AS cnt
FROM djnd4001
WHERE ccompkb = '01'
GROUP BY cde_sybt
ORDER BY cnt DESC;
-- 718 / 716 / 714 各 6607 行
-- 710 / 595 / 706 / 708 / 712 / 704 / 597 各 6542 行
-- 「同じ cde_sybt で行数が揃っている」ものは年度/版ごとに履歴を持っている典型例
-- → dstart / dend で世代を切り替えている
```
## 8. 注意点
- 現在の MCP 接続先は `updsv7_opho_ci`(CI 環境)。本ノートのデータ・インデックスはすべてこの DB 基準。
- 4001 の `dstart / dend` は **NOT NULL**。主表には必ず期間が入る。アプリ側で dstart が空に見えるケースは、ビューや作業テーブルを経由しているケースがほとんどで、生の 4001 を直接引いているのではない。
- 4001 の 277k 行のうち、`cde_sybt=718 / 716 / 714` 各 6607 行のように「同 cde_sybt で同数」になる分布 — これは典型的には「年度/版ごとに同じ構造の履歴を積み、`dstart / dend` で世代を分ける」設計のしるし。
- `use0..use12`(必須桁入力 / 必須入力 / 任意入力)は **入力値の検証**。一方、`inp0..inp12`(`'000'` / 他 cde_sybt)は **入力形式**(テキストか辞書参照か)で、別物。混同しないこと。
- `ctrl_cde1..5`(4002 側)と `ctrl_cde1..5`(4001 側)はそれぞれ「連携参照の定義」と「連携参照の実際の値」を担う両端。