SAP-ABAP-测速工具

给大家分享一个大佬写的abap运行测速工具,下面是效果图

话不多说,上源码

*&---------------------------------------------------------------------*
*& Report ZABAP_TIME_TEST
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
*REPORT ZABAP_TIME_TEST.
*创建指南 创建SCREEN 100  MAIN_CONTAINER
*流逻辑如下:
*PROCESS BEFORE OUTPUT.
*  MODULE STATUS_0100.
**
*PROCESS AFTER INPUT.
*  MODULE USER_COMMAND_0100.
REPORT ZABAP_TIME_TEST MESSAGE-ID s7 NO STANDARD PAGE HEADING.

INCLUDE <icon>.

DATA : par_test ,
       par_from(2) TYPE p,
       par_to(2)   TYPE p,
       par_cnt(2)  TYPE p VALUE 1,
       sapclock    VALUE 1,
       osclock  .
*PARAMETERS: PAR_TEST AS CHECKBOX,
*PAR_FROM(2) TYPE P,
*PAR_TO(2)   TYPE P,
*PAR_CNT(2)  TYPE P DEFAULT 1,
*SAPCLOCK RADIOBUTTON GROUP PGR1,
*OSCLOCK  RADIOBUTTON GROUP PGR1.

*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - *
*                  TYPES AND DATA
*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - *
* types
TYPES: t_sline TYPE edpline,

       BEGIN OF t_s,
         line TYPE t_sline,
       END   OF t_s.
* controls
DATA: docking_container     TYPE REF TO cl_gui_docking_container,
      tree                  TYPE REF TO cl_simple_tree_model,
      main_container        TYPE REF TO cl_gui_custom_container,
      v_container           TYPE REF TO cl_gui_easy_splitter_container,
      h_container           TYPE REF TO cl_gui_easy_splitter_container,
      h1_container          TYPE REF TO cl_gui_easy_splitter_container,
      h2_container          TYPE REF TO cl_gui_easy_splitter_container,
      code_right_editor     TYPE REF TO cl_gui_textedit,
      code_left_editor      TYPE REF TO cl_gui_textedit,
      global_data_container TYPE REF TO cl_gui_dialogbox_container,
      global_data_viewer    TYPE REF TO cl_gui_textedit,
      dd                    TYPE REF TO cl_dd_document,
      dd_left               TYPE REF TO cl_dd_document,
      dd_right              TYPE REF TO cl_dd_document.
* dynpro
DATA: fcode LIKE sy-ucomm.
DATA: runtime_l TYPE i.
DATA: runtime_r TYPE i.
DATA: runtime_x TYPE c.
DATA: title_left TYPE t_sline.
DATA: title_right TYPE t_sline.
DATA: xtended_title(70).

* coding
DATA: sl TYPE STANDARD TABLE OF t_sline WITH HEADER LINE,
      sr TYPE STANDARD TABLE OF t_sline WITH HEADER LINE.
DATA: init_l TYPE STANDARD TABLE OF t_sline WITH HEADER LINE,
      init_r TYPE STANDARD TABLE OF t_sline WITH HEADER LINE.
DATA: inix_l TYPE STANDARD TABLE OF t_sline WITH HEADER LINE,
      inix_r TYPE STANDARD TABLE OF t_sline WITH HEADER LINE.
DATA: c TYPE STANDARD TABLE OF t_sline WITH HEADER LINE.
* buffer
DATA: BEGIN OF r  OCCURS 200, line TYPE t_sline, END OF r.
DATA: BEGIN OF e  OCCURS 200, line TYPE t_sline, END OF e.
DATA: BEGIN OF x  OCCURS 200, line TYPE t_sline, END OF x.
* subroutine pool
DATA: pool_name LIKE sy-repid.
DATA: source_tmp TYPE STANDARD TABLE OF t_s WITH HEADER LINE.
* other
DATA: runtime_mult TYPE i VALUE 10.
DATA: runtime_base TYPE i.
DATA: x_tabix   LIKE sy-tabix,
      syn_error,
      gen_error.
DATA: clock_type      TYPE i,
      clock_type_n(1) TYPE n.

*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - *
*                  INITIALIZATION
*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - *
INITIALIZATION.
  GET PARAMETER ID 'ATRA_CLOCK_TYPE' FIELD clock_type_n.
  CASE clock_type_n.
    WHEN '1'. clock_type = 1.
    WHEN '2'. clock_type = 2.
  ENDCASE.
  CASE clock_type.
    WHEN 1.      sapclock = ' '. osclock = 'X'.
    WHEN 2.      sapclock = 'X'. osclock = ' '.
    WHEN OTHERS. sapclock = 'X'. osclock = ' '.
  ENDCASE.

*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - *
*                  START-OF-SELECTION
*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - *
START-OF-SELECTION.
  PERFORM authority_check.
  IF osclock = 'X'.
    SET RUN TIME CLOCK RESOLUTION LOW.
  ENDIF.
  PERFORM init.

  IF par_test IS INITIAL.
    CALL SCREEN 100.
  ELSE.
    PERFORM test_examples.
  ENDIF.

*---------------------------------------------------------------------*
*       FORM INIT                                                     *
*---------------------------------------------------------------------*
FORM init.
  TRY.
      READ REPORT 'RSHOWTI0' INTO r.
    CATCH cx_sy_read_src_line_too_long.
      MESSAGE e501.
  ENDTRY.

* Read examples into table X
  PERFORM read_rshowtix USING:
        'RSHOWTI1',
        'RSHOWTI2',
        'RSHOWTI3',
        'RSHOWTI4',
        'RSHOWTI5',
        'RSHOWTI6'.

* Measure time of GET RUNTIME statement
  PERFORM set_runtime_base.
ENDFORM.

*---------------------------------------------------------------------*
*       FORM READ_RSHOWTIX                                            *
*---------------------------------------------------------------------*
FORM read_rshowtix USING rname LIKE sy-repid.
  DATA: BEGIN OF y  OCCURS 200, line TYPE t_sline, END OF y.
  DATA: no_display.

  TRY.
      READ REPORT rname INTO y.
    CATCH cx_sy_read_src_line_too_long.
      MESSAGE e501.
  ENDTRY.

  LOOP AT y INTO x.
    IF x-line(3) = '*>T'.
      IF x-line+3(1) = '('.
        no_display = 'X'.
      ELSE.
        no_display = space.
      ENDIF.
    ENDIF.
    IF no_display = space.
      APPEND x.
    ENDIF.
  ENDLOOP.
ENDFORM.                               "READ_RSHOWTIX

*---------------------------------------------------------------------*
*       FORM SET_RUNTIME_BASE                                         *
*---------------------------------------------------------------------*
*       Time measurement for "GET RUNTIME" statement                  *
*---------------------------------------------------------------------*
FORM set_runtime_base.
  DATA: i1 TYPE i, i2 TYPE i.
*
  runtime_base = 999999.

  DO 10 TIMES.
    GET RUN TIME FIELD i1.
    GET RUN TIME FIELD i2.
    i2 = i2 - i1.
    IF i2 LT runtime_base.
      runtime_base = i2.
    ENDIF.
  ENDDO.
ENDFORM.                               "SET_RUNTIME_BASE

*---------------------------------------------------------------------*
*       FORM GET_RUNTIME                                              *
*---------------------------------------------------------------------*
FORM get_runtime.
  DATA: BEGIN OF syn_msg, l1(72), l2(72), l3(72), END OF syn_msg.
  DATA: syn_lin     TYPE i, syn_wrd(30).                    "#EC NEEDED
  DATA: msg(218) TYPE c.

  CLEAR runtime_l.
  CLEAR runtime_r.
  CLEAR runtime_x.

  PERFORM fill_s.
  TRY.
      GENERATE SUBROUTINE POOL source_tmp NAME pool_name
      MESSAGE syn_msg LINE syn_lin WORD syn_wrd.
      IF sy-subrc EQ 0.

        PERFORM upl IN PROGRAM (pool_name) USING runtime_l runtime_mult.
        SUBTRACT runtime_base FROM runtime_l.
        IF runtime_l < 0. runtime_l = 0. ENDIF.
        PERFORM upr IN PROGRAM (pool_name) USING runtime_r runtime_mult.
        SUBTRACT runtime_base FROM runtime_r.
        IF runtime_r < 0. runtime_r = 0. ENDIF.
        runtime_x = 'X'.
      ELSE.
        syn_error = 'X'.
        CONCATENATE syn_msg-l1 syn_msg-l2 syn_msg-l3 INTO msg
        SEPARATED BY space.
        MESSAGE i666(01) WITH msg(50) msg+50(50) msg+100(50) msg+150(50).
      ENDIF.
    CATCH cx_sy_generate_subpool_full.
      gen_error = 'X'.
      MESSAGE s012.
      EXIT.
  ENDTRY.
ENDFORM.                               "GET_RUNTIME

*---------------------------------------------------------------------*
*       FORM FILL_S                                                   *
*---------------------------------------------------------------------*
FORM fill_s.
  DATA: formflag.

  REFRESH: source_tmp,sl,sr.
  DATA:gt_lines    TYPE STANDARD TABLE OF t_sline WITH HEADER LINE.
  CLEAR:gt_lines.

  CALL METHOD code_left_editor->get_text_as_r3table
    IMPORTING
      table                  = sl[]
    EXCEPTIONS
      error_dp               = 1
      error_cntl_call_method = 2
      error_dp_create        = 3
      potential_data_loss    = 4
      OTHERS                 = 5.

  CALL METHOD code_right_editor->get_text_as_r3table
    IMPORTING
      table                  = sr[]
    EXCEPTIONS
      error_dp               = 1
      error_cntl_call_method = 2
      error_dp_create        = 3
      potential_data_loss    = 4
      OTHERS                 = 5.
*  move

  LOOP AT r INTO source_tmp.
    APPEND source_tmp.
    IF source_tmp-line = '*>D'.
      CASE osclock.
        WHEN ' '. source_tmp = 'DATA OSCLOCK VALUE '' ''.'.
        WHEN 'X'. source_tmp = 'DATA OSCLOCK VALUE ''X''.'.
      ENDCASE.
      APPEND source_tmp.
    ENDIF.

    IF source_tmp-line = '*>L'.
      LOOP AT sl INTO source_tmp.
        IF source_tmp-line(5) = 'FORM'. EXIT. ENDIF.
        APPEND source_tmp.
      ENDLOOP.
    ELSEIF source_tmp-line = '*>R'.
      LOOP AT sr INTO source_tmp.
        IF source_tmp-line(5) = 'FORM'. EXIT. ENDIF.
        APPEND source_tmp.
      ENDLOOP.
    ELSEIF source_tmp-line = '*>LI'.
      LOOP AT init_l INTO source_tmp.
        APPEND source_tmp.
      ENDLOOP.
    ELSEIF source_tmp-line = '*>RI'.
      LOOP AT init_r INTO source_tmp.
        APPEND source_tmp.
      ENDLOOP.
    ELSEIF source_tmp-line = '*>LX'.
      LOOP AT inix_l INTO source_tmp.
        APPEND source_tmp.
      ENDLOOP.
    ELSEIF source_tmp-line = '*>RX'.
      LOOP AT inix_r INTO source_tmp.
        APPEND source_tmp.
      ENDLOOP.
    ELSEIF source_tmp-line = '*>FO'.
      formflag = space.
      LOOP AT sl INTO source_tmp.
        IF source_tmp-line(5) = 'FORM'. formflag = 'X'. ENDIF.
        IF formflag = 'X'.
          APPEND source_tmp.
        ENDIF.
      ENDLOOP.
      formflag = space.
      LOOP AT sr INTO source_tmp.
        IF source_tmp-line(5) = 'FORM'. formflag = 'X'. ENDIF.
        IF formflag = 'X'.
          APPEND source_tmp.
        ENDIF.
      ENDLOOP.
    ENDIF.
  ENDLOOP.
ENDFORM.                               "FILL_S

*----------------------------------------------------------------------*
*       FORM GET_EXAMPLE                                               *
*----------------------------------------------------------------------*
*  Transport example from table of examples X into corresponding       *
*  fields and tables                                                   *
*----------------------------------------------------------------------*
FORM get_example.
  DATA: xtype.

  REFRESH: c, init_l, init_r, sl, sr,
  inix_l, inix_r.

  runtime_mult = 10.

  READ TABLE x INDEX x_tabix.
  IF sy-subrc = 0 AND x-line(4) = '*>T'.
    xtended_title = x-line+4.
  ELSE.
    CLEAR xtended_title.
  ENDIF.

  DO.
    ADD 1 TO x_tabix.
    READ TABLE x INDEX x_tabix.
    IF sy-subrc NE 0. EXIT. ENDIF.
    CASE x-line(4).
      WHEN '*>O'.                      "No action
      WHEN '*>U'.                      "No action
      WHEN '*>V'.                      "No action
      WHEN '*>T'. EXIT.
      WHEN '*>X'. xtended_title = x-line+4.
      WHEN '*>#'.
        IF x-line+4(4) CO ' 0123456789'.
          runtime_mult = x-line+4(4).
        ENDIF.
      WHEN '*>LI'.             xtype = 'I'.
      WHEN '*>LX'.             xtype = 'M'.
      WHEN '*>L'.
        xtype = 'L'.
        title_left = x-line+3.
      WHEN '*>RI'.             xtype = 'J'.
      WHEN '*>RX'.             xtype = 'N'.
      WHEN '*>R'.
        xtype = 'R'.
        title_right = x-line+3.
      WHEN '*>C'.              xtype = 'C'.
      WHEN OTHERS.
        CASE xtype.
          WHEN 'L'. APPEND x-line TO sl.
          WHEN 'R'. APPEND x-line TO sr.
          WHEN 'C'. APPEND x-line TO c.
          WHEN 'I'. APPEND x-line TO init_l.
          WHEN 'J'. APPEND x-line TO init_r.
          WHEN 'M'. APPEND x-line TO inix_l.
          WHEN 'N'. APPEND x-line TO inix_r.
        ENDCASE.
    ENDCASE.
  ENDDO.
ENDFORM.                               "GET_EXAMPLE

*---------------------------------------------------------------------*
*       FORM TEST_EXAMPLES                                            *
*---------------------------------------------------------------------*
FORM test_examples.
  DATA: l_title(40),
        nr LIKE par_from.
*
  LOOP AT x WHERE line(3) = '*>T'.
    IF NOT par_from IS INITIAL AND NOT par_to IS INITIAL.
      ADD 1 TO nr.
      CHECK nr >= par_from AND nr <= par_to.
    ENDIF.
    l_title = x-line+3(*).
    x_tabix = sy-tabix.
    PERFORM get_example.
    runtime_mult = par_cnt.
    PERFORM get_runtime.
    IF syn_error IS INITIAL.
      IF gen_error IS INITIAL.
        WRITE: /(40) l_title, '|', runtime_l, '|', runtime_r, '|'.
      ELSE.
        WRITE: /(40) l_title, icon_warning AS ICON, TEXT-003.
      ENDIF.
    ELSE.
      WRITE: /(40) l_title, icon_alert AS ICON, TEXT-002.
      CLEAR syn_error.
    ENDIF.
  ENDLOOP.
ENDFORM.

*----------------------------------------------------------------------*
*       FORM INIT_TREE                                                 *
*----------------------------------------------------------------------*
FORM init_tree.

  DATA: rtext TYPE string.
  DATA: otext TYPE string.
  DATA: utext TYPE string.
  DATA: etext TYPE string.

  rtext = TEXT-001.
  CALL METHOD tree->add_node
    EXPORTING
      node_key = 'ROOT'
      isfolder = 'X'
      text     = rtext
    EXCEPTIONS
      OTHERS   = 1.
  IF sy-subrc <> 0. MESSAGE a500. ENDIF.

  rtext = 'ROOT'.

  LOOP AT x WHERE line(2) = '*>'.
    CASE x-line(3).

      WHEN '*>O'.

        otext = x-line+4.
        CALL METHOD tree->add_node
          EXPORTING
            node_key          = otext
            isfolder          = 'X'
            text              = otext
            relative_node_key = rtext
            relationship      = cl_simple_tree_model=>relat_last_child
          EXCEPTIONS
            OTHERS            = 1.
        IF sy-subrc <> 0. MESSAGE a500. ENDIF.

        CLEAR utext.

      WHEN '*>U'.

        utext = x-line+4.
        CALL METHOD tree->add_node
          EXPORTING
            node_key          = utext
            isfolder          = 'X'
            text              = utext
            relative_node_key = otext
            relationship      = cl_simple_tree_model=>relat_last_child
          EXCEPTIONS
            OTHERS            = 1.
        IF sy-subrc <> 0. MESSAGE a500. ENDIF.

      WHEN '*>V'.

        CLEAR utext.

      WHEN '*>T'.

        IF utext IS INITIAL.

          etext = x-line+4.
          CALL METHOD tree->add_node
            EXPORTING
              node_key          = etext
              isfolder          = ' '
              text              = etext
              relative_node_key = otext
              relationship      = cl_simple_tree_model=>relat_last_child
            EXCEPTIONS
              OTHERS            = 1.
          IF sy-subrc <> 0. MESSAGE a500. ENDIF.

        ELSE.

          etext = x-line+4.
          CALL METHOD tree->add_node
            EXPORTING
              node_key          = etext
              isfolder          = ' '
              text              = etext
              relative_node_key = utext
              relationship      = cl_simple_tree_model=>relat_last_child
            EXCEPTIONS
              OTHERS            = 1.
          IF sy-subrc <> 0. MESSAGE a500. ENDIF.

        ENDIF.

    ENDCASE.
  ENDLOOP.

  CALL METHOD tree->expand_node
    EXPORTING
      node_key = rtext
    EXCEPTIONS
      OTHERS   = 1.
  IF sy-subrc <> 0. MESSAGE a500. ENDIF.

ENDFORM.                               "INIT_TREE

*---------------------------------------------------------------------*
*       CLASS LCL_EH
*---------------------------------------------------------------------*
*       ........                                                      *
*---------------------------------------------------------------------*

CLASS lcl_eh DEFINITION.

  PUBLIC SECTION.
    CLASS-METHODS:
      handle_node_double_click
        FOR EVENT node_double_click
        OF cl_simple_tree_model
        IMPORTING node_key.
    CLASS-METHODS:
      handle_close
        FOR EVENT close
        OF cl_gui_dialogbox_container.

ENDCLASS.

*---------------------------------------------------------------------*
*       CLASS lcl_eh IMPLEMENTATION
*---------------------------------------------------------------------*
*       ........                                                      *
*---------------------------------------------------------------------*
CLASS lcl_eh IMPLEMENTATION.

  METHOD handle_node_double_click.
    DATA: iline    TYPE t_sline,
          code     TYPE STANDARD TABLE OF t_sline,
          codeline TYPE t_sline.

    CONCATENATE '*>T' node_key INTO iline SEPARATED BY space.

    READ TABLE x WITH KEY line = iline TRANSPORTING NO FIELDS.
    IF sy-subrc = 0.
      x_tabix = sy-tabix.
      PERFORM get_example.

      CLEAR code[].
      LOOP AT sl INTO codeline.
        APPEND codeline TO code.
      ENDLOOP.

      CALL METHOD code_left_editor->set_text_as_r3table
        EXPORTING
          table  = code
        EXCEPTIONS
          OTHERS = 1.
      IF sy-subrc <> 0. MESSAGE a500. ENDIF.

      CLEAR code[].
      LOOP AT sr INTO codeline.
        APPEND codeline TO code.
      ENDLOOP.

      CALL METHOD code_right_editor->set_text_as_r3table
        EXPORTING
          table  = code
        EXCEPTIONS
          OTHERS = 1.
      IF sy-subrc <> 0. MESSAGE a500. ENDIF.

      CLEAR runtime_x.

      SET PF-STATUS 'MAIN'.

    ENDIF.

  ENDMETHOD.

  METHOD handle_close.

    CALL METHOD global_data_viewer->free.
    CALL METHOD global_data_container->free.

    CLEAR global_data_container.
    CLEAR global_data_viewer.

  ENDMETHOD.

ENDCLASS.

*&---------------------------------------------------------------------*
*&      Module  STATUS_0100  OUTPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE status_0100 OUTPUT.
  DATA: event  TYPE cntl_simple_event,
        events TYPE cntl_simple_events.

  DATA: reuse TYPE c.
  DATA: reuse_left TYPE c.
  DATA: reuse_right TYPE c.
  DATA: line(255) TYPE c.

  SET PF-STATUS 'MAIN'.
  IF xtended_title IS INITIAL.
    SET TITLEBAR '001'.
  ELSE.
    SET TITLEBAR '002' WITH xtended_title.
  ENDIF.

* container and textedits

  IF main_container IS INITIAL.
    CREATE OBJECT main_container
      EXPORTING
        container_name = 'MAIN_CONTAINER'
      EXCEPTIONS
        OTHERS         = 1.
    IF sy-subrc <> 0. MESSAGE a500. ENDIF.

    CREATE OBJECT v_container
      EXPORTING
        parent        = main_container
        orientation   =
                        cl_gui_easy_splitter_container=>orientation_vertical
        sash_position = 80
      EXCEPTIONS
        OTHERS        = 1.
    IF sy-subrc <> 0. MESSAGE a500. ENDIF.

    CREATE OBJECT h_container
      EXPORTING
        parent      = v_container->top_left_container
        orientation =
                      cl_gui_easy_splitter_container=>orientation_horizontal
      EXCEPTIONS
        OTHERS      = 1.
    IF sy-subrc <> 0. MESSAGE a500. ENDIF.

    CREATE OBJECT h1_container
      EXPORTING
        parent        = h_container->top_left_container
        orientation   =
                        cl_gui_easy_splitter_container=>orientation_vertical
        sash_position = 0
      EXCEPTIONS
        OTHERS        = 1.
    IF sy-subrc <> 0. MESSAGE a500. ENDIF.

    CREATE OBJECT code_left_editor
      EXPORTING
        parent            = h1_container->bottom_right_container
        wordwrap_mode     = cl_gui_textedit=>wordwrap_at_fixed_position
        wordwrap_position = 72
      EXCEPTIONS
        OTHERS            = 1.
    IF sy-subrc <> 0. MESSAGE a500. ENDIF.

*    CALL METHOD CODE_LEFT_EDITOR->SET_READONLY_MODE
*    EXPORTING
*      READONLY_MODE = 1.

    CREATE OBJECT h2_container
      EXPORTING
        parent        = h_container->bottom_right_container
        orientation   =
                        cl_gui_easy_splitter_container=>orientation_vertical
        sash_position = 0
      EXCEPTIONS
        OTHERS        = 1.
    IF sy-subrc <> 0. MESSAGE a500. ENDIF.

    CREATE OBJECT code_right_editor
      EXPORTING
        parent            = h2_container->bottom_right_container
        wordwrap_mode     = cl_gui_textedit=>wordwrap_at_fixed_position
        wordwrap_position = 72
      EXCEPTIONS
        OTHERS            = 1.
    IF sy-subrc <> 0. MESSAGE a500. ENDIF.

*    CALL METHOD CODE_RIGHT_EDITOR->SET_READONLY_MODE
*    EXPORTING
*      READONLY_MODE = 1.

  ENDIF.

* left heading
  IF NOT ( title_left IS INITIAL AND runtime_x IS INITIAL ).
    IF dd_left IS INITIAL.
      CREATE OBJECT dd_left.
      CLEAR reuse_left.
    ELSE.
      reuse_left = 'X'.
    ENDIF.

    CALL METHOD h1_container->set_sash_position
      EXPORTING
        sash_position = 20.

    CALL METHOD dd_left->initialize_document.

    IF NOT title_left IS INITIAL.
      line = title_left.
      CALL METHOD dd_left->add_text
        EXPORTING
          text      = line
          sap_style = 'heading'.
      CALL METHOD dd_left->new_line.
    ENDIF.

    IF NOT runtime_x IS INITIAL.
      DATA: rtl(11) TYPE c.
      WRITE runtime_l TO rtl.
      CONCATENATE TEXT-004 rtl TEXT-005 INTO line SEPARATED BY space.
      CALL METHOD dd_left->add_text
        EXPORTING
          text = line.
      CALL METHOD dd_left->new_line.
    ENDIF.

    CALL METHOD dd_left->merge_document.
    CALL METHOD dd_left->display_document
      EXPORTING
        parent             = h1_container->top_left_container
        reuse_control      = reuse_left
      EXCEPTIONS
        html_display_error = 1.
    IF sy-subrc <> 0. MESSAGE a500. ENDIF.
  ENDIF.

* right heading
  IF NOT ( title_right IS INITIAL AND runtime_x IS INITIAL ).
    IF dd_right IS INITIAL.
      CREATE OBJECT dd_right.
      CLEAR reuse_right.
    ELSE.
      reuse_right = 'X'.
    ENDIF.

    CALL METHOD h2_container->set_sash_position
      EXPORTING
        sash_position = 20.

    CALL METHOD dd_right->initialize_document.

    IF NOT title_right IS INITIAL.
      line = title_right.
      CALL METHOD dd_right->add_text
        EXPORTING
          text      = line
          sap_style = 'heading'.
      CALL METHOD dd_right->new_line.
    ENDIF.

    IF NOT runtime_x IS INITIAL.
      DATA: rtr(11) TYPE c.
      WRITE runtime_r TO rtr.
      CONCATENATE TEXT-004 rtr TEXT-005 INTO line SEPARATED BY space.
      CALL METHOD dd_right->add_text
        EXPORTING
          text = line.
      CALL METHOD dd_right->new_line.
    ENDIF.

    CALL METHOD dd_right->merge_document.
    CALL METHOD dd_right->display_document
      EXPORTING
        parent             = h2_container->top_left_container
        reuse_control      = reuse_right
      EXCEPTIONS
        html_display_error = 1.
    IF sy-subrc <> 0. MESSAGE a500. ENDIF.
  ENDIF.

* comment as dynamic text

  IF NOT c[] IS INITIAL.
    IF dd IS INITIAL.
      CREATE OBJECT dd.
      CLEAR reuse.
    ELSE.
      reuse = 'X'.
    ENDIF.

    CALL METHOD dd->initialize_document.

    CALL METHOD dd->add_text
      EXPORTING
        text      = TEXT-006
        sap_style = 'heading'.

    CALL METHOD dd->new_line.

    LOOP AT c INTO line.
      SHIFT line LEFT.
      CALL METHOD dd->add_text
        EXPORTING
          text = line.
      CALL METHOD dd->new_line.
    ENDLOOP.

    CALL METHOD dd->merge_document.
    CALL METHOD dd->display_document
      EXPORTING
        parent             = v_container->bottom_right_container
        reuse_control      = reuse
      EXCEPTIONS
        html_display_error = 1.
    IF sy-subrc <> 0. MESSAGE a500. ENDIF.
  ENDIF.

ENDMODULE.                             " STATUS_0100  OUTPUT

*&---------------------------------------------------------------------*
*&      Module  USER_COMMAND_0100  INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE user_command_0100 INPUT.

  DATA: return_code TYPE i.

  CALL METHOD cl_gui_cfw=>dispatch
    IMPORTING
      return_code = return_code.
  IF return_code <> cl_gui_cfw=>rc_noevent.
    CLEAR fcode.
    EXIT.
  ENDIF.

  CASE fcode.
    WHEN 'EXIT'.
      CALL METHOD code_left_editor->free.
      CALL METHOD code_right_editor->free.
      CALL METHOD h2_container->free.
      CALL METHOD h1_container->free.
      CALL METHOD h_container->free.
      CALL METHOD v_container->free.
      CALL METHOD main_container->free.
*    CALL METHOD DOCKING_CONTAINER->FREE.
      IF NOT global_data_container IS INITIAL.
        CALL METHOD global_data_viewer->free.
        CALL METHOD global_data_container->free.
      ENDIF.
      LEAVE PROGRAM.
    WHEN 'TIME'.
      PERFORM get_runtime.
    WHEN 'EDIL'.  PERFORM edit_left.
    WHEN 'EDIR'.  PERFORM edit_right.
    WHEN 'GLOB'.
      PERFORM show_global.
  ENDCASE.

ENDMODULE.                             " USER_COMMAND_0100  INPUT

*---------------------------------------------------------------------*
*       FORM AUTHORITY_CHECK                                          *
*----------------------------------------------------------------------*
* Update authority: system, client, editor
*----------------------------------------------------------------------*
FORM authority_check.
  DATA: systemlock         LIKE  tadir-edtflag,
        sys_cliinddep_lock LIKE  t000-ccnocliind,
        changeability      TYPE  dlv_change,
        uname              LIKE  sy-uname.

  uname = sy-uname.
  IF uname = 'SAP*'.
    MESSAGE s400(s7).
    EXIT.
  ENDIF.

  CALL FUNCTION 'TR_SYS_PARAMS'
    IMPORTING
      systemedit         = systemlock
      sys_cliinddep_edit = sys_cliinddep_lock
    EXCEPTIONS
      no_systemname      = 1
      no_systemtype      = 2
      OTHERS             = 3.
  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE 'S' NUMBER sy-msgno
    WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
    EXIT.
  ENDIF.
  IF   systemlock <> 'N' AND
  ( sys_cliinddep_lock = ' ' OR sys_cliinddep_lock = '1' ).
*   system is not locked, component locked ?
    CALL FUNCTION 'TR_GET_DLVUNIT_CHANGEABILITY'
      EXPORTING
        iv_dlvunit       = 'LOCAL'
      IMPORTING
        ev_changeability = changeability
      EXCEPTIONS
        invalid_dlvunit  = 1
        OTHERS           = 2.
    IF sy-subrc <> 0.
      MESSAGE ID sy-msgid TYPE 'S' NUMBER sy-msgno
      WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
      EXIT.
    ENDIF.
    IF changeability = 'N'.
      MESSAGE s400(s7).
      EXIT.
    ENDIF.
  ELSE.
* system locked
    MESSAGE s840(tr).
    EXIT.
  ENDIF.
  AUTHORITY-CHECK OBJECT 'S_DEVELOP'
  ID     'OBJTYPE'   FIELD 'PROG'
  ID     'DEVCLASS'         DUMMY
  ID     'P_GROUP'          DUMMY
  ID     'OBJNAME'          DUMMY
  ID     'ACTVT'     FIELD '02'.
  IF sy-subrc <> 0.
    MESSAGE s400(s7).
    EXIT.
  ENDIF.
ENDFORM.

*&---------------------------------------------------------------------*
*&      Form  show_global
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM show_global.

  DATA: code     TYPE STANDARD TABLE OF t_sline,
        codeline TYPE t_sline.

  IF global_data_container IS INITIAL.

    code = VALUE #(
    ( '测速工具是我从标准程序改来,目的方便你我他钻研性能上的浪漫')
    ( '作为一个真正的程序员,首先应该尊重编程,热爱你所写下的程序,他是你的伙伴,而不是工具。')
    ( '程序员可以让步,却不可以退缩,可以羞涩,却不可以软弱,总之,程序员必须是勇敢的。 ')
    ( '编程是一种单调的生活,因此程序员比普通人需要更多的关怀,更多的友情。')
    ( '有好项目机会联系我 <-tel:17673917543')
    ( '---------------------------------------')
    ( 'CREAT: 2020-10 BY ZHANGHK  V1.0')
    ( 'CHANGED: ')
    ( 'CHANGED: ')
     ).
    CREATE OBJECT global_data_container
      EXPORTING
        width   = 600
        height  = 200
        caption = 'global data'
      EXCEPTIONS
        OTHERS  = 1.
    IF sy-subrc <> 0. MESSAGE a500. ENDIF.

    CREATE OBJECT global_data_viewer
      EXPORTING
        parent            = global_data_container
        wordwrap_mode     = cl_gui_textedit=>wordwrap_at_fixed_position
        wordwrap_position = 72
      EXCEPTIONS
        OTHERS            = 1.
    IF sy-subrc <> 0. MESSAGE a500. ENDIF.

    CALL METHOD global_data_viewer->set_text_as_r3table
      EXPORTING
        table  = code
      EXCEPTIONS
        OTHERS = 1.
    IF sy-subrc <> 0. MESSAGE a500. ENDIF.

    CALL METHOD global_data_viewer->set_readonly_mode
      EXPORTING
        readonly_mode = 1.

    SET HANDLER lcl_eh=>handle_close FOR global_data_container.

  ENDIF.
ENDFORM.                    " show_global

*---------------------------------------------------------------------*
*       FORM EDIT_LEFT                                                *
*----------------------------------------------------------------------*
* Editor call for left hand coding                                     *
*----------------------------------------------------------------------*
FORM edit_left.
  e[] = sl[].
  EDITOR-CALL FOR e DISPLAY-MODE.
ENDFORM.


*---------------------------------------------------------------------*
*       FORM EDIT_RIGHT                                               *
*----------------------------------------------------------------------*
* Editor call for right hand coding                                    *
*----------------------------------------------------------------------*
FORM edit_right.
  e[] = sr[].
  EDITOR-CALL FOR e DISPLAY-MODE.
ENDFORM.

创建完程序后还需要创建屏幕,gui状态

屏幕如下

GUI状态如下

还有一些其他细节

作者:SAP-张鸿坤

文章最后引用作者的话
程序员可以让步,却不可以退缩,可以羞涩,却不可以软弱,总之,程序员必须是勇敢的。 共享浪漫

猜你喜欢

转载自blog.csdn.net/Qunending/article/details/110629612