动态执行程序
来源:互联网 发布:怎么做淘宝 编辑:程序博客网 时间: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
阅读全文
0 0
- 动态执行程序
- 程序的动态执行过程
- Main方法传递参数执行动态程序
- 程序数据动态执行与存储器功能
- 程序的并行序型与程序的动态执行
- 利用CodeDom和反射动态编译并执行程序集
- 查看可以执行程序需要哪些动态库
- [MFC]动态控件实现 程序执行流程 [大三TJB_708]
- 动态加载并执行Win32可执行程序(上)
- 动态加载并执行Win32可执行程序(下)
- 如何在程序中执行动态生成的Delphi代码
- java程序执行过程中动态加载jar包
- java程序中动态加载jar包并执行
- 程序执行
- 使用脚本引擎增加程序运行时动态执行能力(Java篇)
- 如何查看一个运行的exe执行程序需要有哪些DLL动态链接库
- 如何将程序的执行文件和静态加载动态库放在不同的目录
- 静态库改为动态库后,可以影响到程序的执行结果
- AsyncTask的简单使用
- 机器学习常用算法
- 最小生成树模板
- Shader 简单的积雪效果说明
- 再不了解一下征信,你就真的out了!
- 动态执行程序
- FWT——学习笔记
- Codevs 1200 同余方程
- ASP.NET 用MultiView和View实现选项卡效果
- HTTP常用状态码对照表
- JavaScript中的正则表达式
- 基于肤色和眼睛定位的人脸检测算法——MATLAB实现
- 【python学习笔记】17:numpy数组排序
- python 重定向获取真实url