쿼리 치환 변수를 클래스 전체 이름 형식으로 교체 (치환 실패 → ORA 오류 수정)
레거시 런타임 bzDesignSheetLoader.ConvertQuery 는 토큰 접두어를 PatientInfo/SheetInfo/WorkInfo 의 GetType.FullName 과 Select Case 완전일치로 비교한다. 기존 목록은 <<PatientInfo.ChtNum>> 축약형이라 어떤 토큰도 치환되지 않고 <<...>> 가 SQL 에 리터럴로 남아 ORA 구문오류를 냈다 — 그 데이터소스를 참조하는 컨트롤이 전부 공백이 되는 조용한 실패다. 기존 서식의 쿼리는 원문 보존이라 영향 없고, 신규 작성분만 해당된다. 접두어는 ucLoadSheetBase.vb:7619-7631 이 형을 고정한다: PatientInfo/WorkInfo → M.CMM.HISOperatingInfo.* SheetInfo → M.EMR.SheetLoadOperatingInfo.bzSheetInfo 기존 20개 중 8개는 접두어뿐 아니라 속성명 자체가 실존하지 않았다(리플렉션 null): PatientInfo.OdrNum/OdrSeq, SheetInfo.EmrGbn/PatTyp/OdrNum/OdrSeq, WorkInfo.WrkNam/AdpDep. bzPatientInfo/bzSheetInfo/bzWorkInfo 의 실존 공개 스칼라 속성으로 다시 큐레이션했다. DataRow 접근형(...PatInfDR.item(컬럼))은 LastIndexOf(.) 규칙이 접두어를 깨뜨려 이 경로에서 반드시 실패하므로 목록에서 제외. - LegacyQueryVariableCatalog 신설(그룹/설명 포함 레코드) - 편집기 목록을 그룹 헤더 + 설명/토큰 2줄 + 툴팁으로 — 축약 오해 재발 방지 - 상용구 편집의 QueryEditorWindow 재사용에 showVariables:false 추가 (상용구 문구 화면에 SQL 변수 목록이 노출되던 오조작 여지 제거) 검증: 테스트 70/70(레거시 완전일치 규칙 시뮬레이션 + 운영 실사용 토큰 존재 검사 포함), edit-smoke 에 두 모드 실제 창 생성 검사 추가 — 실패 0. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Fable 5
parent
c445b851a1
commit
d0538ef95a
@@ -0,0 +1,66 @@
|
||||
namespace SheetMe.Core.Catalog;
|
||||
|
||||
/// <summary>치환 변수 1건 — <see cref="Token"/> 이 SQL 에 그대로 삽입되는 문자열이다.</summary>
|
||||
public sealed record QueryVariable(string Group, string Token, string Description);
|
||||
|
||||
/// <summary>
|
||||
/// MDataTable 쿼리의 치환 변수 카탈로그.
|
||||
///
|
||||
/// 레거시 런타임 <c>bzDesignSheetLoader.ConvertQuery</c> 는 토큰에서
|
||||
/// <c>sReserved.Substring(0, sReserved.LastIndexOf("."))</c> 를 잘라
|
||||
/// <c>PatientInfo/SheetInfo/WorkInfo</c> 객체의 <c>GetType.FullName</c> 과
|
||||
/// <b>Select Case 완전일치</b>로 비교한다. 즉 접두어는 <b>클래스 전체 이름</b>이어야 하며,
|
||||
/// 축약형(<c><<PatientInfo.X>></c>)은 치환되지 않고 <c><<...>></c> 가
|
||||
/// SQL 에 리터럴로 남아 ORA 구문오류를 낸다(= 해당 데이터소스를 참조하는 컨트롤이 전부 공백).
|
||||
///
|
||||
/// 접두어는 런타임 호스트의 속성 선언형으로 고정된다
|
||||
/// (<c>ucLoadSheetBase.vb:7619-7631</c> — PatientInfo/WorkInfo 는 M.CMM.HISOperatingInfo,
|
||||
/// SheetInfo 는 M.EMR.SheetLoadOperatingInfo).
|
||||
///
|
||||
/// 속성명은 리플렉션(<c>GetProperty(...).GetValue(...)</c>)으로 해석되므로 실존하는 공개 스칼라
|
||||
/// 속성만 등재한다. DataRow 접근형(<c>...PatInfDR.item("컬럼")</c>)은 위 LastIndexOf(".") 규칙이
|
||||
/// 접두어를 깨뜨려 이 경로에서 반드시 실패하므로 목록에 넣지 않는다.
|
||||
/// </summary>
|
||||
public static class LegacyQueryVariableCatalog
|
||||
{
|
||||
#region Member Fields
|
||||
private const string Patient = "M.CMM.HISOperatingInfo.bzPatientInfo";
|
||||
private const string Sheet = "M.EMR.SheetLoadOperatingInfo.bzSheetInfo";
|
||||
private const string Work = "M.CMM.HISOperatingInfo.bzWorkInfo";
|
||||
|
||||
/// <summary>그룹별 치환 변수 — 인스펙터 쿼리 편집기의 삽입 목록</summary>
|
||||
public static readonly IReadOnlyList<QueryVariable> All = new QueryVariable[]
|
||||
{
|
||||
new("환자", $"<<{Patient}.ChtNum>>", "차트번호"),
|
||||
new("환자", $"<<{Patient}.ComNum>>", "내원번호"),
|
||||
new("환자", $"<<{Patient}.ComNum_Refer>>", "참조 내원번호"),
|
||||
new("환자", $"<<{Patient}.ComCvtCom>>", "전환 내원번호"),
|
||||
new("환자", $"<<{Patient}.PatTyp>>", "입퇴원 구분"),
|
||||
new("환자", $"<<{Patient}.AdpDtm>>", "접수일시"),
|
||||
new("환자", $"<<{Patient}.OrderAdpDtm>>", "처방 접수일시"),
|
||||
new("환자", $"<<{Patient}.Age>>", "나이"),
|
||||
new("환자", $"<<{Patient}.AgeInMonth>>", "월령"),
|
||||
new("환자", $"<<{Patient}.Sex>>", "성별"),
|
||||
new("환자", $"<<{Patient}.PatMblPhn>>", "휴대전화"),
|
||||
new("환자", $"<<{Patient}.ComDayCar>>", "낮병동 여부"),
|
||||
new("환자", $"<<{Patient}.HipassYon>>", "하이패스 여부"),
|
||||
new("환자", $"<<{Patient}.EmgKTSGrd>>", "응급 KTAS 등급"),
|
||||
new("환자", $"<<{Patient}.OemNum1>>", "외부연동 번호1"),
|
||||
new("환자", $"<<{Patient}.OemNum2>>", "외부연동 번호2"),
|
||||
new("환자", $"<<{Patient}.OemVar1>>", "외부연동 값1"),
|
||||
|
||||
new("서식", $"<<{Sheet}.ShtCod>>", "서식 코드"),
|
||||
new("서식", $"<<{Sheet}.ShtNam>>", "서식명"),
|
||||
new("서식", $"<<{Sheet}.EmrKey>>", "EMR 키(신규 작성 시 0)"),
|
||||
new("서식", $"<<{Sheet}.AdpDtm>>", "작성일시"),
|
||||
new("서식", $"<<{Sheet}.TemKey>>", "템플릿 키"),
|
||||
|
||||
new("작업자", $"<<{Work}.WrkUid>>", "작성자 ID"),
|
||||
new("작업자", $"<<{Work}.WrkDte>>", "작업일자(yyyyMMdd)"),
|
||||
new("작업자", $"<<{Work}.WrkDtm>>", "작업일시"),
|
||||
};
|
||||
|
||||
/// <summary>런타임이 완전일치로 비교하는 접두어 3종 — 검증·진단용</summary>
|
||||
public static readonly IReadOnlyList<string> Prefixes = new[] { Patient, Sheet, Work };
|
||||
#endregion
|
||||
}
|
||||
Reference in New Issue
Block a user