zoukankan      html  css  js  c++  java
  • ABAP根据表名创建动态内表并更新(通用自建表批导)

    查询界面

     执行结果

    SE11

     主

    *&---------------------------------------------------------------------*
    *& Report ZIT0003
    *&---------------------------------------------------------------------*
    *&
    *&---------------------------------------------------------------------*
    REPORT zit0003.
    
    INCLUDE zit0003_head.
    INCLUDE zit0003_screen.
    INCLUDE zit0003_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+0(2) NE 'IT'.
        MESSAGE '仅限IT账号使用' 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 有未知错误,弃之
      PERFORM frm_save_data.
    
    
    END-OF-SELECTION.
      PERFORM frm_display_data.
    View Code

     

    包含文件ZIT0003_HEAD

    *&---------------------------------------------------------------------*
    *& 包含               ZIT0003_HEAD
    *&---------------------------------------------------------------------*
    TABLES:sscrfields.
    DATA: d_ref      TYPE REF TO data,
          d_ref2     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.
    View Code

     

    包含文件ZIT0003_SCREEN

    *&---------------------------------------------------------------------*
    *& 包含               ZIT0003_SCREEN
    *&---------------------------------------------------------------------*
    PARAMETERS: p_name TYPE dd03l-tabname OBLIGATORY.
    PARAMETERS: p_file2 TYPE string MODIF ID m2.
    SELECTION-SCREEN: FUNCTION KEY 1.
    View Code

     

    包含文件ZIT0003_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.
      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_ref.
    
    *指定生成的内表到字段符号
      ASSIGN d_ref->* TO <dyn_table>.
    
    *创建动态工作区结构
      CREATE DATA dyn_wa LIKE LINE OF <dyn_table>.
    
    *创建动态工作区
      ASSIGN dyn_wa->* TO <dyn_wa>.
    
    
    
    **从动态表中取数到动态内表中
    *  SELECT * INTO CORRESPONDING FIELDS OF TABLE <dyn_table> UP TO 100
    *  ROWS FROM (p_name).
    *  BREAK-POINT.
    ENDFORM.
    *&---------------------------------------------------------------------*
    *& 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.
    
    
    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.
    *&---------------------------------------------------------------------*
    *& 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.
    *&---------------------------------------------------------------------*
    *& 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.
    *&---------------------------------------------------------------------*
    *& 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.
    *&---------------------------------------------------------------------*
    *& Form FRM_GET_FILED
    *&---------------------------------------------------------------------*
    *& text
    *&---------------------------------------------------------------------*
    *& -->  p1        text
    *& <--  p2        text
    *&---------------------------------------------------------------------*
    FORM frm_get_filed .
      DATA: lv_i_tab_raw_data TYPE truxs_t_text_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.
    
    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.
      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.
        ENDIF.
    
        AT END OF row.
          APPEND <dyn_wa> TO <dyn_table>.
        ENDAT.
    
      ENDLOOP.
    
    ENDFORM.
    *&---------------------------------------------------------------------*
    *& 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.
    *&---------------------------------------------------------------------*
    *& Form FRM_SAVE_DATA
    *&---------------------------------------------------------------------*
    *& text
    *&---------------------------------------------------------------------*
    *& -->  p1        text
    *& <--  p2        text
    *&---------------------------------------------------------------------*
    FORM frm_save_data .
      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.
    View Code

     

  • 相关阅读:
    Python 学习日记 第七天
    Python 学习日记 第六天
    Python 学习日记 第五天
    Python 学习日记 第四天
    Redis 中的数据类型及基本操作
    Asp.net mvc 中View 的呈现(二)
    Asp.net mvc 中View的呈现(一)
    Asp.net mvc 中Action 方法的执行(三)
    Asp.net mvc 中Action 方法的执行(二)
    Asp.net mvc 中Action 方法的执行(一)
  • 原文地址:https://www.cnblogs.com/chaguoguo/p/14073912.html
Copyright © 2011-2022 走看看