SAP/ABAP 코드
(ABAP 코드) 자주 사용 되는 펑션/메소드 모음
haramang
2021. 10. 11. 17:52
Class 내의 SY-UCOMM 을 PAI에서 관리할 수 있게 함
CALL METHOD CL_GUI_CFW=>SET_NEW_OK_CODE
EXPORTING
NEW_CODE = E_UCOMM.
CLEAR E_UCOMM.
Edit 모드 활성/비활성화
cl_gui_alv_grid=>mc_style_disabled.
cl_gui_alv_grid=>mc_style_enabled.
data_changed 이벤트에서 변경 된 셀 데이터 찾아서 수정할 때,
DATA: ls_mod_cells TYPE lvc_s_modi.
LOOP AT pr_data_changed->mt_mod_cells INTO ls_mod_cells.
data_changed_finished 이벤트에서 변경된 셀 찾아서 수정할 때,
after_data_changed 이벤트에서 변경 된 셀 데이터 찾아서 수정할 때,
LOOP AT et_good_cells INTO ls_good_cell.
Row 셋팅 및 해제
CALL METHOD po_grid->get_selected_rows
IMPORTING
et_row_no = lt_row_no.
CALL METHOD go_grid->set_selected_rows
EXPORTING
it_index_rows = lt_sel_rows.
data_changed 이벤트 강제 발생
FORM check_data_changed USING po_grid TYPE REF TO cl_gui_alv_grid.
DATA: lv_valid TYPE c,
lv_refresh TYPE c.
CHECK po_grid IS BOUND.
CALL METHOD po_grid->check_changed_data
IMPORTING
e_valid = lv_valid
CHANGING
c_refresh = lv_refresh.
ENDFORM.
ALV 높이 조절
CALL METHOD go_splitter->set_row_height
EXPORTING
id = 1
height = 13.
CALL METHOD go_splitter->set_column_width
EXPORTING
id = 1
width = 60.
CL_DD_DOCUMENT 선언 - ALV 헤더 용
DATA: go_grid TYPE REF TO cl_gui_alv_grid.
DATA: go_doc TYPE REF TO cl_dd_document.
CREATE OBJECT go_doc
EXPORTING
style = 'ALV_GRID'.
CALL METHOD po_grid->list_processing_events
EXPORTING
i_event_name = 'TOP_OF_PAGE'
i_dyndoc_id = go_doc.
Edit Event 등록 ( 엔터 눌렀을 때, 셀 이동 시 )
CALL METHOD GO_GRID->REGISTER_EDIT_EVENT
EXPORTING
I_EVENT_ID = CL_GUI_ALV_GRID=>MC_EVT_ENTER.
CALL METHOD GO_GRID->REGISTER_EDIT_EVENT
EXPORTING
I_EVENT_ID = CL_GUI_ALV_GRID=>MC_EVT_MODIFIED.
BDC 데이터 셋팅
FORM set_bdc_data USING pv_chk
pv_name
pv_value.
CLEAR: gs_bdc.
IF pv_chk EQ gc_x.
gs_bdc-program = pv_name.
gs_bdc-dynpro = pv_value.
gs_bdc-dynbegin = gc_x.
ELSE.
gs_bdc-fnam = pv_name.
gs_bdc-fval = pv_value.
ENDIF.
APPEND gs_bdc TO gt_bdc.
ALV Cell 값 변경
pr_data_changed TYPE REF TO cl_alv_changed_data_protocol
CALL METHOD pr_data_changed->modify_cell
EXPORTING
i_row_id = ps_mod_cells-row_id
i_fieldname = ps_mod_cells-fieldname
i_value = ps_mod_cells-value.
스탠다드 툴바 제외 설정
FORM set_exclude_toolbar TABLES pt_toolbar TYPE ui_functions
USING VALUE(p_value).
* Toolbar function code variable
DATA: ls_execlude TYPE ui_func.
* Standtard toolbar 에서 지울 toolbar를 셋팅하고 gt_toolbar에 저장
ls_execlude = p_value.
APPEND ls_execlude TO pt_toolbar.
ENDFORM.
스탠다드 툴바 셋팅
FORM handle_toolbar USING pe_object
TYPE REF TO cl_alv_event_toolbar_set
pe_interactive.
* Toolbar 생성하는 variable
DATA: ls_toolbar TYPE stb_button.
* 전체선택 toolbar 생성
MOVE 'SELALL' TO ls_toolbar-function.
MOVE icon_insert_row TO ls_toolbar-icon.
MOVE '전체선택' TO ls_toolbar-quickinfo.
MOVE '전체선택' TO ls_toolbar-text.
MOVE ' ' TO ls_toolbar-disabled.
INSERT ls_toolbar INTO pe_object->mt_toolbar INDEX 1.
* 전체해제 toolbar 생성
MOVE 'DESELALL' TO ls_toolbar-function.
MOVE icon_deselect_all TO ls_toolbar-icon.
MOVE '전체해제' TO ls_toolbar-quickinfo.
MOVE '전체해제' TO ls_toolbar-text.
MOVE ' ' TO ls_toolbar-disabled.
INSERT ls_toolbar INTO pe_object->mt_toolbar INDEX 2.
ENDFORM.
RTTS를 사용하여 인터널 테이블에 있는 타입으로 필드카탈로그 생성
DATA: gr_structdescr TYPE REF TO cl_abap_structdescr.
DATA: gr_tabledescr TYPE REF TO cl_abap_tabledescr.
FORM set_field_catalog USING VALUE(ps_fcat) TYPE lvc_s_fcat
CHANGING pt_fcat TYPE lvc_t_fcat.
* 자재내역 인터널 테이블로부터 Line data 가져옴
gr_tabledescr ?= cl_abap_typedescr=>describe_by_data( gt_mat_data ).
gr_structdescr ?= gr_tabledescr->get_table_line_type( ).
* Line type을 loop을 돌면서 필드카탈로그와 스타일 세팅
LOOP AT gr_structdescr->components[] INTO gs_element.
CASE gs_element-name.
WHEN 'ID'.
ps_fcat-coltext = '상태'.
ps_fcat-col_opt = gc_x.
WHEN 'MATNR'.
ps_fcat-coltext = '자재번호'.
ps_fcat-col_opt = gc_x.
WHEN 'MAKTX'.
ps_fcat-coltext = '자재내역'.
ps_fcat-col_opt = gc_x.
WHEN 'MEINS'.
ps_fcat-coltext = '기본단위'.
ps_fcat-col_opt = gc_x.
WHEN 'MTART'.
ps_fcat-coltext = '자재유형'.
ps_fcat-col_opt = gc_x.
WHEN 'MTBEZ'.
ps_fcat-coltext = '자재유형명'.
ps_fcat-col_opt = gc_x.
WHEN 'SPART'.
ps_fcat-coltext = '제품군'.
ps_fcat-col_opt = gc_x.
WHEN 'MATKL'.
ps_fcat-coltext = '자재그룹'.
ps_fcat-col_opt = gc_x.
WHEN 'MESSAGE'.
ps_fcat-coltext = '메시지'.
ps_fcat-outputlen = 30.
WHEN 'LOG'.
ps_fcat-coltext = '이력'.
ps_fcat-just = 'C'.
ps_fcat-hotspot = 'X'.
WHEN OTHERS.
ps_fcat-no_out = gc_x.
ENDCASE.
* 필드이름, 데이터타입, 길이, 소숫점 셋팅
ps_fcat-fieldname = gs_element-name.
ps_fcat-datatype = gs_element-type_kind.
ps_fcat-inttype = gs_element-type_kind.
ps_fcat-intlen = gs_element-length / cl_abap_char_utilities=>charsize.
ps_fcat-decimals = gs_element-decimals.
APPEND ps_fcat TO pt_fcat.
CLEAR: ps_fcat, gs_element.
ENDLOOP.
ENDFORM.
RTTS로 동적 인터널 테이블, 필드카탈로그 생성
FORM create_dynamic_itab .
DATA: lv_date_low TYPE d, " 시작일자
lv_date_high TYPE d, " 종료일자
lv_date TYPE n LENGTH 6. " 월 ( 동적 인터널 테이블 필드 선언 용)
DATA: lv_diff_mon TYPE i. " 종료일자 - 시작일자
DATA: lv_loop_cnt TYPE i. " LOOP 카운터
DATA: lv_col_cnt TYPE i VALUE 3. " COL_POS 카운터
DATA: lv_err_msg TYPE string.
DATA: lo_excep TYPE REF TO cx_root.
DATA: lo_excep_pos type i.
DATA: lv_fname type string.
gw_component-name = 'ZNAME1'.
gw_component-type = CAST #( cl_abap_elemdescr=>describe_by_name( 'ZE15_NAME1' ) ).
APPEND gw_component TO gt_components.
CLEAR gw_component.
gw_component-name = 'ZNAME2'.
gw_component-type = CAST #( cl_abap_elemdescr=>describe_by_name( 'ZE15_NAME2' ) ).
APPEND gw_component TO gt_components.
CLEAR gw_component.
* 종료일자가 입력되지 않았을 경우, (시작일자만 입력 됨)
IF s_date-high IS INITIAL.
lv_fname = s_date-low.
gw_component-name = lv_fname.
gw_component-type ?= cl_abap_elemdescr=>get_c( 2 ).
APPEND gw_component TO gt_components.
CLEAR gw_component.
* 시작일자, 종료일자 모두 입력되었을 경우,
ELSE.
* 종료일자 - 시작일자 계산.
lv_diff_mon = ABS( s_date-high(4) * 12 + s_date-high+4(2) ) -
ABS( s_date-low(4) * 12 + s_date-low+4(2) ).
* 종료일자 - 시작일자가 11보다 클 경우, 12개월 이상
IF lv_diff_mon > 11.
" Loop 카운터를 12로 셋팅
lv_loop_cnt = 12.
* 종료일자 - 시작일자가 11보다 작을 경우, 12개월 이하
ELSE.
" 종료일자 - 시작일자 에서 1을 더 더함
" 12월 - 11월 일 경우, 1개월로 계산되지만, LOOP으로 11월 12월, 모두 2번 돌아야 되기 때문.
lv_loop_cnt = lv_diff_mon + 1.
ENDIF.
* lv_date에 시작일자을 저장
lv_date = s_date-low.
* Loop 카운터 수만큼 계산.
DO ( lv_loop_cnt ) TIMES.
lv_fname = lv_date.
gw_component-name = lv_fname.
gw_component-type ?= cl_abap_elemdescr=>get_c( 2 ).
APPEND gw_component TO gt_components.
CLEAR: gw_component.
IF lv_date+4(2) EQ 12.
lv_date = lv_date + 100 - 11.
ELSE.
lv_date = lv_date + 1.
ENDIF.
* 필드카탈로그 필드 포지션 카운터
lv_col_cnt = lv_col_cnt + 1.
ENDDO.
ENDIF.
* Color 테이블 필드 셋팅
gw_component-name = 'ZCOLOR'.
gw_component-type = CAST #( cl_abap_typedescr=>describe_by_name( 'LVC_T_SCOL' ) ).
gw_component-as_include = abap_false.
APPEND gw_component TO gt_components.
CLEAR: gw_component.
* 시작일자 종료일자 셋팅 - DB 에서 데이터 가져올 때, WHERE 구문에 사용 됨
gv_date_low = s_date-low.
gv_date_high = lv_date - 1.
* 동적 테이블 구성
TRY.
gr_structdescr ?= cl_abap_structdescr=>create( p_components = gt_components
p_strict = cl_abap_structdescr=>false ).
gr_tabledescr ?= cl_abap_tabledescr=>create( p_line_type = gr_structdescr
p_table_kind = 'S'
p_unique = abap_false
p_key = VALUE #( ( name = 'ZNAME1' )
( name = 'ZNAME2' ) )
p_key_kind = cl_abap_tabledescr=>keydefkind_user ).
CREATE DATA gt_data TYPE HANDLE gr_tabledescr.
ASSIGN gt_data->* TO <fs_data>.
CREATE DATA gs_data TYPE HANDLE gr_structdescr.
ASSIGN gs_data->* TO <fs_line>.
CATCH cx_root INTO lo_excep.
lv_err_msg = lo_excep->GET_TEXT( ).
MESSAGE S000 WITH '동적 인터널 생성에 실패하였습니다.' DISPLAY LIKE 'E'.
WRITE:/ lv_err_msg.
ENDTRY.
ENDFORM.
필드카탈로그 생성
LOOP AT gr_structdescr->components INTO LS_COMPONENTS.
IF LS_COMPONENTS-NAME NE 'ZCOLOR'.
LS_FCAT-FIELDNAME = LS_COMPONENTS-NAME.
LS_FCAT-COLTEXT = LS_COMPONENTS-NAME.
LS_FCAT-DATATYPE = LS_COMPONENTS-TYPE_KIND.
LS_FCAT-INTTYPE = LS_COMPONENTS-TYPE_KIND.
LS_FCAT-INTLEN = LS_COMPONENTS-LENGTH.
APPEND LS_FCAT TO LT_FCAT.
ENDIF.
ENDLOOP.
Search Help 프로그램 내에서 만들기
FORM SEARCH_HELP_FOR_COSTCENTER CHANGING PV_KOSTL.
DATA : F4_RETURN LIKE TABLE OF DDSHRETVAL WITH HEADER LINE,
LT_DYNMAPP TYPE TABLE OF DSELC WITH HEADER LINE,
LT_DYNTAB TYPE TABLE OF STRING.
* Search Help### ## ### ##
CLEAR : LT_DYNMAPP[], LT_DYNTAB[].
* Search Help ### ## Field# ####
DATA: BEGIN OF LS_DATA,
KOSTL TYPE KOSTL,
KTEXT TYPE KTEXT,
END OF LS_DATA,
LT_DATA LIKE TABLE OF LS_DATA.
SELECT DISTINCT KOSTL, KTEXT
FROM ZTP5KOSTLB
INTO TABLE @LT_DATA
ORDER BY KOSTL.
* Search Help ### ## Function
*-> CALL FUNCTION
CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
EXPORTING
RETFIELD = 'KOSTL'
DYNPPROG = SY-CPROG
DYNPNR = SY-DYNNR
* WINDOW_TITLE = '#####'
VALUE_ORG = 'S'
TABLES
VALUE_TAB = LT_DATA
RETURN_TAB = F4_RETURN
EXCEPTIONS
PARAMETER_ERROR = 1
NO_VALUES_FOUND = 2
OTHERS = 3.
IF SY-SUBRC <> 0.
MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
* F4_RETURN# ### Line
READ TABLE F4_RETURN INDEX 1.
CHECK SY-SUBRC = 0.
* P_DEV(#### ## ##)# FIELDVAL# ##
PV_KOSTL = F4_RETURN-FIELDVAL.
ENDFORM.
Gui Download
FORM DOWNLOAD_REPORT .
DATA: LV_FILENAME TYPE STRING,
LV_PATH TYPE STRING,
LV_FULLPATH TYPE STRING,
LV_RESULT TYPE I.
DATA: BEGIN OF LT_HEADING OCCURS 0,
TEXT(20) TYPE C,
END OF LT_HEADING.
" Save Dialog
CALL METHOD CL_GUI_FRONTEND_SERVICES=>FILE_SAVE_DIALOG
EXPORTING
WINDOW_TITLE = '### ##'
* FILE_FILTER = 'EXCEL FILES (*.XLS)|*.XLS|EXCEL FILES (*.XLSX)|*.XLSX|'
FILE_FILTER = 'EXCEL FILES (*.XLS)|*.XLS'
INITIAL_DIRECTORY = 'C:\'
CHANGING
FILENAME = LV_FILENAME
PATH = LV_PATH
FULLPATH = LV_FULLPATH
USER_ACTION = LV_RESULT.
" ## ## ### ##,
IF LV_RESULT = 9.
EXIT.
ENDIF.
" ## ## ##
LOOP AT GT_REP_FCAT INTO GS_REP_FCAT.
LT_HEADING-TEXT = GS_REP_FCAT-FIELDNAME.
APPEND LT_HEADING.
ENDLOOP.
" ## ####
CALL FUNCTION 'GUI_DOWNLOAD'
EXPORTING
FILENAME = LV_FULLPATH
FILETYPE = 'ASC'
APPEND = 'X'
WRITE_FIELD_SEPARATOR = 'X'
CODEPAGE = '8500'
TABLES
DATA_TAB = <FT_DATA>
FIELDNAMES = LT_HEADING
EXCEPTIONS
FILE_WRITE_ERROR = 1
NO_BATCH = 2
GUI_REFUSE_FILETRANSFER = 3
INVALID_TYPE = 4
NO_AUTHORITY = 5
UNKNOWN_ERROR = 6
HEADER_NOT_ALLOWED = 7
SEPARATOR_NOT_ALLOWED = 8
FILESIZE_NOT_ALLOWED = 9
HEADER_TOO_LONG = 10
DP_ERROR_CREATE = 11
DP_ERROR_SEND = 12
DP_ERROR_WRITE = 13
UNKNOWN_DP_ERROR = 14
ACCESS_DENIED = 15
DP_OUT_OF_MEMORY = 16
DISK_FULL = 17
DP_TIMEOUT = 18
FILE_NOT_FOUND = 19
DATAPROVIDER_EXCEPTION = 20
CONTROL_FLUSH_ERROR = 21
OTHERS = 22.
IF SY-SUBRC <> 0.
MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
ENDFORM.