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자 이내) 규칙도 준수해야 합니다. 운영 적용 전 개발 시스템에서 모드별 분기와 권한 검증 로직을 충분히 테스트하시기 바랍니다.