天天看點

ABAP動态生成代碼上傳EXCEL資料

開發技術:

1.文本檔案上載技術

2.動态程式代碼生成技術

3.ABAP動态程式執行技術

4.TXT文本檔案對應用Table字段編輯技術

注意事項:

檔案檔案編輯過程中時間日期格式為 20060201 120000 表示 2006.02.01 12:00:00

文本檔案中不能包含除字元,數字之外的其他特殊符号。假如Table中對應的字段資料為空時,在編輯資料時也對應該列為空。

EXCEL 檔案必須帶表頭。

程式代碼:如下

*&---------------------------------------------------------------------*

*& Report  Z_CBO_ABAP_XLS

*&

*&----------------------------------------------------------------*

* 程式說明  Table資料Upload 程式 專門導入EXCEL

* 子產品:版本

* 參考文檔

* 應用顧問

* 程式開發  ZHOUXU

* 開發日期  2011-02-24

*&------------------------------------------------------------------*

*&更改記錄

*&日期          更改人     子產品:版本    功能說明書

*&

*&

*&---------------------------------------------------------------*

REPORT z_cbo_abap_xls.

TABLES : dd03l,dd02t.

*------------------------------------------------------------*

*    内表

*-----------------------------------------------------------------*

DATA: BEGIN OF tab OCCURS 10,

        fcode(4),

      END OF tab.

DATA : BEGIN OF itab OCCURS 0,

        chk(1) TYPE c,                     " check box

        tabname    LIKE dd03l-tabname,     " Table name

        fieldname  LIKE dd03l-fieldname,   " Feld Name

        position   LIKE dd03l-position,    " Table

        keyflag    LIKE dd03l-keyflag,     " Primary Key

        datatype   LIKE dd03l-datatype,    " Data Type

        intlen     LIKE dd03l-leng,

       END OF itab.

DATA itab1 LIKE itab OCCURS 0 WITH HEADER LINE.

DATA : BEGIN OF uptab OCCURS 0,

*        text(72) TYPE c,

        text(100) TYPE c,

       END OF uptab.

DATA: BEGIN OF error_message,

        line1(72),

        line2(72),

        line3(72),

      END OF error_message.

DATA : cnt1(8) TYPE c,

       fcode LIKE sy-ucomm,

       changed LIKE s38e-buf_varied,

       prog(8) TYPE c,

       msg(120) TYPE c,

       er_include LIKE sy-repid,

       er_line    LIKE sy-index,

       er_off     LIKE sy-tabix,

       er_subrc   LIKE sy-subrc.

*------------------------------------------------------------------*

*    選擇畫面

*------------------------------------------------------------------*

PARAMETERS : tabname LIKE dd03l-tabname.

*------------------------------------------------------------------*

*    START-OF-SELECTION                                                *

*-------------------------------------------------------------------*

START-OF-SELECTION.

  IF tabname IS INITIAL.

    MESSAGE '請輸入資料表名稱!' TYPE 'S' DISPLAY LIKE 'E'.

    EXIT.

  ENDIF.

*上載Table字段分析

  SELECT SINGLE * FROM dd02t WHERE tabname = tabname.

  IF sy-subrc <> 0.

    MESSAGE '請輸入正确的資料表名稱!' TYPE 'S' DISPLAY LIKE 'E'.

    EXIT.

  ENDIF.

  SET PF-STATUS 'CBO'.

  SELECT * INTO CORRESPONDING FIELDS OF TABLE itab FROM dd03l

              WHERE tabname = tabname

              AND as4local = 'A'

              ORDER BY position.

  itab-chk = 'X'.

  MODIFY itab INDEX 1 TRANSPORTING chk.

*動态上載程式代碼生成函數

  PERFORM generate_upload_code.

*ABAP程式代碼編輯器調用

  PERFORM edit_generator_code.

AT USER-COMMAND .

  IF sy-ucomm = 'EDIT'.

    PERFORM edit_generator_code.

  ELSEIF sy-ucomm = 'EXEC'.

    GENERATE SUBROUTINE POOL uptab NAME prog MESSAGE msg.

    IF msg IS NOT INITIAL.

      MESSAGE msg TYPE 'S' DISPLAY LIKE 'E'.

      EXIT.

    ENDIF.

*程式代碼文法檢測

    PERFORM chcek_syntax_error.

*動态程式代碼執行

    PERFORM dyn1 IN PROGRAM (prog).

  ELSEIF ( sy-ucomm = 'EXIT' OR sy-ucomm = 'BACK' OR sy-ucomm = 'CANC' ).

    EXIT.

  ENDIF.

*&---------------------------------------------------------------*

*&      Form  generate_upload_code

*&---------------------------------------------------------------*

FORM generate_upload_code.

  REFRESH uptab.

  uptab-text = 'REPORT ZUPLOAD_TABLE.'.

  APPEND uptab.

  CONCATENATE 'TABLES :' tabname '.' INTO uptab-text

  SEPARATED BY space.

  APPEND uptab.

  uptab-text = 'TYPE-POOLS: truxs.'.

  APPEND uptab.

  uptab-text = ' DATA: wa_row TYPE truxs_t_text_data.'.

  APPEND uptab.

  uptab-text = 'DATA : BEGIN OF UPTAB OCCURS 0,'.

  APPEND uptab.

  LOOP AT itab WHERE chk = ''.

    CLEAR uptab.

    CONCATENATE '  ' itab-fieldname '(' itab-intlen  ')'  ' TYPE C ,'

                INTO uptab-text+10(80).

    APPEND uptab.

  ENDLOOP.

  uptab-text+6(82) = 'END OF UPTAB.'.

  APPEND uptab.

  uptab-text = 'DATA : BEGIN OF RESULT OCCURS 0.'.

  APPEND uptab.

  CLEAR uptab.

  CONCATENATE 'INCLUDE STRUCTURE' itab-tabname '.'

               INTO uptab-text+10(80) SEPARATED BY space.

  APPEND uptab.

  uptab-text = 'DATA : END OF RESULT.'.

  APPEND uptab.

  uptab-text = 'data:filename type rlgrap-filename.'.

  APPEND uptab.

  uptab-text = 'FORM DYN1.'.

  APPEND uptab.

  uptab-text = 'CALL FUNCTION ''WS_FILENAME_GET'''.

  APPEND uptab.

  uptab-text = ' EXPORTING'.

  APPEND uptab.

  uptab-text = '  def_filename     = '''''.

  APPEND uptab.

  uptab-text = '  def_path         = ''D:/'''.

  APPEND uptab.

  uptab-text = '  MASK             = '',*.xls,*.xls;,*.xlsx,*.xlsx.'''.

  APPEND uptab.

  uptab-text = '  MODE             = ''O'''.

  APPEND uptab.

  uptab-text = '  TITLE            = ''UPLOAD file'''.

  APPEND uptab.

  uptab-text = ' IMPORTING'.

  APPEND uptab.

  uptab-text = '   filename        = filename'.

  APPEND uptab.

  uptab-text = ' EXCEPTIONS'.

  APPEND uptab.

  uptab-text = '  inv_winsys       = 1'.

  APPEND uptab.

  uptab-text = '  no_batch         = 2'.

  APPEND uptab.

  uptab-text = '  selection_cancel = 3'.

  APPEND uptab.

  uptab-text = '  selection_error  = 4'.

  APPEND uptab.

  uptab-text = '  OTHERS           = 5.'.

  APPEND uptab.

  CLEAR uptab.

  uptab-text+2(88) = 'CALL FUNCTION ''TEXT_CONVERT_XLS_TO_SAP'''.

  APPEND uptab.

  CLEAR uptab.

  uptab-text+4(86) = 'EXPORTING'.

  APPEND uptab.

  CLEAR uptab.

  uptab-text+6(84) = 'i_filename  = filename'.

  APPEND uptab.

  CLEAR uptab.

  uptab-text+6(84) = 'i_line_header = ''X'''.

  APPEND uptab.

  uptab-text+6(84) = 'i_tab_raw_data  = wa_row'.

  APPEND uptab.

  uptab-text+4(86) = 'TABLES'.

  APPEND uptab.

  CLEAR uptab.

  uptab-text+6(84) = 'i_tab_converted_data  = UPTAB'.

  APPEND uptab.

  uptab-text = '   EXCEPTIONS    '.

  APPEND uptab.

  uptab-text = '     conversion_failed = 1     '.

  APPEND uptab.

  uptab-text = '     OTHERS = 2.'.

  APPEND uptab.

  uptab-text = '   IF sy-subrc <> 0.   '.

  APPEND uptab.

  uptab-text = '     MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno '.

  APPEND uptab.

  uptab-text = '     WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.   '.

  APPEND uptab.

  uptab-text = '    ENDIF. '.

  APPEND uptab.

  uptab-text+2(88) = 'LOOP AT UPTAB.'.

  APPEND uptab.

  CLEAR uptab.

  uptab-text+4(86) = 'CLEAR RESULT.'.

  APPEND uptab.

  uptab-text+4(86) = 'MOVE-CORRESPONDING UPTAB TO RESULT.'.

  APPEND uptab.

  uptab-text+4(86) = 'APPEND RESULT.'.

  APPEND uptab.

  uptab-text+2(88) = 'ENDLOOP.'.

  APPEND uptab.

  CLEAR uptab.

  CONCATENATE 'MODIFY'  itab-tabname 'FROM TABLE RESULT.'

              INTO uptab-text+2(88) SEPARATED BY space.

  APPEND uptab.

  uptab-text = '  DATA:LINE TYPE string.'.

  APPEND uptab.

  uptab-text = ' DATA:msg TYPE string.'.

  APPEND uptab.

  uptab-text = ' LINE = LINES( result ).'.

  APPEND uptab.

  uptab-text = ' CONCATENATE  ''成功導入''  LINE ''條資料!''  INTO msg.'.

  APPEND uptab.

  uptab-text = '  MESSAGE    msg TYPE ''I''.'.

  APPEND uptab.

  uptab-text = 'ENDFORM.' .

  APPEND uptab.

  CLEAR uptab.

ENDFORM.                    " generate_upload_code

*&---------------------------------------------------------------*

*&      Form  edit_generator_code

*&---------------------------------------------------------------*

FORM edit_generator_code.

  CALL FUNCTION 'EDITOR_APPLICATION'

    EXPORTING

      application = 'BF'

      display     = ' '

      name        = 'Source Code.....'

    IMPORTING

      fcode       = fcode

      changed     = changed

    TABLES

      content     = uptab.

  LOOP AT uptab.

    WRITE:/1 uptab-text.

  ENDLOOP.

ENDFORM.                               " PRINT_GENERATOR_CODE

*&---------------------------------------------------------------*

*&      Form  chcek_syntax_error

*&---------------------------------------------------------------*

FORM chcek_syntax_error.

  CALL FUNCTION 'EDITOR_SYNTAX_CHECK'

       EXPORTING

            i_global_check   = sy-calld

            i_global_program = sy-repid

            i_program        = 'ZUPLOAD_TABLE'

*            i_r2_check       = ' '

*            i_r2_destination = ' '

*            i_trdir          = ' '

       IMPORTING

            o_error_include  = er_include

            o_error_line     = er_line

            o_error_message  = error_message

            o_error_offset   = er_off

            o_error_subrc    = er_subrc

       TABLES

            i_source         = uptab.

  IF er_subrc <> 0.

    er_line = er_line - 2.

    WRITE:/1 'Error Line : ',er_line.

    WRITE:/1 error_message-line1,error_message-line2,

             error_message-line3.

    STOP.

  ENDIF.

ENDFORM.                    " chcek_syntax_error

繼續閱讀