상병 11종을 옮긴다 — SQL 은 원문에서 기계 추출했다. 40종 → 51종
## Okd_상병쿼리(bzDataInterface.vb:14160-14623)의 이식 구조: 블록1(M_KcdMst 와 맞는 상병, INNER JOIN) UNION 블록2(마스터에 없는 코드 — LEFT JOIN 후 KcdCod IS NULL). 주/부 필터(OkdDspSeq='1' / <>'1')가 <b>각 블록에, ROW_NUMBER 접기 앞에</b> 붙는다. 그래서 전체(T)를 받아 클라이언트에서 가르면 안 된다 — 같은 코드가 주·부 양쪽에 있으면 RN 접기가 한쪽을 지워 결과가 갈린다. 갈래(T/M/S)별로 따로 조회하되, 태그가 물을 때 한 번만 읽고 캐시한다. SQL 은 손으로 다시 치지 않고 <b>VB 원문에서 기계 추출했다</b>(Select Case 를 Case Else 경로로 시뮬레이션, AppendLine 페이로드만 수집) — 55줄이 공백까지 원문 그대로다. ## 병원 분기를 얼버무리지 않는다 원문은 쿼리 자체가 6갈래(KIMEYE·NYJB·SYBS·HIMCHAN_CW·SPHH·Else)로 갈리고, 이름 규칙이 JEGG(배제 접미), 코드 규칙이 BSGH(KcdSeqCod)에서 또 갈린다. 이 DB(SRCH)의 Case Else 만 옮겼고, 그 병원들에서는 <b>미이식이라고 말한다</b> — Else 로 뭉개면 그 병원 서식에 다른 모양의 상병이 조용히 찍힌다. NYJB 갈래에는 사용자 코드를 SQL 에 <b>문자열로 잇는</b> 주입 구멍도 있다(:14235) — 옮길 때 바인드로 바꿔야 한다는 것을 조사 문서가 이미 적어 뒀다. ## 태그 11종 (전부 본문에서 결합 규칙 확인) 상병명_가로/세로 · 영어_가로/세로 · 코드_가로/세로 전체(T) 부상병코드 · 부상병POA 부(S) 주상병명 · 주상병코드 · 주상병POA 주(M) 첫 행 가로 = ", " 구분, 세로 = 줄바꿈. 한글명에만 확→(확진)·의→(의증) 접미. 주상병명은 접미 없이 KcdKorNam(:10126), 주상병코드는 KcdElcCod(:9744). ## 실DB 확인 (--db-patient ㉕~㉗ 신규) O_OkdInf 에 행을 가진 내원을 찾아 걸었다(행 없는 내원으로 판정하는 함정을 이미 두 번 밟았다). 내원 6005266: 전체 1행 = 주 1 + 부 0, 한글명 11자. 주/부 필터 분해가 전체와 일치한다. ## 게이트 - dotnet test 338/338 · --edit-smoke 실패 0(이름 검사 51종) - --db-patient ①~㉗ 전건 통과 - --db-render P062 md5 8d683835f5d81e7bb41c79071d6bf954 불변 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
9278b39a6d
commit
0da3305a75
@@ -2204,6 +2204,39 @@ public static class DbSmoke
|
||||
lines.Add($" 요양기관명: {hosp.Length}자");
|
||||
Check("㉔ 요양기관명이 나온다", hosp.Trim().Length > 0,
|
||||
"M_DepMst⨝M_HspMst 조인이 0행 — 유효기간이나 DepHspCod 를 의심할 것");
|
||||
|
||||
// ㉕ 상병 — 원문 기계 추출 SQL 이 실제로 돈다.
|
||||
// 이 내원에 상병이 없을 수 있으므로 O_OkdInf 에 행을 가진 내원을 찾아 건다
|
||||
// (앞서 두 번 밟은 "행 없는 내원으로 판정" 함정).
|
||||
var okdOwner = FirstComNum(conn, "O_OkdInf", "OkdComNum", "OkdComNum");
|
||||
if (okdOwner is null)
|
||||
{
|
||||
Check("㉕ 상병 — O_OkdInf 에 행이 없어 확인 불가", false,
|
||||
"이 DB 로는 이 갈래를 확인할 수 없다");
|
||||
}
|
||||
else
|
||||
{
|
||||
var diag = new DiagnosisStore(conn);
|
||||
var all = diag.Diagnoses(okdOwner.Value);
|
||||
var main = diag.Diagnoses(okdOwner.Value, DiagnosisStore.Scope.Main);
|
||||
var sub = diag.Diagnoses(okdOwner.Value, DiagnosisStore.Scope.Sub);
|
||||
lines.Add($" 상병: 내원 {okdOwner.Value:F0} → 전체 {all.Count}행,"
|
||||
+ $" 주 {main.Count}행, 부 {sub.Count}행");
|
||||
Check("㉕ 상병 쿼리(전체)가 행을 돌려준다", all.Count > 0,
|
||||
"OkdStt='E' 조건이나 UNION 결합을 의심할 것");
|
||||
Check("㉖ 주/부 필터가 실제로 가른다", main.Count + sub.Count == all.Count
|
||||
&& main.Count <= all.Count,
|
||||
$"주 {main.Count} + 부 {sub.Count} ≠ 전체 {all.Count} — RN 접기 전 필터 규칙 확인");
|
||||
if (all.Count > 0)
|
||||
{
|
||||
var okdKorNam = all[0].TryGetValue("KcdKorNam", out var kn) ? kn : "";
|
||||
lines.Add($" 첫 상병: 한글명 {okdKorNam.Length}자,"
|
||||
+ $" 코드 {(all[0].TryGetValue("KcdElcCod", out var kc) ? kc.Length : 0)}자"
|
||||
+ " (값은 기록하지 않는다)");
|
||||
Check("㉗ 상병 한글명이 나온다", okdKorNam.Trim().Length > 0,
|
||||
"M_KcdMst 조인이 빈 이름을 냈다");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user