SAP 리포트의 Selection Screen 에 F4 도움말을 붙일 때마다 똑같은 F4IF_INT_TABLE_VALUE_REQUEST 호출 블록을 반복해서 작성하게 됩니다. 파라미터가 3~4개 있는 화면이라면 같은 코드가 화면 수만큼 늘어나고, 유지보수도 그만큼 무거워집니다.
이 글에서는 F4 도움말 호출을 매크로(DEFINE ... END-OF-DEFINITION) 로 정의해서 한 줄로 호출 하는 패턴을 정리합니다. F4 도움말이 자주 등장하는 리포트에서 코드가 한눈에 정리되고, 후보 데이터 테이블만 다르게 채워 같은 매크로를 여러 필드에 재사용할 수 있습니다.
매크로는 ABAP 의 가장 가벼운 재사용 도구입니다. Subroutine / Method 보다 호출 오버헤드가 없고, 단순 텍스트 치환이라 디버깅도 직관적입니다. 단 인자 검증 / 타입 안전성이 떨어지므로 F4 도움말처럼 호출 시그니처가 늘 동일한 코드 블록 에 가장 적합합니다.
핵심 — F4IF_INT_TABLE_VALUE_REQUEST + 매크로 패턴
| 📋 구성 요소 | 역할 |
|---|---|
F4IF_INT_TABLE_VALUE_REQUEST |
SAP 표준 F4 도움말 FM (FG SDHI, Package SDSH) |
RETFIELD |
사용자가 선택할 때 반환할 컬럼 이름 |
DYNPPROG · DYNPNR · DYNPROFIELD |
선택값을 자동으로 채울 화면 필드 (3개 모두 필요) |
VALUE_ORG = 'S' |
Structure 단위 (각 행이 ITAB 의 한 row) |
VALUE_TAB |
팝업에 보여줄 후보 데이터 테이블 (필수) |
RETURN_TAB |
사용자 선택 결과 (DYNPROFIELD 명시 시 화면 자동 채움) |
매크로로 묶을 핵심 부분: RETFIELD + DYNPROFIELD + VALUE_TAB 3개만 호출자마다 바뀝니다. 나머지(SY-REPID·SY-DYNNR·VALUE_ORG·예외 처리) 는 항상 동일하므로 매크로 내부로 흡수.
1단계 — 데이터 타입 + 후보 테이블 준비
후보 데이터를 담을 타입과 테이블을 미리 선언합니다. 코드(Key) + 텍스트(설명) 2컬럼이 가장 흔한 패턴입니다.
TYPES: BEGIN OF ty_data,
code TYPE char10,
text TYPE char30,
END OF ty_data.
DATA: gt_list TYPE TABLE OF ty_data, " 첫 번째 F4 후보
gt_list2 TYPE TABLE OF ty_data. " 두 번째 F4 후보
테이블 라인 구조는 자유롭게 정의할 수 있습니다. 컬럼 수가 많은 경우(코드 · 명칭 · 분류 등) 그대로 늘려도 무방하며, 매크로 안의 RETFIELD 만 어떤 컬럼을 반환할지 정해주면 됩니다.
2단계 — 매크로 정의
핵심 패턴입니다. F4 호출에 필요한 모든 파라미터를 한 블록에 묶고, 호출자가 바꿀 3개만 인자(&1·&2·&3) 로 빼냅니다.
DEFINE macro_f4_call.
CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
EXPORTING
retfield = &1 " 반환할 컬럼명
dynpprog = sy-repid
dynpnr = sy-dynnr
dynprofield = '&2' " 화면에 채울 파라미터명
value_org = 'S'
TABLES
value_tab = &3 " 후보 데이터 테이블
EXCEPTIONS
parameter_error = 1
no_values_found = 2
OTHERS = 3.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid
TYPE sy-msgty
NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
END-OF-DEFINITION.
&1·&2·&3 의 의미
&1— RETFIELD (라인 구조에서 어떤 컬럼을 사용자에게 반환할 것인가, 예:'CODE')&2— DYNPROFIELD (선택값을 자동으로 채울 화면 파라미터 이름, 예:P_CODE1)&3— VALUE_TAB (어떤 후보 데이터 테이블을 보여줄 것인가)
&2 만 따옴표로 감싸는 이유 — DYNPROFIELD 는 문자열이므로 'P_CODE1' 형태가 필요. 매크로 정의 안의 '&2' 가 호출 시 자동으로 따옴표 안에 들어갑니다.
3단계 — Selection Screen 에 적용
이제 매크로를 한 줄로 호출. AT SELECTION-SCREEN ON VALUE-REQUEST FOR 안에서 매크로명 + 3개 인자를 넘기면 됩니다.
PARAMETERS: p_code1 TYPE char10,
p_code2 TYPE char10.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_code1.
macro_f4_call 'CODE' p_code1 gt_list.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_code2.
macro_f4_call 'CODE' p_code2 gt_list2.
같은 매크로를 두 파라미터에 다른 후보 테이블로 재사용. F4 도움말이 10개여도 이벤트 블록 + 한 줄 매크로 호출로 끝납니다. 표준 호출 블록을 매번 적으면 8줄 × 10번 = 80줄, 매크로 사용 시 10줄로 정리됩니다.
4단계 — INITIALIZATION 에서 후보 데이터 채우기
매크로가 동작하려면 후보 테이블이 미리 채워져 있어야 합니다. INITIALIZATION 이벤트에서 한 번 채워두면 화면이 떴을 때 즉시 사용 가능.
INITIALIZATION.
gt_list = VALUE #(
( code = '1000' text = '본사' )
( code = '2000' text = '공장A' )
( code = '3000' text = '공장B' ) ).
gt_list2 = VALUE #(
( code = '4000' text = '센터1' )
( code = '5000' text = '센터2' ) ).
후보 데이터의 출처는 자유. DB SELECT 결과, IMG 설정 테이블, 회사 마스터, 권한에 따라 필터링한 결과 등 어떤 ITAB 도 가능합니다.
5단계 — RETURN_TAB 으로 직접 처리 (확장 패턴)
기본 매크로는 SAP 가 선택값을 화면에 자동 채우게 맡깁니다. 선택 결과를 직접 받아 추가 처리(예: 다른 화면 필드도 같이 채우기) 가 필요하면 RETURN_TAB 을 매크로 인자로 추가합니다.
DEFINE macro_f4_call_ret.
CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
EXPORTING
retfield = &1
dynpprog = sy-repid
dynpnr = sy-dynnr
dynprofield = '&2'
value_org = 'S'
TABLES
value_tab = &3
return_tab = &4
EXCEPTIONS
parameter_error = 1
no_values_found = 2
OTHERS = 3.
END-OF-DEFINITION.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_code1.
DATA lt_return TYPE TABLE OF ddshretval.
macro_f4_call_ret 'CODE' p_code1 gt_list lt_return.
" 선택한 ROW 의 TEXT 컬럼도 같이 화면에 채우기
READ TABLE lt_return INTO DATA(ls_ret) INDEX 1.
IF sy-subrc = 0.
p_code1 = ls_ret-fieldval.
" 추가 화면 필드 갱신 로직 ...
ENDIF.
다중 컬럼 반환 / 후처리가 필요할 때만 이 확장 매크로를 사용. 단순 한 컬럼 선택 시나리오는 기본 매크로가 더 깔끔합니다.
흔히 빠뜨리는 함정
DYNPROFIELD 누락
DYNPROFIELD 를 비우거나 잘못된 화면 필드명을 넘기면 사용자가 후보를 선택해도 화면에 값이 채워지지 않습니다. 매크로 호출 시 P_CODE1 등 실제 화면 파라미터명을 그대로 적어야 합니다.
VALUE_ORG 값 혼동
'S' (Structure) 가 일반적입니다. 'C' (Cell) 는 DDIC_STRUCTURE 와 결합되는 특수 모드라 일반 ITAB 호출에서는 사용하지 마시기 바랍니다.
후보 테이블 미초기화
INITIALIZATION 에 데이터 채우는 코드를 빠뜨리면 F4 클릭 시 "No values found" 메시지가 뜹니다. Selection Screen 진입 전에 채워져야 하므로 START-OF-SELECTION 이벤트에 채우면 늦습니다.
RETFIELD 의 대소문자
DDIC 필드명은 대소문자 구분이 있을 수 있습니다. 매크로 호출 시 'CODE' 대문자 유지 권장. 소문자로 넘기면 "Field not found" 가능성.
매크로 디버깅 어려움
매크로는 텍스트 치환이라 디버거에서 한 줄로 보입니다. F8 / F5 단계 추적이 안 되므로 문제 발생 시 매크로 본체를 임시로 그대로 풀어 호출 코드에 펼친 후 디버깅하는 게 빠릅니다.
다른 프로그램 간 매크로 공유
매크로는 DEFINE 한 프로그램 안에서만 유효. 여러 프로그램에서 공유하려면 Include 파일에 매크로 정의를 두고 각 프로그램에서 INCLUDE 로 가져옵니다.
컬럼 라벨 안 보임
자체 ITAB 으로 F4 를 띄우면 컬럼 라벨이 영문 / 빈 칸으로 표시될 수 있습니다. 라벨을 직접 지정하려면 FIELD_TAB 파라미터에 DFIES 구조로 컬럼 정보를 직접 넘기거나, DDIC 구조체를 만들어서 DDIC_STRUCTURE 에 넘깁니다.
전체 코드 — 복사용 통합본
*&---------------------------------------------------------------------*
*& Report Z_XX_SEARCH_HELP_MACRO
*&---------------------------------------------------------------------*
*& Selection Screen F4 도움말 매크로 패턴
*&---------------------------------------------------------------------*
REPORT z_xx_search_help_macro.
* ★ 1) 후보 데이터 타입 + 테이블
TYPES: BEGIN OF ty_data,
code TYPE char10,
text TYPE char30,
END OF ty_data.
DATA: gt_list TYPE TABLE OF ty_data,
gt_list2 TYPE TABLE OF ty_data.
* ★ 2) 매크로 정의 — F4 호출 표준 블록
DEFINE macro_f4_call.
CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
EXPORTING
retfield = &1
dynpprog = sy-repid
dynpnr = sy-dynnr
dynprofield = '&2'
value_org = 'S'
TABLES
value_tab = &3
EXCEPTIONS
parameter_error = 1
no_values_found = 2
OTHERS = 3.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid
TYPE sy-msgty
NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
END-OF-DEFINITION.
* ★ 3) Selection Screen
PARAMETERS: p_code1 TYPE char10,
p_code2 TYPE char10.
* ★ 4) F4 이벤트 — 매크로 한 줄로 호출
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_code1.
macro_f4_call 'CODE' p_code1 gt_list.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_code2.
macro_f4_call 'CODE' p_code2 gt_list2.
* ★ 5) INITIALIZATION 에서 후보 데이터 채우기
INITIALIZATION.
gt_list = VALUE #(
( code = '1000' text = '본사' )
( code = '2000' text = '공장A' )
( code = '3000' text = '공장B' ) ).
gt_list2 = VALUE #(
( code = '4000' text = '센터1' )
( code = '5000' text = '센터2' ) ).
* ★ 메인
START-OF-SELECTION.
WRITE: / 'Selected Code1:', p_code1.
WRITE: / 'Selected Code2:', p_code2.
같이 보면 좋은 글: "BAPI · BDC 에러 메시지 확인 방법 — MESSAGE INTO · FORMAT_MESSAGE 빌드" — 매크로 안의 MESSAGE 처리 패턴이 그 글의 메시지 빌드와 같은 메커니즘이라 함께 익혀두면 일관성이 잡힙니다.
요약
| 단계 | 하는 일 | 핵심 포인트 |
|---|---|---|
| 1 | 후보 데이터 준비 | TYPES + DATA TABLE OF |
| 2 | 매크로 정의 | DEFINE · &1·&2·&3 인자만 가변 |
| 3 | Selection Screen 정의 | PARAMETERS / SELECT-OPTIONS |
| 4 | F4 이벤트 + 매크로 호출 | AT SELECTION-SCREEN ON VALUE-REQUEST FOR |
| 5 | INITIALIZATION 채우기 | 화면 진입 전 후보 테이블 채움 |
F4 도움말 매크로는 "호출 시그니처가 늘 동일한 코드 블록" 을 한 줄로 줄여주는 가장 가벼운 리팩토링 입니다. RETFIELD · DYNPROFIELD · VALUE_TAB 3개 인자만 호출자가 결정하면 같은 매크로로 화면의 모든 F4 도움말을 처리할 수 있습니다. 여러 프로그램에서 공통으로 쓸 거면 별도 Include 에 매크로 정의를 묶어두고 INCLUDE 로 재사용하는 것이 표준 운영 패턴입니다.
Disclaimer — 이 포스트는 실무 정리 노트를 바탕으로 AI 보조로 정리되었습니다.
F4IF_INT_TABLE_VALUE_REQUEST Function Module 시그니처 · VALUE_ORG 옵션 · DEFINE 매크로 문법은 SAP NetWeaver 표준(ECC 6.0 / S/4HANA on-premise) 기준이며, 사내 권한 / 후보 데이터 출처에 따라 후보 테이블 채우는 로직은 환경별로 달라질 수 있으니 운영 시스템 적용 전 개발·QA 환경에서 검증하시기 바랍니다.