본문 바로가기
IT/SAP

[SAP/ABAP] Possible Entry, SearchHelp 인터널 테이블로 만들기(F4IF_INT_TABLE_VALUE_REQUEST)

by 109 2025. 8. 8.

[SAP/ABAP] Possible Entry, Search Help - Abap Dic

 

[SAP/ABAP] Possible Entry, Search Help

출저: https://www.tutorialspoint.com/sap_abap/sap_abap_search_help.htm http://sapjoy.co.kr/abappds/57489 http://blog.daum.net/_blog/BlogTypeView.do?blogid=0OK62&articleno=776&categoryId=12®dt=20180130180253 Possible Entry를 띄우는 3가지 방법이

graduation.tistory.com

 

REPORT Z_USER_F4_DEMO.

*&---------------------------------------------------------------------*
*& TABLES: 데이터 딕셔너리 테이블 선언
*&---------------------------------------------------------------------*
TABLES: SFLIGHT. " 항공편 테이블
TABLES: SBOOK. " 예약 테이블

*&---------------------------------------------------------------------*
*& TYPES: F4 도움말을 위한 사용자 정의 구조체 및 테이블 타입 정의
*&---------------------------------------------------------------------*
TYPES: BEGIN OF ty_f4_sflight,
         carrid   TYPE sflight-carrid,
         connid   TYPE sflight-connid,
       END OF ty_f4_sflight.
TYPES: tt_f4_sflight TYPE STANDARD TABLE OF ty_f4_sflight.

* SFLIGHT와 SBOOK 테이블을 JOIN하기 위한 구조체 및 테이블 타입
TYPES: BEGIN OF ty_joined_data,
         carrid   TYPE sflight-carrid,
         connid   TYPE sflight-connid,
         fldate   TYPE sflight-fldate,
         bookid   TYPE sbook-bookid,
         customid TYPE sbook-customid,
       END OF ty_joined_data.
TYPES: tt_joined_data TYPE STANDARD TABLE OF ty_joined_data.

*&---------------------------------------------------------------------*
*& DATA: 내부 테이블 및 작업 영역 선언
*&---------------------------------------------------------------------*
* F4 도움말을 위한 내부 테이블 (사용자 정의 타입으로 선언)
DATA: gt_f4_sflight TYPE tt_f4_sflight.
DATA: gt_joined_data TYPE tt_joined_data WITH HEADER LINE. " JOIN 데이터를 위한 테이블 선언 (헤더 라인 추가)

* F4 팝업 표시를 위한 내부 테이블
DATA: BEGIN OF lt_display_data OCCURS 0,
        value TYPE c LENGTH 30,
      END OF lt_display_data.

* F4 도움말 필드 속성 정의
DATA: lt_fields TYPE TABLE OF dfies,
      ls_field LIKE LINE OF lt_fields.

*&---------------------------------------------------------------------*
*& SELECTION-SCREEN: 사용자 입력 화면 정의
*&---------------------------------------------------------------------*
SELECTION-SCREEN BEGIN OF BLOCK B1 WITH FRAME TITLE TEXT-001. " 블록 시작
  PARAMETERS: p_carr1 TYPE sflight-carrid, " 'AA' 파라미터
              p_carr2 TYPE sflight-carrid. " 'LH' 파라미터
SELECTION-SCREEN END OF BLOCK B1. " 블록 끝

*&---------------------------------------------------------------------*
*& INITIALIZATION: 초기값 설정
*&---------------------------------------------------------------------*
INITIALIZATION.
  " 프로그램 시작 시 초기값 설정 로직
  p_carr1 = 'LH'.
  p_carr2 = 'AA'.

*&---------------------------------------------------------------------*
*& AT SELECTION-SCREEN ON VALUE-REQUEST FOR P_CARR1: F4 도움말 이벤트
*&---------------------------------------------------------------------*
* p_carr1 파라미터에 대한 F4 도움말을 실행하는 이벤트
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_carr1.
  PERFORM f4_for_carr1.

*&---------------------------------------------------------------------*
*& AT SELECTION-SCREEN ON VALUE-REQUEST FOR P_CARR2: F4 도움말 이벤트
*&---------------------------------------------------------------------*
* p_carr2 파라미터에 대한 F4 도움말을 실행하는 이벤트
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_carr2.
  PERFORM f4_for_carr2.

*&---------------------------------------------------------------------*
*& START-OF-SELECTION: 메인 처리 로직 시작
*&---------------------------------------------------------------------*
START-OF-SELECTION.
  WRITE: / '선택된 첫 번째 항공사 코드는:', p_carr1.
  WRITE: / '선택된 두 번째 항공사 코드는:', p_carr2.

*&---------------------------------------------------------------------*
*& Form routines
*&---------------------------------------------------------------------*

*&---------------------------------------------------------------------*
*&      Form  F4_FOR_CARR1
*&---------------------------------------------------------------------*
* p_carr1 파라미터에 대한 F4 도움말 로직 ('AA' 데이터 조회)
*----------------------------------------------------------------------*
FORM f4_for_carr1.
  DATA: lt_return_tab TYPE STANDARD TABLE OF ddshretval.

  CLEAR gt_f4_sflight.
  " 'AA'에 해당하는 항공사 목록 조회
  SELECT carrid connid
    FROM sflight
    INTO TABLE gt_f4_sflight
    WHERE carrid = 'AA'
    ORDER BY carrid.

  IF sy-subrc = 0.
    CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
      EXPORTING
        retfield        = 'CARRID'
        dynprofield     = 'P_CARR1'
        value_org       = 'S'
      TABLES
        value_tab       = gt_f4_sflight
        return_tab      = lt_return_tab.
  ENDIF.

ENDFORM.

*&---------------------------------------------------------------------*
*&      Form  F4_FOR_CARR2
*&---------------------------------------------------------------------*
* p_carr2 파라미터에 대한 F4 도움말 로직 ('LH' 데이터 조회)
* SFLIGHT와 SBOOK 테이블 LEFT OUTER JOIN 후 데이터 가공
*----------------------------------------------------------------------*
FORM f4_for_carr2.
  DATA: lt_return_tab TYPE STANDARD TABLE OF ddshretval.

  " 1. F4 도움말에 표시할 필드 정의
  CLEAR lt_fields.
  CLEAR ls_field.

  " 필드 속성을 명확하게 지정
  ls_field-fieldname = 'CARRID'.
  ls_field-intlen    = 3.
  ls_field-outputlen = 3.
  ls_field-scrtext_s = '항공사'.
  ls_field-scrtext_m = '항공사 코드'.
  ls_field-scrtext_l = '항공사 코드'.
  APPEND ls_field TO lt_fields.

  ls_field-fieldname = 'CONNID'.
  ls_field-intlen    = 4.
  ls_field-outputlen = 4.
  ls_field-scrtext_s = '항공편'.
  ls_field-scrtext_m = '항공편 번호'.
  ls_field-scrtext_l = '항공편 번호'.
  APPEND ls_field TO lt_fields.

  ls_field-fieldname = 'FLDATE'.
  ls_field-intlen    = 30.
  ls_field-outputlen = 30.
  ls_field-scrtext_s = '비행일'.
  ls_field-scrtext_m = '비행 날짜'.
  ls_field-scrtext_l = '비행 날짜'.
  APPEND ls_field TO lt_fields.

  ls_field-fieldname = 'BOOKID'.
  ls_field-intlen    = 30.
  ls_field-outputlen = 30.
  ls_field-scrtext_s = '예약 ID'.
  ls_field-scrtext_m = '예약 번호'.
  ls_field-scrtext_l = '예약 번호'.
  APPEND ls_field TO lt_fields.

  ls_field-fieldname = 'CUSTOMID'.
  ls_field-intlen    = 20.
  ls_field-outputlen = 20.
  ls_field-scrtext_s = '고객 ID'.
  ls_field-scrtext_m = '고객 ID'.
  ls_field-scrtext_l = '고객 ID'.
  APPEND ls_field TO lt_fields.
  
  " 2. SFLIGHT와 SBOOK을 LEFT OUTER JOIN하여 데이터 조회
  CLEAR gt_joined_data.
  SELECT a~carrid a~connid a~fldate b~bookid b~customid
    FROM sflight AS a
    LEFT OUTER JOIN sbook AS b ON a~carrid = b~carrid
                               AND a~connid = b~connid
                               AND a~fldate = b~fldate
    INTO TABLE gt_joined_data
    WHERE a~carrid = 'LH'
    UP TO 100 ROWS.

  " 3. 데이터 가공
  CLEAR lt_display_data.
  LOOP AT gt_joined_data. " WITH HEADER LINE으로 선언했으므로 INTO 절 생략 가능
    lt_display_data-value = gt_joined_data-carrid.
    APPEND lt_display_data.

    lt_display_data-value = gt_joined_data-connid.
    APPEND lt_display_data.

    lt_display_data-value = gt_joined_data-fldate.
    APPEND lt_display_data.
    
    lt_display_data-value = gt_joined_data-bookid.
    APPEND lt_display_data.

    lt_display_data-value = gt_joined_data-customid.
    APPEND lt_display_data.
  ENDLOOP.

  " 4. F4 함수 호출
  IF sy-subrc = 0.
    CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
      EXPORTING
        retfield        = 'CARRID'
        dynprofield     = 'P_CARR2'
        value_org       = 'C'
      TABLES
        value_tab       = lt_display_data " 가공된 테이블 사용
        field_tab       = lt_fields
        return_tab      = lt_return_tab.
  ENDIF.
ENDFORM.

 

 

 

 

 

 

 

 

 

참조

https://moon-7.tistory.com/34