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 |