CBO(고객 자체 개발) 프로그램을 만들 때 화면 상단의 메뉴 바·툴바·기능키를 직접 구성해야 하는 경우가 많습니다. 표준 메뉴는 ABAP 이 자동으로 일부 채워주지만, "저장 / 변경 / 인쇄 / 엑셀 다운로드" 같은 업무 버튼은 개발자가 GUI Status 안에 직접 등록해야 화면에 나타납니다. 등록만으로 끝나는 것도 아니고, 사용자가 그 버튼을 눌렀을 때 어떤 모듈을 호출할지까지 한 세트로 연결해야 합니다.
이 작업은 두 갈래로 나뉩니다. 첫째, SE41 Menu Painter(또는 SE80 안의 GUI Status 편집기) 에서 메뉴 바·툴바·기능키 항목을 만들고 각 버튼에 Function Code 를 부여합니다. 둘째, 프로그램의 PBO 에서 SET PF-STATUS 로 그 GUI Status 를 화면에 부착하고, PAI 의 USER_COMMAND 모듈에서 sy-ucomm 으로 분기 처리합니다.
이 글은 CBO 프로그램의 메뉴 바·툴바 만드는 표준 흐름을 SE80 진입부터 GUI Status 활성화 + 프로그램 호출 코드 + USER_COMMAND 분기까지 한 번에 모은 실무 메모입니다. 표준 펑션키(F3 Back · F12 Cancel · F8 Execute 등) 활용과 흔히 빠뜨리는 함정도 함께 정리했습니다.
핵심 — GUI Status 의 3개 영역
GUI Status 한 개 안에는 3개의 영역이 들어 있고, 각자 다른 위치에 표시됩니다.
| 영역 | 표시 위치 | 최대 개수 |
|---|---|---|
| Menu Bar (메뉴 바) | 화면 최상단의 "프로그램 · 편집 · 점프 · ..." 메뉴 | 사용자 6개 + 표준 2개(System, Help) = 8개 |
| Function Keys (기능키) | F1~F12 키 매핑 (표준 또는 자유) | F1~F12 (Ctrl/Shift 조합 가능) |
| Application Toolbar (응용 툴바) | 표준 툴바 아래의 업무용 버튼 줄 | 최대 35개 버튼 |
핵심 한 줄: 3개 영역 모두 같은 GUI Status 한 개 안에 정의 되며, 같은 Function Code 를 공유합니다. 메뉴에서 "저장" 을 누르거나 툴바의 저장 아이콘을 누르거나 Ctrl + S 를 누르거나 — 셋 다 같은 Function Code(SAVE) 가 sy-ucomm 으로 전달돼 동일한 처리를 합니다.
1단계 — SE80 에서 GUI Status 생성
CBO 프로그램이 있는 상태에서 SE80 으로 진입하는 것이 가장 빠릅니다.
SE80 진입 → 프로그램명 입력 (예: ZRXX_REPORT_001) → Enter
→ 좌측 트리에서 프로그램 우클릭 → Create → GUI Status
→ 팝업
Status : STATUS_0100 (자유 이름)
Short Text : 메인 화면 상태
Status Type : ◉ Normal Screen ○ Dialog Box ○ Context Menu
→ Continue
→ GUI Status 편집기 진입
이름 규칙은 자유지만 화면별로 분리해 두는 것이 관리 면에서 좋습니다. 자주 쓰는 패턴은 화면 번호와 매칭된 STATUS_0100·STATUS_LIST·STATUS_DETAIL 같은 형태입니다.
SE41 직접 진입 방법 (선택 사항):
명령창에 /n SE41 → 프로그램명 + Status 명 입력 → Create. SE80 안에서 진입한 것과 동일한 편집기로 들어갑니다.
2단계 — Standard 표준 메뉴 자동 채우기
빈 GUI Status 화면에서 가장 먼저 할 일은 표준 메뉴 채우기입니다.
GUI Status 편집기 → 상단 메뉴 Edit → Standard
또는 툴바의 [Standard] 아이콘 클릭
→ System / Help 메뉴 자동 추가
→ 표준 펑션키 F3(Back)·F12(Cancel)·F15(Exit)·F8(Execute) 등 자동 매핑
→ Application Toolbar 표준 버튼(Back · Exit · Cancel · Save · Print) 자동 추가
이 한 번의 클릭으로 화면 종료(F3), 작업 취소(F12), 시스템 메뉴, 도움말 같은 SAP 공통 동작이 모두 등록됩니다. 사용자 입장에서는 SAP 표준 화면처럼 익숙한 동작을 그대로 받을 수 있게 됩니다.
3단계 — 사용자 메뉴 항목과 Function Code 추가
표준 위에 업무 버튼을 얹습니다. 예시: "저장 / 새로고침 / 엑셀 다운로드".
Menu Bar 영역
→ 빈 칸 클릭 → 메뉴 이름 입력 (예: 데이터)
→ Enter → 하위 항목 입력 화면 진입
항목 이름 : 저장
Function Code : SAVE
항목 이름 : 새로고침
Function Code : REFRESH
→ Apply
Application Toolbar 영역
→ 빈 슬롯 클릭 → Function Code 입력 (예: SAVE)
→ 동일한 Function Code 를 입력하면 메뉴와 자동 연결
→ Icon · Static Text · Quick Info(툴팁) 설정
Icon : @2L@ (디스켓 아이콘)
Static Text : 저장
Quick Info : 변경 사항 저장 (Ctrl + S)
F-Type : (비움 — 일반)
→ 추가 버튼 (REFRESH · EXCEL_DL) 도 같은 방식


F-Type 옵션은 4가지가 있고 동작이 다릅니다.
| F-Type | 동작 |
|---|---|
| (빈 값) | 일반 Function Code — PAI 가 흐르고 sy-ucomm 에 전달 |
E (Exit) |
화면 종료 — PAI 검증 건너뜀 (취소·뒤로·종료 버튼용) |
T (Transaction) |
다른 트랜잭션 호출 — 코드 없이 T-Code 만 지정 |
P (Pop-up) |
팝업 화면 호출 — Dialog Box 타입 GUI Status 와 연동 |
저장·실행 같은 입력 값 검증이 필요한 버튼은 (빈 값) 그대로, 종료·취소·뒤로 같은 화면 종료 버튼은 반드시 E 로 지정. E 가 빠지면 종료 버튼이 PAI 검증에 막혀 화면을 못 빠져나가는 현상이 발생합니다.
4단계 — Function Code 활성화 + 저장
설정을 완료했으면 활성화 두 단계가 필요합니다.
GUI Status 편집기
→ Ctrl + S (저장)
→ Ctrl + F3 (활성화)
→ 좌측 트리에서 GUI Status 가 빨간 → 검정 아이콘으로 변경 확인
활성화 안 하면 프로그램 실행 시 옛날 정의대로 동작하거나, SET PF-STATUS 가 "Status not found" 런타임 에러로 떨어집니다.
5단계 — 프로그램에서 GUI Status 호출
PBO 모듈에서 SET PF-STATUS 한 줄이면 부착됩니다.
* === Flow Logic ===
PROCESS BEFORE OUTPUT.
MODULE status_0100.
PROCESS AFTER INPUT.
MODULE user_command_0100.
* === Module Pool 코드 ===
MODULE status_0100 OUTPUT.
SET PF-STATUS 'STATUS_0100'.
SET TITLEBAR 'TITLE_0100'. " GUI Title 도 있다면
ENDMODULE.
SET PF-STATUS 는 PBO 가 흐를 때마다 호출돼도 부담이 없습니다. 화면이 다시 그려질 때마다 같은 상태를 유지합니다. 화면별로 다른 GUI Status 가 필요하면 각 PBO 모듈에서 다른 이름을 호출하면 됩니다.
Report 프로그램(리스트 출력) 의 경우:
START-OF-SELECTION.
...
SET PF-STATUS 'STD_REPORT'.
WRITE: / '결과 ...'.
AT USER-COMMAND.
CASE sy-ucomm.
WHEN 'EXCEL_DL'. PERFORM excel_download.
WHEN ...
ENDCASE.
리포트 출력 화면(WRITE 기반) 에서는 PBO 가 따로 없고 START-OF-SELECTION 안에서 SET PF-STATUS, AT USER-COMMAND 이벤트 블록에서 분기 처리합니다.
6단계 — USER_COMMAND 분기 처리
사용자가 버튼을 누르면 그 Function Code 가 sy-ucomm 에 담겨 PAI 로 흘러옵니다.
MODULE user_command_0100 INPUT.
CASE sy-ucomm.
WHEN 'SAVE'.
PERFORM save_data.
WHEN 'REFRESH'.
PERFORM refresh_data.
WHEN 'EXCEL_DL'.
PERFORM download_to_excel.
WHEN 'BACK' OR 'EXIT' OR 'CANCEL'.
LEAVE TO SCREEN 0.
WHEN OTHERS.
" 표준 시스템 펑션 (System/Help) 은 SAP 가 자동 처리
ENDCASE.
CLEAR sy-ucomm. " 다음 PAI 에서 잔존 방지
ENDMODULE.
CLEAR sy-ucomm 의 필요성: PAI 마지막에 sy-ucomm 을 비워주지 않으면 다음 PBO 가 호출될 때 값이 그대로 남아 있을 수 있습니다. 어떤 동작이 화면 그리기 외에 다른 자동 호출을 트리거하는 경우 의도치 않은 분기가 일어날 수 있어 매번 정리해 주는 것이 안전합니다.

Exit-Command 별도 처리
종료 버튼은 PAI 검증(FIELD ... MODULE) 을 건너뛰어야 합니다. 그렇지 않으면 입력 값이 잘못된 상태에서 사용자가 종료 버튼을 눌러도 검증이 흐르며 화면을 못 빠져나갑니다.
* === Flow Logic ===
PROCESS AFTER INPUT.
MODULE exit_command AT EXIT-COMMAND. " ★ 검증 앞에 배치
FIELD gv_matnr MODULE check_matnr.
MODULE user_command_0100.
MODULE exit_command INPUT.
CASE sy-ucomm.
WHEN 'BACK' OR 'EXIT' OR 'CANCEL'.
LEAVE PROGRAM. " 또는 LEAVE TO SCREEN 0.
ENDCASE.
ENDMODULE.
AT EXIT-COMMAND 옵션은 F-Type E 로 지정된 버튼만 이 모듈을 호출합니다. SAVE·REFRESH 같은 일반 버튼은 영향 받지 않습니다.
전체 코드 — 복사용 통합본
GUI Status 만들기는 SE80/SE41 GUI 작업이라 ABAP 측 코드는 단순합니다. 신규 화면 프로그램에 그대로 넣을 수 있는 템플릿:
REPORT zrxx_screen_demo.
DATA: gv_matnr TYPE matnr,
gv_werks TYPE werks_d.
CALL SCREEN 0100.
* === Flow Logic (SE51 에서 작성) ===
* PROCESS BEFORE OUTPUT.
* MODULE status_0100.
*
* PROCESS AFTER INPUT.
* MODULE exit_command AT EXIT-COMMAND.
* FIELD gv_matnr MODULE check_matnr.
* MODULE user_command_0100.
* === Module Pool ===
MODULE status_0100 OUTPUT.
SET PF-STATUS 'STATUS_0100'.
SET TITLEBAR 'TITLE_0100'.
ENDMODULE.
MODULE exit_command INPUT.
CASE sy-ucomm.
WHEN 'BACK' OR 'EXIT' OR 'CANCEL'.
LEAVE PROGRAM.
ENDCASE.
ENDMODULE.
MODULE check_matnr INPUT.
IF gv_matnr IS INITIAL.
MESSAGE '자재번호를 입력하세요.' TYPE 'E'.
ENDIF.
ENDMODULE.
MODULE user_command_0100 INPUT.
CASE sy-ucomm.
WHEN 'SAVE'.
PERFORM save_data.
WHEN 'REFRESH'.
PERFORM refresh_data.
WHEN 'EXCEL_DL'.
PERFORM download_to_excel.
ENDCASE.
CLEAR sy-ucomm.
ENDMODULE.
FORM save_data.
" 저장 로직
ENDFORM.
FORM refresh_data.
" 새로고침 로직
ENDFORM.
FORM download_to_excel.
" 엑셀 다운로드 로직
ENDFORM.
흔히 빠뜨리는 함정
Standard 안 누르고 빈 GUI Status 활성화
표준 메뉴(Edit → Standard) 를 채우지 않고 그대로 활성화하면 화면에 System / Help 메뉴조차 없는 황량한 GUI 가 됩니다. F3 도 안 먹어서 사용자가 화면을 빠져나갈 수 없습니다. 반드시 Standard 먼저.
Exit-Command 자리 빠뜨림
PROCESS AFTER INPUT.
FIELD gv_matnr MODULE check_matnr. " ❌ Exit-Command 없음
MODULE user_command_0100.
종료 버튼을 만들고 F-Type 을 E 로 줬지만 PAI 첫 줄에 MODULE exit_command AT EXIT-COMMAND. 가 빠지면 검증을 건너뛰지 못합니다. 둘은 한 세트.
F-Type E 안 줬는데 종료 버튼
Application Toolbar
EXIT 버튼 Function Code: EXIT F-Type: (빈 값) ❌
F-Type 이 빈 값이면 PAI 검증이 그대로 흘러 화면을 못 빠져나갑니다. 종료/취소/뒤로 버튼은 반드시 F-Type 을 E 로.
sy-ucomm 안 비움
WHEN 'SAVE'.
PERFORM save.
" CLEAR sy-ucomm 누락
다음 PBO 후 의도치 않은 화면 자동 호출이나 더블 클릭 시 잔존값으로 인한 오동작이 발생할 수 있습니다. PAI 끝에 항상 CLEAR sy-ucomm.
GUI Status 활성화 누락
저장(Ctrl + S) 만 하고 활성화(Ctrl + F3) 를 빠뜨리면 실행 시 GETWA_NOT_ASSIGNED 같은 런타임 에러가 나거나 옛날 상태가 사용됩니다. 좌측 트리의 GUI Status 아이콘 색으로 활성화 여부 확인.
Application Toolbar 35개 초과
기능이 많은 화면에서 버튼을 무리하게 늘리면 35개 한도에 걸립니다. 메뉴 바로 분류해 옮기거나, 비슷한 기능은 드롭다운 형태로 묶는 것이 안전합니다.
요약
| 단계 | 작업 | 핵심 |
|---|---|---|
| 1 | GUI Status 생성 | SE80 또는 SE41 → 이름 + Type 지정 |
| 2 | Standard 채우기 | Edit → Standard 한 번 클릭 — 빠뜨리지 말 것 |
| 3 | 사용자 버튼 | Menu Bar · Toolbar · Function Keys 에 Function Code 부여 — 종료 버튼은 F-Type E |
| 4 | 저장 + 활성화 | Ctrl + S · Ctrl + F3 둘 다 |
| 5 | PBO 호출 | SET PF-STATUS 'STATUS_0100'. |
| 6 | PAI 분기 | CASE sy-ucomm + MODULE exit_command AT EXIT-COMMAND |
CBO 프로그램의 메뉴 바·툴바 만들기는 GUI 도구 한 번 + ABAP 코드 두 줄로 끝나는 작업입니다. 표준 메뉴 자동 채우기(Standard) → 사용자 버튼 Function Code 부여 → SET PF-STATUS + CASE sy-ucomm. 종료 버튼은 F-Type E + AT EXIT-COMMAND 분리만 잊지 않으면 사용자에게 SAP 표준 화면과 같은 자연스러운 메뉴를 제공할 수 있습니다.
Disclaimer — 이 포스트는 실무 정리 노트를 바탕으로 AI 보조로 정리되었습니다.
SE41(Menu Painter) · SE80 의 GUI Status 편집기 · SET PF-STATUS · SET TITLEBAR 명령은 ABAP / Dynpro 표준 메커니즘으로 ECC 6.0 / S/4HANA on-premise 환경에서 동일하게 동작합니다. Application Toolbar 최대 35개 버튼 · Menu Bar 사용자 메뉴 최대 6개(System / Help 2개 자동 추가로 총 8개) 제한은 SAP GUI 의 화면 표시 한계로 시스템 버전 의존이 없습니다. F-Type E(Exit) 가 지정된 버튼만 AT EXIT-COMMAND 모듈로 흐르며, PAI 의 FIELD ... MODULE 검증을 건너뜁니다. Fiori / SAPUI5 환경의 신규 화면은 sap.m.Page 의 footer 와 sap.m.OverflowToolbar 로 동일 개념을 구현하며, 본문 키워드는 SAP GUI Module Pool / Dynpro 환경에만 적용됩니다.