SAP ABAP에서 서브스크린에서의 화면 전환 처리 방법

1 day ago 2

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. 해결 목표

이 글에서는 다음 두 가지 목표를 달성하는 방법을 설명합니다:

  1. 프로그램 최초 실행 시 특정 화면으로 이동: 프로그램 시작 시 원하는 초기 화면(예: 메인 스크린)을 호출합니다.
  2. 서브스크린에서 '취소' 버튼 클릭 시 초기 화면으로 이동: 서브스크린의 사용자 입력(예: CANC 액션)을 메인 스크린으로 전달하여 LEAVE TO SCREEN 0을 호출합니다.

2. 해결 방법 개요

서브스크린에서 화면 전환을 처리하려면 다음과 같은 단계를 따릅니다:

  1. 프로그램 초기화: START-OF-SELECTION 이벤트에서 CALL SCREEN을 사용하여 초기 화면을 호출합니다.
  2. 서브스크린과 메인 스크린 통신: 서브스크린의 PAI에서 사용자 입력(예: CANC)을 전역 변수(예: gv_ok_code 또는 gv_leave_to_screen)로 저장하여 메인 스크린에 전달합니다.
  3. 메인 스크린에서 화면 전환 처리: 메인 스크린의 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_codegv_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-ucommCANC로 설정되는지 점검합니다.
  • gv_ok_codegv_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을 사용하여 원하는 초기 화면을 호출할 수 있습니다.

Read Entire Article