* The type for SELECT_OPTIONS_RESTRICT (to be extended)
TYPES: BEGIN OF SSCR_RESTRICT,
OPT_LIST_TAB TYPE SSCR_OPT_LIST_TAB,
ASS_TAB TYPE SSCR_ASS_TAB,
END OF SSCR_RESTRICT.
* List of option lists
TYPES: SSCR_OPT_LIST_TAB TYPE SSCR_OPT_LIST OCCURS 5.
* One list of options
TYPES: BEGIN OF SSCR_OPT_LIST,
NAME LIKE RSRESTRICT-OPTIONLIST,
OPTIONS LIKE RSOPTIONS,
END OF SSCR_OPT_LIST.
* The association table
TYPES: SSCR_ASS_TAB TYPE SSCR_ASS OCCURS 20.
* One line of table associating selection screen object with opt. list
TYPES: BEGIN OF SSCR_ASS,
KIND LIKE RSSCR-KIND, " A(ll), B(lock), S(elect-Option)
NAME LIKE RSRESTRICT-OBJECTNAME, " Blockname, maximal 20
SG_MAIN LIKE RSRESTRICT-SIGN, " (only) I, * = both
SG_ADDY LIKE RSRESTRICT-SIGN, " additional SIGN
" on multiple selection screen
OP_MAIN LIKE RSRESTRICT-OPTIONLIST, " name of option list for
" main selection screen
OP_ADDY LIKE RSRESTRICT-OPTIONLIST, " name of additional option
" list for multiple selection screen
END OF SSCR_ASS.
Restriction 에는 기본적으로 opt_list_tab ( one list of options table ) 와 ass_tab ( association table )를 구성해야한다.
1. OPT_LIST_TAB
option list를 나타내는 이름과 , options 의 종류 설정이다.
이름은 10글자 이내로 원하는대로 넣으면 된다. [ EX) 'ONLY_EQ' , 'SELOP_EQ', 'EQ_ONLY' , 'ONLY_NE' 등 ]
options는 원하는 항목에 대해서 아래 Structure Name 을 선택하여 구성하면 된다.
selection options 의 종류 Structure.
구성 방법은 다음과 같다.
DATA: ls_sscr_opt_list TYPE sscr_opt_list,
ls_sscr_ass_list type SCR_ASS,
ls_restriction TYPE sscr_restrict.
* 'SELOP_EQ' 라는 이름과 EQ만 허용
ls_sscr_opt_list-name = 'SELOP_EQ'.
ls_sscr_opt_list-options-eq = 'X'.
* 만든 option list를 restriction 의 opt_list_tab에 append.
APPEND ls_sscr_opt_list TO ls_restrict-opt_list_tab.
* New Syntax 선언 방법 ( ass_tab 은 아래 추가 설정 )
DATA(ls_restriction) = VALUE sscr_restrict(
opt_list_tab = VALUE #( ( name = 'SELOP_EQ' options = VALUE #( eq = 'X' ) ) )
ass_tab = VALUE #( ) ).
해당 코드는 'SELOP_EQ' 라는 이름을 가지고 selection option 은 EQ만 허용하는 opt_list_tab를 설정한 것이다.
반응형
2. ASS_TAB
KIND는 특정 유형의 필드를 제어할지 나타내는 것이다.
A : ALL(모든필드)를 제어한다.
B: Block(블락)을 제어한다.
S: Select-option(선택옵션) 제어 사용.
나는 Select-option을 제어할 것이기에 Kind = 'S'를 설정할 것이다.
NAME은 제어할 필드의 이름이다. [ ex) s_bukrs, p_bukrs ]
SG_MAIN은 메인 선택기호 (Sign)이며, SG_ADDY 는 추가 선택기호이다.
'I' = Include로 포함을 의미한다.
'*'을 넣어주면 Include, Exclude 둘다 적용 된다.
OP_MAIN은 메인 option list 이름이며, OP_ADDY는 추가 option list 이다.
해당 값은 위에 설정했던 OPT_LIST_TAB에 있는 option_list_tab-name 이다.
구성방법은 다음과 같다.
DATA: ls_sscr_opt_list TYPE sscr_opt_list,
ls_sscr_ass_list type SCR_ASS,
ls_restriction TYPE sscr_restrict.
* 'SELOP_EQ' 라는 이름과 EQ만 허용
ls_sscr_opt_list-name = 'SELOP_EQ'.
ls_sscr_opt_list-options-eq = 'X'.
* 만든 option list를 restriction 의 opt_list_tab에 append.
APPEND ls_sscr_opt_list TO ls_restrict-opt_list_tab.
* ass_list 구성 후 ls_restriction의 ass_tab에 append.
ls_sscr_ass_list-kind = 'S'.
ls_sscr_ass_list-name = 'S_BUKRS'
ls_sscr_ass_list-sg_main = 'I'.
ls_sscr_ass_list-op_main = 'SELOP_EQ'.
APPEND ls_sccr_ass_list TO ls_restriction-ass_tab.
* New Syntax 선언 방법
DATA(ls_restriction) = VALUE sscr_restrict(
opt_list_tab = VALUE #( ( name = 'SELOP_EQ' options = VALUE #( eq = 'X' ) ) )
ass_tab = VALUE #( ( kind = 'S' name = 'S_BUKRS' sg_main = 'I' op_main = 'SELOP_EQ' ) ) ).
CALL FUNCTION 'SELECT_OPTIONS_RESTRICT'
EXPORTING
restriction = ls_restriction
사용방법은 위의 코드와 같다.
그러면 실행해서 어떻게 제어가 되는지 확인해보자.
위에 코드 실행 시 아래 화면과 같이 제어가 된다.
sg_main = 'I' , select-options는 EQ만 사용.
그러면 sg_main = '*' 로 변경하면 어떻게 되는지 확인해보자.
sg_main = '*', select-options는 EQ만 사용.
Single Value가 아니라 Range를 넣고 싶으면,
DATA(ls_restriction) = VALUE sscr_restrict(
opt_list_tab = VALUE #( ( name = 'SELOP_EQ' options = VALUE #( eq = 'X' ) )
( name = 'SELOP_BT' options = VALUE #( bt = 'X' ) ) )
ass_tab = VALUE #( ( kind = 'S' name = 'S_BUKRS' sg_main = 'I' op_main = 'SELOP_BT' ) ) ).
사용할 op_main을 BT로 설정한 list_tab 이름으로 변경해주면 된다.
Select Ranges로 변경된 것을 확인.
위와 동일하게 sg_main = '*'로 하면 select ranges탭과 exclude select ranges 탭 2개가 생긴다.
DATA(ls_restriction) = VALUE sscr_restrict(
opt_list_tab = VALUE #( ( name = 'SELOP_EQ' options = VALUE #( eq = 'X' ) )
( name = 'SELOP_BT' options = VALUE #( bt = 'X' ) ) )
ass_tab = VALUE #( ( kind = 'S' name = 'S_BUKRS' sg_main = 'I' op_main = 'SELOP_BT' op_addy = 'SELOP_EQ' ) ) ).
op_addy에 SELOP_EQ를 넣으면 select single values와 select ranges 탭으로 설정 가능하다.
Select single value와 select ranges 탭으로만 설정.
마지막으로 selection options에 값 추가해보자.
DATA(ls_restriction) = VALUE sscr_restrict(
opt_list_tab = VALUE #( ( name = 'SELOP_EQ' options = VALUE #( eq = 'X' ) )
( name = 'GE&NE' options = VALUE #( ge = 'X' ne = 'X' ) ) )
ass_tab = VALUE #( ( kind = 'S' name = 'S_BUKRS' sg_main = 'I' op_main = 'SELOP_EQ' op_addy = 'GE&NE' ) ) ).
DATA : lo_http_client TYPE REF TO if_http_client,
lv_json TYPE string,
lv_api_token TYPE string VALUE '접근가능한 API TKOEN명', " API Token
lv_auth TYPE string,
ls_data TYPE gty_data.
DATA(lv_url) = |https://접근할 URL 주소|.
" HTTP 클라이언트 생성
cl_http_client=>create_by_url( EXPORTING url = lv_url
IMPORTING client = lo_http_client ).
" HTTP 요청 설정
lv_auth = |Bearer { lv_api_token }|.
lo_http_client->request->set_header_field( name = 'Authorization' value = lv_auth ).
lo_http_client->request->set_header_field( name = 'Content-Type' value = if_rest_media_type=>gc_appl_json ).
lo_http_client->request->set_method( if_http_request=>co_request_method_get ).
" HTTP 요청 전송
lo_http_client->send( ).
lo_http_client->receive( ).
" HTTP 상태 코드 확인.
lo_http_client->response->get_status( IMPORTING code = DATA(lv_status_code) ).
IF lv_status_code <> '200'.
" 실패 Message 처리
EXIT.
ELSE.
" Body Data
DATA(lv_response_body) = lo_http_client->response->get_cdata( ).
" HTTP 클라이언트 종료
lo_http_client->close( ).
" Json Data -> ABAP Stucture로 변환
CALL METHOD /ui2/cl_json=>deserialize(
EXPORTING
json = lv_response_body
CHANGING
data = ls_data ). " ABAP Structure Data
ENDIF.
코드를 다음과 같이 작성하면 URL에 접근이 가능하다.
CL_HTTP_CLIENT 클래스를 사용하요 HTTP 클라이언트를 생성하고,
Header 및 Method 구성 후 send 와 receive를 사용하여 요청하고 응답을 받을 수 있습니다.
만약 URL에 데이터를 전송하려면 Method구성 시 GET이 아니라 POST를 요청하면 된다.
IF_REST_MEDIA_TYPE 해당 인터페이스를 들어가보면 Attribute에 변수가 저장되어 있어서
알맞은 attribute를 찾아서 header와 method를 구성하면 쉽게 접근할 수 있다.
IF_REST_MEDIA_TYPE 인터페이스에 설정되어 있는 atrribute
IF_HTTP_ENTITY의 attribute
위의 코드로 접근 시 해당 data를 받아오면 되는데 JSON type 으로 요청했기 때문에
JSON data를 ABAP Structure로 변환만 해주면 된다.
" Status, issue info
TYPES: BEGIN OF gty_name,
name TYPE string,
END OF gty_name.
" Field info
TYPES: BEGIN OF gty_fields,
issuetype TYPE gty_name,
status TYPE gty_name,
resolutiondate TYPE string,
created TYPE string,
END OF gty_fields.
" JSON Data Info
TYPES : BEGIN OF gty_data,
key TYPE string,
fields TYPE gty_fields,
END OF gty_data.
JSON 받을 data는 다음과 같이 deep structure로 구성하여 필요한 필드만 구성하여 받을 수 있다.
Method cl_gui_frontend_services=>file_save_dialog를 이용하면 된다.
DATA : lv_file_filter TYPE string,
lv_initial_directory TYPE string,
lv_filename TYPE string,
lv_path TYPE string,
lv_fullpath TYPE string.
lv_filename = 'Template'.
lv_file_filter = 'Excel File(*.xlsx; *.xls )|*.xlsx; *.xls'.
lv_initial_directory = 'C:'.
cl_gui_frontend_services=>file_save_dialog(
EXPORTING
default_extension = 'xlsx' " Default Extension
default_file_name = lv_filename " Default File Name
file_filter = lv_file_filter " File Type Filter Table
initial_directory = lv_initial_directory " Initial Directory
CHANGING
filename = lv_filename " File Name to Save
path = lv_path " Path to File
fullpath = lv_fullpath " Path + File Name
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.
IF lv_fullpath IS INITIAL.
RETURN.
ENDIF.
위 코드와 같이 작성을 하면 아래와 같이 Download하는 창을 불러올 수 있다.
Excel Download 창
Default로 C드라이브 , 제목은 Template고 형식은 Excel로 들어간다.
필요에 따라 저장위치, 파일이름, 형식은 변경이 가능
lv_fullpath 는 저장위치(path) + 파일이름(File Name) 으로 구성되는 String으로 반환된다.
자 그러면 이제 Excel 혹은 Excel Template를 SAP 스탠다드에(웹저장소) 등록을 해보자.
T-Code : SMW0 실행.
SMW0 화면
Binary data for WebRFC applications를 선택하고 실행을 눌러준다.
Binary data for WebRFC 화면
해당 프로그램이 포함된 Package를 넣어주고 Excute(실행)클릭
반응형
Obj. name 과 Description을 작성하고 import 버튼을 눌러 생성해준다.
Obj. name은 나중에 select문에 사용된다.
Import 클릭 후 화면
Import 버튼을 누르면 Excel을 선택하는 창이 나오는데,
미리 작성해둔 template excel 파일을 선택하여 등록하면 SAP 스탠다드 웹 저장소에 Upload되면서 저장이 된다.
그럼 코드로 돌아와서 해당 파일을 가져오자.
DATA : ls_item TYPE wwwdatatab,
lv_file TYPE rlgrap-filename.
lv_file = lv_fullpath.
SELECT SINGLE FROM wwwdata
FIELDS *
WHERE objid = 'Z_EXCEL_TEMPLATE'
INTO CORRESPONDING FIELDS OF @ls_item. "#EC CI_NOORDER
CALL FUNCTION 'DOWNLOAD_WEB_OBJECT'
EXPORTING
key = ls_item
destination = lv_file.
IF ls_item IS INITIAL.
"File is not exist
MESSAGE s044 DISPLAY LIKE 'E'.
EXIT.
ENDIF.
wwwdata 에서 방금 만든 obj.name 의 data를 가져와
CALL FUNCTION 'DOWNLOAD_WEB_OBJECT' 를 사용해서 다운로드를 해주면