SQL查询报表

REPORT ZSQLEXEC.

*INCLUDE zsqlexplorerf08.
INCLUDE zsqlexplorerf01.
INCLUDE zsqlexplorertop.
INCLUDE zsqlexplorerf02.
INCLUDE zsqlexplorerf03.
INCLUDE zsqlexplorerf07.
INCLUDE zsqlexplorerf04.
INCLUDE zsqlexplorerf05.
INCLUDE zsqlexplorerf06.

INCLUDE zsqlexplorero01.
INCLUDE zsqlexplorero02.
INCLUDE zsqlexploreri01.
INCLUDE zsqlexploreri02.

START-OF-SELECTION.
CALL SCREEN c_100.

*****&&&&&&&&&&&&&&&&&&
&---------------------------------------------------------------------
*& 包含 ZSQLEXPLORERF01 zyq
&---------------------------------------------------------------------

CONSTANTS: c_line_length TYPE i VALUE 250. "Modify zyq by 20181119 由150加大到250

*& Message
CONSTANTS :
c_sql_editor TYPE c LENGTH 10 VALUE ‘SQL_EDITOR’,

c_msg01 TYPE string VALUE
‘实例化TextEdit控件的ABAP代理时出错’,
c_msg02 TYPE string VALUE
‘错误的被冲洗’,
c_msg03 TYPE string VALUE
‘检索文本表单TextEdit控件时出错’,
c_msg04 TYPE string VALUE
‘将文本发送到TextEdit控件时出错’,
c_msg05 TYPE string VALUE
‘破坏TextEdit控件时出错’.

CONSTANTS :
c_sql_key_word_01 TYPE string
VALUE ‘-SELECT-FROM-INNER-JOIN-ON-LEFT-OUTER-’,

c_sql_key_word_02 TYPE string
VALUE ‘-CLIENT-SPECIFIED-INTO-APPENDING-AND-OR-IN-BETWEEN-LIKE-’,

c_sql_key_word_03 TYPE string
VALUE ‘-WHERE-ORDER-BY-GROUP-HAVING-ASCENDING-DESCENDING-’,

c_sql_key_word_04 TYPE string
VALUE ‘-AS-SINGLE-DISTINCT-SUM-COUNT-MIN-MAX-AVG-’,

c_select TYPE string VALUE ‘SELECT’,
c_sum TYPE string VALUE ‘SUM’,
c_count TYPE string VALUE ‘COUNT’,
c_count1 TYPE string VALUE ‘COUNT(’,
c_min TYPE string VALUE ‘MIN’,
c_max TYPE string VALUE ‘MAX’,
c_avg TYPE string VALUE ‘AVG’,
c_left TYPE string VALUE ‘(’,
c_right TYPE string VALUE ‘)’,
c_all_fields TYPE string VALUE ‘*’,
c_from TYPE string VALUE ‘FROM’,
c_on TYPE string VALUE ‘ON’,
c_inner TYPE string VALUE ‘INNER’,
c_join TYPE string VALUE ‘JOIN’,
c_out TYPE string VALUE ‘OUTER’,
c_left_j TYPE string VALUE ‘LEFT’,
c_as TYPE string VALUE ‘AS’,
c_or TYPE string VALUE ‘OR’,
c_and TYPE string VALUE ‘AND’,
c_single TYPE string VALUE ‘SINGLE’,
c_distinct TYPE string VALUE ‘DISTINCT’,
c_where TYPE string VALUE ‘WHERE’,
c_order TYPE string VALUE ‘ORDER’,
c_group TYPE string VALUE ‘GROUP’,
c_have TYPE string VALUE ‘HAVING’,
c_hex TYPE c LENGTH 5 VALUE ‘\X\09’,
c_funct TYPE string VALUE ‘FUNCT’,
c_separ TYPE string VALUE ‘-’,
c_ss TYPE string VALUE ‘~’,
c_quotes TYPE string VALUE ‘’‘’,

"c_line_fields TYPE i VALUE 3. "Modify zyq by 20181122
c_fields_blank TYPE i VALUE 1.

DATA c_line_fields TYPE i VALUE 5. "Modify zyq by 20181122

CONSTANTS :
c_comment1 TYPE string VALUE ‘*’,
c_comment2 TYPE string VALUE ‘"’.


  • To Definde Structure

TYPES: BEGIN OF st_text,
line TYPE c LENGTH c_line_length,
END OF st_text.

TYPES: tt_text TYPE STANDARD TABLE OF st_text .

TYPES: BEGIN OF st_element,
alias TYPE c LENGTH 40,
name TYPE c LENGTH 40,
source TYPE ddobjname,
link TYPE ddobjname,
label TYPE string,
index TYPE i,
display TYPE string,
display2 TYPE string, "add zyq by 20181122
END OF st_element.

TYPES: BEGIN OF st_exception,
id TYPE i,
icon TYPE icon_d,
msg TYPE string,
END OF st_exception.

TYPES: tt_element TYPE STANDARD TABLE OF st_element .
TYPES: tt_exception TYPE STANDARD TABLE OF st_exception .

TYPES: tt_code TYPE TABLE OF rssource-line .

*& end

&---------------------------------------------------------------------
*& 包含 ZSQLEXPLORERTOP zyq
&---------------------------------------------------------------------


  • To Constants

CONSTANTS :
c_100 TYPE rs37a-fnum VALUE ‘100’,
c_200 TYPE rs37a-fnum VALUE ‘200’.


  • To Define Varant

DATA :
it_text TYPE tt_text,
g_editor TYPE REF TO cl_gui_textedit,
g_editor1 TYPE REF TO cl_gui_textedit,
g_grid TYPE REF TO cl_gui_alv_grid,
g_splitter TYPE REF TO cl_gui_easy_splitter_container,
g_splitter1 TYPE REF TO cl_gui_easy_splitter_container,
g_container TYPE REF TO cl_gui_custom_container,
g_exception TYPE tt_exception,
g_ucomm TYPE sy-ucomm,
g_repid TYPE sy-repid,
g_file TYPE c LENGTH 50,

*& Configuration Parameters
l_case_01 TYPE c VALUE ‘’,
l_case_02 TYPE c VALUE ‘’,
l_case_03 TYPE c VALUE ‘X’,
g_case TYPE i VALUE 3,

l_label_01 TYPE c VALUE ‘X’,
l_label_02 TYPE c VALUE ‘’,
g_label TYPE i VALUE 1,

l_as_01 TYPE c VALUE ‘’, "zyq add by 181122
l_as_02 TYPE c VALUE ‘’, "zyq add by 181122
l_as_03 TYPE c VALUE ‘X’, "zyq add by 181122
g_as TYPE i VALUE 3, "zyq add by 181122
l_cols_01(2) TYPE c VALUE ‘5’, "zyq add by 181122
l_rows_01(5) TYPE c VALUE ‘20’, "zyq add by 181122
g_cols TYPE i VALUE 5, "zyq add by 181122
g_rows TYPE i VALUE 20. "zyq add by 181122

*& ALV Data Must Be A Global Variant
FIELD-SYMBOLS:

TYPE ANY TABLE,
TYPE any.

*& Necessary To Flush The Automation Queue
CLASS cl_gui_cfw DEFINITION LOAD.

*& End

&---------------------------------------------------------------------
*& 包含 ZSQLEXPLORERF02 zyq
&---------------------------------------------------------------------


*& Form destroy_Control_object.


DEFINE destroy_control_object.
check &1 is not initial .

call method &1->free
exceptions
others = 1.

free : &1 .

END-OF-DEFINITION.


*& Form Create_ALV_Object


FORM create_alv_object USING p_grid TYPE REF TO cl_gui_alv_grid
p_container TYPE REF TO cl_gui_container.

CREATE OBJECT p_grid
EXPORTING
i_parent = p_container.

ENDFORM . "Create_ALV_Object


  •   Form Show_Data_In_ALV
    

FORM show_data_in_alv USING p_grid TYPE REF TO cl_gui_alv_grid
p_data TYPE ANY TABLE
p_field TYPE ANY TABLE .

CALL METHOD p_grid->set_table_for_first_display
EXPORTING
i_buffer_active = ‘X’
CHANGING
it_outtab = p_data
it_fieldcatalog = p_field
EXCEPTIONS
invalid_parameter_combination = 1
program_error = 2
too_many_lines = 3
OTHERS = 4.

ENDFORM. "Show_Data_In_ALV


*& Form Destroy_Grid_Object


FORM destroy_alv_object CHANGING p_grid TYPE REF TO cl_gui_alv_grid.

destroy_control_object p_grid .

ENDFORM . "Destroy_Object


*& Form prepare_alv_field_cat


FORM prepare_alv_field_cat USING p_fields TYPE tt_element
CHANGING p_fieldcat TYPE lvc_t_fcat .
DATA : wa_field TYPE st_element,
wa_fieldcat TYPE LINE OF lvc_t_fcat.

CLEAR : p_fieldcat .

LOOP AT p_fields INTO wa_field .

*& Must Translate Field Name To Upper Case
TRANSLATE wa_field-alias TO UPPER CASE .

CASE g_label  .
  WHEN 1 .
    PERFORM change_field_name   USING  wa_field-alias
                                       wa_field-label
                                       ''
                             CHANGING  p_fieldcat .
  WHEN 2 .
    PERFORM change_field_name   USING  wa_field-alias
                                       wa_field-alias
                                       ''
                             CHANGING  p_fieldcat .
ENDCASE .

ENDLOOP .

ENDFORM . "destroy_alv_object


*& Form prepare_alv_error_field_Cat


FORM prepare_alv_error_field_cat CHANGING p_fieldcat TYPE lvc_t_fcat .

CLEAR p_fieldcat[] .

PERFORM change_field_name USING ‘ICON’ ‘Status’ ‘X’
CHANGING p_fieldcat .

PERFORM change_field_name USING ‘MSG’ ‘Message’ ‘’
CHANGING p_fieldcat .

ENDFORM . "prepare_alv_error_field_Cat


*& Form CHANGE_FIELD_NAME


FORM change_field_name USING p_field p_text p_icon
CHANGING p_fieldcat TYPE lvc_t_fcat .
DATA wa_fieldcat TYPE LINE OF lvc_t_fcat .

wa_fieldcat-fieldname = p_field.

wa_fieldcat-scrtext_l = p_text.
wa_fieldcat-scrtext_m = p_text.
wa_fieldcat-scrtext_s = p_text.
wa_fieldcat-icon = p_icon .

IF p_field = ‘MSG’.
wa_fieldcat-outputlen = 100 .
ENDIF .

APPEND wa_fieldcat TO p_fieldcat.

ENDFORM. " CHANGE_FIELD_NAME


*& Form Append_Error_Message


FORM append_error_message USING p_id TYPE i
p_msg .
DATA : wa_exception TYPE st_exception,
l_msg TYPE string,
l_lines TYPE i.

CASE p_id .
WHEN 1 .
CONCATENATE 'Miss a ‘’ at ’ p_msg
INTO l_msg
SEPARATED BY space .
WHEN 2 .
CONCATENATE 'Miss a ( at ’ p_msg
INTO l_msg
SEPARATED BY space .
WHEN 3 .
CONCATENATE 'After ‘‘AS’’ , need a alias at ’ p_msg
INTO l_msg
SEPARATED BY space .
WHEN 4 .
l_msg = p_msg .
WHEN 5 .
CONCATENATE ‘Table’ p_msg ‘doesn’'t exist ’
INTO l_msg
SEPARATED BY space .
WHEN 6 .
CONCATENATE ‘Field’ p_msg ‘doesn’'t exist ’
INTO l_msg
SEPARATED BY space .
WHEN 7 .
l_msg = ‘SQL with sub SQL can not be formated in this verison .’ .

WHEN 8 .
  l_msg = 'Please input Open SQL !'.

WHEN 9 .
  CONCATENATE 'Encounter a ' p_msg 'after order by !'
         INTO l_msg
    SEPARATED BY space .

WHEN 10 .
  l_msg = 'Can not find any field !'.

WHEN 11 .
  l_msg = 'Can not find any table !'.

ENDCASE .

DESCRIBE TABLE g_exception LINES l_lines .

wa_exception-id = l_lines + 1 .
wa_exception-icon = ‘@0A@’ .
wa_exception-msg = l_msg .

APPEND wa_exception TO g_exception .

ENDFORM. "Append_Error_Message


*& Form Download_Table_To_Local


FORM download_table_to_local TABLES p_table
USING p_file TYPE rlgrap-filename .

CALL FUNCTION ‘WS_DOWNLOAD’
EXPORTING
filename = p_file
filetype = ‘ASC’
TABLES
data_tab = p_table
EXCEPTIONS
file_open_error = 1
file_write_error = 2
invalid_filesize = 3
invalid_type = 4
no_batch = 5
unknown_error = 6
invalid_table_width = 7
gui_refuse_filetransfer = 8
customer_error = 9
no_authority = 10
OTHERS = 11.

ENDFORM . "Download_Table_To_Local


*& Form Get_FileName


FORM get_filename CHANGING p_file .

CALL FUNCTION ‘WS_FILENAME_GET’
EXPORTING

  • mask             = ',*.txt.'
    mode             = 'S'
    title            = 'Save to local'
    
    IMPORTING
    filename = p_file
    EXCEPTIONS
    inv_winsys = 1
    no_batch = 2
    selection_cancel = 3
    selection_error = 4
    OTHERS = 5.

ENDFORM. "Get_FileName

*& End

&---------------------------------------------------------------------
*& 包含 ZSQLEXPLORERF03 zyq
&---------------------------------------------------------------------

DATA : g_postion TYPE i .


*& Form Create_Editor_Object


FORM create_editor_object USING p_editor TYPE REF TO cl_gui_textedit
p_container TYPE REF TO cl_gui_container.

CREATE OBJECT p_editor
EXPORTING
parent = p_container
wordwrap_mode = cl_gui_textedit=>wordwrap_at_fixed_position
wordwrap_position = c_line_length
wordwrap_to_linebreak_mode = cl_gui_textedit=>true
EXCEPTIONS
OTHERS = 1.

ENDFORM . "Create_Editor_Object


*& Form Set_Comment_Mode


FORM set_comment_mode USING p_editor TYPE REF TO cl_gui_textedit .

CALL METHOD p_editor->set_comments_string.
CALL METHOD p_editor->set_highlight_comments_mode.

ENDFORM . "Set_Comment_Mode


*& Form Get_Selection_Index


FORM get_selection_index USING p_editor TYPE REF TO cl_gui_textedit
p_return TYPE i .
DATA : l_from TYPE i,
l_to TYPE i.

CALL METHOD p_editor->get_selection_indexes
IMPORTING
from_index = l_from
to_index = l_to
EXCEPTIONS
error_cntl_call_method = 1
OTHERS = 2.

IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.

p_return = l_to - l_from .

ENDFORM . "Get_Selection_Index


*& Form Save_Text_To_Table


FORM save_text_to_table USING p_editor TYPE REF TO cl_gui_textedit
CHANGING p_text TYPE tt_text .
DATA : l_flag TYPE i .

PERFORM get_selection_index USING g_editor l_flag.

IF l_flag = 0 .
CALL METHOD p_editor->get_text_as_r3table
IMPORTING
table = p_text
EXCEPTIONS
OTHERS = 1.
ELSE .
CALL METHOD p_editor->get_selected_text_as_r3table
IMPORTING
table = p_text
EXCEPTIONS
OTHERS = 1.
ENDIF .

IF sy-subrc NE 0.
PERFORM show_message USING c_msg03 .
ENDIF.

CALL METHOD cl_gui_cfw=>flush
EXCEPTIONS
OTHERS = 1.

IF sy-subrc NE 0.
PERFORM show_message USING c_msg02 .
ENDIF.

ENDFORM . "Save_TEXT_To_TABLE


*& Form Save_As_Local_File


FORM save_as_local_file USING p_editor TYPE REF TO cl_gui_textedit
p_file .

CALL METHOD p_editor->save_as_local_file
EXPORTING
file_name = p_file
EXCEPTIONS
error_cntl_call_method = 1
OTHERS = 2.

IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.

ENDFORM . "Save_As_Local_File


*& Form set_text_as_r3table


FORM set_text_as_r3table USING p_editor TYPE REF TO cl_gui_textedit
CHANGING p_text TYPE tt_text.

CALL METHOD p_editor->set_text_as_r3table
EXPORTING
table = p_text
EXCEPTIONS
OTHERS = 1.

ENDFORM . "set_text_as_r3table


*& Form set_text_as_r3table


FORM set_selected_text_as_r3table USING p_editor TYPE REF TO cl_gui_textedit
CHANGING p_text TYPE tt_text.

CALL METHOD p_editor->set_selected_text_as_r3table
EXPORTING
table = p_text
EXCEPTIONS
OTHERS = 1.

ENDFORM . "set_text_as_r3table


*& Form Load_Text_From_Table


FORM load_text_from_table USING p_editor TYPE REF TO cl_gui_textedit
CHANGING p_text TYPE tt_text.
DATA : l_flag TYPE i .

PERFORM get_selection_index USING g_editor l_flag.

IF l_flag = 0 .
PERFORM set_text_as_r3table USING p_editor
CHANGING p_text .
ELSE .
PERFORM set_selected_text_as_r3table USING p_editor
CHANGING p_text .
ENDIF .

IF sy-subrc NE 0.
PERFORM show_message USING c_msg04 .
ENDIF.

ENDFORM. "Load_Text_From


*& Form Set_Status_Text


FORM set_status_text USING p_editor TYPE REF TO cl_gui_textedit
CHANGING p_text .

CALL METHOD p_editor->set_status_text
EXPORTING
status_text = p_text
EXCEPTIONS
error_cntl_call_method = 1
OTHERS = 2.

ENDFORM. "Set_Status_Text


*& Form Set_Toolbar_Mode


FORM set_toolbar_mode USING p_editor TYPE REF TO cl_gui_textedit
p_status TYPE i .

CALL METHOD p_editor->set_toolbar_mode
EXPORTING
toolbar_mode = p_status
EXCEPTIONS
error_cntl_call_method = 1
invalid_parameter = 2
OTHERS = 3.

IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.

ENDFORM. "Set_Toolbar_Mode


*& Form SET_READONLY_MODE


FORM set_readonly_mode USING p_editor TYPE REF TO cl_gui_textedit
p_mode TYPE i .

CALL METHOD p_editor->set_readonly_mode
EXPORTING
readonly_mode = p_mode
EXCEPTIONS
error_cntl_call_method = 1
invalid_parameter = 2
OTHERS = 3.

IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.

ENDFORM. "set_readonly_mode


*& Form Destroy_Editor_Object


FORM destroy_editor_object CHANGING p_editor TYPE REF TO cl_gui_textedit.

destroy_control_object p_editor .

ENDFORM . "Destroy_Object


*& Form Create_Container_Object


FORM create_container_object USING p_container TYPE REF TO cl_gui_custom_container
p_sql_editor.

CREATE OBJECT p_container
EXPORTING
container_name = p_sql_editor
EXCEPTIONS
cntl_error = 1
cntl_system_error = 2
create_error = 3
lifetime_error = 4
lifetime_dynpro_dynpro_link = 5.

ENDFORM . "Create_Container_Object


*& Form Destroy_Container_Object


FORM destroy_container_object CHANGING p_container TYPE REF TO cl_gui_custom_container.

destroy_control_object p_container .

ENDFORM . "Destroy_Object


*& Form Get_Splitter_Postion


FORM get_splitter_postion USING p_splitter TYPE REF TO cl_gui_easy_splitter_container.

CALL METHOD p_splitter->get_sash_position
IMPORTING
sash_position = g_postion
EXCEPTIONS
cntl_system_error = 1
cntl_error = 2
OTHERS = 3.

IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.

ENDFORM . "get_splitter_postion


*& Form Set_Splitter_Postion


FORM set_splitter_postion USING p_splitter TYPE REF TO cl_gui_easy_splitter_container
p_postion TYPE i .

*& Set Splitter Postion
CALL METHOD p_splitter->set_sash_position
EXPORTING
sash_position = p_postion.

ENDFORM . "Set_Splitter_Postion


*& Form Move_splitter_Postion


FORM move_splitter_postion USING p_splitter TYPE REF TO cl_gui_easy_splitter_container .

  • PERFORM get_splitter_postion USING p_splitter .

CASE g_postion .
WHEN 0 .
g_postion = 100 .
WHEN 50.
g_postion = 0 .
WHEN 100 .
g_postion = 50 .

ENDCASE .

PERFORM set_splitter_postion USING p_splitter g_postion .

ENDFORM . "move_splitter_postion


*& Form Create_Splitter_Object


FORM create_splitter_object USING p_splitter TYPE REF TO cl_gui_easy_splitter_container
p_container
p_orientation TYPE i .
DATA : l_position TYPE i VALUE 100 .

CREATE OBJECT p_splitter
EXPORTING
parent = p_container
orientation = p_orientation.

PERFORM set_splitter_postion USING p_splitter
l_position .

ENDFORM . "Create_Splitter_Object


*& Form Destroy_Splitter_Object


FORM destroy_splitter_object CHANGING p_splitter TYPE REF TO cl_gui_easy_splitter_container.

destroy_control_object p_splitter .

ENDFORM . "Destroy_Object

*& End

&---------------------------------------------------------------------
*& 包含 ZSQLEXPLORERF03 zyq
&---------------------------------------------------------------------

DATA : g_postion TYPE i .


*& Form Create_Editor_Object


FORM create_editor_object USING p_editor TYPE REF TO cl_gui_textedit
p_container TYPE REF TO cl_gui_container.

CREATE OBJECT p_editor
EXPORTING
parent = p_container
wordwrap_mode = cl_gui_textedit=>wordwrap_at_fixed_position
wordwrap_position = c_line_length
wordwrap_to_linebreak_mode = cl_gui_textedit=>true
EXCEPTIONS
OTHERS = 1.

ENDFORM . "Create_Editor_Object


*& Form Set_Comment_Mode


FORM set_comment_mode USING p_editor TYPE REF TO cl_gui_textedit .

CALL METHOD p_editor->set_comments_string.
CALL METHOD p_editor->set_highlight_comments_mode.

ENDFORM . "Set_Comment_Mode


*& Form Get_Selection_Index


FORM get_selection_index USING p_editor TYPE REF TO cl_gui_textedit
p_return TYPE i .
DATA : l_from TYPE i,
l_to TYPE i.

CALL METHOD p_editor->get_selection_indexes
IMPORTING
from_index = l_from
to_index = l_to
EXCEPTIONS
error_cntl_call_method = 1
OTHERS = 2.

IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.

p_return = l_to - l_from .

ENDFORM . "Get_Selection_Index


*& Form Save_Text_To_Table


FORM save_text_to_table USING p_editor TYPE REF TO cl_gui_textedit
CHANGING p_text TYPE tt_text .
DATA : l_flag TYPE i .

PERFORM get_selection_index USING g_editor l_flag.

IF l_flag = 0 .
CALL METHOD p_editor->get_text_as_r3table
IMPORTING
table = p_text
EXCEPTIONS
OTHERS = 1.
ELSE .
CALL METHOD p_editor->get_selected_text_as_r3table
IMPORTING
table = p_text
EXCEPTIONS
OTHERS = 1.
ENDIF .

IF sy-subrc NE 0.
PERFORM show_message USING c_msg03 .
ENDIF.

CALL METHOD cl_gui_cfw=>flush
EXCEPTIONS
OTHERS = 1.

IF sy-subrc NE 0.
PERFORM show_message USING c_msg02 .
ENDIF.

ENDFORM . "Save_TEXT_To_TABLE


*& Form Save_As_Local_File


FORM save_as_local_file USING p_editor TYPE REF TO cl_gui_textedit
p_file .

CALL METHOD p_editor->save_as_local_file
EXPORTING
file_name = p_file
EXCEPTIONS
error_cntl_call_method = 1
OTHERS = 2.

IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.

ENDFORM . "Save_As_Local_File


*& Form set_text_as_r3table


FORM set_text_as_r3table USING p_editor TYPE REF TO cl_gui_textedit
CHANGING p_text TYPE tt_text.

CALL METHOD p_editor->set_text_as_r3table
EXPORTING
table = p_text
EXCEPTIONS
OTHERS = 1.

ENDFORM . "set_text_as_r3table


*& Form set_text_as_r3table


FORM set_selected_text_as_r3table USING p_editor TYPE REF TO cl_gui_textedit
CHANGING p_text TYPE tt_text.

CALL METHOD p_editor->set_selected_text_as_r3table
EXPORTING
table = p_text
EXCEPTIONS
OTHERS = 1.

ENDFORM . "set_text_as_r3table


*& Form Load_Text_From_Table


FORM load_text_from_table USING p_editor TYPE REF TO cl_gui_textedit
CHANGING p_text TYPE tt_text.
DATA : l_flag TYPE i .

PERFORM get_selection_index USING g_editor l_flag.

IF l_flag = 0 .
PERFORM set_text_as_r3table USING p_editor
CHANGING p_text .
ELSE .
PERFORM set_selected_text_as_r3table USING p_editor
CHANGING p_text .
ENDIF .

IF sy-subrc NE 0.
PERFORM show_message USING c_msg04 .
ENDIF.

ENDFORM. "Load_Text_From


*& Form Set_Status_Text


FORM set_status_text USING p_editor TYPE REF TO cl_gui_textedit
CHANGING p_text .

CALL METHOD p_editor->set_status_text
EXPORTING
status_text = p_text
EXCEPTIONS
error_cntl_call_method = 1
OTHERS = 2.

ENDFORM. "Set_Status_Text


*& Form Set_Toolbar_Mode


FORM set_toolbar_mode USING p_editor TYPE REF TO cl_gui_textedit
p_status TYPE i .

CALL METHOD p_editor->set_toolbar_mode
EXPORTING
toolbar_mode = p_status
EXCEPTIONS
error_cntl_call_method = 1
invalid_parameter = 2
OTHERS = 3.

IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.

ENDFORM. "Set_Toolbar_Mode


*& Form SET_READONLY_MODE


FORM set_readonly_mode USING p_editor TYPE REF TO cl_gui_textedit
p_mode TYPE i .

CALL METHOD p_editor->set_readonly_mode
EXPORTING
readonly_mode = p_mode
EXCEPTIONS
error_cntl_call_method = 1
invalid_parameter = 2
OTHERS = 3.

IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.

ENDFORM. "set_readonly_mode


*& Form Destroy_Editor_Object


FORM destroy_editor_object CHANGING p_editor TYPE REF TO cl_gui_textedit.

destroy_control_object p_editor .

ENDFORM . "Destroy_Object


*& Form Create_Container_Object


FORM create_container_object USING p_container TYPE REF TO cl_gui_custom_container
p_sql_editor.

CREATE OBJECT p_container
EXPORTING
container_name = p_sql_editor
EXCEPTIONS
cntl_error = 1
cntl_system_error = 2
create_error = 3
lifetime_error = 4
lifetime_dynpro_dynpro_link = 5.

ENDFORM . "Create_Container_Object


*& Form Destroy_Container_Object


FORM destroy_container_object CHANGING p_container TYPE REF TO cl_gui_custom_container.

destroy_control_object p_container .

ENDFORM . "Destroy_Object


*& Form Get_Splitter_Postion


FORM get_splitter_postion USING p_splitter TYPE REF TO cl_gui_easy_splitter_container.

CALL METHOD p_splitter->get_sash_position
IMPORTING
sash_position = g_postion
EXCEPTIONS
cntl_system_error = 1
cntl_error = 2
OTHERS = 3.

IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.

ENDFORM . "get_splitter_postion


*& Form Set_Splitter_Postion


FORM set_splitter_postion USING p_splitter TYPE REF TO cl_gui_easy_splitter_container
p_postion TYPE i .

*& Set Splitter Postion
CALL METHOD p_splitter->set_sash_position
EXPORTING
sash_position = p_postion.

ENDFORM . "Set_Splitter_Postion


*& Form Move_splitter_Postion


FORM move_splitter_postion USING p_splitter TYPE REF TO cl_gui_easy_splitter_container .

  • PERFORM get_splitter_postion USING p_splitter .

CASE g_postion .
WHEN 0 .
g_postion = 100 .
WHEN 50.
g_postion = 0 .
WHEN 100 .
g_postion = 50 .

ENDCASE .

PERFORM set_splitter_postion USING p_splitter g_postion .

ENDFORM . "move_splitter_postion


*& Form Create_Splitter_Object


FORM create_splitter_object USING p_splitter TYPE REF TO cl_gui_easy_splitter_container
p_container
p_orientation TYPE i .
DATA : l_position TYPE i VALUE 100 .

CREATE OBJECT p_splitter
EXPORTING
parent = p_container
orientation = p_orientation.

PERFORM set_splitter_postion USING p_splitter
l_position .

ENDFORM . "Create_Splitter_Object


*& Form Destroy_Splitter_Object


FORM destroy_splitter_object CHANGING p_splitter TYPE REF TO cl_gui_easy_splitter_container.

destroy_control_object p_splitter .

ENDFORM . "Destroy_Object

*& End

&---------------------------------------------------------------------
*& 包含 ZSQLEXPLORERF04 zyq
&---------------------------------------------------------------------


*& Form Process_Comment2


FORM process_comment2 CHANGING p_text TYPE st_text .
DATA : l_temp TYPE string,
l_amount TYPE i VALUE 0,
l_mod TYPE i VALUE 0,
l_index TYPE i,
l_length TYPE i.

l_amount = 0 .

l_length = strlen( p_text-line ) .

DO l_length TIMES .
l_index = sy-index - 1 .
CASE p_text-line+l_index(1).
WHEN c_comment2 .
l_mod = l_amount MOD 2 .
IF l_mod = 0 .
IF l_index = 0 .
p_text = space .
ELSE .
p_text = p_text(l_index).
ENDIF .
EXIT .
ENDIF .
WHEN c_quotes .
ADD 1 TO l_amount .
ENDCASE .
ENDDO .

l_mod = l_amount MOD 2 .

IF l_mod <> 0 .
*& Exception “You maybe miss a single quoted symbol”
PERFORM append_error_message USING 1 p_text-line.
ENDIF .

ENDFORM. "Process_Comment2


*& Form Move_Comments_In_SQL


FORM move_comments_in_sql CHANGING p_text TYPE tt_text .

DATA : wa_text TYPE st_text .

LOOP AT p_text INTO wa_text .

IF wa_text-line(1) = c_comment1.
  DELETE p_text .
  CONTINUE .
ENDIF .

IF wa_text-line CS c_comment2 .
  PERFORM process_comment2   CHANGING wa_text .
  MODIFY p_text FROM wa_text .
ENDIF .

CONDENSE : wa_text-line .
CHECK wa_text-line = space.
DELETE p_text .

ENDLOOP .

ENDFORM . "Move_Comments_In_SQL


*& Form Separated_Quoted


FORM separated_quoted USING p_line TYPE st_text
CHANGING p_table TYPE tt_text .
DATA : wa_text TYPE st_text,
l_flag TYPE i VALUE 1,
l_length TYPE i,
l_index TYPE i,
l_start TYPE i VALUE 0,
l_end TYPE i VALUE 0,
l_mod TYPE i VALUE 0,
l_amount TYPE i VALUE 0,
l_str TYPE string.

l_length = strlen( p_line-line ) .

DO l_length TIMES .
l_index = sy-index - 1 .
CASE p_line+l_index(1).
WHEN c_quotes .
IF l_amount = 0 .
IF sy-index > 1 .
l_end = l_index - l_start .
l_str = p_line-line+l_start(l_end) .
APPEND l_str TO p_table .
l_start = l_index .
ENDIF .
ENDIF .
ADD 1 TO l_amount .

  WHEN space.
    IF l_amount = 0 .
      l_end = l_index - l_start .
      IF l_end =  0 .
        l_end  =  1 .
      ENDIF .
      l_str = p_line-line+l_start(l_end) .
      APPEND l_str TO p_table .
      l_start = l_index .
    ENDIF .

    l_mod = l_amount MOD 2 .

    CHECK l_amount <> 0 AND l_mod = 0.

    l_end = l_index - l_start .
    l_str = p_line-line+l_start(l_end) .
    APPEND l_str TO p_table .
    l_start = l_index .
    l_amount = 0 .

  WHEN OTHERS .
    l_mod = l_amount MOD 2 .
    CHECK l_amount <> 0 AND l_mod = 0.
    l_end = l_index - l_start .
    l_str = p_line-line+l_start(l_end) .
    APPEND l_str TO p_table .
    l_start = l_index .
    l_amount = 0 .
ENDCASE .

ENDDO .

l_str = p_line-line+l_start.
APPEND l_str TO p_table .
l_start = l_index .

l_mod = l_amount MOD 2 .

IF l_mod <> 0 .
*& Exception “You maybe miss a single quoted symbol”
PERFORM append_error_message USING 1 p_line-line.
ENDIF .

ENDFORM . "Process_Quoted


*& Form Separate_SQL_From_Word


FORM separate_from_word CHANGING p_text TYPE tt_text .
DATA : wa_text TYPE st_text,
it_temp TYPE tt_text,
it_split TYPE tt_text,
l_tab TYPE c.

CLEAR : it_temp.

LOOP AT p_text INTO wa_text .

IF wa_text CS c_quotes .
  CLEAR it_split .
  PERFORM separated_quoted USING wa_text
                        CHANGING it_split .
  APPEND LINES OF it_split TO it_temp .

ELSE .
  CLEAR it_split .
  SPLIT wa_text AT space INTO TABLE it_split .
  APPEND LINES OF it_split TO it_temp .
ENDIF .

ENDLOOP .

*& Delete All Blank Line
LOOP AT it_temp INTO wa_text .
CHECK NOT wa_text CS c_quotes .
CONDENSE wa_text-line .
MODIFY it_temp FROM wa_text .
ENDLOOP .

PERFORM get_asc_code USING c_hex
CHANGING l_tab.

DELETE it_temp WHERE line = space OR
line = l_tab.

p_text[] = it_temp[] .

ENDFORM. "Separate_SQL_From_Word


*& Form Case_To_Upper


FORM case_to_upper CHANGING p_text .

TRANSLATE p_text TO UPPER CASE.

ENDFORM. "Case_To_Upper


*& Form Case_To_Lower


FORM case_to_lower CHANGING p_text .

TRANSLATE p_text TO LOWER CASE.

ENDFORM. "Case_To_Upper


*& Form transfer_Case


FORM transfer_case USING p_type TYPE i
CHANGING p_text TYPE tt_text .
DATA : wa_text TYPE st_text .

LOOP AT p_text INTO wa_text .

CASE p_type .
  WHEN '1'.
    PERFORM case_to_lower CHANGING wa_text-line .
  WHEN '2'.
    PERFORM case_to_upper CHANGING wa_text-line .
ENDCASE .

MODIFY p_text FROM wa_text .

ENDLOOP .

ENDFORM . "transfer_Case


*& Form Check_SQL_Key_Word


FORM check_sql_key_word USING p_word
CHANGING p_return TYPE i .

DATA : l_word TYPE string .

l_word = p_word .
PERFORM case_to_upper CHANGING l_word .

CONCATENATE c_separ l_word c_separ
INTO l_word .

p_return = 1.

CHECK c_sql_key_word_01 CS l_word OR
c_sql_key_word_02 CS l_word OR
c_sql_key_word_03 CS l_word OR
c_sql_key_word_04 CS l_word .

p_return = 0.

ENDFORM . "Check_SQL_Key_Word


*& Form Upper_All_Word_SQL Exception Quotes Value


FORM upper_all_word_sql CHANGING p_text TYPE tt_text .
DATA : wa_text TYPE st_text,
l_return TYPE i.

LOOP AT p_text INTO wa_text .

CHECK NOT wa_text-line CS c_quotes .
PERFORM check_sql_key_word USING wa_text
                        CHANGING l_return .
CASE l_return.
  WHEN 0.
    PERFORM case_to_upper CHANGING wa_text-line .
  WHEN 1 .
    PERFORM case_to_lower CHANGING wa_text-line .
ENDCASE .

MODIFY p_text FROM wa_text .

ENDLOOP .

ENDFORM . "Upper_All_Word_SQL


*& Form Process_funct_word


FORM process_funct_word CHANGING p_text TYPE tt_text.
DATA : wa_text TYPE st_text,
wa_temp TYPE st_text,
l_str_01 TYPE string,
l_str_02 TYPE string,
l_str_03 TYPE string,
l_index TYPE i,
l_temp TYPE st_text-line,
l_step TYPE i VALUE 0.

*& SUM ( * ) AS TT
*& l_Step 1 2 3 4 5 6

LOOP AT p_text INTO wa_text .

CASE l_step .
  WHEN 2 .
    IF wa_text-line CS c_left .
      CONCATENATE wa_temp-line c_left
             INTO wa_temp-line.
      DELETE p_text.
      l_step = 3 .
    ELSE .
      PERFORM append_error_message USING 2 wa_text-line.
    ENDIF .
  WHEN 3 .
  •    CHECK NOT wa_text-line CS c_left .
      IF wa_text-line  CS c_right .
        SPLIT wa_text-line AT c_right INTO l_str_01 l_str_02  .
        IF l_str_01 IS NOT INITIAL .
          CONCATENATE wa_temp-line l_str_01 c_right
                 INTO wa_temp-line
            SEPARATED BY space.
        ELSE .
          CONCATENATE wa_temp-line c_right
                 INTO wa_temp-line
            SEPARATED BY space.
        ENDIF .
        l_step = 4 .
        IF l_str_02 = c_as.
          CONCATENATE wa_temp-line l_str_02
                 INTO wa_temp-line
            SEPARATED BY space.
          l_step = 5 .
        ENDIF .
      ELSE .
        CONCATENATE wa_temp-line wa_text-line
               INTO wa_temp-line
          SEPARATED BY space.
        l_step = 3 .
      ENDIF .
    
      DELETE p_text.
    
    WHEN 4 .
      CHECK NOT wa_text-line CS c_right.
      IF wa_text-line  CS  c_as .
        CONCATENATE wa_temp-line wa_text-line
               INTO wa_temp-line
          SEPARATED BY space.
        DELETE p_text.
        l_step = 5 .
      ELSE .
    

*& Assign A Alias To The Field
INSERT wa_temp INTO p_text INDEX l_index .
l_step = 0 .
ENDIF .

  WHEN 5 .
    CONCATENATE c_separ wa_text-line c_separ
           INTO l_str_01 .
    IF c_sql_key_word_01 CS l_str_01  .

** Exception : Need A Field Alias
PERFORM append_error_message USING 3 wa_text-line .

  •      INSERT wa_temp INTO p_text INDEX l_index .
      ELSE .
        CONCATENATE wa_temp-line wa_text-line
               INTO wa_temp-line
          SEPARATED BY space.
        MODIFY p_text FROM wa_temp .
      ENDIF .
    
      l_step = 0 .
    

    ENDCASE .

    l_temp = wa_text-line .
    PERFORM case_to_upper CHANGING l_temp.

    IF l_temp = c_sum OR l_temp(4) = ‘SUM(’ OR
    l_temp = c_min OR l_temp(4) = ‘MIN(’ OR
    l_temp = c_max OR l_temp(4) = ‘MAX(’ OR
    l_temp = c_avg OR l_temp(4) = ‘AVG(’ OR
    l_temp = c_count OR l_temp(6) = c_count1 .

    wa_text-line  =  l_temp.
    
    l_index  =  sy-tabix .  l_step   =  2 .
    
    IF wa_text-line CS c_left.
      SPLIT wa_text-line AT  c_left   INTO  l_str_01  l_str_02  .
      CONCATENATE l_str_01   c_left   INTO  wa_temp-line .
      IF l_str_02 IS INITIAL.
        l_step = 3.
      ELSE .
        IF l_str_02 CS c_right.
          SPLIT l_str_02  AT  c_right  INTO  l_str_01  l_str_03 .
          IF l_str_03 = c_as .
            CONCATENATE wa_temp-line l_str_01 c_right l_str_03
                   INTO wa_temp-line
              SEPARATED BY space.
            l_step = 5 .
          ELSE.
            CONCATENATE wa_temp-line l_str_01 c_right
                   INTO wa_temp-line
              SEPARATED BY space.
            l_step = 4 .
          ENDIF .
        ELSE .
          CONCATENATE wa_temp-line l_str_02
                  INTO wa_temp-line
             SEPARATED BY space.
          l_step = 3 .
        ENDIF .
      ENDIF .
    ELSE .
      wa_temp-line  =  l_str_01 .
      l_step = 2.
    ENDIF .
    
    DELETE p_text .
    CONTINUE .
    

    ENDIF .

    ENDLOOP .

ENDFORM . "Process_funct_word


*& Form get_all_Element_By_Key


FORM get_all_element_by_key USING p_text TYPE tt_text
p_all TYPE i
p_from TYPE string
CHANGING p_element TYPE tt_text .
DATA : l_key_word TYPE string .

CONCATENATE c_sql_key_word_01
c_sql_key_word_02
c_sql_key_word_03
INTO l_key_word .

PERFORM get_all_element_by_range USING p_text
p_all
p_from
l_key_word
CHANGING p_element.

ENDFORM . "Get_All_Element_By_Range


*& Form get_all_Element_By_range


FORM get_all_element_by_range USING p_text TYPE tt_text
p_all TYPE i
p_from TYPE string
p_to TYPE string
CHANGING p_element TYPE tt_text .

DATA : wa_text TYPE st_text,
l_flag TYPE i VALUE 1,
l_text TYPE string,
l_to TYPE string.

CLEAR : p_element .

CONCATENATE c_separ p_to c_separ
INTO l_to .

LOOP AT p_text INTO wa_text .

CASE wa_text-line .

  WHEN  p_from.
    l_flag = 0 .
    CONTINUE .

  WHEN  OTHERS.
    CHECK l_flag = 0 .

    CONCATENATE c_separ wa_text-line  c_separ
           INTO l_text .
    PERFORM case_to_upper CHANGING l_text .
    IF l_to CS l_text .
      IF p_all = 1 .
        EXIT .
      ELSE .
        l_flag = 1 .
      ENDIF .

    ENDIF .
ENDCASE .

CHECK l_flag = 0 .
APPEND wa_text TO p_element .

ENDLOOP .

ENDFORM . "Get_All_Element_By_Range


*& Form Get_All_Fields_Name


FORM get_all_fields_name USING p_text TYPE tt_text
CHANGING p_element TYPE tt_element .
DATA : l_all TYPE i VALUE 1,
it_temp TYPE tt_text.

CLEAR : it_temp .
PERFORM get_all_element_by_key USING p_text l_all
c_select
CHANGING it_temp .

PERFORM get_element_alias USING it_temp
CHANGING p_element .

ENDFORM . "Get_All_Fields_Name


*& Form Get_All_Tables_Name


FORM get_all_tables_name USING p_text TYPE tt_text
CHANGING p_element TYPE tt_element .
DATA : l_all TYPE i VALUE 1,
it_temp TYPE tt_text,
it_element TYPE tt_element,
wa_element TYPE st_element.

CLEAR : p_element .

l_all = 1 .
PERFORM get_all_element_by_key USING p_text l_all
c_from
CHANGING it_temp .

PERFORM get_element_alias USING it_temp
CHANGING it_element .

APPEND LINES OF it_element TO p_element .

l_all = 0 .
PERFORM get_all_element_by_key USING p_text l_all
c_join
CHANGING it_temp .

PERFORM get_element_alias USING it_temp
CHANGING it_element .

APPEND LINES OF it_element TO p_element .

*& Process Table Alias Name
LOOP AT p_element INTO wa_element .

IF wa_element-alias IS INITIAL  .
  wa_element-alias = wa_element-name .
ENDIF .

CONCATENATE wa_element-name c_as
            wa_element-alias
       INTO wa_element-display
    SEPARATED BY space .

MODIFY p_element FROM wa_element    .

ENDLOOP .

ENDFORM. "Get_All_Tables_Name


*& Form Get_Element_Alias


FORM get_element_alias USING p_text TYPE tt_text
CHANGING p_element TYPE tt_element .
DATA : it_temp TYPE tt_text,
wa_text TYPE st_text,
wa_element TYPE st_element,
l_flag TYPE i VALUE 1,
l_text TYPE string.

it_temp = p_text .
CLEAR : p_element,wa_element.

DELETE it_temp WHERE line = c_single OR
line = c_distinct .

LOOP AT it_temp INTO wa_text .
l_text = wa_text-line .
PERFORM case_to_upper CHANGING l_text .
CASE l_text .
WHEN c_as.
l_flag = 0 .

  WHEN OTHERS .
    IF l_flag = 0 .
      IF wa_text-line CS c_right AND
         wa_text-line CS c_left .

** Excpetion Nedd A Alias
PERFORM append_error_message USING 3 wa_text-line .
ELSE.
wa_element-alias = wa_text-line .
APPEND wa_element TO p_element .
ENDIF .
CLEAR : wa_element .
l_flag = 1 .

    ELSE .
      IF wa_element IS NOT INITIAL .
        APPEND wa_element TO p_element .
      ENDIF .
      CLEAR : wa_element .
      wa_element-name = wa_text-line .
    ENDIF .

ENDCASE .

AT LAST.
  IF l_flag = 0.

** Excpetion Nedd A Alias
PERFORM append_error_message USING 3 wa_text-line .
ENDIF .

  IF wa_element IS NOT INITIAL .
    APPEND wa_element TO p_element .
  ENDIF .
ENDAT .

ENDLOOP .

ENDFORM . "Get_Element_Alias


*& Form Get_All_Fields_Infor


FORM get_all_fields_infor USING p_table TYPE tt_element
CHANGING p_fields TYPE tt_element .

*& Process Normal Fields
PERFORM get_normal_fields_infor USING p_table
CHANGING p_fields .

*& Get Aggregate Function Fields
PERFORM get_aggra_fields_infor USING p_table
CHANGING p_fields .

*& Process Symbol * For All Fields
PERFORM get_symbol_fields_infor USING p_table
CHANGING p_fields .

PERFORM process_duplic_alias CHANGING p_fields .

ENDFORM . "Get_All_Fields_Infor


*& Form Get_Normal_Fields_Infor


FORM get_normal_fields_infor USING p_tables TYPE tt_element
CHANGING p_fields TYPE tt_element .
DATA : wa_table TYPE st_element,
wa_field TYPE st_element,
it_fieldcat TYPE slis_t_fieldcat_alv WITH HEADER LINE,
l_table_alias TYPE dfies-fieldname,
l_field_alias TYPE dfies-fieldname,
l_field_name TYPE dfies-fieldname,
l_field_name01 TYPE dfies-fieldname.

LOOP AT p_tables INTO wa_table .

CLEAR : it_fieldcat, it_fieldcat[] .
PERFORM get_table_infor USING  wa_table-name
                     CHANGING  it_fieldcat[] .

*& Check Whether Table Exist
IF it_fieldcat[] IS INITIAL .
PERFORM append_error_message USING 5 wa_table-name .
CONTINUE.
ENDIF .

LOOP AT p_fields INTO wa_field WHERE label IS INITIAL.

*& Skip Symbol *
CHECK NOT wa_field-name CS c_all_fields .

  IF wa_field-name CS c_ss .
    SPLIT wa_field-name AT c_ss INTO l_table_alias l_field_name .
    CHECK l_table_alias = wa_table-alias .
  ELSE .
    l_field_name  = wa_field-name .
  ENDIF .

  l_field_name01  = l_field_name .
  PERFORM case_to_upper CHANGING l_field_name01 .

  READ TABLE it_fieldcat WITH KEY fieldname = l_field_name01 .

  CHECK sy-subrc  = 0 .

  wa_field-name   = l_field_name   .
  wa_field-source = wa_table-name  .
  wa_field-link   = wa_table-alias .

  wa_field-label  = it_fieldcat-seltext_l .
  IF wa_field-alias IS INITIAL.
    wa_field-alias  = wa_field-name .
  ENDIF .

  CONCATENATE wa_field-link c_ss wa_field-name
         INTO wa_field-display .

  MODIFY p_fields FROM wa_field .
ENDLOOP .

ENDLOOP .

ENDFORM . "Get_Normal_Fields_infor


*& Form Get_Aggra_Fields_Infor


FORM get_aggra_fields_infor USING p_tables TYPE tt_element
CHANGING p_fields TYPE tt_element .
DATA : wa_field TYPE st_element,
wa_temp TYPE st_element,
it_text TYPE tt_text,
wa_text TYPE st_text,
l_step TYPE i VALUE 0,
l_index TYPE i,
l_str_01 TYPE string,
l_str_02 TYPE string.

LOOP AT p_fields INTO wa_field WHERE label IS INITIAL.

IF wa_field-name CS c_sum OR  wa_field-name CS c_min OR
   wa_field-name CS c_max OR  wa_field-name CS c_avg OR
   wa_field-name CS c_count .

  CLEAR : it_text .

  SPLIT wa_field-name AT space INTO TABLE it_text.
  DELETE it_text WHERE line = space .

*& Get Field Name
READ TABLE it_text INTO wa_text WITH KEY line = c_right .
l_index = sy-tabix - 1 .
CLEAR : wa_text .
READ TABLE it_text INTO wa_text INDEX l_index .
IF wa_text = c_all_fields.
wa_field-label = c_funct .
ELSE.
PERFORM get_field_infor_by_name USING p_tables
wa_text-line
CHANGING wa_field .
CONCATENATE wa_field-link c_ss wa_field-name
INTO wa_text .
ENDIF .
MODIFY it_text FROM wa_text INDEX l_index .

*& Get Field Alias
CLEAR : wa_text .
READ TABLE it_text INTO wa_text WITH KEY line = c_as .
IF sy-subrc = 0 .
l_index = sy-tabix + 1 .
CLEAR : wa_text .
READ TABLE it_text INTO wa_text INDEX l_index .
IF sy-subrc = 0 .
wa_field-alias = wa_text-line .
ELSE .
wa_field-alias = c_funct.
ENDIF .
ELSE .
wa_field-alias = c_funct.
ENDIF .

*& Set Display
CLEAR : wa_field-display .
LOOP AT it_text INTO wa_text .
IF wa_text-line = c_as .
EXIT .
ENDIF .
CONCATENATE wa_field-display wa_text-line
INTO wa_field-display
SEPARATED BY space .

  ENDLOOP .


  CONDENSE : wa_field-display .


  MODIFY p_fields FROM wa_field .

ENDIF .

ENDLOOP .

ENDFORM. "Get_Aggra_Fields_infor


*& Form Get_Symbol_Fields_Infor


FORM get_symbol_fields_infor USING p_tables TYPE tt_element
CHANGING p_fields TYPE tt_element .
DATA : wa_table TYPE st_element,
wa_field TYPE st_element,
it_fieldcat TYPE slis_t_fieldcat_alv WITH HEADER LINE,
l_table_alias TYPE dfies-fieldname,
l_field_name TYPE dfies-fieldname,
it_temp TYPE tt_element,
wa_temp TYPE st_element.

LOOP AT p_fields INTO wa_field WHERE label IS INITIAL.
CLEAR : l_table_alias, l_field_name .

IF wa_field-name CS c_ss .
  SPLIT wa_field-name AT c_ss INTO l_table_alias l_field_name .
ELSE .
  l_field_name = wa_field-name .
ENDIF .

CHECK l_field_name  =  c_all_fields .

CLEAR : it_temp[] .

LOOP AT p_tables INTO wa_table .
  CLEAR : it_fieldcat, it_fieldcat[] .

  CHECK l_table_alias = wa_table-alias OR
        l_table_alias IS INITIAL .

  PERFORM get_table_infor USING  wa_table-name
                       CHANGING  it_fieldcat[] .
  LOOP AT it_fieldcat  .
    CLEAR : wa_temp .
    wa_temp-name    =  it_fieldcat-fieldname .
    wa_temp-alias   =  it_fieldcat-fieldname .
    PERFORM case_to_lower CHANGING wa_temp-alias .  "add zyq by 20181122"
    wa_temp-source  =  wa_table-name         .
    wa_temp-link    =  wa_table-alias        .
    wa_temp-label   =  it_fieldcat-seltext_l .

    CONCATENATE wa_temp-link c_ss wa_temp-name
           INTO wa_temp-display .

    CONCATENATE wa_temp-display c_as wa_temp-label  "add zyq by 20181122
           INTO wa_temp-display2
      SEPARATED BY space .

    APPEND wa_temp TO it_temp .
  ENDLOOP .
ENDLOOP .

*& Deletle The Sybmol *
DELETE p_fields INDEX sy-tabix .

INSERT LINES OF it_temp INTO p_fields  INDEX sy-tabix .

ENDLOOP .

ENDFORM . "Get_Symbol_Fields_infor


*& Form Process_Duplic_Alias


FORM process_duplic_alias CHANGING p_fields TYPE tt_element.
DATA : wa_prior TYPE st_element,
wa_field TYPE st_element,
l_i TYPE n LENGTH 2.

LOOP AT p_fields INTO wa_field .

wa_field-index =  sy-tabix .

MODIFY p_fields FROM wa_field .

IF wa_field-display IS INITIAL .
  PERFORM append_error_message USING 6 wa_field-name .
ENDIF .

ENDLOOP .

SORT p_fields BY alias index .

LOOP AT p_fields INTO wa_field.

IF wa_prior-alias  = wa_field-alias .
  ADD 1 TO l_i .
  CONCATENATE wa_field-alias '_' l_i
         INTO wa_field-alias .
ELSE .
  l_i = 1 .
  wa_prior = wa_field .
ENDIF .

CONCATENATE wa_field-display  c_as  wa_field-alias
       INTO wa_field-display
  SEPARATED BY space .

MODIFY p_fields FROM wa_field .

ENDLOOP .

SORT p_fields BY index .

ENDFORM . "Process_Duplic_Alias


*& Form Get_Field_Infor_By_Name


FORM get_field_infor_by_name USING p_tables TYPE tt_element
p_name
CHANGING p_field TYPE st_element.
DATA: wa_table TYPE st_element,
l_table_alias TYPE dfies-fieldname,
l_field_name TYPE dfies-fieldname.

IF p_name CS c_ss .
SPLIT p_name AT c_ss INTO l_table_alias l_field_name .
READ TABLE p_tables INTO wa_table WITH KEY alias = l_table_alias .
CHECK sy-subrc = 0 .
PERFORM get_field_infor_in_table USING wa_table-name
l_field_name
CHANGING p_field .
p_field-link = wa_table-alias .
p_field-name = l_field_name .
ELSE .

LOOP AT p_tables INTO wa_table .
  PERFORM get_field_infor_in_table  USING wa_table-name
                                          p_name
                                 CHANGING p_field      .

  IF p_field-alias IS NOT INITIAL .
    p_field-link = wa_table-alias .
    p_field-name = p_name         .
    EXIT .
  ENDIF .
ENDLOOP .

ENDIF .

ENDFORM . "Get_Field_Infor_By_Name


*& Form Get_Field_Infor_In_Table


FORM get_field_infor_in_table USING p_table_name
p_name
CHANGING p_field TYPE st_element.
DATA : l_field_name01 TYPE dfies-fieldname,
it_fieldcat TYPE slis_t_fieldcat_alv WITH HEADER LINE.

CLEAR : it_fieldcat, it_fieldcat[] .

PERFORM get_table_infor USING p_table_name
CHANGING it_fieldcat[] .

l_field_name01 = p_name.
PERFORM case_to_upper CHANGING l_field_name01 .

READ TABLE it_fieldcat WITH KEY fieldname = l_field_name01 .

CHECK sy-subrc = 0 .
p_field-name = p_name .
p_field-source = p_table_name .
p_field-label = it_fieldcat-seltext_l .

IF p_field-alias IS INITIAL.
p_field-alias = p_field-name .
ENDIF .

ENDFORM . "get_field_infor_in_table


*& Form Get_Table_Infor


FORM get_table_infor USING p_table
CHANGING p_fieldcat TYPE slis_t_fieldcat_alv .
DATA : l_table TYPE dd02l-tabname .

l_table = p_table .

CALL FUNCTION ‘REUSE_ALV_FIELDCATALOG_MERGE’
EXPORTING
i_structure_name = l_table
i_client_never_display = ‘X’
CHANGING
ct_fieldcat = p_fieldcat
EXCEPTIONS
inconsistent_interface = 1
program_error = 2
OTHERS = 3.

ENDFORM . "Get_Table_Infor


*& Form Get_asc_code


FORM get_asc_code USING p_hex
CHANGING p_char .
DATA: l_string(1024).

CALL FUNCTION ‘STPU1_HEX_TO_CHAR’
EXPORTING
hex_string = p_hex
IMPORTING
char_string = l_string.

p_char = l_string.

ENDFORM. " get_asc_code


*& Form Get_Fields_And_Catalog


FORM get_sql_fields USING p_text TYPE tt_text
p_tables TYPE tt_element
CHANGING p_fields TYPE tt_element.

PERFORM get_all_fields_name USING p_text
CHANGING p_fields.

PERFORM get_all_fields_infor USING p_tables
CHANGING p_fields.

ENDFORM . "Get_Fields_And_Catalog


*& Form Get_On_Tables


FORM get_on_tables USING p_text TYPE tt_text
p_tables TYPE tt_element
CHANGING p_on TYPE tt_text.

DATA : wa_text TYPE st_text,
l_str TYPE string,
wa_table TYPE st_element,
l_step TYPE i VALUE 0,
l_index TYPE i VALUE 0,
l_join TYPE i VALUE 0,
l_on TYPE i VALUE 0,
l_mod TYPE i VALUE 0.

CLEAR: p_on .

LOOP AT p_text INTO wa_text .

CASE wa_text-line .
  WHEN c_from  .
    l_step = 1 .  CONTINUE .

  WHEN c_inner .
    l_join  = 0 .  CHECK l_on > 0 .
    l_on    = 0 .  APPEND l_str TO p_on .
    l_step = 0 .

  WHEN c_left_j .
    l_join  = 1 .  CHECK l_on > 0 .
    l_on    = 0 .  APPEND l_str TO p_on .
    l_step = 0 .

  WHEN c_join.
    l_step  = 2 .  CHECK l_on > 0 .
    l_on    = 0 .  APPEND l_str TO p_on .

  WHEN c_on .
    l_step  = 3 .  CHECK l_on > 0 .
    l_on    = 0 . APPEND l_str TO p_on .

  WHEN c_where OR c_order OR c_group OR c_have.
    CHECK l_on > 0 .   l_on    = 0 .
    APPEND l_str TO p_on .

    EXIT .
ENDCASE .


CASE l_step .
  WHEN 1 .
    ADD 1 TO l_index .
    READ TABLE p_tables INTO wa_table INDEX l_index .
    CASE g_as.  "zyq add by 181122
      WHEN 1.
        CONCATENATE c_from wa_table-name INTO l_str SEPARATED BY space .

      WHEN OTHERS.
        CONCATENATE c_from wa_table-display INTO l_str SEPARATED BY space .
    ENDCASE.
    SHIFT l_str BY 2 PLACES RIGHT.
    APPEND l_str TO p_on .
    l_step = 0 .
  WHEN 2 .
    ADD 1 TO l_index .
    READ TABLE p_tables INTO wa_table INDEX l_index .
    IF l_join = 0 .
      CONCATENATE c_inner c_join wa_table-display
             INTO l_str
        SEPARATED BY space .
      SHIFT l_str BY 1 PLACES RIGHT.
      APPEND l_str TO p_on .
    ELSE .
      CONCATENATE c_left_j c_join wa_table-display
             INTO l_str
        SEPARATED BY space .
      SHIFT l_str BY 2 PLACES RIGHT.
      APPEND l_str TO p_on .
    ENDIF .
    l_step = 0 .
    l_join = 0 .
  WHEN 3 .
    ADD 1 TO l_on .
    IF l_on = 1   .
      CONCATENATE c_on wa_text-line
             INTO l_str
        SEPARATED BY space .
      SHIFT l_str BY 4 PLACES RIGHT.
    ELSE .
      l_mod = l_on MOD 8 .
      IF l_mod = 0 .
        APPEND l_str TO p_on .
        CLEAR : l_str .
        l_str =  wa_text-line .
        CASE wa_text-line .
          WHEN c_or .
            SHIFT l_str BY 4 PLACES RIGHT.
          WHEN c_and.
            SHIFT l_str BY 3 PLACES RIGHT.
          WHEN OTHERS.
            SHIFT l_str BY 7 PLACES RIGHT.
        ENDCASE .
      ELSE .
        CONCATENATE l_str wa_text-line
               INTO l_str
          SEPARATED BY space .
      ENDIF .
    ENDIF .

  WHEN 4 .

ENDCASE .

AT LAST .
  IF l_on > 0 .
    l_on = 0 .
    APPEND l_str TO p_on .
    l_step = 0 .
  ENDIF .
ENDAT .

ENDLOOP .

ENDFORM . "Get_On_Tables


*& Form Get_Where


FORM get_where USING p_text TYPE tt_text
CHANGING p_where TYPE tt_text .
DATA : wa_text TYPE st_text,
l_where TYPE i VALUE 0,
l_flag TYPE i VALUE 1,
l_mod TYPE i VALUE 0,
l_str TYPE string.

LOOP AT p_text INTO wa_text .
CASE wa_text-line .
WHEN c_where .
l_flag = 0 .
l_where = -1 .
WHEN c_group OR c_have OR c_order .
l_flag = 1 .
ENDCASE .

IF l_flag = 0 .
  ADD 1 TO l_where .

  IF l_where = 0 .
    l_str  =  wa_text-line .
    SHIFT l_str BY 1 PLACES RIGHT.
  ELSE .
    l_mod  =  l_where MOD 8 .
    IF l_mod = 0 .
      APPEND l_str TO p_where .
      CLEAR : l_str .
      l_str =  wa_text-line .
      CASE wa_text-line .
        WHEN c_or .
          SHIFT l_str BY 4 PLACES RIGHT.
        WHEN c_and.
          SHIFT l_str BY 3 PLACES RIGHT.
        WHEN OTHERS.
          SHIFT l_str BY 7 PLACES RIGHT.
      ENDCASE .
    ELSE .
      CONCATENATE l_str wa_text-line
             INTO l_str
        SEPARATED BY space .
    ENDIF .
  ENDIF .
ENDIF .

AT LAST.
  CHECK  l_str IS NOT INITIAL .
  APPEND l_str TO p_where .
ENDAT .

ENDLOOP .

ENDFORM . "Get_Where


*& Form Get_Group


FORM get_group USING p_text TYPE tt_text
CHANGING p_group TYPE tt_text .
DATA : wa_text TYPE st_text,
l_group TYPE i VALUE 0,
l_flag TYPE i VALUE 1,
l_mod TYPE i VALUE 0,
l_str TYPE string.

LOOP AT p_text INTO wa_text .
CASE wa_text-line .
WHEN c_group .
l_flag = 0 .
l_group = 0 .
WHEN c_have OR c_order .
l_flag = 1 .
ENDCASE .

IF l_flag = 0 .
  ADD 1 TO l_group .

  IF l_group = 1 .
    l_str  =  wa_text-line .
    SHIFT l_str BY 1 PLACES RIGHT.
  ELSE .
    l_mod  =  l_group MOD 8 .
    IF l_mod = 0 .
      APPEND l_str TO p_group .
      CLEAR : l_str .
      l_str =  wa_text-line .
      SHIFT l_str BY 7 PLACES RIGHT.
    ELSE .
      CONCATENATE l_str wa_text-line
             INTO l_str
        SEPARATED BY space .
    ENDIF .
  ENDIF .
ENDIF .

AT LAST.
  CHECK  l_str IS NOT INITIAL .
  APPEND l_str TO p_group .
ENDAT .

ENDLOOP .

ENDFORM . "Get_Group


*& Form Get_Have


FORM get_have USING p_text TYPE tt_text
CHANGING p_have TYPE tt_text .
DATA : wa_text TYPE st_text,
l_have TYPE i VALUE 0,
l_flag TYPE i VALUE 1,
l_mod TYPE i VALUE 0,
l_str TYPE string.

LOOP AT p_text INTO wa_text .
CASE wa_text-line .
WHEN c_have .
l_flag = 0 .
l_have = 0 .
WHEN c_order .
l_flag = 1 .
ENDCASE .

IF l_flag = 0 .
  ADD 1 TO l_have .

  IF l_have = 1 .
    l_str  =  wa_text-line .
  ELSE .
    l_mod  =  l_have MOD 8 .
    IF l_mod = 0 .
      APPEND l_str TO p_have .
      CLEAR : l_str .
      l_str =  wa_text-line .
      SHIFT l_str BY 7 PLACES RIGHT.
    ELSE .
      CONCATENATE l_str wa_text-line
             INTO l_str
        SEPARATED BY space .
    ENDIF .
  ENDIF .
ENDIF .

AT LAST.
  CHECK  l_str IS NOT INITIAL .
  APPEND l_str TO p_have .
ENDAT .

ENDLOOP .

ENDFORM . "Get_Have


*& Form Get_Order


FORM get_order USING p_text TYPE tt_text
CHANGING p_order TYPE tt_text .
DATA : wa_text TYPE st_text,
l_order TYPE i VALUE 0,
l_flag TYPE i VALUE 1,
l_mod TYPE i VALUE 0,
l_str TYPE string.

LOOP AT p_text INTO wa_text .
CASE wa_text-line .
WHEN c_order .
l_flag = 0 .
l_order = 0 .
WHEN c_select OR c_from OR c_where OR
c_have OR c_inner OR c_join .
CHECK l_flag = 0 .
PERFORM append_error_message USING 9 wa_text-line.
EXIT .
ENDCASE .

IF l_flag = 0 .
  ADD 1 TO l_order .

  IF l_order = 1 .
    l_str  =  wa_text-line .
    SHIFT l_str BY 1 PLACES RIGHT.
  ELSE .
    l_mod  =  l_order MOD 8 .
    IF l_mod = 0 .
      APPEND l_str TO p_order .
      CLEAR : l_str .
      l_str =  wa_text-line .
      SHIFT l_str BY 7 PLACES RIGHT.
    ELSE .
      CONCATENATE l_str wa_text-line
             INTO l_str
        SEPARATED BY space .
    ENDIF .
  ENDIF .
ENDIF .

AT LAST.
  CHECK  l_str IS NOT INITIAL .
  APPEND l_str TO p_order .
ENDAT .

ENDLOOP .

ENDFORM . "Get_Order


*& Form perpare_SQL_Element


FORM perpare_sql_element CHANGING p_text TYPE tt_text
p_fields TYPE tt_element
p_tables TYPE tt_element
p_on TYPE tt_text
p_where TYPE tt_text
p_group TYPE tt_text
p_have TYPE tt_text
p_order TYPE tt_text .

PERFORM move_comments_in_sql CHANGING p_text .

IF p_text IS INITIAL .
PERFORM append_error_message USING 8 ‘’ .
EXIT .
ENDIF .

PERFORM separate_from_word CHANGING p_text .
PERFORM upper_all_word_sql CHANGING p_text .
PERFORM process_funct_word CHANGING p_text .

PERFORM get_all_tables_name USING p_text
CHANGING p_tables.

IF p_tables IS INITIAL .
PERFORM append_error_message USING 10 ‘’ .
EXIT .
ENDIF .

PERFORM get_sql_fields USING p_text
p_tables
CHANGING p_fields.

IF p_fields IS INITIAL .
PERFORM append_error_message USING 11 ‘’ .
EXIT .
ENDIF .

PERFORM get_on_tables USING p_text
p_tables
CHANGING p_on .

PERFORM get_where USING p_text
CHANGING p_where .

PERFORM get_group USING p_text
CHANGING p_group .

PERFORM get_have USING p_text
CHANGING p_have .

PERFORM get_order USING p_text
CHANGING p_order .

ENDFORM . "Perpare_SQL_Element


*& Form Get_Ref_Table


FORM get_ref_table USING p_table_alias TYPE ddobjname
p_tables TYPE tt_element
CHANGING p_table_name TYPE ddobjname .
DATA : wa_element TYPE st_element .

READ TABLE p_tables INTO wa_element
WITH KEY alias = p_table_alias .

p_table_name = wa_element-name .

ENDFORM . "Get_Ref_Table


*& Form Check_SQL_With_Sub_Query


FORM check_sql_with_sub_query USING p_text TYPE tt_text
CHANGING p_return TYPE i.
DATA : wa_text TYPE st_text .

LOOP AT p_text INTO wa_text .

CHECK wa_text-line CP c_from .

ADD 1 TO p_return .

ENDLOOP.

ENDFORM . "Check_SQL_With_Sub_Query


*& Form Execute_SQL


FORM execute_sql USING p_text TYPE tt_text
CHANGING l_number TYPE i .
DATA: it_fields TYPE tt_element,
it_tables TYPE tt_element,
it_select TYPE tt_text,
it_on TYPE tt_text,
it_where TYPE tt_text,
it_group TYPE tt_text,
it_have TYPE tt_text,
it_order TYPE tt_text,
it_fieldcat TYPE lvc_t_fcat,
it_temp TYPE tt_text,
l_type TYPE string,
l_act TYPE i VALUE 1,
l_return TYPE i VALUE 0.

it_temp[] = p_text[] .

PERFORM format_sql_adapter USING l_act
CHANGING it_temp l_type
it_fields it_tables
it_select it_on
it_where it_group
it_have it_order
l_return .

  • PERFORM check_sql_with_sub_query USING it_temp[]

  •                            CHANGING l_return .
    

    IF

    IS ASSIGNED .
    CLEAR :
    .
    UNASSIGN
    .
    ENDIF .

    IF g_exception[] IS INITIAL .
    CASE l_return.
    *& SQL With Error
    WHEN 0 .

*& Without Sub Query
WHEN 1 .

    PERFORM get_data_in_dynamic_sql USING it_temp[]    l_type
                                          it_fields    it_select
                                          it_on        it_where
                                          it_group     it_have
                                          it_order .

*& With Sub Query
WHEN OTHERS .
PERFORM get_data_in_dynamic_prog USING it_temp[]
l_type
it_fields.
ENDCASE .
ENDIF .

IF g_exception IS INITIAL .
*& Show Data
PERFORM prepare_alv_field_cat USING it_fields
CHANGING it_fieldcat .
l_number = sy-dbcnt .
PERFORM show_data_in_alv USING g_grid


it_fieldcat[] .
ELSE .
*& Show Exception
PERFORM prepare_alv_error_field_cat CHANGING it_fieldcat .
PERFORM show_data_in_alv USING g_grid g_exception
it_fieldcat[] .
ENDIF .

g_postion = 50 .
PERFORM set_splitter_postion USING g_splitter
g_postion .

ENDFORM . "Execute_SQL


*& Form Get_Stucture_Define


FORM get_stucture_define USING p_fields TYPE tt_element
CHANGING p_text TYPE tt_text .
DATA : wa_text TYPE st_text,
wa_field TYPE st_element,
l_lable TYPE string.

CLEAR : p_text[] .
wa_text = ‘TYPES : BEGIN OF ST_DATA,’.
APPEND wa_text TO p_text .

LOOP AT p_fields INTO wa_field .
CLEAR : wa_text .
IF wa_field-display(6) = c_count1 .
CONCATENATE wa_field-alias ‘TYPE i ,’
INTO wa_text-line
SEPARATED BY space .
ELSE .
CONCATENATE wa_field-source ‘-’ wa_field-name
INTO wa_text-line .

  •  CONCATENATE wa_field-alias 'TYPE' wa_text-line ',' "Modify zyq by 20181123
    
  •         INTO wa_text-line
    
  •    SEPARATED BY space .
    CONCATENATE '"' wa_field-label INTO l_lable.  "Add zyq by 20181123
    CONCATENATE wa_text-line ',' INTO wa_text-line. "Add zyq by 20181123
    CONCATENATE wa_field-alias 'TYPE' wa_text-line l_lable "Modify zyq by 20181123
           INTO wa_text-line
      SEPARATED BY space .
    

    ENDIF .
    SHIFT wa_text-line BY 2 PLACES RIGHT .
    APPEND wa_text TO p_text .

    ENDLOOP .

    wa_text = ’ END OF ST_DATA.'.
    APPEND wa_text TO p_text .

ENDFORM. "Get_Stucture_Define


*& Form format_sql_adapter


FORM format_sql_adapter USING p_act TYPE i
CHANGING p_text TYPE tt_text
p_type TYPE string
p_fields TYPE tt_element
p_tables TYPE tt_element
p_select TYPE tt_text
p_on TYPE tt_text
p_where TYPE tt_text
p_group TYPE tt_text
p_have TYPE tt_text
p_order TYPE tt_text
p_return TYPE i.
DATA : it_temp TYPE tt_text .

PERFORM perpare_sql_element CHANGING p_text p_fields
p_tables p_on
p_where p_group
p_have p_order.

PERFORM check_sql_with_sub_query USING p_text
CHANGING p_return .

CASE p_return.
*& SQL With Error
WHEN 0 .

*& Without Sub Query
WHEN 1 .

*& Format Select Fields
PERFORM format_fields USING p_fields
p_act
CHANGING p_select
p_text
p_type .

*& Format Table Name
PERFORM format_tables USING p_on
CHANGING p_text .

*& Format Where Condition
PERFORM format_where USING p_where
CHANGING p_text .

*& Format Group By
PERFORM format_group USING p_group
CHANGING p_text .

*& Format Having
PERFORM format_have USING p_have
CHANGING p_text .
*& Format Order By
PERFORM format_order USING p_order
CHANGING p_text .

*& Trnasfer Case
PERFORM transfer_case USING g_case
CHANGING p_text .

WHEN OTHERS .

*& Format Select Fields
it_temp[] = p_text .
PERFORM format_fields USING p_fields
p_act
CHANGING p_select
it_temp
p_type .

  IF p_act <> 1 .
    PERFORM append_error_message USING 7 ''.
  ENDIF .

ENDCASE .

ENDFORM . "format_sql


*& Form format_sql


FORM format_sql CHANGING p_text TYPE tt_text .
DATA: it_fields TYPE tt_element,
it_tables TYPE tt_element,
it_fieldcat TYPE lvc_t_fcat,
it_select TYPE tt_text,
it_on TYPE tt_text,
it_where TYPE tt_text,
it_group TYPE tt_text,
it_have TYPE tt_text,
it_order TYPE tt_text,
l_act TYPE i VALUE 0,
l_type TYPE string,
l_return TYPE i.

PERFORM format_sql_adapter USING l_act
CHANGING p_text l_type
it_fields it_tables
it_select it_on
it_where it_group
it_have it_order
l_return.

*& Show Exception
IF g_exception IS INITIAL AND p_text[] IS NOT INITIAL.
PERFORM load_text_from_table USING g_editor
CHANGING p_text .
g_postion = 100 .

ELSE .
PERFORM prepare_alv_error_field_cat CHANGING it_fieldcat .

PERFORM show_data_in_alv         USING g_grid
                                       g_exception
                                       it_fieldcat[] .
g_postion = 50 .

ENDIF .

PERFORM set_splitter_postion USING g_splitter
g_postion .

ENDFORM . "format_sql


*& Form bud_sturcture


FORM bud_sturcture USING p_text TYPE tt_text
CHANGING p_temp TYPE tt_text .

DATA: it_fields TYPE tt_element,
it_tables TYPE tt_element,
it_fieldcat TYPE lvc_t_fcat,
it_select TYPE tt_text,
it_on TYPE tt_text,
it_where TYPE tt_text,
it_group TYPE tt_text,
it_have TYPE tt_text,
it_order TYPE tt_text,
l_act TYPE i VALUE 0,
l_type TYPE string,
l_temp TYPE tt_text,
l_return TYPE i.

CLEAR : p_temp .
l_temp = p_text .

PERFORM format_sql_adapter USING l_act
CHANGING l_temp l_type
it_fields it_tables
it_select it_on
it_where it_group
it_have it_order
l_return.

*& Show Exception
IF g_exception IS INITIAL AND p_text[] IS NOT INITIAL.
PERFORM get_stucture_define USING it_fields
CHANGING p_temp .
ELSE .
PERFORM prepare_alv_error_field_cat CHANGING it_fieldcat .

PERFORM show_data_in_alv           USING g_grid
                                         g_exception
                                         it_fieldcat[] .
g_postion = 50 .
PERFORM set_splitter_postion       USING g_splitter
                                         g_postion .

ENDIF .

g_postion = 70 .
PERFORM set_splitter_postion USING g_splitter1
g_postion .

ENDFORM . "bud_sturcture

*& End

&---------------------------------------------------------------------
*& 包含 ZSQLEXPLORERF05 zyq
&---------------------------------------------------------------------


*& Form Get_Data_In_Dynamic_Program


FORM get_data_in_dynamic_prog USING p_sql TYPE tt_text
p_type TYPE string
p_element TYPE tt_element.

DATA : it_code TYPE tt_code,
prog TYPE c LENGTH 8,
msg TYPE c LENGTH 240, "Modify zyq by 20181119 由120加大到240
lin TYPE c LENGTH 3,
wrd TYPE c LENGTH 10,
off TYPE c LENGTH 3,
l_msg TYPE string,
p_stcurt TYPE REF TO data.

PERFORM create_dynamic_program_code USING p_sql
p_element
p_type
CHANGING it_code .

GENERATE SUBROUTINE POOL it_code NAME prog
MESSAGE msg
LINE lin
WORD wrd
OFFSET off.

IF sy-subrc <> 0.
l_msg = msg .
PERFORM append_error_message USING 4 l_msg .
PERFORM download_table_to_local TABLES it_code[]
USING ‘c:\11.txt’.
ELSE .

& Get The Dynamic Structure
PERFORM get_structure IN PROGRAM (prog) CHANGING p_stcurt .
ASSIGN p_stcurt->
TO

.

*& Get Data With SQL
PERFORM get_data IN PROGRAM (prog) USING

.

ENDIF .

ENDFORM . "Get_Data_In_Dynamic_Prog


*& Form Create_Dynamic_Program_Code


FORM create_dynamic_program_code USING p_sql TYPE tt_text
p_element TYPE tt_element
p_type TYPE string
CHANGING p_code TYPE tt_code .
DATA : it_temp TYPE tt_code .

CLEAR : p_code[] .

*& Create The Start Of The Dynamic Program
PERFORM define_program_01 USING p_element
CHANGING it_temp .
APPEND LINES OF it_temp TO p_code .

*& Create The First Function
PERFORM define_program_02 CHANGING it_temp .
APPEND LINES OF it_temp TO p_code .

*& Create The Get Data Function
PERFORM define_program_03 USING p_sql
p_type
CHANGING it_temp .
APPEND LINES OF it_temp TO p_code .

ENDFORM . "Create_Dynamic_Program


*& Form Define_Program_01


FORM define_program_01 USING p_element TYPE tt_element
CHANGING p_code TYPE tt_code .
DATA : wa_element TYPE st_element,
wa_line TYPE LINE OF tt_code,
l_text TYPE string.

CLEAR : p_code[] .

APPEND 'PROGRAM SUBPOOL. ’ TO p_code .
APPEND 'TYPES:Begin OF ST_DATA, ’ TO p_code .

LOOP AT p_element INTO wa_element .
IF wa_element-display CS c_count .
CONCATENATE wa_element-alias ’ ’ ‘TYPE’ ’ ’
‘i,’
INTO wa_line
SEPARATED BY space .
ELSE .
CONCATENATE wa_element-source ‘-’ wa_element-name
INTO l_text .
CONCATENATE wa_element-alias ’ ’ ‘LIKE’ ’ ’
l_text ‘,’
INTO wa_line
SEPARATED BY space .
ENDIF .
APPEND wa_line TO p_code .
ENDLOOP .

APPEND ’ End OF ST_DATA. ’ TO p_code .
APPEND 'TYPES: TT_DATA TYPE STANDARD TABLE OF ST_DATA. ’ TO p_code .

ENDFORM . "Define_Program_01


*& Form Define_Program_02


FORM define_program_02 CHANGING p_code TYPE tt_code .
DATA : wa_element TYPE st_element,
wa_line TYPE LINE OF tt_code.

CLEAR : p_code[] .

APPEND 'FORM get_structure Changing p_struct TYPE REF TO data . ’ TO p_code .
APPEND ’ ’ TO p_code .
APPEND ’ CREATE DATA p_struct TYPE TT_DATA. ’ TO p_code .
APPEND ’ ’ TO p_code .
APPEND 'ENDFORM . ’ TO p_code .

ENDFORM . "Define_Program_02


*& Form Define_Program_03


FORM define_program_03 USING p_sql TYPE tt_text
p_type TYPE string
CHANGING p_code TYPE tt_code .
DATA : wa_text TYPE st_text,
l_first TYPE i VALUE 0.

CLEAR : p_code[] .

APPEND 'FORM GET_DATA USING P_DATA TYPE ANY TABLE . ’ TO p_code .
APPEND ’ DATA : IT_DATA TYPE TT_DATA . ’ TO p_code .
APPEND ’ DATA : WA_DATA TYPE ST_DATA . ’ TO p_code .
APPEND ’ ’ TO p_code .

LOOP AT p_sql INTO wa_text .
IF wa_text = ‘FROM’ AND l_first = 0 .
IF p_type = c_single .
wa_text = ‘INTO WA_DATA FROM’ .
ELSE .
wa_text = ‘INTO CORRESPONDING FIELDS OF TABLE IT_DATA FROM’ .
ENDIF .
l_first = 1 .
ENDIF .
SHIFT wa_text-line BY 1 PLACES RIGHT .
APPEND wa_text TO p_code .
ENDLOOP .

APPEND ’ . ’ TO p_code .
IF p_type = c_single .
APPEND ’ APPEND WA_DATA TO IT_DATA. ’ TO p_code .
ENDIF .
APPEND ’ P_DATA = IT_DATA[]. ’ TO p_code .
APPEND ’ ’ TO p_code .
APPEND 'ENDFORM. ’ TO p_code .

ENDFORM . "Define_Program_03

*& End

&---------------------------------------------------------------------
*& 包含 ZSQLEXPLORERF06 zyq
&---------------------------------------------------------------------


*& Form Get_Data_In_Dynamic_SQL


FORM get_data_in_dynamic_sql USING p_text TYPE tt_text
p_type TYPE string
p_fields TYPE tt_element
p_select TYPE tt_text
p_on TYPE tt_text
p_where TYPE tt_text
p_group TYPE tt_text
p_have TYPE tt_text
p_order TYPE tt_text .

DATA : p_all TYPE i VALUE 1,
wa_text TYPE st_text,
p_table TYPE REF TO data,
p_line TYPE REF TO data,
l_to TYPE string,
l_length TYPE i.

*& Get Field Statement
l_length = 6 .
PERFORM set_blank USING l_length
CHANGING p_select .

*& Get Table Statement
l_length = 6 .
PERFORM set_blank USING l_length
CHANGING p_on .

*& Get Where Statement
l_length = 6 .
PERFORM set_blank USING l_length
CHANGING p_where .

*& Get Group Statement
l_length = 9 .
PERFORM set_blank USING l_length
CHANGING p_group.

*& Get Have Statement
l_length = 6 .
PERFORM set_blank USING l_length
CHANGING p_have.

*& Get Order Statement
l_length = 9 .
PERFORM set_blank USING l_length
CHANGING p_order.

*& Get Dynamic Structure
PERFORM get_structure USING p_fields
CHANGING p_table .

CHECK g_exception[] IS INITIAL .

ASSIGN p_table->* TO

.

CREATE DATA p_line LIKE LINE OF

.
ASSIGN p_line->* TO .

*& Check SQL Type
PERFORM get_data USING p_select p_on
p_where p_group
p_have p_order
p_type
CHANGING

.

ENDFORM . "Get_Data_in_dynamic_SQL


*& Form Get_Structure


FORM get_structure USING p_fields TYPE tt_element
CHANGING p_ref TYPE REF TO data .
DATA: wa_component TYPE abap_componentdescr,
it_component TYPE abap_component_tab,
wa_strucdescr TYPE REF TO cl_abap_structdescr,
it_tabledescr TYPE REF TO cl_abap_tabledescr,
wa_field TYPE st_element,
l_oref TYPE REF TO cx_root,
l_str TYPE string,
l_msg TYPE string.

LOOP AT p_fields INTO wa_field .
CLEAR : wa_component .
wa_component-name = wa_field-alias .

IF  wa_field-display(6) = c_count1 .
  CONCATENATE 'LVC_S_FCAT' '-'  'ROW_POS'
     INTO l_str .
ELSE .
  CONCATENATE wa_field-source '-' wa_field-name
         INTO l_str .
ENDIF .

PERFORM case_to_upper CHANGING l_str .
PERFORM case_to_upper CHANGING wa_component-name .

TRY.

    wa_component-type ?= cl_abap_typedescr=>describe_by_name( l_str ).
    INSERT wa_component INTO TABLE it_component.

  CATCH cx_root INTO l_oref.
    l_msg  = l_oref->get_text( ).
    PERFORM append_error_message USING 4 l_msg .
  CLEANUP.
    CLEAR l_oref.
ENDTRY .

ENDLOOP .

CHECK g_exception[] IS INITIAL .

TRY.
IF it_component IS NOT INITIAL.
wa_strucdescr = cl_abap_structdescr=>create( it_component ).
it_tabledescr = cl_abap_tabledescr=>create( p_line_type = wa_strucdescr ).
ENDIF.
CREATE DATA p_ref TYPE HANDLE it_tabledescr.
CATCH cx_root INTO l_oref.
l_msg = l_oref->get_text( ).
PERFORM append_error_message USING 4 l_msg .
CLEANUP.
CLEAR l_oref.
ENDTRY .

ENDFORM . "get_structure


*& Form Get_Data


FORM get_data USING p_field TYPE tt_text
p_table TYPE tt_text
p_where TYPE tt_text
p_group TYPE tt_text
p_have TYPE tt_text
p_order TYPE tt_text
p_type TYPE string
CHANGING p_data TYPE STANDARD TABLE
p_line TYPE any .
DATA : l_oref TYPE REF TO cx_root,
wa_text TYPE st_text,
l_msg TYPE string.

TRY.
CASE p_type .
WHEN c_single .
SELECT SINGLE (p_field)
INTO p_line
FROM (p_table)
WHERE (p_where)
GROUP BY (p_group)
HAVING (p_have).
APPEND p_line TO p_data .

    WHEN c_distinct  .
      SELECT DISTINCT (p_field)
        INTO TABLE p_data UP TO g_rows ROWS "modiry zyq by 20181122
        FROM (p_table)
       WHERE (p_where)
       GROUP BY (p_group)
      HAVING (p_have)
       ORDER BY (p_order) .

    WHEN OTHERS .
      SELECT (p_field)
        INTO TABLE p_data UP TO g_rows ROWS "modiry zyq by 20181122
        FROM (p_table)
       WHERE (p_where)
       GROUP BY (p_group)
      HAVING (p_have)
       ORDER BY (p_order).

  ENDCASE .

CATCH cx_root INTO l_oref.
  l_msg  = l_oref->get_text( ).
  PERFORM append_error_message USING 4 l_msg .

CLEANUP.
  CLEAR l_oref.

ENDTRY .

ENDFORM . "Get_Data


*& Form Get_Field_Statement


FORM get_field_statement USING p_element TYPE tt_element
CHANGING p_field TYPE tt_text .
DATA : wa_element TYPE st_element,
wa_field TYPE st_text,
l_temp TYPE string.

LOOP AT p_element INTO wa_element .

wa_field-line  = wa_element-display .

APPEND wa_field TO p_field  .

ENDLOOP .

ENDFORM . "Get_Field_Statement


*& Form Set_Blank


FORM set_blank USING l_length TYPE i
CHANGING p_text TYPE tt_text.
DATA : wa_text TYPE st_text .

CHECK p_text IS NOT INITIAL .

READ TABLE p_text INTO wa_text INDEX 1 .
wa_text-line(l_length) = ‘’ .
SHIFT wa_text-line BY l_length PLACES RIGHT .
MODIFY p_text FROM wa_text INDEX 1 .

ENDFORM . "Set_Blank

*& End .

&---------------------------------------------------------------------
*& 包含 ZSQLEXPLORERO01 zyq
&---------------------------------------------------------------------


*& Form Show_Message


FORM show_message USING p_message TYPE string .

CALL FUNCTION ‘POPUP_TO_INFORM’
EXPORTING
titel = g_repid
txt2 = space
txt1 = p_message.

ENDFORM. "Show_Message


*& Module Initial_Screen OUTPUT


MODULE initial_screen OUTPUT.
DATA : l_orientation TYPE i,
l_mode TYPE i.

CHECK g_editor IS INITIAL.

g_repid = sy-repid.

*& Create Control Container

PERFORM create_container_object USING g_container
c_sql_editor.

l_orientation = 1 .
PERFORM create_splitter_object USING g_splitter1
g_container
l_orientation .

PERFORM create_editor_object USING g_editor1
g_splitter1->bottom_right_container .

l_orientation = 0 .
PERFORM create_splitter_object USING g_splitter
g_splitter1->top_left_container
l_orientation.

*& Create Text Editor
PERFORM create_editor_object USING g_editor
g_splitter->top_left_container .

*& Create ALV
PERFORM create_alv_object USING g_grid
g_splitter->bottom_right_container.

IF sy-subrc NE 0.
PERFORM show_message USING c_msg01 .
ENDIF.

*& Set SQL Editor Support Highlight Comments
PERFORM set_comment_mode USING g_editor .
PERFORM set_comment_mode USING g_editor1.

*& Set Editor Read Only
l_mode = 1 .
PERFORM set_readonly_mode USING g_editor1
l_mode .

ENDMODULE. " Initial_Screen OUTPUT


*& Module status_0100 OUTPUT


MODULE status_0100 OUTPUT.

SET PF-STATUS ‘SCREEN100’.
SET TITLEBAR ‘T001’.

ENDMODULE. " status_0100 OUTPUT

*& End

&---------------------------------------------------------------------
*& 包含 ZSQLEXPLORERO02 zyq
&---------------------------------------------------------------------


*& Module STATUS_0200 OUTPUT


MODULE status_0200 OUTPUT.

SET PF-STATUS ‘SCREEN200’.
SET TITLEBAR ‘’.

ENDMODULE. " STATUS_0200 OUTPUT

&---------------------------------------------------------------------
*& 包含 ZSQLEXPLORERI01 zyq
&---------------------------------------------------------------------


*& Module USER_COMMAND_0100 INPUT


MODULE user_command_0100 INPUT.
DATA : l_start TYPE i,
l_end TYPE i,
it_temp TYPE tt_text,
l_number TYPE i.

*& Initial Serval Global Variant
CLEAR : g_exception, l_number .

*& Keep Start Time
GET RUN TIME FIELD l_start.

*& Processing User Command
CASE g_ucomm.

WHEN 'EXIT' OR 'BACK' OR 'BREAK'.
  PERFORM exit_program.

WHEN 'EXEC'.
  PERFORM save_text_to_table       USING g_editor
                                CHANGING it_text.
  PERFORM execute_sql              USING it_text
                                CHANGING l_number.

WHEN 'FORM'.
  PERFORM save_text_to_table       USING g_editor
                                CHANGING it_text.

  PERFORM format_sql            CHANGING it_text.

WHEN 'BUDG'.
  PERFORM save_text_to_table       USING g_editor
                                CHANGING it_text.

  PERFORM bud_sturcture            USING it_text
                                CHANGING it_temp .

  PERFORM set_text_as_r3table      USING g_editor1
                                CHANGING it_temp   .

WHEN 'SAVE'.
  IF g_file IS INITIAL .
    PERFORM get_filename CHANGING g_file .
  ENDIF .

  CHECK g_file IS NOT INITIAL AND sy-subrc = 0 .
  PERFORM save_as_local_file USING g_editor
                                   g_file  .


WHEN 'MOVE'.
  PERFORM move_splitter_postion    USING g_splitter .

WHEN 'CONF'.
  CALL SCREEN c_200 STARTING AT 30 5 .

ENDCASE.

*& Set Runtime
GET RUN TIME FIELD l_end.

PERFORM set_runtime_and_lines USING l_start
l_end
l_number.

CLEAR : g_ucomm .

ENDMODULE. " USER_COMMAND_0100 INPUT


*& Form EXIT_PROGRAM


FORM exit_program.

*& Free All Memory Located By Objects
PERFORM destroy_alv_object CHANGING g_grid .
PERFORM destroy_editor_object CHANGING g_editor .
PERFORM destroy_editor_object CHANGING g_editor1 .
PERFORM destroy_splitter_object CHANGING g_splitter .
PERFORM destroy_splitter_object CHANGING g_splitter1 .
PERFORM destroy_container_object CHANGING g_container .

*& Finally Flush
CALL METHOD cl_gui_cfw=>flush
EXCEPTIONS
OTHERS = 1.

LEAVE PROGRAM.

ENDFORM. " EXIT_PROGRAM


*& Form Set_Runtime


FORM set_runtime_and_lines USING p_start TYPE i
p_end TYPE i
p_number TYPE i .
DATA : l_temp TYPE string,
l_status TYPE c LENGTH 100,
l_spend TYPE p LENGTH 12 DECIMALS 3.

*& Set Runtime
l_spend = ( p_end - p_start ) / 1000000 .
l_temp = l_spend .

CONCATENATE ’ 查询用时:’ l_temp ‘秒’ "zyq add by 181122
INTO l_status
SEPARATED BY space .

*& Set The Number Of The Total Records
l_temp = l_number .

CONCATENATE l_status ‘, 查到行数:’ l_temp ‘, 最大可显行数:’ l_rows_01 "zyq add by 181122
INTO l_status
SEPARATED BY space .

PERFORM set_status_text USING g_editor
l_status .

ENDFORM . "Set_Runtime

*& End

&---------------------------------------------------------------------
*& 包含 ZSQLEXPLORERI02 zyq
&---------------------------------------------------------------------


*& Module USER_COMMAND_0200 INPUT


MODULE user_command_0200 INPUT.

CASE g_ucomm .

WHEN 'BUTTON_01'.
  CASE 'X'.
    WHEN l_case_01 .
      g_case = 1 .
    WHEN l_case_02 .
      g_case = 2 .
    WHEN l_case_03 .
      g_case = 3 .
  ENDCASE .

  CASE 'X'.
    WHEN l_label_01 .
      g_label = 1 .
    WHEN l_label_02 .
      g_label = 2 .
  ENDCASE .
  •  g_case = 3 .
    
  •  g_label = 2 .
    CASE 'X'. "zyq add by 181122
      WHEN l_as_01 .
        g_as = 1 .
      WHEN l_as_02 .
        g_as = 2 .
      WHEN l_as_03 .
        g_as = 3 .
    ENDCASE .
    g_cols = l_cols_01. "zyq add by 181122
    c_line_fields = l_cols_01. "zyq add by 181122
    g_rows = l_rows_01. "zyq add by 181122
    

    WHEN ‘CANC’.
    ENDCASE .

    CLEAR : g_ucomm .

ENDMODULE. " USER_COMMAND_0200 INPUT

在这里插入图片描述
***屏幕0100
PROCESS BEFORE OUTPUT.
MODULE status_0100.
MODULE initial_screen .

PROCESS AFTER INPUT.
MODULE user_command_0100.

**屏幕0200
PROCESS BEFORE OUTPUT.
MODULE status_0200.
MODULE initial_0200_screen .

PROCESS AFTER INPUT.
MODULE user_command_0200.

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值