서비스
home

[Oracle APEX] 재고가 0이 되어도 선택했던 항목을 LoV에 표시하는 방법

이번 포스트에서는 재고 관리 시스템에서 LoV를 사용할 때 발생하는 문제와 해결방법을 소개합니다.

1. 재고 관리에서 LoV 문제

부자재를 관리하는 시스템을 만들었다고 생각해봅시다.
기본적으로 부자재 마스터가 있고, 입고와 출고가 있습니다. 그리고 입고와 출고를 가지고 재고를 계산하지요.
부자재 마스터는 아래의 이미지와 같이 이름과 단위를 포함한 테이블이라고 생각하겠습니다.
입고는 다음과 같은 폼으로 이루어진다고 하시죠. 입고할 때, 부자재번호를 선택하는 LoV는 Static한 값으로 Shared Components에 만들어 둘 수 있습니다.
이제 입고된 항목이 있으면, 입고된 항목을 선택해서 출고를 시킬 수 있습니다. 폼은 간단하게 만들 수 있지요.
여기서 입고번호는 LoV로 어떻게 만들 수 있을까요? 만약, 입고 테이블의 번호로 Static하게 LoV를 만든다면 어떤 문제가 있을까요?
재고와 관련없이 LoV를 만들면 재고가 0이 되어도 계속해서 표시가 됩니다. 시간이 누적되면 LoV의 항목들도 매우 많아지게 되고, 사용자는 어떤 것을 선택해야 할지 어려움을 겪게 됩니다.
그럼 재고를 반영해서 Dynamic 하게 작성해야 하겠지요?
재고를 뷰로 만들었다고 생각하고, 다음과 같은 쿼리로 입고번호를 가져온다고 해보겠습니다.
SELECT SEQNO FROM V_SUBMATERIAL_STOCK WHERE COUNT_STOCK > 0
SQL
복사
재고가 0인 것은 가져오지 않기 때문에 훨씬 컴팩트한 목록에서 선택할 수 있습니다.
 하지만 여기서 문제가 생깁니다.
재고가 10 남았던 입고번호를 선택해서 10만큼 출고를 합니다. 그러면 재고는 0이 되지요.
그 상태에서 10만큼 출고한 항목을 수정하려고 하면, LoV에 내가 선택했던 것이 사라지게 됩니다.
내가 선택했던 것이 재고가 0이기 때문에 Dynamic 하게 구성한 LoV에서 빠지게 된 것이죠.
이 문제를 어떻게 해결할 수 있을까요?

2. 선택한 값을 항상 표시하도록 쿼리를 수정

목표는 선택한 값은 재고가 0이든 0이 아니는 관계없이 항상 표시하는 것이 되어야 합니다.
그렇게 하기 위해서는 두 단계를 거쳐야 합니다.

2-1. 선택한 값을 임시로 저장하는 페이지 아이템을 추가

선택한 값이 IN_SEQNO 라는 페이지 아이템에 저장되어 있다고 한다면, 페이지 아이템을 추가하고, IN_SEQNO_SELF로 이름을 지정합니다. 그리고 HIDDEN 처리를 하고, Value Protected는 OFF로 해줍니다.
다음으로 페이지의 Pre-Rendering 의 Before Header ⇒ Processes에 프로세스를 하나 추가합니다. “선택한 입고번호 임시 저장”이라고 생성하였습니다.
Type을 Execute Code로 선택하고 PL/SQL을 추가합니다. 이렇게 하면 폼이 Initialize 된 후에 선택한 입고번호를 IN_SEQNO_SELF에 저장하게 됩니다. IN_SEQNO_SELF은 소스가 지정되지 않은 단지 활용하기위한 페이지 아이템입니다. (소스로 IN_SEQNO를 지정하면 오류가 발생할 수 있습니다.)
:P37_IN_SEQNO_SELF := :P37_IN_SEQNO;
SQL
복사

2-2 선택한 값을 LoV에 항상 추가

이제 LoV의 Dynamic SQL Query 를 다음과 같이 변경합니다.
SELECT SEQNO FROM V_SUBMATERIAL_STOCK WHERE COUNT_STOCK > 0 UNION SELECT TO_NUMBER(:P37_IN_SEQNO_SELF) FROM DUAL WHERE TO_NUMBER(:P37_IN_SEQNO_SELF) IS NOT NULL
SQL
복사
윗 부분은 동일하지만 아래에 선택한 값을 항상 추가하는 부분이 생겼지요?
:P37_IN_SEQNO_SELF 가 NOT NULL 인 경우에, 즉 값이 있는 경우에는 그 값을 LoV에 UNION 해서 추가합니다. UNION 은 중복을 제거해주기 때문에 재고가 0 이상인 경우에도 2개가 아니라 1개로 보이게 됩니다.
만약 UNION ALL 을 사용하면 다음과 같이 동일한 항목이 2개로 보이게 됩니다.
이 방식으로 선택한 항목의 재고가 0이 되더라도 선택한 항목은 계속 표시하게 할 수 있습니다.