어렵고 이해하기 힘들다...
천천히 살펴보자..
REPORT zdh_test_10day_3 MESSAGE-ID zpabap06_message.
*테이블선언
TABLES : rlgrap.
*alv를 위한 타입풀스 선언
TYPE-POOLS : slis.
*필드카테고리
DATA : fieldcat TYPE slis_t_fieldcat_alv,
fieldcat_ln LIKE LINE OF fieldcat.
* *소트카테고리
DATA : sortcat TYPE slis_t_sortinfo_alv,
sortcat_ln LIKE LINE OF sortcat.
*레이아웃
DATA : ls_layout TYPE slis_layout_alv.
DATA : gs_repid LIKE sy-repid,
gs_variant LIKE disvariant,
gs_evts TYPE slis_t_event.
CONSTANTS : pf_status_set TYPE slis_alv_event-name
VALUE 'PF_STATUS_SET',
top_of_page TYPE slis_formname
VALUE 'TOP_OF_PAGE',
user_command TYPE slis_alv_event-name
VALUE 'USER_COMMAND'.
DATA : col_pos TYPE i.
*엑셀업로딩을 위한 스트럭쳐 선언
DATA : it_xls LIKE alsmex_tabline OCCURS 0 WITH HEADER LINE.
*bdc선언
CONSTANTS : c_tcode(10) TYPE c VALUE 'ZDH_BDC'.
DATA : it_bdc LIKE bdcdata OCCURS 0 WITH HEADER LINE ,
gs_param LIKE ctu_params, //CALL TRANSACTION USING... 실행시간에 대한 매개변수 문자열
g_message LIKE cfgnl-msglin. //일반 SAP-EIS 필드 문자열
*인터널 테이블 선언
DATA : BEGIN OF it_upload OCCURS 0 ,
name(50),
post(50),
erdat(50),
pay(50),
waers(50),
fee(50),
END OF it_upload.
*alv에 뿌릴 인터널테이블
DATA : BEGIN OF it_list OCCURS 0,
name LIKE ztrecord_11-name,
post LIKE ztrecord_11-post,
erdat LIKE ztrecord_11-erdat,
pay LIKE ztrecord_11-pay,
waers LIKE ztrecord_11-waers,
fee LIKE ztrecord_11-fee,
END OF it_list.
*SELECTION-SCREEN 엑셀 파일을 받는 셀렉션 스크린
PARAMETERS : p_file LIKE rlgrap-filename OBLIGATORY,
p_mode LIKE ctu_params-dismode DEFAULT 'N'.
*이 파일명을 선택했을때 어떻게 할 것인가
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file.
CALL FUNCTION 'KD_GET_FILENAME_ON_F4'
EXPORTING
program_name = sy-repid "시스템내부적으로 가지고 있는 프로그램 네임
dynpro_number = sy-dynnr "화면 넘버
field_name = 'p_file'
static = ' X '
mask = ' *.xls , *.*' "파일형식
CHANGING
file_name = p_file
EXCEPTIONS
mask_too_long = 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.
START-OF-SELECTION.
CLEAR : it_upload , it_upload[] ,
it_list , it_list[] .
CLEAR : it_xls, it_xls[].
* 엑셀 업로드
FIELD-SYMBOLS : <ls>.
CALL FUNCTION 'ALSM_EXCEL_TO_INTERNAL_TABLE'
EXPORTING
filename = p_file
i_begin_col = 1
i_begin_row = 2
i_end_col = 100
i_end_row = 65536
TABLES
intern = it_xls "위에서 만들었던 스트럭쳐 it_xls에 집어 넣는다.
EXCEPTIONS
inconsistent_parameters = 1
upload_ole = 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.
SORT it_xls BY row col .
LOOP AT it_xls.
AT NEW row.
CLEAR it_upload.
ENDAT.
ASSIGN COMPONENT it_xls-col OF STRUCTURE it_upload TO <ls>.
IF sy-subrc = 0.
<ls> = it_xls-value.
ENDIF.
AT END OF row.
APPEND it_upload.
ENDAT.
ENDLOOP.
LOOP AT it_upload.
MOVE-CORRESPONDING it_upload TO it_list.
APPEND it_list.
CLEAR it_list.
ENDLOOP.
END-OF-SELECTION.
PERFORM build_fcat.
PERFORM alv_display.
*&---------------------------------------------------------------------*
*& Form build_fcat
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM build_fcat .
ADD 1 TO col_pos.
fieldcat_ln-fieldname = 'NAME'.
fieldcat_ln-reptext_ddic = '성명'.
APPEND fieldcat_ln TO fieldcat.
CLEAR fieldcat_ln.
ADD 1 TO col_pos.
fieldcat_ln-fieldname = 'POST'.
fieldcat_ln-reptext_ddic = '부서'.
APPEND fieldcat_ln TO fieldcat.
CLEAR fieldcat_ln.
ADD 1 TO col_pos.
fieldcat_ln-fieldname = 'PAY'.
fieldcat_ln-reptext_ddic = '연봉'.
APPEND fieldcat_ln TO fieldcat.
CLEAR fieldcat_ln.
ADD 1 TO col_pos.
fieldcat_ln-fieldname = 'WAERS'.
fieldcat_ln-reptext_ddic = '통화'.
APPEND fieldcat_ln TO fieldcat.
CLEAR fieldcat_ln.
ADD 1 TO col_pos.
fieldcat_ln-fieldname = 'ERDAT'.
fieldcat_ln-reptext_ddic = '입사일'.
APPEND fieldcat_ln TO fieldcat.
CLEAR fieldcat_ln.
ADD 1 TO col_pos.
fieldcat_ln-fieldname = 'FEE'.
fieldcat_ln-reptext_ddic = '인상률'.
APPEND fieldcat_ln TO fieldcat.
CLEAR fieldcat_ln.
ENDFORM. " build_fcat
*&---------------------------------------------------------------------*
*& Form alv_display
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM alv_display .
ls_layout-colwidth_optimize = 'X'.
ls_layout-zebra = 'X'.
gs_repid = sy-repid.
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
i_callback_program = gs_repid
i_callback_pf_status_set = 'PF_STATUS_SET'
i_callback_user_command = 'USER_COMMAND'
is_layout = ls_layout
it_fieldcat = fieldcat
it_sort = sortcat
i_save = 'A'
is_variant = gs_variant
it_events = gs_evts
TABLES
t_outtab = it_list
EXCEPTIONS
program_error = 1
OTHERS = 2.
ENDFORM. " alv_display
*&---------------------------------------------------------------------*
*& Form PF_STATUS_SET
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->RT_EXTAB text
*----------------------------------------------------------------------*
FORM pf_status_set USING rt_extab TYPE slis_t_extab.
SET PF-STATUS 'TEST_CDH' EXCLUDING rt_extab.
ENDFORM. "PF_STATUS_SET
*&---------------------------------------------------------------------*
*& Form user_command
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_UCOMM text
* -->P_SELFIELD text
*----------------------------------------------------------------------*
FORM user_command USING p_ucomm TYPE sy-ucomm
p_selfield TYPE slis_selfield.
CASE p_ucomm.
WHEN 'BDCF'. "GUI에 정의되어 있는 이름
PERFORM run_bdc.
ENDCASE.
ENDFORM. "user_command
*&---------------------------------------------------------------------*
*& Form run_bdc
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM run_bdc .
DATA : i_pay(13).
* bdc모드 설정
gs_param-dismode = p_mode.
gs_param-updmode = 'S'.
gs_param-cattmode = ' '.
gs_param-defsize = ' '.
gs_param-racommit = 'X'.
gs_param-nobinpt = 'X'.
gs_param-nobiend = ' '.
LOOP AT it_list.
CLEAR : i_pay , it_bdc , it_bdc[].
WRITE it_list-pay TO i_pay LEFT-JUSTIFIED CURRENCY it_list-waers.
PERFORM dynpro USING :
* 시작아이디 프로그램명 화면/필드값
'X' 'ZDH_TEST_10DAY_2' '1000' ,
' ' 'BDC_OKCODE' '=ONLI',
' ' 'P_NAME' it_list-name,
' ' 'P_POST' it_list-post,
' ' 'P_ERDAT' it_list-erdat,
' ' 'P_PAY' i_pay,
' ' 'P_WAERS' it_list-waers,
' ' 'P_FEE' it_list-fee.
PERFORM bdc_call_trans TABLES it_bdc USING g_message c_tcode.
ENDLOOP.
ENDFORM. " run_bdc
*&---------------------------------------------------------------------*
*& Form dynpro
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_0504 text
* -->P_0505 text
* -->P_0506 text
*----------------------------------------------------------------------*
FORM dynpro USING p_dynbegin p_name p_value. "파라미터 세 개를 받는다.
IF p_dynbegin = 'X'.
MOVE : p_name TO it_bdc-program,
p_value TO it_bdc-dynpro,
p_dynbegin TO it_bdc-dynbegin.
ELSE.
MOVE : p_name TO it_bdc-fnam,
p_value TO it_bdc-fval.
ENDIF.
APPEND it_bdc.
CLEAR it_bdc.
ENDFORM. " dynpro
form bdc_call_trans TABLES t_data STRUCTURE bdcdata
USING p_msg STRUCTURE cfgnl
p_tcode.
data : lt_message type TABLE OF bdcmsgcoll WITH HEADER LINE.
data : l_subrc like sy-subrc.
call TRANSACTION p_tcode USING t_data
options from gs_param
messages into lt_message.
CALL FUNCTION 'RKC_MSG_STRING'
EXPORTING
ID = sy-msgid
mtype = sy-msgty
number = sy-msgno
PAR1 = sy-msgv1
PAR2 = sy-msgv2
PAR3 = sy-msgv3
PAR4 = sy-msgv4
IMPORTING
MSG_LIN = p_msg.
ENDFORM.