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

[SAP ABAP] Search Help 매크로 활용 — F4IF_INT_TABLE_VALUE_REQUEST DEFINE 한 줄 호출 (Selection Screen F4)

by Song.sh 2026. 5. 21.

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 환경에서 검증하시기 바랍니다.