Oracle® APP_MULTI 패키지를 사용하면 폼(Form)에 다중 선택(Multi-Selection) 기능을 손쉽게 추가할 수 있습니다. 이 패키지는 APPCORE 라이브러리에 포함되어 있으며, 별도의 복잡한 설정 없이 표준 폼에 확장 기능을 적용할 수 있다는 점이 큰 장점입니다.
APP_MULTI 패키지를 활용하면 단일 레코드 또는 여러 개의 레코드를 자유롭게 선택하고, 필요에 따라 일괄 처리할 수 있습니다. 아래 이미지는 무작위로 레코드를 선택하는 예시를 보여줍니다.
이미지 출처: https://i36.me/images/oracle/ebs/ebs_frm_lnchse_with_app_multi_01.jpg
주요 기능
APP_MULTI 패키지를 사용하면 다음과 같은 작업을 수행할 수 있습니다.
- 레코드 하나를 클릭하여 선택합니다.
- Ctrl 키를 누른 상태에서 여러 레코드를 클릭하면 동시에 여러 레코드를 선택할 수 있습니다.
- 애플리케이션 메뉴에서 Select All(모두 선택)을 선택하면 모든 레코드가 한 번에 선택됩니다.
- 애플리케이션 메뉴에서 Deselect All(모두 해제)을 선택하면 선택된 모든 레코드가 해제됩니다.
- 첫 번째 레코드를 클릭한 후 Shift 키를 누른 상태에서 마지막 레코드를 클릭하면 연속된 여러 레코드를 한꺼번에 선택할 수 있습니다.
APP_MULTI 패키지 이벤트
APP_MULTI 패키지는 폼에서 발생하는 다음과 같은 이벤트에 반응합니다.
- KEY-CLRFRM: (폼 레벨) 폼을 지우기 전에 레코드의 유효성을 검사합니다. 사용 예:
APP_MULTI.EVENT('KEY-CLRFRM'); - KEY-CLRREC: (블록 레벨) 현재 레코드를 지울 때 실행됩니다.
clear_record명령과 동일합니다. - KEY-CREREC: (블록 레벨) 새 레코드를 생성할 때 실행됩니다.
create_record명령과 동일합니다. - KEY-DELREC: (블록 레벨) 기존 레코드를 삭제할 때 실행됩니다.
delete_record명령과 동일합니다. - PRE-BLOCK: (블록 레벨) 블록에 진입할 때 실행됩니다.
- POST-BLOCK: (블록 레벨) 블록을 벗어날 때 실행됩니다.
- SELECT_ALL: (블록 레벨) 모든 레코드를 선택할 때 실행됩니다.
- DESELECT_ALL: (블록 레벨) 모든 레코드 선택을 해제할 때 실행됩니다.
- WHEN-CLEAR-BLOCK: (블록 레벨) 블록을 지울 때 실행됩니다.
- WHEN-MOUSE-CLICK: (블록 레벨) 마우스를 클릭할 때 실행됩니다.
- WHEN-NEW-RECORD-INSTANCE: (블록 레벨) 블록에서 레코드를 생성하거나 조회할 때 실행됩니다.
트리거 수동 생성
필요한 트리거를 직접 생성한 후, 처리하려는 이벤트 이름을 인자로 전달하여 APP_MULTI.EVENT 프로시저를 명시적으로 호출해야 합니다. 프로시저의 기본 형태는 다음과 같습니다.
PROCEDURE event(p_event_name VARCHAR2, p_blockname VARCHAR2 DEFAULT NULL);
예를 들어, KEY-CLRREC 트리거는 다음과 같이 간단하게 작성할 수 있습니다.
APP_MULTI.EVENT('KEY-CLRREC');
참고: 이 프로시저는 선택적 인자인 p_blockname을 받습니다. p_blockname을 전달하지 않으면 프로시저는 자동으로 SYSTEM.TRIGGER_BLOCK 값을 사용합니다.
선택 및 선택 해제 이벤트
사용자 정의 MULTI_RETURN_ACTION 트리거(데이터 블록 또는 폼 최상위 레벨에 구현)를 작성하면, 시스템으로부터 레코드 선택 및 선택 해제 알림을 받을 수 있습니다. 이 트리거는 개별 또는 일괄 레코드 선택/해제가 발생할 때마다 실행됩니다.
트리거 변수
트리거 내부에서는 다음 변수들을 활용할 수 있습니다.
- GLOBAL.APPCORE_MULTI_BLOCK 전역 변수: 레코드 선택 또는 해제의 영향을 받는 데이터 블록의 이름을 담고 있습니다.
- GLOBAL.APPCORE_MULTI_ACTION 전역 변수: 다음 값 중 하나를 가집니다.
- 'RECORD_SELECTED': 레코드가 선택되었을 때
- 'RECORD_DESELECTED': 레코드 선택이 해제되었을 때
- 'LABEL_CHANGE': Select All 또는 Deselect All 메뉴 항목이 활성화/비활성화될 때
- APP_MULTI.LOOPING 패키지 변수: 루프 안에서 MULTI_RECORD_ACTION을 호출했는지 여부에 따라 TRUE 또는 FALSE 값을 가집니다.
폼에서 선택된 데이터 조회
각 데이터 블록마다 APP_MULTI 패키지는 현재 선택된 레코드의 번호를 담고 있는 레코드 그룹(record group)을 관리합니다. 데이터 블록 이름만 제공하면 다음 작업을 수행할 수 있습니다.
- APP_MULTI.GET_GROUP_COL 함수를 사용하여 특정 데이터 블록의 레코드 그룹 Only 컬럼에 접근합니다.
- APP_MULTI.GET_GROUP_COUNT 함수를 사용하여 선택된 레코드 수를 확인합니다.
예를 들어, 작업 지시(Discrete Jobs) 폼의 블록 W_JOBS와 필드 WIP_ENTITY_ID가 있을 때, 다음 PL/SQL 코드를 사용하면 선택된 작업들의 ID를 출력할 수 있습니다.
DECLARE
record_number_column groupcolumn;
selected_record_count NUMBER;
BEGIN
record_number_column := app_multi.get_group_col ('W_JOBS');
selected_record_count := app_multi.get_group_count ('W_JOBS');
FOR i IN 1 .. selected_record_count
LOOP
DECLARE
record_number NUMBER;
v_wip_entity_id NUMBER;
BEGIN
record_number := GET_GROUP_NUMBER_CELL (record_number_column, i);
GO_RECORD (record_number);
v_wip_entity_id := NAME_IN ('W_JOBS.WIP_ENTITY_ID');
fnd_message.debug ('v_wip_entity_id' || v_wip_entity_id);
EXCEPTION
WHEN OTHERS THEN
Null;
END;
END LOOP;
END;
결론
APP_MULTI 패키지를 활용하면 사용자 정의 Oracle 폼에서 대량 데이터를 효율적으로 처리할 수 있습니다. 사용자가 표준 폼에서 선택한 대량 데이터의 세부 정보를 손쉽게 가져올 수 있으며, 폼 개인화(Form Personalization)나 custom.pll 코드에서 이를 활용하면 표준 Oracle 폼에도 사용자 정의 기능을 자유롭게 추가할 수 있습니다.