上一篇公众号文章是导出数据库表的数据,本篇是相反的操作,把本地的数据导入到数据库表,或者是根据本地数据修改/删除数据库表内容。
SE16N系列事务码也能够实现导入或者删除数据,那么为啥还要写一个程序呢?
使用方法比较简单,填入表名后,会弹出窗口选择需要上载/修改的字段( 注意KEY字段是必须 选择 的
),在选好后,点击“导出表字段”就可以把选中的列名导出到剪贴板,然后打开一个Excel,粘贴进去,数据模板就有了,根据这个模板组织数据就可以了。
有四种修改模式,可以根据实际需求选择:
A 表内已有的数据修改,没有的数据新建
I 仅上传新数据,表内已有数据忽略
U 仅修改表内已有数据
D 根据上传数据主键删除表内数据
其他说明:
4、更新已有数据时,如果不想修改某一个字段,可以填充上叹号(!)
5、确认界面显示的数据即为导入到表的数据(前导零/Conversion/大写转换等都已经做好)
*&---------------------------------------------------------------------**& 本地数据导入到数据库表*& Baitianzhen*&---------------------------------------------------------------------*REPORT zimportdata NO STANDARD PAGE HEADING.
TABLES: sscrfields,dfies,dd02v,dd03p,usr01.DATA: gt_fldct TYPE lvc_t_fcat, gs_fldct TYPE lvc_s_fcat, gs_slayt TYPE lvc_s_layo, gv_index TYPE sy-index, gv_title TYPE lvc_title, gv_tabix LIKE sy-tabix, gv_subrc LIKE sy-subrc, gv_fname TYPE rs38l_fnam, gv_lsstr TYPE string, gv_keynm TYPE i.DATA: gt_dd03 TYPE TABLE OF dd03p WITH HEADER LINE.DATA: gt_clip TYPE TABLE OF text4096 WITH HEADER LINE, it_fval TYPE TABLE OF text4096 WITH HEADER LINE.DATA: gt_wstr TYPE TABLE OF string WITH HEADER LINE.DATA: BEGIN OF gs_noupd, row TYPE i, col TYPE fieldname, END OF gs_noupd.DATA: gt_noupd LIKE TABLE OF gs_noupd.DATA: BEGIN OF gs_lstbox, key(40) TYPE c, text(80) TYPE c, END OF gs_lstbox.DATA: gt_lstbox LIKE TABLE OF gs_lstbox.DATA: gv_cxroot TYPE REF TO cx_root, gv_excmsg TYPE string.DATA: gt_dbtab TYPE REF TO data, gs_dbtab TYPE REF TO data, gt_uptab TYPE REF TO data, gs_uptab TYPE REF TO data.FIELD-SYMBOLS: <fs_dbtab> TYPE STANDARD TABLE, <fs_dbwa>, <fs_uptab> TYPE STANDARD TABLE, <fs_upwa>, <fs_fldval>,<fs_tmp>.
SELECTION-SCREEN FUNCTION KEY 1.SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE t01.PARAMETERS p_tnam LIKE dd03l-tabname OBLIGATORY VALUE CHECK.SELECT-OPTIONS s_flds FOR dd03p-fieldname NO INTERVALS.SELECTION-SCREEN END OF BLOCK b1.SELECTION-SCREEN BEGIN OF BLOCK b2 WITH FRAME TITLE t02.PARAMETERS pr_1 RADIOBUTTON GROUP typ USER-COMMAND sele DEFAULT 'X'.PARAMETERS pr_2 RADIOBUTTON GROUP typ.PARAMETERS filestr TYPE string OBLIGATORY DEFAULT 'c:\DATA.txt' MODIF ID f.PARAMETERS p_todo AS LISTBOX VISIBLE LENGTH 30 OBLIGATORY DEFAULT 'A'.SELECTION-SCREEN END OF BLOCK b2.SELECTION-SCREEN BEGIN OF BLOCK b3 WITH FRAME TITLE t03.PARAMETERS p_upper AS CHECKBOX DEFAULT 'X'.PARAMETERS p_nocvt AS CHECKBOX DEFAULT 'X'.PARAMETERS p_onlyz AS CHECKBOX DEFAULT 'X'.SELECTION-SCREEN END OF BLOCK b3.SELECTION-SCREEN BEGIN OF BLOCK b4 WITH FRAME TITLE t04.SELECTION-SCREEN COMMENT /1(79): txt001,txt002,txt003,txt004,txt005.SELECTION-SCREEN END OF BLOCK b4.INITIALIZATION. CLEAR gt_lstbox[]. gs_lstbox-key = 'A'. gs_lstbox-text = '表内已有的数据修改,没有的数据新建'. COLLECT gs_lstbox INTO gt_lstbox. gs_lstbox-key = 'I'. gs_lstbox-text = '仅上传新数据,表内已有数据忽略'. COLLECT gs_lstbox INTO gt_lstbox. gs_lstbox-key = 'U'. gs_lstbox-text = '仅修改表内已有数据'. COLLECT gs_lstbox INTO gt_lstbox. gs_lstbox-key = 'D'. gs_lstbox-text = '根据上传数据主键删除表内数据'. COLLECT gs_lstbox INTO gt_lstbox.
AT SELECTION-SCREEN OUTPUT. t01 = '选择表和字段'. t02 = '本地数据'. t03 = '选项'. t04 = '程序说明'. %_p_tnam_%_app_%-text = '透明表表名'. %_pr_1_%_app_%-text = '数据来自剪贴板(不要复制标题)'(t05). %_pr_2_%_app_%-text = '数据来自文本文件'(t06). %_filestr_%_app_%-text = ' 文本文件(不要标题行)'(t07). %_s_flds_%_app_%-text = '选择上传字段'. %_p_todo_%_app_%-text = '数据操作'. %_p_upper_%_app_%-text = '自动转大写'. %_p_nocvt_%_app_%-text = '确认界面的显示考虑转换出口'. %_p_onlyz_%_app_%-text = '仅支持修改Z开头数据库表'. sscrfields-functxt_01 = '@HP@ 导出表字段'.
txt001 = `1、根据主键判断每行数据是否已在DB内存在`. txt002 = `2、数值格式使用系统内用户的定义格式`. txt003 = `3、日期使用YYYYMMDD格式,或者系统内用户的定义格式`. txt004 = `4、更新已有数据时,如果不想修改某一个字段,可以填充上叹号(!)`. txt005 = `5、确认界面显示的数据即为导入到表的数据(前导零/Conversion/大写转换等都已经做好)`.
CALL FUNCTION 'VRM_SET_VALUES' EXPORTING id = 'P_TODO' values = gt_lstbox.
LOOP AT SCREEN. IF pr_2 <> 'X' AND screen-name CS 'FILESTR'. screen-active = '0'. ENDIF. IF 'S_FLDS-LOW P_ONLYZ' CS screen-name. screen-input = '0'. ENDIF.
IF p_tnam <> '' AND screen-name CS 'P_TNAM'. screen-input = '0'. ENDIF. MODIFY SCREEN. ENDLOOP.AT SELECTION-SCREEN ON p_tnam. CHECK s_flds[] IS INITIAL. PERFORM get_dd03p. PERFORM tabfld_f4.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR s_flds-low. CHECK p_tnam IS NOT INITIAL. PERFORM get_dd03p. PERFORM tabfld_f4.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR filestr. DATA: file_table TYPE filetable WITH HEADER LINE. CALL METHOD cl_gui_frontend_services=>file_open_dialog EXPORTING file_filter = '文本文件(*.TXT)|*.TXT|' multiselection = '' CHANGING file_table = file_table[] rc = gv_subrc EXCEPTIONS file_open_dialog_failed = 1 cntl_error = 2 error_no_gui = 3 not_supported_by_gui = 4 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. ELSE. READ TABLE file_table INDEX 1. filestr = file_table. ENDIF.
AT SELECTION-SCREEN. CASE sscrfields-ucomm. WHEN 'FC01'. CLEAR: gt_clip,gt_clip[]. IF s_flds[] IS INITIAL. MESSAGE s000(oo) WITH '请先选择字段'. RETURN. ENDIF.
PERFORM get_dd03p. LOOP AT s_flds. READ TABLE gt_dd03 WITH KEY fieldname = s_flds-low. CONCATENATE gt_clip cl_abap_char_utilities=>horizontal_tab gt_dd03-fieldname '_' gt_dd03-ddtext INTO gt_clip. ENDLOOP. SHIFT gt_clip. APPEND gt_clip. CALL METHOD cl_gui_frontend_services=>clipboard_export IMPORTING data = gt_clip[] CHANGING rc = gv_subrc EXCEPTIONS OTHERS = 4. IF sy-subrc = 0 AND gv_subrc = 0. MESSAGE s000(oo) WITH '已经把表头复制到剪贴板,可以打开一个Excel文件然后粘贴'. ELSE. MESSAGE e000(oo) WITH '复制到剪贴板失败'. ENDIF. WHEN 'Z'. p_onlyz = ''. WHEN 'ONLI'. PERFORM checkinput. ENDCASE.
START-OF-SELECTION. PERFORM savelog(zreplog) USING sy-repid '' IF FOUND. PERFORM create_itab. PERFORM uploaddata. PERFORM fixdata. PERFORM outdata.
*&---------------------------------------------------------------------**& Form checkinput*&---------------------------------------------------------------------*FORM checkinput. IF p_onlyz = 'X' AND p_tnam(1) <> 'Z'. MESSAGE e000(o
...