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,50 @@
## DJND4001 のカラム構成(コード値テーブル)
### 業務キー(有効期間)
- `ccompkb` varchar(2)
- `dstart` date NOT NULL
- `sstart` varchar(7)
- `dend` date NOT NULL
- `send` varchar(7)
- `start_dte` varchar(7) / `dstart_dte` date / `end_dte` varchar(7) / `dend_dte` date ← 予備の期間フィールド
### コード本体
- `cde_sybt` varchar(3) NOT NULL ← **コード種別**(辞書 ID)
- `cde_val` varchar NOT NULL ← **コード値**
- `name` varchar(160) ← 略称
- `dname` varchar(160) ← 詳細名
- `sname` varchar(160) ← 短縮名
- `rname` varchar(80)
- `kname01` varchar(160) ← カナ 1
- `kname02` varchar(160) ← カナ 2
- `kname03` varchar(160) ← カナ 3
- `dname_comment` varchar(80)
### 付帯データ
- `dta1`..`dta12` varchar(80) each、nullable
- `ctrl_cde1`..`ctrl_cde5` varchar(80) each、nullable ← 連携制御コード(他辞書への参照)
### 監査
- `kosin_usr` varchar(12) NOT NULL
- `kosin_pgm` varchar(12) NOT NULL
- `last_dte` timestamp NOT NULL
- `kosin_kbn` varchar(1) NOT NULL
- `cmnuser` varchar(10)
- `dmndate` timestamp
### システム
- `rowid` bigint NOT NULL DEFAULT nextval('rowid_seq')
### インデックス
- `djnd4001_idx` UNIQUE (cde_sybt, cde_val, dstart)
- `djnd4001_idx2` (ccompkb, dstart, dend, cde_sybt)
- `djnd4001_rowid_key` UNIQUE (rowid)
### サンプル
```
cde_sybt=941 (住宅借入金等特別控除)
cde_val=41 name="住(特家)" dname_comment="一般の住宅借入金等特別控除の場合(増改築等を含む。)で住宅が特例居住用家屋の場合"
cde_val=42 name="認(特家)" dname_comment="認定住宅等の新築等に係る住宅借入金等特別控除の場合で住宅が特例認定住宅等に該当する場合"
cde_val=44 name="震(特家)" dname_comment="震災再取得等の適用を選択した場合で住宅が特例居住用家屋に該当する場合"
dstart=2022-12-31 dend=2222-12-30 ← 長期有効
```
@@ -0,0 +1,135 @@
# 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 側)はそれぞれ「連携参照の定義」と「連携参照の実際の値」を担う両端。
@@ -0,0 +1,66 @@
## DJND4002 のカラム構成(辞書定義テーブル)
> 中文导览:一行 = 一个 `cde_sybt` 的字段定义 + 显示控制。
### 業務キー
- `ccompkb` varchar(2)
- `dstart` date
- `sstart` varchar(7)
- `dend` date
- `send` varchar(7)
### コード種別
- `cde_sybt` varchar(3) NOT NULL ← 4001 と紐づく辞書 ID
- `cde_nme` varchar(40) NOT NULL ← 当該 cde_sybt の名称
- `cde_exp` varchar(60)
- `cde_num_nme` varchar(80) ← 採番制御の項目名 (SEQ / SEQNo 等)
### 項目定義 ×13 セット(nme0..nme12)
```
nme0..nme12 varchar(80) ← 項目名
use0..use12 varchar(10) ← 制御区分(必須桁入力 / 必須入力 / 任意入力)
inp0..inp12 varchar(3) ← **入力形式**(§5 参照)
ord0..ord12 varchar(4) ← 桁数
ctrl_cde1..5 varchar(80) ← 連携制御コード(他辞書への参照)
```
### 表示制御 ×6 セット(name / dname / sname / rname / kname01..03)
```
use_name / inp_name / ord_name (name)
use_dname / inp_dname / ord_dname (dname)
use_sname / inp_sname / ord_sname (sname)
use_rname / inp_rname / ord_rname (rname)
use_kname01 / inp_kname01 / ord_kname01
use_kname02 / inp_kname02 / ord_kname02
use_kname03 / inp_kname03 / ord_kname03
```
### 表示
- `disp_hyoji` varchar(1) ← 表示有無
- `disp_jun` numeric(4) ← 表示順
### その他
- `reki_kbn` varchar(1)
- `popup_kbn` varchar(4)
### 監査
- `kosin_usr` (12) NOT NULL / `kosin_pgm` (8) NOT NULL / `last_dte` ts NOT NULL
- `kosin_kbn` (1) NOT NULL / `cmnuser` (10) / `dmndate` ts
### インデックス
- `djnd4002_idx` UNIQUE (cde_sybt)
### サンプル
```
cde_sybt=123 cde_nme="(標準共済)整理番号採番制御"
cde_num_nme=SEQ
nme0=必須桁入力 / use0=必須桁入力 / inp0=000 / ord0=2
nme1=開始番号 / use1=必須入力 / inp1=000 / ord1=4
nme2=終了番号 / use2=必須入力 / inp2=000 / ord2=4
nme3=現在値 / use3=必須入力 / inp3=000 / ord3=4
disp_jun=123
cde_sybt=597 cde_nme="俸給月額(H27人勧)" 6 項目:現新区分/俸給表/級/号俸/俸給月額/義務特手当
cde_sybt=598 cde_nme="定額表・調整基本額表(H27人勧)" 項目:俸給表/級/定額/調整基本額/号俸/調整額
```