본문 바로가기
ABAP 문법 & 기법

[SAP ABAP] SET PF-STATUS EXCLUDING — Application Toolbar 버튼 동적 비활성화 (Dialog Screen)

by Song.sh 2026. 5. 15.

Dialog Screen 을 만들다 보면 같은 화면에서도 상황에 따라 버튼을 보이고/숨기고·활성화/비활성화 해야 할 때가 많습니다. 예를 들어 조회 모드면 [저장] 버튼이 없어야 하고, 권한이 없는 사용자면 [삭제] 가 비활성화돼야 합니다. 매번 GUI STATUS 를 새로 만드는 건 비효율 — ABAP 표준 문법으로 한 STATUS 안의 버튼을 조건별로 제외할 수 있습니다.

 

핵심은 SET PF-STATUS 'name' EXCLUDING it_extab 한 줄. it_extab 에 숨기고 싶은 기능 코드(FCODE) 를 채워 넘기면, 어플리케이션 툴바·메뉴바·기능키에서 해당 FCODE 가 한꺼번에 회색(비활성) 처리됩니다. SET TITLEBAR 와 함께 쓰면 화면 제목까지 한 번에 바꿀 수 있어 다이얼로그 모드 전환에 자주 쓰입니다.

 

이 글은 STATUS 의 버튼/메뉴/기능키를 조건에 따라 동적으로 가리는 표준 패턴 을 SE41 화면·TOP 선언·PBO 모듈 코드까지 한 번에 정리한 메모입니다.


핵심 원리

STATUS 의 항목별 적용 방식 비교.

STATUS 구성요소 SE41 설정 EXCLUDING 효과
메뉴바 상단 메뉴 트리에 FCODE 등록 해당 FCODE 메뉴 항목 회색(비활성) 처리
어플리케이션 툴바 항목 1~35 슬롯에 FCODE 배치 해당 슬롯의 버튼 사라짐/비활성
기능키 F1~F12, Ctrl+ 조합 매핑 단축키 눌러도 동작 안 함
표준 툴바 BACK / CANCEL / EXIT 등 시스템 표준 표준 FCODE(BACK·CANC·EXIT) 도 동일하게 EXCLUDING 가능

핵심 트레이드오프: STATUS 를 모드별로 여러 개 만드는 방법도 있지만, 추가/수정 시 유지보수 부담이 커집니다. 하나의 STATUS + EXCLUDING 동적 제어 가 표준 패턴 — 버튼이 추가돼도 한 군데만 손보면 됩니다.


1단계 — SE41 에서 GUI STATUS 만들기

대상 프로그램에서 더블클릭 → "Yes, Create" 로 신규 STATUS 를 생성하거나, 트랜잭션 SE41 에서 직접 생성합니다.

설정 항목 내용
STATUS 명 예) S100 — 대문자 4자리 권장
STATUS 유형 Dialog 화면용 → Normal Screen
어플리케이션 툴바 슬롯 1~35 에 FCODE 입력 (예: CREF, SAVE)
표준 툴바 BACK · CANC · EXIT 자동 매핑 (F3/F12/Shift+F3)

핵심 요점 — FCODE 는 짧고 의미 있는 4자리 이내가 관례. CREF·SAVE·DEL 식으로 통일해야 PBO 코드에서 다루기 편합니다.


2단계 — TOP 인클루드에 EXCLUDING 테이블 선언

가려질 FCODE 들을 담을 내부 테이블 을 글로벌로 선언합니다. 구조의 한 필드만 있으면 되며 그 필드는 반드시 SY-UCOMM 타입이어야 합니다.

"TOOLBAR 설정위한 선언"
DATA: BEGIN OF is_extab,
        fcode LIKE sy-ucomm,
      END OF is_extab,
      it_extab LIKE TABLE OF is_extab.

핵심 포인트:

  • 필드명은 자유fcode 가 관례, 다른 이름도 동작은 함
  • 타입은 반드시 LIKE SY-UCOMM (또는 CHAR4·CHAR20 등 동일 호환 타입)
  • 글로벌 선언 — TOP 인클루드에 두어야 PBO·PAI 어디서든 접근 가능

3단계 — PBO 에서 조건별 EXCLUDING 적용

PBO(Process Before Output) 모듈 안에서 조건에 따라 it_extab 을 채우고 SET PF-STATUS ... EXCLUDING 으로 적용합니다.

MODULE status_0100 OUTPUT.

" R_DATA 로 실행시:
"   S100 에 설정되어 있는 CREF, EXIT 을 비활성화/숨겨라
"   T100 의 제목을 보여줘라
  IF r_data = 'X'.
    CLEAR: is_extab, it_extab.

    is_extab-fcode = 'CREF'.
    APPEND is_extab TO it_extab.

    is_extab-fcode = 'EXIT'.
    APPEND is_extab TO it_extab.

    SET PF-STATUS 'S100' EXCLUDING it_extab.
    SET TITLEBAR 'T100'.

" R_DATA 가 아닐 시:
"   S100 에 설정되어 있는 CANC 를 숨기거나 비활성화 시켜라
"   T200 의 제목을 보여줘라
  ELSE.
    CLEAR: is_extab, it_extab.

    is_extab-fcode = 'CANC'.
    APPEND is_extab TO it_extab.

    SET PF-STATUS 'S100' EXCLUDING it_extab.
    SET TITLEBAR 'T200'.
  ENDIF.

ENDMODULE.                 " STATUS_0100  OUTPUT

 

핵심 메서드·문법:

구문 역할
SET PF-STATUS 'name' 화면에 STATUS 적용 (EXCLUDING 없으면 전체 활성)
SET PF-STATUS 'name' EXCLUDING it_extab 테이블 안 FCODE 들 일괄 비활성
SET PF-STATUS 'name' EXCLUDING lv_fcode 단일 변수도 가능 (한 개만 가릴 때)
SET TITLEBAR 'name' 화면 제목바 텍스트 교체 (SE41 의 Title List 에서 등록)

4단계 — TITLEBAR 동시 전환 + PAI 처리

PBO 에서 SET TITLEBAR 까지 같이 바꿔주면 사용자에게 모드 차이를 시각적으로 알릴 수 있습니다. PAI(Process After Input) 에서는 평소처럼 SY-UCOMM 으로 FCODE 받아 분기.

MODULE user_command_0100 INPUT.
  CASE sy-ucomm.
    WHEN 'CREF'.       " 신규 생성
      PERFORM create_data.
    WHEN 'SAVE'.       " 저장
      PERFORM save_data.
    WHEN 'EXIT' OR 'CANC'.
      LEAVE TO SCREEN 0.
    WHEN 'BACK'.
      LEAVE PROGRAM.
  ENDCASE.
ENDMODULE.

 

요점은 EXCLUDING 으로 가린 FCODE 는 PAI 에 아예 도달하지 않는다 는 점. 사용자가 단축키로 눌러도 동작하지 않으므로 PAI 안에 별도 권한 체크를 두지 않아도 됩니다.


흔히 빠뜨리는 함정

it_extab CLEAR 누락 → 누적

PBO 는 화면 표시 직전마다 호출됩니다. 매번 CLEAR it_extab 안 하면 이전 호출의 FCODE 가 누적되어 의도와 달리 점점 더 많이 가려집니다. 분기 전에 반드시 CLEAR.

타입 미스매치

it_extab 의 필드 타입이 SY-UCOMM 과 호환되지 않으면 EXCLUDING 이 무시되거나 덤프. LIKE SY-UCOMM 으로 선언하는 게 안전.

EXCLUDING 위치는 PBO 모듈 안

PAI 안이나 START-OF-SELECTION 에서 SET PF-STATUS 를 호출해도 적용은 다음 화면 표시 때 — 혼란 방지 위해 PBO 모듈 안에서만 호출.

TITLEBAR 등록 누락

SET TITLEBAR 'T100' 호출했는데 SE41 의 Title List 에 T100 이 없으면 런타임 덤프(DYNP_FIELD_CONVERSION). STATUS 와 Title 모두 활성화 필요.

FCODE 대소문자

ABAP 키워드는 대소문자 무시지만, FCODE 비교는 대문자가 안전. SE41 에서 CREF 로 등록했다면 코드에서도 대문자.

표준 툴바(BACK/CANC/EXIT) 도 EXCLUDING 대상

표준 툴바 버튼도 같은 방식으로 가릴 수 있습니다 — CANC·EXIT·BACK 등을 it_extab 에 넣으면 시스템 표준 버튼도 비활성. 단 BACK 까지 가리면 빠져나갈 수 없어 사용자가 갇히므로 신중하게.

화면 호출 전 STATUS 가 비어있으면 기본 STATUS

PBO 안에서 SET PF-STATUS 가 한 번도 호출되지 않으면 SAP 기본 표준 STATUS 가 적용. 우리가 만든 커스텀 버튼이 안 보인다면 PBO 호출 누락 의심.

TITLEBAR 파라미터 전달

TITLEBAR 도 WITH 로 변수 치환 가능 — SET TITLEBAR 'T100' WITH lv_matnr. SE41 Title List 에 &1 식 플레이스홀더 미리 등록.


전체 코드 — 복사용 통합본

위 단계를 하나의 ABAP 다이얼로그 프로그램으로 합친 통합본입니다. SE38 에 그대로 복사해서 활성화 후 SE41 에서 S100 STATUS 와 T100·T200 Title 을 등록, SE51 에서 Screen 0100 을 생성하면 동작합니다.

REPORT zexample_pf_status_excl.

* ========================================================
* TOP 인클루드 — EXCLUDING 테이블 선언
* ========================================================
DATA: BEGIN OF is_extab,
        fcode LIKE sy-ucomm,
      END OF is_extab,
      it_extab LIKE TABLE OF is_extab.

DATA: r_data TYPE c LENGTH 1.   " 조건 플래그 (예: 'X' = 등록 모드)
DATA: gv_ucomm TYPE sy-ucomm.

* ========================================================
* Selection Screen (또는 다른 진입점에서 r_data 결정)
* ========================================================
PARAMETERS: p_mode  TYPE c LENGTH 1 DEFAULT 'X'.   " X = 등록, ' ' = 조회

START-OF-SELECTION.
  r_data = p_mode.
  CALL SCREEN 0100.

* ========================================================
* PBO Module — STATUS_0100
*   - 조건별로 EXCLUDING 테이블 채워서 SET PF-STATUS
*   - TITLEBAR 도 함께 전환
* ========================================================
MODULE status_0100 OUTPUT.

* ★ 핵심: PBO 매 호출마다 누적 방지 위해 CLEAR 필수
  CLEAR: is_extab, it_extab.

  IF r_data = 'X'.
*   등록 모드 — CREF / EXIT 비활성
    is_extab-fcode = 'CREF'.
    APPEND is_extab TO it_extab.
    is_extab-fcode = 'EXIT'.
    APPEND is_extab TO it_extab.

    SET PF-STATUS 'S100' EXCLUDING it_extab.
    SET TITLEBAR 'T100'.
  ELSE.
*   조회 모드 — CANC 비활성
    is_extab-fcode = 'CANC'.
    APPEND is_extab TO it_extab.

    SET PF-STATUS 'S100' EXCLUDING it_extab.
    SET TITLEBAR 'T200'.
  ENDIF.

ENDMODULE.                                 " STATUS_0100  OUTPUT

* ========================================================
* PAI Module — USER_COMMAND_0100
*   - EXCLUDING 으로 가린 FCODE 는 여기 도달 안 함
* ========================================================
MODULE user_command_0100 INPUT.
  gv_ucomm = sy-ucomm.
  CLEAR sy-ucomm.

  CASE gv_ucomm.
    WHEN 'CREF'.
      MESSAGE '신규 생성 처리' TYPE 'S'.
    WHEN 'SAVE'.
      MESSAGE '저장 처리' TYPE 'S'.
    WHEN 'EXIT' OR 'CANC'.
      LEAVE TO SCREEN 0.
    WHEN 'BACK'.
      LEAVE PROGRAM.
  ENDCASE.

ENDMODULE.                                 " USER_COMMAND_0100  INPUT

* ※ 사전 준비:
*   1) SE41 → STATUS S100 생성 (Normal Screen)
*      - 어플리케이션 툴바: CREF / SAVE / DEL 등 FCODE 등록
*      - 표준 툴바: BACK / CANC / EXIT 활성화
*   2) SE41 → Title List 에 T100('등록'), T200('조회') 등록
*   3) SE51 → Screen 0100 (Flow Logic 만들고 모듈 호출)
*      PROCESS BEFORE OUTPUT.  MODULE status_0100.
*      PROCESS AFTER INPUT.    MODULE user_command_0100.

요약

단계 처리 핵심
1 SE41 STATUS 생성 메뉴바·어플리케이션 툴바·기능키·표준 툴바 구성 + Title 등록
2 EXCLUDING 테이블 선언 fcode LIKE sy-ucomm 필드의 내부 테이블 (TOP 인클루드)
3 PBO 조건 분기 CLEAR 후 FCODE 채우고 SET PF-STATUS 'name' EXCLUDING it_extab
4 TITLEBAR 전환 SET TITLEBAR 'name' 으로 모드별 제목 표시
5 PAI 분기 SY-UCOMM CASE 분기 — EXCLUDING 된 FCODE 는 도달 안 함

다이얼로그 화면의 모드 전환은 STATUS 를 여러 개 만드는 것보다 하나의 STATUS + EXCLUDING 동적 제어 가 표준입니다. 핵심은 PBO 매 호출마다 CLEAR 한 뒤 조건별로 FCODE 를 채우고 SET PF-STATUS ... EXCLUDING 한 줄로 끝낸다는 것. SET TITLEBAR 와 묶으면 모드 차이를 사용자에게 직관적으로 전달할 수 있고, EXCLUDING 으로 가린 버튼은 PAI 에 도달하지 않아 권한 체크 누락 위험도 사라집니다.


Disclaimer — 이 포스트는 실무 정리 노트를 바탕으로 AI 보조로 정리되었습니다. SET PF-STATUS·SET TITLEBAR·SY-UCOMM 은 SAP NetWeaver 표준 ABAP 문법이며 시스템 버전 의존 없이 동작합니다. 다만 SE41 STATUS 와 SE51 Screen Flow Logic 이 사전에 정확히 구성되어 있어야 하며, 사용자 정의 FCODE 의 대소문자·길이(보통 4자 이내) 규칙도 준수해야 합니다. 운영 적용 전 개발 시스템에서 모드별 분기와 권한 검증 로직을 충분히 테스트하시기 바랍니다.