56일 차 특이사항
1. 어제 하던 것 이어서 진행
- 대리결재자가 된 사람은 대리결재자에서 사라진다.
- 이것은 어떻게 해야 될까? 대리결재자로 proxy 테이블에 등록이 되면 등록일과 종료시간이 나온다.
- 등록일이 오늘까지인 사람은 보이지 않는다?
- 등록된 사람을 map에서 뺀다? 아니야 복잡해진다.
- 지금 mapper를 건드리고 있는데 서브쿼리로 만든 칼럼을 if문에서 사용할 수 없는 오류가 발생했다. 원래 그런가?
- 왜 서브쿼리로 만든 컬럼은 사용하지 못할까? bad SQL grammar 오류가 발생한다.
org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.springframework.jdbc.BadSqlGrammarException:
### Error querying database. Cause: java.sql.SQLSyntaxErrorException: ORA-00904: "MEM_END_GRANT": invalid identifier
### The error may exist in file [C:\workspace-spring\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\ApprovalProject\WEB-INF\classes\mapper\MemberMapper.xml]
### The error may involve mapper.memberchk-Inline
### The error occurred while setting parameters
### SQL: SELECT MEM_ID ,MEM_NAME ,MEM_RANK ,decode (MEM_RANK, 'CLERK','사원', 'MANAGER','대리', 'BOSS','과장', 'KING','부장') MEM_RANK_KOR ,(select end_grant from JSH_APPROVAL_PROXY jo where jo.proxy_member = do.mem_id) AS MEM_END_GRANT FROM JSH_APPROVAL_MEMBER do WHERE 1=1 and (MEM_RANK = 'MANAGER' OR MEM_RANK = 'CLERK') and MEM_END_GRANT > sysdate
### Cause: java.sql.SQLSyntaxErrorException: ORA-00904: "MEM_END_GRANT": invalid identifier
; bad SQL grammar []; nested exception is java.sql.SQLSyntaxErrorException: ORA-00904: "MEM_END_GRANT": invalid identifier
- 대리결재자가 결재하면 결재자에 홍길동(최 과장)
서브쿼리로 만든 컬럼을 사용하고 싶다면
1. 그 쿼리문 자체를 하나의 테이블로 만들어야 한다.
2. 대리결제 창 팝업 컨트롤러 : 이곳에서 memberchk 쿼리문을 사용하고 있다. 로그인한 정보를 가지고 대리결재 사원 목록을 가져온다.
//7. 대리결재 팝업창
@RequestMapping("replace")
public String replace(@RequestParam Map<String, Object> map, Model model, HttpSession session) {
map.put("memInfo", session.getAttribute("memInfo"));
Map<String, Object> memInfo = (Map<String, Object>) map.get("memInfo");
// 대리결재 등록 가능한 사람 조회 (1, 2계급 밑의 직원들)
List<Map<String, Object>> memberchk = sqlSession.selectList("mapper.memberchk", map);
model.addAttribute("memberchk", memberchk);
return "replace";
}
3. mapper : 구조를 잘 보면 SELECT * FROM 절 다음에 서브쿼리가 들어갔다. 위에서 말했지만 서브쿼리로 만든 테이블을 바로 where 절에서 사용하기 위해서는 서브쿼리문 자체를 하나의 테이블로 묶어서 다시 선택해야 한다.
<select id="memberchk" resultMap="loginRs" parameterType="map">
SELECT
MEM_ID,
MEM_NAME,
MEM_RANK,
decode
(MEM_RANK,
'CLERK','사원',
'MANAGER','대리',
'BOSS','과장',
'KING','부장') MEM_RANK_KOR,
MEM_END_GRANT
FROM (
SELECT
MEM_ID
,MEM_NAME
,MEM_RANK
,decode
(MEM_RANK,
'CLERK','사원',
'MANAGER','대리',
'BOSS','과장',
'KING','부장') MEM_RANK_KOR
,(select end_grant from JSH_APPROVAL_PROXY jo where jo.proxy_member = do.mem_id) AS MEM_END_GRANT
FROM JSH_APPROVAL_MEMBER do
)WHERE 1=1
<if test="memInfo.memRank == 'BOSS'">
and (MEM_RANK = 'MANAGER' OR MEM_RANK = 'CLERK')
and (MEM_END_GRANT IS NULL OR MEM_END_GRANT < sysdate)
</if>
<if test="memInfo.memRank == 'KING'">
and (MEM_RANK = 'BOSS' OR MEM_RANK = 'MANAGER')
and (MEM_END_GRANT IS NULL OR MEM_END_GRANT < sysdate)
</if>
</select>
대리결재 부여받은 사원은 선택할 수 없다.
- where 다음에 조건을 보면 MEM_END_GRANT IS NULL OR MEM_END GRANT < sysdate가 추가됐다. 이 코드가 있기 때문에 proxy 테이블에 등록된 대리결재자 아이디는 옵션 목록에 보이지 않게 된다. 대리결재 권한을 부여하고 하루 동안 권한이 유지된다. 권한이 NULL 값이거나 sysdate 미만인 경우만 리스트에 보인다.
결론은 등록날짜를 기준으로 사원을 불러온다. 등록날짜가 없거나 유효기간이 지나면 대리결재 권한 부여가 가능하다.
느낀 점
조건주는 것이 매우 중요함을 느낀다. 어떻게 조건을 주느냐에 따라 결과가 완전히 달라진다. if문만 잘 써도 할 수 있는 게 많아진다. 주식에 투자할 때도 이것저것 조건을 많이 따지는데 개발할 때도 그런 마음가짐으로 해봐야겠다.
session에서 memRank를 교체해주는 것이 문제가 있다. 다시 고쳐야 할 것 같다.
'일경험' 카테고리의 다른 글
[국민취업지원제도 일경험프로그램 58일차] 구글 SMTP 이메일 인증 기능 (2) | 2023.10.30 |
---|---|
[국민취업지원제도 일경험프로그램 57일차] 결재시스템 대리결재 수정 (1) | 2023.10.27 |
[국민취업지원제도 일경험프로그램 55일차] 결재시스템 대리결재 controller (0) | 2023.10.25 |
[국민취업지원제도 일경험프로그램 54일차] 결재시스템 과장 서브쿼리 조건문 (0) | 2023.10.24 |
[국민취업지원제도 일경험프로그램 53일차] 대리결재 기능 (0) | 2023.10.23 |