SAP ABAP에서 서브스크린에서의 화면 전환 처리 방법
SAP ABAP 개발에서 서브스크린(Subscreen)을 사용할 때, SET SCREEN 또는 LEAVE TO SCREEN 명령어를 호출하면 "SET SCREEN은(는) 하위 화면에서 허용되지 않습니다"라는 오류가 발생하는 경우가 있습니다. 이 글에서는 이 오류의 원인, 해결 방법, 그리고 프로그램 최초 실행 시 원하는 화면으로 이동하는 방법을 초보자도 이해할 수 있도록 상세히 설명합니다.
1. 서브스크린과 화면 전환의 제약사항 이해
1.1. 서브스크린이란?
서브스크린은 SAP Dynpro에서 메인 스크린의 일부로 포함되는 작은 화면입니다. 메인 스크린의 특정 영역에 삽입되어 사용자 인터페이스를 모듈화하고 재사용성을 높이는 데 사용됩니다. 예를 들어, 고객 정보 입력 화면에서 특정 탭이나 섹션을 서브스크린으로 구성할 수 있습니다.
서브스크린은 메인 스크린의 Flow Logic(PBO와 PAI)에 종속적으로 동작합니다. 따라서 서브스크린 자체에서 화면 전환 명령어(SET SCREEN, LEAVE TO SCREEN)를 직접 호출할 수 없습니다. 이는 SAP 시스템의 설계 원칙으로, 스크린 전환은 메인 스크린에서만 제어됩니다.
1.2. 오류의 원인
서브스크린의 PAI(Process After Input)에서 LEAVE TO SCREEN 0과 같은 명령어를 호출하면 다음과 같은 오류가 발생합니다:
"SET SCREEN은(는) 하위 화면에서 허용되지 않습니다."
이는 서브스크린이 독립적인 화면이 아니라 메인 스크린의 일부로 동작하기 때문입니다. 화면 전환을 처리하려면 메인 스크린의 PAI에서 필요한 로직을 구현해야 합니다.
1.3. 해결 목표
이 글에서는 다음 두 가지 목표를 달성하는 방법을 설명합니다:
- 프로그램 최초 실행 시 특정 화면으로 이동: 프로그램 시작 시 원하는 초기 화면(예: 메인 스크린)을 호출합니다.
- 서브스크린에서 '취소' 버튼 클릭 시 초기 화면으로 이동: 서브스크린의 사용자 입력(예: CANC 액션)을 메인 스크린으로 전달하여 LEAVE TO SCREEN 0을 호출합니다.
2. 해결 방법 개요
서브스크린에서 화면 전환을 처리하려면 다음과 같은 단계를 따릅니다:
- 프로그램 초기화: START-OF-SELECTION 이벤트에서 CALL SCREEN을 사용하여 초기 화면을 호출합니다.
- 서브스크린과 메인 스크린 통신: 서브스크린의 PAI에서 사용자 입력(예: CANC)을 전역 변수(예: gv_ok_code 또는 gv_leave_to_screen)로 저장하여 메인 스크린에 전달합니다.
- 메인 스크린에서 화면 전환 처리: 메인 스크린의 PAI에서 전역 변수를 확인하고, 필요한 경우 LEAVE TO SCREEN 0을 호출하여 프로그램을 종료하거나 초기 화면으로 이동합니다.
이 과정에서 전역 플래그 gv_leave_to_screen를 사용하여 화면 전환 요청을 관리하는 방법도 포함하겠습니다.
3. 예제 프로그램: ZDEMO_SUBSCREEN
아래는 예제 프로그램 ZDEMO_SUBSCREEN을 통해 위의 요구사항을 구현한 전체 구조입니다. 이 프로그램은 메인 스크린(0100번)과 서브스크린(0150번)을 포함하며, 취소 버튼(CANC) 클릭 시 프로그램을 종료합니다.
3.1. 프로그램 구조
(1) 프로그램 코드
프로그램은 START-OF-SELECTION에서 초기 화면을 호출하고, 전역 변수를 사용하여 서브스크린과 메인 스크린 간의 통신을 처리합니다.
REPORT ZDEMO_SUBSCREEN.
* 전역 변수 선언
DATA: gv_ok_code TYPE sy-ucomm, " 사용자 입력 저장
gv_leave_to_screen TYPE char1. " 화면 전환 요청 플래그
* 초기 화면 호출
START-OF-SELECTION.
CALL SCREEN 0100. " 메인 스크린 호출
(2) 메인 스크린(0100) Flow Logic
메인 스크린은 서브스크린을 호출하고, 사용자 입력을 처리합니다.
PROCESS BEFORE OUTPUT.
MODULE STATUS_0100.
CALL SUBSCREEN SUB_AREA INCLUDING 'ZDEMO_SUBSCREEN' '0150'.
PROCESS AFTER INPUT.
CALL SUBSCREEN SUB_AREA.
MODULE USER_COMMAND_0100.
- PBO: STATUS_0100 모듈에서 GUI 상태와 타이틀바를 설정하고, SUB_AREA라는 서브스크린 영역에 서브스크린 0150을 호출합니다.
- PAI: 서브스크린의 입력을 처리한 후, USER_COMMAND_0100 모듈에서 전역 변수(gv_ok_code 또는 gv_leave_to_screen)를 확인하여 화면 전환을 처리합니다.
(3) 서브스크린(0150) Flow Logic
서브스크린은 사용자 입력을 처리하고, 전역 변수에 값을 설정합니다.
PROCESS BEFORE OUTPUT.
MODULE INIT_SUBSCREEN_0150.
PROCESS AFTER INPUT.
MODULE USER_COMMAND_0150.
(4) ABAP 모듈 구현
각 스크린의 PBO와 PAI 모듈을 아래와 같이 구현합니다.
* 메인 스크린 PBO
MODULE STATUS_0100 OUTPUT.
SET PF-STATUS 'STATUS_0100'. " GUI 상태 설정
SET TITLEBAR 'TITLE_0100'. " 타이틀바 설정
ENDMODULE.
* 메인 스크린 PAI
MODULE USER_COMMAND_0100 INPUT.
CASE gv_ok_code.
WHEN 'CANC'.
CLEAR gv_ok_code.
IF gv_leave_to_screen = 'X'.
CLEAR gv_leave_to_screen.
LEAVE TO SCREEN 0. " 프로그램 종료
ENDIF.
ENDCASE.
ENDMODULE.
* 서브스크린 PBO
MODULE INIT_SUBSCREEN_0150 OUTPUT.
" 서브스크린 초기화 로직 (필요 시)
ENDMODULE.
* 서브스크린 PAI
MODULE USER_COMMAND_0150 INPUT.
CASE sy-ucomm.
WHEN 'CANC'.
gv_ok_code = 'CANC'. " 사용자 입력 저장
gv_leave_to_screen = 'X'. " 화면 전환 요청 플래그 설정
ENDCASE.
ENDMODULE.
3.2. 전역 플래그 gv_leave_to_screen 사용
gv_leave_to_screen는 화면 전환 요청을 명시적으로 관리하기 위한 플래그입니다. 이 플래그를 사용하면 다음과 같은 이점이 있습니다:
- 명확한 의도 전달: gv_ok_code만으로 액션을 처리하는 대신, 화면 전환 의도를 명확히 표시할 수 있습니다.
- 유연성: 복잡한 로직에서 특정 조건에 따라 화면 전환을 제어할 때 유용합니다.
예를 들어, CANC 외에 다른 액션(예: BACK)에서도 화면 전환을 처리해야 한다면, gv_leave_to_screen을 조건부로 설정하여 메인 스크린에서 이를 처리할 수 있습니다.
* 서브스크린 PAI
MODULE USER_COMMAND_0150 INPUT.
CASE sy-ucomm.
WHEN 'CANC'.
gv_ok_code = 'CANC'.
gv_leave_to_screen = 'X'. " 화면 전환 요청
WHEN 'BACK'.
gv_ok_code = 'BACK'.
gv_leave_to_screen = 'X'. " 다른 액션에서도 화면 전환 가능
ENDCASE.
ENDMODULE.
* 메인 스크린 PAI
MODULE USER_COMMAND_0100 INPUT.
IF gv_leave_to_screen = 'X'.
CASE gv_ok_code.
WHEN 'CANC' OR 'BACK'.
CLEAR: gv_ok_code, gv_leave_to_screen.
LEAVE TO SCREEN 0.
ENDCASE.
ENDIF.
ENDMODULE.
4. 구현 단계별 설명
4.1. 프로그램 초기화
프로그램이 시작되면 START-OF-SELECTION에서 CALL SCREEN 0100을 호출하여 메인 스크린을 표시합니다. 이는 프로그램의 진입점 역할을 하며, 사용자가 처음 보게 될 화면을 정의합니다.
4.2. 메인 스크린 설정
- 레이아웃: SE80에서 메인 스크린(0100)을 생성하고, 레이아웃에 서브스크린 영역(SUB_AREA)을 추가합니다.
- GUI 상태: SE41에서 STATUS_0100 GUI 상태를 생성하고, CANC 기능 코드를 추가합니다(예: 취소 버튼).
- PBO/PAI: PBO에서 서브스크린을 호출하고, PAI에서 사용자 입력을 처리합니다.
4.3. 서브스크린 설정
- 레이아웃: 서브스크린(0150)에 필요한 입력 필드, 버튼 등을 추가합니다.
- PAI: 사용자 입력(sy-ucomm)을 확인하고, gv_ok_code와 gv_leave_to_screen에 값을 설정하여 메인 스크린으로 전달합니다.
4.4. 화면 전환 처리
메인 스크린의 PAI에서 gv_leave_to_screen 플래그를 확인하여 LEAVE TO SCREEN 0을 호출합니다. SCREEN 0은 일반적으로 프로그램을 종료하거나 호출한 이전 화면(예: 선택 화면)으로 돌아갑니다.
5. 전체 Flow Logic 및 프로그램 샘플
아래는 위에서 설명한 내용을 종합한 전체 Flow Logic과 프로그램 샘플입니다.
5.1. 프로그램 코드 (ZDEMO_SUBSCREEN)
REPORT ZDEMO_SUBSCREEN.
* 전역 변수 선언
DATA: gv_ok_code TYPE sy-ucomm,
gv_leave_to_screen TYPE char1.
* 초기 화면 호출
START-OF-SELECTION.
CALL SCREEN 0100.
* 메인 스크린 PBO
MODULE STATUS_0100 OUTPUT.
SET PF-STATUS 'STATUS_0100'.
SET TITLEBAR 'TITLE_0100'.
ENDMODULE.
* 메인 스크린 PAI
MODULE USER_COMMAND_0100 INPUT.
IF gv_leave_to_screen = 'X'.
CASE gv_ok_code.
WHEN 'CANC'.
CLEAR: gv_ok_code, gv_leave_to_screen.
LEAVE TO SCREEN 0.
ENDCASE.
ENDIF.
ENDMODULE.
* 서브스크린 PBO
MODULE INIT_SUBSCREEN_0150 OUTPUT.
" 서브스크린 초기화
ENDMODULE.
* 서브스크린 PAI
MODULE USER_COMMAND_0150 INPUT.
CASE sy-ucomm.
WHEN 'CANC'.
gv_ok_code = 'CANC'.
gv_leave_to_screen = 'X'.
ENDCASE.
ENDMODULE.
5.2. 메인 스크린(0100) Flow Logic
PROCESS BEFORE OUTPUT.
MODULE STATUS_0100.
CALL SUBSCREEN SUB_AREA INCLUDING 'ZDEMO_SUBSCREEN' '0150'.
PROCESS AFTER INPUT.
CALL SUBSCREEN SUB_AREA.
MODULE USER_COMMAND_0100.
5.3. 서브스크린(0150) Flow Logic
PROCESS BEFORE OUTPUT.
MODULE INIT_SUBSCREEN_0150.
PROCESS AFTER INPUT.
MODULE USER_COMMAND_0150.
5.4. GUI 상태 (STATUS_0100)
- SE41에서 GUI 상태 STATUS_0100을 생성합니다.
- 기능 키에 CANC를 추가하고, 기능 유형을 E(종료 명령)로 설정합니다.
6. 추가 팁 및 디버깅
6.1. 디버깅 방법
- sy-ucomm 값이 올바르게 설정되는지 확인하세요. 디버깅 모드에서 CANC 버튼 클릭 시 sy-ucomm이 CANC로 설정되는지 점검합니다.
- gv_ok_code와 gv_leave_to_screen 값이 메인 스크린으로 올바르게 전달되는지 확인하세요.
- 서브스크린 영역(SUB_AREA)이 메인 스크린 레이아웃에 올바르게 정의되었는지 확인하세요.
6.2. 일반적인 문제와 해결 방법
- 오류: 서브스크린이 표시되지 않음
메인 스크린의 PBO에서 CALL SUBSCREEN 구문이 누락되었거나, 서브스크린 영역 이름이 잘못 지정되었을 수 있습니다. - 오류: CANC 액션이 동작하지 않음
GUI 상태에서 CANC 기능 코드가 정의되지 않았거나, PAI 모듈에서 sy-ucomm을 제대로 처리하지 못했을 가능성이 있습니다. - 오류: 화면 전환이 발생하지 않음
gv_leave_to_screen 플래그가 설정되지 않았거나, 메인 스크린 PAI에서 플래그를 확인하는 로직이 누락되었을 수 있습니다.
7. 결론
SAP ABAP에서 서브스크린은 메인 스크린의 일부로 동작하므로, SET SCREEN 또는 LEAVE TO SCREEN과 같은 화면 전환 명령어는 메인 스크린에서만 호출할 수 있습니다. 이를 해결하려면 서브스크린의 PAI에서 전역 변수(gv_ok_code, gv_leave_to_screen)를 사용하여 사용자 입력을 메인 스크린으로 전달하고, 메인 스크린의 PAI에서 화면 전환을 처리해야 합니다. 또한, 프로그램 최초 실행 시 CALL SCREEN을 사용하여 원하는 초기 화면을 호출할 수 있습니다.