批量导入数据
1.定义屏幕按钮和文件输入框
定义选择按钮
PARAMETERS:
p_cx RADIOBUTTON GROUP g1 DEFAULT 'X' USER-COMMAND SINGLECLICK,
p_dr RADIOBUTTON GROUP g1 ,
p_dr2 RADIOBUTTON GROUP g1.
"注意:设置其他按钮的输入框不显示
AT SELECTION-SCREEN OUTPUT.
PERFORM frm_hide.
FORM frm_hide .
LOOP AT SCREEN.
CASE 'X'.
WHEN p_cx.
IF screen-group1 = 'TY' OR screen-group1 = 'TY1'.
screen-invisible = '1'.
screen-active = '0'.
ELSE.
screen-invisible = '0'.
screen-active = '1'.
ENDIF.
WHEN p_dr.
WHEN p_dr2.
ENDCASE.
MODIFY SCREEN.
ENDLOOP.
ENDFORM.
用于获取导入的 EXCEL 文件路径
PARAMETERS:p_path LIKE rlgrap-filename MODIF ID TY.
PARAMETERS:p_path2 LIKE rlgrap-filename MODIF ID TY1. "ID可用与隐藏按钮的内容
通过文件选择框的形式获的文件路径该文件即为待导入的文件
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_path2.
PERFORM frm_get_path2.
FORM frm_get_path2.
CALL FUNCTION 'WS_FILENAME_GET'
EXPORTING
mode = 'O'
title = '导入模板'
IMPORTING
filename = p_path2 !!这里要改
EXCEPTIONS
inv_winsys = 1
no_batch = 2
selection_cancel = 3
selection_error = 4
OTHERS = 5.
ENDFORM.
2.获取文件数据
FORM get_excel_data2.
TYPES: BEGIN OF ty_cols_rows,
begin_col TYPE i,
begin_row TYPE i,
end_col TYPE i,
end_row TYPE i,
END OF ty_cols_rows.
DATA: ls_cols_rows TYPE ty_cols_rows.
DATA: lv_file LIKE rlgrap-filename.
DATA: excel TYPE ole2_object,
lv_index TYPE i.
DATA: lt_excel LIKE TABLE OF alsmex_tabline,
ls_excel LIKE alsmex_tabline,
temp TYPE ztsd015m-zdno.
FIELD-SYMBOLS: <fs>.
lv_file = p_path2. !!文件路径,要改
ls_cols_rows-begin_col = 1. !!也要改
ls_cols_rows-begin_row = 5.
ls_cols_rows-end_col = 4.
ls_cols_rows-end_row = 30000.
CALL FUNCTION 'ALSM_EXCEL_TO_INTERNAL_TABLE'
EXPORTING
filename = lv_file
i_begin_col = ls_cols_rows-begin_col
i_begin_row = ls_cols_rows-begin_row
i_end_col = ls_cols_rows-end_col
i_end_row = ls_cols_rows-end_row
TABLES
intern = lt_excel
EXCEPTIONS
inconsistent_parameters = 1
upload_ole = 2
OTHERS = 3.
SET PROPERTY OF excel 'DisplayAlerts' = 0.
SORT lt_excel BY row col.
LOOP AT lt_excel INTO ls_excel.
lv_index = ls_excel-col.
ASSIGN COMPONENT lv_index OF STRUCTURE gs_data1 TO <fs>.
<fs> = ls_excel-value.
AT END OF row. "这个后面可以处理导入的一行数据
SELECT SINGLE ZDNO FROM ZTSD015M INTO TEMP WHERE ZDNO = GS_DATA1-ZDNO.
IF TEMP = ''.
GS_DATA1-LIGHT = icon_red_light.
GS_DATA1-REMARK = '不正确的出运单号,请检查出运单号'.
ELSE.
GS_DATA1-LIGHT = icon_green_light.
UPDATE ZTSD015M SET ZTD = @gs_data1-ZTD , "把导入的数据放入底表
ZWLGS = @gs_data1-ZWLGS
WHERE ZDNO = @gs_data1-ZDNO.
ENDIF.
APPEND gs_data1 TO gt_data1.
CLEAR gs_data1 .
CLEAR temp. "要注意清空,不然END ROW里的数据会出现问题
ENDAT.
ENDLOOP.
ENDFORM.
3.展示导入的数据
FORM frm_dis_alv2.
gs_layout-cwidth_opt = 'X'.
gs_layout-zebra = 'X'.
PERFORM FRM_GET_FIELDCATALOG_DES3 USING 'LIGHT' '信号灯' '' ''. !!!要改
PERFORM FRM_GET_FIELDCATALOG_DES3 USING 'ZDNO' '出运单号' '' ''.
PERFORM FRM_GET_FIELDCATALOG_DES3 USING 'ZTD' '提单号' '' '' .
PERFORM FRM_GET_FIELDCATALOG_DES3 USING 'ZWLGS' '物流公司' '' '' .
PERFORM FRM_GET_FIELDCATALOG_DES3 USING 'REMARK' '返回消息' '' ''.
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
EXPORTING
I_CALLBACK_PROGRAM = SY-REPID
I_CALLBACK_PF_STATUS_SET = 'SET_PF_STATUS'
is_layout_lvc = GS_LAYOUT
it_fieldcat_lvc = GT_FIELDCAT
I_SAVE = 'X'
TABLES
T_OUTTAB = gt_data1 !!!这里要改,而且gt_data1要自己定义,且要展示的字段与定义的顺序一致
EXCEPTIONS
PROGRAM_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.
ENDFORM.
4.主程序调用
START-OF-SELECTION. "开始选择
PERFORM FRM_MAIN_PROCESS. "执行主流程
FORM FRM_MAIN_PROCESS .
IF p_cx = 'X'.
ELSEIF p_dr = 'X'
PERFORM get_excel_data.
PERFORM frm_dis_alv.
ELSE.
PERFORM get_excel_data2.
PERFORM frm_dis_alv2.
ENDIF.
ENDFORM.
5.在底表定义要加入的字段和数据元素,这一步必须要有,应为要插入数据到底表
字段自己命名,数据元素可以通过代码中定义的类型中参考的底表数据元素
ZTD TYPE ZTSD015M-ZTD, "提单号 "在底表类型中定义一下,要用
ZWLGS TYPE ZTSD015M-ZWLGS, "物流公司
gt_data1的类型定义
BEGIN OF ty_data1,
ZDNO TYPE ZTSD015M-ZDNO, "字段顺序要与展示输出的一致
ZTD TYPE ZTSD015M-ZTD,
ZWLGS TYPE ZTSD015M-ZWLGS,
remark TYPE char50,
light TYPE icon_d,
END OF ty_data1,
GT_DATA1 TYPE TABLE OF ty_data1,
GS_DATA1 TYPE ty_data1,