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

查询界面

image

 

 

 执行结果

 

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.
View Code

 

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

 

 

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

 

 

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

 

 

posted @ 2020-12-02 15:09  蛀牙首领  阅读(666)  评论(0)    收藏  举报