ABAP根据表名创建动态内表并更新

Posted chaguoguo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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(2NE ‘IT‘.
    MESSAGE ‘仅限IT账号使用‘ TYPE ‘S‘ DISPLAY LIKE ‘E‘.
    RETURN.
  ENDIF.
  IF p_name+0(1NE ‘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.

包含文件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.

包含文件ZIT0003_SCREEN

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

包含文件

*&---------------------------------------------------------------------*
*& 包含               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 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 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 WITH HEADER LINE.   
DATA  lv_filename TYPE rlgrap-filename.   
DATA lv_tabix TYPE sy-tabix.   lv_filename 
= p_file2.   


CALL FUNCTION ‘ALSM_EXCEL_TO_INTERNAL_TABLE‘    "读取excel文件中的内容     
EXPORTING       filename                
= lv_filename       i_begin_col             
‘1‘       i_begin_row             
‘2‘       i_end_col               
‘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_nameFROM TABLE <dyn_table>.     
IF sy-subrc EQ 0.       
COMMIT WORK AND WAIT.     
ELSE.       
ROLLBACK WORK.     
ENDIF.   
ENDIF.

ENDFORM.

 







































































































































































































































































































































































以上是关于ABAP根据表名创建动态内表并更新的主要内容,如果未能解决你的问题,请参考以下文章

abap proxy怎么创建

为什麽要用ABAP动态内表

详解ABAP/4内表结构

ABAP 中内表的复制

abap内表里添加数据

创建内表并输出内表数据