ABAP内表导出MYSQL 代码

用ABAP将SAP的表结构导出成mysql的代码

*&---------------------------------------------------------------------*
*& Report Y_TABLE_FIELD_TO_MYSQL_CODE
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT Y_TABLE_FIELD_TO_MYSQL_CODE.

SELECTION-SCREEN BEGIN OF BLOCK B1 WITH FRAME TITLE TEXT-001.
  PARAMETERS:P_TNAME LIKE DD03L-TABNAME.
SELECTION-SCREEN END OF BLOCK B1.

*SELECTION-SCREEN BEGIN OF BLOCK B2 WITH FRAME TITLE TEXT-002.
*  PARAMETERS:P_CREATE RADIOBUTTON GROUP RBG1 DEFAULT 'X',
*             P_UPDATE RADIOBUTTON GROUP RBG1,
*             P_DELETE RADIOBUTTON GROUP RBG1.
*SELECTION-SCREEN END OF BLOCK B2.

INITIALIZATION.

*-----------------------------------------------------------------------
* START-OF-SELECTION
*-----------------------------------------------------------------------
START-OF-SELECTION.
  PERFORM FRM_GENERA_MYSQL_CODE.

*&---------------------------------------------------------------------*
*& Form FRM_GENERA_MYSQL_CODE
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM FRM_GENERA_MYSQL_CODE .

  DATA:LV_MYSQL_CODE TYPE STRING.

      SELECT
        DD03L~TABNAME   AS TABNAME,
        DD03L~FIELDNAME AS FIELDNAME,
        DD03L~AS4LOCAL  AS AS4LOCAL,
        DD03L~AS4VERS   AS AS4VERS,
        DD03L~POSITION  AS POSITION,
        DD03L~KEYFLAG   AS KEYFLAG,
        DD03L~MANDATORY AS MANDATORY,
        DD03L~ROLLNAME  AS ROLLNAME,
        DD03L~CHECKTABLE AS CHECKTABLE,
        DD03L~ADMINFIELD AS ADMINFIELD,
        DD03L~INTTYPE    AS INTTYPE,
        DD03L~INTLEN     AS INTLEN,
        DD03L~REFTABLE   AS REFTABLE,
        DD03L~PRECFIELD  AS PRECFIELD,
        DD03L~REFFIELD   AS REFFIELD,
        DD03L~CONROUT    AS CONROUT,
        DD03L~NOTNULL    AS NOTNULL,
        DD03L~DATATYPE   AS DATATYPE,
        DD03L~LENG       AS LENG,
        DD03L~DECIMALS   AS DECIMALS,
        DD03L~DOMNAME AS DOMNAME,
        DD03L~SHLPORIGIN AS SHLPORIGIN,
        DD03L~TABLETYPE AS TABLETYPE,
        DD03L~DEPTH AS DEPTH,
        DD03L~COMPTYPE AS COMPTYPE,
        DD03L~REFTYPE AS REFTYPE,
        DD03L~LANGUFLAG AS LANGUFLAG,
        DD03L~DBPOSITION AS DBPOSITION,
        DD03L~ANONYMOUS AS ANONYMOUS,
        DD03L~OUTPUTSTYLE AS OUTPUTSTYLE,
        DD03L~SRS_ID AS SRSID,

        DD03M~SCRTEXT_S,
        DD03M~SCRTEXT_M,
        DD03M~SCRTEXT_L,

        DD02T~DDTEXT AS DDTEXT

        INTO TABLE @DATA(LT_DD03V)
        FROM DD03L LEFT OUTER JOIN DD02T
     ON DD02T~TABNAME = DD03L~TABNAME
    AND DD02T~DDLANGUAGE = @SY-LANGU
    LEFT OUTER JOIN DD03M
     ON DD03M~TABNAME = DD03L~TABNAME
    AND DD03M~FIELDNAME = DD03L~FIELDNAME
    AND DD03M~DDLANGUAGE = @SY-LANGU
       WHERE DD03L~TABNAME EQ @P_TNAME
         AND DD03L~FIELDNAME NE '.INCLUDE'
       ORDER BY POSITION.


  DATA:LV_STREMP TYPE STRING,
       LV_MYSQL_FIELD_TYPE TYPE STRING,"CHAR , VARCHAR,INT,BIGING,TINYINT,DATETIME,TIMESTAMP,DECIMAL
       LV_END_FLAG TYPE C,
       LV_MYSQL_KEY TYPE STRING.
   LOOP AT LT_DD03V ASSIGNING FIELD-SYMBOL(<FS_DD03V>).

     AT FIRST.
       CONCATENATE 'CREATE TABLE IF NOT EXISTS' P_TNAME INTO LV_MYSQL_CODE SEPARATED BY SPACE.
       LV_MYSQL_CODE = LV_MYSQL_CODE && '('.
     ENDAT.

     IF <FS_DD03V>-KEYFLAG EQ 'X'.
       IF LV_MYSQL_KEY IS INITIAL.
         LV_MYSQL_KEY = <FS_DD03V>-FIELDNAME.
       ELSE.
         CONCATENATE LV_MYSQL_KEY <FS_DD03V>-FIELDNAME INTO LV_MYSQL_KEY SEPARATED BY ','.
       ENDIF.
     ENDIF.

     "动态生成类型改这里,默认都是VARCHAR
*     CASE <FS_DD03V>-INTTYPE.
*       WHEN 'C' OR 'N'.
*        LV_MYSQL_FIELD_TYPE = 'VARCHAR'.
*       WHEN ''.
*       WHEN OTHERS.
*     ENDCASE.

     CONCATENATE <FS_DD03V>-FIELDNAME 'VARCHAR(' <FS_DD03V>-INTLEN ')' INTO LV_STREMP SEPARATED BY SPACE.

     IF <FS_DD03V>-KEYFLAG EQ 'X'..
       LV_STREMP = LV_STREMP && ' NOT NULL COMMENT ''' && <FS_DD03V>-SCRTEXT_M && ''','.
     ELSE.
       LV_STREMP = LV_STREMP &&  ' COMMENT ''' && <FS_DD03V>-SCRTEXT_M && ''','.
     ENDIF.
     LV_MYSQL_CODE = LV_MYSQL_CODE && LV_STREMP.

     AT LAST.
       LV_END_FLAG = 'X'.
       LV_MYSQL_CODE = LV_MYSQL_CODE && 'PRIMARY KEY(' && LV_MYSQL_KEY && ') ) ENGINE=INNODB DEFAULT CHARSET=UTF8 AUTO_INCREMENT=1 COMMENT=''' && <FS_DD03V>-DDTEXT && ''';'."改字符集在这里
     ENDAT.
     IF LV_END_FLAG NE 'X'.
*       LV_STREMP = LV_STREMP && ','.
*       LV_MYSQL_CODE = LV_MYSQL_CODE && LV_STREMP.
     ENDIF.

     CLEAR:LV_STREMP.
   ENDLOOP.

   IF LV_MYSQL_CODE IS NOT INITIAL.
     PERFORM FRM_DOWNLOAD_TXT USING LV_MYSQL_CODE.
   ENDIF.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_DOWNLOAD_TXT
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*&      --> LV_MYSQL_CODE
*&---------------------------------------------------------------------*
FORM FRM_DOWNLOAD_TXT  USING    P_LV_MYSQL_CODE.


  DATA : c_file_path TYPE string.
  DATA:LT_TABLE TYPE TABLE OF STRING,
       LS_TABLE LIKE LINE OF LT_TABLE.
  LS_TABLE = P_LV_MYSQL_CODE.
  APPEND LS_TABLE TO LT_TABLE.

  c_file_path = 'D:/MYSQL_CODE.TXT'.

  CALL FUNCTION 'GUI_DOWNLOAD'
    EXPORTING
      filename                = c_file_path "file path
      filetype                = 'DAT'
    TABLES
      data_tab                = LT_TABLE "internal table name
    EXCEPTIONS
      file_write_error        = 1
      no_batch                = 2
      gui_refuse_filetransfer = 3
      invalid_type            = 4
      no_authority            = 5
      unknown_error           = 6
      header_not_allowed      = 7
      separator_not_allowed   = 8
      filesize_not_allowed    = 9
      header_too_long         = 10
      dp_error_create         = 11
      dp_error_send           = 12
      dp_error_write          = 13
      unknown_dp_error        = 14
      access_denied           = 15
      dp_out_of_memory        = 16
      disk_full               = 17
      dp_timeout              = 18
      file_not_found          = 19
      dataprovider_exception  = 20
      control_flush_error     = 21
      OTHERS                  = 22.

  IF sy-subrc = 0.
    DATA : w_msg(100) TYPE c.
    CONCATENATE text-001 c_file_path INTO w_msg SEPARATED BY space. "file downloaded message
    MESSAGE w_msg TYPE 'S'.
  ELSE.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
            WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.

ENDFORM.
posted @ 2022-04-07 19:05  linhuang  阅读(10)  评论(0编辑  收藏  举报  来源