135 lines
6.1 KiB
Markdown
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 側)はそれぞれ「連携参照の定義」と「連携参照の実際の値」を担う両端。 |