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