ABAP根据表名创建动态内表并更新(通用自建表批导)
查询界面

执行结果

SE11

主
*&---------------------------------------------------------------------* *& Report ZHMRSD041 *& *&---------------------------------------------------------------------* *& *& *&---------------------------------------------------------------------* REPORT ZIT0004. *&---------------------------------------------------------------------* *& Report ZIT0004 *&---------------------------------------------------------------------* *& *&---------------------------------------------------------------------* INCLUDE ZIT0004_HEAD. INCLUDE ZIT0004_SCREEN. INCLUDE ZIT0004_FORMS. INITIALIZATION. SSCRFIELDS-FUNCTXT_01 = '下载文档'. AT SELECTION-SCREEN ON VALUE-REQUEST FOR P_FILE2. * 选择文件搜索帮助 PERFORM FRM_SET_FILE_F4 USING P_FILE2 CHANGING P_FILE2. AT SELECTION-SCREEN. CASE SSCRFIELDS-UCOMM. WHEN 'FC01'. PERFORM FRM_DOWN_EXCEL. WHEN OTHERS. ENDCASE. START-OF-SELECTION. IF SY-UNAME NE 'MISHM'. MESSAGE '仅限IT账号使用' TYPE 'S' DISPLAY LIKE 'E'. RETURN. ENDIF. IF P_MIMA NE 'TYH'. MESSAGE '请了解程序用途后再使用' TYPE 'S' DISPLAY LIKE 'E'. RETURN. ENDIF. * IF p_name+0(1) NE 'Z'. * MESSAGE '仅允许更新自建表' TYPE 'S' DISPLAY LIKE 'E'. * RETURN. * ENDIF. IF P_FILE2 IS INITIAL. MESSAGE '请输入文件名' TYPE 'S' DISPLAY LIKE 'E'. RETURN. ENDIF. PERFORM FRM_GET_DATA. "动态创建内表 <dyn_table> PERFORM FRM_FILE_DATA2. * PERFORM frm_get_filed. "本人电脑使用 TEXT_CONVERT_XLS_TO_SAP 有未知错误,弃之 IF P_CHECK EQ 'X'. PERFORM FRM_SAVE_DATA. ELSE. PERFORM FRM_SAVE_DATA2. ENDIF. END-OF-SELECTION. PERFORM FRM_DISPLAY_DATA.
包含文件ZIT0004_HEAD
*&---------------------------------------------------------------------* *& 包含 ZIT0003_HEAD *&---------------------------------------------------------------------* TABLES:SSCRFIELDS. TYPE-POOLS:SLIS,OLE2. DATA: D_REF TYPE REF TO DATA, D_REF2 TYPE REF TO DATA, D_REF3 TYPE REF TO DATA, LT_ALV_CAT TYPE TABLE OF LVC_S_FCAT, LS_ALV_CAT LIKE LINE OF LT_ALV_CAT. DATA: LT_TABLE LIKE TABLE OF DNTAB. DATA: LS_TABLE TYPE DNTAB. DATA: DYN_TABLE TYPE REF TO DATA. DATA: DYN_WA TYPE REF TO DATA. FIELD-SYMBOLS :<DYN_TABLE> TYPE TABLE, <DYN_WA> TYPE ANY, <DYN_FIELD> TYPE ANY, <FS_STR> TYPE ANY. DATA: DYN_TABLE2 TYPE REF TO DATA. DATA: DYN_WA2 TYPE REF TO DATA. FIELD-SYMBOLS :<DYN_TABLE2> TYPE TABLE, <DYN_WA2> TYPE ANY, <DYN_FIELD2> TYPE ANY, <FS_STR2> TYPE ANY. DATA: GO_EXCEL TYPE OLE2_OBJECT, GO_WORKBOOK TYPE OLE2_OBJECT, GO_SHEET TYPE OLE2_OBJECT. DATA: P_STR TYPE STRING, P_STR2 TYPE STRING. FIELD-SYMBOLS :<DYN_TABLE3> TYPE TABLE, <DYN_WA3> TYPE ANY, <DYN_FIELD3> TYPE ANY, <FS_STR3> TYPE ANY. DATA: DYN_WA3 TYPE REF TO DATA. DATA: DYN_TABLE3 TYPE REF TO DATA. DATA: W_IT_FIELD TYPE ABAP_SORTORDER_TAB, "引用sorttab参数 W_STR_FIELD TYPE ABAP_SORTORDER.
包含文件ZIT0004_SCREEN
*&---------------------------------------------------------------------* *& 包含 ZIT0003_SCREEN *&---------------------------------------------------------------------* PARAMETERS: P_NAME TYPE DD03L-TABNAME OBLIGATORY. PARAMETERS: P_FILE2 TYPE STRING MODIF ID M2. PARAMETERS: P_CHECK AS CHECKBOX. PARAMETERS: P_MIMA TYPE SY-MSGID. SELECTION-SCREEN: FUNCTION KEY 1.
包含文件ZIT0004_FORMS
*&---------------------------------------------------------------------* *& 包含 ZIT0003_FORMS *&---------------------------------------------------------------------* *&---------------------------------------------------------------------* *& Form FRM_GET_DATA *&---------------------------------------------------------------------* *& text *&---------------------------------------------------------------------* *& --> p1 text *& <-- p2 text *&---------------------------------------------------------------------* FORM FRM_GET_DATA . *取出表结构的字段目录 CALL FUNCTION 'NAMETAB_GET' EXPORTING LANGU = SY-LANGU TABNAME = P_NAME TABLES NAMETAB = LT_TABLE EXCEPTIONS NO_TEXTS_FOUND = 1. *根据取出的字段目录生成参考字段目录 CLEAR LT_ALV_CAT. * BREAK-POINT. LOOP AT LT_TABLE INTO LS_TABLE. LS_ALV_CAT-FIELDNAME = LS_TABLE-FIELDNAME. LS_ALV_CAT-REF_TABLE = P_NAME. LS_ALV_CAT-REF_FIELD = LS_TABLE-FIELDNAME. LS_ALV_CAT-INTLEN = LS_TABLE-INTLEN. APPEND LS_ALV_CAT TO LT_ALV_CAT. CLEAR LS_ALV_CAT. IF LS_TABLE-KEYFLAG EQ 'X'. IF P_STR IS INITIAL. CONCATENATE LS_TABLE-FIELDNAME '!=!' '<DYN_TABLE>-' LS_TABLE-FIELDNAME INTO P_STR. * CONCATENATE LS_TABLE-FIELDNAME ` ` INTO P_STR2. ELSE. CONCATENATE P_STR '!AND!' LS_TABLE-FIELDNAME '!=!' '<dyn_table>-' LS_TABLE-FIELDNAME INTO P_STR. * CONCATENATE P_STR2 LS_TABLE-FIELDNAME ` ` INTO P_STR2. ENDIF. W_STR_FIELD-NAME = LS_TABLE-FIELDNAME. "定义排序字段 W_STR_FIELD-DESCENDING = ''. APPEND W_STR_FIELD TO W_IT_FIELD. ENDIF. ENDLOOP. * BREAK-POINT. REPLACE ALL OCCURRENCES OF '!' IN P_STR WITH ` `. * P_STR2 = P_STR. * REPLACE ALL OCCURRENCES OF 'AND' IN P_STR2 WITH ` `. *内表创建 CALL METHOD CL_ALV_TABLE_CREATE=>CREATE_DYNAMIC_TABLE EXPORTING IT_FIELDCATALOG = LT_ALV_CAT IMPORTING EP_TABLE = D_REF. *指定生成的内表到字段符号 ASSIGN D_REF->* TO <DYN_TABLE>. * ASSIGN D_REF->* TO <DYN_TABLE2>. *创建动态工作区结构 CREATE DATA DYN_WA LIKE LINE OF <DYN_TABLE>. *创建动态工作区结构 * CREATE DATA DYN_WA LIKE LINE OF <DYN_TABLE2>. *创建动态工作区 ASSIGN DYN_WA->* TO <DYN_WA>. CALL METHOD CL_ALV_TABLE_CREATE=>CREATE_DYNAMIC_TABLE EXPORTING IT_FIELDCATALOG = LT_ALV_CAT IMPORTING EP_TABLE = D_REF3. *指定生成的内表到字段符号 ASSIGN D_REF3->* TO <DYN_TABLE3>. * ASSIGN D_REF->* TO <DYN_TABLE2>. *创建动态工作区结构 CREATE DATA DYN_WA3 LIKE LINE OF <DYN_TABLE3>. *创建动态工作区结构 * CREATE DATA DYN_WA LIKE LINE OF <DYN_TABLE2>. *创建动态工作区 ASSIGN DYN_WA3->* TO <DYN_WA3>. **从动态表中取数到动态内表中 *DATA: LT_NAME TYPE TABLE OF P_NAME. * SELECT * INTO CORRESPONDING FIELDS OF TABLE <dyn_table> UP TO 100 * ROWS FROM (p_name). * BREAK-POINT. ENDFORM. "frm_get_data *&---------------------------------------------------------------------* *& Form FRM_DOWN_EXCEL *&---------------------------------------------------------------------* *& text *&---------------------------------------------------------------------* *& --> p1 text *& <-- p2 text *&---------------------------------------------------------------------* FORM FRM_DOWN_EXCEL . DATA: LV_SELECTED_FOLDER TYPE STRING, LV_FULLPATH TYPE RLGRAP-FILENAME. * CALL METHOD cl_gui_frontend_services=>directory_browse * CHANGING * selected_folder = lv_selected_folder * EXCEPTIONS * cntl_error = 1 * error_no_gui = 2 * not_supported_by_gui = 3 * OTHERS = 4. * IF sy-subrc <> 0. * ENDIF. * * lv_fullpath = lv_selected_folder && p_name && '.xls'. SELECT COUNT(*) FROM DD03L WHERE TABNAME EQ P_NAME. IF SY-SUBRC NE 0. MESSAGE '该表不存在' TYPE 'S' DISPLAY LIKE 'E'. RETURN. ENDIF. *取出表结构的字段目录 CALL FUNCTION 'NAMETAB_GET' EXPORTING LANGU = SY-LANGU TABNAME = P_NAME TABLES NAMETAB = LT_TABLE EXCEPTIONS NO_TEXTS_FOUND = 1. *根据取出的字段目录生成参考字段目录 CLEAR LT_ALV_CAT. LOOP AT LT_TABLE INTO LS_TABLE. LS_ALV_CAT-FIELDNAME = LS_TABLE-FIELDNAME. LS_ALV_CAT-REF_TABLE = P_NAME. LS_ALV_CAT-REF_FIELD = LS_TABLE-FIELDNAME. APPEND LS_ALV_CAT TO LT_ALV_CAT. CLEAR LS_ALV_CAT. ENDLOOP. *内表创建 CALL METHOD CL_ALV_TABLE_CREATE=>CREATE_DYNAMIC_TABLE EXPORTING IT_FIELDCATALOG = LT_ALV_CAT IMPORTING EP_TABLE = D_REF2. * BREAK-POINT. *指定生成的内表到字段符号 ASSIGN D_REF2->* TO <DYN_TABLE2>. *创建动态工作区结构 CREATE DATA DYN_WA2 LIKE LINE OF <DYN_TABLE2>. * DATA: lt_zit0001 LIKE TABLE OF zit0001. *创建动态工作区 ASSIGN DYN_WA2->* TO <DYN_WA2>. * READ TABLE lt_alv_cat INTO ls_alv_cat INDEX 1. * IF sy-subrc EQ 0. * ASSIGN COMPONENT ls_alv_cat-fieldname OF STRUCTURE <dyn_wa2> TO <fs_str2>. * APPEND <dyn_wa2> TO <dyn_table2>. * ENDIF. * BREAK-POINT. * <fs_str> = '9998'. DATA: LV_DESTINATION TYPE RLGRAP-FILENAME. DATA: LS_KEY TYPE WWWDATATAB. * SELECT * INTO CORRESPONDING FIELDS OF TABLE <dyn_table> UP TO 1 * ROWS FROM (p_name). * 首先下载模版 * SELECT SINGLE relid objid FROM wwwdata INTO CORRESPONDING FIELDS OF ls_key WHERE relid = 'MI' AND objid = 'ZFICO049'. * CALL FUNCTION 'DOWNLOAD_WEB_OBJECT' * EXPORTING * key = ls_key * destination = lv_destination. * 打开模版 CREATE OBJECT GO_EXCEL 'EXCEL.APPLICATION'. IF SY-SUBRC NE 0. ENDIF. SET PROPERTY OF GO_EXCEL 'DISPLAYALERTS' = 0. SET PROPERTY OF GO_EXCEL 'VISIBLE' = 1. CALL METHOD OF GO_EXCEL 'WORKBOOKS' = GO_WORKBOOK. SET PROPERTY OF GO_EXCEL 'SHEETSINNEWWORKBOOK' = 1. CALL METHOD OF GO_WORKBOOK 'ADD'. * CALL METHOD OF go_workbook 'OPEN' * EXPORTING * #1 = lv_fullpath. CALL METHOD OF GO_EXCEL 'SHEETS' = GO_SHEET EXPORTING #1 = 1. CALL METHOD OF GO_SHEET 'ACTIVATE'. *填值 PERFORM EXCEL_ROW_INSERT USING GO_SHEET 3 1 1. "复制并插入一行 LOOP AT LT_ALV_CAT INTO LS_ALV_CAT. PERFORM FILL_RANGE USING 1 SY-TABIX LS_ALV_CAT-FIELDNAME. ENDLOOP. *关闭 GET PROPERTY OF GO_EXCEL 'ACTIVESHEET' = GO_SHEET. "获取活动SHEET FREE OBJECT GO_SHEET. FREE OBJECT GO_WORKBOOK. GET PROPERTY OF GO_EXCEL 'ACTIVEWORKBOOK' = GO_WORKBOOK. * SET PROPERTY OF go_excel 'VISIBLE' = 0. "是否显示EXCEL 此处显示不退出 CALL METHOD OF GO_WORKBOOK 'SAVES'. * CALL METHOD OF go_workbook 'SAVES' * EXPORTING * #1 = lv_fullpath * #2 = 1. * CALL METHOD OF go_workbook 'CLOSE'. CALL METHOD OF GO_EXCEL 'QUIT'. FREE OBJECT GO_SHEET. FREE OBJECT GO_WORKBOOK. FREE OBJECT GO_EXCEL. ENDFORM. "frm_down_excel *&---------------------------------------------------------------------* *& Form sub_excel_save *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* FORM SUB_EXCEL_SAVE . GET PROPERTY OF GO_EXCEL 'ACTIVESHEET' = GO_SHEET. "获取活动SHEET FREE OBJECT GO_SHEET. FREE OBJECT GO_WORKBOOK. GET PROPERTY OF GO_EXCEL 'ACTIVEWORKBOOK' = GO_WORKBOOK. * SET PROPERTY OF go_excel 'VISIBLE' = 0. "是否显示EXCEL 此处显示不退出 CALL METHOD OF GO_WORKBOOK 'SAVE'. CALL METHOD OF GO_EXCEL 'QUIT'. FREE OBJECT GO_SHEET. FREE OBJECT GO_WORKBOOK. FREE OBJECT GO_EXCEL. ENDFORM. "sub_excel_save *&---------------------------------------------------------------------* *& Form FILL_RANGE *&---------------------------------------------------------------------* *& text *&---------------------------------------------------------------------* * -->P_1 text * -->P_1 text * -->P_GS_HEAD_BUTXT text *&---------------------------------------------------------------------* FORM FILL_RANGE USING VALUE(F_ROW) VALUE(F_COL) VALUE(F_VALUE). DATA: ROW TYPE I, COL TYPE I, LO_CELL TYPE OLE2_OBJECT. ROW = F_ROW. COL = F_COL. CALL METHOD OF GO_EXCEL 'CELLS' = LO_CELL EXPORTING #1 = ROW #2 = COL. SET PROPERTY OF LO_CELL 'VALUE' = F_VALUE. ENDFORM. "fill_range *&---------------------------------------------------------------------* *& Form EXCEL_ROW_INSERT *&---------------------------------------------------------------------* *& text *&---------------------------------------------------------------------* * -->P_GO_SHEET text * -->P_LV_LOOP2 text * -->P_1 text *&---------------------------------------------------------------------* FORM EXCEL_ROW_INSERT USING LCOBJ_SHEET LC_ROW LC_COUNT LV_ROWCOPY. DATA LC_RANGE TYPE OLE2_OBJECT. DATA H_BORDERS TYPE OLE2_OBJECT. DO LC_COUNT TIMES. CALL METHOD OF LCOBJ_SHEET 'ROWS' = LC_RANGE EXPORTING #1 = LV_ROWCOPY. CALL METHOD OF LC_RANGE 'COPY'. "COPY第10行插入一个新行 CALL METHOD OF LCOBJ_SHEET 'ROWS' = LC_RANGE EXPORTING #1 = LC_ROW. CALL METHOD OF LC_RANGE 'INSERT'. CALL METHOD OF LC_RANGE 'CLEARCONTENTS'. "是否需要清空CELL ENDDO. ENDFORM. "excel_row_insert *&---------------------------------------------------------------------* *& Form FRM_SET_FILE_F4 *&---------------------------------------------------------------------* *& text *&---------------------------------------------------------------------* * -->P_P_FILE2 text * <--P_P_FILE2 text *&---------------------------------------------------------------------* FORM FRM_SET_FILE_F4 USING I_FILE CHANGING I_FILE2. * 局部变量-文件名定义 DATA L_FILENAME TYPE RLGRAP-FILENAME. * 选择文件搜索帮助 CALL FUNCTION 'WS_FILENAME_GET' EXPORTING DEF_PATH = I_FILE MASK = ',*.xlsx,*.XLSX,*.xls,*.XLS.' MODE = '0' TITLE = TEXT-002 IMPORTING FILENAME = L_FILENAME EXCEPTIONS INV_WINSYS = 1 NO_BATCH = 2 SELECTION_CANCEL = 3 SELECTION_ERROR = 4 OTHERS = 5. * 如果选择了文件 IF SY-SUBRC = 0 AND L_FILENAME IS NOT INITIAL. I_FILE2 = L_FILENAME. ENDIF. ENDFORM. "frm_set_file_f4 *&---------------------------------------------------------------------* *& Form FRM_GET_FILED *&---------------------------------------------------------------------* *& text *&---------------------------------------------------------------------* *& --> p1 text *& <-- p2 text *&---------------------------------------------------------------------* FORM FRM_GET_FILED . * DATA: lv_i_tab_raw_data TYPE truxs_t_text_data, DATA LV_I_FILENAME LIKE RLGRAP-FILENAME. * CLEAR gt_output. * DATA(lv_platform_code) = cl_gui_frontend_services=>get_platform( ). * IF lv_platform_code EQ '14'." WINDOWS * lv_i_filename = p_file2. * CALL FUNCTION 'TEXT_CONVERT_XLS_TO_SAP' * EXPORTING * i_line_header = 'X' * i_tab_raw_data = lv_i_tab_raw_data * i_filename = lv_i_filename * TABLES * i_tab_converted_data = <dyn_table> * EXCEPTIONS * conversion_failed = 1 * OTHERS = 2. * IF sy-subrc <> 0. * ENDIF. * ELSEIF lv_platform_code EQ '13'." MAC * cl_gui_frontend_services=>gui_upload( * EXPORTING * filename = p_file2 * has_field_separator = 'X' * filetype = 'ASC' * CHANGING * data_tab = <dyn_table> * EXCEPTIONS * file_open_error = 1 * file_read_error = 2 * no_batch = 3 * gui_refuse_filetransfer = 4 * invalid_type = 5 * no_authority = 6 * unknown_error = 7 * bad_data_format = 8 * header_not_allowed = 9 * separator_not_allowed = 10 * header_too_long = 11 * unknown_dp_error = 12 * access_denied = 13 * dp_out_of_memory = 14 * disk_full = 15 * dp_timeout = 16 * not_supported_by_gui = 17 * error_no_gui = 18 * OTHERS = 19 ). * IF sy-subrc <> 0. * ENDIF. * ELSE. * MESSAGE e008(zfico039). * ENDIF. ENDFORM. "frm_get_filed *&---------------------------------------------------------------------* *& Form frm_file_data2 *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* FORM FRM_FILE_DATA2 . DATA: LV_END TYPE C. DATA: LT_DATA TYPE ALSMEX_TABLINE OCCURS 0 WITH HEADER LINE. DATA LV_FILENAME TYPE RLGRAP-FILENAME. DATA LV_TABIX TYPE SY-TABIX. DATA: LV_NUM1 TYPE I, LV_LENTH TYPE I. LV_FILENAME = P_FILE2. DATA LV_LINE TYPE I. LV_LINE = LINES( LT_TABLE[] ). CALL FUNCTION 'ALSM_EXCEL_TO_INTERNAL_TABLE' "读取excel文件中的内容 EXPORTING FILENAME = LV_FILENAME I_BEGIN_COL = '1' I_BEGIN_ROW = '2' I_END_COL = LV_LINE "'28' I_END_ROW = '99999' TABLES INTERN = LT_DATA EXCEPTIONS INCONSISTENT_PARAMETERS = 1 UPLOAD_OLE = 2 OTHERS = 3. LOOP AT LT_DATA. * CLEAR lv_end. * AT END OF row. * lv_end = 'X'. * ENDAT. LV_TABIX = LT_DATA-COL. READ TABLE LT_ALV_CAT INTO LS_ALV_CAT INDEX LV_TABIX. IF SY-SUBRC EQ 0. ASSIGN COMPONENT LS_ALV_CAT-FIELDNAME OF STRUCTURE <DYN_WA> TO <FS_STR>. <FS_STR> = LT_DATA-VALUE. "补前置0 CASE LS_ALV_CAT-FIELDNAME. WHEN 'ANLN1' OR 'ANLN2' OR 'VBELN' OR 'POSNR'. CLEAR LV_NUM1. LV_NUM1 = LS_ALV_CAT-INTLEN / 2. LV_LENTH = STRLEN( <FS_STR> ). LV_NUM1 = LV_NUM1 - LV_LENTH. DO LV_NUM1 TIMES. CONCATENATE '0' <FS_STR> INTO <FS_STR>. ENDDO. * WHEN . WHEN OTHERS. ENDCASE. ENDIF. AT END OF ROW. APPEND <DYN_WA> TO <DYN_TABLE>. ENDAT. ENDLOOP. ENDFORM. "frm_file_data2 *&---------------------------------------------------------------------* *& Form FRM_DISPLAY_DATA *&---------------------------------------------------------------------* *& text *&---------------------------------------------------------------------* *& --> p1 text *& <-- p2 text *&---------------------------------------------------------------------* FORM FRM_DISPLAY_DATA . *显示内表中的数据 CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY' EXPORTING I_STRUCTURE_NAME = P_NAME TABLES T_OUTTAB = <DYN_TABLE> 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. "frm_display_data *&---------------------------------------------------------------------* *& Form FRM_SAVE_DATA *&---------------------------------------------------------------------* *& text *&---------------------------------------------------------------------* *& --> p1 text *& <-- p2 text *&---------------------------------------------------------------------* FORM FRM_SAVE_DATA . * BREAK-POINT. DATA: LV_LINE1 TYPE I, LV_LINE2 TYPE I, LV_TABIX1 TYPE I, LV_TABIX2 TYPE I, LV_FLAG TYPE CHAR1. * BREAK-POINT. SELECT * INTO CORRESPONDING FIELDS OF TABLE <DYN_TABLE3> FROM (P_NAME) FOR ALL ENTRIES IN <DYN_TABLE>"导入EXCEL数据 WHERE (P_STR). * SORT <DYN_TABLE3> BY (P_STR2) . SORT <DYN_TABLE3> BY (W_IT_FIELD). * SORT <DYN_TABLE> BY (P_STR2). SORT <DYN_TABLE> BY (W_IT_FIELD). LV_LINE1 = LINES( <DYN_TABLE> ). LV_LINE2 = LINES( <DYN_TABLE3> ). CHECK LV_LINE1 = LV_LINE2. LOOP AT <DYN_TABLE3> ASSIGNING <DYN_WA3> . LV_TABIX1 = SY-TABIX. READ TABLE <DYN_TABLE> ASSIGNING <DYN_WA> INDEX LV_TABIX1. CLEAR LV_FLAG. LOOP AT LT_TABLE INTO LS_TABLE. IF LS_TABLE-KEYFLAG EQ 'X'. ASSIGN COMPONENT LS_TABLE-FIELDNAME OF STRUCTURE <DYN_WA> TO <FS_STR>. IF SY-SUBRC EQ 0. ASSIGN COMPONENT LS_TABLE-FIELDNAME OF STRUCTURE <DYN_WA3> TO <FS_STR3>. IF SY-SUBRC EQ 0. IF <FS_STR> EQ <FS_STR3>."主键的值相同 LV_FLAG = 'X'. ELSE. LV_FLAG = ''. ENDIF. ELSE. LV_FLAG = ''. ENDIF. ELSE. LV_FLAG = ''. ENDIF. ELSE. ASSIGN COMPONENT LS_TABLE-FIELDNAME OF STRUCTURE <DYN_WA> TO <FS_STR>. IF SY-SUBRC EQ 0. ASSIGN COMPONENT LS_TABLE-FIELDNAME OF STRUCTURE <DYN_WA3> TO <FS_STR3>. IF SY-SUBRC EQ 0. IF <FS_STR> IS NOT INITIAL."假如导入的EXCEL,该值不为空,则需更新到数据库表 <FS_STR3> = <FS_STR>. ENDIF. ENDIF. ENDIF. ENDIF. ENDLOOP. * LOOP AT <DYN_TABLE> ASSIGNING <DYN_WA> WHERE (P_STR). * * ENDLOOP. IF LV_FLAG IS INITIAL. DELETE <DYN_TABLE3>[]. ENDIF. ENDLOOP. IF <DYN_TABLE3>[] IS NOT INITIAL. MODIFY (P_NAME) FROM TABLE <DYN_TABLE3>. IF SY-SUBRC EQ 0. COMMIT WORK AND WAIT. ELSE. ROLLBACK WORK. ENDIF. ENDIF. ENDFORM. "frm_save_data *&---------------------------------------------------------------------* *& Form FRM_SAVE_DATA2 *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * --> p1 text * <-- p2 text *----------------------------------------------------------------------* FORM FRM_SAVE_DATA2 . BREAK-POINT. IF <DYN_TABLE>[] IS NOT INITIAL. MODIFY (P_NAME) FROM TABLE <DYN_TABLE>. IF SY-SUBRC EQ 0. COMMIT WORK AND WAIT. ELSE. ROLLBACK WORK. ENDIF. ENDIF. ENDFORM. " FRM_SAVE_DATA2
