neversoft 发表于 2015-9-19 14:28:53

sap zsql 制作

  ************************************************************************
* system name      :
*author               : jinlei
* program name    : ZSQL
************************************************************************
REPORT ZSQL MESSAGE-ID AT
            NO STANDARD PAGE HEADING.
  INCLUDE <SYMBOL>.
INCLUDE <LINE>.
INCLUDE <ICON>.
  TABLES: DD03L, DD01L, DD02T, DD17S, DD12T, DD04T.
  DATA: BEGIN OF ITAB_PROG OCCURS 1,
      CODE(80) TYPE C,
      END OF ITAB_PROG.
  DATA: BEGIN OF ITAB_SQL OCCURS 1,
      CODE(80) TYPE C,
      END OF ITAB_SQL.
  DATA: BEGIN OF ITAB_COL OCCURS 1,
      COL(30)   TYPE C,
      ALIAS(10) TYPE C,
      END OF ITAB_COL.
  DATA: BEGIN OF ITAB_TAB OCCURS 1,
      TAB(10)   TYPE C,
      ALIAS(10) TYPE C,
      END OF ITAB_TAB.
  DATA: BEGIN OF ITAB_WRITE OCCURS 1,
      DATA(80) TYPE C,
      END OF ITAB_WRITE.
  DATA: BEGIN OF ITAB_INTO OCCURS 1,
      CODE(80) TYPE C,
      END OF ITAB_INTO.
  DATA: BEGIN OF ITAB_DEL OCCURS 1,
      TABIX    TYPE I,
      CODE(80) TYPE C,
      END OF ITAB_DEL.
  DATA: BEGIN OF ITAB_INDEX OCCURS 1,
      TAB(10)   TYPE C,
      INDEX       LIKE DD12L-DBINDEX,
      INDEX_TEXTLIKE DD12T-DDTEXT,
      INDEX_FIELD LIKE DD17S-FIELDNAME,
      FIELD_TEXTLIKE DD04T-DDTEXT,
      PLUS      TYPE C,
      END OF ITAB_INDEX.
  DATA: BEGIN OF ITAB_LEN OCCURS 1,
      LEN TYPE I,
      END OF ITAB_LEN.
  DATA: BEGIN OF ITAB_FIELD OCCURS 1,
      FIELD    LIKE DD03L-FIELDNAME,
      TEXT(40) TYPE C,
      END OF ITAB_FIELD.
  DATA: BEGIN OF ITAB_DIST OCCURS 1,
      CODE(80) TYPE C,
      END OF ITAB_DIST.
  DATA: BEGIN OF FCODE_TAB OCCURS 10,
      FCODE(4),
      END OF FCODE_TAB.
  DATA: SQL_TABIX      LIKE SY-TABIX,
      SELECT_KEY(10) TYPE C,
      ETC(80)      TYPE C.
  DATA: TEMP_COL(30)   TYPE C,
      TEMP_CHAR      TYPE C,
      COUNT1(2)      TYPE N,
      COUNT2(2)      TYPE N,
      LIKE_COL(30)   TYPE C,
      COL_LIN      TYPE I,
      ENDLEN(3)      TYPE N VALUE 1.
  DATA: FROM_FLAG    TYPE C,
      ALIAS_FLAG   TYPE C,
      END_FLAG   TYPE C,
      UPDATE_FLAGTYPE C,
      CONFIRM_FLAG TYPE C.
  DATA: COL_LENGTH LIKE DD03L-LENG.
  DATA: PROG(8)      TYPE C,
      MSG(120)   TYPE C,
      MSG_TEXT(80) TYPE C,
      SUBRC      LIKE SY-SUBRC,
      MARK         TYPE C VALUE 'X',
      LINE_CNT   TYPE I,
      FILESIZE   TYPE I.
  SET TITLEBAR '000'.
SET PF-STATUS 'PFSTA00'.
WRITE: /1 'Edit Your SQL ...............' COLOR 2.
  
INITIALIZATION.
  AT USER-COMMAND.
IF SY-UCOMM = 'EDIT'.
    PERFORM EDIT_SQL.
    PERFORM WRITE_SQL_REPORT.
ELSEIF SY-UCOMM = 'EXEC'.
    IF UPDATE_FLAG = SPACE.
      PERFORM SQL_GENERATE USING 'Y' ITAB_COL-COL 'A'."INIT FLAG = 'Y'
      IF SY-SUBRC <> 0.
      EXIT.
      ENDIF.
      PERFORM CHECK_SQL_CODE.
      IF SY-SUBRC <> 0.
      MESSAGE I315 WITH 'Check your SQL statement!!!'.
      EXIT.
      ENDIF.
      READ TABLE ITAB_COL INDEX 1.
      IF SY-SUBRC = 0.
      PERFORM EXEC_SQL.
      ENDIF.
    ELSE.
      IF SY-UNAME = '31034951' OR SY-UNAME = 'GOLDENMP'
      OR SY-UNAME = 'MMI01' OR SY-UNAME = 'BBLEE' OR SY-UNAME = 'HYHAN'
      OR SY-UNAME = '11101080'
      OR SY-UNAME = 'QMP09' OR SY-UNAME = '31871741'.
*****>PERFORM CONFIRM_UPDATE.
      PERFORM EXEC_SQL_UPDATE.
*       CASE CONFIRM_FLAG.
*         WHEN 'N'. EXIT.
*         WHEN 'A'. EXIT.
*         WHEN 'J'. PERFORM EXEC_SQL_UPDATE.
*       ENDCASE.
      ELSE.
      MESSAGE I315 WITH '寸脚俊霸绰 弊繁 SQL阑 镜 鼻茄捞 绝嚼聪促.'.
      EXIT.
      ENDIF.
    ENDIF.
ELSEIF SY-UCOMM = 'BBCK'.
    SY-LSIND = 0.
ELSEIF SY-UCOMM = 'BCCK'.
    REFRESH ITAB_INDEX.
    SY-LSIND = SY-LSIND - 3.
ELSEIF SY-UCOMM = 'PLAN'.
    PERFORM EXPLAIN_SQLTAB(RSXPLAIN) TABLES ITAB_SQL
                                     USINGSUBRC.
ELSEIF SY-UCOMM = 'INDX'.
    PERFORM VIEW_INDX_TAB.
ELSEIF SY-UCOMM = 'TABL' OR SY-UCOMM = 'DIST'.
    IF SY-UCOMM = 'TABL'.
      SET TITLEBAR 'W03'.
    ELSE.
      SET TITLEBAR 'W05'.
    ENDIF.
    PERFORM VIEW_FIELD_TAB.
ELSEIF SY-UCOMM = 'CHOS'.
    PERFORM CHOS_INDX_TAB.
ELSEIF SY-UCOMM = 'CHSE'.
    IF ITAB_TAB-TAB = SPACE.
      EXIT.
    ENDIF.
    IF SY-TITLE = 'Choose Table for field search'.
      PERFORM CHSE_VIEW_FIELD.
    ELSEIF SY-TITLE = 'Choose Table for field distribution'.
      PERFORM CHSE_FIELD_DIST.
    ELSEIF SY-TITLE = 'Choose Field for distribution'.
      PERFORM SEL_FIELD_DIST.
    ENDIF.
ELSEIF SY-UCOMM = 'SASC'.
    PERFORM EXEC_SASC.
ELSEIF SY-UCOMM = 'SDES'.
    PERFORM EXEC_SDES.
ELSEIF SY-UCOMM = 'GRAF'.
    PERFORM CREATE_GRAF.
ELSEIF SY-UCOMM = 'UPLD'.
    PERFORM SQL_UPLOAD.
    IF SY-SUBRC <> 0.
      MESSAGE I315 WITH 'Upload Error'.
      EXIT.
    ENDIF.
    IF FILESIZE <> 0.
      PERFORM EDIT_SQL.
      PERFORM WRITE_SQL_REPORT.
    ENDIF.
ELSEIF SY-UCOMM = 'DOWN'.
    PERFORM SQL_DOWNLOAD.
    IF SY-SUBRC <> 0.
      MESSAGE I315 WITH 'Download Error'.
    ENDIF.
ELSEIF SY-UCOMM = 'HELP'.
    SUBMIT ZCSQL1 AND RETURN.
ENDIF.
  AT LINE-SELECTION.
IF SY-LSIND >= 3 AND ITAB_INDEX-INDEX <> SPACE.
    PERFORM WRITE_INDEX_HIER.
ELSEIF SY-PFKEY = 'PFSTA04' AND ITAB_TAB-TAB <> SPACE.
    IF SY-TITLE = 'Choose Table for field search'.
      PERFORM CHSE_VIEW_FIELD.
    ELSEIF SY-TITLE = 'Choose Table for field distribution'.
      PERFORM CHSE_FIELD_DIST.
    ELSEIF SY-TITLE = 'Choose Field for distribution'
         AND ITAB_FIELD-FIELD <> SPACE.
      PERFORM SEL_FIELD_DIST.
    ENDIF.
ENDIF.
  *&---------------------------------------------------------------------*
*&      FormSQL_PARSING
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*-->p1      text
*<--p2      text
*----------------------------------------------------------------------*
FORM SQL_PARSING.
DATA: AGGR_FLAG TYPE C,
      AGGR_CNTTYPE I.
  LOOP AT ITAB_SQL.
    IF SY-TABIX = 1.
      SHIFT ITAB_SQL-CODE LEFT DELETING LEADING SPACE.
    ENDIF.
    SQL_TABIX = SY-TABIX + 1.
    SPLIT ITAB_SQL-CODE AT SPACE INTO SELECT_KEY ETC.
    IF SELECT_KEY = 'SELECT'.
      CLEAR: TEMP_COL, TEMP_CHAR, COUNT1, COUNT2, FROM_FLAG, ALIAS_FLAG,
             UPDATE_FLAG, END_FLAG.
      DO.
      TEMP_CHAR = ETC+COUNT2(1).
      IF TEMP_CHAR = '('.
          IF AGGR_CNT = 0.
            AGGR_FLAG = 'Y'.
          ENDIF.
          AGGR_CNT = AGGR_CNT + 1.
      ELSEIF TEMP_CHAR = ')'.
          AGGR_CNT= AGGR_CNT - 1.
          IF AGGR_CNT = 0.
            AGGR_FLAG = ' '.
          ENDIF.
      ENDIF.
      IF TEMP_CHAR = SPACE OR TEMP_CHAR = ','.
          IF FROM_FLAG = 'Y'.
            IF TEMP_COL <> SPACE AND TEMP_COL <> 'WHERE'.
            IF TEMP_CHAR = SPACE.
                IF ITAB_TAB-TAB = SPACE.
                  ITAB_TAB-TAB = TEMP_COL.
                  ALIAS_FLAG = 'Y'.
                ELSE.
                  ITAB_TAB-ALIAS = TEMP_COL.
                ENDIF.
            ELSEIF ALIAS_FLAG <> 'Y'.
                ITAB_TAB-TAB = TEMP_COL.
                APPEND ITAB_TAB.
                CLEAR ITAB_TAB.
            ELSEIF ALIAS_FLAG = 'Y'.
                ITAB_TAB-ALIAS = TEMP_COL.
                APPEND ITAB_TAB.
                CLEAR ITAB_TAB.
                CLEAR ALIAS_FLAG.
            ENDIF.
            ELSEIF TEMP_COL = 'WHERE'.
            IF ITAB_TAB-TAB <> SPACE.
                COLLECT ITAB_TAB.
            ENDIF.
            EXIT.
            ENDIF.
            CLEAR: TEMP_COL, COUNT1.
            COUNT2 = COUNT2 + 1.
            IF COUNT2 >= 80.
            PERFORM READ_NEXT_SQL.
            IF END_FLAG = 'Y'.
                EXIT.
            ENDIF.
            ENDIF.
            CONTINUE.
          ELSE.
            IF TEMP_COL <> SPACE AND TEMP_COL <> 'FROM'
               AND TEMP_COL <> 'DISTINCT'
               AND ( TEMP_CHAR = ',' OR TEMP_CHAR = ' ' )
               AND AGGR_FLAG = ' ' .
            SEARCH TEMP_COL FOR '('.
            IF SY-FDPOS = 0.
                SPLIT TEMP_COL AT '.' INTO ITAB_COL-ALIAS ITAB_COL-COL.
                IF ITAB_COL-COL = SPACE.
                  ITAB_COL-COL = ITAB_COL-ALIAS.
                  CLEAR ITAB_COL-ALIAS.
                ENDIF.
            ELSE.
                ITAB_COL-COL = TEMP_COL.
            ENDIF.
            APPEND ITAB_COL.
            ELSEIF TEMP_COL = 'FROM'.
            FROM_FLAG = 'Y'.
            ENDIF.
            IF AGGR_FLAG <> 'Y'.
            CLEAR: TEMP_COL, COUNT1.
            ELSE.
            IF TEMP_CHAR <> '''' ANDTEMP_CHAR <> ','
               AND COUNT1 < 28.
                TEMP_COL+COUNT1(1) = ETC+COUNT2(1).
                COUNT1 = COUNT1 + 1.
            ENDIF.
            ENDIF.
            COUNT2 = COUNT2 + 1.
            IF COUNT2 >= 80.
            PERFORM READ_NEXT_SQL.
            IF END_FLAG = 'Y'.
                EXIT.
            ENDIF.
            ENDIF.
            CONTINUE.
          ENDIF.
      ELSE.
          IF TEMP_CHAR <> '''' ANDTEMP_CHAR <> ',' AND COUNT1 < 28.
            TEMP_COL+COUNT1(1) = ETC+COUNT2(1).
          ENDIF.
      ENDIF.
  COUNT1 = COUNT1 + 1.
      COUNT2 = COUNT2 + 1.
  ENDDO.
      IF ITAB_TAB-TAB <> SPACE.
      COLLECT ITAB_TAB.
      ENDIF.
    ELSEIF SELECT_KEY = 'DELETE' ORSELECT_KEY = 'UPDATE'
         ORSELECT_KEY = 'INSERT'.
      UPDATE_FLAG = 'Y'.
    ENDIF.
ENDLOOP.
ENDFORM.                               " SQL_PARSING
*&---------------------------------------------------------------------*
*&      FormREAD_NEXT_SQL
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*-->p1      text
*<--p2      text
*----------------------------------------------------------------------*
FORM READ_NEXT_SQL.
READ TABLE ITAB_SQL INDEX SQL_TABIX.
IF SY-SUBRC <> 0.
    END_FLAG = 'Y'.
    EXIT.
ENDIF.
ETC = ITAB_SQL-CODE.
SQL_TABIX = SQL_TABIX + 1.
CLEAR: TEMP_COL, COUNT1, COUNT2.
  ENDFORM.                               " READ_NEXT_SQL
*&---------------------------------------------------------------------*
*&      FormDECLARE_HEADER
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*-->p1      text
*<--p2      text
*----------------------------------------------------------------------*
FORM DECLARE_HEADER.
ITAB_PROG-CODE = 'PROGRAM SUBPOOL.'.
APPEND ITAB_PROG.
  ITAB_PROG-CODE = 'DATA REC_COUNT(7) TYPE N.'.
APPEND ITAB_PROG.
ITAB_PROG-CODE = 'DATA: BEGIN OF ITAB_DATA OCCURS 1,'.
APPEND ITAB_PROG.
  ITAB_WRITE-DATA = 'WRITE: /1 '.
APPEND ITAB_WRITE.
DESCRIBE TABLE ITAB_COL LINES COL_LIN.
  LOOP AT ITAB_COL.
    COUNT1 = SY-TABIX.
    READ TABLE ITAB_TAB WITH KEY ALIAS = ITAB_COL-ALIAS.
    CONCATENATE 'COL' COUNT1 INTO TEMP_COL.
    SEARCH ITAB_COL-COL FOR '('.
    IF SY-FDPOS <> 0.
      CONCATENATE 'COL' COUNT1 '(15)' INTO ITAB_PROG-CODE.
      CONCATENATE ITAB_PROG-CODE 'TYPE C,'
             INTO ITAB_PROG-CODE SEPARATED BY SPACE.
    ELSE.
      CONCATENATE ITAB_TAB-TAB '-' ITAB_COL-COL INTO LIKE_COL.
      CONCATENATE TEMP_COL 'LIKE' LIKE_COL ','
             INTO ITAB_PROG-CODE SEPARATED BY SPACE.
    ENDIF.
    APPEND ITAB_PROG.
    IF COUNT1 = 1 AND COUNT1 <> COL_LIN.
      CONCATENATE 'INTO :ITAB_DATA-' TEMP_COL ',' INTO ITAB_INTO-CODE.
      APPEND ITAB_INTO.
      CONCATENATE 'SY-VLINE, ITAB_DATA-' TEMP_COL ','
                  INTO ITAB_WRITE-DATA.
      APPEND ITAB_WRITE.
    ELSEIF COUNT1 < COL_LIN.
      CONCATENATE ':ITAB_DATA-' TEMP_COL ',' INTO ITAB_INTO-CODE.
      APPEND ITAB_INTO.
      CONCATENATE 'SY-VLINE, ITAB_DATA-' TEMP_COL ','
                  INTO ITAB_WRITE-DATA.
      APPEND ITAB_WRITE.
    ELSE.
      IF COUNT1 = 1.
      CONCATENATE 'INTO :ITAB_DATA-' TEMP_COL INTO ITAB_INTO-CODE.
      APPEND ITAB_INTO.
      ELSE.
      CONCATENATE ':ITAB_DATA-' TEMP_COL INTO ITAB_INTO-CODE.
      APPEND ITAB_INTO.
      ENDIF.
      CONCATENATE ' SY-VLINE,ITAB_DATA-' TEMP_COL ', SY-VLINE.'
             INTO ITAB_WRITE-DATA.
      APPEND ITAB_WRITE.
    ENDIF.
ENDLOOP.
  ITAB_PROG-CODE = '      END OF ITAB_DATA.'.
APPEND ITAB_PROG.
ITAB_PROG-CODE = 'FORM DYN1.'.
APPEND ITAB_PROG.
  ENDFORM.                               " DECLARE_HEADER
  *&---------------------------------------------------------------------*
*&      FormWRITE_EXEC_SQL
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*-->p1      text
*<--p2      text
*----------------------------------------------------------------------*
FORM WRITE_EXEC_SQL.
DATA: RES_SQL(80) TYPE C,
      RES_LEN   TYPE I,
      INTO_TABIXLIKE SY-TABIX,
      ORDER_FLAGTYPE C.
  ITAB_PROG-CODE = 'EXEC SQL PERFORMING WRITE_DATA.'.
APPEND ITAB_PROG.
  SEARCH ITAB_SQL FOR 'FROM'.
READ TABLE ITAB_SQL INDEX SY-TABIX.
IF SY-FDPOS <> 0 AND SY-FDPOS <> 1.
    RES_SQL = ITAB_SQL-CODE+0(SY-FDPOS).
    RES_LEN = 80 - SY-FDPOS.
    ITAB_SQL-CODE = ITAB_SQL-CODE+SY-FDPOS(RES_LEN).
    MODIFY ITAB_SQL INDEX SY-TABIX.
    ITAB_SQL-CODE = RES_SQL.
    INSERT ITAB_SQL INDEX SY-TABIX.
    SY-TABIX = SY-TABIX + 1.
ENDIF.
  INTO_TABIX = SY-TABIX.
LOOP AT ITAB_INTO.
    ITAB_SQL-CODE = ITAB_INTO-CODE.
    INSERT ITAB_SQL INDEX INTO_TABIX.
    INTO_TABIX = INTO_TABIX + 1.
ENDLOOP.
  SEARCH ITAB_SQL FOR 'ORDER BY'.
IF SY-SUBRC = 0.
    ORDER_FLAG = 'Y'.
    READ TABLE ITAB_SQL INDEX SY-TABIX.
    IF SY-FDPOS <> 0 AND SY-FDPOS <> 1.
      RES_SQL = ITAB_SQL-CODE+0(SY-FDPOS).
      RES_LEN = 80 - SY-FDPOS.
      ITAB_SQL-CODE = ITAB_SQL-CODE+SY-FDPOS(RES_LEN).
      MODIFY ITAB_SQL INDEX SY-TABIX.
      ITAB_SQL-CODE = RES_SQL.
      INSERT ITAB_SQL INDEX SY-TABIX.
      SY-TABIX = SY-TABIX + 1.
    ENDIF.
ELSE.
    ORDER_FLAG = 'N'.
ENDIF.
  LOOP AT ITAB_SQL.
    IF SY-TABIX > 1 AND ITAB_SQL-CODE+0(1) <> SPACE.
      ITAB_SQL-CODE+1(79) = ITAB_SQL-CODE+(79).
      ITAB_SQL-CODE+0(1) = ' '.
      MODIFY ITAB_SQL INDEX SY-TABIX.
    ENDIF.
    ITAB_PROG-CODE = ITAB_SQL-CODE.
    APPEND ITAB_PROG.
ENDLOOP.
  IF ORDER_FLAG = 'N'.
    READ TABLE ITAB_COL INDEX 1.
    SEARCH ITAB_SQL FOR '('.
    IF SY-SUBRC <> 0.
      CONCATENATE 'ORDER BY' ITAB_COL-COL
                  INTO ITAB_PROG-CODE SEPARATED BY SPACE.
      APPEND ITAB_PROG.
    ENDIF.
ENDIF.
  ITAB_PROG-CODE = 'ENDEXEC.'.
APPEND ITAB_PROG.
  CONCATENATE'ULINE /1' '(' ENDLEN ')' '.' INTO ITAB_PROG-CODE.
APPEND ITAB_PROG.
  ITAB_PROG-CODE = 'SET TITLEBAR ''001'' WITH REC_COUNT ''Record''.'.
APPEND ITAB_PROG.
  ITAB_PROG-CODE = 'ENDFORM.'.
APPEND ITAB_PROG.
  ENDFORM.                               " WRITE_EXEC_SQL
  *&---------------------------------------------------------------------*
*&      FormWRITE_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*-->p1      text
*<--p2      text
*----------------------------------------------------------------------*
FORM WRITE_DATA.
ITAB_PROG-CODE = 'FORM WRITE_DATA.'.
APPEND ITAB_PROG.
  ITAB_PROG-CODE = 'FORMAT INTENSIFIED OFF.'.
APPEND ITAB_PROG.
ITAB_PROG-CODE = 'FORMAT COLOR 2.'.
APPEND ITAB_PROG.
  LOOP AT ITAB_WRITE.
    ITAB_PROG-CODE = ITAB_WRITE-DATA.
    APPEND ITAB_PROG.
ENDLOOP.
  ITAB_PROG-CODE = 'REC_COUNT = REC_COUNT + 1.'.
APPEND ITAB_PROG.
  ITAB_PROG-CODE = 'ENDFORM.'.
APPEND ITAB_PROG.
  ENDFORM.                               " WRITE_DATA
*&---------------------------------------------------------------------*
*&      FormWRITE_HEADER
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*-->p1      text
*<--p2      text
*----------------------------------------------------------------------*
FORM WRITE_HEADER.
DATA: DOMNAME   LIKE DD03L-DOMNAME,
      ULINE_TABIX LIKE SY-TABIX.
  ITAB_PROG-CODE = 'FORMAT INTENSIFIED ON.'.
APPEND ITAB_PROG.
ITAB_PROG-CODE = 'FORMAT COLOR 1.'.
APPEND ITAB_PROG.
ULINE_TABIX = SY-TABIX + 1.
  ITAB_PROG = 'WRITE: /1 '.
APPEND ITAB_PROG.
LOOP AT ITAB_COL.
    READ TABLE ITAB_TAB WITH KEY ALIAS = ITAB_COL-ALIAS.
    SELECT SINGLE DOMNAME INTO DOMNAME
                        FROM DD03L
                        WHERE TABNAME = ITAB_TAB-TAB
                            AND FIELDNAME = ITAB_COL-COL.
    IF SY-SUBRC = 0.
      SELECT SINGLE OUTPUTLEN INTO COL_LENGTH
                              FROM DD01L
                              WHERE DOMNAME = DOMNAME
                              AND AS4LOCAL = 'A'.
      CONCATENATE '(' COL_LENGTH ')' INTO TEMP_COL.
      ENDLEN = COL_LENGTH + 3 + ENDLEN.
    ELSE.
      CONCATENATE '(' '15' ')' INTO TEMP_COL.
      ENDLEN = 18 + ENDLEN.
    ENDIF.
    ITAB_LEN-LEN = ENDLEN.
    APPEND ITAB_LEN.
  CONCATENATE '''' ITAB_COL-COL '''' INTO ITAB_COL-COL.
    CONCATENATE 'SY-VLINE,' TEMP_COL ITAB_COL-COL
                'CENTERED,' INTO ITAB_PROG SEPARATED BY SPACE.
    APPEND ITAB_PROG.
ENDLOOP.
ITAB_PROG = 'SY-VLINE.'.
APPEND ITAB_PROG.
CONCATENATE'ULINE /1' '(' ENDLEN ')' '.' INTO ITAB_PROG-CODE.
APPEND ITAB_PROG.
CONCATENATE'ULINE /1' '(' ENDLEN ')' '.' INTO ITAB_PROG-CODE.
INSERT ITAB_PROG INDEX ULINE_TABIX.
  CONCATENATE 'NEW-PAGE LINE-SIZE' ENDLEN '.' INTO ITAB_PROG-CODE
                                              SEPARATED BY SPACE.
INSERT ITAB_PROG INDEX ULINE_TABIX.
  ENDFORM.                               " WRITE_HEADER
*&---------------------------------------------------------------------*
*&      FormTRANS_UPPER_ITAB_SQL
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*-->p1      text
*<--p2      text
*----------------------------------------------------------------------*
FORM TRANS_UPPER_ITAB_SQL.
DATA: SAVE_TABIXLIKE SY-TABIX,
      TABIX_COUNT TYPE I.
  REFRESH ITAB_DEL.
LOOP AT ITAB_SQL.
    SAVE_TABIX= SY-TABIX.
    TABIX_COUNT = TABIX_COUNT + 1.
    IF ITAB_SQL-CODE = SPACE OR ITAB_SQL-CODE+(1) = '*'.
      IF ITAB_SQL-CODE+(1) = '*'.
      CLEAR ITAB_DEL.
      ITAB_DEL-TABIX = TABIX_COUNT.
      ITAB_DEL-CODE= ITAB_SQL-CODE.
      APPEND ITAB_DEL.
      ENDIF.
      DELETE ITAB_SQL INDEX SAVE_TABIX.
      CONTINUE.
    ENDIF.
    TRANSLATE ITAB_SQL-CODE TO UPPER CASE.
    MODIFY ITAB_SQL INDEX SAVE_TABIX.
ENDLOOP.
ENDFORM.                               " TRANS_UPPER_ITAB_SQL
*&---------------------------------------------------------------------*
*&      FormCLEAR_VAR
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*-->p1      text
*<--p2      text
*----------------------------------------------------------------------*
FORM CLEAR_VAR.
REFRESH: ITAB_PROG, ITAB_COL, ITAB_WRITE, ITAB_INTO, ITAB_TAB.
CLEAR:   ITAB_PROG, ITAB_COL, ITAB_WRITE, ITAB_INTO, ITAB_TAB.
ENDLEN = 1.
  ENDFORM.                               " CLEAR_VAR
*&---------------------------------------------------------------------*
*&      FormEDIT_SQL
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*-->p1      text
*<--p2      text
*----------------------------------------------------------------------*
FORM EDIT_SQL.
DATA: CHANGED LIKE S38E-BUF_VARIED,
      FCODE LIKE SY-UCOMM,
      SUBRC LIKE SY-SUBRC.
  LOOP AT ITAB_DEL.
    ITAB_SQL-CODE = ITAB_DEL-CODE.
    INSERT ITAB_SQL INDEX ITAB_DEL-TABIX.
ENDLOOP.
  CALL FUNCTION 'EDITOR_APPLICATION'
       EXPORTING
            APPLICATION = 'BF'
            DISPLAY   = ' '
            NAME      = 'Input Your SQL......'
       IMPORTING
            FCODE       = FCODE
            CHANGED   = CHANGED
       TABLES
            CONTENT   = ITAB_SQL.
CASE FCODE.
    WHEN 'BACK'. SUBRC = 4.
    WHEN 'UPD'.SUBRC = 0.
    WHEN OTHERS. SUBRC = 8.
ENDCASE.
IF SUBRC <> 0.
    PERFORM CLEAR_VAR.
    REFRESH ITAB_SQL.
    EXIT.
ENDIF.
  PERFORM CLEAR_VAR.
  PERFORM TRANS_UPPER_ITAB_SQL.
  PERFORM SQL_PARSING.
IF UPDATE_FLAG = 'Y'.
    REFRESH FCODE_TAB.
    FCODE_TAB = 'PLAN'.
    APPEND FCODE_TAB.
    FCODE_TAB = 'INDX'.
    APPEND FCODE_TAB.
    FCODE_TAB = 'TABL'.
    APPEND FCODE_TAB.
    FCODE_TAB = 'DIST'.
    APPEND FCODE_TAB.
    SET PF-STATUS 'PFSTA00' EXCLUDING FCODE_TAB.
    EXIT.
ENDIF.
  SET PF-STATUS 'PFSTA00'.
  READ TABLE ITAB_COL INDEX 1.
IF ITAB_COL-COL = '*'.
    PERFORM GET_ITAB_COL_ALL.
ENDIF.
  PERFORM DECLARE_HEADER.
  PERFORM WRITE_HEADER.
  PERFORM WRITE_EXEC_SQL.
  PERFORM WRITE_DATA.
  SEARCH ITAB_SQL FOR 'INTO'.
IF SY-SUBRC = 0.
    LOOP AT ITAB_SQL FROM SY-TABIX.
      IF ITAB_SQL-CODE+1(4) <> 'FROM'.
      DELETE ITAB_SQL INDEX SY-TABIX.
      ELSE.
      EXIT.
      ENDIF.
    ENDLOOP.
ENDIF.
  ENDFORM.                               " EDIT_SQL
*&---------------------------------------------------------------------*
*&      FormGET_LINE_CHECK
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*-->p1      text
*<--p2      text
*----------------------------------------------------------------------*
FORM GET_LINE_CHECK.
DATA: CUR_LINE TYPE I.
  CUR_LINE = 1.
DO.
    CLEAR MARK.
    READ LINE CUR_LINE FIELD VALUE MARK.
    IF SY-SUBRC <> 0.
      EXIT.
    ENDIF.
    IF MARK = 'X'.
      PERFORM GET_PRIMARY_INDEX.
      CLEAR ITAB_INDEX.
      ITAB_INDEX-PLUS= '4'.
      ITAB_INDEX-TAB   = ITAB_TAB-TAB.
      SELECT * FROM DD17S
               WHERE SQLTAB = ITAB_TAB-TAB
               ORDER BY POSITION.
      ITAB_INDEX-INDEX = ITAB_TAB-TAB.
      ITAB_INDEX-INDEX+10(3) = DD17S-INDEXNAME.
      SELECT SINGLE * FROM DD12T
                        WHERE DDLANGUAGE = 'E'
                        AND SQLTAB = ITAB_TAB-TAB
                        AND INDEXNAME = DD17S-INDEXNAME.
      ITAB_INDEX-INDEX_TEXT= DD12T-DDTEXT.
      SELECT SINGLE * FROM DD03L
                        WHERE TABNAME = ITAB_TAB-TAB
                        AND FIELDNAME = DD17S-FIELDNAME.
      IF SY-SUBRC = 0.
          SELECT SINGLE DDTEXT FROM DD04T
                               INTO ITAB_INDEX-FIELD_TEXT
                               WHERE ROLLNAME = DD03L-ROLLNAME
                                  AND DDLANGUAGE = 'E'.
      ENDIF.
      ITAB_INDEX-INDEX_FIELD = DD17S-FIELDNAME.
      COLLECT ITAB_INDEX.
      ENDSELECT.
    ENDIF.
    CUR_LINE = CUR_LINE + 1.
ENDDO.
  ENDFORM.                               " GET_LINE_CHECK
  *&---------------------------------------------------------------------*
*&      FormWRITE_INDEX
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*-->p1      text
*<--p2      text
*----------------------------------------------------------------------*
FORM WRITE_INDEX.
DATA: TEMP_INDEX LIKE ITAB_INDEX.
  SET PF-STATUS 'PFSTA03'.
SET TITLEBAR 'W02'.
NEW-PAGE LINE-SIZE 100.
  LOOP AT ITAB_INDEX.
    MOVE-CORRESPONDING ITAB_INDEX TO TEMP_INDEX.
    AT NEW TAB.
      SKIP 2.
      WRITE: /1 'List Index for Table.' COLOR 1,
                ' - ', ITAB_INDEX-TAB COLOR 4.
      ULINE: /1(83).
    ENDAT.
    AT NEW INDEX.
      IF TEMP_INDEX-PLUS = '4'.
      WRITE: /3 SY-VLINE, /3(2) SY-ULINE,
                  SYM_PLUS_FOLDER AS SYMBOL HOTSPOT ON COLOR 7,
                  ITAB_INDEX-INDEX COLOR 3,
                  TEMP_INDEX-INDEX_TEXT COLOR 2.
      HIDE: ITAB_INDEX-INDEX.
      ELSE.
      WRITE: /3 SY-VLINE, /3(2) SY-ULINE,
                  SYM_MINUS_FOLDER AS SYMBOL HOTSPOT ON COLOR 7,
                  ITAB_INDEX-INDEX COLOR 3,
                  TEMP_INDEX-INDEX_TEXT COLOR 2.
      HIDE: ITAB_INDEX-INDEX.
      LOOP AT ITAB_INDEX WHERE INDEX = TEMP_INDEX-INDEX.
          IF SY-TABIX = 1.
            WRITE: /9 SY-VLINE, /9LINE_BOTTOM_LEFT_CORNER AS LINE,
                      ITAB_INDEX-INDEX_FIELD COLOR 2.
          ELSE.
            WRITE: /9 LINE_BOTTOM_LEFT_CORNER AS LINE,
                      ITAB_INDEX-INDEX_FIELD COLOR 2.
          ENDIF.
          WRITE: ITAB_INDEX-FIELD_TEXT
                               UNDER TEMP_INDEX-INDEX_TEXT COLOR 2.
      ENDLOOP.
      ENDIF.
    ENDAT.
ENDLOOP.
CLEAR ITAB_INDEX-INDEX.
ENDFORM.                               " WRITE_INDEX
*&---------------------------------------------------------------------*
*&      FormGET_PRIMARY_INDEX
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*-->p1      text
*<--p2      text
*----------------------------------------------------------------------*
FORM GET_PRIMARY_INDEX.
CLEAR ITAB_INDEX.
ITAB_INDEX-PLUS= '4'.
ITAB_INDEX-TAB   = ITAB_TAB-TAB.
ITAB_INDEX-INDEX = ITAB_TAB-TAB.
ITAB_INDEX-INDEX+10(1) = '0'.
ITAB_INDEX-INDEX_TEXT= 'Primary Key'.
SELECT * FROM DD03L
         WHERE TABNAME = ITAB_TAB-TAB
         ORDER BY POSITION.
    SELECT SINGLE DDTEXT FROM DD04T
                         INTO ITAB_INDEX-FIELD_TEXT
                         WHERE ROLLNAME = DD03L-ROLLNAME
                           AND DDLANGUAGE = 'E'.
    ITAB_INDEX-INDEX_FIELD = DD03L-FIELDNAME.
    APPEND ITAB_INDEX.
ENDSELECT.
ENDFORM.                               " GET_PRIMARY_INDEX
  *&---------------------------------------------------------------------*
*&      FormEXEC-SQL
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*-->p1      text
*<--p2      text
*----------------------------------------------------------------------*
FORM EXEC_SQL.
SET TITLEBAR '001'.
SET PF-STATUS 'PFSTA01'.
  PERFORM DYN1 IN PROGRAM (PROG).
  ENDFORM.                               " EXEC_SQL
*&---------------------------------------------------------------------*
*&      FormWRITE_SQL_REPORT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*-->p1      text
*<--p2      text
*----------------------------------------------------------------------*
FORM WRITE_SQL_REPORT.
SY-LSIND = 0.
  DESCRIBE TABLE ITAB_SQL LINES LINE_CNT.
IF LINE_CNT = 0 OR ( LINE_CNT = 1 AND ITAB_SQL-CODE = SPACE ).
    WRITE: /1 'Edit Your SQL ................' COLOR 2.
ELSE.
    LOOP AT ITAB_SQL.
      WRITE: /1 ITAB_SQL-CODE.
    ENDLOOP.
ENDIF.
ENDFORM.                               " WRITE_SQL_REPORT
*&---------------------------------------------------------------------*
*&      FormVIEW_INDX_TAB
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*-->p1      text
*<--p2      text
*----------------------------------------------------------------------*
FORM VIEW_INDX_TAB.
SET TITLEBAR 'W01'.
SET PF-STATUS 'PFSTA02'.
WINDOW STARTING AT 15 5 ENDING AT 75 15.
LOOP AT ITAB_TAB.
    SELECT SINGLE * FROM DD02T
                  WHERE TABNAME = ITAB_TAB-TAB
                      AND DDLANGUAGE = 'E'.
    WRITE: /3 MARK AS CHECKBOX, 7 ITAB_TAB-TAB, DD02T-DDTEXT.
    HIDE: ITAB_TAB-TAB.
ENDLOOP.
CLEAR ITAB_TAB-TAB.
  ENDFORM.                               " VIEW_INDX_TAB
  *&---------------------------------------------------------------------*
*&      FormVIEW_FIELD_TAB
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*-->p1      text
*<--p2      text
*----------------------------------------------------------------------*
FORM VIEW_FIELD_TAB.
SET PF-STATUS 'PFSTA04' EXCLUDING 'GRAF'.
WINDOW STARTING AT 15 5 ENDING AT 90 15.
LOOP AT ITAB_TAB.
    SELECT SINGLE * FROM DD02T
                  WHERE TABNAME = ITAB_TAB-TAB
                      AND DDLANGUAGE = 'E'.
    WRITE: /3 ITAB_TAB-TAB, DD02T-DDTEXT.
    HIDE: ITAB_TAB-TAB.
ENDLOOP.
CLEAR ITAB_TAB-TAB.
  ENDFORM.                               " VIEW_FIELD_TAB
  *&---------------------------------------------------------------------*
*&      FormCHOS_INDX_TAB
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*-->p1      text
*<--p2      text
*----------------------------------------------------------------------*
FORM CHOS_INDX_TAB.
PERFORM GET_LINE_CHECK.
DESCRIBE TABLE ITAB_INDEX LINES LINE_CNT.
IF LINE_CNT > 0.
    PERFORM WRITE_INDEX.
ELSE.
    MESSAGE S315 WITH 'Not Choose any table'.
ENDIF.
  ENDFORM.                               " CHOS_INDX_TAB
  *&---------------------------------------------------------------------*
*&      FormCHSE_VIEW_FIELD
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*-->p1      text
*<--p2      text
*----------------------------------------------------------------------*
FORM CHSE_VIEW_FIELD.
REFRESH FCODE_TAB.
  FCODE_TAB = 'CHSE'.
APPEND FCODE_TAB.
FCODE_TAB = 'GRAF'.
APPEND FCODE_TAB.
  SY-LSIND = SY-LSIND - 1.
SET TITLEBAR 'W04' WITH ITAB_TAB-TAB.
SET PF-STATUS 'PFSTA04' EXCLUDING FCODE_TAB.
REFRESH ITAB_FIELD.
SELECT * FROM DD03L
         WHERE TABNAME = ITAB_TAB-TAB
         ORDER BY POSITION.
    ITAB_FIELD-FIELD = DD03L-FIELDNAME.
    SELECT SINGLE DDTEXT FROM DD04T
                         INTO ITAB_FIELD-TEXT
                         WHERE ROLLNAME = DD03L-ROLLNAME
                           AND DDLANGUAGE = '3'.
    APPEND ITAB_FIELD.
ENDSELECT.
LOOP AT ITAB_FIELD.
    WRITE: /3 ITAB_FIELD-FIELD COLOR 4, ITAB_FIELD-TEXT COLOR 2.
ENDLOOP.
CLEAR ITAB_TAB-TAB.
  ENDFORM.                               " CHSE_VIEW_FIELD
  *&---------------------------------------------------------------------*
*&      FormCHSE_FIELD_DIST
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*-->p1      text
*<--p2      text
*----------------------------------------------------------------------*
FORM CHSE_FIELD_DIST.
SY-LSIND = SY-LSIND - 1.
SET TITLEBAR 'W06'.
SET PF-STATUS 'PFSTA04' EXCLUDING 'GRAF'.
REFRESH ITAB_FIELD.
SELECT * FROM DD03L
         WHERE TABNAME = ITAB_TAB-TAB
         ORDER BY POSITION.
    ITAB_FIELD-FIELD = DD03L-FIELDNAME.
    SELECT SINGLE DDTEXT FROM DD04T
                         INTO ITAB_FIELD-TEXT
                         WHERE ROLLNAME = DD03L-ROLLNAME
                           AND DDLANGUAGE = '3'.
    APPEND ITAB_FIELD.
ENDSELECT.
LOOP AT ITAB_FIELD.
    WRITE: /3 ITAB_FIELD-FIELD COLOR 4, ITAB_FIELD-TEXT COLOR 2.
    HIDE ITAB_FIELD-FIELD.
ENDLOOP.
CLEAR ITAB_FIELD-FIELD.
ENDFORM.                               " CHSE_FIELD_DIST
  *&---------------------------------------------------------------------*
*&      FormEXEC_SASC
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*-->p1      text
*<--p2      text
*----------------------------------------------------------------------*
FORM EXEC_SASC.
DATA: POSITION TYPE I.
  POSITION = SY-STACO + SY-CUCOL.
LOOP AT ITAB_LEN.
    IF ITAB_LEN-LEN > POSITION.
      READ TABLE ITAB_COL INDEX SY-TABIX.
      PERFORM SQL_GENERATE USING 'N' ITAB_COL-COL 'A'."INIT FLAG = 'N'
      IF SY-SUBRC <> 0.
      EXIT.
      ENDIF.
      PERFORM EXEC_SQL.
      EXIT.
    ENDIF.
ENDLOOP.
  ENDFORM.                               " EXEC_SASC
  *&---------------------------------------------------------------------*
*&      FormEXEC_SDES
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*-->p1      text
*<--p2      text
*----------------------------------------------------------------------*
FORM EXEC_SDES.
DATA: POSITION TYPE I.
  POSITION = SY-STACO + SY-CUCOL.
LOOP AT ITAB_LEN.
    IF ITAB_LEN-LEN > POSITION.
      READ TABLE ITAB_COL INDEX SY-TABIX.
      PERFORM SQL_GENERATE USING 'N' ITAB_COL-COL 'D'."INIT FLAG = 'N'
      IF SY-SUBRC <> 0.
      EXIT.
      ENDIF.
      PERFORM EXEC_SQL.
      EXIT.
    ENDIF.
ENDLOOP.
  ENDFORM.                               " EXEC_SDES
  *&---------------------------------------------------------------------*
*&      FormWRITE_INDEX_HIER
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*-->p1      text
*<--p2      text
*----------------------------------------------------------------------*
FORM WRITE_INDEX_HIER.
SY-LSIND = 3.
READ CURRENT LINE.
READ TABLE ITAB_INDEX WITH KEY INDEX = ITAB_INDEX-INDEX.
IF ITAB_INDEX-PLUS = '3'.
    ITAB_INDEX-PLUS = '4'.
ELSE.
    ITAB_INDEX-PLUS = '3'.
ENDIF.
MODIFY ITAB_INDEX INDEX SY-TABIX.
PERFORM WRITE_INDEX.
CLEAR ITAB_INDEX-INDEX.
  ENDFORM.                               " WRITE_INDEX_HIER
  *&---------------------------------------------------------------------*
*&      FormSEL_FIELD_DIST
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*-->p1      text
*<--p2      text
*----------------------------------------------------------------------*
FORM SEL_FIELD_DIST.
REFRESH ITAB_DIST.
  SY-LSIND = SY-LSIND - 1.
SET TITLEBAR 'W07' WITH ITAB_FIELD-FIELD ITAB_TAB-TAB.
SET PF-STATUS 'PFSTA04' EXCLUDING 'CHSE'.
  PERFORM GET_ITAB_DIST.
  GENERATE SUBROUTINE POOL ITAB_DIST NAME PROG
                                     MESSAGE MSG.
IF SY-SUBRC <> 0.
    MSG_TEXT = MSG+(80).
    WRITE: /1 MSG_TEXT.
    MSG_TEXT = MSG+80(40).
    WRITE: /1 MSG_TEXT.
ELSE.
    PERFORM DYN2 IN PROGRAM (PROG).
ENDIF.
  CLEAR ITAB_FIELD-FIELD.
  ENDFORM.                               " SEL_FIELD_DIST
  *&---------------------------------------------------------------------*
*&      FormGET_ITAB_DIST
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*-->p1      text
*<--p2      text
*----------------------------------------------------------------------*
FORM GET_ITAB_DIST.
DATA: DOMNAME   LIKE DD03L-DOMNAME.
  SELECT SINGLE * FROM DD03L
                  WHERE TABNAME = ITAB_TAB-TAB
                  AND POSITION = '0001'.
  ITAB_DIST-CODE = 'PROGRAM SUBPOOL.'.
APPEND ITAB_DIST.
ITAB_DIST-CODE = 'DATA: BEGIN OF ITAB_DATA OCCURS 1,'.
APPEND ITAB_DIST.
CONCATENATE ITAB_TAB-TAB '-' ITAB_FIELD-FIELD INTO ITAB_DIST-CODE.
CONCATENATE 'COL1 LIKE' ITAB_DIST-CODE ','
            INTO ITAB_DIST-CODE SEPARATED BY SPACE.
APPEND ITAB_DIST.
ITAB_DIST-CODE = 'COL2(15) TYPE C,'.
APPEND ITAB_DIST.
ITAB_DIST-CODE = '       END OF ITAB_DATA.'.
APPEND ITAB_DIST.
ITAB_DIST-CODE = 'DATA: LIN_CNT TYPE I,'.
APPEND ITAB_DIST.
ITAB_DIST-CODE = '      D_RATE(5) TYPE P DECIMALS 2.'.
APPEND ITAB_DIST.
  ITAB_DIST-CODE = 'FORM DYN2.'.
APPEND ITAB_DIST.
ITAB_DIST-CODE = 'EXEC SQL PERFORMING WRITE_DATA.'.
APPEND ITAB_DIST.
CONCATENATE 'SELECT DISTINCT' ITAB_FIELD-FIELD ','
            'COUNT(' ITAB_FIELD-FIELD ')'
            INTO ITAB_DIST-CODESEPARATED BY SPACE.
APPEND ITAB_DIST.
ITAB_DIST-CODE = 'INTO :ITAB_DATA-COL1, :ITAB_DATA-COL2'.
APPEND ITAB_DIST.
CONCATENATE 'FROM' ITAB_TAB-TAB
            INTO ITAB_DIST-CODESEPARATED BY SPACE.
APPEND ITAB_DIST.
IF DD03L-FIELDNAME CP '*MANDT'.
    CONCATENATE 'WHERE' DD03L-FIELDNAME '= :SY-MANDT'
                INTO ITAB_DIST-CODESEPARATED BY SPACE.
    APPEND ITAB_DIST.
ENDIF.
CONCATENATE 'GROUP BY' ITAB_FIELD-FIELD
            INTO ITAB_DIST-CODESEPARATED BY SPACE.
APPEND ITAB_DIST.
ITAB_DIST-CODE = 'ENDEXEC.'.
APPEND ITAB_DIST.
  ITAB_DIST-CODE = 'DESCRIBE TABLE ITAB_DATA LINES LIN_CNT.'.
APPEND ITAB_DIST.
ITAB_DIST-CODE = 'WRITE: /1 ''Data Kinds      : '', LIN_CNT COLOR 3,'.
APPEND ITAB_DIST.
ITAB_DIST-CODE = '''Kinds''.'.
APPEND ITAB_DIST.
ITAB_DIST-CODE = 'D_RATE = 1 / LIN_CNT * 100.'.
APPEND ITAB_DIST.
ITAB_DIST-CODE = 'WRITE: /1 ''Distribute Rate : '', D_RATE COLOR 3,'.
APPEND ITAB_DIST.
ITAB_DIST-CODE = '''%''.'.
APPEND ITAB_DIST.
  SELECT SINGLE DOMNAME INTO DOMNAME
                        FROM DD03L
                        WHERE TABNAME = ITAB_TAB-TAB
                            AND FIELDNAME = ITAB_FIELD-FIELD.
IF SY-SUBRC = 0.
    SELECT SINGLE OUTPUTLEN INTO COL_LENGTH
                            FROM DD01L
                            WHERE DOMNAME = DOMNAME
                              AND AS4LOCAL = 'A'.
    ENDLEN = COL_LENGTH + 3 + 18 + 1.
ENDIF.
CONCATENATE'ULINE /1' '(' ENDLEN ')' '.' INTO ITAB_DIST-CODE.
APPEND ITAB_DIST.
ITAB_DIST-CODE = 'FORMAT COLOR 4.'.
APPEND ITAB_DIST.
CONCATENATE 'WRITE: /1 SY-VLINE, (' COL_LENGTH ')'
            INTO ITAB_DIST-CODE.
CONCATENATE ITAB_DIST-CODE '''' ITAB_FIELD-FIELD '''' ','
            'SY-VLINE, (15) ''Records'', SY-VLINE.'
            INTO ITAB_DIST-CODESEPARATED BY SPACE.
APPEND ITAB_DIST.
CONCATENATE'ULINE /1' '(' ENDLEN ')' '.' INTO ITAB_DIST-CODE.
APPEND ITAB_DIST.
ITAB_DIST-CODE = 'FORMAT COLOR 2.'.
APPEND ITAB_DIST.
ITAB_DIST-CODE = 'LOOP AT ITAB_DATA.'.
APPEND ITAB_DIST.
CONCATENATE 'WRITE: /1 SY-VLINE,' 'ITAB_DATA-COL1,'
            INTO ITAB_DIST-CODESEPARATED BY SPACE.
APPEND ITAB_DIST.
ITAB_DIST-CODE = 'SY-VLINE, ITAB_DATA-COL2, SY-VLINE.'.
APPEND ITAB_DIST.
ITAB_DIST-CODE = 'ENDLOOP.'.
APPEND ITAB_DIST.
CONCATENATE'ULINE /1' '(' ENDLEN ')' '.' INTO ITAB_DIST-CODE.
APPEND ITAB_DIST.
  ITAB_DIST-CODE = 'ENDFORM.'.
APPEND ITAB_DIST.
ITAB_DIST-CODE = 'FORM WRITE_DATA.'.
APPEND ITAB_DIST.
ITAB_DIST-CODE = 'APPEND ITAB_DATA.'.
APPEND ITAB_DIST.
ITAB_DIST-CODE = 'ENDFORM.'.
APPEND ITAB_DIST.
ENDFORM.                               " GET_ITAB_DIST
*&---------------------------------------------------------------------*
*&      FormCREATE_GRAF
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*-->p1      text
*<--p2      text
*----------------------------------------------------------------------*
FORM CREATE_GRAF.
DATA: BEGIN OF ITAB_GRAF OCCURS 1,
          DATA1(50) TYPE C,
          DATA2   TYPE I,
      END OF ITAB_GRAF.
  DATA: CUR_LINE TYPE I VALUE 6,
      INTO1(50) TYPE C,
      INTO2(17) TYPE C,
      DEL_CHAR TYPE C.
  DO.
    READ LINE CUR_LINE.
    IF SY-SUBRC <> 0.
      EXIT.
    ENDIF.
    SPLIT SY-LISEL AT '|' INTO DEL_CHAR INTO1 INTO2 DEL_CHAR.
    ITAB_GRAF-DATA1 = INTO1.
    ITAB_GRAF-DATA2 = INTO2.
    APPEND ITAB_GRAF.
    CUR_LINE = CUR_LINE + 1.
ENDDO.
  CALL FUNCTION 'GRAPH_2D'
       EXPORTING
            TITL = SY-TITLE
       TABLES
            DATA = ITAB_GRAF.
  ENDFORM.                               " CREATE_GRAF
*&---------------------------------------------------------------------*
*&      FormCONFIRM_UPDATE
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*-->p1      text
*<--p2      text
*----------------------------------------------------------------------*
FORM CONFIRM_UPDATE.
  CALL FUNCTION 'POPUP_TO_CONFIRM_STEP'
       EXPORTING
            TEXTLINE1 = 'Do you want to really UPDATE?'
            TITEL   = 'Exit'
       IMPORTING
            ANSWER    = CONFIRM_FLAG.
CASE CONFIRM_FLAG.
    WHEN 'N'. EXIT.
    WHEN 'A'. EXIT.
    WHEN 'J'.
ENDCASE.
CALL FUNCTION 'POPUP_TO_CONFIRM_STEP'
       EXPORTING
            TEXTLINE1 = '措翠阑 肋 秦具 邓聪促. 舅疽嚼聪鳖?'
            TITEL   = 'Exit'
       IMPORTING
            ANSWER    = CONFIRM_FLAG.
CASE CONFIRM_FLAG.
    WHEN 'N'. EXIT.
    WHEN 'A'.
    WHEN 'J'. EXIT.
ENDCASE.
CALL FUNCTION 'POPUP_TO_CONFIRM_STEP'
       EXPORTING
            TEXTLINE1 = '构窍矾 秒家甫 窍瘤夸? 馆亲钦聪鳖?'
            TITEL   = 'Exit'
       IMPORTING
            ANSWER    = CONFIRM_FLAG.
CASE CONFIRM_FLAG.
    WHEN 'N'. EXIT.
    WHEN 'A'. EXIT.
    WHEN 'J'.
ENDCASE.
CALL FUNCTION 'POPUP_TO_CONFIRM_STEP'
       EXPORTING
            TEXTLINE1 = '捞 扁瓷篮 穿备档 镜荐绝栏聪瘪 荤侩摹付技夸.'
            TITEL   = 'Exit'
       IMPORTING
            ANSWER    = CONFIRM_FLAG.
CASE CONFIRM_FLAG.
    WHEN 'N'. EXIT.
    WHEN 'A'.
    WHEN 'J'. EXIT.
ENDCASE.
CALL FUNCTION 'POPUP_TO_CONFIRM_STEP'
       EXPORTING
            TEXTLINE1 = '龙扁矫焙夸...荤侩窍矫登 酒林炼缴窍技夸.'
            TITEL   = 'Exit'
       IMPORTING
            ANSWER    = CONFIRM_FLAG.
CASE CONFIRM_FLAG.
    WHEN 'N'. EXIT.
    WHEN 'A'. EXIT.
    WHEN 'J'. PERFORM EXEC_SQL_UPDATE.
ENDCASE.
ENDFORM.                               " CONFIRM_UPDATE
  *&---------------------------------------------------------------------*
*&      FormEXEC_SQL_UPDATE
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*-->p1      text
*<--p2      text
*----------------------------------------------------------------------*
FORM EXEC_SQL_UPDATE.
ITAB_PROG-CODE = 'PROGRAM SUBPOOL MESSAGE-ID AT.'.
APPEND ITAB_PROG.
ITAB_PROG-CODE = 'DATA: COUNT TYPE I.'.
APPEND ITAB_PROG.
  ITAB_PROG-CODE = 'FORM DYN3.'.
APPEND ITAB_PROG.
ITAB_PROG-CODE = 'EXEC SQL.'.
APPEND ITAB_PROG.
  LOOP AT ITAB_SQL.
    ITAB_PROG-CODE = ITAB_SQL-CODE.
    APPEND ITAB_PROG.
ENDLOOP.
  ITAB_PROG-CODE = 'ENDEXEC.'.
APPEND ITAB_PROG.
  ITAB_PROG-CODE = 'MESSAGE I315 WITH ''performed'' SY-DBCNT'.
CONCATENATE ITAB_PROG-CODE '''' 'Records' '''' '.'
            INTO ITAB_PROG-CODE SEPARATED BY SPACE.
APPEND ITAB_PROG.
  ITAB_PROG-CODE = 'ENDFORM.'.
APPEND ITAB_PROG.
  GENERATE SUBROUTINE POOL ITAB_PROG NAME PROG
                                     MESSAGE MSG.
IF SY-SUBRC <> 0.
    MSG_TEXT = MSG+(80).
    WRITE: /1 MSG_TEXT.
    MSG_TEXT = MSG+80(40).
    WRITE: /1 MSG_TEXT.
ELSE.
    PERFORM DYN3 IN PROGRAM (PROG).
ENDIF.
  ENDFORM.                               " EXEC_SQL_UPDATE
*&---------------------------------------------------------------------*
*&      FormCHECK_SQL_CODE
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*-->p1      text
*<--p2      text
*----------------------------------------------------------------------*
FORM CHECK_SQL_CODE.
DATA: BEGIN OF VALUE_TAB OCCURS 20.
          INCLUDE STRUCTURE EXPL_VALUE.
DATA: END OF VALUE_TAB.
  DATA: STATEMENT(32000).
DATA: LENGTH TYPE I.
  LOOP AT ITAB_SQL.
    CONCATENATE STATEMENT ITAB_SQL-CODE INTO STATEMENT
                                        SEPARATED BY SPACE.
ENDLOOP.
  LENGTH = STRLEN( STATEMENT ).
CALL 'DB_EXPLAIN_PLAN'
       ID 'STATEMENT' FIELD STATEMENT
       ID 'LENGTH'    FIELD LENGTH
       ID 'VALUES'    FIELD VALUE_TAB.
  ENDFORM.                               " CHECK_SQL_CODE
*&---------------------------------------------------------------------*
*&      FormSQL_GENERATE
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*-->p1      text
*<--p2      text
*----------------------------------------------------------------------*
FORM SQL_GENERATE USING INIT_FLAG ORDER_COL SORT_FLAG.
DATA: ORDER_TABIX LIKE SY-TABIX.
  IF INIT_FLAG = 'N'.
    SEARCH ITAB_PROG FOR 'ORDER BY'.
    IF SY-SUBRC = 0.
      READ TABLE ITAB_PROG INDEX SY-TABIX.
      IF SORT_FLAG = 'A'.
      CONCATENATE 'ORDER BY' ORDER_COL
                  INTO ITAB_PROG-CODE SEPARATED BY SPACE.
      ELSE.
      CONCATENATE 'ORDER BY' ORDER_COL 'DESC'
                  INTO ITAB_PROG-CODE SEPARATED BY SPACE.
      ENDIF.
      MODIFY ITAB_PROG INDEX SY-TABIX.
  ORDER_TABIX = SY-TABIX + 1.
      LOOP AT ITAB_PROG FROM ORDER_TABIX.
      IF ITAB_PROG-CODE+(7) = 'ENDEXEC'.
          EXIT.
      ENDIF.
      DELETE ITAB_PROG INDEX SY-TABIX.
      ENDLOOP.
    ENDIF.
ENDIF.
  GENERATE SUBROUTINE POOL ITAB_PROG NAME PROG
                                     MESSAGE MSG.
IF SY-SUBRC <> 0.
    MSG_TEXT = MSG+(80).
    WRITE: /1 MSG_TEXT.
    MSG_TEXT = MSG+80(40).
    WRITE: /1 MSG_TEXT.
ENDIF.
  ENDFORM.                               " SQL_GENERATE
*&---------------------------------------------------------------------*
*&      FormSQL_UPLOAD
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*-->p1      text
*<--p2      text
*----------------------------------------------------------------------*
FORM SQL_UPLOAD.
CALL FUNCTION 'UPLOAD'
       EXPORTING
            FILENAME            = 'C:\TEMP\SQL.TXT'
            FILETYPE            = 'asc'
       IMPORTING
            FILESIZE            = FILESIZE
       TABLES
            DATA_TAB            = ITAB_SQL
       EXCEPTIONS
            CONVERSION_ERROR    = 1
            INVALID_TABLE_WIDTH = 2
            INVALID_TYPE      = 3
            NO_BATCH            = 4
            UNKNOWN_ERROR       = 5.
  ENDFORM.                               " SQL_UPLOAD
  *&---------------------------------------------------------------------*
*&      FormSQL_DOWNLOAD
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*-->p1      text
*<--p2      text
*----------------------------------------------------------------------*
FORM SQL_DOWNLOAD.
CALL FUNCTION 'DOWNLOAD'
       EXPORTING
            FILENAME = 'C:\TEMP\SQL.TXT'
            FILETYPE = 'asc'
       TABLES
            DATA_TAB = ITAB_SQL.
  ENDFORM.                               " SQL_DOWNLOAD
*&---------------------------------------------------------------------*
*&      FormGET_ITAB_COL_ALL
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*-->p1      text
*<--p2      text
*----------------------------------------------------------------------*
FORM GET_ITAB_COL_ALL.
REFRESH ITAB_COL.
  READ TABLE ITAB_TAB INDEX 1.
  SELECT * FROM DD03L
         WHERE TABNAME = ITAB_TAB-TAB
         ORDER BY POSITION.
    ITAB_COL-COL = DD03L-FIELDNAME.
    APPEND ITAB_COL.
ENDSELECT.
  ENDFORM.                               " GET_ITAB_COL_ALL
页: [1]
查看完整版本: sap zsql 制作