动态执行程序

来源:互联网 发布:怎么做淘宝 编辑:程序博客网 时间:2024/06/16 08:58
  CASE ok_code.    WHEN 'EXCU'.      CLEAR ok_code.      IF gv_report IS INITIAL.        PERFORM frm_split_sql.        PERFORM frm_execute_query.        PERFORM frm_execute_update.        PERFORM frm_display.      ELSE.        CLEAR gv_msg.        PERFORM frm_check_syntax.        CHECK gv_msg IS INITIAL.        PERFORM frm_runreport.      ENDIF.    WHEN 'EDIT'.      CLEAR ok_code.      PERFORM frm_edit_call USING 'X'.    WHEN 'SYNT'.      CLEAR gv_msg.      PERFORM frm_check_syntax.  ENDCASE.
*----------------------------------------------------------------------****INCLUDE ZOSQL_QUERY_F01 .*----------------------------------------------------------------------**&---------------------------------------------------------------------**&      Form  FRM_INIT*&---------------------------------------------------------------------**       text*----------------------------------------------------------------------**  -->  p1        text*  <--  p2        text*----------------------------------------------------------------------*FORM frm_init .  IF go_container IS INITIAL.    CREATE OBJECT go_container      EXPORTING        container_name = 'CODE'.  ENDIF.  IF go_sql IS INITIAL.    CREATE OBJECT go_sql      EXPORTING*        max_number_chars       = 2000        style                  = 0*     WORDWRAP_MODE          = WORDWRAP_AT_WINDOWBORDER        wordwrap_position      = -1*     WORDWRAP_TO_LINEBREAK_MODE = FALSE*     FILEDROP_MODE          = DROPFILE_EVENT_OFF        parent                 = go_container.  ENDIF.*  CALL METHOD go_sql->set_readonly_mode*    EXPORTING*      readonly_mode          = 1*    EXCEPTIONS*      error_cntl_call_method = 1*      invalid_parameter      = 2*      OTHERS                 = 3.**  CALL METHOD go_sql->set_toolbar_mode*    EXPORTING*      toolbar_mode           = 0*    EXCEPTIONS*      error_cntl_call_method = 1*      invalid_parameter      = 2*      OTHERS                 = 3.*  CALL METHOD go_sql->protect_lines*    EXPORTING*      from_line                     = 1*      protect_mode                  = 1*      to_line                       = 1*      enable_editing_protected_text = 0*    EXCEPTIONS*      error_cntl_call_method        = 1*      invalid_parameter             = 2*      OTHERS                        = 3.ENDFORM.                    " FRM_INIT*&---------------------------------------------------------------------**&      Form  FRM_SPLIT_SQL*&---------------------------------------------------------------------**       text*----------------------------------------------------------------------**  -->  p1        text*  <--  p2        text*----------------------------------------------------------------------*FORM frm_split_sql .  DATA : lt_line TYPE STANDARD TABLE OF tt_line,         ls_line TYPE tdline,         ls_sql  TYPE string,         ls_sel  TYPE string,         ls_from TYPE string,         ls_whe  TYPE string,         ls_spc  TYPE string,         lv_tab  TYPE tabname,         lv_inx  TYPE i,         lv_pos  TYPE i.  DATA : BEGIN OF lt_split OCCURS 0,          fld TYPE char50,         END OF lt_split,         BEGIN OF lt_as OCCURS 0,           tabname TYPE tabname,           as      TYPE char10,         END OF lt_as,         ls_split LIKE LINE OF lt_split.  REFRESH:gt_fieldcat,gt_fieldcat_tab,gt_fields,gt_where.  CLEAR  :gs_fieldcat,gs_fields,gs_sel,gs_where,gs_from.  CALL METHOD go_sql->get_text_as_r3table    IMPORTING      table                  = lt_line    EXCEPTIONS      error_dp               = 1      error_cntl_call_method = 2      error_dp_create        = 3      potential_data_loss    = 4      OTHERS                 = 5.  LOOP AT lt_line INTO ls_line.    CONCATENATE ls_sql ls_line INTO ls_sql SEPARATED BY space.  ENDLOOP.  IF sy-subrc <> 0.    MESSAGE e001(00) WITH 'empty'.  ENDIF.  CHECK ls_sql IS NOT INITIAL.  REPLACE FIRST OCCURRENCE OF '.' IN ls_sql WITH space.  REPLACE FIRST OCCURRENCE OF ';' IN ls_sql WITH space.  CONDENSE ls_sql.  TRANSLATE ls_sql TO UPPER CASE.  IF ls_sql CS 'SELECT'.    gv_type = 'SELECT'.  ELSEIF ls_sql CS 'UPDATE' OR ls_sql CS 'INSERT' OR ls_sql CS 'DELETE'.    gv_type = 'UPDATE'.  ELSE.    gv_type = 'OTHERS'.  ENDIF.  CASE gv_type.    WHEN 'SELECT'.      SPLIT ls_sql  AT 'FROM'  INTO ls_sel ls_from.      CONDENSE:ls_sel,ls_from.      SPLIT ls_from AT 'WHERE' INTO ls_from ls_whe.      CONDENSE:ls_sel,ls_from.      IF ls_from CS 'AS'.        SPLIT ls_from AT space INTO TABLE lt_split.        WHILE 1 = 1.          LOOP AT lt_split FROM lv_inx WHERE fld = 'AS'.            lv_pos = sy-tabix - 1.            READ TABLE lt_split INTO ls_split INDEX lv_pos.            lt_as-tabname = ls_split-fld.            lv_pos = lv_pos + 2.            READ TABLE lt_split INTO ls_split INDEX lv_pos.            lt_as-as = ls_split-fld.            APPEND lt_as.            CLEAR:lt_as,ls_split,lt_split.            lv_inx = lv_pos.          ENDLOOP.          IF sy-subrc <> 0.            EXIT.          ENDIF.        ENDWHILE.      ENDIF.      REPLACE FIRST OCCURRENCE OF 'SELECT' IN ls_sel WITH space.      IF sy-subrc <> 0.        MESSAGE e001(00) WITH 'only select'.        EXIT.      ENDIF.      CONDENSE ls_sel.      IF ls_sel = '*'.        SPLIT ls_from AT space   INTO lv_tab ls_spc.        CONDENSE:ls_from.        SELECT fieldname INTO TABLE gt_fields FROM dd03l WHERE tabname = lv_tab AND as4local = 'A' AND comptype = 'E'.      ELSE.        SPLIT ls_sel  AT space   INTO TABLE gt_fields.      ENDIF.      LOOP AT gt_fields INTO gs_fields.        SPLIT gs_fields-fieldname AT '~' INTO gs_fieldcat-tabname gs_fieldcat-fieldname.        IF gs_fieldcat-fieldname IS INITIAL.          gs_fieldcat-fieldname = gs_fieldcat-tabname.          gs_fieldcat-tabname   = ls_from.        ENDIF.        READ TABLE lt_as WITH KEY as = gs_fieldcat-tabname.        IF sy-subrc = 0.          gs_fieldcat-tabname = lt_as-tabname.        ENDIF.        APPEND gs_fieldcat TO gt_fieldcat.        CLEAR:gs_fields,gs_fieldcat.      ENDLOOP.      gs_from        = ls_from.      gs_sel         = ls_sel.      gt_code[]      = lt_line.      gs_where-where = ls_whe.    WHEN 'UPDATE'.      gt_code[]      = lt_line.    WHEN OTHERS.      MESSAGE e001(00) WITH 'Unknow option'.  ENDCASE.  REFRESH lt_line.ENDFORM.                    " FRM_SPLIT_SQL*&---------------------------------------------------------------------**&      Form  FRM_EXECUTE_QUERY*&---------------------------------------------------------------------**       text*----------------------------------------------------------------------**  -->  p1        text*  <--  p2        text*----------------------------------------------------------------------*FORM frm_execute_query .  DATA: ldtab_cell     TYPE REF TO data.  DATA: lo_err         TYPE REF TO cx_sy_dynamic_osql_semantics.  CHECK gv_type = 'SELECT'.  LOOP AT gt_fieldcat INTO gs_fieldcat.    gs_fieldcat_tab-fieldname = gs_fieldcat-fieldname.    gs_fieldcat_tab-ref_field = gs_fieldcat-fieldname.    gs_fieldcat_tab-ref_table = gs_fieldcat-tabname.    APPEND gs_fieldcat_tab TO gt_fieldcat_tab.    CLEAR:gs_fieldcat_tab,gs_fieldcat.  ENDLOOP.  CALL METHOD cl_alv_table_create=>create_dynamic_table    EXPORTING      it_fieldcatalog           = gt_fieldcat_tab    IMPORTING      ep_table                  = ldtab_cell    EXCEPTIONS      generate_subpool_dir_full = 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.    EXIT.  ENDIF.  ASSIGN ldtab_cell->* TO <data>.  PERFORM frm_runtime_start.  CLEAR gv_msg.  TRY.      SELECT (gt_fields)        FROM (gs_from)        INTO TABLE <data>        WHERE (gs_where).      IF sy-subrc <> 0.        MESSAGE e001(00) WITH 'no data'.      ENDIF.    CATCH cx_sy_dynamic_osql_semantics INTO lo_err.      gv_msg = lo_err->get_text( ).  ENDTRY.  PERFORM frm_runtime_end.ENDFORM.                    " FRM_EXCUTE_QUERY*&---------------------------------------------------------------------**&      Form  FRM_RUNTIME_START*&---------------------------------------------------------------------**       text*----------------------------------------------------------------------*FORM frm_runtime_start.  GET TIME STAMP FIELD t1.  CONVERT TIME STAMP t1 TIME ZONE sy-zonlo INTO DATE dat1 TIME tim1.ENDFORM.                    "FRM_RUNTIME_START*&---------------------------------------------------------------------**&      Form  FRM_RUNTIME_END*&---------------------------------------------------------------------**       text*----------------------------------------------------------------------*FORM frm_runtime_end.  GET TIME STAMP FIELD t2.  CONVERT TIME STAMP t1 TIME ZONE sy-zonlo INTO DATE dat2 TIME tim2.  t = t2 - t1.  IF t = 0.    t = space.  ENDIF.  IF tim1 = '000000'.    tim1 = space.  ENDIF.  IF tim2 = '000000'.    tim2 = space.  ENDIF.  CALL FUNCTION 'SWI_DURATION_DETERMINE'    EXPORTING      start_date = dat1      end_date   = dat2      start_time = tim1      end_time   = tim2    IMPORTING      duration   = runtime.  CALL FUNCTION 'MONI_TIME_CONVERT'    EXPORTING      ld_duration        = runtime    IMPORTING      lt_output_duration = outtime.ENDFORM.                    "FRM_RUNTIME_END*&---------------------------------------------------------------------**&      Form  frm_exEcute_update*&---------------------------------------------------------------------**       text*----------------------------------------------------------------------*FORM frm_execute_update.  DATA itab_prog TYPE STANDARD TABLE OF tdline.  DATA ls_line   TYPE tdline.  DATA prog      TYPE program.  DATA msg(120)  TYPE c.  CHECK gv_type = 'UPDATE'.* Modify Program ABAP Code.  CONCATENATE 'PROGRAM ZSQLUPDATE_' sy-datum ' MESSAGE-ID AT.' INTO ls_line.  APPEND ls_line TO itab_prog.  ls_line = 'DATA: COUNT TYPE I.'.  APPEND ls_line TO itab_prog.  ls_line = 'DATA: exc_ref    TYPE REF TO cx_sy_native_sql_error.'.  APPEND ls_line TO itab_prog.  ls_line = 'FORM FRM_UPDATE CHANGING CV_LINE TYPE I CV_MSG TYPE BAPI_MSG.'.  APPEND ls_line TO itab_prog.  ls_line = 'TRY.'.  APPEND ls_line TO itab_prog.  ls_line = 'EXEC SQL.'.  APPEND ls_line TO itab_prog.  LOOP AT gt_code INTO ls_line.    REPLACE FIRST OCCURRENCE OF '.' IN ls_line WITH space.    REPLACE FIRST OCCURRENCE OF ';' IN ls_line WITH space.    APPEND ls_line TO itab_prog.  ENDLOOP.  ls_line = 'ENDEXEC.'.  APPEND ls_line TO itab_prog.  ls_line = 'CV_LINE = SY-DBCNT.'.  APPEND ls_line TO itab_prog.  ls_line = 'CATCH cx_sy_native_sql_error INTO exc_ref.'.  APPEND ls_line TO itab_prog.  ls_line = 'cv_msg = exc_ref->get_text( ).'.  APPEND ls_line TO itab_prog.  ls_line = 'ENDTRY.'.  APPEND ls_line TO itab_prog.  ls_line = 'ENDFORM.'.  APPEND ls_line TO itab_prog.* Dynamic Program Display*  IF sy-ucomm = 'EDEX'.*    CALL FUNCTION 'EDITOR_APPLICATION'*      EXPORTING*        application = 'BF'*        display     = ' '*        name        = 'Modify Program...'*      IMPORTING*        fcode       = fcode*      TABLES*        content     = itab_prog.*    STOP.*  ENDIF.* Dynamic Program Excuted  CLEAR gv_msg.  GENERATE SUBROUTINE POOL itab_prog NAME prog                                     MESSAGE msg.  IF sy-subrc <> 0.    gv_msg = msg.  ELSE.    PERFORM frm_runtime_start.    PERFORM frm_update IN PROGRAM (prog) CHANGING gv_line gv_msg.    PERFORM frm_runtime_end.  ENDIF.  REFRESH itab_prog.ENDFORM.                    "frm_excute_update*&---------------------------------------------------------------------**&      Form  FRM_DISPLAY*&---------------------------------------------------------------------**       text*----------------------------------------------------------------------**  -->  p1        text*  <--  p2        text*----------------------------------------------------------------------*FORM frm_display .  DATA : ls_layout TYPE lvc_s_layo.  CHECK gv_type = 'SELECT' OR gv_report = 'X'.  CHECK <data> IS ASSIGNED AND <data> IS NOT INITIAL.  ls_layout-zebra = 'X'.  ls_layout-cwidth_opt = 'X'.  IF go_cont_alv IS INITIAL.    CREATE OBJECT go_cont_alv      EXPORTING        container_name = 'LIST'.  ENDIF.  IF go_alv IS INITIAL.    CREATE OBJECT go_alv      EXPORTING        i_parent = go_cont_alv.  ENDIF.  DESCRIBE TABLE <data> LINES gv_line.  CALL METHOD go_alv->set_table_for_first_display    EXPORTING      i_save                        = 'A'      i_default                     = 'X'      is_layout                     = ls_layout    CHANGING      it_outtab                     = <data>      it_fieldcatalog               = gt_fieldcat_tab    EXCEPTIONS      invalid_parameter_combination = 1      program_error                 = 2      too_many_lines                = 3      OTHERS                        = 4.*  ELSE.*    DATA ls_ref TYPE lvc_s_stbl.*    ls_ref-row = 'X'.*    ls_ref-col = 'X'.**    CALL METHOD go_alv->refresh_table_display*      EXPORTING*        is_stable      = ls_ref**        i_soft_refresh =*      EXCEPTIONS*        finished       = 1*        OTHERS         = 2.*  ENDIF.ENDFORM.                    " FRM_DISPLAY*&---------------------------------------------------------------------**&      Form  frm_check_syntax*&---------------------------------------------------------------------**       text*----------------------------------------------------------------------*FORM frm_check_syntax.  CLEAR ok_code.  CHECK gv_report = 'X'.  CHECK gt_code IS NOT INITIAL.  DATA lv_report TYPE sy-repid.  DATA returncode TYPE sy-subrc.  DATA ld_trdir   TYPE trdir.  DATA lt_warr    TYPE STANDARD TABLE OF rslinlmsg.  DATA lt_errs    TYPE STANDARD TABLE OF rslinlmsg.  CONCATENATE 'Y==%' sy-uname '%_' sy-datum sy-uzeit INTO lv_report.  INSERT REPORT lv_report FROM gt_code.* EDITOR-CALL FOR REPORT lv_report DISPLAY-MODE.  SELECT SINGLE * INTO ld_trdir FROM trdir WHERE name = lv_report.  CALL FUNCTION 'EDITOR_SYNTAX_CHECK'    EXPORTING      i_program       = lv_report      i_trdir         = ld_trdir*          i_corrwarn      = 'X'    IMPORTING      o_error_subrc   = returncode      o_error_message = gv_msg    TABLES      i_source        = gt_code      o_warnings_tab  = lt_warr      o_error_tab     = lt_errs    EXCEPTIONS      OTHERS          = 1.  DELETE REPORT lv_report.  COMMIT WORK.ENDFORM.                    "frm_check_syntax*&---------------------------------------------------------------------**&      Form  FRM_EDIT_CALL*&---------------------------------------------------------------------**       text*----------------------------------------------------------------------**  -->  p1        text*  <--  p2        text*----------------------------------------------------------------------*FORM frm_edit_call USING uv_flag.  DATA lt_code      TYPE  STANDARD TABLE OF tt_line.  DATA ls_code      TYPE tt_line.  lt_code = gt_code.  CALL METHOD go_sql->get_text_as_r3table    IMPORTING      table                  = gt_code[]    EXCEPTIONS      error_dp               = 1      error_cntl_call_method = 2      error_dp_create        = 3      potential_data_loss    = 4      OTHERS                 = 5.*  EDITOR-CALL FOR REPORT 'YTEST_001'.  EDITOR-CALL FOR gt_code.  IF sy-subrc = 0.    DELETE gt_code WHERE tdline(1) = '*' OR tdline IS INITIAL.    IF lt_code <> gt_code.      CALL METHOD go_sql->set_text_as_r3table        EXPORTING          table           = gt_code[]        EXCEPTIONS          error_dp        = 1          error_dp_create = 2          OTHERS          = 3.*      CHECK uv_flag = 'X' AND gv_report IS INITIAL.*      PERFORM frm_split_sql.*      PERFORM frm_execute_query.*      PERFORM frm_display.    ENDIF.  ENDIF.ENDFORM.                    " FRM_EDIT_CALL*&---------------------------------------------------------------------**&      Form  FRM_INIT_EDITOR*&---------------------------------------------------------------------**       text*----------------------------------------------------------------------**  -->  p1        text*  <--  p2        text*----------------------------------------------------------------------*FORM frm_init_editor .  IF go_container IS INITIAL.    CREATE OBJECT go_container      EXPORTING        container_name = 'ABAP'.  ENDIF.  IF go_editor IS INITIAL.    CREATE OBJECT go_editor      EXPORTING        mode              = 'EDIT'        link_dynnr        = sy-dynnr        content           = gt_code        control_container = 'ABAP'.  ENDIF.ENDFORM.                    " FRM_INIT_EDITOR*&---------------------------------------------------------------------**&      Form  FRM_EXECUTE_STATEMENT*&---------------------------------------------------------------------**       text*----------------------------------------------------------------------**  -->  p1        text*  <--  p2        text*----------------------------------------------------------------------*FORM frm_execute_statement .ENDFORM.                    " FRM_EXECUTE_STATEMENT*&---------------------------------------------------------------------**&      Form  frm_runreport*&---------------------------------------------------------------------**       text*----------------------------------------------------------------------*FORM frm_runreport.  DATA prog      TYPE program.  DATA msg(120)  TYPE c.  DATA it_fieldcat TYPE slis_t_fieldcat_alv.  TYPES tt_item TYPE c LENGTH 1024.  DATA it_data TYPE STANDARD TABLE OF tt_item.  REFRESH:it_fieldcat,it_data.  IF gt_code IS INITIAL.    CALL METHOD go_sql->get_text_as_r3table      IMPORTING        table                  = gt_code      EXCEPTIONS        error_dp               = 1        error_cntl_call_method = 2        error_dp_create        = 3        potential_data_loss    = 4        OTHERS                 = 5.  ENDIF.  CHECK gt_code IS NOT INITIAL.  GENERATE SUBROUTINE POOL gt_code NAME prog                                   MESSAGE msg.  IF sy-subrc = 0.    gv_msg = ''.    PERFORM frm_runtime_start.    PERFORM frm_get_data IN PROGRAM (prog) TABLES it_fieldcat it_data IF FOUND.    PERFORM frm_runtime_end.    PERFORM frm_conv_fieldcat TABLES it_fieldcat it_data.    PERFORM frm_display.  ELSE.    gv_msg = msg.  ENDIF.ENDFORM.                    "frm_runreport*&---------------------------------------------------------------------**&      Form  FRM_CONV_FIELDCAT*&---------------------------------------------------------------------**       text*----------------------------------------------------------------------**      -->IT_FIELDCAT  text*----------------------------------------------------------------------*FORM frm_conv_fieldcat TABLES it_fieldcat TYPE slis_t_fieldcat_alv it_data.  DATA: ldtab_cell     TYPE REF TO data.  DATA: ldtab_line     TYPE REF TO data.  DATA: ls_item        TYPE c LENGTH 1024.  DATA ls_fieldcat TYPE slis_fieldcat_alv.  FIELD-SYMBOLS : <fs_value> TYPE x,                  <fs_input> TYPE x.  REFRESH gt_fieldcat_tab.  CHECK it_fieldcat[] IS NOT INITIAL AND it_data[] IS NOT INITIAL.  LOOP AT it_fieldcat INTO ls_fieldcat.    MOVE:    ls_fieldcat-fieldname       TO gs_fieldcat_tab-fieldname,    ls_fieldcat-seltext_l       TO gs_fieldcat_tab-scrtext_l,    ls_fieldcat-seltext_m       TO gs_fieldcat_tab-scrtext_m,    ls_fieldcat-seltext_s       TO gs_fieldcat_tab-scrtext_s,    ls_fieldcat-outputlen       TO gs_fieldcat_tab-outputlen,    ls_fieldcat-inttype         TO gs_fieldcat_tab-inttype,    ls_fieldcat-intlen          TO gs_fieldcat_tab-intlen,    ls_fieldcat-qfieldname      TO gs_fieldcat_tab-qfieldname,    ls_fieldcat-edit_mask       TO gs_fieldcat_tab-edit_mask,    ls_fieldcat-round           TO gs_fieldcat_tab-decimals.    APPEND gs_fieldcat_tab      TO gt_fieldcat_tab.    CLEAR gs_fieldcat_tab.  ENDLOOP.  CALL METHOD cl_alv_table_create=>create_dynamic_table    EXPORTING      it_fieldcatalog           = gt_fieldcat_tab    IMPORTING      ep_table                  = ldtab_cell    EXCEPTIONS      generate_subpool_dir_full = 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.    EXIT.  ENDIF.  ASSIGN ldtab_cell->* TO <data>.  CREATE DATA ldtab_line LIKE LINE OF <data>.  ASSIGN ldtab_line->* TO <item>.  LOOP AT it_data INTO ls_item.    CATCH SYSTEM-EXCEPTIONS assign_casting_illegal_cast = 1.      ASSIGN ls_item TO <fs_value> CASTING.    ENDCATCH.    IF sy-subrc = 0.      ASSIGN <item> TO <fs_input> CASTING.      <fs_input> = <fs_value>.    ENDIF.    APPEND <item> TO <data>.  ENDLOOP.ENDFORM.                    "FRM_CONV_FIELDCAT*&---------------------------------------------------------------------**&      Form  FRM_REFRESH*&---------------------------------------------------------------------**       text*----------------------------------------------------------------------*FORM frm_refresh.ENDFORM.                    "FRM_REFRESH