Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- *&---------------------------------------------------------------------*
- *& Program : ZTOAD
- *& Author : S. Hermann
- *& Date : 17.08.2015
- *& Version : 3.1
- *& Required: Table ZTOAD
- *&---------------------------------------------------------------------*
- *& This program allow you to execute query directly on the server
- *& 1/ Write your query in the editor window (ABAP SQL)
- *& 2/ View the result in ALV window (in case of SELECT query)
- *&
- *3 Features :
- *& The top center pane allow you to write your query in ABAP SQL format.
- *= Query can be complex with JOIN, UNION and subqueries. You can write
- *= query on several lines. You could also add spaces.
- *= To add comment, start the line by * or prefix your comment by "
- *&
- *& You could write several queries in the query editor, separated by
- *= dot ".". To execute one of them, highlight all the wanted query,
- *= or just put the cursor anywhere inside the wanted query.
- *= By default, the last query is executed.
- *&
- *& In case of error, you can display generated code to help you to
- *= correct your query (only if you have S_DEVELOP access)
- *&
- *& The top left pane allow you to store your query :
- *& - You could save your query to reuse it later
- *& - You could share your query : define users, usergroup, all
- *& - You could export query into file to reuse it on another server
- *&
- *& The top right pane display ddic object that is currently used to help
- *= you to write the proper query
- *& Synergy with ZSPRO program : display tables defined in ZSPRO in the
- *= ddic tree
- *& Tips : You can search a table in the tree using header clic
- *&
- *3 Managed queries
- *& SELECT, INSERT, UPDATE, DELETE
- *&
- *3 Select Clause managed
- *& SELECT [DISTINCT / SINGLE] select clause
- *& FROM from clause
- *& [UP TO x ROWS]
- *& [WHERE cond1]
- *& [GROUP BY fields1]
- *& [HAVING cond2]
- *& [ORDER BY fields2]
- *& [UNION SELECT...]
- *&
- *& UP TO (Default max rows) ROWS added at end of query if omitted
- *&
- *& COUNT, AVG, MAX, MIN, SUM are managed
- *& DO NOT FORGET SPACE in ( ) of aggregat
- *&
- *& F1 Help is managed to help you on ABAP SQL Syntax
- *&
- *3 Insert special syntax
- *& In ABAP, insert query is always used with given structure
- *& In this SQL editor, you have 2 ways to do an INSERT :
- *& - By passing each value, 1 by 1
- *E INSERT SEOCLASSTX VALUES ( 'ZZMACLASS', ' ', 'Test claSS' )
- *&
- *& - By passing value of used fields only
- *E INSERT SEOCLASSTX SET CLSNAME = 'ZZMACLASS' DESCRIPT = 'TeSt class'
- *&
- *3 Sample of query :
- *&
- *E SELECT SINGLE * FROM VBAP WHERE VBELN = '00412345678'
- *&
- *E SELECT COUNT( * ) SUBC MAX( PROG ) FROM TRDIR GROUP BY SUBC
- *&
- *E SELECT VBAK~* from VBAK UP TO 3 ROWS ORDER BY VKORG.
- *&
- *E SELECT T1~VBELN T2~POSNR FROM VBAk AS T1
- *E JOIN VBAP AS T2 ON T1~VBELN = T2~VBELN
- *&
- *E INSERT SEOCLASSTX VALUES ( 'ZZMACLASS', ' ', 'Test claSS' )
- *&
- *E INSERT SEOCLASSTX SET CLSNAME = 'ZZMACLASS' DESCRIPT = 'TeSt class'
- *&
- *E UPDATE SEOCLASSTX SET DESCRIPT = 'txt' WHERE CLSNAME = 'ZZMACLASS'
- *&
- *E DELETE SEOCLASSTX WHERE CLSNAME = 'ZZMACLASS'
- *&
- *& Please send comment & improvements to http://quelquepart.biz
- *&---------------------------------------------------------------------*
- *& History :
- *& 2015.08.17 v3.1 :Add Manage drag&drop from DDIC tree to SQL Editor
- *& Mod Double clic on field in DDIC tree paste field
- *& in editor instead of filling clipboard
- *& Thanks to Shai Sinai for his suggestions
- *& Fix Issue with comment removing
- *& Add Ignore "into table" statement
- *& Add Ignore alias in field list
- *& 2015.06.13 v3.0 :Add INSERT, UPDATE, DELETE command
- *& Add Authorization management
- *& Add History tree display first query line if it
- *& is a comment line
- *& Mod Code cleaning
- *& 2015.03.05 v2.1.1:Mod grid size is no more changed before display
- *& query result
- *& 2015.01.11 v2.1 :Add UNION instruction managed to merge 2 queries
- *& Mod Do not refresh result grid for count(*)
- *& Mod Back close the grid instead of leave program if
- *& result grid is displayed
- *& Add Display program header as default help
- *& Add Run highlighted query
- *& Mod Documentation rewritten
- *& 2014.10.23 v2.0.2:Add Display number of entries found
- *& Add Confirmation before exit for unsaved queries
- *& 2014.10.19 v2.0.1:Fix bug on search ddic function
- *& 2014.08.03 v2.0 : Completely rewritten version
- *& - Save and share queries with colaborators
- *& - Queries are now saved in database
- *& - Display tables (+ fields) of the where clause
- *& - Display ZSPRO entries in ddic tree
- *& - Allow direct change in query after execution
- *& - Count( * ) allowed
- *& - Can display generated code
- *& - Display query execution time
- *& - Allow write of several queries (but 1 executed)
- *& 2013.12.03 v1.3 : Allow case sensitive constant in where clause
- *& 2012.08.30 v1.2 : Rewrite data definition to avoid dump on too long
- *& fieldname
- *& 2012.04.01 v1.1 : Updated to work also on BW system
- *& 2009.10.26 v1.0 : Initial release
- *&---------------------------------------------------------------------*
- * Modifications:
- * 1. Subroutine paste_to_editor: Add line break.
- * 2. Method handle_context_menu_repository: Add 'Delete All History'
- * function.
- * 3. Authorization checks impelementation was modified.
- * 4. Subroutine init_toolbar, method handle_toolbar_function_sel:
- * Create toolbar on right pane (above DDIC tree).
- * 5. Subroutines result_tab_extended_build, display_alv_data:
- * Add Count column.
- REPORT ztoad2.
- *######################################################################*
- *
- * CUSTOMIZATION SECTION
- *
- *######################################################################*
- CONSTANTS c_actvt_auth_display TYPE tactt-actvt VALUE '03'. "#EC NOTEXT
- CONSTANTS c_actvt_auth_create TYPE tactt-actvt VALUE '01'. "#EC NOTEXT
- CONSTANTS c_actvt_auth_change TYPE tactt-actvt VALUE '02'. "#EC NOTEXT
- CONSTANTS c_actvt_auth_delete TYPE tactt-actvt VALUE '06'. "#EC NOTEXT
- DATA : BEGIN OF s_auth, "#EC NEEDED
- * You could define your authorization object to restrict
- * function usage by user
- * If you dont define auth object, all users will have same access as
- * defined bellow
- * The auth object must manage 4 IDs.
- * ID must be : SELECT, INSERT, UPDATE, DELETE
- * FIELD contain allowed table name pattern
- * '*' to allow all table, 'Z*' to allow all specific tables...
- auth_object(20) TYPE c VALUE 'ZCA_TOAD',
- * Bellow is default AUTH used if no auth_object is defined
- * Allow SELECT query on SAP table (restricted by given pattern)
- select TYPE string VALUE '*',
- * Allow INSERT query on SAP table (restricted by given pattern)
- insert TYPE string VALUE 'NONE',
- * Allow UPDATE query on SAP table (restricted by given pattern)
- update TYPE string VALUE 'NONE',
- * Allow DELETE query on SAP table (restricted by given pattern)
- delete TYPE string VALUE 'NONE',
- END OF s_auth.
- *######################################################################*
- *
- * DATA SECTION
- *
- *######################################################################*
- * Objects
- CLASS lcl_application DEFINITION DEFERRED.
- * Screen objects
- DATA : o_handle_event TYPE REF TO lcl_application,
- o_container TYPE REF TO cl_gui_custom_container,
- o_splitter TYPE REF TO cl_gui_splitter_container,
- o_splitter_top TYPE REF TO cl_gui_splitter_container,
- o_splitter_right TYPE REF TO cl_gui_splitter_container,
- o_container_top TYPE REF TO cl_gui_container,
- o_container_right TYPE REF TO cl_gui_container,
- o_container_repository TYPE REF TO cl_gui_container,
- o_container_query TYPE REF TO cl_gui_container,
- o_container_ddic TYPE REF TO cl_gui_container,
- o_container_toolbar TYPE REF TO cl_gui_container,
- o_container_result TYPE REF TO cl_gui_container,
- * Editor data
- o_textedit TYPE REF TO cl_gui_abapedit,
- * Repository data
- o_tree_repository TYPE REF TO cl_gui_simple_tree,
- BEGIN OF s_node_repository.
- INCLUDE TYPE treev_node. "mtreesnode.
- DATA : text(100) TYPE c,
- edit(1) TYPE c,
- queryid TYPE ztoad-queryid,
- END OF s_node_repository,
- t_node_repository LIKE TABLE OF s_node_repository,
- o_toolbar TYPE REF TO cl_gui_toolbar,
- * DDIC data
- o_tree_ddic TYPE REF TO cl_gui_column_tree,
- t_node_ddic TYPE treev_ntab,
- t_item_ddic TYPE TABLE OF mtreeitm,
- o_alv_result TYPE REF TO cl_gui_alv_grid,
- o_result TYPE REF TO data,
- w_dragdrop_handle_tree TYPE i,
- * ZSPRO data
- t_node_zspro LIKE t_node_ddic,
- t_item_zspro LIKE t_item_ddic,
- * Save option
- BEGIN OF s_options,
- name TYPE ztoad-text,
- visibility TYPE ztoad-visibility,
- visibilitygrp TYPE usr02-class,
- END OF s_options,
- * Keep last loaded id
- w_last_loaded_query TYPE ztoad-queryid.
- DATA: gv_max_rows TYPE i VALUE 200.
- FIELD-SYMBOLS: <gt_data> TYPE STANDARD TABLE.
- DATA : w_okcode LIKE sy-ucomm.
- * Global types
- TYPES : BEGIN OF ty_fieldlist,
- field TYPE string,
- ref_table TYPE string,
- ref_field TYPE string,
- END OF ty_fieldlist,
- ty_fieldlist_table TYPE STANDARD TABLE OF ty_fieldlist.
- * Constants
- CONSTANTS : c_ddic_col1 TYPE mtreeitm-item_name
- VALUE 'col1', "#EC NOTEXT
- c_ddic_col2 TYPE mtreeitm-item_name
- VALUE 'col2', "#EC NOTEXT
- c_ddic_header TYPE tv_hdrname
- VALUE 'HierarchyHeader', "#EC NOTEXT
- c_visibility_all TYPE ztoad-visibility VALUE '2',
- c_visibility_shared TYPE ztoad-visibility VALUE '1',
- c_visibility_my TYPE ztoad-visibility VALUE '0',
- c_nodekey_repo_my TYPE mtreesnode-node_key VALUE 'MY',
- c_nodekey_repo_shared TYPE mtreesnode-node_key
- VALUE 'SHARED',
- c_nodekey_repo_history TYPE mtreesnode-node_key
- VALUE 'HISTO',
- c_line_max TYPE i VALUE 255,
- c_msg_success TYPE c VALUE 'S',
- c_msg_error TYPE c VALUE 'E',
- c_vers_active TYPE as4local VALUE 'A',
- c_ddic_dtelm TYPE comptype VALUE 'E'.
- *######################################################################*
- *
- * CLASS SECTION
- *
- *######################################################################*
- *----------------------------------------------------------------------*
- * CLASS lcl_drag_object DEFINITION
- *----------------------------------------------------------------------*
- * Class to store object on drag & drop from DDIC to sql editor
- *----------------------------------------------------------------------*
- CLASS lcl_drag_object DEFINITION FINAL.
- PUBLIC SECTION.
- DATA field TYPE string.
- ENDCLASS."lcl_drag_object DEFINITION
- *----------------------------------------------------------------------*
- * CLASS lcl_application DEFINITION
- *----------------------------------------------------------------------*
- * Class to handle application events
- *----------------------------------------------------------------------*
- CLASS lcl_application DEFINITION FINAL.
- PUBLIC SECTION.
- METHODS :
- * Handle F1 call on ABAP editor
- handle_f1_textedit
- FOR EVENT f1 OF cl_gui_abapedit,
- * Handle Header clic on ddic tree
- handle_header_click_ddic
- FOR EVENT header_click OF cl_gui_column_tree
- IMPORTING header_name,
- * Handle Node double clic on ddic tree
- handle_item_dblclick_ddic
- FOR EVENT item_double_click OF cl_gui_column_tree
- IMPORTING node_key,
- * Handle context menu display on repository tree
- handle_context_menu_repository
- FOR EVENT node_context_menu_request
- OF cl_gui_simple_tree
- IMPORTING menu,
- * Handle context menu clic on repository tree
- handle_context_menu_sel_repo
- FOR EVENT node_context_menu_select
- OF cl_gui_simple_tree
- IMPORTING fcode,
- * Handle Node double clic on repository tree
- handle_dblclick_repository
- FOR EVENT node_double_click OF cl_gui_simple_tree
- IMPORTING node_key,
- * Handle toolbar display on ALV result
- handle_toolbar_result
- FOR EVENT toolbar OF cl_gui_alv_grid
- IMPORTING e_object,
- * Handle toolbar clic on ALV result
- handle_user_command_result
- FOR EVENT user_command OF cl_gui_alv_grid
- IMPORTING e_ucomm,
- * Handle DDIC tree drag
- handle_tree_drag
- FOR EVENT on_drag OF cl_gui_column_tree
- IMPORTING node_key drag_drop_object,
- * Handle editor drop
- handle_edit_drop
- FOR EVENT on_drop OF cl_gui_abapedit
- IMPORTING line pos dragdrop_object,
- handle_toolbar_function_sel
- FOR EVENT function_selected OF cl_gui_toolbar
- IMPORTING fcode.
- ENDCLASS. "lcl_application DEFINITION
- *----------------------------------------------------------------------*
- * CLASS LCL_APPLICATION IMPLEMENTATION
- *----------------------------------------------------------------------*
- * Class to handle application events *
- *----------------------------------------------------------------------*
- CLASS lcl_application IMPLEMENTATION.
- *&---------------------------------------------------------------------*
- *& CLASS lcl_application
- *& METHOD handle_context_menu_repository
- *&---------------------------------------------------------------------*
- * Handle context menu display on repository tree
- *----------------------------------------------------------------------*
- METHOD handle_context_menu_repository.
- DATA l_node_key TYPE tv_nodekey.
- CALL METHOD o_tree_repository->get_selected_node
- IMPORTING
- node_key = l_node_key.
- IF l_node_key = 'HISTO'.
- READ TABLE t_node_repository TRANSPORTING NO FIELDS
- WITH KEY relatkey = 'HISTO'.
- IF sy-subrc = 0.
- CALL METHOD menu->add_function
- EXPORTING
- text = 'Delete All'(m51)
- icon = '@02@'
- fcode = 'DELETE_HIST'.
- ENDIF.
- ELSE.
- * Add Delete option only for own queries
- READ TABLE t_node_repository INTO s_node_repository
- WITH KEY node_key = l_node_key.
- IF sy-subrc NE 0 OR s_node_repository-edit = space.
- RETURN.
- ENDIF.
- CALL METHOD menu->add_function
- EXPORTING
- text = 'Delete'(m01)
- icon = '@02@'
- fcode = 'DELETE_QUERY'.
- ENDIF.
- ENDMETHOD. "handle_context_menu_repository
- *&---------------------------------------------------------------------*
- *& CLASS lcl_application
- *& METHOD handle_context_menu_sel_repo
- *&---------------------------------------------------------------------*
- * Handle context menu clic on repository tree
- *----------------------------------------------------------------------*
- METHOD handle_context_menu_sel_repo.
- CASE fcode.
- WHEN 'DELETE_QUERY'.
- * Delete stored query
- PERFORM query_selected_delete.
- WHEN 'DELETE_HIST'.
- * Delete all histoy queries
- PERFORM queries_hist_delete.
- ENDCASE.
- ENDMETHOD. "handle_context_menu_sel_repo
- *&---------------------------------------------------------------------*
- *& CLASS lcl_application
- *& METHOD handle_f1_textedit
- *&---------------------------------------------------------------------*
- * Handle F1 call on ABAP editor
- *----------------------------------------------------------------------*
- METHOD handle_f1_textedit.
- DATA : lw_cursor_line_from TYPE i,
- lw_cursor_line_to TYPE i,
- lw_cursor_pos_from TYPE i,
- lw_cursor_pos_to TYPE i,
- lw_offset TYPE i,
- lw_length TYPE i,
- lt_query TYPE soli_tab,
- ls_query LIKE LINE OF lt_query,
- lw_sel TYPE string.
- * Find active query
- CALL METHOD o_textedit->get_selection_pos
- IMPORTING
- from_line = lw_cursor_line_from
- from_pos = lw_cursor_pos_from
- to_line = lw_cursor_line_to
- to_pos = lw_cursor_pos_to.
- * If nothing selected, no help to display
- IF lw_cursor_line_from = lw_cursor_line_to
- AND lw_cursor_pos_to = lw_cursor_pos_from.
- RETURN.
- ENDIF.
- * Get content of abap edit box
- CALL METHOD o_textedit->get_text
- IMPORTING
- table = lt_query[]
- EXCEPTIONS
- OTHERS = 1.
- READ TABLE lt_query INTO ls_query INDEX lw_cursor_line_from.
- IF lw_cursor_line_from = lw_cursor_line_to.
- lw_length = lw_cursor_pos_to - lw_cursor_pos_from.
- lw_offset = lw_cursor_pos_from - 1.
- lw_sel = ls_query+lw_offset(lw_length).
- ELSE.
- lw_offset = lw_cursor_pos_from - 1.
- lw_sel = ls_query+lw_offset.
- ENDIF.
- CALL FUNCTION 'ABAP_DOCU_START'
- EXPORTING
- word = lw_sel.
- ENDMETHOD. "handle_f1_textedit
- *&---------------------------------------------------------------------*
- *& CLASS lcl_application
- *& METHOD handle_header_click_ddic
- *&---------------------------------------------------------------------*
- * Handle Header clic on ddic tree :
- * - Refresh tree on click on first column header
- * - Search term on click on second column header
- *----------------------------------------------------------------------*
- METHOD handle_header_click_ddic.
- DATA : lw_query TYPE string,
- lw_query2 TYPE string,
- lw_select TYPE string,
- lw_from TYPE string,
- lw_from2 TYPE string,
- lw_where TYPE string,
- lw_union TYPE string,
- lw_rows(10) TYPE n,
- ls_sval TYPE sval,
- lt_sval LIKE TABLE OF ls_sval,
- lw_returncode TYPE c,
- lw_search TYPE string,
- lt_search LIKE TABLE OF lw_search,
- ls_item_ddic LIKE LINE OF t_item_ddic,
- lw_search_term TYPE string,
- lw_search_line TYPE i,
- lw_rest TYPE i,
- lw_node_key TYPE tv_nodekey,
- lt_nodekey TYPE TABLE OF tv_nodekey,
- lw_noauth(1) TYPE c.
- * For column 1 click => Refresh tree
- IF header_name = c_ddic_header OR header_name = c_ddic_col1.
- * Get only usefull code for current query
- PERFORM get_query USING space CHANGING lw_query.
- * Parse Query
- PERFORM parse_query USING lw_query
- CHANGING lw_select lw_from lw_where
- lw_union lw_rows lw_noauth.
- IF lw_noauth NE space.
- RETURN.
- ELSEIF lw_select IS INITIAL.
- PERFORM parse_query_noselect USING lw_query
- CHANGING lw_noauth lw_select
- lw_from lw_where.
- IF lw_noauth NE space.
- RETURN.
- ENDIF.
- ENDIF.
- * Manage unioned queries
- WHILE NOT lw_union IS INITIAL.
- * Parse Query
- lw_query2 = lw_union.
- PERFORM parse_query USING lw_query2
- CHANGING lw_select lw_from2 lw_where
- lw_union lw_rows lw_noauth.
- IF NOT lw_from2 IS INITIAL.
- CONCATENATE lw_from 'JOIN' lw_from2
- INTO lw_from SEPARATED BY space.
- ENDIF.
- IF lw_noauth NE space.
- RETURN.
- ENDIF.
- ENDWHILE.
- * Refresh ddic tree with list of table/fields of the actual query
- PERFORM set_ddic_tree USING lw_from.
- * For column 2 click => Search in description
- ELSE.
- * Build search table
- REFRESH lt_search.
- LOOP AT t_item_ddic INTO ls_item_ddic.
- lw_search = ls_item_ddic-text.
- APPEND lw_search TO lt_search.
- APPEND ls_item_ddic-node_key TO lt_nodekey.
- ENDLOOP.
- * Ask for selection search
- ls_sval-tabname = 'RSDXX'.
- ls_sval-fieldname = 'FINDSTR'.
- ls_sval-value = space.
- APPEND ls_sval TO lt_sval.
- DO.
- CALL FUNCTION 'POPUP_GET_VALUES'
- EXPORTING
- popup_title = space
- IMPORTING
- returncode = lw_returncode
- TABLES
- fields = lt_sval
- EXCEPTIONS
- error_in_fields = 1
- OTHERS = 2.
- IF sy-subrc NE 0 OR lw_returncode NE space.
- EXIT. "exit do
- ENDIF.
- READ TABLE lt_sval INTO ls_sval INDEX 1.
- IF ls_sval-value = space.
- EXIT. "exit do
- ENDIF.
- * For new search, start from line 1
- IF lw_search_term NE ls_sval-value.
- lw_search_term = ls_sval-value.
- lw_search_line = 1.
- * For next result of same search, start from next line
- ELSE.
- lw_rest = lw_search_line MOD 2.
- lw_search_line = lw_search_line + 1 + lw_rest.
- ENDIF.
- FIND FIRST OCCURRENCE OF ls_sval-value IN TABLE lt_search
- FROM lw_search_line
- IN CHARACTER MODE IGNORING CASE
- MATCH LINE lw_search_line
- .
- * Search string &1 not found
- IF sy-subrc NE 0 AND lw_search_line = 1.
- MESSAGE s065(0k) WITH lw_search_term DISPLAY LIKE c_msg_error.
- CLEAR lw_search_line.
- CLEAR lw_search_term.
- * Last selected entry reached
- ELSEIF sy-subrc NE 0.
- MESSAGE s066(0k) DISPLAY LIKE c_msg_error.
- CLEAR lw_search_line.
- CLEAR lw_search_term.
- * Found
- ELSE.
- MESSAGE 'String found'(m04) TYPE c_msg_success.
- READ TABLE lt_nodekey INTO lw_node_key INDEX lw_search_line.
- CALL METHOD o_tree_ddic->set_selected_node
- EXPORTING
- node_key = lw_node_key.
- CALL METHOD o_tree_ddic->ensure_visible
- EXPORTING
- node_key = lw_node_key.
- ENDIF.
- ENDDO.
- ENDIF.
- ENDMETHOD. "handle_header_click_ddic
- *&---------------------------------------------------------------------*
- *& CLASS lcl_application
- *& METHOD handle_item_dblclick_ddic
- *&---------------------------------------------------------------------*
- * Handle Node double clic on ddic tree
- *----------------------------------------------------------------------*
- METHOD handle_item_dblclick_ddic.
- DATA : ls_node LIKE LINE OF t_node_ddic,
- lw_line_start TYPE i,
- lw_pos_start TYPE i,
- lw_line_end TYPE i,
- lw_pos_end TYPE i,
- lw_data TYPE string.
- * Check clicked node is valid
- READ TABLE t_node_ddic INTO ls_node
- WITH KEY node_key = node_key.
- IF sy-subrc NE 0 OR ls_node-isfolder = abap_true.
- RETURN.
- ENDIF.
- * Get text for the node selected
- PERFORM get_field_from_node USING node_key ls_node-relatkey
- CHANGING lw_data.
- * Get current cursor position/selection in editor
- CALL METHOD o_textedit->get_selection_pos
- IMPORTING
- from_line = lw_line_start
- from_pos = lw_pos_start
- to_line = lw_line_end
- to_pos = lw_pos_end
- EXCEPTIONS
- OTHERS = 4.
- IF sy-subrc NE 0.
- MESSAGE 'Cannot get cursor position'(m35) TYPE c_msg_error.
- ENDIF.
- * If text is selected/highlighted, delete it
- IF lw_line_start NE lw_line_end
- OR lw_pos_start NE lw_pos_end.
- CALL METHOD o_textedit->delete_text
- EXPORTING
- from_line = lw_line_start
- from_pos = lw_pos_start
- to_line = lw_line_end
- to_pos = lw_pos_end.
- ENDIF.
- PERFORM paste_to_editor USING lw_data lw_line_start lw_pos_start.
- ENDMETHOD. "handle_item_dblclick_ddic
- *&---------------------------------------------------------------------*
- *& CLASS lcl_application
- *& METHOD handle_dblclick_repository
- *&---------------------------------------------------------------------*
- * Handle Node double clic on repository tree
- *----------------------------------------------------------------------*
- METHOD handle_dblclick_repository.
- DATA lt_query TYPE TABLE OF string.
- READ TABLE t_node_repository INTO s_node_repository
- WITH KEY node_key = node_key.
- IF sy-subrc = 0 AND NOT s_node_repository-relatkey IS INITIAL.
- PERFORM load_query USING s_node_repository-queryid
- CHANGING lt_query.
- CALL METHOD o_textedit->set_text
- EXPORTING
- table = lt_query
- EXCEPTIONS
- OTHERS = 0.
- o_handle_event->handle_header_click_ddic( c_ddic_header ).
- ENDIF.
- ENDMETHOD. "handle_dblclick_repository
- *&---------------------------------------------------------------------*
- *& CLASS lcl_application
- *& METHOD handle_toolbar_result
- *&---------------------------------------------------------------------*
- * Handle grid toolbar to add specific button
- *----------------------------------------------------------------------*
- METHOD handle_toolbar_result.
- data: ls_toolbar TYPE stb_button.
- * Add Separator
- CLEAR ls_toolbar.
- ls_toolbar-function = '&&SEP99'.
- ls_toolbar-butn_type = 3.
- APPEND ls_toolbar TO e_object->mt_toolbar.
- * Add button to close the grid
- CLEAR ls_toolbar.
- ls_toolbar-function = 'CLOSE_GRID'.
- ls_toolbar-icon = '@3X@'.
- ls_toolbar-quickinfo = 'Close Grid'(m05).
- ls_toolbar-text = 'Close'(m06).
- ls_toolbar-butn_type = 0.
- ls_toolbar-disabled = space.
- APPEND ls_toolbar TO e_object->mt_toolbar.
- ENDMETHOD. "handle_toolbar_result
- *&---------------------------------------------------------------------*
- *& CLASS lcl_application
- *& METHOD handle_user_command
- *&---------------------------------------------------------------------*
- * Handle grid user command to manage specific fcode
- * (menus & toolbar)
- *----------------------------------------------------------------------*
- METHOD handle_user_command_result.
- CASE e_ucomm.
- WHEN 'CLOSE_GRID'.
- CALL METHOD o_splitter->set_row_height
- EXPORTING
- id = 1
- height = 100.
- ENDCASE.
- ENDMETHOD. "handle_user_command_result
- *&---------------------------------------------------------------------*
- *& CLASS lcl_application
- *& METHOD handle_tree_drag
- *&---------------------------------------------------------------------*
- * Handle drag on DDIC field (store fieldname)
- *----------------------------------------------------------------------*
- METHOD handle_tree_drag.
- DATA : lo_drag_object TYPE REF TO lcl_drag_object,
- ls_node LIKE LINE OF t_node_ddic,
- lw_text TYPE string.
- READ TABLE t_node_ddic INTO ls_node
- WITH KEY node_key = node_key.
- IF sy-subrc NE 0 OR ls_node-isfolder = abap_true. "may not append
- MESSAGE 'Only fields can be drag&drop to editor'(m34)
- TYPE c_msg_success DISPLAY LIKE c_msg_error.
- RETURN.
- ENDIF.
- * Get text for the node selected
- PERFORM get_field_from_node USING node_key ls_node-relatkey
- CHANGING lw_text.
- * Store the node text
- CREATE OBJECT lo_drag_object.
- lo_drag_object->field = lw_text.
- drag_drop_object->object = lo_drag_object.
- ENDMETHOD."handle_tree_drag
- *&---------------------------------------------------------------------*
- *& CLASS lcl_application
- *& METHOD handle_edit_drop
- *&---------------------------------------------------------------------*
- * Handle drop on SQL Editor : paste fieldname at cursor position
- *----------------------------------------------------------------------*
- METHOD handle_edit_drop.
- DATA lo_drag_object TYPE REF TO lcl_drag_object.
- lo_drag_object ?= dragdrop_object->object.
- IF lo_drag_object IS INITIAL OR lo_drag_object->field IS INITIAL.
- RETURN.
- ENDIF.
- * Paste fieldname to editor at drop position
- PERFORM paste_to_editor USING lo_drag_object->field line pos.
- ENDMETHOD."HANDLE_EDIT_DROP
- METHOD handle_toolbar_function_sel.
- CASE fcode.
- WHEN '9MAX_ROWS'.
- PERFORM max_rows_input_popup CHANGING gv_max_rows.
- PERFORM toolbar_max_rows_text_set.
- ENDCASE.
- ENDMETHOD. "handle_toolbar_function_sel
- ENDCLASS. "lcl_application IMPLEMENTATION
- *######################################################################*
- *
- * MAIN SECTION
- *
- *######################################################################*
- START-OF-SELECTION.
- CALL SCREEN 100.
- *######################################################################*
- *
- * PBO SECTION
- *
- *######################################################################*
- *&---------------------------------------------------------------------*
- *& Module STATUS_0100 OUTPUT
- *&---------------------------------------------------------------------*
- * Set status for main screen
- * and initialize custom container at first run
- *----------------------------------------------------------------------*
- MODULE status_0100 OUTPUT.
- * Initialization of object screen
- IF o_container IS INITIAL.
- PERFORM init_screen.
- ENDIF.
- AUTHORITY-CHECK OBJECT 'S_DEVELOP' ID 'ACTVT' FIELD '03'
- ID 'DEVCLASS' DUMMY
- ID 'OBJTYPE' DUMMY
- ID 'OBJNAME' DUMMY
- ID 'P_GROUP' DUMMY.
- IF sy-subrc = 0.
- SET PF-STATUS 'STATUS100'.
- ELSE.
- * If you dont have S_DEVELOP access in display, you probably dont
- * understand the code generated => do not display the button
- SET PF-STATUS 'STATUS100' EXCLUDING 'SHOWCODE'.
- ENDIF.
- SET TITLEBAR 'STATUS100'.
- ENDMODULE. " STATUS_0100 OUTPUT
- *&---------------------------------------------------------------------*
- *& Module STATUS_0200 OUTPUT
- *&---------------------------------------------------------------------*
- * Set status for modal box (save options)
- *----------------------------------------------------------------------*
- MODULE status_0200 OUTPUT.
- * Fill dropdown listbox with values
- PERFORM init_listbox_0200.
- SET PF-STATUS 'STATUS200'.
- SET TITLEBAR 'STATUS200'.
- ENDMODULE. " STATUS_0200 OUTPUT
- *######################################################################*
- *
- * PAI SECTION
- *
- *######################################################################*
- *&---------------------------------------------------------------------*
- *& Module USER_COMMAND_0200 INPUT
- *&---------------------------------------------------------------------*
- * PAI module for modal box (save options)
- *----------------------------------------------------------------------*
- MODULE user_command_0200 INPUT.
- CASE w_okcode.
- WHEN 'CLOSE'.
- CLEAR s_options.
- LEAVE TO SCREEN 0.
- WHEN 'OK'.
- LEAVE TO SCREEN 0.
- ENDCASE.
- ENDMODULE. " USER_COMMAND_0200 INPUT
- *&---------------------------------------------------------------------*
- *& Module USER_COMMAND_0100 INPUT
- *&---------------------------------------------------------------------*
- * User command for main screen
- *----------------------------------------------------------------------*
- MODULE user_command_0100 INPUT.
- CASE w_okcode.
- WHEN 'EXIT'.
- PERFORM exit_program.
- WHEN 'EXECUTE'.
- PERFORM process_query USING space.
- WHEN 'SAVE'.
- PERFORM save_query.
- WHEN 'SHOWCODE'.
- PERFORM process_query USING abap_true.
- WHEN 'HELP'.
- PERFORM display_help.
- ENDCASE.
- ENDMODULE. " USER_COMMAND_0100 INPUT
- *######################################################################*
- *
- * FORM SECTION
- *
- *######################################################################*
- *&---------------------------------------------------------------------*
- *& Form INIT_SCREEN
- *&---------------------------------------------------------------------*
- * Initialize all objects on the screen
- *----------------------------------------------------------------------*
- FORM init_screen.
- * Create the handle object (required to catch events)
- CREATE OBJECT o_handle_event.
- * Split the screen into 4 parts
- PERFORM init_splitter.
- * Init History Tree
- PERFORM init_repository.
- * Init toolbar
- PERFORM init_toolbar.
- * Init DDic tree
- PERFORM init_ddic.
- * Init Query editor
- PERFORM init_editor.
- * Init ALV result object
- PERFORM init_result.
- ENDFORM. " INIT_SCREEN
- *&---------------------------------------------------------------------*
- *& Form INIT_SPLITTER
- *&---------------------------------------------------------------------*
- * Split the main screen in 2 lines
- * 1 line with 3 columns : Repository tree / Query code / Ddic tree
- * 1 line with ALV result
- *----------------------------------------------------------------------*
- FORM init_splitter.
- * Create the custom container
- CREATE OBJECT o_container
- EXPORTING
- container_name = 'CUSTCONT'.
- * Insert splitter into this container
- CREATE OBJECT o_splitter
- EXPORTING
- parent = o_container
- rows = 2
- columns = 1.
- * Get the first row of the main splitter
- CALL METHOD o_splitter->get_container
- EXPORTING
- row = 1
- column = 1
- RECEIVING
- container = o_container_top.
- * Spliter for the high part (first row)
- CREATE OBJECT o_splitter_top
- EXPORTING
- parent = o_container_top
- rows = 1
- columns = 3.
- * Affect an object to each "cell" of the high sub splitter
- CALL METHOD o_splitter_top->get_container
- EXPORTING
- row = 1
- column = 1
- RECEIVING
- container = o_container_repository.
- CALL METHOD o_splitter_top->get_container
- EXPORTING
- row = 1
- column = 2
- RECEIVING
- container = o_container_query.
- CALL METHOD o_splitter_top->get_container
- EXPORTING
- row = 1
- column = 3
- RECEIVING
- container = o_container_right.
- CALL METHOD o_splitter->get_container
- EXPORTING
- row = 2
- column = 1
- RECEIVING
- container = o_container_result.
- * Initial repartition :
- * line 1 = 100% (code+repo+ddic)
- * line 2 = 0% (result)
- * line 1 col 1 & 3 = 20% (repo & ddic)
- * line 1 col 2 = 60% (code)
- CALL METHOD o_splitter->set_row_height
- EXPORTING
- id = 1
- height = 100.
- CALL METHOD o_splitter_top->set_column_width
- EXPORTING
- id = 1
- width = 20.
- CALL METHOD o_splitter_top->set_column_width
- EXPORTING
- id = 3
- width = 20.
- * Spliter for the right part (Toolbar/DDIC)
- CREATE OBJECT o_splitter_right
- EXPORTING
- parent = o_container_right
- rows = 2
- columns = 1.
- o_splitter_right->set_row_mode(
- EXPORTING
- mode = cl_gui_splitter_container=>mode_absolute
- ).
- CALL METHOD o_splitter_right->set_row_height
- EXPORTING
- id = 1
- height = 30.
- CALL METHOD o_splitter_right->get_container
- EXPORTING
- row = 2
- column = 1
- RECEIVING
- container = o_container_ddic.
- CALL METHOD o_splitter_right->get_container
- EXPORTING
- row = 1
- column = 1
- RECEIVING
- container = o_container_toolbar.
- ENDFORM. " INIT_SPLITTER
- *&---------------------------------------------------------------------*
- *& Form INIT_EDITOR
- *&---------------------------------------------------------------------*
- * Initialize the sql editor object
- * Fill it with last query, or template if no previous query
- *----------------------------------------------------------------------*
- FORM init_editor.
- DATA : lt_events TYPE cntl_simple_events,
- ls_event TYPE cntl_simple_event,
- lt_default TYPE TABLE OF string,
- ls_default LIKE LINE OF lt_default,
- lw_queryid TYPE ztoad-queryid,
- lo_dragrop TYPE REF TO cl_dragdrop.
- * Get last query used
- CONCATENATE sy-uname '#%' INTO lw_queryid.
- SELECT queryid
- INTO lw_queryid
- FROM ztoad
- UP TO 1 ROWS
- WHERE queryid LIKE lw_queryid
- AND owner = sy-uname
- ORDER BY aedat DESCENDING.
- ENDSELECT.
- IF sy-subrc = 0.
- PERFORM load_query USING lw_queryid
- CHANGING lt_default.
- PERFORM focus_repository USING lw_queryid.
- ENDIF.
- * If no last query found, use default template
- IF lt_default IS INITIAL.
- APPEND 'SELECT *' TO lt_default. "#EC NOTEXT
- APPEND 'FROM xxx' TO lt_default. "#EC NOTEXT
- APPEND 'WHERE xxx' TO lt_default. "#EC NOTEXT
- APPEND '.' TO lt_default. "#EC NOTEXT
- ENDIF.
- * Create the sql editor
- CREATE OBJECT o_textedit
- EXPORTING
- parent = o_container_query.
- * Register events
- SET HANDLER o_handle_event->handle_f1_textedit FOR o_textedit.
- SET HANDLER o_handle_event->handle_edit_drop FOR o_textedit.
- ls_event-eventid = cl_gui_textedit=>event_f1.
- APPEND ls_event TO lt_events.
- CALL METHOD o_textedit->set_registered_events
- EXPORTING
- events = lt_events
- EXCEPTIONS
- cntl_error = 1
- cntl_system_error = 2
- illegal_event_combination = 3.
- IF sy-subrc <> 0.
- IF sy-msgno IS NOT INITIAL.
- MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
- DISPLAY LIKE c_msg_error
- WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4 .
- ENDIF.
- ENDIF.
- * Manage Drop on SQL editor
- CREATE OBJECT lo_dragrop.
- CALL METHOD lo_dragrop->add
- EXPORTING
- flavor = 'EDIT_INSERT'
- dragsrc = space
- droptarget = abap_true
- effect = cl_dragdrop=>copy.
- CALL METHOD o_textedit->set_dragdrop
- EXPORTING
- dragdrop = lo_dragrop.
- * Set Default template
- CALL METHOD o_textedit->set_text
- EXPORTING
- table = lt_default
- EXCEPTIONS
- OTHERS = 0.
- * Set focus
- CALL METHOD cl_gui_control=>set_focus
- EXPORTING
- control = o_textedit
- EXCEPTIONS
- OTHERS = 0.
- o_handle_event->handle_header_click_ddic( c_ddic_header ).
- ENDFORM. " INIT_EDITOR
- *&---------------------------------------------------------------------*
- *& Form process_query
- *&---------------------------------------------------------------------*
- * Process selected query : execute or display code
- *----------------------------------------------------------------------*
- * -->FP_DISPLAY : Flag abap_true to display code
- *----------------------------------------------------------------------*
- FORM process_query USING fp_display TYPE c.
- DATA : lw_query TYPE string,
- lw_select TYPE string,
- lw_from TYPE string,
- lw_where TYPE string,
- lw_union TYPE string,
- lw_query2 TYPE string,
- lw_command TYPE string,
- lw_rows(6) TYPE n,
- lw_program TYPE sy-repid,
- lo_result2 TYPE REF TO data,
- lt_fieldlist TYPE ty_fieldlist_table,
- lt_fieldlist2 TYPE ty_fieldlist_table,
- lw_count_only(1) TYPE c,
- lw_time TYPE p LENGTH 8 DECIMALS 2,
- lw_time2 LIKE lw_time,
- lw_count TYPE i,
- lw_count2 LIKE lw_count,
- lw_charnumb(12) TYPE c,
- lw_msg TYPE string,
- lw_noauth(1) TYPE c,
- lw_answer(1) TYPE c.
- FIELD-SYMBOLS : <lft_data> TYPE STANDARD TABLE,
- <lft_data2> TYPE STANDARD TABLE.
- DATA: ld_result TYPE REF TO data.
- * Get only usefull code for current query
- PERFORM get_query USING space CHANGING lw_query.
- * Parse SELECT Query
- PERFORM parse_query USING lw_query
- CHANGING lw_select lw_from lw_where
- lw_union lw_rows lw_noauth.
- * Not a select query
- IF lw_select IS INITIAL.
- PERFORM parse_query_noselect USING lw_query
- CHANGING lw_noauth
- lw_command
- lw_from
- lw_where.
- IF lw_noauth NE space.
- RETURN.
- ENDIF.
- PERFORM generate_subroutine_noselect USING lw_command lw_from
- lw_where fp_display
- CHANGING lw_program.
- CONCATENATE 'Are you sure you want to do a'(m31) lw_command
- 'on table'(m32) lw_from '?'(m33)
- INTO lw_msg SEPARATED BY space.
- CALL FUNCTION 'POPUP_TO_CONFIRM'
- EXPORTING
- titlebar = 'Warning : critical operation'(t04)
- text_question = lw_msg
- default_button = '2'
- display_cancel_button = space
- IMPORTING
- answer = lw_answer
- EXCEPTIONS
- text_not_found = 1
- OTHERS = 2.
- IF sy-subrc NE 0 OR lw_answer NE '1'.
- RETURN.
- ENDIF.
- lw_count_only = abap_true. "no result grid to display
- ELSEIF lw_noauth NE space.
- RETURN.
- ELSEIF lw_from IS INITIAL.
- MESSAGE 'Cannot parse the query'(m07) TYPE c_msg_error.
- ELSE.
- * Generate SELECT subroutine
- PERFORM generate_subroutine USING lw_select lw_from
- lw_where fp_display
- CHANGING lw_program lw_rows
- lt_fieldlist lw_count_only.
- ENDIF.
- * Call the generated subroutine
- IF NOT lw_program IS INITIAL.
- PERFORM run_sql IN PROGRAM (lw_program)
- CHANGING o_result lw_time lw_count.
- * For union, process second (and further) query
- WHILE NOT lw_union IS INITIAL.
- * Parse Query
- lw_query2 = lw_union.
- PERFORM parse_query USING lw_query2
- CHANGING lw_select lw_from lw_where
- lw_union lw_rows lw_noauth.
- IF lw_noauth NE space.
- RETURN.
- ELSEIF lw_select IS INITIAL OR lw_from IS INITIAL.
- MESSAGE 'Cannot parse the unioned query'(m08) TYPE c_msg_error.
- EXIT. "exit while
- ENDIF.
- * Generate subroutine
- PERFORM generate_subroutine USING lw_select lw_from
- lw_where fp_display
- CHANGING lw_program lw_rows
- lt_fieldlist2 lw_count_only.
- * Call the generated subroutine
- PERFORM run_sql IN PROGRAM (lw_program)
- CHANGING lo_result2 lw_time2 lw_count2.
- * Append lines of the further queries to the first query
- ASSIGN o_result->* TO <lft_data>.
- ASSIGN lo_result2->* TO <lft_data2>.
- APPEND LINES OF <lft_data2> TO <lft_data>.
- REFRESH <lft_data2>.
- lw_time = lw_time + lw_time2.
- lw_count = lw_count + lw_count2.
- ENDWHILE.
- * Display message
- lw_charnumb = lw_time.
- CONCATENATE 'Query executed in'(m09) lw_charnumb INTO lw_msg
- SEPARATED BY space.
- lw_charnumb = lw_count.
- IF NOT lw_select IS INITIAL.
- CONCATENATE lw_msg 'seconds.'(m10)
- lw_charnumb 'entries found'(m11)
- INTO lw_msg SEPARATED BY space.
- ELSE.
- CONCATENATE lw_msg 'seconds.'(m10)
- lw_charnumb 'entries affected'(m12)
- INTO lw_msg SEPARATED BY space.
- ENDIF.
- CONDENSE lw_msg.
- MESSAGE lw_msg TYPE c_msg_success.
- * Display result except for count(*)
- IF lw_count_only IS INITIAL.
- ASSIGN o_result->* TO <lft_data>.
- * Build extended result table (With count column)
- PERFORM result_tab_extended_build USING <lft_data>
- CHANGING ld_result.
- ASSIGN ld_result->* TO <gt_data>.
- FREE <lft_data>[].
- PERFORM display_alv_data USING <gt_data> lt_fieldlist lw_query.
- ENDIF.
- PERFORM save_current_query.
- ENDIF.
- ENDFORM. " PROCESS_QUERY
- *&---------------------------------------------------------------------*
- *& Form result_tab_extended_build
- *&---------------------------------------------------------------------*
- * text
- *----------------------------------------------------------------------*
- * -->IT_RESULT text
- * -->ED_RESULT_EXTENDED text
- * -->DATA text
- * -->: text
- * -->LD_RESULT_EXTENDED_STRUCT text
- *----------------------------------------------------------------------*
- FORM result_tab_extended_build
- USING it_result TYPE STANDARD TABLE
- CHANGING ed_result_extended TYPE REF TO data.
- DATA: ld_result_extended_struct TYPE REF TO data.
- FIELD-SYMBOLS: <lt_result_extended> TYPE STANDARD TABLE,
- <ls_result> TYPE any,
- <ls_result_extended> TYPE any,
- <lv_count> TYPE i.
- * Create extended result table (With count column)
- PERFORM result_tab_extended_create USING it_result
- CHANGING ed_result_extended.
- ASSIGN ed_result_extended->* TO <lt_result_extended>.
- CREATE DATA ld_result_extended_struct LIKE LINE OF <lt_result_extended>.
- ASSIGN ld_result_extended_struct->* TO <ls_result_extended>.
- * Build extended result table data
- LOOP AT it_result ASSIGNING <ls_result>.
- MOVE-CORRESPONDING <ls_result> TO <ls_result_extended>.
- ASSIGN COMPONENT 'COUNT' OF STRUCTURE <ls_result_extended>
- TO <lv_count>.
- <lv_count> = 1.
- APPEND <ls_result_extended> TO <lt_result_extended>.
- ENDLOOP.
- ENDFORM. "result_tab_extended_build
- FORM result_tab_extended_create
- USING it_result TYPE STANDARD TABLE
- CHANGING ed_result_extended TYPE REF TO data.
- DATA: lo_tabledescr TYPE REF TO cl_abap_tabledescr,
- lo_structdescr TYPE REF TO cl_abap_structdescr,
- lt_components TYPE abap_component_tab,
- ls_components LIKE LINE OF lt_components.
- * Get table/structure components
- lo_tabledescr ?= cl_abap_tabledescr=>describe_by_data( it_result ).
- lo_structdescr ?= lo_tabledescr->get_table_line_type( ).
- lt_components = lo_structdescr->get_components( ).
- * Add Count component
- ls_components-name = 'COUNT'.
- ls_components-type = cl_abap_elemdescr=>get_i( ).
- APPEND ls_components TO lt_components.
- * Create extended structure and table descriptors
- lo_structdescr = cl_abap_structdescr=>create( lt_components ).
- lo_tabledescr = cl_abap_tabledescr=>create( lo_structdescr ).
- * Create extended data table
- CREATE DATA ed_result_extended TYPE HANDLE lo_tabledescr.
- ENDFORM. "result_tab_extended_create
- *&---------------------------------------------------------------------*
- *& Form GET_QUERY
- *&---------------------------------------------------------------------*
- * Return active query without comment
- *----------------------------------------------------------------------*
- * -->FP_FORCE_LAST Keep last request
- * <--FP_QUERY Query code
- *----------------------------------------------------------------------*
- FORM get_query USING fp_force_last TYPE c
- CHANGING fp_query TYPE string.
- DATA : lt_query TYPE soli_tab,
- ls_query LIKE LINE OF lt_query,
- ls_find TYPE match_result,
- lt_find TYPE match_result_tab,
- lw_cursor_line TYPE i,
- lw_cursor_pos TYPE i,
- lw_delto_line TYPE i,
- lw_delto_pos TYPE i,
- lw_cursor_offset TYPE i,
- lw_last TYPE c.
- CLEAR fp_query.
- * Get selected content
- CALL METHOD o_textedit->get_selected_text_as_table
- IMPORTING
- table = lt_query[].
- * if no selected content, get complete content of abap edit box
- IF lt_query[] IS INITIAL.
- CALL METHOD o_textedit->get_text
- IMPORTING
- table = lt_query[]
- EXCEPTIONS
- OTHERS = 1.
- ENDIF.
- * Remove * comment
- LOOP AT lt_query INTO ls_query WHERE line(1) = '*'.
- CLEAR ls_query-line.
- MODIFY lt_query FROM ls_query.
- ENDLOOP.
- * Remove " comment
- LOOP AT lt_query INTO ls_query WHERE line CS '"'.
- * condense ls_query-line.
- FIND FIRST OCCURRENCE OF '"' IN ls_query-line RESULTS ls_find.
- IF sy-subrc NE 0. "may not occurs
- CONTINUE.
- ENDIF.
- IF ls_find-offset GT 0.
- ls_query-line = ls_query-line(ls_find-offset).
- ELSE.
- CLEAR ls_query-line.
- ENDIF.
- MODIFY lt_query FROM ls_query.
- ENDLOOP.
- * Find active query
- CALL METHOD o_textedit->get_selection_pos
- IMPORTING
- from_line = lw_cursor_line
- from_pos = lw_cursor_pos.
- lw_cursor_offset = lw_cursor_pos - 1.
- FIND ALL OCCURRENCES OF '.' IN TABLE lt_query RESULTS lt_find.
- CLEAR : lw_delto_line,
- lw_delto_pos,
- lw_last.
- LOOP AT lt_find INTO ls_find.
- AT LAST.
- lw_last = abap_true.
- ENDAT.
- * Active Query
- IF ls_find-line GT lw_cursor_line
- OR ( ls_find-line = lw_cursor_line
- AND ls_find-offset GE lw_cursor_offset )
- OR ( lw_last = abap_true AND fp_force_last = abap_true ).
- * Delete all query after query active
- ls_find-line = ls_find-line + 1.
- DELETE lt_query FROM ls_find-line.
- ls_find-line = ls_find-line - 1.
- * Do not keep the . for active query
- IF ls_find-offset = 0.
- DELETE lt_query FROM ls_find-line.
- ELSE.
- READ TABLE lt_query INTO ls_query INDEX ls_find-line.
- ls_query-line = ls_query-line(ls_find-offset).
- MODIFY lt_query FROM ls_query INDEX ls_find-line.
- ENDIF.
- EXIT.
- * Query before active
- ELSE.
- lw_delto_line = ls_find-line.
- lw_delto_pos = ls_find-offset + 1.
- ENDIF.
- ENDLOOP.
- * Delete all query before query active
- IF NOT lw_delto_line IS INITIAL.
- IF lw_delto_line GT 1.
- lw_delto_line = lw_delto_line - 1.
- DELETE lt_query FROM 1 TO lw_delto_line.
- ENDIF.
- READ TABLE lt_query INTO ls_query INDEX 1.
- ls_query-line(lw_delto_pos) = ''.
- MODIFY lt_query FROM ls_query INDEX 1.
- ENDIF.
- * Delete empty lines
- DELETE lt_query WHERE line CO ' .'.
- * Build query string & Remove unnessential spaces
- LOOP AT lt_query INTO ls_query.
- CONDENSE ls_query-line.
- SHIFT ls_query-line LEFT DELETING LEADING space.
- CONCATENATE fp_query ls_query-line INTO fp_query SEPARATED BY space.
- ENDLOOP.
- IF NOT fp_query IS INITIAL.
- fp_query = fp_query+1.
- ENDIF.
- CLEAR lw_cursor_pos.
- * Remove useless into (corresponding fields of) table
- IF fp_query CS 'into table'. "ignoring case
- lw_cursor_pos = sy-fdpos.
- lw_cursor_offset = sy-fdpos + 11.
- ELSEIF fp_query CS 'into corresponding fields of table'. "ignoring case
- lw_cursor_pos = sy-fdpos.
- lw_cursor_offset = sy-fdpos + 35.
- ELSEIF fp_query CS 'into corresponding fields of'. "ignoring case
- lw_cursor_pos = sy-fdpos.
- lw_cursor_offset = sy-fdpos + 29.
- ENDIF.
- * Word after into table is the internal table name, remove it with "into table"
- IF lw_cursor_pos NE 0.
- DO.
- lw_last = fp_query+lw_cursor_offset(1).
- IF lw_last = space.
- lw_cursor_offset = lw_cursor_offset + 1.
- CONCATENATE fp_query(lw_cursor_pos) fp_query+lw_cursor_offset INTO fp_query.
- EXIT. "exit do
- ENDIF.
- lw_cursor_offset = lw_cursor_offset + 1.
- ENDDO.
- ENDIF.
- * If no query selected, try to get the last one
- IF lt_query IS INITIAL AND fp_force_last = space.
- PERFORM get_query USING abap_true
- CHANGING fp_query.
- ENDIF.
- ENDFORM. " GET_QUERY
- *&---------------------------------------------------------------------*
- *& Form PARSE_QUERY
- *&---------------------------------------------------------------------*
- * Split the query into 3 parts : Select / From / Where
- * - Select : List of the fields to extract
- * - From : List of the tables - with join condition
- * - Where : List of filters + group, order, having clauses
- *----------------------------------------------------------------------*
- * -->FP_QUERY Query to parse
- * <--FP_SELECT Select part of the query
- * <--FP_FROM From part of the query
- * <--FP_WHERE Where part of the query
- * <--FP_ROWS Number of rows to display
- * <--FP_UNION Union part of the query
- * <--FP_NOAUTH Unallowed table entered
- *----------------------------------------------------------------------*
- FORM parse_query USING fp_query TYPE string
- CHANGING fp_select TYPE string
- fp_from TYPE string
- fp_where TYPE string
- fp_union TYPE string
- fp_rows TYPE n
- fp_noauth TYPE c.
- DATA : ls_find_select TYPE match_result,
- ls_find_from TYPE match_result,
- ls_find_where TYPE match_result,
- ls_sub LIKE LINE OF ls_find_select-submatches,
- lw_offset TYPE i,
- lw_length TYPE i,
- lw_query TYPE string,
- lo_regex TYPE REF TO cl_abap_regex,
- lt_split TYPE TABLE OF string,
- lw_string TYPE string,
- lw_tabix TYPE i,
- lw_table TYPE tabname.
- CLEAR : fp_select,
- fp_from,
- fp_where,
- fp_rows,
- fp_union,
- fp_noauth.
- lw_query = fp_query.
- * Search union
- FIND FIRST OCCURRENCE OF ' UNION SELECT ' IN lw_query
- RESULTS ls_find_select IGNORING CASE.
- IF sy-subrc = 0.
- lw_offset = ls_find_select-offset + 7.
- fp_union = lw_query+lw_offset.
- lw_query = lw_query(ls_find_select-offset).
- ENDIF.
- * Create regex
- CREATE OBJECT lo_regex
- EXPORTING
- pattern = 'UP TO ([0-9]+) ROWS'
- ignore_case = abap_true.
- * Search UP TO xxx ROWS.
- * Catch the number of rows, delete command in query
- FIND FIRST OCCURRENCE OF REGEX lo_regex
- IN fp_query RESULTS ls_find_select.
- IF sy-subrc = 0.
- READ TABLE ls_find_select-submatches INTO ls_sub INDEX 1.
- IF sy-subrc = 0.
- fp_rows = lw_query+ls_sub-offset(ls_sub-length).
- ENDIF.
- REPLACE FIRST OCCURRENCE OF REGEX lo_regex IN lw_query WITH ''.
- ENDIF.
- FIND FIRST OCCURRENCE OF 'SELECT ' IN lw_query
- RESULTS ls_find_select IGNORING CASE.
- IF sy-subrc NE 0.
- RETURN.
- ENDIF.
- FIND FIRST OCCURRENCE OF ' FROM '
- IN SECTION OFFSET ls_find_select-offset OF lw_query
- RESULTS ls_find_from IGNORING CASE.
- IF sy-subrc NE 0.
- RETURN.
- ENDIF.
- FIND FIRST OCCURRENCE OF ' WHERE '
- IN SECTION OFFSET ls_find_from-offset OF lw_query
- RESULTS ls_find_where IGNORING CASE.
- IF sy-subrc NE 0.
- FIND FIRST OCCURRENCE OF ' GROUP BY ' IN lw_query
- RESULTS ls_find_where IGNORING CASE.
- ENDIF.
- IF sy-subrc NE 0.
- FIND FIRST OCCURRENCE OF ' HAVING ' IN lw_query
- RESULTS ls_find_where IGNORING CASE.
- ENDIF.
- IF sy-subrc NE 0.
- FIND FIRST OCCURRENCE OF ' ORDER BY ' IN lw_query
- RESULTS ls_find_where IGNORING CASE.
- ENDIF.
- lw_offset = ls_find_select-offset + 7.
- lw_length = ls_find_from-offset - ls_find_select-offset - 7.
- IF lw_length > 0.
- fp_select = lw_query+lw_offset(lw_length).
- ENDIF.
- lw_offset = ls_find_from-offset + 6.
- IF ls_find_where IS INITIAL.
- fp_from = lw_query+lw_offset.
- fp_where = ''.
- ELSE.
- lw_length = ls_find_where-offset - ls_find_from-offset - 6.
- fp_from = lw_query+lw_offset(lw_length).
- lw_offset = ls_find_where-offset.
- fp_where = lw_query+lw_offset.
- ENDIF.
- * Set default number of rows to default
- IF fp_rows IS INITIAL.
- fp_rows = gv_max_rows.
- ENDIF.
- * Remove , in field list
- IF fp_select CS ','.
- REPLACE ALL OCCURRENCES OF ',' IN fp_select WITH ''.
- ENDIF.
- * Authority-check on used select tables
- IF s_auth-auth_object NE space OR s_auth-select NE '*'.
- CONCATENATE 'JOIN' fp_from INTO lw_string SEPARATED BY space.
- TRANSLATE lw_string TO UPPER CASE.
- SPLIT lw_string AT space INTO TABLE lt_split.
- LOOP AT lt_split INTO lw_string.
- lw_tabix = sy-tabix + 1.
- CHECK lw_string = 'JOIN'.
- * Read next line (table name)
- READ TABLE lt_split INTO lw_table INDEX lw_tabix.
- CHECK sy-subrc = 0.
- IF s_auth-auth_object NE space.
- AUTHORITY-CHECK OBJECT s_auth-auth_object
- ID 'TABLE' FIELD lw_table
- ID 'ACTVT' FIELD c_actvt_auth_display.
- ELSEIF s_auth-select NE '*' AND NOT lw_table CP s_auth-select.
- sy-subrc = 4.
- ENDIF.
- IF sy-subrc NE 0.
- CONCATENATE 'No authorisation for table'(m13) lw_table
- INTO lw_string SEPARATED BY space.
- MESSAGE lw_string TYPE c_msg_success DISPLAY LIKE c_msg_error.
- CLEAR fp_from.
- fp_noauth = abap_true.
- RETURN.
- ENDIF.
- ENDLOOP.
- ENDIF.
- ENDFORM. " PARSE_QUERY
- *&---------------------------------------------------------------------*
- *& Form add_line_to_table
- *&---------------------------------------------------------------------*
- * Add a string line in a table
- * Break line at 255 char, respecting words if possible
- *----------------------------------------------------------------------*
- * -->FP_LINE Line to add in table
- * <--FT_TABLE Table to append
- *----------------------------------------------------------------------*
- FORM add_line_to_table USING fp_line TYPE string
- CHANGING ft_table TYPE table.
- DATA : lw_length TYPE i,
- lw_offset TYPE i,
- ls_find TYPE match_result.
- lw_length = strlen( fp_line ).
- lw_offset = 0.
- DO.
- IF lw_length LE c_line_max.
- APPEND fp_line+lw_offset(lw_length) TO ft_table.
- EXIT. "exit do
- ELSE.
- FIND ALL OCCURRENCES OF REGEX '\s' "search space
- IN SECTION OFFSET lw_offset LENGTH c_line_max
- OF fp_line RESULTS ls_find.
- IF sy-subrc NE 0.
- APPEND fp_line+lw_offset(c_line_max) TO ft_table.
- lw_length = lw_length - c_line_max.
- lw_offset = lw_offset + c_line_max.
- ELSE.
- ls_find-length = ls_find-offset - lw_offset.
- APPEND fp_line+lw_offset(ls_find-length) TO ft_table.
- lw_length = lw_length + lw_offset - ls_find-offset - 1.
- lw_offset = ls_find-offset + 1.
- ENDIF.
- ENDIF.
- ENDDO.
- ENDFORM. "add_line_to_table
- *&---------------------------------------------------------------------*
- *& Form GENERATE_SUBROUTINE
- *&---------------------------------------------------------------------*
- * Create SELECT SQL query in a new generated temp program
- *----------------------------------------------------------------------*
- * -->FP_SELECT Select part of the query
- * -->FP_FROM From part of the query
- * -->FP_WHERE Where part of the query
- * -->FP_DISPLAY Display code instead of generated routine
- * <--FP_PROGRAM Name of the generated program
- * <--FP_ROWS Number of rows to display
- * <--FT_FIELDLIST List of fields to display
- *----------------------------------------------------------------------*
- FORM generate_subroutine USING fp_select TYPE string
- fp_from TYPE string
- fp_where TYPE string
- fp_display TYPE c
- CHANGING fp_program TYPE sy-repid
- fp_rows TYPE n
- ft_fieldlist TYPE ty_fieldlist_table
- fp_count TYPE c.
- DATA : lt_code_string TYPE TABLE OF string,
- lt_split TYPE TABLE OF string,
- lw_string TYPE string,
- lw_string2 TYPE string,
- BEGIN OF ls_table_alias,
- table(50) TYPE c,
- alias(50) TYPE c,
- END OF ls_table_alias,
- lt_table_alias LIKE TABLE OF ls_table_alias,
- lw_select TYPE string,
- lw_from TYPE string,
- lw_index TYPE i,
- lw_select_distinct TYPE c,
- lw_select_length TYPE i,
- lw_char_10(10) TYPE c,
- lw_field_number(6) TYPE n,
- lw_current_line TYPE i,
- lw_current_length TYPE i,
- lw_struct_line TYPE string,
- lw_struct_line_type TYPE string,
- lw_select_table TYPE string,
- lw_select_field TYPE string,
- lw_dd03l_fieldname TYPE dd03l-fieldname,
- lw_position_dummy TYPE dd03l-position,
- lw_mess(255),
- lw_line TYPE i,
- lw_word(30),
- ls_fieldlist TYPE ty_fieldlist,
- lw_strlen_string TYPE string,
- lw_explicit TYPE string.
- DEFINE c.
- lw_strlen_string = &1.
- perform add_line_to_table using lw_strlen_string
- changing lt_code_string.
- END-OF-DEFINITION.
- CLEAR : lw_select_distinct,
- fp_count.
- * Write Header
- c 'PROGRAM SUBPOOL.'.
- c '** GENERATED PROGRAM * DO NOT CHANGE IT **'.
- c 'TYPE-POOLS: slis.'. "#EC NOTEXT
- c ''.
- lw_select = fp_select.
- TRANSLATE lw_select TO UPPER CASE.
- lw_from = fp_from.
- TRANSLATE lw_from TO UPPER CASE.
- * Search special term "single" or "distinct"
- lw_select_length = strlen( lw_select ).
- IF lw_select_length GE 7.
- lw_char_10 = lw_select(7).
- IF lw_char_10 = 'SINGLE'.
- * Force rows number = 1 for select single
- fp_rows = 1.
- lw_select = lw_select+7.
- lw_select_length = lw_select_length - 7.
- ENDIF.
- ENDIF.
- IF lw_select_length GE 9.
- lw_char_10 = lw_select(9).
- IF lw_char_10 = 'DISTINCT'.
- lw_select_distinct = abap_true.
- lw_select = lw_select+9.
- lw_select_length = lw_select_length - 9.
- ENDIF.
- ENDIF.
- * Search for special syntax "count( * )"
- IF lw_select = 'COUNT( * )'.
- fp_count = abap_true.
- ENDIF.
- * Create alias table mapping
- SPLIT lw_from AT space INTO TABLE lt_split.
- LOOP AT lt_split INTO lw_string.
- IF lw_string IS INITIAL OR lw_string CO space.
- DELETE lt_split.
- ENDIF.
- ENDLOOP.
- DO.
- READ TABLE lt_split TRANSPORTING NO FIELDS WITH KEY = 'AS'.
- IF sy-subrc NE 0.
- EXIT. "exit do
- ENDIF.
- lw_index = sy-tabix - 1.
- READ TABLE lt_split INTO lw_string INDEX lw_index.
- ls_table_alias-table = lw_string.
- DELETE lt_split INDEX lw_index. "delete table field
- DELETE lt_split INDEX lw_index. "delete keywork AS
- READ TABLE lt_split INTO lw_string INDEX lw_index.
- ls_table_alias-alias = lw_string.
- DELETE lt_split INDEX lw_index. "delete alias field
- APPEND ls_table_alias TO lt_table_alias.
- ENDDO.
- * If no alias table found, create just an entry for "*"
- IF lt_table_alias[] IS INITIAL.
- READ TABLE lt_split INTO lw_string INDEX 1.
- ls_table_alias-table = lw_string.
- ls_table_alias-alias = '*'.
- APPEND ls_table_alias TO lt_table_alias.
- ENDIF.
- SORT lt_table_alias BY alias.
- * Write Data declaration
- c '***************************************'. "#EC NOTEXT
- c '* Begin of data declaration *'. "#EC NOTEXT
- c '* Used to store lines of the query *'. "#EC NOTEXT
- c '***************************************'. "#EC NOTEXT
- c 'DATA: BEGIN OF s_result'. "#EC NOTEXT
- lw_field_number = 1.
- SPLIT lw_select AT space INTO TABLE lt_split.
- LOOP AT lt_split INTO lw_string.
- lw_current_line = sy-tabix.
- IF lw_string = 'AS'.
- DELETE lt_split INDEX lw_current_line. "delete AS
- DELETE lt_split INDEX lw_current_line. "delete the alias name
- CONTINUE.
- ENDIF.
- lw_current_length = strlen( lw_string ).
- CLEAR ls_fieldlist.
- ls_fieldlist-ref_field = lw_string.
- * Manage "Count"
- IF lw_current_length GE 6.
- lw_char_10 = lw_string(6).
- ELSE.
- CLEAR lw_char_10.
- ENDIF.
- IF lw_char_10 = 'COUNT('.
- CONCATENATE 'F' lw_field_number INTO ls_fieldlist-field.
- CONCATENATE ',' ls_fieldlist-field INTO lw_struct_line.
- lw_index = lw_current_line + 1.
- DO.
- SEARCH lw_string FOR ')'.
- IF sy-subrc = 0.
- EXIT.
- ELSE.
- * If there is space in the "count()", delete next lines
- READ TABLE lt_split INTO lw_string INDEX lw_index.
- IF sy-subrc NE 0.
- EXIT.
- ENDIF.
- CONCATENATE ls_fieldlist-ref_field lw_string
- INTO ls_fieldlist-ref_field SEPARATED BY space.
- DELETE lt_split INDEX lw_index.
- ENDIF.
- ENDDO.
- CONCATENATE lw_struct_line 'TYPE i' "#EC NOTEXT
- INTO lw_struct_line SEPARATED BY space.
- c lw_struct_line.
- APPEND ls_fieldlist TO ft_fieldlist.
- lw_field_number = lw_field_number + 1.
- CONTINUE.
- ENDIF.
- * Manage Agregate AVG
- IF lw_current_length GE 4.
- lw_char_10 = lw_string(4).
- ELSE.
- CLEAR lw_char_10.
- ENDIF.
- IF lw_char_10 = 'AVG('.
- CONCATENATE 'F' lw_field_number INTO ls_fieldlist-field.
- CONCATENATE ',' ls_fieldlist-field INTO lw_struct_line.
- lw_index = lw_current_line + 1.
- DO.
- SEARCH lw_string FOR ')'.
- IF sy-subrc = 0.
- EXIT.
- ELSE.
- * If there is space in the agregate, delete next lines
- READ TABLE lt_split INTO lw_string INDEX lw_index.
- IF sy-subrc NE 0.
- EXIT.
- ENDIF.
- CONCATENATE ls_fieldlist-ref_field lw_string
- INTO ls_fieldlist-ref_field SEPARATED BY space.
- DELETE lt_split INDEX lw_index.
- ENDIF.
- ENDDO.
- CONCATENATE lw_struct_line 'TYPE f' "#EC NOTEXT
- INTO lw_struct_line SEPARATED BY space.
- c lw_struct_line.
- APPEND ls_fieldlist TO ft_fieldlist.
- lw_field_number = lw_field_number + 1.
- CONTINUE.
- ENDIF.
- * Manage agregate SUM, MAX, MIN
- IF lw_current_length GE 4.
- lw_char_10 = lw_string(4).
- ELSE.
- CLEAR lw_char_10.
- ENDIF.
- IF lw_char_10 = 'SUM(' OR lw_char_10 = 'MAX('
- OR lw_char_10 = 'MIN('.
- lw_index = lw_current_line + 1.
- DO.
- SEARCH lw_string FOR ')'.
- IF sy-subrc = 0.
- EXIT.
- ELSE.
- * Search name of the field in next lines.
- READ TABLE lt_split INTO lw_string INDEX lw_index.
- IF sy-subrc NE 0.
- EXIT.
- ENDIF.
- CONCATENATE ls_fieldlist-ref_field lw_string
- INTO ls_fieldlist-ref_field SEPARATED BY space.
- IF lw_string2 IS INITIAL.
- lw_string2 = lw_string.
- ENDIF.
- * Delete lines of agregage in field table
- DELETE lt_split INDEX lw_index.
- ENDIF.
- ENDDO.
- lw_string = lw_string2.
- ENDIF.
- * Now lw_string contain a field name.
- * We have to find the field description
- SPLIT lw_string AT '~' INTO lw_select_table lw_select_field.
- IF lw_select_field IS INITIAL.
- lw_select_field = lw_select_table.
- lw_select_table = '*'.
- ENDIF.
- * Search if alias table used
- CLEAR ls_table_alias.
- READ TABLE lt_table_alias INTO ls_table_alias
- WITH KEY alias = lw_select_table "#EC WARNOK
- BINARY SEARCH.
- IF sy-subrc = 0.
- lw_select_table = ls_table_alias-table.
- ENDIF.
- ls_fieldlist-ref_table = lw_select_table.
- IF lw_string = '*' OR lw_select_field = '*'. " expansion table~*
- CLEAR lw_explicit.
- SELECT fieldname position
- INTO (lw_dd03l_fieldname,lw_position_dummy)
- FROM dd03l
- WHERE tabname = lw_select_table
- AND fieldname <> 'MANDT'
- AND as4local = c_vers_active
- AND as4vers = space
- AND ( comptype = c_ddic_dtelm
- OR comptype = space )
- ORDER BY position.
- lw_select_field = lw_dd03l_fieldname.
- CONCATENATE 'F' lw_field_number INTO ls_fieldlist-field.
- ls_fieldlist-ref_field = lw_select_field.
- APPEND ls_fieldlist TO ft_fieldlist.
- CONCATENATE ',' ls_fieldlist-field INTO lw_struct_line.
- CONCATENATE lw_select_table '-' lw_select_field
- INTO lw_struct_line_type.
- CONCATENATE lw_struct_line 'TYPE' lw_struct_line_type
- INTO lw_struct_line
- SEPARATED BY space.
- c lw_struct_line.
- lw_field_number = lw_field_number + 1.
- * Explicit list of fields instead of *
- * Generate longer query but mandatory in case of T1~* or MARA~*
- * Required also in some special cases, for example if table use include
- IF ls_table_alias-alias = space OR ls_table_alias-alias = '*'.
- CONCATENATE lw_explicit lw_select_table
- INTO lw_explicit SEPARATED BY space.
- ELSE.
- CONCATENATE lw_explicit ls_table_alias-alias
- INTO lw_explicit SEPARATED BY space.
- ENDIF.
- CONCATENATE lw_explicit '~' lw_select_field INTO lw_explicit.
- ENDSELECT.
- IF sy-subrc NE 0.
- MESSAGE e701(1r) WITH lw_select_table. "table does not exist
- ENDIF.
- IF NOT lw_explicit IS INITIAL.
- REPLACE FIRST OCCURRENCE OF lw_string
- IN lw_select WITH lw_explicit.
- ENDIF.
- ELSE. "Simple field
- CONCATENATE 'F' lw_field_number INTO ls_fieldlist-field.
- ls_fieldlist-ref_field = lw_select_field.
- APPEND ls_fieldlist TO ft_fieldlist.
- CONCATENATE ',' ls_fieldlist-field INTO lw_struct_line.
- CONCATENATE lw_select_table '-' lw_select_field
- INTO lw_struct_line_type.
- CONCATENATE lw_struct_line 'TYPE' lw_struct_line_type
- INTO lw_struct_line
- SEPARATED BY space.
- c lw_struct_line.
- lw_field_number = lw_field_number + 1.
- ENDIF.
- ENDLOOP.
- c ', END OF s_result'. "#EC NOTEXT
- c ', t_result like table of s_result'. "#EC NOTEXT
- c ', w_timestart type timestampl'. "#EC NOTEXT
- c ', w_timeend type timestampl.'. "#EC NOTEXT
- * Write the dynamic subroutine that run the SELECT
- c 'FORM run_sql CHANGING fp_result TYPE REF TO data'. "#EC NOTEXT
- c ' fp_time type p'. "#EC NOTEXT
- c ' fp_count type i.'. "#EC NOTEXT
- c '***************************************'. "#EC NOTEXT
- c '* Begin of query *'. "#EC NOTEXT
- c '***************************************'. "#EC NOTEXT
- c 'get TIME STAMP FIELD w_timestart.'. "#EC NOTEXT
- IF fp_count = abap_true.
- CONCATENATE 'SELECT SINGLE' lw_select "#EC NOTEXT
- INTO lw_select SEPARATED BY space.
- c lw_select.
- c 'INTO s_result-f000001'. "#EC NOTEXT
- ELSE.
- IF lw_select_distinct NE space.
- CONCATENATE 'SELECT DISTINCT' lw_select "#EC NOTEXT
- INTO lw_select SEPARATED BY space.
- ELSE.
- CONCATENATE 'SELECT' lw_select "#EC NOTEXT
- INTO lw_select SEPARATED BY space.
- ENDIF.
- c lw_select.
- c 'INTO TABLE t_result'. "#EC NOTEXT
- * Add UP TO xxx ROWS
- c 'UP TO'. "#EC NOTEXT
- c fp_rows.
- c 'ROWS'. "#EC NOTEXT
- ENDIF.
- c 'FROM'. "#EC NOTEXT
- c lw_from.
- * Where, group by, having, order by
- IF NOT fp_where IS INITIAL.
- c fp_where.
- ENDIF.
- c '.'.
- * Display query execution time
- c 'get TIME STAMP FIELD w_timeend.'. "#EC NOTEXT
- c 'fp_time = w_timeend - w_timestart.'. "#EC NOTEXT
- c 'fp_count = sy-dbcnt.'. "#EC NOTEXT
- * If select count( * ), display number of results
- IF fp_count NE space.
- c 'MESSAGE i753(TG) WITH s_result-f000001.'. "#EC NOTEXT
- ENDIF.
- c 'GET REFERENCE OF t_result INTO fp_result.'. "#EC NOTEXT
- c 'ENDFORM.'. "#EC NOTEXT
- CLEAR : lw_line,
- lw_word,
- lw_mess.
- SYNTAX-CHECK FOR lt_code_string PROGRAM sy-repid
- MESSAGE lw_mess LINE lw_line WORD lw_word.
- IF sy-subrc NE 0 AND fp_display = space.
- MESSAGE lw_mess TYPE c_msg_error.
- ENDIF.
- IF fp_display = space.
- GENERATE SUBROUTINE POOL lt_code_string NAME fp_program.
- ELSE.
- IF lw_mess IS NOT INITIAL.
- lw_explicit = lw_line.
- CONCATENATE lw_mess '(line'(m28) lw_explicit ',word'(m29)
- lw_word ')'(m30)
- INTO lw_mess SEPARATED BY space.
- MESSAGE lw_mess TYPE c_msg_success DISPLAY LIKE c_msg_error.
- ENDIF.
- EDITOR-CALL FOR lt_code_string DISPLAY-MODE
- TITLE 'Generated code for current query'(t01).
- ENDIF.
- ENDFORM. " GENERATE_SUBROUTINE
- *&---------------------------------------------------------------------*
- *& Form DISPLAY_ALV_DATA
- *&---------------------------------------------------------------------*
- * Display data table in the bottom ALV part of the screen
- *----------------------------------------------------------------------*
- * -->FP_RESULT Reference to data to display
- * -->FT_FIELDLIST List of fields to display
- * -->FP_TITLE Title of the ALV
- *----------------------------------------------------------------------*
- FORM display_alv_data USING it_result TYPE STANDARD TABLE
- ft_fieldlist TYPE ty_fieldlist_table
- fp_title TYPE string.
- TYPE-POOLS lvc.
- DATA : ls_layout TYPE lvc_s_layo,
- lt_fieldcat TYPE lvc_t_fcat.
- DATA : lw_height TYPE i.
- FIELD-SYMBOLS: <ls_fieldlist> LIKE LINE OF ft_fieldlist,
- <ls_fieldcat> LIKE LINE OF lt_fieldcat.
- * Build field catalog
- lt_fieldcat = zcl_ca_alv_utils=>fieldcat_build( it_result ).
- * Adjuest column texts for COUNT/AVG fields
- LOOP AT ft_fieldlist ASSIGNING <ls_fieldlist>
- WHERE ref_table IS INITIAL.
- UNASSIGN <ls_fieldcat>.
- READ TABLE lt_fieldcat ASSIGNING <ls_fieldcat>
- WITH KEY fieldname = <ls_fieldlist>-field.
- <ls_fieldcat>-scrtext_s = <ls_fieldlist>-ref_field.
- <ls_fieldcat>-scrtext_m = <ls_fieldlist>-ref_field.
- <ls_fieldcat>-scrtext_l = <ls_fieldlist>-ref_field.
- <ls_fieldcat>-reptext = <ls_fieldlist>-ref_field.
- ENDLOOP.
- ls_layout-smalltitle = abap_true.
- ls_layout-zebra = abap_true.
- ls_layout-cwidth_opt = abap_true.
- ls_layout-grid_title = fp_title.
- ls_layout-countfname = 'COUNT'.
- * Set the grid config and content
- CALL METHOD o_alv_result->set_table_for_first_display
- EXPORTING
- is_layout = ls_layout
- CHANGING
- it_outtab = it_result
- it_fieldcatalog = lt_fieldcat.
- * Search if grid is currently displayed
- CALL METHOD o_splitter->get_row_height
- EXPORTING
- id = 1
- IMPORTING
- result = lw_height.
- CALL METHOD cl_gui_cfw=>flush.
- * If grid is hidden, display it
- IF lw_height = 100.
- CALL METHOD o_splitter->set_row_height
- EXPORTING
- id = 1
- height = 20.
- ENDIF.
- ENDFORM. " DISPLAY_ALV_DATA
- *&---------------------------------------------------------------------*
- *& Form INIT_DDIC
- *&---------------------------------------------------------------------*
- * Init ddic tree
- *----------------------------------------------------------------------*
- FORM init_ddic.
- DATA : ls_header TYPE treev_hhdr,
- ls_event TYPE cntl_simple_event,
- lt_events TYPE cntl_simple_events,
- lo_dragdrop TYPE REF TO cl_dragdrop.
- ls_header-heading = 'SAP Table/Fields'(t02).
- ls_header-t_image = '@42@'. "Refresh icon
- ls_header-width = 30.
- CREATE OBJECT o_tree_ddic
- EXPORTING
- parent = o_container_ddic
- node_selection_mode = cl_gui_column_tree=>node_sel_mode_single
- item_selection = abap_true
- hierarchy_column_name = c_ddic_col1
- hierarchy_header = ls_header
- EXCEPTIONS
- cntl_system_error = 1
- create_error = 2
- failed = 3
- illegal_node_selection_mode = 4
- illegal_column_name = 5
- lifetime_error = 6.
- IF sy-subrc <> 0.
- MESSAGE a000(tree_control_msg).
- ENDIF.
- * Column2
- CALL METHOD o_tree_ddic->add_column
- EXPORTING
- name = c_ddic_col2
- width = 21
- header_text = 'Description'(t03)
- header_image = '@13@'
- EXCEPTIONS
- column_exists = 1
- illegal_column_name = 2
- too_many_columns = 3
- illegal_alignment = 4
- different_column_types = 5
- cntl_system_error = 6
- failed = 7
- predecessor_column_not_found = 8.
- * Manage Header clic event to refresh screen
- ls_event-eventid = cl_gui_column_tree=>eventid_header_click.
- ls_event-appl_event = abap_true.
- APPEND ls_event TO lt_events.
- * Manage Item clic event to copy value in clipboard
- ls_event-eventid = cl_gui_column_tree=>eventid_item_double_click.
- ls_event-appl_event = abap_true.
- APPEND ls_event TO lt_events.
- CALL METHOD o_tree_ddic->set_registered_events
- EXPORTING
- events = lt_events
- EXCEPTIONS
- cntl_error = 1
- cntl_system_error = 2
- illegal_event_combination = 3.
- IF sy-subrc <> 0.
- MESSAGE a000(tree_control_msg).
- ENDIF.
- * Manage Drag from DDIC editor
- CREATE OBJECT lo_dragdrop.
- CALL METHOD lo_dragdrop->add
- EXPORTING
- flavor = 'EDIT_INSERT'
- dragsrc = abap_true
- droptarget = space
- effect = cl_dragdrop=>copy.
- CALL METHOD lo_dragdrop->get_handle
- IMPORTING
- handle = w_dragdrop_handle_tree.
- SET HANDLER o_handle_event->handle_header_click_ddic FOR o_tree_ddic.
- SET HANDLER o_handle_event->handle_item_dblclick_ddic FOR o_tree_ddic.
- SET HANDLER o_handle_event->handle_tree_drag FOR o_tree_ddic.
- * Calculate ZSPRO nodes to add at the bottom of the ddic tree
- PERFORM add_tree_zspro IN PROGRAM (sy-repid) IF FOUND.
- ENDFORM. " INIT_DDIC
- *&---------------------------------------------------------------------*
- *& Form init_toolbar
- *&---------------------------------------------------------------------*
- * text
- *----------------------------------------------------------------------*
- FORM init_toolbar.
- DATA: lt_button TYPE ttb_button,
- ls_button LIKE LINE OF lt_button,
- lt_events TYPE cntl_simple_events,
- ls_events LIKE LINE OF lt_events.
- CREATE OBJECT o_toolbar
- EXPORTING
- parent = o_container_toolbar.
- * Add buttons to toolbar
- ls_button-function = '9MAX_ROWS'.
- ls_button-icon = icon_change_number.
- ls_button-quickinfo = 'Set Default Max Rows'(tt2).
- ls_button-butn_type = cntb_btype_button.
- APPEND ls_button TO lt_button.
- CALL METHOD o_toolbar->add_button_group
- EXPORTING
- data_table = lt_button.
- PERFORM toolbar_max_rows_text_set.
- * Register events
- ls_events-eventid = cl_gui_toolbar=>m_id_function_selected.
- ls_events-appl_event = ' '.
- APPEND ls_events TO lt_events.
- CALL METHOD o_toolbar->set_registered_events
- EXPORTING
- events = lt_events.
- SET HANDLER o_handle_event->handle_toolbar_function_sel FOR o_toolbar.
- ENDFORM. "init_toolbar
- *&---------------------------------------------------------------------*
- *& Form SET_DDIC_TREE
- *&---------------------------------------------------------------------*
- * Refresh query with list of table/fields of the given query
- * Add User defined tree from ZSPRO (if relevant)
- *----------------------------------------------------------------------*
- * -->FP_FROM From part of the query
- *----------------------------------------------------------------------*
- FORM set_ddic_tree USING fp_from TYPE string.
- DATA : lw_from TYPE string,
- lt_split TYPE TABLE OF string,
- lw_string TYPE string,
- lw_tabix TYPE i,
- BEGIN OF ls_table_list,
- table(30),
- alias(30),
- END OF ls_table_list,
- lt_table_list LIKE TABLE OF ls_table_list,
- lw_node_number(6) TYPE n,
- ls_node LIKE LINE OF t_node_ddic,
- ls_item LIKE LINE OF t_item_ddic,
- lw_parent_node LIKE ls_node-node_key,
- BEGIN OF ls_ddic_fields,
- tabname TYPE dd03l-tabname,
- fieldname TYPE dd03l-fieldname,
- position TYPE dd03l-position,
- keyflag TYPE dd03l-keyflag,
- ddtext1 TYPE dd03t-ddtext,
- ddtext2 TYPE dd04t-ddtext,
- END OF ls_ddic_fields,
- lt_ddic_fields LIKE TABLE OF ls_ddic_fields.
- CONCATENATE 'FROM' fp_from INTO lw_from SEPARATED BY space.
- TRANSLATE lw_from TO UPPER CASE.
- SPLIT lw_from AT space INTO TABLE lt_split.
- LOOP AT lt_split INTO lw_string.
- lw_tabix = sy-tabix + 1.
- CHECK sy-tabix = 1 OR lw_string = 'JOIN'.
- * Read next line (table name)
- READ TABLE lt_split INTO lw_string INDEX lw_tabix.
- CHECK sy-subrc = 0.
- CLEAR ls_table_list.
- ls_table_list-table = lw_string.
- lw_tabix = lw_tabix + 1.
- * Read next line (search alias)
- READ TABLE lt_split INTO lw_string INDEX lw_tabix.
- IF sy-subrc = 0 AND lw_string = 'AS'.
- lw_tabix = lw_tabix + 1.
- READ TABLE lt_split INTO lw_string INDEX lw_tabix.
- IF sy-subrc = 0.
- ls_table_list-alias = lw_string.
- ENDIF.
- ENDIF.
- APPEND ls_table_list TO lt_table_list.
- ENDLOOP.
- * Get list of fields for selected tables
- IF NOT lt_table_list IS INITIAL.
- SELECT dd03l~tabname dd03l~fieldname dd03l~position
- dd03l~keyflag dd03t~ddtext dd04t~ddtext
- INTO TABLE lt_ddic_fields
- FROM dd03l
- LEFT OUTER JOIN dd03t
- ON dd03l~tabname = dd03t~tabname
- AND dd03l~fieldname = dd03t~fieldname
- AND dd03l~as4local = dd03t~as4local
- AND dd03t~ddlanguage = sy-langu
- LEFT OUTER JOIN dd04t
- ON dd03l~rollname = dd04t~rollname
- AND dd03l~as4local = dd04t~as4local
- AND dd04t~ddlanguage = sy-langu
- FOR ALL ENTRIES IN lt_table_list
- WHERE dd03l~tabname = lt_table_list-table
- AND dd03l~as4local = c_vers_active
- AND dd03l~as4vers = space
- AND ( dd03l~comptype = c_ddic_dtelm
- OR dd03l~comptype = space ).
- SORT lt_ddic_fields BY tabname keyflag DESCENDING position.
- DELETE ADJACENT DUPLICATES FROM lt_ddic_fields
- COMPARING tabname fieldname.
- ENDIF.
- * Build Node & Item tree
- REFRESH : t_node_ddic,
- t_item_ddic.
- lw_node_number = 0.
- LOOP AT lt_table_list INTO ls_table_list.
- * Check table exists (has at least one field)
- READ TABLE lt_ddic_fields TRANSPORTING NO FIELDS
- WITH KEY tabname = ls_table_list-table.
- IF sy-subrc NE 0.
- DELETE lt_table_list.
- CONTINUE.
- ENDIF.
- lw_node_number = lw_node_number + 1.
- CLEAR ls_node.
- ls_node-node_key = lw_node_number.
- ls_node-isfolder = abap_true.
- ls_node-n_image = '@PO@'.
- ls_node-exp_image = '@PO@'.
- ls_node-expander = abap_true.
- APPEND ls_node TO t_node_ddic.
- CLEAR ls_item.
- ls_item-node_key = lw_node_number.
- ls_item-class = cl_gui_column_tree=>item_class_text.
- ls_item-item_name = c_ddic_col1.
- IF ls_table_list-alias IS INITIAL.
- ls_item-text = ls_table_list-table.
- ELSE.
- CONCATENATE ls_table_list-table 'AS' ls_table_list-alias
- INTO ls_item-text SEPARATED BY space.
- ENDIF.
- APPEND ls_item TO t_item_ddic.
- ls_item-item_name = c_ddic_col2.
- SELECT SINGLE ddtext INTO ls_item-text
- FROM dd02t
- WHERE tabname = ls_table_list-table
- AND ddlanguage = sy-langu
- AND as4local = c_vers_active
- AND as4vers = space.
- IF sy-subrc NE 0.
- ls_item-text = ls_table_list-table.
- ENDIF.
- APPEND ls_item TO t_item_ddic.
- * Display list of fields
- lw_parent_node = ls_node-node_key.
- LOOP AT lt_ddic_fields INTO ls_ddic_fields
- WHERE tabname = ls_table_list-table.
- CLEAR ls_node.
- lw_node_number = lw_node_number + 1.
- ls_node-node_key = lw_node_number.
- ls_node-relatkey = lw_parent_node.
- ls_node-relatship = cl_gui_column_tree=>relat_last_child.
- IF ls_ddic_fields-keyflag = space.
- ls_node-n_image = '@3W@'.
- ls_node-exp_image = '@3W@'.
- ELSE.
- ls_node-n_image = '@3V@'.
- ls_node-exp_image = '@3V@'.
- ENDIF.
- ls_node-dragdropid = w_dragdrop_handle_tree.
- APPEND ls_node TO t_node_ddic.
- CLEAR ls_item.
- ls_item-node_key = lw_node_number.
- ls_item-class = cl_gui_column_tree=>item_class_text.
- ls_item-item_name = c_ddic_col1.
- ls_item-text = ls_ddic_fields-fieldname.
- APPEND ls_item TO t_item_ddic.
- ls_item-item_name = c_ddic_col2.
- IF NOT ls_ddic_fields-ddtext1 IS INITIAL.
- ls_item-text = ls_ddic_fields-ddtext1.
- ELSE.
- ls_item-text = ls_ddic_fields-ddtext2.
- ENDIF.
- APPEND ls_item TO t_item_ddic.
- ENDLOOP.
- ENDLOOP.
- * Add User defined tree from ZSPRO (if relevant)
- IF NOT t_node_zspro IS INITIAL.
- APPEND LINES OF t_node_zspro TO t_node_ddic.
- APPEND LINES OF t_item_zspro TO t_item_ddic.
- ENDIF.
- CALL METHOD o_tree_ddic->delete_all_nodes.
- CALL METHOD o_tree_ddic->add_nodes_and_items
- EXPORTING
- node_table = t_node_ddic
- item_table = t_item_ddic
- item_table_structure_name = 'MTREEITM'
- EXCEPTIONS
- failed = 1
- cntl_system_error = 3
- error_in_tables = 4
- dp_error = 5
- table_structure_name_not_found = 6.
- IF sy-subrc <> 0.
- MESSAGE a000(tree_control_msg).
- ENDIF.
- DESCRIBE TABLE lt_table_list LINES lw_tabix.
- * If no table found, display message
- IF lw_tabix = 0.
- MESSAGE 'No valid table found'(m15) TYPE c_msg_success
- DISPLAY LIKE c_msg_error.
- * If 1 table found, expand it
- ELSEIF lw_tabix = 1.
- o_tree_ddic->expand_root_nodes( ).
- ENDIF.
- ENDFORM. " SET_DDIC_TREE
- *&---------------------------------------------------------------------*
- *& Form SAVE_QUERY
- *&---------------------------------------------------------------------*
- * Save query
- *----------------------------------------------------------------------*
- FORM save_query.
- DATA : lt_query TYPE soli_tab,
- ls_query LIKE LINE OF lt_query,
- lw_query_with_cr TYPE string,
- lw_guid TYPE guid_32,
- ls_ztoad TYPE ztoad,
- lw_timestamp(14) TYPE c.
- * Set default options
- SELECT SINGLE class INTO s_options-visibilitygrp
- FROM usr02
- WHERE bname = sy-uname.
- s_options-visibility = '0'.
- * Ask for options / query name
- CALL SCREEN 0200 STARTING AT 10 5
- ENDING AT 60 7.
- IF s_options IS INITIAL.
- MESSAGE 'Action cancelled'(m14) TYPE c_msg_success
- DISPLAY LIKE c_msg_error.
- RETURN.
- ENDIF.
- * Get content of abap edit box
- CALL METHOD o_textedit->get_text
- IMPORTING
- table = lt_query[]
- EXCEPTIONS
- OTHERS = 1.
- * Serialize query into a string
- CLEAR lw_query_with_cr.
- LOOP AT lt_query INTO ls_query.
- CONCATENATE lw_query_with_cr ls_query cl_abap_char_utilities=>cr_lf
- INTO lw_query_with_cr.
- ENDLOOP.
- * Generate new GUID
- DO 100 TIMES.
- TRY.
- lw_guid = cl_system_uuid=>create_uuid_c32_static( ).
- CATCH cx_uuid_error.
- EXIT. "exit do
- ENDTRY.
- SELECT SINGLE queryid INTO ls_ztoad-queryid
- FROM ztoad
- WHERE queryid = lw_guid.
- IF sy-subrc NE 0.
- EXIT. "exit do
- ENDIF.
- ENDDO.
- ls_ztoad-queryid = lw_guid.
- ls_ztoad-owner = sy-uname.
- lw_timestamp(8) = sy-datum.
- lw_timestamp+8 = sy-uzeit.
- ls_ztoad-aedat = lw_timestamp.
- ls_ztoad-text = s_options-name.
- ls_ztoad-visibility = s_options-visibility.
- ls_ztoad-visibility_group = s_options-visibilitygrp.
- ls_ztoad-query = lw_query_with_cr.
- INSERT ztoad FROM ls_ztoad.
- IF sy-subrc = 0.
- MESSAGE s031(r9). "Query saved
- ELSE.
- MESSAGE e220(iqapi). "Error when saving the query
- ENDIF.
- * Reset the modified status
- o_textedit->set_textmodified_status( ).
- PERFORM fill_repository.
- PERFORM focus_repository USING lw_guid.
- ENDFORM. " SAVE_QUERY
- *&---------------------------------------------------------------------*
- *& Form INIT_REPOSITORY
- *&---------------------------------------------------------------------*
- * Initialize repository tree
- *----------------------------------------------------------------------*
- FORM init_repository.
- DATA: lt_event TYPE cntl_simple_events,
- ls_event TYPE cntl_simple_event.
- * Create a tree control
- CREATE OBJECT o_tree_repository
- EXPORTING
- parent = o_container_repository
- node_selection_mode = cl_gui_simple_tree=>node_sel_mode_single
- EXCEPTIONS
- lifetime_error = 1
- cntl_system_error = 2
- create_error = 3
- failed = 4
- OTHERS = 5.
- IF sy-subrc <> 0.
- MESSAGE a000(tree_control_msg).
- ENDIF.
- * Catch double clic to open query
- ls_event-eventid = cl_gui_simple_tree=>eventid_node_double_click.
- ls_event-appl_event = abap_true. " no PAI if event occurs
- APPEND ls_event TO lt_event.
- * Catch context menu call
- ls_event-eventid = cl_gui_simple_tree=>eventid_node_context_menu_req.
- ls_event-appl_event = abap_true. " no PAI if event occurs
- APPEND ls_event TO lt_event.
- CALL METHOD o_tree_repository->set_registered_events
- EXPORTING
- events = lt_event
- EXCEPTIONS
- cntl_error = 1
- cntl_system_error = 2
- illegal_event_combination = 3.
- IF sy-subrc <> 0.
- MESSAGE a000(tree_control_msg).
- ENDIF.
- * Assign event handlers in the application class to each desired event
- SET HANDLER o_handle_event->handle_dblclick_repository
- FOR o_tree_repository.
- SET HANDLER o_handle_event->handle_context_menu_repository
- FOR o_tree_repository.
- SET HANDLER o_handle_event->handle_context_menu_sel_repo
- FOR o_tree_repository.
- PERFORM fill_repository.
- ENDFORM. " INIT_REPOSITORY
- *&---------------------------------------------------------------------*
- *& Form FILL_REPOSITORY
- *&---------------------------------------------------------------------*
- * Fill repository tree with all allowed queries
- *----------------------------------------------------------------------*
- FORM fill_repository.
- DATA : lw_usergroup TYPE usr02-class,
- BEGIN OF ls_query,
- queryid TYPE ztoad-queryid,
- aedat TYPE ztoad-aedat,
- visibility TYPE ztoad-visibility,
- text TYPE ztoad-text,
- query TYPE ztoad-query,
- END OF ls_query,
- lt_query_my LIKE TABLE OF ls_query,
- lt_query_shared LIKE TABLE OF ls_query,
- lw_node_key(6) TYPE n,
- lw_queryid TYPE ztoad-queryid,
- lw_dummy(1) TYPE c. "#EC NEEDED
- * Get usergroup
- SELECT SINGLE class INTO lw_usergroup
- FROM usr02
- WHERE bname = sy-uname.
- * Get all my queries
- SELECT queryid aedat visibility text query INTO TABLE lt_query_my
- FROM ztoad
- WHERE owner = sy-uname.
- * Get all queries that i can use
- SELECT queryid aedat visibility text INTO TABLE lt_query_shared
- FROM ztoad
- WHERE owner NE sy-uname
- AND ( visibility = c_visibility_all
- OR ( visibility = c_visibility_shared
- AND visibility_group = lw_usergroup )
- ).
- REFRESH t_node_repository.
- CALL METHOD o_tree_repository->delete_all_nodes.
- CLEAR s_node_repository.
- s_node_repository-node_key = c_nodekey_repo_my.
- s_node_repository-isfolder = abap_true.
- * s_node-n_image = s_node-exp_image = '@MV@'.
- s_node_repository-text = 'My queries'(m16).
- APPEND s_node_repository TO t_node_repository.
- CLEAR lw_node_key.
- CONCATENATE sy-uname '+++' INTO lw_queryid.
- LOOP AT lt_query_my INTO ls_query WHERE queryid NP lw_queryid.
- lw_node_key = lw_node_key + 1.
- CLEAR s_node_repository.
- s_node_repository-node_key = lw_node_key.
- s_node_repository-relatkey = c_nodekey_repo_my.
- s_node_repository-relatship = cl_gui_simple_tree=>relat_last_child.
- IF ls_query-visibility = c_visibility_my.
- s_node_repository-n_image = s_node_repository-exp_image = '@LC@'.
- ELSE.
- s_node_repository-n_image = s_node_repository-exp_image = '@L9@'.
- ENDIF.
- s_node_repository-text = ls_query-text.
- s_node_repository-queryid = ls_query-queryid.
- s_node_repository-edit = abap_true.
- APPEND s_node_repository TO t_node_repository.
- ENDLOOP.
- CLEAR s_node_repository.
- s_node_repository-node_key = c_nodekey_repo_shared.
- s_node_repository-isfolder = abap_true.
- * s_node-n_image = s_node-exp_image = '@MV@'.
- s_node_repository-text = 'Shared queries'(m17).
- APPEND s_node_repository TO t_node_repository.
- LOOP AT lt_query_shared INTO ls_query.
- lw_node_key = lw_node_key + 1.
- CLEAR s_node_repository.
- s_node_repository-node_key = lw_node_key.
- s_node_repository-relatkey = c_nodekey_repo_shared.
- s_node_repository-relatship = cl_gui_simple_tree=>relat_last_child.
- s_node_repository-n_image = s_node_repository-exp_image = '@L9@'.
- s_node_repository-text = ls_query-text.
- s_node_repository-queryid = ls_query-queryid.
- s_node_repository-edit = space.
- APPEND s_node_repository TO t_node_repository.
- ENDLOOP.
- * Add history node
- CLEAR s_node_repository.
- s_node_repository-node_key = c_nodekey_repo_history.
- s_node_repository-isfolder = abap_true.
- * s_node-n_image = s_node-exp_image = '@MV@'.
- s_node_repository-text = 'History'(m18).
- APPEND s_node_repository TO t_node_repository.
- DELETE lt_query_my WHERE queryid NP lw_queryid.
- SORT lt_query_my BY aedat DESCENDING.
- LOOP AT lt_query_my INTO ls_query.
- lw_node_key = lw_node_key + 1.
- CLEAR s_node_repository.
- s_node_repository-node_key = lw_node_key.
- s_node_repository-relatkey = c_nodekey_repo_history.
- s_node_repository-relatship = cl_gui_simple_tree=>relat_last_child.
- s_node_repository-n_image = s_node_repository-exp_image = '@LC@'.
- s_node_repository-text = ls_query-text.
- s_node_repository-queryid = ls_query-queryid.
- s_node_repository-edit = abap_true.
- IF ls_query-query(1) = '*'.
- SPLIT ls_query-query+1 AT cl_abap_char_utilities=>cr_lf
- INTO ls_query-query lw_dummy.
- CONCATENATE s_node_repository-text ':' ls_query-query
- INTO s_node_repository-text SEPARATED BY space.
- ENDIF.
- APPEND s_node_repository TO t_node_repository.
- ENDLOOP.
- CALL METHOD o_tree_repository->add_nodes
- EXPORTING
- table_structure_name = 'MTREESNODE'
- node_table = t_node_repository
- EXCEPTIONS
- failed = 1
- error_in_node_table = 2
- dp_error = 3
- table_structure_name_not_found = 4
- OTHERS = 5.
- IF sy-subrc <> 0.
- MESSAGE a000(tree_control_msg).
- ENDIF.
- * Exand all root nodes (my, shared, history)
- CALL METHOD o_tree_repository->expand_root_nodes.
- ENDFORM. " FILL_REPOSITORY
- *&---------------------------------------------------------------------*
- *& Form SAVE_CURRENT_QUERY
- *&---------------------------------------------------------------------*
- * Save query in the history area
- * Keep only 100 last queries
- *----------------------------------------------------------------------*
- FORM save_current_query.
- DATA : lt_query TYPE soli_tab,
- ls_query LIKE LINE OF lt_query,
- lw_query_with_cr TYPE string,
- ls_ztoad TYPE ztoad,
- lw_number(2) TYPE n,
- lw_timestamp(14) TYPE c,
- lw_dummy(1) TYPE c, "#EC NEEDED
- lw_query_last TYPE string,
- lw_date(10) TYPE c,
- lw_time(8) TYPE c.
- * Get content of abap edit box
- CALL METHOD o_textedit->get_text
- IMPORTING
- table = lt_query[]
- EXCEPTIONS
- OTHERS = 1.
- * Serialize query into a string
- CLEAR lw_query_with_cr.
- LOOP AT lt_query INTO ls_query.
- CONCATENATE lw_query_with_cr ls_query cl_abap_char_utilities=>cr_lf
- INTO lw_query_with_cr.
- ENDLOOP.
- * Define timestamp
- lw_timestamp(8) = sy-datum.
- lw_timestamp+8 = sy-uzeit.
- ls_ztoad-aedat = lw_timestamp.
- * Search if query is same as last loaded
- SELECT SINGLE query INTO lw_query_last
- FROM ztoad
- WHERE queryid = w_last_loaded_query.
- IF sy-subrc = 0 AND lw_query_last = lw_query_with_cr.
- RETURN.
- ENDIF.
- * Get usergroup
- SELECT SINGLE class INTO ls_ztoad-visibility_group
- FROM usr02
- WHERE bname = sy-uname.
- CLEAR lw_number.
- * Get last query from history
- CONCATENATE sy-uname '#%' INTO ls_ztoad-queryid.
- SELECT queryid
- INTO ls_ztoad-queryid
- FROM ztoad
- UP TO 1 ROWS
- WHERE queryid LIKE ls_ztoad-queryid
- AND owner = sy-uname
- ORDER BY aedat DESCENDING.
- ENDSELECT.
- IF sy-subrc = 0.
- SPLIT ls_ztoad-queryid AT '#' INTO lw_dummy lw_number.
- ENDIF.
- lw_number = lw_number + 1.
- * For history query, guid = <sy-uname>#NN
- CONCATENATE sy-uname '#' lw_number INTO ls_ztoad-queryid.
- ls_ztoad-owner = sy-uname.
- ls_ztoad-visibility = c_visibility_my.
- * Define text for query as timestamp
- WRITE sy-datlo TO lw_date.
- WRITE sy-timlo TO lw_time.
- CONCATENATE lw_date lw_time INTO ls_ztoad-text SEPARATED BY space.
- ls_ztoad-query = lw_query_with_cr.
- MODIFY ztoad FROM ls_ztoad.
- w_last_loaded_query = ls_ztoad-queryid.
- * Reset the modified status
- o_textedit->set_textmodified_status( ).
- * Refresh repository
- PERFORM fill_repository.
- * Focus on new query
- PERFORM focus_repository USING ls_ztoad-queryid.
- ENDFORM. " SAVE_CURRENT_QUERY
- *&---------------------------------------------------------------------*
- *& Form LOAD_QUERY
- *&---------------------------------------------------------------------*
- * Load query
- *----------------------------------------------------------------------*
- * -->FP_QUERYID QueryID to load
- * <--FT_QUERY Saved query
- *----------------------------------------------------------------------*
- FORM load_query USING fp_queryid TYPE ztoad-queryid
- CHANGING ft_query TYPE table.
- DATA lw_query_with_cr TYPE string.
- REFRESH ft_query.
- SELECT SINGLE query INTO lw_query_with_cr
- FROM ztoad
- WHERE queryid = fp_queryid.
- IF sy-subrc = 0.
- SPLIT lw_query_with_cr AT cl_abap_char_utilities=>cr_lf
- INTO TABLE ft_query.
- ENDIF.
- w_last_loaded_query = fp_queryid.
- ENDFORM. " LOAD_QUERY
- *&---------------------------------------------------------------------*
- *& Form FOCUS_REPOSITORY
- *&---------------------------------------------------------------------*
- * Focus repository tree on a given queryid
- *----------------------------------------------------------------------*
- * -->FP_QUERYID ID of the query to focus
- *----------------------------------------------------------------------*
- FORM focus_repository USING fp_queryid TYPE ztoad-queryid.
- READ TABLE t_node_repository INTO s_node_repository
- WITH KEY queryid = fp_queryid.
- IF sy-subrc NE 0.
- RETURN.
- ENDIF.
- CALL METHOD o_tree_repository->set_selected_node
- EXPORTING
- node_key = s_node_repository-node_key.
- ENDFORM. " FOCUS_REPOSITORY
- *&---------------------------------------------------------------------*
- *& Form INIT_RESULT
- *&---------------------------------------------------------------------*
- * Init ALV grid
- *----------------------------------------------------------------------*
- FORM init_result.
- * Create ALV
- CREATE OBJECT o_alv_result
- EXPORTING
- i_parent = o_container_result.
- * Register event toolbar to add button
- SET HANDLER o_handle_event->handle_toolbar_result FOR o_alv_result.
- SET HANDLER o_handle_event->handle_user_command_result
- FOR o_alv_result.
- ENDFORM. " INIT_RESULT
- *&---------------------------------------------------------------------*
- *& Form INIT_LISTBOX_0200
- *&---------------------------------------------------------------------*
- * Fill dropdown listbox with value on screen 200
- *----------------------------------------------------------------------*
- FORM init_listbox_0200 .
- DATA : lt_visibility TYPE vrm_values,
- ls_visibility LIKE LINE OF lt_visibility.
- REFRESH lt_visibility.
- ls_visibility-key = c_visibility_my.
- ls_visibility-text = 'Personal'(m19).
- APPEND ls_visibility TO lt_visibility.
- ls_visibility-key = c_visibility_shared.
- ls_visibility-text = 'User group'(m20).
- APPEND ls_visibility TO lt_visibility.
- ls_visibility-key = c_visibility_all.
- ls_visibility-text = 'All'(m21).
- APPEND ls_visibility TO lt_visibility.
- CALL FUNCTION 'VRM_SET_VALUES'
- EXPORTING
- id = 'S_OPTIONS-VISIBILITY'
- values = lt_visibility.
- ENDFORM. " INIT_LISTBOX_0200
- *&---------------------------------------------------------------------*
- *& Form EXIT_PROGRAM
- *&---------------------------------------------------------------------*
- * Close the grid. If grid is closed, leave program
- * If sql text area is modified, ask confirmation before leave
- *----------------------------------------------------------------------*
- FORM exit_program .
- DATA : lw_status TYPE i,
- lw_answer(1) TYPE c,
- lw_size TYPE i.
- * Check if grid is displayed
- CALL METHOD o_splitter->get_row_height
- EXPORTING
- id = 1
- IMPORTING
- result = lw_size.
- CALL METHOD cl_gui_cfw=>flush.
- * If grid is displayed, BACK action is only to close the grid
- IF lw_size < 100.
- CALL METHOD o_splitter->set_row_height
- EXPORTING
- id = 1
- height = 100.
- RETURN.
- ENDIF.
- * Check if textedit is modified
- CALL METHOD o_textedit->get_textmodified_status
- IMPORTING
- status = lw_status.
- IF lw_status NE 0.
- CALL FUNCTION 'POPUP_TO_CONFIRM'
- EXPORTING
- text_question = ".
- 'Current query is not saved. Are you sure you want to exit ?'(m22) ".
- text_button_1 = 'Exit'(m23)
- icon_button_1 = '@01@'
- text_button_2 = 'Cancel'(m24)
- icon_button_2 = '@02@'
- default_button = '2'
- display_cancel_button = space
- IMPORTING
- answer = lw_answer.
- IF lw_answer NE '1'.
- RETURN.
- ENDIF.
- ENDIF.
- LEAVE TO SCREEN 0.
- ENDFORM. " EXIT_PROGRAM
- *&---------------------------------------------------------------------*
- *& Form DISPLAY_HELP
- *&---------------------------------------------------------------------*
- * Display help for this program
- *----------------------------------------------------------------------*
- FORM display_help.
- DATA : l_report TYPE string,
- l_report_char1(1) TYPE c,
- l_report_char3(3) TYPE c,
- l_comment_found TYPE i,
- lt_report LIKE TABLE OF l_report,
- lt_lines TYPE rcl_bag_tline,
- ls_line LIKE LINE OF lt_lines,
- ls_help TYPE help_info,
- lt_exclude TYPE STANDARD TABLE OF string.
- * Get program source code
- READ REPORT sy-repid INTO lt_report.
- ls_line-tdformat = 'U1'.
- ls_line-tdline = sy-title.
- APPEND ls_line TO lt_lines.
- ls_line-tdformat = 'U3'.
- ls_line-tdline = '&PURPOSE&'.
- APPEND ls_line TO lt_lines.
- LOOP AT lt_report INTO l_report.
- l_report_char1 = l_report.
- CHECK l_report_char1 = '*'.
- * Keep only the second block of comment
- * (first block is technical info, third is history)
- l_report_char3 = l_report.
- IF l_report_char3 = '*&-'.
- l_comment_found = l_comment_found + 1.
- IF l_comment_found LE 2.
- CONTINUE.
- ELSE. "l_comment_found > 2
- EXIT.
- ENDIF.
- ENDIF.
- IF l_comment_found = 2.
- l_report = l_report+1.
- l_report_char1 = l_report.
- CASE l_report_char1.
- WHEN '='.
- ls_line-tdformat = '='.
- WHEN '3'.
- ls_line-tdformat = 'U3'.
- WHEN 'E'.
- ls_line-tdformat = 'PE'.
- WHEN OTHERS.
- ls_line-tdformat = '*'.
- ENDCASE.
- IF NOT l_report_char1 IS INITIAL.
- l_report = l_report+1.
- ENDIF.
- IF l_report IS INITIAL.
- ls_line-tdformat = 'LZ'.
- ENDIF.
- ls_line-tdline = l_report.
- APPEND ls_line TO lt_lines.
- ENDIF.
- ENDLOOP.
- CALL FUNCTION 'HELP_DOCULINES_SHOW'
- EXPORTING
- help_infos = ls_help
- TABLES
- excludefun = lt_exclude
- helplines = lt_lines.
- ENDFORM. " DISPLAY_HELP
- *&---------------------------------------------------------------------*
- *& Form PARSE_QUERY_NOSELECT
- *&---------------------------------------------------------------------*
- * Check if query is a known SQL command and if user is allowed
- *----------------------------------------------------------------------*
- * -->FP_QUERY Query to check
- * <--FP_NOAUTH Unallowed table or command entered
- * <--FP_COMMAND Command to execute (INSERT, DELETE, ...)
- * <--FP_TABLE Target table of the query
- * <--FP_PARAM Parameters for the command (WHERE, SET, ...)
- *----------------------------------------------------------------------*
- FORM parse_query_noselect USING fp_query TYPE string
- CHANGING fp_noauth TYPE c
- fp_command TYPE string
- fp_table TYPE string
- fp_param TYPE string.
- DATA : lw_query TYPE string,
- lw_table TYPE tabname.
- CLEAR : fp_noauth,
- fp_table,
- fp_command,
- fp_param.
- lw_query = fp_query.
- SPLIT lw_query AT space INTO fp_command lw_query.
- TRANSLATE fp_command TO UPPER CASE.
- CASE fp_command.
- WHEN 'INSERT'.
- SPLIT lw_query AT space INTO fp_table fp_param.
- TRANSLATE fp_table TO UPPER CASE.
- CLEAR sy-subrc.
- IF s_auth-auth_object NE space.
- lw_table = fp_table.
- AUTHORITY-CHECK OBJECT s_auth-auth_object
- ID 'TABLE' FIELD lw_table
- ID 'ACTVT' FIELD c_actvt_auth_create.
- ENDIF.
- IF sy-subrc NE 0 OR
- ( s_auth-insert NE '*' AND fp_table NP s_auth-insert ).
- CONCATENATE 'No authorisation for table'(m13) fp_table
- INTO lw_query SEPARATED BY space.
- MESSAGE lw_query TYPE c_msg_success DISPLAY LIKE c_msg_error.
- fp_noauth = abap_true.
- RETURN.
- ENDIF.
- WHEN 'UPDATE'.
- SPLIT lw_query AT space INTO fp_table fp_param.
- TRANSLATE fp_table TO UPPER CASE.
- CLEAR sy-subrc.
- IF s_auth-auth_object NE space.
- lw_table = fp_table.
- AUTHORITY-CHECK OBJECT s_auth-auth_object
- ID 'TABLE' FIELD lw_table
- ID 'ACTVT' FIELD c_actvt_auth_change.
- ENDIF.
- IF sy-subrc NE 0 OR
- ( s_auth-update NE '*' AND fp_table NP s_auth-update ).
- CONCATENATE 'No authorisation for table'(m13) fp_table
- INTO lw_query SEPARATED BY space.
- MESSAGE lw_query TYPE c_msg_success DISPLAY LIKE c_msg_error.
- fp_noauth = abap_true.
- RETURN.
- ENDIF.
- WHEN 'DELETE'.
- SPLIT lw_query AT space INTO fp_table fp_param.
- TRANSLATE fp_table TO UPPER CASE.
- IF fp_table = 'FROM'.
- SPLIT fp_param AT space INTO fp_table fp_param.
- TRANSLATE fp_table TO UPPER CASE.
- ENDIF.
- CLEAR sy-subrc.
- IF s_auth-auth_object NE space.
- lw_table = fp_table.
- AUTHORITY-CHECK OBJECT s_auth-auth_object
- ID 'TABLE' FIELD lw_table
- ID 'ACTVT' FIELD c_actvt_auth_delete.
- ENDIF.
- IF sy-subrc NE 0 OR
- ( s_auth-delete NE '*' AND NOT fp_table CP s_auth-delete ).
- CONCATENATE 'No authorisation for table'(m13) fp_table
- INTO lw_query SEPARATED BY space.
- MESSAGE lw_query TYPE c_msg_success DISPLAY LIKE c_msg_error.
- fp_noauth = abap_true.
- RETURN.
- ENDIF.
- WHEN OTHERS.
- CONCATENATE 'SQL command not allowed :'(m25) fp_command
- INTO lw_query.
- MESSAGE lw_query TYPE c_msg_success DISPLAY LIKE c_msg_error.
- fp_noauth = abap_true.
- RETURN.
- ENDCASE.
- ENDFORM. " PARSE_QUERY_NOSELECT
- *&---------------------------------------------------------------------*
- *& Form GENERATE_SUBROUTINE_NOSELECT
- *&---------------------------------------------------------------------*
- * Create all other than SELECT SQL query in a new generated
- * temp program
- *----------------------------------------------------------------------*
- * -->FP_COMMAND Query type
- * -->FP_TABLE Target table of the query
- * -->FP_PARAM Parameters of the query
- * -->FP_DISPLAY Display code instead of generated routine
- * <--FP_PROGRAM Name of the generated program
- *----------------------------------------------------------------------*
- FORM generate_subroutine_noselect USING fp_command TYPE string
- fp_table TYPE string
- fp_param TYPE string
- fp_display TYPE c
- CHANGING fp_program TYPE sy-repid.
- DATA : lt_code_string TYPE TABLE OF string,
- lw_mess(255),
- lw_line TYPE i,
- lw_word(30),
- lw_strlen_string TYPE string,
- lw_explicit TYPE string,
- lw_length TYPE i,
- lw_pos TYPE i,
- lw_fieldnum TYPE i,
- lw_fieldval TYPE string,
- lw_fieldname TYPE string,
- lw_wait_name(1) TYPE c,
- lw_char(1) TYPE c,
- lw_started(1) TYPE c,
- lw_started_field(1) TYPE c.
- DEFINE c.
- lw_strlen_string = &1.
- perform add_line_to_table using lw_strlen_string
- changing lt_code_string.
- END-OF-DEFINITION.
- * Write Header
- c 'PROGRAM SUBPOOL.'. "#EC NOTEXT
- c '** GENERATED PROGRAM * DO NOT CHANGE IT **'. "#EC NOTEXT
- c 'type-pools: slis.'. "#EC NOTEXT
- c 'DATA : w_timestart type timestampl,'. "#EC NOTEXT
- c ' w_timeend type timestampl.'. "#EC NOTEXT
- c ''.
- IF fp_command = 'INSERT'.
- c 'DATA s_insert type'. "#EC NOTEXT
- c fp_table.
- c '.'. "#EC NOTEXT
- c 'FIELD-SYMBOLS <fs> TYPE ANY.'. "#EC NOTEXT
- c '.'. "#EC NOTEXT
- ENDIF.
- * Write the dynamic subroutine that run the SELECT
- c 'FORM run_sql CHANGING fp_result TYPE REF TO data'. "#EC NOTEXT
- c ' fp_time TYPE p'. "#EC NOTEXT
- c ' fp_count TYPE i.'. "#EC NOTEXT
- c '***************************************'. "#EC NOTEXT
- c '* Begin of query *'. "#EC NOTEXT
- c '***************************************'. "#EC NOTEXT
- c 'CLEAR fp_count.'. "#EC NOTEXT
- c 'GET TIME STAMP FIELD w_timestart.'. "#EC NOTEXT
- CASE fp_command.
- WHEN 'UPDATE'.
- c fp_command.
- c fp_table.
- c fp_param.
- c '.'.
- WHEN 'DELETE'.
- c fp_command.
- c 'FROM'. "#EC NOTEXT
- c fp_table.
- c fp_param.
- c '.'.
- WHEN 'INSERT'.
- IF fp_param(6) = 'VALUES'.
- lw_length = strlen( fp_param ).
- lw_pos = 6.
- lw_fieldnum = 0.
- WHILE lw_pos < lw_length.
- lw_char = fp_param+lw_pos(1).
- lw_pos = lw_pos + 1.
- IF lw_started = space.
- IF lw_char NE '('. "begin of the list
- CONTINUE.
- ENDIF.
- lw_started = abap_true.
- CONTINUE.
- ENDIF.
- IF lw_started_field = space.
- IF lw_char = ')'. "end of the list
- EXIT. "exit while
- ENDIF.
- IF lw_char NE ''''. "field value must start by '
- CONTINUE.
- ENDIF.
- lw_started_field = abap_true.
- lw_fieldval = lw_char.
- lw_fieldnum = lw_fieldnum + 1.
- CONTINUE.
- ENDIF.
- IF lw_char = space.
- CONCATENATE lw_fieldval lw_char INTO lw_fieldval
- SEPARATED BY space.
- ELSE.
- CONCATENATE lw_fieldval lw_char INTO lw_fieldval.
- ENDIF.
- IF lw_char = ''''. "end of a field ?
- IF lw_pos < lw_length.
- lw_char = fp_param+lw_pos(1).
- ELSE.
- CLEAR lw_char.
- ENDIF.
- IF lw_char = ''''. "not end !
- CONCATENATE lw_fieldval lw_char INTO lw_fieldval.
- lw_pos = lw_pos + 1.
- CONTINUE.
- ELSE. "end of a field!
- c 'ASSIGN COMPONENT'. "#EC NOTEXT
- c lw_fieldnum.
- c 'OF STRUCTURE s_insert TO <fs>.'. "#EC NOTEXT
- c '<fs> = '. "#EC NOTEXT
- c lw_fieldval.
- c '.'. "#EC NOTEXT
- lw_started_field = space.
- ENDIF.
- ENDIF.
- ENDWHILE.
- ELSEIF fp_param(3) = 'SET'.
- lw_length = strlen( fp_param ).
- lw_pos = 3.
- lw_fieldnum = 0.
- lw_wait_name = abap_true.
- WHILE lw_pos < lw_length.
- lw_char = fp_param+lw_pos(1).
- lw_pos = lw_pos + 1.
- IF lw_wait_name = abap_true.
- TRANSLATE lw_char TO UPPER CASE.
- IF lw_char = space OR NOT sy-abcde CS lw_char.
- CONTINUE. "not a begin of fieldname
- ENDIF.
- lw_wait_name = space.
- lw_started = abap_true.
- CONCATENATE 's_insert-' lw_char
- INTO lw_fieldname. "#EC NOTEXT
- CONTINUE.
- ENDIF.
- IF lw_started = abap_true.
- IF lw_char = space.
- CONCATENATE lw_fieldname lw_char INTO lw_fieldname
- SEPARATED BY space.
- ELSE.
- CONCATENATE lw_fieldname lw_char INTO lw_fieldname.
- ENDIF.
- IF lw_char = '='. "end of the field name
- lw_started = space.
- ENDIF.
- CONTINUE.
- ENDIF.
- IF lw_started_field NE abap_true.
- IF lw_char NE ''''. "field value must start by '
- CONTINUE.
- ENDIF.
- lw_started_field = abap_true.
- lw_fieldval = lw_char.
- CONTINUE.
- ENDIF.
- IF lw_char = space.
- CONCATENATE lw_fieldval lw_char INTO lw_fieldval
- SEPARATED BY space.
- ELSE.
- CONCATENATE lw_fieldval lw_char INTO lw_fieldval.
- ENDIF.
- IF lw_char = ''''. "end of a field ?
- IF lw_pos < lw_length.
- lw_char = fp_param+lw_pos(1).
- ELSE.
- CLEAR lw_char.
- ENDIF.
- IF lw_char = ''''. "not end !
- CONCATENATE lw_fieldval lw_char INTO lw_fieldval.
- lw_pos = lw_pos + 1.
- CONTINUE.
- ELSE. "end of a field!
- c lw_fieldname.
- c lw_fieldval.
- c '.'.
- lw_started_field = space.
- lw_wait_name = abap_true.
- ENDIF.
- ENDIF.
- ENDWHILE.
- ELSE.
- MESSAGE 'Error in INSERT syntax : VALUES / SET required'(m26)
- TYPE c_msg_error.
- ENDIF. "if fp_param(6) = 'VALUES'.
- c fp_command.
- c 'INTO'. "#EC NOTEXT
- c fp_table.
- c 'VALUES s_insert.'. "#EC NOTEXT
- ENDCASE.
- * Get query execution time & affected lines
- c 'IF sy-subrc = 0.'. "#EC NOTEXT
- c ' fp_count = sy-dbcnt.'. "#EC NOTEXT
- c 'ENDIF.'. "#EC NOTEXT
- c 'GET TIME STAMP FIELD w_timeend.'. "#EC NOTEXT
- c 'fp_time = w_timeend - w_timestart.'. "#EC NOTEXT
- c 'ENDFORM.'. "#EC NOTEXT
- CLEAR : lw_line,
- lw_word,
- lw_mess.
- SYNTAX-CHECK FOR lt_code_string PROGRAM sy-repid
- MESSAGE lw_mess LINE lw_line WORD lw_word.
- IF sy-subrc NE 0 AND fp_display = space.
- MESSAGE lw_mess TYPE c_msg_error.
- ENDIF.
- IF fp_display = space.
- GENERATE SUBROUTINE POOL lt_code_string NAME fp_program.
- ELSE.
- IF lw_mess IS NOT INITIAL.
- lw_explicit = lw_line.
- CONCATENATE lw_mess '(line'(m28) lw_explicit ',word'(m29)
- lw_word ')'(m30)
- INTO lw_mess SEPARATED BY space.
- MESSAGE lw_mess TYPE c_msg_success DISPLAY LIKE c_msg_error.
- ENDIF.
- EDITOR-CALL FOR lt_code_string DISPLAY-MODE
- TITLE 'Generated code for current query'(t01).
- ENDIF.
- ENDFORM. " GENERATE_SUBROUTINE_NOSELECT
- *&---------------------------------------------------------------------*
- *& Form GET_FIELD_FROM_NODE
- *&---------------------------------------------------------------------*
- * Get text for a DDIC node
- * Format of the text : tablename~fieldname
- *----------------------------------------------------------------------*
- * -->FW_NODE_KEY DDIC node key
- * -->FW_RELAT_KEY DDIC parent node key
- * -->FW_DATA Text
- *----------------------------------------------------------------------*
- FORM get_field_from_node USING fw_node_key TYPE tv_nodekey
- fw_relat_key TYPE tv_nodekey
- CHANGING fw_text TYPE string.
- DATA : ls_item LIKE LINE OF t_item_ddic,
- ls_item_parent LIKE LINE OF t_item_ddic,
- lw_table TYPE string,
- lw_alias TYPE string.
- * Get field name
- READ TABLE t_item_ddic INTO ls_item
- WITH KEY node_key = fw_node_key
- item_name = c_ddic_col1.
- * Get table name
- READ TABLE t_item_ddic INTO ls_item_parent
- WITH KEY node_key = fw_relat_key
- item_name = c_ddic_col1.
- * Search for alias
- SPLIT ls_item_parent-text AT ' AS ' INTO lw_table lw_alias.
- IF NOT lw_alias IS INITIAL.
- lw_table = lw_alias.
- ENDIF.
- * Build tablename~fieldname
- CONCATENATE lw_table '~' ls_item-text INTO fw_text.
- CONCATENATE space fw_text space INTO fw_text RESPECTING BLANKS.
- ENDFORM. " GET_FIELD_FROM_NODE
- *&---------------------------------------------------------------------*
- *& Form PASTE_TO_EDITOR
- *&---------------------------------------------------------------------*
- * Paste given text to SQL editor at given position
- *----------------------------------------------------------------------*
- * -->FW_TEXT Text to paste in editor
- * -->FW_LINE Line in editor to paste
- * -->FW_POS Position in the line in editor
- *----------------------------------------------------------------------*
- FORM paste_to_editor USING fw_text TYPE string
- fw_line TYPE i
- fw_pos TYPE i.
- STATICS: sv_set_new_line TYPE xfeld VALUE abap_true.
- DATA : lt_text TYPE TABLE OF string,
- lv_text LIKE LINE OF lt_text,
- lw_line TYPE i,
- lw_pos TYPE i,
- lw_message TYPE string.
- * Set text with/without new line
- APPEND fw_text TO lt_text.
- IF sv_set_new_line = abap_true.
- PERFORM string_blanks_get USING fw_pos
- CHANGING lv_text.
- APPEND lv_text TO lt_text.
- ENDIF.
- CALL METHOD o_textedit->insert_block_at_position
- EXPORTING
- line = fw_line
- pos = fw_pos
- text_tab = lt_text
- EXCEPTIONS
- OTHERS = 0.
- * Set cursor at end of line / new (empty) line
- IF sv_set_new_line = abap_true.
- lw_line = fw_line + 1.
- lw_pos = fw_pos.
- ELSE.
- lw_line = fw_line.
- lw_pos = fw_pos + strlen( fw_text ).
- ENDIF.
- CALL METHOD o_textedit->set_selection_pos_in_line
- EXPORTING
- line = lw_line
- pos = lw_pos
- EXCEPTIONS
- OTHERS = 0.
- * Focus on editor
- CALL METHOD cl_gui_control=>set_focus
- EXPORTING
- control = o_textedit
- EXCEPTIONS
- OTHERS = 0.
- CONCATENATE fw_text 'pasted to SQL Editor'(m27)
- INTO lw_message SEPARATED BY space.
- MESSAGE lw_message TYPE c_msg_success.
- ENDFORM. " PASTE_TO_EDITOR
- *&---------------------------------------------------------------------*
- *& Form string_blanks_get
- *&---------------------------------------------------------------------*
- * text
- *----------------------------------------------------------------------*
- * -->IV_POSITION text
- * -->EV_TEXT text
- *----------------------------------------------------------------------*
- FORM string_blanks_get USING iv_position TYPE numeric
- CHANGING ev_text TYPE string.
- DATA: lv_blanks TYPE i.
- CLEAR ev_text.
- lv_blanks = iv_position - 1.
- DO lv_blanks TIMES.
- CONCATENATE ev_text space INTO ev_text RESPECTING BLANKS.
- ENDDO.
- ENDFORM. "string_blanks_get
- *&---------------------------------------------------------------------*
- *& Form query_delete
- *&---------------------------------------------------------------------*
- * text
- *----------------------------------------------------------------------*
- * -->IV_NODE_KEY text
- *----------------------------------------------------------------------*
- FORM query_delete USING iv_node_key TYPE tv_nodekey
- CHANGING ev_error TYPE xfeld.
- CLEAR ev_error.
- READ TABLE t_node_repository INTO s_node_repository
- WITH KEY node_key = iv_node_key.
- IF sy-subrc = 0 AND s_node_repository-edit NE space.
- DELETE FROM ztoad WHERE queryid = s_node_repository-queryid.
- IF sy-subrc = 0.
- CALL METHOD o_tree_repository->delete_node
- EXPORTING
- node_key = iv_node_key.
- ELSE.
- ev_error = abap_true.
- ENDIF.
- ENDIF.
- ENDFORM. "query_delete
- *&---------------------------------------------------------------------*
- *& Form query_selected_Delete
- *&---------------------------------------------------------------------*
- * text
- *----------------------------------------------------------------------*
- FORM query_selected_delete.
- DATA l_node_key TYPE tv_nodekey.
- DATA: lv_error TYPE xfeld.
- CALL METHOD o_tree_repository->get_selected_node
- IMPORTING
- node_key = l_node_key.
- PERFORM query_delete USING l_node_key
- CHANGING lv_error.
- IF lv_error = abap_false.
- MESSAGE 'Query deleted'(m02) TYPE c_msg_success.
- ELSE.
- MESSAGE 'Error when deleting the query'(m03)
- TYPE c_msg_success.
- ENDIF.
- ENDFORM. "query_selected_Delete
- *&---------------------------------------------------------------------*
- *& Form queries_hist_delete
- *&---------------------------------------------------------------------*
- * text
- *----------------------------------------------------------------------*
- FORM queries_hist_delete.
- FIELD-SYMBOLS: <ls_node_repostiory> LIKE LINE OF t_node_repository.
- DATA: lv_error TYPE xfeld,
- lv_count TYPE i.
- LOOP AT t_node_repository ASSIGNING <ls_node_repostiory>
- WHERE relatkey = 'HISTO'.
- PERFORM query_delete USING <ls_node_repostiory>-node_key
- CHANGING lv_error.
- IF lv_error = abap_false.
- lv_count = lv_count + 1.
- ENDIF.
- ENDLOOP.
- MESSAGE s003(zca_toad) WITH lv_count.
- " '&Number of queries' Queries deleted
- ENDFORM. "query_selected_delete
- *&---------------------------------------------------------------------*
- *& Form max_rows_input_popup
- *&---------------------------------------------------------------------*
- * text
- *----------------------------------------------------------------------*
- * -->CV_MAX_ROWS text
- *----------------------------------------------------------------------*
- FORM max_rows_input_popup CHANGING cv_max_rows TYPE rseumod-tbmaxsel.
- DATA: lt_fields TYPE STANDARD TABLE OF sval,
- ls_fields LIKE LINE OF lt_fields,
- lv_returncode TYPE c.
- * Build table of fields: Max rows
- ls_fields-tabname = 'RSEUMOD'.
- ls_fields-fieldname = 'TBMAXSEL'.
- ls_fields-value = cv_max_rows.
- APPEND ls_fields TO lt_fields.
- * Display value request popup
- CALL FUNCTION 'POPUP_GET_VALUES'
- EXPORTING
- * NO_VALUE_CHECK = ' '
- popup_title = 'Please enter default:'(p01)
- * START_COLUMN = '5'
- * START_ROW = '5'
- IMPORTING
- returncode = lv_returncode
- TABLES
- fields = lt_fields
- * EXCEPTIONS
- * ERROR_IN_FIELDS = 1
- * OTHERS = 2
- .
- * If user has confirmed input - Update pricing date
- IF lv_returncode IS INITIAL.
- READ TABLE lt_fields INTO ls_fields
- WITH KEY fieldname = 'TBMAXSEL'.
- cv_max_rows = ls_fields-value.
- ENDIF.
- ENDFORM. "max_rows_input_popup
- *&---------------------------------------------------------------------*
- *& Form toolbar_max_rows_text_set
- *&---------------------------------------------------------------------*
- * text
- *----------------------------------------------------------------------*
- FORM toolbar_max_rows_text_set.
- DATA: lv_text TYPE text40,
- lv_rows TYPE char20.
- lv_text = 'Max rows: &1'(tt1).
- IF gv_max_rows > 0.
- lv_rows = |{ gv_max_rows }|.
- ELSE.
- lv_rows = 'Unlimited'(tt3).
- ENDIF.
- REPLACE FIRST OCCURRENCE OF '&1' IN lv_text
- WITH lv_rows.
- o_toolbar->set_button_info(
- EXPORTING
- fcode = '9MAX_ROWS'
- * icon = icon " Icon Name Defined Like "@0a@"
- text = lv_text
- * quickinfo = quickinfo " Purpose of Button Text
- * EXCEPTIONS
- * cntl_error = 1
- * cntb_error_fcode = 2
- * others = 3
- ).
- ENDFORM. "toolbar_max_rows_text_set
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement