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