OCM_담당의사 배치의 SQL 을 확보하고, 옮기기 전에 정할 것 둘을 적는다
조회 두 개(GetCodInfDT With_Join · GetUidMst)와 세 갈래 호출 조건을 문서에 그대로 옮겼다 — 다음 세션이 다시 파헤치지 않아도 된다. ## 그 과정에서 걸린 것 둘 ① 조회에 ORDER BY 가 없는데 호출부가 Rows(0) 을 집는다. 한 내원에 진료과 이력이 여럿이면 <b>오라클이 어느 행을 먼저 주느냐에 따라 담당의가 달라진다</b>. 레거시 동작 자체가 비결정적이라 "그대로 옮긴다"가 성립하지 않는다 — 정할 문제다. ② 위 SQL 이 이미 담당의 이름(CodDtrCod_Nam)을 돌려주는데 태그는 그것을 안 쓰고 다른 날짜로 GetUidMst 를 한 번 더 친다. 날짜가 다르니 두 값이 갈릴 수 있다. 왕복을 줄이려고 첫 결과를 쓰면 값이 달라진다 — 레거시를 따르려면 두 번 쳐야 한다. 그리고 이 조회는 PatientContextStore 가 읽는 CodInf 와 선택 규칙이 다르다 (그쪽은 BETWEEN + 최신순 1행). 문맥의 CodInf 를 재사용하면 안 된다. 코드 변경 없음(문서만). 게이트는 앞 커밋 상태 그대로다. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
d6d594490c
commit
3e9f50ee52
@@ -105,3 +105,54 @@ ETC_로그인_사용자ID_사용자명 Return moWrkInfoBiz.UidMst.Item("UidCod"
|
||||
지어낸 이름 셋이 조용히 앉아 있던 적이 있다.
|
||||
- 짐작한 컬럼·계산식은 넣지 않는다. 종이에 그럴듯한 값이 찍히면 아무도 의심하지 않는다.
|
||||
- 값이 아니라 <b>사유</b>를 돌려주는 쪽이 항상 안전하다.
|
||||
|
||||
---
|
||||
|
||||
## 배치 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)` 을 집는다. 한 내원에 진료과 이력이 여럿이면
|
||||
<b>오라클이 어느 행을 먼저 주느냐에 따라 담당의가 달라진다.</b>
|
||||
레거시의 실제 동작이 비결정적이라는 뜻이라, "그대로 옮긴다"가 성립하지 않는다.
|
||||
정렬을 넣으면 레거시와 달라질 수 있고, 안 넣으면 우리도 비결정적이 된다.
|
||||
→ 어느 쪽인지 사용자와 정하고 근거를 주석에 남긴다.
|
||||
|
||||
**② 두 번 조회한다.** 위 SQL 이 이미 `CodDtrCod_Nam`(담당의 이름)을 돌려주는데
|
||||
태그는 그것을 쓰지 않고 `GetUidMst` 로 <b>다른 날짜</b>를 써서 다시 찾는다.
|
||||
날짜가 다르므로 두 값이 갈릴 수 있다. 어느 쪽이 맞는지는 레거시 동작을 따라야 한다
|
||||
(= 두 번째 조회 결과를 쓴다). 왕복을 줄이려고 첫 결과를 쓰면 값이 달라진다.
|
||||
|
||||
또한 이 조회는 `PatientContextStore` 가 이미 읽는 `CodInf` 와 <b>선택 규칙이 다르다</b>
|
||||
(그쪽은 적용일시 BETWEEN + 최신순 1행). 같은 표를 두 규칙으로 읽게 되므로
|
||||
문맥의 `CodInf` 를 재사용하면 안 된다.
|
||||
|
||||
Reference in New Issue
Block a user