DDIC 서치 헬프 만드는 방법에는 3가지가 있습니다.

  • Selection Method 에 테이블 입력
  • Search Help Exit 에 펑션 입력
  • Selection Method와 Search Help Exit 둘다 입력

 

테이블을 입력해서 만드는건 가장 기초적인 작성법이니 쉽게 아실테고 Exit 펑션을 입력하여 만드는 방법이 난이도가 상당히 있습니다.

 

개발을 시작하는 방법은 우선 펑션모듈 F4IF_SHLP_EXIT_EXAMPLE 을 복사하여 펑션모듈을 하나 만듭니다.

이 펑션에는 파라미터 4개가 있습니다. 이중 CALLCONTROL 과 SHLP 이 두 파라미터를 이용합니다.

exit 펑션은 CALLCONTROL-STEP 값이 변경되면서 여러번 호출 됩니다.

F4IF_SHLP_EXIT_EXAMPLE에 각 CALLCONTROL-STEP 에 따른 설명이 들어 있으니 참고 하시기 바랍니다.

보통은 SELECT와 DISP 일때만 처리합니다.

 

SHLP-SELOPT : 검색조건 range. SELECT step 에서 변경 하면 화면에 반영됩니다. DISP step 에서는 변경 못합니다.

SHLP-FIELDDESCR : 필드 명세. 예를 들어 필드 헤더 텍스트는 SCRTEXT_* 에 값을 변경하면 됩니다.

SHLP-FIELDPROP: 필드 속성. 서치헬프 파라미터 부분에 설정한 내용을 변경 할 수 있습니다. 예를 들어 표시 순서는 SHLPLISPOS 에 값을 변경하면 됩니다. 

CALLCONTROL-STEP : step 조건. 예를 들어 값을 EXIT로 변경하면 서치헬프가 종료 됩니다. 자동으로 값을 리턴하는 방법도 있는데 RETURN 으로 변경하고 F4UT_PARAMETER_RESULTS_PUT 펑션을 이용하여 결과 값을 넘겨주면 됩니다.

CALLCONTROL-SORTOFF : 'X'로 값을 주면 자동 정렬 끄기. 내맘대로 정렬 할 수 있습니다.

CALLCONTROL-MAXRECORDS : 최대 결과 수

CALLCONTROL-MAXEXCEED : 검색 결과가 최대 결과 수 초과 여부

CALLCONTROL-TOP_SHLP : Collective search help 의 경우 지금 선택된 Elementary search help

 

복잡한 코딩 예는 아래 프로젝트를 참고하시기 바랍니다.

https://github.com/boy0korea/ALL_ROUND_SEARCH_HELP

 

GitHub - boy0korea/ALL_ROUND_SEARCH_HELP: All Round Search Help

All Round Search Help. Contribute to boy0korea/ALL_ROUND_SEARCH_HELP development by creating an account on GitHub.

github.com

 

 

간단한 예제 코드는 이렇습니다.

FUNCTION zmdp_hr_exit_usr_tel.
*"--------------------------------------------------------------------
*"*"Local Interface:
*"  TABLES
*"      SHLP_TAB TYPE  SHLP_DESCT
*"      RECORD_TAB STRUCTURE  SEAHLPRES
*"  CHANGING
*"     VALUE(SHLP) TYPE  SHLP_DESCR
*"     VALUE(CALLCONTROL) LIKE  DDSHF4CTRL STRUCTURE  DDSHF4CTRL
*"--------------------------------------------------------------------
  TYPES:
    BEGIN OF lty_stru_list,
*   add fields for the selection list here
      tel TYPE zmdpt_m_usr-tel,
    END OF lty_stru_list.
  DATA: lt_select_list TYPE STANDARD TABLE OF lty_stru_list,
        ls_select_list LIKE LINE OF lt_select_list,
        ls_selopt      TYPE ddshselopt,
        lv_keydate     TYPE datum,
        lt_range_tel   TYPE RANGE OF zmdpt_m_usr-tel,
        ls_range_tel   LIKE LINE OF lt_range_tel.

  CHECK: callcontrol-step EQ 'SELECT'.

  LOOP AT shlp-selopt INTO ls_selopt.
    CASE ls_selopt-shlpfield.
      WHEN 'TEL'.
        MOVE-CORRESPONDING ls_selopt TO ls_range_tel.
        REPLACE ALL OCCURRENCES OF REGEX '[^[:digit:]*+]' IN ls_range_tel-low WITH ''.
        REPLACE ALL OCCURRENCES OF REGEX '[^[:digit:]*+]' IN ls_range_tel-high WITH ''.
        APPEND ls_range_tel TO lt_range_tel.
      WHEN 'KEYDATE'.
        lv_keydate = ls_selopt-low.
    ENDCASE.
  ENDLOOP.

  IF lv_keydate IS INITIAL.
    lv_keydate = sy-datum.
    CLEAR: ls_selopt.
    ls_selopt-shlpfield = 'KEYDATE'.
    ls_selopt-sign = 'I'.
    ls_selopt-option = 'EQ'.
    ls_selopt-low = lv_keydate.
    APPEND ls_selopt TO shlp-selopt.
  ENDIF.


  SELECT DISTINCT tel
    INTO TABLE lt_select_list
    FROM zmdpt_m_usr
    WHERE tel_mc IN lt_range_tel
      AND begda <= lv_keydate
      AND endda >= lv_keydate.
  CHECK: lt_select_list IS NOT INITIAL.

  callcontrol-maxexceed = abap_false.
  IF callcontrol-maxrecords IS NOT INITIAL AND
     lines( lt_select_list ) > callcontrol-maxrecords.
    DELETE lt_select_list FROM callcontrol-maxrecords + 1.
    callcontrol-maxexceed = abap_true.
  ENDIF.

* map
  CALL FUNCTION 'F4UT_RESULTS_MAP'
    TABLES
      shlp_tab    = shlp_tab
      record_tab  = record_tab
      source_tab  = lt_select_list
    CHANGING
      shlp        = shlp
      callcontrol = callcontrol.

  callcontrol-step = 'DISP'.


ENDFUNCTION.

'ABAP' 카테고리의 다른 글

abap으로 open API (RESTful) 호출하기  (2) 2023.12.20
abap으로 ZIP 압축하기  (0) 2023.10.17
FUNCTION ZADD_1_ALPHANUM  (0) 2022.12.20
ABAP TIMESTAMP 총정리  (0) 2021.12.27
abap2xlsx  (0) 2021.05.07

+ Recent posts