From 3e9f50ee52f01f638569c5cecb8c4a0a4c87eb65 Mon Sep 17 00:00:00 2001 From: Msystech Date: Wed, 19 Aug 2026 11:39:50 +0900 Subject: [PATCH] =?UTF-8?q?OCM=5F=EB=8B=B4=EB=8B=B9=EC=9D=98=EC=82=AC=20?= =?UTF-8?q?=EB=B0=B0=EC=B9=98=EC=9D=98=20SQL=20=EC=9D=84=20=ED=99=95?= =?UTF-8?q?=EB=B3=B4=ED=95=98=EA=B3=A0,=20=EC=98=AE=EA=B8=B0=EA=B8=B0=20?= =?UTF-8?q?=EC=A0=84=EC=97=90=20=EC=A0=95=ED=95=A0=20=EA=B2=83=20=EB=91=98?= =?UTF-8?q?=EC=9D=84=20=EC=A0=81=EB=8A=94=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 조회 두 개(GetCodInfDT With_Join · GetUidMst)와 세 갈래 호출 조건을 문서에 그대로 옮겼다 — 다음 세션이 다시 파헤치지 않아도 된다. ## 그 과정에서 걸린 것 둘 ① 조회에 ORDER BY 가 없는데 호출부가 Rows(0) 을 집는다. 한 내원에 진료과 이력이 여럿이면 오라클이 어느 행을 먼저 주느냐에 따라 담당의가 달라진다. 레거시 동작 자체가 비결정적이라 "그대로 옮긴다"가 성립하지 않는다 — 정할 문제다. ② 위 SQL 이 이미 담당의 이름(CodDtrCod_Nam)을 돌려주는데 태그는 그것을 안 쓰고 다른 날짜로 GetUidMst 를 한 번 더 친다. 날짜가 다르니 두 값이 갈릴 수 있다. 왕복을 줄이려고 첫 결과를 쓰면 값이 달라진다 — 레거시를 따르려면 두 번 쳐야 한다. 그리고 이 조회는 PatientContextStore 가 읽는 CodInf 와 선택 규칙이 다르다 (그쪽은 BETWEEN + 최신순 1행). 문맥의 CodInf 를 재사용하면 안 된다. 코드 변경 없음(문서만). 게이트는 앞 커밋 상태 그대로다. Co-Authored-By: Claude Opus 5 --- docs/TAG-PORTABLE-48.md | 51 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) diff --git a/docs/TAG-PORTABLE-48.md b/docs/TAG-PORTABLE-48.md index 2ca91cb..71a131e 100644 --- a/docs/TAG-PORTABLE-48.md +++ b/docs/TAG-PORTABLE-48.md @@ -105,3 +105,54 @@ ETC_로그인_사용자ID_사용자명 Return moWrkInfoBiz.UidMst.Item("UidCod" 지어낸 이름 셋이 조용히 앉아 있던 적이 있다. - 짐작한 컬럼·계산식은 넣지 않는다. 종이에 그럴듯한 값이 찍히면 아무도 의심하지 않는다. - 값이 아니라 사유를 돌려주는 쪽이 항상 안전하다. + +--- + +## 배치 1 준비 — `OCM_담당의사` 계열 (SQL 확보 완료) + +`GetCodInfDT(comNum, adpDtm, 1)` = `EN_JOIN.With_Join` (dtCommonLib.vb:2777-2830): + +```sql +SELECT Cod.*, DepKorNam CodDepCod_Nam, + Usr.UidNam CodDtrCod_Nam, Umt.UidNam CodStfCod_Nam +FROM P_CodInf Cod +LEFT OUTER JOIN M_UidMst Usr ON Usr.UidCod = CodDtrCod AND Usr.UidDtrYon = 'Y' + AND :d BETWEEN Usr.UidStrDte AND Usr.UidEndDte +LEFT OUTER JOIN M_UidMst Umt ON Umt.UidCod = CodStfDtr AND Umt.UidDtrYon = 'Y' + AND :d BETWEEN Umt.UidStrDte AND Umt.UidEndDte +LEFT OUTER JOIN M_DepMst Dep ON DepCod = CodDepCod AND DepHspCod = Usr.UidHspCod + AND DepWrkTyp IN ('D','A') -- SYBS·NYHY 는 ('D','A','B') + AND :d BETWEEN DepStrDte AND DepEndDte +WHERE CodComNum = :n AND CodMtiSeq = '0' +``` + +`:d` 는 넘긴 적용일시의 **앞 8자리**(비면 서버 날짜). + +호출 갈래(bzDataInterface.vb `OCM_담당의사`): + +| 조건 | 넘기는 시각 | UidMst 조회 날짜 | +| --- | --- | --- | +| 입원 · `ComPrgStt='ILV'` | `ComLevDtm[0..12]` | `CodEndDtm[0..8]` | +| 입원 · 그 밖 | 서버 현재일시 | `CodEndDtm[0..8]` | +| 외래 | `ComAcpDtm[0..12]` | `ComAcpDtm[0..8]` | + +세 태그의 차이는 마지막 한 줄뿐이다 — +`UidNam` / `UidNam(UidCod)` / `UidMblPhn`. + +### 옮기기 전에 정해야 할 것 둘 + +**① 이 조회에는 정렬이 없다.** `CodComNum` + `CodMtiSeq='0'` 으로만 거르고 +`ORDER BY` 가 없는데 호출부는 `Rows(0)` 을 집는다. 한 내원에 진료과 이력이 여럿이면 +오라클이 어느 행을 먼저 주느냐에 따라 담당의가 달라진다. +레거시의 실제 동작이 비결정적이라는 뜻이라, "그대로 옮긴다"가 성립하지 않는다. +정렬을 넣으면 레거시와 달라질 수 있고, 안 넣으면 우리도 비결정적이 된다. +→ 어느 쪽인지 사용자와 정하고 근거를 주석에 남긴다. + +**② 두 번 조회한다.** 위 SQL 이 이미 `CodDtrCod_Nam`(담당의 이름)을 돌려주는데 +태그는 그것을 쓰지 않고 `GetUidMst` 로 다른 날짜를 써서 다시 찾는다. +날짜가 다르므로 두 값이 갈릴 수 있다. 어느 쪽이 맞는지는 레거시 동작을 따라야 한다 +(= 두 번째 조회 결과를 쓴다). 왕복을 줄이려고 첫 결과를 쓰면 값이 달라진다. + +또한 이 조회는 `PatientContextStore` 가 이미 읽는 `CodInf` 와 선택 규칙이 다르다 +(그쪽은 적용일시 BETWEEN + 최신순 1행). 같은 표를 두 규칙으로 읽게 되므로 +문맥의 `CodInf` 를 재사용하면 안 된다.