CONVERT DATE lv_date_from TIME lv_time_from INTO TIME STAMP lv_ts TIME ZONE lv_tz_from. CONVERT TIME STAMP lv_ts TIME ZONE lv_tz_to INTO DATE lv_date_to TIME lv_time_to.
*&---------------------------------------------------------------------*
*& Report ZRESTFUL_API
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT zrestful_api.
PARAMETERS: p_string TYPE string.
TYPES: BEGIN OF ts_req,
BEGIN OF argument,
type TYPE string,
question TYPE string,
END OF argument,
END OF ts_req,
BEGIN OF ts_res_irinfo,
wiki_title TYPE string,
sent TYPE string,
url TYPE string,
END OF ts_res_irinfo,
BEGIN OF ts_res_answerinfo,
rank TYPE i,
answer TYPE string,
confidence TYPE i,
url TYPE STANDARD TABLE OF string WITH DEFAULT KEY,
END OF ts_res_answerinfo,
BEGIN OF ts_res,
result TYPE string,
BEGIN OF return_object,
BEGIN OF wikiinfo,
irinfo TYPE STANDARD TABLE OF ts_res_irinfo WITH DEFAULT KEY,
answerinfo TYPE STANDARD TABLE OF ts_res_answerinfo WITH DEFAULT KEY,
END OF wikiinfo,
END OF return_object,
END OF ts_res.
DATA: lv_url TYPE string,
ls_req TYPE ts_req,
lv_req_json TYPE string,
lo_client TYPE REF TO if_http_client,
lv_message TYPE string,
lv_res_json TYPE string,
ls_res TYPE ts_res.
* 위키백과 QA API
* https://aiopen.etri.re.kr/guide/WikiQA
lv_url = |http://aiopen.etri.re.kr:8000/WikiQA|.
ls_req-argument-type = 'hybridqa'.
ls_req-argument-question = p_string.
"REQ to json
/ui2/cl_json=>serialize(
EXPORTING
data = ls_req " Data to serialize
pretty_name = /ui2/cl_json=>pretty_mode-low_case " Pretty Print property names
RECEIVING
r_json = lv_req_json " JSON string
).
"HTTP create
cl_http_client=>create_by_url(
EXPORTING
url = lv_url " URL
IMPORTING
client = lo_client " HTTP Client Abstraction
EXCEPTIONS
argument_not_found = 1 " Communication parameter (host or service) not available
plugin_not_active = 2 " HTTP/HTTPS communication not available
internal_error = 3 " Internal error (e.g. name too long)
pse_not_found = 4 " PSE not found
pse_not_distrib = 5 " PSE not distributed
pse_errors = 6 " General PSE error
OTHERS = 7
).
IF sy-subrc <> 0.
MESSAGE 'HTTP error' TYPE 'E'.
RETURN.
ENDIF.
" HTTP request
lo_client->request->set_method(
method = if_http_request=>co_request_method_post
).
lo_client->request->set_header_field(
EXPORTING
name = 'Content-Type'
value = 'application/json'
).
lo_client->request->set_header_field(
EXPORTING
name = 'Authorization'
value = 'cfd006b6-7766-42ca-88fc-3cd1e1c357f7'
).
lo_client->request->set_cdata(
EXPORTING
data = lv_req_json
).
"HTTP send
lo_client->send(
EXCEPTIONS
http_communication_failure = 1 " Communication Error
http_invalid_state = 2 " Invalid state
http_processing_failed = 3 " Error when processing method
http_invalid_timeout = 4 " Invalid Time Entry
OTHERS = 5
).
IF sy-subrc <> 0.
lo_client->get_last_error(
IMPORTING
message = lv_message
).
MESSAGE lv_message TYPE 'E'.
RETURN.
ENDIF.
"HTTP receive
lo_client->receive(
EXCEPTIONS
http_communication_failure = 1 " Communication Error
http_invalid_state = 2 " Invalid state
http_processing_failed = 3 " Error when processing method
OTHERS = 4
).
IF sy-subrc <> 0.
lo_client->get_last_error(
IMPORTING
message = lv_message
).
MESSAGE lv_message TYPE 'E'.
RETURN.
ENDIF.
"HTTP response
IF lo_client->response IS NOT INITIAL.
lv_res_json = lo_client->response->get_cdata( ).
ENDIF.
"json to RES
/ui2/cl_json=>deserialize(
EXPORTING
json = lv_res_json " JSON string
CHANGING
data = ls_res " Data to serialize
).
*BREAK-POINT.
IF ls_res-return_object-wikiinfo-answerinfo IS NOT INITIAL.
cl_demo_output=>display( ls_res-return_object-wikiinfo-answerinfo[ 1 ]-answer ).
ENDIF.
*&---------------------------------------------------------------------*
*& Report ZZIP
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT zzip.
DATA: lt_file_table TYPE filetable,
ls_file_table TYPE file_table,
lv_rc TYPE i,
lv_filename TYPE string,
lv_path TYPE string,
lv_fullpath TYPE string,
lv_filelength TYPE i,
lt_temptable TYPE w3mimetabtype,
lv_xstring TYPE xstring,
lo_zip TYPE REF TO cl_abap_zip.
cl_gui_frontend_services=>file_open_dialog(
EXPORTING
* window_title = " Title Of File Open Dialog
* default_extension = " Default Extension
* default_filename = " Default File Name
* file_filter = " File Extension Filter String
* with_encoding = " File Encoding
* initial_directory = " Initial Directory
multiselection = abap_true " Multiple selections poss.
CHANGING
file_table = lt_file_table " Table Holding Selected Files
rc = lv_rc " Return Code, Number of Files or -1 If Error Occurred
* user_action = " User Action (See Class Constants ACTION_OK, ACTION_CANCEL)
* file_encoding =
EXCEPTIONS
file_open_dialog_failed = 1 " "Open File" dialog failed
cntl_error = 2 " Control error
error_no_gui = 3 " No GUI available
not_supported_by_gui = 4 " GUI does not support this
OTHERS = 5
).
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
CHECK: lt_file_table IS NOT INITIAL.
CREATE OBJECT lo_zip.
lo_zip->support_unicode_names = abap_true.
LOOP AT lt_file_table INTO ls_file_table.
CLEAR: lv_filename, lv_filelength, lt_temptable, lv_xstring.
lv_filename = ls_file_table-filename.
cl_gui_frontend_services=>gui_upload(
EXPORTING
filename = lv_filename " Name of file
filetype = 'BIN' " File Type (ASCII, Binary)
* has_field_separator = space " Columns Separated by Tabs in Case of ASCII Upload
* header_length = 0 " Length of Header for Binary Data
* read_by_line = 'X' " File Written Line-By-Line to the Internal Table
* dat_mode = space " Numeric and date fields are in DAT format in WS_DOWNLOAD
* codepage = " Character Representation for Output
* ignore_cerr = abap_true " Ignore character set conversion errors?
* replacement = '#' " Replacement Character for Non-Convertible Characters
* virus_scan_profile = " Virus Scan Profile
IMPORTING
filelength = lv_filelength " File Length
* header = " File Header in Case of Binary Upload
CHANGING
data_tab = lt_temptable " Transfer table for file contents
* isscanperformed = space " File already scanned
EXCEPTIONS
file_open_error = 1 " File does not exist and cannot be opened
file_read_error = 2 " Error when reading file
no_batch = 3 " Cannot execute front-end function in background
gui_refuse_filetransfer = 4 " Incorrect front end or error on front end
invalid_type = 5 " Incorrect parameter FILETYPE
no_authority = 6 " No upload authorization
unknown_error = 7 " Unknown error
bad_data_format = 8 " Cannot Interpret Data in File
header_not_allowed = 9 " Invalid header
separator_not_allowed = 10 " Invalid separator
header_too_long = 11 " Header information currently restricted to 1023 bytes
unknown_dp_error = 12 " Error when calling data provider
access_denied = 13 " Access to file denied.
dp_out_of_memory = 14 " Not enough memory in data provider
disk_full = 15 " Storage medium is full.
dp_timeout = 16 " Data provider timeout
not_supported_by_gui = 17 " GUI does not support this
error_no_gui = 18 " GUI not available
OTHERS = 19
).
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
CALL FUNCTION 'SCMS_BINARY_TO_XSTRING'
EXPORTING
input_length = lv_filelength
* first_line = 0
* last_line = 0
IMPORTING
buffer = lv_xstring
TABLES
binary_tab = lt_temptable
EXCEPTIONS
failed = 1
OTHERS = 2.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
CALL FUNCTION 'SO_SPLIT_FILE_AND_PATH'
EXPORTING
full_name = ls_file_table-filename
IMPORTING
stripped_name = lv_filename
EXCEPTIONS
x_error = 1
OTHERS = 2.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
lo_zip->add(
EXPORTING
name = lv_filename
content = lv_xstring
* compress_level = 6 " Level of Compression
).
ENDLOOP.
lv_xstring = lo_zip->save( ).
CALL FUNCTION 'SCMS_XSTRING_TO_BINARY'
EXPORTING
buffer = lv_xstring
IMPORTING
output_length = lv_filelength
TABLES
binary_tab = lt_temptable.
cl_gui_frontend_services=>file_save_dialog(
EXPORTING
* window_title = " Window Title
default_extension = 'ZIP' " Default Extension
default_file_name = 'a.zip' " Default File Name
* with_encoding =
file_filter = 'ZIP(*.ZIP)|*.ZIP' " File Type Filter Table
* initial_directory = " Initial Directory
* prompt_on_overwrite = 'X'
CHANGING
filename = lv_filename " File Name to Save
path = lv_path " Path to File
fullpath = lv_fullpath " Path + File Name
* user_action = " User Action (C Class Const ACTION_OK, ACTION_OVERWRITE etc)
* file_encoding =
EXCEPTIONS
cntl_error = 1 " Control error
error_no_gui = 2 " No GUI available
not_supported_by_gui = 3 " GUI does not support this
invalid_default_file_name = 4 " Invalid default file name
OTHERS = 5
).
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
cl_gui_frontend_services=>gui_download(
EXPORTING
bin_filesize = lv_filelength " File length for binary files
filename = lv_fullpath " Name of file
filetype = 'BIN' " File type (ASCII, binary ...)
* append = space " Character Field of Length 1
* write_field_separator = space " Separate Columns by Tabs in Case of ASCII Download
* header = '00' " Byte Chain Written to Beginning of File in Binary Mode
* trunc_trailing_blanks = space " Do not Write Blank at the End of Char Fields
* write_lf = 'X' " Insert CR/LF at End of Line in Case of Char Download
* col_select = space " Copy Only Selected Columns of the Table
* col_select_mask = space " Vector Containing an 'X' for the Column To Be Copied
* dat_mode = space " Numeric and date fields are in DAT format in WS_DOWNLOAD
* confirm_overwrite = space " Overwrite File Only After Confirmation
* no_auth_check = space " Switch off Check for Access Rights
* codepage = " Character Representation for Output
* ignore_cerr = abap_true " Ignore character set conversion errors?
* replacement = '#' " Replacement Character for Non-Convertible Characters
* write_bom = space " If set, writes a Unicode byte order mark
* trunc_trailing_blanks_eol = 'X' " Remove Trailing Blanks in Last Column
* wk1_n_format = space
* wk1_n_size = space
* wk1_t_format = space
* wk1_t_size = space
* show_transfer_status = 'X' " Enables suppression of transfer status message
* fieldnames = " Table Field Names
* write_lf_after_last_line = 'X' " Writes a CR/LF after final data record
* virus_scan_profile = '/SCET/GUI_DOWNLOAD' " Virus Scan Profile
* IMPORTING
* filelength = " Number of bytes transferred
CHANGING
data_tab = lt_temptable " Transfer table
EXCEPTIONS
file_write_error = 1 " Cannot write to file
no_batch = 2 " Cannot execute front-end function in background
gui_refuse_filetransfer = 3 " Incorrect Front End
invalid_type = 4 " Invalid value for parameter FILETYPE
no_authority = 5 " No Download Authorization
unknown_error = 6 " Unknown error
header_not_allowed = 7 " Invalid header
separator_not_allowed = 8 " Invalid separator
filesize_not_allowed = 9 " Invalid file size
header_too_long = 10 " Header information currently restricted to 1023 bytes
dp_error_create = 11 " Cannot create DataProvider
dp_error_send = 12 " Error Sending Data with DataProvider
dp_error_write = 13 " Error Writing Data with DataProvider
unknown_dp_error = 14 " Error when calling data provider
access_denied = 15 " Access to file denied.
dp_out_of_memory = 16 " Not enough memory in data provider
disk_full = 17 " Storage medium is full.
dp_timeout = 18 " Data provider timeout
file_not_found = 19 " Could not find file
dataprovider_exception = 20 " General Exception Error in DataProvider
control_flush_error = 21 " Error in Control Framework
not_supported_by_gui = 22 " GUI does not support this
error_no_gui = 23 " GUI not available
OTHERS = 24
).
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
알 수 없는 이유로 데이터가 꼬여서 덤프 에러 Exception condition "NO_KEY" triggered 발생하곤 합니다.
가비지 데이터 정리 프로그램 만들어 보았습니다.
코드:
*&---------------------------------------------------------------------*
*& Report ZMDP_ADJUST_STAGING
*&---------------------------------------------------------------------*
*& MDG staging table 가비지 데이터 삭제 처리 프로그램
*&---------------------------------------------------------------------*
REPORT zmdp_adjust_staging LINE-SIZE 250.
DATA : lt_message TYPE usmd_t_message,
ls_message TYPE usmd_s_message,
lt_model TYPE TABLE OF usmd_model,
lv_model TYPE usmd_model,
lo_model_gen_adapter TYPE REF TO if_usmd_model_gen_adapter,
ls_log_phys_name TYPE if_usmd_model_gen_adapter=>s_log_phys_name,
lt_log_phys_name TYPE if_usmd_model_gen_adapter=>t_log_phys_name,
lv_entity TYPE string,
lv_select TYPE string,
lv_table TYPE string,
lv_key_field TYPE string,
* lt_range_key_value TYPE RANGE OF usmd_tech_key,
lt_key_value TYPE TABLE OF usmd_tech_key,
lv_key_value TYPE usmd_tech_key,
lv_usmd_value TYPE usmd_value,
lt_cr TYPE TABLE OF usmd_crequest,
lv_cr TYPE usmd_crequest,
lt_usmd1213 TYPE TABLE OF usmd1213,
ls_usmd1213 TYPE usmd1213,
lv_flag_del TYPE flag,
lv_where TYPE string,
lv_key_json TYPE string,
lr_data TYPE REF TO data,
lv_error TYPE char1,
lv_index TYPE i.
FIELD-SYMBOLS: <lt_data> TYPE tabel,
<ls_data> TYPE data,
<lv_data> TYPE data.
*--------------------------------------------------------------------*
" 모델 검색
SELECT-OPTIONS so_model FOR lv_model MATCHCODE OBJECT zmdph_model.
*--------------------------------------------------------------------*
START-OF-SELECTION.
*--------------------------------------
" 활성 상태의 모델정보 검색
SELECT usmd_model
INTO TABLE lt_model
FROM usmd001c
WHERE usmd_model IN so_model
AND usmd_objstat = 'A'.
"
IF sy-subrc NE 0.
" 레코드 검색 실패
MESSAGE s000(oo) WITH 'Data not found.' DISPLAY LIKE 'E'.
" 작업 종료
STOP.
ENDIF.
*--------------------------------------
" 모델별 작업
LOOP AT lt_model INTO lv_model.
"
WRITE:/ ' *** ' , lv_model COLOR 7, ' *** '.
"*----------------------------
" 모델 정보로 활성된 테이블 정보 검색
CALL METHOD cl_usmd_adapter_provider=>get_model_generation_adapter
EXPORTING
i_usmd_model = lv_model
IMPORTING
eo_model_gen_adapter = lo_model_gen_adapter
et_message = lt_message.
CLEAR lv_error.
"
LOOP AT lt_message TRANSPORTING NO FIELDS WHERE msgty CA 'AEX'.
"*----------------------------
" 오륲 메세지 처리
MESSAGE ID ls_message-msgid TYPE 'S' NUMBER ls_message-msgno DISPLAY LIKE ls_message-msgty
WITH ls_message-msgv1 ls_message-msgv2 ls_message-msgv3 ls_message-msgv4.
" 오류 발생
lv_error = abap_true.
ENDLOOP.
"*----------------------------
" 오류 없을시 작업 진행
CHECK lv_error IS INITIAL.
"*----------------------------
" 활성 테이블 정보 검색
CALL METHOD lo_model_gen_adapter->get_generated_objects
EXPORTING
if_mdf_hry_tab = abap_false
IMPORTING
et_message = lt_message
et_log_phys_name = lt_log_phys_name. " 활성 테이블 정보
"*----------------------------
"
LOOP AT lt_log_phys_name INTO ls_log_phys_name.
CASE ls_log_phys_name-sub_kind.
WHEN usmd1_cs_tabl_kind-check.
"
lv_entity = ls_log_phys_name-entity.
lv_table = ls_log_phys_name-phys_name.
lv_key_field = 'USMDK' && lv_model && lv_entity.
"
WRITE:/ '*', lv_entity, lv_table.
TRY .
"*----------------------------
" 테이블 키 밸류 검색
SELECT (lv_key_field)
FROM (lv_table)
INTO TABLE @lt_key_value.
CATCH cx_sy_dynamic_osql_semantics.
CONTINUE.
ENDTRY.
"*----------------------------
" 키 중복 제거
SORT lt_key_value.
DELETE ADJACENT DUPLICATES FROM lt_key_value.
"*----------------------------
" 키 밸류별 작업
LOOP AT lt_key_value INTO lv_key_value.
"
CLEAR: lv_flag_del.
"
lv_usmd_value = lv_key_value.
" 키에 매핑된 Change Request 정보 검색
SELECT usmd_crequest
INTO TABLE lt_cr
FROM usmd1213
WHERE usmd_entity = lv_entity
AND usmd_entity_obj = lv_entity
AND usmd_value = lv_usmd_value.
IF sy-subrc <> 0.
" 삭제 대상 설정
lv_flag_del = abap_true.
ENDIF.
" Change Request 별 상태 검색
LOOP AT lt_cr INTO lv_cr.
SELECT SINGLE mandt
INTO sy-mandt
FROM usmd120c
WHERE usmd_crequest = lv_cr
AND usmd_creq_status NOT IN (usmd0_cs_crequest_status-finally_approved, " 05: 승인완료
usmd0_cs_crequest_status-finally_rejected). " 06: 반려완료.
IF sy-subrc <> 0.
" 삭제 대상 설정
lv_flag_del = abap_true.
" 루프 종료
EXIT.
ENDIF.
ENDLOOP. " LOOP AT lt_cr INTO lv_cr.
"*----------------------------
" 삭제 대상인 경우
IF lv_flag_del EQ abap_true.
"
lv_where = |{ lv_key_field } = lv_key_value|.
* lv_table = lt_log_phys_name[ entity = lv_entity
* sub_kind = usmd1_cs_tabl_kind-map ]-phys_name.
READ TABLE lt_log_phys_name INTO ls_log_phys_name
WITH KEY entity = lv_entity sub_kind = usmd1_cs_tabl_kind-map.
lv_table = ls_log_phys_name-phys_name.
"
CREATE DATA lr_data TYPE (lv_table).
ASSIGN lr_data->* TO <ls_data>.
"
lv_key_json = lv_usmd_value.
SELECT SINGLE * INTO <ls_data>
FROM (lv_table)
WHERE (lv_where).
"
lv_key_json = /ui2/cl_json=>serialize( <ls_data> ).
"
WRITE:/ lv_key_json.
"*----------------------------
" 테이블별 레코드 삭제
" 엔티티별 매핑 테이블이 아닌 테이블에 대해 작업
LOOP AT lt_log_phys_name INTO ls_log_phys_name
WHERE kind = 'TABL'
AND entity = lv_entity
AND sub_kind <> usmd1_cs_tabl_kind-map.
"*----------------------------
" 테이블 아이디 설정
lv_table = ls_log_phys_name-phys_name.
"*----------------------------
" 테이블 레코드 삭제 처리
DELETE FROM (lv_table) WHERE (lv_where).
ENDLOOP.
ENDIF.
ENDLOOP. " LOOP AT lt_key_value INTO lv_key_value.
WHEN usmd1_cs_tabl_kind-map.
"
lv_entity = ls_log_phys_name-entity.
lv_table = ls_log_phys_name-phys_name.
lv_key_field = 'USMDK' && lv_model && lv_entity.
"
WRITE:/ '*', lv_entity, lv_table, 'USMD1213'.
TRY .
"*----------------------------
" 테이블 키 밸류 검색
* lv_select = |'I' AS SIGN, 'EQ' AS OPTION, { lv_key_field } AS LOW|.
lv_select = lv_key_field.
SELECT (lv_select)
FROM (lv_table)
* INTO TABLE @lt_range_key_value.
INTO TABLE @lt_key_value.
SORT lt_key_value.
CATCH cx_sy_dynamic_osql_semantics.
CONTINUE.
ENDTRY.
" 키에 매핑 안된 Change Request 정보 검색
SELECT *
INTO TABLE lt_usmd1213
FROM usmd1213
WHERE usmd_entity = lv_entity
AND usmd_entity_obj = lv_entity.
* AND usmd_value NOT IN lt_range_key_value.
LOOP AT lt_usmd1213 INTO ls_usmd1213.
READ TABLE lt_key_value TRANSPORTING NO FIELDS WITH KEY table_line = ls_usmd1213-usmd_value BINARY SEARCH.
IF sy-subrc EQ 0.
DELETE lt_usmd1213.
ELSE.
lv_key_json = /ui2/cl_json=>serialize( ls_usmd1213 ).
WRITE:/ lv_key_json.
ENDIF.
ENDLOOP.
DELETE usmd1213 FROM TABLE lt_usmd1213.
WHEN OTHERS.
ENDCASE.
ENDLOOP. " LOOP AT lt_log_phys_name INTO ls_log_phys_name
ENDLOOP. " LOOP AT lt_model INTO lv_model.
*--------------------------------------
" 커밋
COMMIT WORK.
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.
FUNCTION ZADD_1_ALPHANUM.
*"----------------------------------------------------------------------
*"*"Local Interface:
*" IMPORTING
*" REFERENCE(IV_SKIP_CHAR) TYPE CLIKE OPTIONAL
*" REFERENCE(IV_OFFSET) TYPE I DEFAULT -1
*" CHANGING
*" REFERENCE(CV_DATA) TYPE CLIKE
*"----------------------------------------------------------------------
* 이 구현은 ECATT_INCREASE_ALPHANUM_ID 를 참고 하였습니다.
* overflow가 발생하면 000...0 으로 다시 돌아갑니다.
* 자리수가 자동으로 늘어나면서 앞에 1이 붙지는 않습니다.
CONSTANTS: lc_trans TYPE char72 VALUE '0112233445566778899AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ0'.
DATA: lv_c TYPE char1,
lv_offset TYPE i.
IF iv_offset < 0.
lv_offset = strlen( cv_data ) - 1. " 마지막 글자 위치.
CALL FUNCTION 'ZADD_1_ALPHANUM'
EXPORTING
iv_skip_char = iv_skip_char
iv_offset = lv_offset
CHANGING
cv_data = cv_data.
ELSE.
lv_c = cv_data+iv_offset(1).
TRANSLATE cv_data+iv_offset(1) USING lc_trans.
IF cv_data+iv_offset(1) EQ '0'.
* 자리수 올림은 재귀 호출로 처리한다.
lv_offset = iv_offset - 1. " 앞 글자 위치.
IF lv_offset >= 0.
CALL FUNCTION 'ZADD_1_ALPHANUM'
EXPORTING
iv_skip_char = iv_skip_char
iv_offset = lv_offset
CHANGING
cv_data = cv_data.
ENDIF.
ENDIF.
IF iv_skip_char IS NOT INITIAL AND
cv_data+iv_offset(1) CA iv_skip_char.
CALL FUNCTION 'ZADD_1_ALPHANUM'
EXPORTING
iv_skip_char = iv_skip_char
iv_offset = iv_offset
CHANGING
cv_data = cv_data.
ENDIF.
ENDIF.
ENDFUNCTION.
DATA:
LT_ROOT_KEY TYPE /BOBF/T_FRW_KEY,
LT_ROOT TYPE /SCMTMS/T_TOR_ROOT_K,
LT_ALL_ITEMS TYPE /SCMTMS/T_TOR_ITEM_TR_K,
LT_STOP TYPE /SCMTMS/T_TOR_STOP_K,
LT_STOP_SUCC_ALL TYPE /SCMTMS/T_TOR_STOP_SUCC_K,
LT_DOC_REFERENCE TYPE /SCMTMS/T_TOR_DOCREF_K,
LT_EXEC TYPE /SCMTMS/T_TOR_EXEC_K,
LT_PARTY TYPE /SCMTMS/T_TOR_PARTY_K,
FIELD-SYMBOLS:
<LS_ROOT> TYPE /SCMTMS/S_TOR_ROOT_K,
<LS_ITEM> TYPE /SCMTMS/S_TOR_ITEM_TR_K,
<LS_STOP> TYPE /SCMTMS/S_TOR_STOP_K,
<LS_STOP_SUCC> TYPE /SCMTMS/S_TOR_STOP_SUCC_K,
<LS_DOC_REFERENCE> TYPE /SCMTMS/S_TOR_DOCREF_K,
<LS_EXEC> TYPE /SCMTMS/S_TOR_EXEC_K,
<LS_PARTY> TYPE /SCMTMS/S_TOR_PARTY_K,
" Invalidate cache
/bobf/cl_tra_trans_mgr_factory=>get_transaction_manager( )->cleanup( ).
" Get TOR data
/scmtms/cl_tor_helper_common=>get_tor_data(
EXPORTING
it_root_key = lt_root_key
IMPORTING
et_root = lt_root
et_all_items = lt_all_items
et_stop = lt_stop
et_stop_succ_all = lt_stop_succ_all
et_doc_reference = lt_doc_reference
et_exec = lt_exec
et_party = lt_party
).
/SCMTMS/T_TOR_ITEM_TR_K에 Secondary Key 가 여러개 있습니다. Internal Table 의 Secondary Key 는 마치 DB Index 와 비슷한 역할을 하여 검색 속도를 빠르게 해줍니다. 차이점은 Secondary Key 가 여러개 있어도 Insert 속도에 영향을 주지 않습니다. Secondary Key 의 Indexing 생성 시기는 최초 사용시 입니다. 사용하지 않는 Secondary Key 는 Indexing 하지 않습니다.