SAP MM 모듈의 표준 화면(ME21N·ME22N·ME23N) 에 회사 고유 필드(예: 모선관리번호·내부 분류 코드·검수 결과 등) 를 추가해야 할 때가 있습니다. 표준 SAP 코드를 직접 수정하지 않고 같은 화면 위에 자체 필드를 얹는 방법이 Screen Exit + CI Include + BAdI 의 MAP_DYNPRO_FIELDS 메소드 조합 입니다.
화면 확장은 단순히 필드 하나 끼워 넣는 작업처럼 보이지만 DB 테이블·서브스크린·BAdI·필드 활성화·F4 서치헬프 까지 5개 영역이 연결되어 동작합니다. 한 군데만 빠뜨려도 "화면에 필드는 보이는데 입력이 안 됨", "조회는 되는데 저장 시 값이 사라짐" 같은 사고가 발생합니다.
이 글에서는 EKPO 에 회사 자체 필드를 추가해서 ME21N 화면에서 입력 가능하게 만드는 표준 절차를, CI Include 추가 → 서브스크린 배치 → BAdI 매핑 → 활성화 제어 → F4 서치헬프 순서로 정리합니다. 모든 단계의 함정과 우회 방법도 함께 정리합니다.
핵심 — 5개 영역이 한 세트로 동작한다
| 영역 | 담당 | T-Code / 객체 |
|---|---|---|
| 1 | DB 컬럼 추가 (CI Include) | SE11 → CI_EKPODB |
| 2 | 화면 필드 배치 (Screen Exit) | SE80 → 표준 Enhancement FG 의 서브스크린 |
| 3 | 데이터 매핑 (BAdI) | ME_PROCESS_PO_CUST·MAP_DYNPRO_FIELDS |
| 4 | 활성화 제어 (FIELDSELECTION) | BAdI 의 FIELDSELECTION_ITEM |
| 5 | F4 서치헬프 | 서브스크린의 PROCESS ON VALUE-REQUEST |
핵심 흐름: DB 에 컬럼이 있어야 화면 필드를 배치할 수 있고, BAdI 가 화면↔백엔드 매핑을 해줘야 입력값이 DB 까지 전달되고, FIELDSELECTION 이 활성으로 풀어줘야 사용자가 실제 입력할 수 있습니다. 한 단계라도 빠지면 "보이지만 안 됨" 상태가 됩니다.
작업 시기 — 운영기에 적용하기 전 반드시 공지. 표준 화면을 다른 모듈(SD·FI·QM 등) 도 사용하므로 라이브 시간대 적용은 위험합니다. 가능하면 업무 외 시간 + 공지 메일 + 롤백 계획까지 준비하시기 바랍니다.
1단계 — CI_EKPODB 에 필드 추가
표준 테이블(EKPO) 자체에는 직접 컬럼을 추가할 수 없습니다. SAP 가 미리 박아둔 CI Include(CI_EKPODB) 에 추가하는 것이 표준 방법입니다.
SE11 → CI_EKPODB → 변경
→ 새 필드 추가:
- 필드명: ZMOSEN
- 데이터 엘리먼트: ZMOSEN (사전에 SE11 에서 생성)
- 도메인: ZMOSEN_DOM (영문 / 한글 짧은 설명 포함)
→ 활성화 (Database utility 까지 처리)
CI Include 가 활성화되면 자동으로 EKPO 의 컬럼이 확장됩니다. SE16N 에서 EKPO 를 열면 새 필드가 보이고 SELECT 도 가능합니다.
Z 네이밍 권장 — 표준 영역과 충돌 방지를 위해 데이터 엘리먼트·도메인·필드명 모두 Z* 또는 Y* 로. 사내 네이밍 룰을 따르시기 바랍니다.
2단계 — Screen Exit 서브스크린에 필드 배치
EKPO 처리용 표준 Enhancement Function Group 안에 SAP 가 미리 비워둔 서브스크린이 있습니다. 거기에 새 필드를 배치합니다.
SE80 → Function Group: MM06EF0Z (또는 SAPLXM02)
→ Screen 0111 (또는 회사 환경의 ITEM 용 Screen)
→ Layout 편집:
- EKPO-ZMOSEN 필드 드래그/추가
- 길이·라벨·위치 조정
→ 활성화 후 CTS 에 저장
회사 환경마다 서브스크린 번호와 함수 그룹명이 다릅니다. 일반적으로 MM06EF0Z · MM06EFKO 같은 Z-suffix Enhancement 함수 그룹에서 시작 → 그 안의 ITEM 용 서브스크린(예: 0111·0120) 을 사용합니다.
활성화 직후 ME23N 에 진입하면 라인 탭(Tab) 중 하나에서 새 필드가 회색(비활성) 상태로 보일 수 있습니다. 이 상태에서는 DB 컬럼은 있지만 화면-DB 매핑이 비어 있는 단계. 다음 단계에서 채웁니다.
3단계 — BAdI 의 MAP_DYNPRO_FIELDS 로 화면 ↔ 백엔드 매핑
가장 중요한 단계입니다. 표준 SAP 가 화면 입력값을 백엔드 EKPO 구조로 옮길 때 BAdI 메소드 MAP_DYNPRO_FIELDS 를 호출합니다. 여기서 "DB 컬럼명 ↔ 화면 필드명" 매핑을 명시하지 않으면 값이 화면에만 머물고 DB 로 흘러가지 않습니다.
" BAdI: ME_PROCESS_PO_CUST → Method: MAP_DYNPRO_FIELDS
" Importing: IM_DYNPRO_FIELDS (어떤 화면 필드를 다룰지 알려달라는 요청)
" Changing : CH_MAPPING_TABLE (백엔드 매핑)
METHOD if_ex_me_process_po_cust~map_dynpro_fields.
DATA: ls_map TYPE mmpur_dynpro_field.
LOOP AT im_dynpro_fields INTO DATA(ls_field).
CASE ls_field-fieldname.
WHEN 'EKPO-ZMOSEN'. " 화면 필드
ls_map-fieldname = ls_field-fieldname.
ls_map-metafield = mmmfd_cust_item. " 메타 영역: ITEM
APPEND ls_map TO ch_mapping.
ENDCASE.
ENDLOOP.
ENDMETHOD.
핵심 — METAFIELD 가 영역(헤더 vs 아이템) 을 결정. ITEM 용 커스텀 필드는 MMMFD_CUST_ITEM, HEADER 용은 MMMFD_CUST_HEAD. 이 값에 따라 SAP 가 백엔드 EKPO 또는 EKKO 의 어느 라인으로 값을 보낼지 결정합니다.
매핑 후에는 SAP 표준의 MODIFY_SCREEN 이 위 매핑 정보를 보고 화면 ↔ DB 데이터 교환을 처리합니다.
4단계 — FIELDSELECTION_ITEM 으로 활성화 제어
화면 필드가 회색(비활성) 으로만 보인다면 SAP 표준의 필드 제어 로직이 그 필드를 모르고 있는 것입니다. BAdI 의 FIELDSELECTION_ITEM 메소드에서 명시적으로 "이 필드는 입력 가능" 으로 풀어줘야 합니다.
METHOD if_ex_me_process_po_cust~fieldselection_item.
DATA: ls_fieldsel TYPE mmpur_fieldselection.
" 새 필드를 입력 가능으로
ls_fieldsel-fieldname = 'MEPO1211-ZMOSEN'.
" 서브스크린의 실제 필드명
ls_fieldsel-fieldstatus = '.'. " '.' = 입력 가능
" '*' = 필수
" '-' = 비활성(회색)
" '+' = 화면 숨김
APPEND ls_fieldsel TO ch_fieldselection.
ENDMETHOD.
FIELDSTATUS 값이 핵심입니다.
| 코드 | 동작 |
|---|---|
| . | 입력 가능 (Optional) |
| * | 필수 입력 (Required) |
| - | 표시만 (Display only · 회색) |
| + | 숨김 (Hidden) |
이 부분이 화면 확장에서 가장 흔히 사고나는 지점입니다. 표준의 MODIFY_SCREEN 이 모르는 필드는 기본적으로 비활성 으로 그려지므로, FIELDSELECTION 명시 없이는 사용자 입력이 막혀 있습니다.
5단계 — F4 서치헬프 (Process On Value-Request)
새 필드에 F4 도움말 / 마스터 데이터 조회를 붙이려면 서브스크린의 PAI 흐름에 PROCESS ON VALUE-REQUEST 분기를 추가합니다.
* 서브스크린 흐름 로직
PROCESS BEFORE OUTPUT.
MODULE pbo_subscreen.
PROCESS AFTER INPUT.
MODULE pai_subscreen.
PROCESS ON VALUE-REQUEST.
FIELD ekpo-zmosen MODULE f4_zmosen. " F4 호출 핸들러
" F4 호출 시 실행될 모듈
MODULE f4_zmosen INPUT.
DATA: lt_result TYPE TABLE OF ddshretval.
CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
EXPORTING
retfield = 'ZMOSEN'
value_org = 'S'
TABLES
value_tab = lt_zmosen_master " 모선 마스터 테이블
return_tab = lt_result.
READ TABLE lt_result INTO DATA(ls_result) INDEX 1.
IF sy-subrc = 0.
ekpo-zmosen = ls_result-fieldval.
ENDIF.
ENDMODULE.
표준 데이터 엘리먼트에 자동 서치헬프가 묶여 있다면 이 단계는 생략 가능합니다. Z 데이터 엘리먼트라 자동 도움말이 없다면 위와 같이 직접 구현합니다.
흔히 빠뜨리는 함정
화면에 보이는데 저장 시 사라짐
MAP_DYNPRO_FIELDS 매핑이 누락된 경우입니다. 사용자가 입력 → 저장 → 다시 조회하면 빈 값. 백엔드 EKPO 에 도달하지 못한 채 사라진 것입니다. BAdI 의 MAP_DYNPRO_FIELDS 메소드에서 필드명이 정확히 등록되어 있는지 다시 확인하시기 바랍니다.
회색(비활성) 으로만 보임
FIELDSELECTION_ITEM 누락 또는 잘못된 FIELDSTATUS 코드. 화면이 그려질 때 표준이 그 필드를 "Display only" 로 인식해서 회색 처리합니다. 코드 '.' (점 한 개) 로 명시.
헤더 필드인데 ITEM 으로 매핑
METAFIELD 값이 잘못된 경우. ITEM 필드를 헤더 메타필드로 매핑하면 SAP 가 EKKO 로 보내려다 실패합니다. EKPO 의 커스텀 필드는 반드시 MMMFD_CUST_ITEM, EKKO 는 MMMFD_CUST_HEAD.
CI Include 활성화 안 했음
CI_EKPODB 에 필드를 추가하고 활성화 후 Database utility(SE14) 까지 처리 해야 실제 DB 컬럼이 생깁니다. 활성화만 했는데 SE16N 에서 안 보이면 SE14 의 "Activate and Adjust Database" 를 추가 실행하시기 바랍니다.
서브스크린 번호를 잘못 알고 있음
회사 환경마다 ITEM 용 서브스크린 번호가 다릅니다. 잘못된 서브스크린에 필드를 배치하면 사용자가 보는 화면에 표시되지 않습니다. ME23N 진입 후 Ctrl + F4 (System → Status) 로 현재 다이나믹 프로 번호를 확인 후 그 화면에 배치하는 게 안전합니다.
이미 회사에 BAdI 가 구현되어 있음
회사가 이전에 다른 화면 확장을 했다면 동일 BAdI(ME_PROCESS_PO_CUST) 의 구현체가 이미 활성 상태일 수 있습니다. 그 구현체에 새 필드 매핑을 추가하는 게 안전. 새 구현체를 만들면 같은 BAdI 가 중복 활성으로 충돌할 수 있습니다.
MODIFY_SCREEN 하드코딩
기존 구현자가 BAdI 가 아니라 서브스크린 PBO 모듈에 MODIFY_SCREEN 으로 직접 활성 / 비활성을 박아뒀을 수 있습니다. 그 경우 BAdI 의 FIELDSELECTION 이 무시되므로 PBO 모듈의 LOOP AT SCREEN 분기를 살펴봐야 합니다.
CTS 분할
CI Include + 서브스크린 + BAdI 구현이 다른 CTS 에 담기면 운영 이송 시 일부만 가서 사고가 납니다. 한 CTS 에 묶어서 운영 이송 직전 모든 구성 요소가 함께 가는지 확인하시기 바랍니다.
전체 플로우 — 처음부터 끝까지 한 번에
[1] SE11 → CI_EKPODB 에 ZMOSEN 추가 → 활성화 + SE14 DB Adjust
↓
[2] SE80 → 표준 Enhancement FG 의 ITEM 서브스크린 → ZMOSEN 배치 → CTS 저장 + 활성화
↓
[3] SE19 → ME_PROCESS_PO_CUST 구현 생성 (없으면)
↓
[3a] MAP_DYNPRO_FIELDS 메소드:
EKPO-ZMOSEN → MMMFD_CUST_ITEM 매핑
↓
[3b] FIELDSELECTION_ITEM 메소드:
MEPO1211-ZMOSEN → FIELDSTATUS '.'
↓
[4] (필요 시) 서브스크린 흐름에 PROCESS ON VALUE-REQUEST + F4 모듈
↓
[5] ME23N → ITEM 탭에서 새 필드 확인 → 입력 / 저장 / 재조회 검증
각 단계 사이에 /$SYNC · /$TAB 같은 버퍼 초기화를 한 번씩 끼워두면 활성화 직후 화면이 안 바뀌는 문제를 줄일 수 있습니다.
같이 보면 좋은 글은 "BAdI 찾는 방법 5가지 — CL_EXITHANDLER 디버깅·SE84·SXS_ATTR 메타테이블" 입니다. 자기 화면에 어떤 BAdI 가 호출되는지 모를 때 그 글의 디버깅 방법으로 추적할 수 있습니다.
요약
| 단계 | 하는 일 | 빠뜨리면 발생하는 증상 |
|---|---|---|
| 1 | CI Include 에 필드 추가 | DB 에 저장 자체 불가 |
| 2 | 서브스크린에 필드 배치 | 화면에 안 보임 |
| 3 | MAP_DYNPRO_FIELDS | 저장 시 값 사라짐 |
| 4 | FIELDSELECTION_ITEM | 필드가 회색(비활성) 으로 보임 |
| 5 | PROCESS ON VALUE-REQUEST | F4 도움말 없음 |
Screen Exit 는 한 영역만의 작업이 아니라 DDIC(CI Include) · Screen Painter(서브스크린) · BAdI(매핑·활성화) · F4 도움말 흐름 까지 5개 영역이 한 세트로 동작하는 종합 작업입니다. 한 영역만 채우면 "보이지만 안 됨" / "입력은 되는데 저장 시 사라짐" 같은 부분 동작 상태가 됩니다. 운영기 이송 전 모든 단계가 같은 CTS 에 묶여 있는지, 그리고 ME23N 에서 입력 → 저장 → 재조회 → DB 직접 확인까지 한 사이클을 돌려보고 적용하시기 바랍니다.
Disclaimer — 이 포스트는 실무 정리 노트를 바탕으로 AI 보조로 정리되었습니다.
CI_EKPODB · ME_PROCESS_PO_CUST · MAP_DYNPRO_FIELDS · FIELDSELECTION_ITEM 메소드는 SAP MM 표준(패키지 ME · ECC 6.0 / S/4HANA on-premise) 기준이며, 서브스크린 번호 · 함수 그룹명 · 이미 구현된 BAdI 흐름은 사내 환경에 따라 다를 수 있으니 운영 시스템 적용 전 개발·QA 환경에서 검증하시기 바랍니다.