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을 사용하여 원하는 초기 화면을 호출할 수 있습니다.