바이탈 17종 + 주치의 1종 + _Refer 사유 정정 — 76종 → 95종
## 바이탈(측정치) 17종
E_EmdInf_VITAL ⨝ E_EmrInf(삭제 제외) 를 내원으로 거르고 해당 컬럼이 빈 값이 아닌
행을 측정일시 순으로 한 건 집는다 — 무인자는 첫 측정(ASC), _LAST 는 마지막(DESC).
키/몸무게/체온/맥박/호흡/SPO2 (±LAST) · 혈압/혈압_LAST(BPS||'/'||BPD) ·
혈압_BPS/_BPD(단독값이지만 널 필터는 둘 다 — 레거시 그대로) · VITAL접수일시_LAST(HH:MM).
태그별 (식·컬럼·필터·정렬)을 전부 본문에서 확인해 표로 박았다(:11508-13046).
조회는 태그가 물을 때 한 값씩, 태그별 1회 캐시.
## 머리둘레 2종은 레거시가 고장이다
SELECT 는 EmdHc AS HC 인데 Item("BP") 를 읽는다(:11744, 12581) —
행이 있으면 예외 → MessageBox → "". 레거시에서 한 번도 값이 나온 적 없는 태그다.
그대로 빈 값 + "레거시 결함(컬럼명 불일치)으로 항상 빈 값이던 태그" 사유로 둔다.
고쳐서 값을 내면 레거시와 달라진다 — 고칠지는 별도 결정.
## 실DB 확인
--db-patient ㉙ 신규: 내원 6004487 에서 첫/마지막 몸무게 2자.
표 부재 가능성도 수술과 같은 방식으로 가른다(ORA-00942 명시).
## 게이트
- dotnet test 338/338 · --edit-smoke 실패 0(이름 검사 95종)
- --db-patient ①~㉙ 전건 통과 · --db-render P062 md5 불변
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
3e9d5b5cf3
commit
94bdcc763f
@@ -0,0 +1,64 @@
|
||||
using Oracle.ManagedDataAccess.Client;
|
||||
|
||||
namespace SheetMe.Data.Stores;
|
||||
|
||||
/// <summary>
|
||||
/// 바이탈(측정치) 조회 — 레거시 <c>OCM_키/몸무게/체온/혈압/맥박/호흡/SPO2(±_LAST)</c> 계열
|
||||
/// (bzDataInterface.vb:11508-13046)의 공통 조회.
|
||||
///
|
||||
/// 전부 같은 틀이다:
|
||||
/// <c>E_EmdInf_VITAL ⨝ E_EmrInf(EmrKey=EmdEmrKey, 삭제 제외)</c> 를 내원으로 거르고
|
||||
/// 해당 컬럼이 비어 있지 않은 행을 측정일시 순으로 한 건 집는다 —
|
||||
/// 무인자는 <b>첫 측정</b>(ASC), _LAST 는 <b>마지막 측정</b>(DESC).
|
||||
///
|
||||
/// SELECT 식·널 필터·정렬까지 태그마다 본문에서 확인한 대로 호출부(해석기)가 지정한다.
|
||||
/// 식과 컬럼명은 전부 <b>코드 상수</b>에서만 온다 — 사용자 입력이 닿는 경로가 아니다.
|
||||
/// </summary>
|
||||
public sealed class VitalStore
|
||||
{
|
||||
#region Member Fields
|
||||
private readonly string connectionString;
|
||||
#endregion
|
||||
|
||||
#region Constructors
|
||||
public VitalStore(string connectionString) => this.connectionString = connectionString;
|
||||
#endregion
|
||||
|
||||
#region Methods
|
||||
/// <summary>측정치 한 건 — 없으면 빈 문자열</summary>
|
||||
/// <param name="selectExpr">SELECT 식(별칭 포함) — 예: "EmdWeight" / "EmdBps || '/' || EmdBpd AS BP"</param>
|
||||
/// <param name="pick">결과에서 집을 컬럼(별칭)</param>
|
||||
/// <param name="notNullColumns">비어 있으면 안 되는 컬럼들(레거시 필터 그대로)</param>
|
||||
/// <param name="orderBy">정렬 절 — 예: "EmdDte ASC, EmdTime ASC"</param>
|
||||
public string One(decimal comNum, string selectExpr, string pick,
|
||||
string[] notNullColumns, string orderBy)
|
||||
{
|
||||
var filters = string.Concat(notNullColumns.Select(c =>
|
||||
$" AND ({c} IS NOT NULL AND {c} <> ' ') "));
|
||||
var sql =
|
||||
"SELECT * FROM ("
|
||||
+ $" SELECT {selectExpr}"
|
||||
+ " FROM E_EmdInf_VITAL"
|
||||
+ " INNER JOIN E_EmrInf ON EmrKey = EmdEmrKey"
|
||||
+ " AND (EmrSttFlg IS NULL OR EmrSttFlg <> 'D')"
|
||||
+ " WHERE EmrComNum = :iComNum"
|
||||
+ filters
|
||||
+ $" ORDER BY {orderBy}"
|
||||
+ " ) WHERE ROWNUM = 1";
|
||||
|
||||
using var connection = new OracleConnection(connectionString);
|
||||
connection.Open();
|
||||
using var command = connection.CreateCommand();
|
||||
command.BindByName = true;
|
||||
command.CommandText = sql;
|
||||
command.Parameters.Add(new OracleParameter("iComNum", comNum));
|
||||
using var reader = command.ExecuteReader();
|
||||
if (!reader.Read())
|
||||
{
|
||||
return string.Empty;
|
||||
}
|
||||
var at = reader.GetOrdinal(pick);
|
||||
return reader.IsDBNull(at) ? string.Empty : reader.GetValue(at).ToString()!.Trim();
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
Reference in New Issue
Block a user