• ABAP工具箱 V1.0(附实现思路)


    I. 申明(必读)

    • 实现代码开源,任何人都可以修改使用;仅仅作为研究使用,不可作为商业用途。
    • 实现的功能代码未进行严谨的流程测试;可能会造成不可预估的风险,请谨慎测试使用。
    • 因工具实现标准代码编辑功能,可能造成代码编辑功能崩溃;滥用本工具造成的后果本人不负任何责任。
    • 本工具开发基于S4/Hana 版本(涉及新语法),ECC不支持新语法版本,需要自行转换新语法至旧语法。
    • 本文仅介绍一种实现思路,不对功能质量保证(欢迎反馈问题和新功能

    II. 风险控制

    • ABAP工具箱入口增加了SY-TCODE校验,只能SE38 SE37 SE24 SE80才会调用工具箱
    • SU01:ZEN_ABAP_EDITOR = ‘X’ 将开启ABAP EDITOR功能;开发中如果SE38 SE37 SE24功能崩溃无法修改代码,可解除此标记;再次运行SE38 SE37 SE24将恢复标准的编辑工具修改异常代码
      1
    • 显示模式下有代码修改的功能将被禁用
      2
      3

    III. 功能介绍

    • 能呼出ABAP 工具箱的位置
      • SE38
        1-1
      • SE37
        1-2
      • SE24
        1-3
      • SE80 & SE38->显示对象列表 & SE37->显示对象列表 & SE24->显示对象列表
        1-4
    • 功能(实验性)
      • 代码美化器(Pretty Print)
        • 标准自带不能调整的
          2-1
        • 增强功能可调整
          2-2
      • 跳转至指定行(显示模式下也可用)
        • 标准功能
          2-3
          2-4

        • 增强功能
          2-5
          2-6

      • 调用函数自动定义变量
        • 标准功能(先开启自动定义功能,部分老版本不支持)
          2-7
          2-8
          + 增强功能
          2-9

    IV. 实现步骤

    1. 新建功能包

    • 新建package:ZEDITOR
      4

    2. 新建函数组

    • 新建函数组:ZBC_ENHANCE_TOOLS
      5

    3. 新建ABAP Editor Tools功能函数(不要在创建中激活,创建完成后整体激活

    • SM30->TPARA 新建用户参数码:ZEN_ABAP_EDITOR
      6
      7

    • 新建ABAP Editor Tools节点配置数据表

      • NODE1:节点1的名称(文件夹)
      • NODE2:节点2的名称(功能名)
      • ACTION:功能对应的动作码(用于同一类功能的函数调用)
      • TEXT:功能的描述
      • T_IMAGE:Tree的Item节点图标
      • N_IMAGE:Tree的Node节点折叠时的图标
      • EXP_IMAGE:Tree的Node节点展开时的图标
        8
    • 新建ABAP Editor Tools功能主函数模块:Z_BC_ENHANCE_EDITOR
      9

    • IMPORTING参数
      10

    • changing参数
      11

    • tables参数
      12

    • Z_BC_ENHANCE_EDITOR 函数主功能代码

      FUNCTION z_bc_enhance_editor.
      *"----------------------------------------------------------------------
      *"*"本地接口:
      *" IMPORTING
      *" REFERENCE(I_DOCKING) TYPE REF TO CL_GUI_DOCKING_CONTAINER
      *" TABLES
      *" T_BC_TREE STRUCTURE ZBC_TREE_T
      *" CHANGING
      *" REFERENCE(I_ABAP_PGEDITOR) TYPE REF TO CL_WB_PGEDITOR OPTIONAL
      *" REFERENCE(I_FB_INSTANCE) TYPE REF TO CL_FUNCTION_BUILDER
      *" OPTIONAL
      *" REFERENCE(I_ED_INSTANCE) TYPE REF TO CL_WB_CLEDITOR OPTIONAL
      *"----------------------------------------------------------------------
      
      *-------------------------------------Object define-------------------------------------------*
        DATA: lt_list            TYPE slis_t_listheader,
              lt_events          TYPE cntl_simple_events,
              lt_fieldcat        TYPE lvc_t_fcat,
              lt_data            TYPE TABLE OF zbc_tree_t,
              lt_toolbar_excl    TYPE ui_functions,
              l_hierarchy_header TYPE treev_hhdr.
      
        DATA:
          lo_events  TYPE REF TO lcl_tree_events,
          lo_toolbar TYPE REF TO cl_gui_toolbar.
      
        DATA: g_fav_key TYPE lvc_nkey,
              l_top_key TYPE lvc_nkey.
      
      *-------------------------------------Assign Object-------------------------------------------*
        ASSIGN i_docking TO <fs_docking>.
      
        IF i_abap_pgeditor IS REQUESTED.
          ASSIGN i_abap_pgeditor TO <fs_abap_pgeditor>.
        ELSEIF i_fb_instance IS REQUESTED.
          ASSIGN i_fb_instance TO <fs_fb_instance>.
        ELSEIF i_ed_instance IS REQUESTED.
          ASSIGN i_ed_instance TO <fs_ed_instance>.
        ENDIF.
      
      *-------------------------------------basic data-------------------------------------------*
      
        lt_list = VALUE #( ( typ = 'S' key = '@ABAP工具箱 V1.0' info = 'By @Roger' ) ).
      
        l_hierarchy_header = VALUE #( heading = '目录/功能' width = 30 width_pix = '' ).
      
        lt_fieldcat = VALUE #( ( col_pos = '1' fieldname = 'NODE1' coltext = '目录/功能' key = 'X' no_out = 'X' )
        ( col_pos = '2' fieldname = 'NODE2' coltext = '目录/功能' key = 'X' no_out = 'X' )
        ( col_pos = '3' fieldname = 'ACTION' coltext = '功能码' outputlen = '8' )
        ( col_pos = '4' fieldname = 'TEXT' coltext = '描述' outputlen = '30' ) ).
      
      
        SELECT * FROM zbc_tree_t INTO TABLE lt_data ORDER BY node1 node2.
      
        lt_toolbar_excl = VALUE #( "( cl_gui_alv_tree_simple=>mc_fc_expand )
        "( cl_gui_alv_tree_simple=>mc_fc_collapse )
        "( cl_gui_alv_tree_simple=>mc_fc_find )
        "( cl_gui_alv_tree_simple=>mc_fc_find_more )
        ( cl_gui_alv_tree_simple=>mc_fc_calculate )
        ( cl_gui_alv_tree_simple=>mc_fc_print_back )
        ( cl_gui_alv_tree_simple=>mc_fc_load_variant )
        ( cl_gui_alv_tree_simple=>mc_fc_current_variant )
        ( cl_gui_alv_tree_simple=>mc_fc_maintain_variant )
        ( cl_gui_alv_tree_simple=>mc_fc_save_variant )
        ( cl_gui_alv_tree_simple=>mc_fc_change_hierarchy ) ).
      
      *-------------------------------------Onprocess------------------------------------------*
        "create Object
        CREATE OBJECT lo_grid
          EXPORTING
            parent              = <fs_docking>
            node_selection_mode = cl_gui_column_tree=>node_sel_mode_single
            item_selection      = 'X'
            no_html_header      = ''
            no_toolbar          = ''.
      
        "set User toolbar
        CALL METHOD lo_grid->get_toolbar_object
          IMPORTING
            er_toolbar = lo_toolbar.
        CALL METHOD lo_toolbar->add_button( fcode = 'TOOLS' butn_type = '' icon = '@45@' text = '关于工具箱' quickinfo = '关于工具箱' ).
        CALL METHOD lo_toolbar->add_button( fcode = 'PORTAL' butn_type = '' icon = '@8S@' text = '作者主页' quickinfo = '作者主页' ).
      
        "registe event
        lt_events = VALUE #( ( eventid = cl_gui_column_tree=>eventid_expand_no_children )
        ( eventid = cl_gui_column_tree=>eventid_checkbox_change )
        ( eventid = cl_gui_column_tree=>eventid_header_context_men_req )
        ( eventid = cl_gui_column_tree=>eventid_node_context_menu_req )
        ( eventid = cl_gui_column_tree=>eventid_item_context_menu_req )
        ( eventid = cl_gui_column_tree=>eventid_item_keypress )
        ( eventid = cl_gui_column_tree=>eventid_node_double_click )
        ( eventid = cl_gui_column_tree=>eventid_item_double_click ) ).
      
        CALL METHOD lo_grid->set_registered_events
          EXPORTING
            events                    = lt_events
          EXCEPTIONS
            cntl_error                = 1
            cntl_system_error         = 2
            illegal_event_combination = 3.
      
        CREATE OBJECT lo_events.
        SET HANDLER lo_events->handle_node_ctmenu_request FOR lo_grid.
        SET HANDLER lo_events->handle_node_ctmenu_selected FOR lo_grid.
        SET HANDLER lo_events->handle_item_ctmenu_request FOR lo_grid.
        SET HANDLER lo_events->handle_item_ctmenu_selected FOR lo_grid.
        SET HANDLER lo_events->handle_node_double_click FOR lo_grid.
        SET HANDLER lo_events->handle_item_double_click FOR lo_grid.
        SET HANDLER lo_events->handle_after_user_command FOR lo_grid.
      
        "call alv tree
        CALL METHOD lo_grid->set_table_for_first_display
          EXPORTING
            is_hierarchy_header  = l_hierarchy_header
            it_list_commentary   = lt_list
            it_toolbar_excluding = lt_toolbar_excl
          CHANGING
            it_fieldcatalog      = lt_fieldcat[]
            it_outtab            = t_bc_tree[].
      
        "fav
        PERFORM add_folder USING space '收藏夹' space CHANGING g_fav_key.
      
        "func folder
        PERFORM add_folder USING space '功能' space CHANGING l_top_key.
      
        "Node
        PERFORM add_nodes TABLES lt_data USING l_top_key.
      
        CALL METHOD lo_grid->expand_node( EXPORTING i_node_key = l_top_key i_expand_subtree = abap_true ).
      
        "Update GUI
        CALL METHOD lo_grid->frontend_update.
      ENDFUNCTION.
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26
      • 27
      • 28
      • 29
      • 30
      • 31
      • 32
      • 33
      • 34
      • 35
      • 36
      • 37
      • 38
      • 39
      • 40
      • 41
      • 42
      • 43
      • 44
      • 45
      • 46
      • 47
      • 48
      • 49
      • 50
      • 51
      • 52
      • 53
      • 54
      • 55
      • 56
      • 57
      • 58
      • 59
      • 60
      • 61
      • 62
      • 63
      • 64
      • 65
      • 66
      • 67
      • 68
      • 69
      • 70
      • 71
      • 72
      • 73
      • 74
      • 75
      • 76
      • 77
      • 78
      • 79
      • 80
      • 81
      • 82
      • 83
      • 84
      • 85
      • 86
      • 87
      • 88
      • 89
      • 90
      • 91
      • 92
      • 93
      • 94
      • 95
      • 96
      • 97
      • 98
      • 99
      • 100
      • 101
      • 102
      • 103
      • 104
      • 105
      • 106
      • 107
      • 108
      • 109
      • 110
      • 111
      • 112
      • 113
      • 114
      • 115
      • 116
      • 117
      • 118
      • 119
      • 120
      • 121
      • 122
      • 123
      • 124
      • 125
      • 126
      • 127
      • 128
      • 129
      • 130
      • 131
      • 132
      • 133
      • 134
    • 新建调用函数(A004功能)对应的函数模块:Z_SDN_PATTERN_FUNC_START

    • 函数模块来源(博主进行过部分代码的修正Call a function module in the ABAP Editor: Stop Crying – Start Laughing.
      13

    • tables参数
      14

    • Z_SDN_PATTERN_FUNC_START 函数主功能代码

      FUNCTION Z_SDN_PATTERN_FUNC_START.
      *"----------------------------------------------------------------------
      *"*"本地接口:
      *"  TABLES
      *"      BUFFER TYPE  RSWSOURCET
      *"----------------------------------------------------------------------
        DATA W_FUNCNAME    TYPE RS38L_FNAM.
        DATA IT_LINES      TYPE TY_LINE_TAB.
        DATA WA_LINES      LIKE LINE OF IT_LINES.
        DATA PATTERN_FUNC TYPE RS38L_FNAM .
        DATA REP               TYPE SWBSE_MAX_LINE_TAB.
      *--------------------------------------------------------------------*
        REFRESH: IT_IMPORT, IT_CHANGE, IT_EXPORT,
                 IT_TABLES, IT_EXCEPT, IT_PARAM_DOCU, IT_PARAMETRO_CANT,
      IT_CODIGO, IT_VARIABLES.
        CLEAR:  IT_PTFDIR,
                IT_PTFTIT,
                IT_PFUNCT     ,
                IT_PENLFDIR   ,
                IT_PTRDIR     ,
                IT_PFUPARAREF ,
                IT_UINCL      .
        CLEAR: W_OFFSET, W_MAX_OFFSET.
        PERFORM GET_FUNCTION_NAME CHANGING W_FUNCNAME.
        IF RETURNCODE = 'A'.
          MESSAGE '用户取消!' TYPE 'S'.
          CLEAR: RETURNCODE.
          RETURN.
        ENDIF.
      
        SELECT SINGLE FUNCNAME FROM TFTIT
          INTO @DATA(L_FUNCNAME)
          WHERE FUNCNAME = @W_FUNCNAME.
      
        IF L_FUNCNAME IS INITIAL.
          MESSAGE '函数不存在!' TYPE 'S' DISPLAY LIKE 'E'.
          CLEAR: RETURNCODE.
          RETURN.
        ENDIF.
      
        PERFORM FU_IMPORT_INTERFACE_EXT(SAPMS38L)
                                   TABLES IT_IMPORT
                                          IT_CHANGE
                                          IT_EXPORT
                                          IT_TABLES
                                          IT_EXCEPT
                                          IT_PARAM_DOCU
                                    USING W_FUNCNAME.
        REFRESH: IT_PTFDIR,   IT_PTFTIT, IT_PFUNCT,
                 IT_PENLFDIR, IT_PTRDIR, IT_PFUPARAREF,
                 IT_UINCL.
        PERFORM FUNC_GET_OBJECT USING W_FUNCNAME
                             CHANGING IT_PTFDIR
                                      IT_PTFTIT
                                      IT_PFUNCT
                                      IT_PENLFDIR
                                      IT_PTRDIR
                                      IT_PFUPARAREF
                                      IT_UINCL.
        REFRESH IT_PARAMETRO_CANT.
        CLEAR: W_OFFSET, W_MAX_OFFSET.
        PERFORM GET_MAX_LONGITUD_FM_PARAM    USING C_TIP_TABLES
                                          CHANGING W_OFFSET.
        W_MAX_OFFSET = W_OFFSET.
        CLEAR W_OFFSET.
        PERFORM GET_MAX_LONGITUD_FM_PARAM    USING C_TIP_EXPORT
                                          CHANGING W_OFFSET.
        IF W_OFFSET GT W_MAX_OFFSET.
          W_MAX_OFFSET = W_OFFSET.
        ENDIF.
        CLEAR W_OFFSET.
        PERFORM GET_MAX_LONGITUD_FM_PARAM    USING C_TIP_IMPORT
                                          CHANGING W_OFFSET.
        IF W_OFFSET GT W_MAX_OFFSET.
          W_MAX_OFFSET = W_OFFSET.
        ENDIF.
        PERFORM GENERAR_VARIABLES USING 'I'.
        PERFORM GENERAR_VARIABLES USING 'E'.
        PERFORM GENERAR_VARIABLES USING 'T'.
        PERFORM EVITAR_PARAMETROS_REPETIDOS.
        PERFORM CODIGO_DECLARACION_VARIABLE CHANGING BUFFER[].
        PERFORM GENERAR_LLAMADO_FM    USING W_FUNCNAME
                                   CHANGING REP.
        FIELD-SYMBOLS <FS_REP> LIKE LINE OF REP.
        DATA WA_BUFFER TYPE STRING.
        LOOP AT REP ASSIGNING <FS_REP>.
          WA_BUFFER = <FS_REP>.
          APPEND WA_BUFFER TO BUFFER.
        ENDLOOP.
      
        CLEAR: RETURNCODE.
      ENDFUNCTION.
      *&-------------------------------------------------------------------
      *&      Form  get_max_longitud_fm_param
      *&-------------------------------------------------------------------
      *       Obtiene la máxima longitud de los nombres de los parámetros.
      *--------------------------------------------------------------------
      *  -->  w_tipo_param        Tipo de parámetro
      *  <--  w_length_o          Longitud máxima
      *--------------------------------------------------------------------
      FORM GET_MAX_LONGITUD_FM_PARAM    USING VALUE(W_TIPO_PARAM) TYPE C
                                    CHANGING VALUE(W_LENGTH_O)   TYPE I.
        DATA W_LENGTH    TYPE I.
        DATA W_CAMPO     TYPE CHAR30.
        DATA W_ITAB_NAME TYPE CHAR30.
        DATA WA_PARAMETRO_CANT LIKE LINE OF IT_PARAMETRO_CANT.
        FIELD-SYMBOLS <FS_FM_PARAMETERS>  TYPE ANY TABLE.
        FIELD-SYMBOLS <FS>                TYPE ANY.
        CLEAR: W_ITAB_NAME, W_LENGTH_O.
        PERFORM GET_NOMBRE_PARAMETRO USING W_TIPO_PARAM
                                  CHANGING W_ITAB_NAME.
        ASSIGN (W_ITAB_NAME) TO <FS_FM_PARAMETERS>.
        LOOP AT <FS_FM_PARAMETERS> ASSIGNING <FS>.
          W_CAMPO = '<fs>-parameter'.
          ASSIGN (W_CAMPO) TO <FS>.
          W_LENGTH = STRLEN( <FS> ).
          CLEAR WA_PARAMETRO_CANT.
          WA_PARAMETRO_CANT-PARAMETER = <FS>.
          WA_PARAMETRO_CANT-CANT      = 1.
          COLLECT WA_PARAMETRO_CANT INTO IT_PARAMETRO_CANT.
          CHECK W_LENGTH > W_LENGTH_O.
          W_LENGTH_O = W_LENGTH.
        ENDLOOP.
        UNASSIGN: <FS_FM_PARAMETERS>, <FS>.
      ENDFORM.                    " get_max_longitud_fm_param
      *&---------------------------------------------------------------------
      *&      Form  get_nombre_parametro
      *&---------------------------------------------------------------------
      *       Obtiene en nombre del parámetro
      *----------------------------------------------------------------------
      *  -->  w_tipo_param        (I)mport, (E)xport (T)ables
      *  <--  w_itab_name         Nombre de tabla interna
      *----------------------------------------------------------------------
      FORM GET_NOMBRE_PARAMETRO USING VALUE(W_TIPO_PARAM) TYPE C
                            CHANGING VALUE(W_ITAB_NAME)  TYPE CHAR30.
        CASE W_TIPO_PARAM.
          WHEN C_TIP_IMPORT. "Import
            W_ITAB_NAME = 'it_import'.
          WHEN C_TIP_EXPORT. "Export
            W_ITAB_NAME = 'it_export'.
          WHEN C_TIP_TABLES. "Tables
            W_ITAB_NAME = 'it_tables'.
        ENDCASE.
      ENDFORM.                    " get_nombre_parametro
      *&---------------------------------------------------------------------
      *&      Form  get_patron_para_declaracion
      *&---------------------------------------------------------------------
      *       text
      *----------------------------------------------------------------------
      *  -->  wa_fs_fm
      *  -->  w_tipo_param        text
      *  <--  w_var               text
      *  <--  w_tipo_dato
      *  <--  w_tipo_s
      *----------------------------------------------------------------------
      FORM GET_PATRON_PARA_DECLARACION USING VALUE(WA_FS_FM)     TYPE ANY
                                            VALUE(W_TIPO_PARAM) TYPE C
                                   CHANGING VALUE(W_VAR)        TYPE STRING
                                            VALUE(W_TIPO_DATO)  TYPE STRING
                                            VALUE(W_TIPO_S)     TYPE CHAR10.
        DATA W_CAMPO TYPE CHAR30.
        FIELD-SYMBOLS <FS> TYPE ANY.
        IF W_TIPO_PARAM EQ 'T'.
          W_CAMPO = 'wa_fs_fm-dbstruct'.
        ELSE.
          W_CAMPO = 'wa_fs_fm-dbfield'.
        ENDIF.
        ASSIGN (W_CAMPO) TO <FS>.
        CLEAR: W_VAR, W_TIPO_DATO. ", w_campo.
        CASE W_TIPO_PARAM.
          WHEN C_TIP_IMPORT. "Import
            W_VAR       = 'v_[NOMBRE]'.
            W_TIPO_DATO = '[TIPO]'.
            IF <FS> IS NOT INITIAL.
              W_CAMPO     = '<fs_fm>-dbfield'.
            ELSEIF <FS> IS INITIAL.
              W_CAMPO     = '<fs_fm>-typ'.
            ENDIF.
          WHEN C_TIP_EXPORT. "Export
            W_VAR       = 'v_[NOMBRE]'.
            W_TIPO_DATO = '[TIPO]'.
            IF <FS> IS NOT INITIAL.
              W_CAMPO     = '<fs_fm>-dbfield'.
            ELSEIF <FS> IS INITIAL.
              W_CAMPO     = '<fs_fm>-typ'.
            ENDIF.
          WHEN C_TIP_TABLES. "Tables
            W_VAR       = 'it_[NOMBRE]'.
            W_TIPO_DATO = 'STANDARD TABLE OF [TIPO]'.
            W_CAMPO     = '<fs_fm>-dbstruct'.
        ENDCASE.
        CHECK <FS> IS ASSIGNED.
        FIND '-' IN <FS>. "Indica la referencia a un campo de una estructura
      *el dic.datos
        IF SY-SUBRC EQ 0.
          W_TIPO_S = 'LIKE'.
        ELSE.
          W_TIPO_S = 'TYPE'.
        ENDIF.
        UNASSIGN <FS>.
      ENDFORM.                    " get_patron_para_declaracion
      *&---------------------------------------------------------------------*
      *&      Form  GENERAR_LLAMADO_FM
      *&---------------------------------------------------------------------*
      *       Genera el código de llamado de la FM.
      *       Nota: tomado del método standard METH_ED_GENERATE_CALL
      *       de la clase CL_FB_FUNCTION_UTILITY.
      *----------------------------------------------------------------------*
      *  -->  funcname        Nombre de la función
      *  <--  rep             Código
      *----------------------------------------------------------------------*
      FORM GENERAR_LLAMADO_FM    USING VALUE(FUNCNAME)  TYPE RS38L_FNAM
                             CHANGING VALUE(REP)       TYPE
      SWBSE_MAX_LINE_TAB.
        DATA: BEGIN OF FUNC,
                FU1  TYPE C VALUE '''',
                NAME TYPE RS38L-NAME,
                FU2  TYPE C VALUE '''',
              END OF FUNC.
        DATA: BEGIN OF IP,
                IP1    TYPE C VALUE 'I',
                NUM(2),
              END OF IP.
        DATA: BEGIN OF EP,
                EP1    TYPE C VALUE 'E',
                NUM(2),
              END OF EP.
        DATA: BEGIN OF TP,
                TP1    TYPE C VALUE  'T',
                NUM(2),
              END OF TP.
        DATA: INCL           TYPE RS38L-INCLUDE,
              LENGTH         TYPE I,
              LENGT2         TYPE I,
              MAX            TYPE P,
              L_COM_LINE     TYPE I,
              L_LINES        TYPE I,
              MIT_TRY_ENDTRY TYPE C,
              L_OBLI         TYPE C.
        DATA  W_LENGT_AUX    TYPE I.
        CONSTANTS: TYPE_INS TYPE I VALUE 2,
                   PARM_INS TYPE I VALUE 4.
        DATA: NUM TYPE I.
        FIELD-SYMBOLS <F> TYPE ANY.
        FIELD-SYMBOLS <FS_VARIABLES> LIKE LINE OF IT_VARIABLES.
      * E. Crasovan:  Work-area's  wg. OO definiert
        DATA W_ENLFDIR     TYPE ENLFDIR.
        DATA W_P_IF_IMPORT TYPE RSIMP.
        DATA W_P_IF_EXPORT TYPE RSEXP.
        DATA W_P_IF_CHANGE TYPE RSCHA.
        DATA W_P_IF_TABLES TYPE RSTBL.
        DATA W_P_IF_EXCEPT TYPE RSEXC.
        DATA W_REP         TYPE SWBSE_MAX_LINE.
        DATA L_RSEUMOD     TYPE RSEUMOD.
        DATA L_FBPATTERN   TYPE FBPATTERN.
        FIELD-SYMBOLS <FS_IMPORT> LIKE LINE OF IT_IMPORT.  "I-RMP
        FIELD-SYMBOLS <FS_CHANGE> LIKE LINE OF IT_CHANGE.  "I-RMP
        FIELD-SYMBOLS <FS_EXPORT> LIKE LINE OF IT_EXPORT.  "I-RMP
        FIELD-SYMBOLS <FS_TABLES> LIKE LINE OF IT_TABLES.  "I-RMP
        FIELD-SYMBOLS <FS_EXCEPT> LIKE LINE OF IT_EXCEPT.  "I-RMP
      *
        CALL FUNCTION 'RS_WORKBENCH_CUSTOMIZING'
          EXPORTING
            CHOICE          = 'EW'
            SUPPRESS_DIALOG = 'X'
          IMPORTING
            SETTING         = L_RSEUMOD.
      * E. Crasovan: exten3 sagt aus ob der FB mit Exceptionklassen arbeitet
        CLEAR L_FBPATTERN.
        MOVE-CORRESPONDING L_RSEUMOD TO L_FBPATTERN.
        MIT_TRY_ENDTRY = L_FBPATTERN-WITH_TRY_ENDTRY.
        SELECT SINGLE EXTEN3 FROM ENLFDIR INTO W_ENLFDIR-EXTEN3
        WHERE FUNCNAME = FUNCNAME.
      * Die ganze Logik hier ist eigentlich die Form ed_generate_call_new
      *
        CLEAR LENGTH.
        LOOP AT IT_IMPORT ASSIGNING <FS_IMPORT>.
          LENGT2 = STRLEN( <FS_IMPORT>-PARAMETER ).
          IF LENGT2 GT LENGTH.
            LENGTH = LENGT2.
          ENDIF.
        ENDLOOP.
        LOOP AT IT_CHANGE ASSIGNING <FS_CHANGE>.
          LENGT2 = STRLEN( W_P_IF_CHANGE-PARAMETER ).
          IF LENGT2 GT LENGTH.
            LENGTH = LENGT2.
          ENDIF.
        ENDLOOP.
        LOOP AT IT_EXPORT ASSIGNING <FS_EXPORT>.
          LENGT2 = STRLEN( <FS_EXPORT>-PARAMETER ).
          IF LENGT2 GT LENGTH.
            LENGTH = LENGT2.
          ENDIF.
        ENDLOOP.
        LOOP AT IT_TABLES ASSIGNING <FS_TABLES>.
          LENGT2 = STRLEN( <FS_TABLES>-PARAMETER ).
          IF LENGT2 GT LENGTH.
            LENGTH = LENGT2.
          ENDIF.
        ENDLOOP.
        LOOP AT IT_EXCEPT ASSIGNING <FS_EXCEPT>.
          LENGT2 = STRLEN( <FS_EXCEPT>-EXCEPTION ).
          IF LENGT2 GT LENGTH.
            LENGTH = LENGT2.
          ENDIF.
        ENDLOOP.
        IF LENGTH LT 7.
          LENGTH = 7.
        ENDIF.
        LENGT2 = LENGTH + 13.
        LENGTH = LENGTH + 11.
      * E. Crasovan
      * Wenn mit Exceptionklassen gearbeitet wird, soll der Aufruf des FB's
      *n einem
      * TRY ... ENDTRY Block eingeschlossen werden.
        CLEAR: W_REP.
      *
      * Achtung, hier wird entschieden ob TRY...CATCH...ENTRY verwendet wird
      *der nicht!!!
      * Sollte TRY...ENTRY doch erscheinen, dann mit_try_endry auf NICHT
      *INITIAL setzen.
        IF NOT W_ENLFDIR-EXTEN3 IS INITIAL.
          IF NOT MIT_TRY_ENDTRY IS INITIAL.
            W_REP = 'TRY.'.
            APPEND W_REP TO REP.
            CLEAR W_REP.
          ENDIF.
        ENDIF.
        W_REP = 'CALL FUNCTION'.
        FUNC-NAME = FUNCNAME.
        CONDENSE FUNC NO-GAPS.
        W_REP+20 = FUNC.
        CONDENSE W_REP.
        APPEND W_REP TO REP. CLEAR W_REP.
      *
        CLEAR: L_COM_LINE.
        L_OBLI = 'X'.
        LOOP AT IT_IMPORT ASSIGNING <FS_IMPORT>.
          UNPACK SY-TABIX TO EP-NUM.
          IF SY-TABIX = 1.
            W_REP+TYPE_INS = 'EXPORTING'.
            APPEND W_REP TO REP. CLEAR W_REP.
            DESCRIBE TABLE REP LINES L_COM_LINE.
          ENDIF.
          W_REP+PARM_INS = <FS_IMPORT>-PARAMETER.
          W_LENGT_AUX = 255 - LENGTH.              "I-RMP
      *    ASSIGN w_rep+length(1) TO <f>.          "D-RMP
          ASSIGN W_REP+LENGTH(W_LENGT_AUX) TO <F>. "I-RMP
          <F> = '='.
      *   Inicio RMP
          READ TABLE IT_VARIABLES ASSIGNING <FS_VARIABLES>
            WITH KEY TIPO_VAR      = 'V'
                     PARAM_ORIGINA = <FS_IMPORT>-PARAMETER
                     IN_OUT        = 'I'.
          IF SY-SUBRC EQ 0.
            CONCATENATE '=' <FS_VARIABLES>-IDENTIFICADOR
                   INTO <F> SEPARATED BY SPACE.
          ENDIF.
      *   Fin    RMP
          IF NOT <FS_IMPORT>-DEFAULT IS INITIAL OR
             NOT <FS_IMPORT>-OPTIONAL IS INITIAL.
            ASSIGN W_REP(1) TO <F>.
      *      <f> = '"'. "D-RMP
            <F> = '*'. "I-RMP
            IF NOT <FS_IMPORT>-DEFAULT IS INITIAL.
              IF <FS_IMPORT>-DEFAULT = 'SPACE'.
                ASSIGN W_REP+LENGT2(3) TO <F>.
      *          <f> = ''' '''. "D-RMP
              ELSE.
                ASSIGN W_REP+LENGT2(28) TO <F>.
                <F> = <FS_IMPORT>-DEFAULT.
              ENDIF.
            ELSE.
              IF L_FBPATTERN-FORMAL_EQ_ACTUAL <> SPACE.
                ASSIGN W_REP+LENGT2(LENGTH) TO <F>.
                <F> = <FS_IMPORT>-PARAMETER.
              ENDIF.
            ENDIF.
            IF L_OBLI = 'X'.
              CLEAR L_OBLI.
            ENDIF.
          ELSE.
            IF L_FBPATTERN-FORMAL_EQ_ACTUAL <> SPACE.
              ASSIGN W_REP+LENGT2(LENGTH) TO <F>.
              <F> = <FS_IMPORT>-PARAMETER.
            ENDIF.
            L_OBLI = '1'.
          ENDIF.
          APPEND W_REP TO REP. CLEAR W_REP.
        ENDLOOP.
        IF L_OBLI IS INITIAL.
          READ TABLE REP INDEX L_COM_LINE INTO W_REP.
          ASSIGN W_REP(1) TO <F>.
      *      <f> = '"'. "D-RMP
          <F> = '*'. "I-RMP
          MODIFY REP FROM W_REP INDEX L_COM_LINE.
          CLEAR W_REP.
        ENDIF.
        LOOP AT IT_EXPORT ASSIGNING <FS_EXPORT>.
          IF SY-TABIX = 1.
            W_REP+TYPE_INS = 'IMPORTING'.
            ASSIGN W_REP(1) TO <F>.
      *      <f> = '"'. "D-RMP
            <F> = '*'. "I-RMP
            APPEND W_REP TO REP. CLEAR W_REP.
          ENDIF.
          W_REP+PARM_INS = <FS_EXPORT>-PARAMETER.
          W_LENGT_AUX = 255 - LENGTH.              "I-RMP
      *    ASSIGN w_rep+length(1) TO <f>.          "D-RMP
          ASSIGN W_REP+LENGTH(W_LENGT_AUX) TO <F>. "I-RMP
          <F> = '='.
      *   Inicio RMP
          READ TABLE IT_VARIABLES ASSIGNING <FS_VARIABLES>
            WITH KEY TIPO_VAR      = 'V'
                     PARAM_ORIGINA = <FS_EXPORT>-PARAMETER
                     IN_OUT        = 'E'.
          IF SY-SUBRC EQ 0.
            CONCATENATE '=' <FS_VARIABLES>-IDENTIFICADOR
                   INTO <F> SEPARATED BY SPACE.
          ENDIF.
      *   Fin    RMP
          IF L_FBPATTERN-FORMAL_EQ_ACTUAL <> SPACE.
            ASSIGN W_REP+LENGT2(LENGTH) TO <F>.
            <F> = <FS_EXPORT>-PARAMETER.
          ENDIF.
          ASSIGN W_REP(1) TO <F>.
      *      <f> = '"'. "D-RMP
          <F> = '*'. "I-RMP
          APPEND W_REP TO REP. CLEAR W_REP.
        ENDLOOP.
      *
        CLEAR: L_COM_LINE.
        L_OBLI = 'X'.
        LOOP AT IT_TABLES ASSIGNING <FS_TABLES>.
          IF SY-TABIX = 1.
            W_REP+TYPE_INS = 'TABLES'.
            APPEND W_REP TO REP. CLEAR W_REP.
            DESCRIBE TABLE REP LINES L_COM_LINE.
          ENDIF.
          W_LENGT_AUX = 255 - LENGTH.              "I-RMP
          W_REP+PARM_INS = <FS_TABLES>-PARAMETER.
      *    ASSIGN w_rep+length(1) TO <f>.          "D-RMP
          ASSIGN W_REP+LENGTH(W_LENGT_AUX) TO <F>. "I-RMP
          <F> = '='.
      *   Inicio RMP
          READ TABLE IT_VARIABLES ASSIGNING <FS_VARIABLES>
            WITH KEY TIPO_VAR      = 'V'
                     PARAM_ORIGINA = <FS_TABLES>-PARAMETER
                     IN_OUT        = 'T'.
          IF SY-SUBRC EQ 0.
            CONCATENATE '=' <FS_VARIABLES>-IDENTIFICADOR
                   INTO <F> SEPARATED BY SPACE.
          ENDIF.
      *   Fin    RMP
          IF L_FBPATTERN-FORMAL_EQ_ACTUAL <> SPACE.
            ASSIGN W_REP+LENGT2(LENGTH) TO <F>.
            <F> = <FS_TABLES>-PARAMETER.
          ENDIF.
          IF NOT <FS_TABLES>-OPTIONAL IS INITIAL.
      *      w_rep(1) = '"'.   "D-RMP
            W_REP(1) = '*'.   "I-RMP
            IF L_OBLI = 'X'.
              CLEAR L_OBLI.
            ENDIF.
          ELSE.
            L_OBLI = '1'.
          ENDIF.
          APPEND W_REP TO REP. CLEAR W_REP.
        ENDLOOP.
        IF L_OBLI IS INITIAL.
          READ TABLE REP INDEX L_COM_LINE INTO W_REP.
          ASSIGN W_REP(1) TO <F>.
      *      <f> = '"'. "D-RMP
          <F> = '*'. "I-RMP
          MODIFY REP FROM W_REP INDEX L_COM_LINE.
          CLEAR W_REP.
        ENDIF.
      *
        CLEAR: L_COM_LINE.
        L_OBLI = 'X'.
        LOOP AT IT_CHANGE ASSIGNING <FS_CHANGE>.
          UNPACK SY-TABIX TO EP-NUM.
          IF SY-TABIX = 1.
            W_REP+TYPE_INS = 'CHANGING'.
            APPEND W_REP TO REP. CLEAR W_REP.
            DESCRIBE TABLE REP LINES L_COM_LINE.
          ENDIF.
          W_REP+PARM_INS = <FS_CHANGE>-PARAMETER.
          ASSIGN W_REP+LENGTH(1) TO <F>.
          <F> = '='.
          IF NOT <FS_CHANGE>-DEFAULT IS INITIAL OR
             NOT <FS_CHANGE>-OPTIONAL IS INITIAL.
            ASSIGN W_REP(1) TO <F>.
      *      <f> = '"'. "D-RMP
            <F> = '*'. "I-RMP
            IF NOT <FS_CHANGE>-DEFAULT IS INITIAL.
              IF <FS_CHANGE>-DEFAULT = 'SPACE'.
                ASSIGN W_REP+LENGT2(3) TO <F>.
                <F> = ''' '''.
              ELSE.
                ASSIGN W_REP+LENGT2(28) TO <F>.
                <F> = <FS_CHANGE>-DEFAULT.
              ENDIF.
            ELSE.
              IF L_FBPATTERN-FORMAL_EQ_ACTUAL <> SPACE.
                ASSIGN W_REP+LENGT2(LENGTH) TO <F>.
                <F> = <FS_CHANGE>-PARAMETER.
              ENDIF.
            ENDIF.
            IF L_OBLI = 'X'.
              CLEAR L_OBLI.
            ENDIF.
          ELSE.
            IF L_FBPATTERN-FORMAL_EQ_ACTUAL <> SPACE.
              ASSIGN W_REP+LENGT2(LENGTH) TO <F>.
              <F> = <FS_CHANGE>-PARAMETER.
            ENDIF.
            L_OBLI = '1'.
          ENDIF.
          APPEND W_REP TO REP. CLEAR W_REP.
        ENDLOOP.
        IF L_OBLI IS INITIAL.
          READ TABLE REP INDEX L_COM_LINE INTO W_REP.
          ASSIGN W_REP(1) TO <F>.
      *      <f> = '"'. "D-RMP
          <F> = '*'. "I-RMP
          MODIFY REP FROM W_REP INDEX L_COM_LINE.
          CLEAR W_REP.
        ENDIF.
      *
      * E. Crasovan
      * Wenn mit Exceptionklassen gearbeitet wird, soll der Aufruf des FB's
      *in einem
      * TRY ... ENDTRY Block eingeschlossen werden.
      *
      *
        IF NOT W_ENLFDIR-EXTEN3 IS INITIAL.
          CLEAR W_REP.
          W_REP+10 = '.'.
          APPEND W_REP TO REP.
      *
          IF NOT MIT_TRY_ENDTRY IS INITIAL.
            DESCRIBE TABLE IT_EXCEPT LINES L_LINES.
            IF NOT L_LINES IS INITIAL.
              LOOP AT IT_EXCEPT ASSIGNING <FS_EXCEPT>.
                CONCATENATE 'CATCH*' <FS_EXCEPT>-EXCEPTION '.' INTO W_REP.
                W_REP+5(1) = SPACE.
                APPEND W_REP TO REP.
                CLEAR W_REP.
              ENDLOOP.
            ENDIF.
      *
            W_REP = 'ENDTRY.'.
            APPEND W_REP TO REP.
            CLEAR W_REP.
          ENDIF.
        ELSE.
      * dieser Teil kommt aus ed_generate_call_new
          DESCRIBE TABLE IT_EXCEPT LINES L_LINES.
          IF NOT L_LINES IS INITIAL.
      *      w_rep = '"'.      "D-RMP
            W_REP = '*'.      "I-RMP
            W_REP+TYPE_INS = 'EXCEPTIONS'.
            APPEND W_REP TO REP. CLEAR W_REP.
            LOOP AT IT_EXCEPT ASSIGNING <FS_EXCEPT>.
              MOVE SY-TABIX TO NUM.
              ASSIGN W_REP(1) TO <F>.
      *        <f> = '"'.       "D-RMP
              <F> = '*'.       "I-RMP
              W_REP+PARM_INS = <FS_EXCEPT>-EXCEPTION.
              ASSIGN W_REP+LENGTH(1) TO <F>.
              <F> = '='.
              ASSIGN W_REP+LENGT2(2) TO <F>.
              <F> = NUM.
              APPEND W_REP TO REP. CLEAR W_REP.
            ENDLOOP.
            IF L_FBPATTERN-EXC_WO_OTHERS = SPACE.
              NUM = NUM + 1.
      *      w_rep = '"'.      "D-RMP
              W_REP = '*'.      "I-RMP
              W_REP+PARM_INS = 'OTHERS'.
              ASSIGN W_REP+LENGTH(1) TO <F>.
              <F> = '='.
              ASSIGN W_REP+LENGT2(2) TO <F>.
      * Wegen zu starken Moserns der Anwendung wieder ausgebaut
      *  if num = 1.
      **   Keine Exception vorhanden, wegen des SLIN auf 0 abbilden.
      *    num = 0.
      *  endif.
              <F> = NUM.
              APPEND W_REP TO REP. CLEAR W_REP.
            ENDIF.
          ENDIF.
          CLEAR W_REP.
          W_REP+10 = '.'.
          APPEND W_REP TO REP.
      *EC's
        ENDIF.
      ENDFORM.                    " GENERAR_LLAMADO_FM
      *&---------------------------------------------------------------------*
      *&      Form  GENERAR_VARIABLES
      *&---------------------------------------------------------------------*
      *       Genera las variables en base a los parámetros de la función
      *----------------------------------------------------------------------*
      *  -->  w_tipo_param       (I)mport, (E)xport (T)ables
      *----------------------------------------------------------------------*
      FORM GENERAR_VARIABLES USING VALUE(W_TIPO_PARAM) TYPE C.
        DATA W_ITAB_NAME  TYPE CHAR30.
        DATA W_VAR        TYPE STRING.
        DATA W_TIPO_DATO  TYPE STRING.
        DATA W_TIPO_REF   TYPE RS38L_TYP.
        DATA W_CAMPO      TYPE CHAR30.
        DATA W_TIPO_S     TYPE CHAR10.
        DATA WA_VARIABLES LIKE LINE OF IT_VARIABLES.
        FIELD-SYMBOLS <FS_FM_PARAMETERS> TYPE ANY TABLE.
        FIELD-SYMBOLS <FS>               TYPE ANY.
        FIELD-SYMBOLS <FS_FM>            TYPE ANY.
        FIELD-SYMBOLS <FS_PFUPARAREF>    LIKE LINE OF IT_PFUPARAREF.
        CLEAR W_ITAB_NAME.
        PERFORM GET_NOMBRE_PARAMETRO USING W_TIPO_PARAM
                                  CHANGING W_ITAB_NAME.
        ASSIGN (W_ITAB_NAME) TO <FS_FM_PARAMETERS>.
        CHECK <FS_FM_PARAMETERS> IS ASSIGNED.
        LOOP AT <FS_FM_PARAMETERS> ASSIGNING <FS_FM>.
          CLEAR WA_VARIABLES.
          W_CAMPO = '<fs_fm>-parameter'.
          ASSIGN (W_CAMPO) TO <FS>.
          PERFORM GET_PATRON_PARA_DECLARACION USING <FS_FM>
                                                    W_TIPO_PARAM
                                           CHANGING W_VAR
                                                    W_TIPO_DATO
                                                    W_TIPO_S.
          REPLACE '[NOMBRE]' IN W_VAR WITH <FS>.
          WA_VARIABLES-PARAM_ORIGINA = <FS>.
          WA_VARIABLES-TIPO_VAR      = 'V'.
          WA_VARIABLES-IDENTIFICADOR = W_VAR.
          WA_VARIABLES-INSTANCIA     = W_TIPO_S.
          READ TABLE IT_PFUPARAREF ASSIGNING <FS_PFUPARAREF>
            WITH KEY PARAMETER = <FS>
                     PARAMTYPE = W_TIPO_PARAM.
          IF SY-SUBRC EQ 0.
            W_TIPO_REF = <FS_PFUPARAREF>-STRUCTURE.
          ENDIF.
          REPLACE '[TIPO]'   IN W_TIPO_DATO WITH W_TIPO_REF.
          WA_VARIABLES-TIPO_DATO     = W_TIPO_DATO.
          WA_VARIABLES-IN_OUT        = W_TIPO_PARAM.
          APPEND WA_VARIABLES TO IT_VARIABLES.
        ENDLOOP.
      ENDFORM.                    " GENERAR_VARIABLES
      *&---------------------------------------------------------------------*
      *&      Form  CODIGO_DECLARACION_VARIABLE
      *&---------------------------------------------------------------------*
      *       Genera el código acerca de la declaración de variables.
      *----------------------------------------------------------------------*
      FORM CODIGO_DECLARACION_VARIABLE CHANGING BUFFER TYPE  RSWSOURCET.
        DATA: WA_BUFFER TYPE STRING.
        DATA W_LINE      TYPE SWBSE_MAX_LINE.
        DATA W_LINE_AUX  TYPE SWBSE_MAX_LINE.
        FIELD-SYMBOLS <FS_VARIABLES> LIKE LINE OF IT_VARIABLES.
        LOOP AT IT_VARIABLES ASSIGNING <FS_VARIABLES>.
          W_LINE  = 'DATA [VAR]%[TYPE] [TIP_DATO].'.
          REPLACE '[VAR]'      IN W_LINE WITH <FS_VARIABLES>-IDENTIFICADOR.
          IF NOT <FS_VARIABLES>-TIPO_DATO IS INITIAL.
            REPLACE '[TIP_DATO]' IN W_LINE WITH <FS_VARIABLES>-TIPO_DATO.
          ELSE.
            REPLACE '[TIP_DATO]' IN W_LINE WITH 'CHAR30'.
          ENDIF.
          REPLACE '[TYPE]'     IN W_LINE WITH <FS_VARIABLES>-INSTANCIA.
          W_OFFSET = W_MAX_OFFSET + 9.
          SPLIT W_LINE AT '%' INTO W_LINE W_LINE_AUX.
          W_LINE+W_OFFSET = W_LINE_AUX.
          WA_BUFFER = W_LINE.
          APPEND WA_BUFFER TO BUFFER.
        ENDLOOP.
      ENDFORM.                    " CODIGO_DECLARACION_VARIABLE
      *&---------------------------------------------------------------------*
      *&      Form  EVITAR_PARAMETROS_REPETIDOS
      *&---------------------------------------------------------------------*
      *       Evita los parámetros repetidos.
      *----------------------------------------------------------------------*
      FORM EVITAR_PARAMETROS_REPETIDOS .
        DATA W_I TYPE N.
        FIELD-SYMBOLS <FS_PARAMETRO_CANT> LIKE LINE OF IT_PARAMETRO_CANT.
        FIELD-SYMBOLS <FS_VARIABLES>      LIKE LINE OF IT_VARIABLES.
        W_I = 1.
        LOOP AT IT_PARAMETRO_CANT ASSIGNING <FS_PARAMETRO_CANT>
          WHERE CANT GE 2.
          W_I = W_I + 1.
          READ TABLE IT_VARIABLES ASSIGNING <FS_VARIABLES>
          WITH KEY TIPO_VAR      = 'V'
                         PARAM_ORIGINA = <FS_PARAMETRO_CANT>-PARAMETER
                         IN_OUT        = 'E'.
          IF SY-SUBRC EQ 0.
            CONCATENATE <FS_VARIABLES>-IDENTIFICADOR '_' W_I
                   INTO <FS_VARIABLES>-IDENTIFICADOR.
          ENDIF.
          READ TABLE IT_VARIABLES ASSIGNING <FS_VARIABLES>
          WITH KEY TIPO_VAR      = 'V'
                         PARAM_ORIGINA = <FS_PARAMETRO_CANT>-PARAMETER
                         IN_OUT        = 'T'.
          IF SY-SUBRC EQ 0.
            CONCATENATE <FS_VARIABLES>-IDENTIFICADOR '_' W_I
                   INTO <FS_VARIABLES>-IDENTIFICADOR.
          ENDIF.
        ENDLOOP.
      ENDFORM.                    " EVITAR_PARAMETROS_REPETIDOS
      *&---------------------------------------------------------------------*
      *&      Form  FUNC_GET_OBJECT
      *&---------------------------------------------------------------------*
      *       FM: FUNC_GET_OBJECT
      *----------------------------------------------------------------------*
      *  -->  w_funcname        Nombre del módulo de función
      *  <--  it_ptfdir
      *  <--  it_ptftit
      *  <--  it_pfunct
      *  <--  it_penlfdir
      *  <--  it_ptrdir
      *  <--  it_pfupararef
      *  <--  it_uincl
      *----------------------------------------------------------------------*
      FORM FUNC_GET_OBJECT USING    VALUE(W_FUNCNAME)    TYPE RS38L_FNAM
                          CHANGING VALUE(IT_PTFDIR)     TYPE TY_TFDIR
                                   VALUE(IT_PTFTIT)     TYPE TY_TFTIT
                                   VALUE(IT_PFUNCT)     TYPE TY_FUNCT
                                   VALUE(IT_PENLFDIR)   TYPE TY_ENLFDIR
                                   VALUE(IT_PTRDIR)     TYPE TY_TRDIR
                                   VALUE(IT_PFUPARAREF) TYPE TY_FUPARAREF
                                   VALUE(IT_UINCL)      TYPE TY_ABAPTXT255.
        REFRESH: IT_PTFDIR,   IT_PTFTIT, IT_PFUNCT,
                 IT_PENLFDIR, IT_PTRDIR, IT_PFUPARAREF,
                 IT_UINCL.
        CHECK W_FUNCNAME IS NOT INITIAL.
        CALL FUNCTION 'FUNC_GET_OBJECT'
          EXPORTING
            FUNCNAME           = W_FUNCNAME
          TABLES
            PTFDIR             = IT_PTFDIR
            PTFTIT             = IT_PTFTIT
            PFUNCT             = IT_PFUNCT
            PENLFDIR           = IT_PENLFDIR
            PTRDIR             = IT_PTRDIR
            PFUPARAREF         = IT_PFUPARAREF
            UINCL              = IT_UINCL
          EXCEPTIONS
            FUNCTION_NOT_EXIST = 1
            VERSION_NOT_FOUND  = 2
            OTHERS             = 3.
      ENDFORM.                    " FUNC_GET_OBJECT
      *&---------------------------------------------------------------------*
      *&      Form  get_function_name
      *&---------------------------------------------------------------------*
      *       text
      *----------------------------------------------------------------------*
      *      -->VALUE(W_FUNCNAME)  text
      *----------------------------------------------------------------------*
      FORM GET_FUNCTION_NAME  CHANGING VALUE(W_FUNCNAME)    TYPE RS38L_FNAM.
        DATA: BEGIN OF FIELDS OCCURS 1.
            INCLUDE STRUCTURE SVAL.
        DATA: END OF FIELDS,
        POPUP_TITLE(30) TYPE C.
      *--------------------------------------------------------------------*
        POPUP_TITLE       = 'Gimme the function ;-)'(100).
        CLEAR FIELDS.
        FIELDS-TABNAME    = 'RS38L'.
        FIELDS-FIELDNAME  = 'NAME'.
        FIELDS-FIELD_OBL  = 'X'.             "Muß-Feld
        APPEND FIELDS.
        CALL FUNCTION 'POPUP_GET_VALUES_USER_HELP'
          EXPORTING
            POPUP_TITLE    = POPUP_TITLE
            PROGRAMNAME    = 'SAPLZBC_ENHANCE_TOOLS'
            F4_PROGRAMNAME = 'SAPLZBC_ENHANCE_TOOLS'
            F4_FORMNAME    = 'HELP_REQUEST'
          IMPORTING
            RETURNCODE     = RETURNCODE
          TABLES
            FIELDS         = FIELDS.
      
        IF RETURNCODE NE 'A'.
          READ TABLE FIELDS INDEX 1.
          W_FUNCNAME =  FIELDS-VALUE.
        ENDIF.
      
      ENDFORM.                    "get_function_name
      *&---------------------------------------------------------------------*
      *&      Form  HELP_REQUEST
      *&---------------------------------------------------------------------*
      *       text
      *----------------------------------------------------------------------*
      *      -->TABNAME    text
      *      -->FIELDNAME  text
      *      -->DISPLAY    text
      *      -->RETURNCODE text
      *      -->VALUE      text
      *----------------------------------------------------------------------*
      FORM HELP_REQUEST USING      TABNAME FIELDNAME DISPLAY
                        CHANGING   RETURNCODE VALUE.
        DATA: FIELD LIKE DYNPREAD-FIELDNAME.
        FIELD = 'SVALD-VALUE'.
        CALL FUNCTION 'RS_HELP_HANDLING'
          EXPORTING
            DYNPFIELD                 = FIELD
            DYNPNAME                  = SY-DYNNR
            OBJECT                    = 'FB'
            PROGNAME                  = 'SAPLSPO4'
            SUPPRESS_SELECTION_SCREEN = 'X'.
      ENDFORM.                    "HELP_REQUEST
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26
      • 27
      • 28
      • 29
      • 30
      • 31
      • 32
      • 33
      • 34
      • 35
      • 36
      • 37
      • 38
      • 39
      • 40
      • 41
      • 42
      • 43
      • 44
      • 45
      • 46
      • 47
      • 48
      • 49
      • 50
      • 51
      • 52
      • 53
      • 54
      • 55
      • 56
      • 57
      • 58
      • 59
      • 60
      • 61
      • 62
      • 63
      • 64
      • 65
      • 66
      • 67
      • 68
      • 69
      • 70
      • 71
      • 72
      • 73
      • 74
      • 75
      • 76
      • 77
      • 78
      • 79
      • 80
      • 81
      • 82
      • 83
      • 84
      • 85
      • 86
      • 87
      • 88
      • 89
      • 90
      • 91
      • 92
      • 93
      • 94
      • 95
      • 96
      • 97
      • 98
      • 99
      • 100
      • 101
      • 102
      • 103
      • 104
      • 105
      • 106
      • 107
      • 108
      • 109
      • 110
      • 111
      • 112
      • 113
      • 114
      • 115
      • 116
      • 117
      • 118
      • 119
      • 120
      • 121
      • 122
      • 123
      • 124
      • 125
      • 126
      • 127
      • 128
      • 129
      • 130
      • 131
      • 132
      • 133
      • 134
      • 135
      • 136
      • 137
      • 138
      • 139
      • 140
      • 141
      • 142
      • 143
      • 144
      • 145
      • 146
      • 147
      • 148
      • 149
      • 150
      • 151
      • 152
      • 153
      • 154
      • 155
      • 156
      • 157
      • 158
      • 159
      • 160
      • 161
      • 162
      • 163
      • 164
      • 165
      • 166
      • 167
      • 168
      • 169
      • 170
      • 171
      • 172
      • 173
      • 174
      • 175
      • 176
      • 177
      • 178
      • 179
      • 180
      • 181
      • 182
      • 183
      • 184
      • 185
      • 186
      • 187
      • 188
      • 189
      • 190
      • 191
      • 192
      • 193
      • 194
      • 195
      • 196
      • 197
      • 198
      • 199
      • 200
      • 201
      • 202
      • 203
      • 204
      • 205
      • 206
      • 207
      • 208
      • 209
      • 210
      • 211
      • 212
      • 213
      • 214
      • 215
      • 216
      • 217
      • 218
      • 219
      • 220
      • 221
      • 222
      • 223
      • 224
      • 225
      • 226
      • 227
      • 228
      • 229
      • 230
      • 231
      • 232
      • 233
      • 234
      • 235
      • 236
      • 237
      • 238
      • 239
      • 240
      • 241
      • 242
      • 243
      • 244
      • 245
      • 246
      • 247
      • 248
      • 249
      • 250
      • 251
      • 252
      • 253
      • 254
      • 255
      • 256
      • 257
      • 258
      • 259
      • 260
      • 261
      • 262
      • 263
      • 264
      • 265
      • 266
      • 267
      • 268
      • 269
      • 270
      • 271
      • 272
      • 273
      • 274
      • 275
      • 276
      • 277
      • 278
      • 279
      • 280
      • 281
      • 282
      • 283
      • 284
      • 285
      • 286
      • 287
      • 288
      • 289
      • 290
      • 291
      • 292
      • 293
      • 294
      • 295
      • 296
      • 297
      • 298
      • 299
      • 300
      • 301
      • 302
      • 303
      • 304
      • 305
      • 306
      • 307
      • 308
      • 309
      • 310
      • 311
      • 312
      • 313
      • 314
      • 315
      • 316
      • 317
      • 318
      • 319
      • 320
      • 321
      • 322
      • 323
      • 324
      • 325
      • 326
      • 327
      • 328
      • 329
      • 330
      • 331
      • 332
      • 333
      • 334
      • 335
      • 336
      • 337
      • 338
      • 339
      • 340
      • 341
      • 342
      • 343
      • 344
      • 345
      • 346
      • 347
      • 348
      • 349
      • 350
      • 351
      • 352
      • 353
      • 354
      • 355
      • 356
      • 357
      • 358
      • 359
      • 360
      • 361
      • 362
      • 363
      • 364
      • 365
      • 366
      • 367
      • 368
      • 369
      • 370
      • 371
      • 372
      • 373
      • 374
      • 375
      • 376
      • 377
      • 378
      • 379
      • 380
      • 381
      • 382
      • 383
      • 384
      • 385
      • 386
      • 387
      • 388
      • 389
      • 390
      • 391
      • 392
      • 393
      • 394
      • 395
      • 396
      • 397
      • 398
      • 399
      • 400
      • 401
      • 402
      • 403
      • 404
      • 405
      • 406
      • 407
      • 408
      • 409
      • 410
      • 411
      • 412
      • 413
      • 414
      • 415
      • 416
      • 417
      • 418
      • 419
      • 420
      • 421
      • 422
      • 423
      • 424
      • 425
      • 426
      • 427
      • 428
      • 429
      • 430
      • 431
      • 432
      • 433
      • 434
      • 435
      • 436
      • 437
      • 438
      • 439
      • 440
      • 441
      • 442
      • 443
      • 444
      • 445
      • 446
      • 447
      • 448
      • 449
      • 450
      • 451
      • 452
      • 453
      • 454
      • 455
      • 456
      • 457
      • 458
      • 459
      • 460
      • 461
      • 462
      • 463
      • 464
      • 465
      • 466
      • 467
      • 468
      • 469
      • 470
      • 471
      • 472
      • 473
      • 474
      • 475
      • 476
      • 477
      • 478
      • 479
      • 480
      • 481
      • 482
      • 483
      • 484
      • 485
      • 486
      • 487
      • 488
      • 489
      • 490
      • 491
      • 492
      • 493
      • 494
      • 495
      • 496
      • 497
      • 498
      • 499
      • 500
      • 501
      • 502
      • 503
      • 504
      • 505
      • 506
      • 507
      • 508
      • 509
      • 510
      • 511
      • 512
      • 513
      • 514
      • 515
      • 516
      • 517
      • 518
      • 519
      • 520
      • 521
      • 522
      • 523
      • 524
      • 525
      • 526
      • 527
      • 528
      • 529
      • 530
      • 531
      • 532
      • 533
      • 534
      • 535
      • 536
      • 537
      • 538
      • 539
      • 540
      • 541
      • 542
      • 543
      • 544
      • 545
      • 546
      • 547
      • 548
      • 549
      • 550
      • 551
      • 552
      • 553
      • 554
      • 555
      • 556
      • 557
      • 558
      • 559
      • 560
      • 561
      • 562
      • 563
      • 564
      • 565
      • 566
      • 567
      • 568
      • 569
      • 570
      • 571
      • 572
      • 573
      • 574
      • 575
      • 576
      • 577
      • 578
      • 579
      • 580
      • 581
      • 582
      • 583
      • 584
      • 585
      • 586
      • 587
      • 588
      • 589
      • 590
      • 591
      • 592
      • 593
      • 594
      • 595
      • 596
      • 597
      • 598
      • 599
      • 600
      • 601
      • 602
      • 603
      • 604
      • 605
      • 606
      • 607
      • 608
      • 609
      • 610
      • 611
      • 612
      • 613
      • 614
      • 615
      • 616
      • 617
      • 618
      • 619
      • 620
      • 621
      • 622
      • 623
      • 624
      • 625
      • 626
      • 627
      • 628
      • 629
      • 630
      • 631
      • 632
      • 633
      • 634
      • 635
      • 636
      • 637
      • 638
      • 639
      • 640
      • 641
      • 642
      • 643
      • 644
      • 645
      • 646
      • 647
      • 648
      • 649
      • 650
      • 651
      • 652
      • 653
      • 654
      • 655
      • 656
      • 657
      • 658
      • 659
      • 660
      • 661
      • 662
      • 663
      • 664
      • 665
      • 666
      • 667
      • 668
      • 669
      • 670
      • 671
      • 672
      • 673
      • 674
      • 675
      • 676
      • 677
      • 678
      • 679
      • 680
      • 681
      • 682
      • 683
      • 684
      • 685
      • 686
      • 687
      • 688
      • 689
      • 690
      • 691
      • 692
      • 693
      • 694
      • 695
      • 696
      • 697
      • 698
      • 699
      • 700
      • 701
      • 702
      • 703
      • 704
      • 705
      • 706
      • 707
      • 708
      • 709
      • 710
      • 711
      • 712
      • 713
      • 714
      • 715
      • 716
      • 717
      • 718
      • 719
      • 720
      • 721
      • 722
      • 723
      • 724
      • 725
      • 726
      • 727
      • 728
      • 729
      • 730
      • 731
      • 732
      • 733
      • 734
      • 735
      • 736
      • 737
      • 738
      • 739
      • 740
      • 741
      • 742
      • 743
      • 744
      • 745
      • 746
      • 747
      • 748
      • 749
      • 750
      • 751
      • 752
      • 753
      • 754
      • 755
      • 756
      • 757
      • 758
      • 759
      • 760
      • 761
      • 762
      • 763
      • 764
      • 765
      • 766
      • 767
      • 768
      • 769
      • 770
      • 771
      • 772
      • 773
      • 774
      • 775
      • 776
      • 777
      • 778
      • 779
      • 780
      • 781
      • 782
      • 783
      • 784
      • 785
      • 786
      • 787
      • 788
      • 789
      • 790
      • 791
      • 792
      • 793
      • 794
      • 795
      • 796
      • 797
      • 798
      • 799
      • 800
      • 801
      • 802
      • 803
      • 804
      • 805
      • 806
      • 807
    • 包含文件:LZBC_ENHANCE_TOOLSTOP 全局变量 Class 定义代码
      15

        ```
        FUNCTION-POOL zbc_enhance_tools.            "MESSAGE-ID ..
        
        DATA: lo_grid          TYPE REF TO cl_gui_alv_tree.
        
        FIELD-SYMBOLS: <fs_abap_pgeditor> TYPE REF TO cl_wb_pgeditor,
                       <fs_fb_instance>   TYPE REF TO cl_function_builder,
                       <fs_ed_instance>   TYPE REF TO cl_wb_cleditor,
                       <fs_docking>       TYPE REF TO cl_gui_docking_container,
                       <fs_abap_editor>   TYPE REF TO cl_wb_editor.                             "abap_editor全局对象指针
        
        DATA returncode(1)   TYPE c.
        
        CLASS lcl_tree_events DEFINITION.
          PUBLIC SECTION .
            METHODS handle_node_ctmenu_request
                          FOR EVENT node_context_menu_request OF cl_gui_alv_tree
              IMPORTING node_key menu.
        
            METHODS handle_node_ctmenu_selected
                          FOR EVENT node_context_menu_selected OF cl_gui_alv_tree
              IMPORTING node_key fcode.
        
            METHODS handle_item_ctmenu_request
                          FOR EVENT item_context_menu_request OF cl_gui_alv_tree
              IMPORTING node_key fieldname menu.
        
            METHODS handle_item_ctmenu_selected
                          FOR EVENT item_context_menu_selected OF cl_gui_alv_tree
              IMPORTING node_key fieldname fcode.
        
            METHODS handle_button_click
                          FOR EVENT button_click OF cl_gui_alv_tree
              IMPORTING node_key fieldname.
        
            METHODS handle_link_click
                          FOR EVENT link_click OF cl_gui_alv_tree
              IMPORTING node_key fieldname.
        
            METHODS handle_header_click
                          FOR EVENT header_click OF cl_gui_alv_tree
              IMPORTING fieldname.
        
            METHODS handle_node_double_click
                          FOR EVENT node_double_click  OF cl_gui_alv_tree
              IMPORTING node_key.
        
            METHODS handle_item_double_click
                          FOR EVENT item_double_click  OF cl_gui_alv_tree
              IMPORTING fieldname node_key.
        
            METHODS handle_after_user_command FOR EVENT after_user_command OF cl_gui_alv_tree
              IMPORTING ucomm.
        
          PRIVATE SECTION .
        ENDCLASS.
        
        CLASS lcl_tree_events IMPLEMENTATION.
        
          METHOD handle_node_ctmenu_request.
          ENDMETHOD.
        
          METHOD handle_node_ctmenu_selected.
          ENDMETHOD.
        
          METHOD handle_item_ctmenu_request .
          ENDMETHOD.
        
          METHOD handle_item_ctmenu_selected.
          ENDMETHOD.
        
          METHOD handle_button_click.
          ENDMETHOD.
        
          METHOD handle_link_click.
          ENDMETHOD.
        
          METHOD handle_header_click.
          ENDMETHOD.
        
          METHOD handle_node_double_click.
          ENDMETHOD.
        
          METHOD handle_item_double_click.
            DATA: abap_editor TYPE REF TO cl_wb_editor.
        
            IF <fs_abap_pgeditor> IS ASSIGNED.               "SE38
        
              IF <fs_abap_pgeditor>->abap_editor IS INITIAL.
                MESSAGE 'ABAP_EDITOR对象未指派!' TYPE 'S' DISPLAY LIKE 'E'.
              ELSE.
                ASSIGN <fs_abap_pgeditor>->abap_editor TO <fs_abap_editor>.
                PERFORM frm_exec_function USING node_key.
              ENDIF.
        
            ELSEIF <fs_fb_instance> IS ASSIGNED.            "SE37
        
              CALL METHOD <fs_fb_instance>->if_wb_dark_functionality~get( IMPORTING ex_editor = abap_editor ).
              IF abap_editor IS INITIAL.
                MESSAGE 'ABAP_EDITOR对象未指派!' TYPE 'S' DISPLAY LIKE 'E'.
              ELSE.
                ASSIGN abap_editor TO <fs_abap_editor>.
                PERFORM frm_exec_function USING node_key.
              ENDIF.
              <fs_fb_instance>->change_state_text( ).
        
            ELSEIF <fs_ed_instance> IS ASSIGNED.            "SE24
        
              IF <fs_ed_instance>->editor IS INITIAL.
                MESSAGE 'ABAP_EDITOR对象未指派!' TYPE 'S' DISPLAY LIKE 'E'.
              ELSE.
                ASSIGN <fs_ed_instance>->editor TO <fs_abap_editor>.
                PERFORM frm_exec_function USING node_key.
              ENDIF.
            ENDIF.
        
          ENDMETHOD.
        
          METHOD handle_after_user_command.
            CASE ucomm.
              WHEN 'TOOLS'.
                MESSAGE 'Tips:      Power By Roger 这是一个开放的ABAP编辑器工具箱,任何人都可以为此添加功能!' TYPE 'I'.
              WHEN 'PORTAL'.
                CALL METHOD cl_gui_frontend_services=>execute
                  EXPORTING
                    document = 'https://blog.csdn.net/qq_30797051?type=blog'
                  EXCEPTIONS
                    OTHERS   = 1.
              WHEN OTHERS.
            ENDCASE.
          ENDMETHOD.
        
        ENDCLASS.
        
        CONSTANTS: c_tip_import TYPE c VALUE 'I',
                   c_tip_export TYPE c VALUE 'E',
                   c_tip_tables TYPE c VALUE 'T'.
        TYPES: BEGIN OF ty_codigo,
                 linea TYPE string,
               END OF ty_codigo.
        TYPES ty_tfdir      TYPE STANDARD TABLE OF tfdir.
        TYPES ty_tftit      TYPE STANDARD TABLE OF tftit.
        TYPES ty_funct      TYPE STANDARD TABLE OF funct.
        TYPES ty_enlfdir    TYPE STANDARD TABLE OF enlfdir.
        TYPES ty_trdir      TYPE STANDARD TABLE OF trdir.
        TYPES ty_fupararef  TYPE STANDARD TABLE OF sfupararef.
        TYPES ty_abaptxt255 TYPE STANDARD TABLE OF abaptxt255.
        TYPES ty_line(72)   TYPE c.
        TYPES ty_line_tab   TYPE STANDARD TABLE OF ty_line.
        TYPES swbse_max_line(255) TYPE c.
        TYPES swbse_max_line_tab  TYPE TABLE OF swbse_max_line.
        TYPES: BEGIN OF ty_variable,
                 tipo_var      TYPE c,
                 identificador TYPE string, "char30,
                 pertenece_a   TYPE char30,
                 tipo_dato     TYPE rs38l_typ,
                 tipo_tabla    TYPE c,
                 instancia     TYPE char15,
                 valor         TYPE char30,
                 cod_mod       TYPE numc5,
                 in_out        TYPE c,
                 traspaso      TYPE c, "Ref o Value
                 optional      TYPE c,
                 param_origina TYPE char30,
               END OF ty_variable.
        TYPES: BEGIN OF ty_parametro_cant,
                 parameter TYPE char30,
                 cant      TYPE i,
               END OF ty_parametro_cant.
        TYPES: BEGIN OF ty_modulos,
                 cod_mod       TYPE numc5,
                 tipo_mod      TYPE c, "Form o Metodo
                 identificador TYPE char30,
                 pertenece_a   TYPE char30,
                 metodo_event  TYPE char30,
                 clase_event   TYPE char30,
               END OF ty_modulos.
        DATA it_codigo TYPE STANDARD TABLE OF ty_codigo.
        * Parameters
        DATA it_import     TYPE STANDARD TABLE OF rsimp.       "Importing
        DATA it_change     TYPE STANDARD TABLE OF rscha.       "Changing
        DATA it_export     TYPE STANDARD TABLE OF rsexp.       "Exporting
        DATA it_tables     TYPE STANDARD TABLE OF rstbl.       "Tables
        DATA it_except     TYPE STANDARD TABLE OF rsexc.       "Exception
        DATA it_param_docu TYPE STANDARD TABLE OF rsfdo.
        DATA it_variables  TYPE STANDARD TABLE OF ty_variable.
        DATA it_parametro_cant TYPE STANDARD TABLE OF ty_parametro_cant.
        DATA it_ptfdir     TYPE ty_tfdir.
        DATA it_ptftit     TYPE ty_tftit.
        DATA it_pfunct     TYPE ty_funct.
        DATA it_penlfdir   TYPE ty_enlfdir.
        DATA it_ptrdir     TYPE ty_trdir.
        DATA it_pfupararef TYPE ty_fupararef.
        DATA it_uincl      TYPE ty_abaptxt255.
        DATA w_offset      TYPE i.
        DATA w_max_offset  TYPE i.
        
        * INCLUDE LZBC_ENHANCE_TOOLSD...             " Local class definition
        ```
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26
      • 27
      • 28
      • 29
      • 30
      • 31
      • 32
      • 33
      • 34
      • 35
      • 36
      • 37
      • 38
      • 39
      • 40
      • 41
      • 42
      • 43
      • 44
      • 45
      • 46
      • 47
      • 48
      • 49
      • 50
      • 51
      • 52
      • 53
      • 54
      • 55
      • 56
      • 57
      • 58
      • 59
      • 60
      • 61
      • 62
      • 63
      • 64
      • 65
      • 66
      • 67
      • 68
      • 69
      • 70
      • 71
      • 72
      • 73
      • 74
      • 75
      • 76
      • 77
      • 78
      • 79
      • 80
      • 81
      • 82
      • 83
      • 84
      • 85
      • 86
      • 87
      • 88
      • 89
      • 90
      • 91
      • 92
      • 93
      • 94
      • 95
      • 96
      • 97
      • 98
      • 99
      • 100
      • 101
      • 102
      • 103
      • 104
      • 105
      • 106
      • 107
      • 108
      • 109
      • 110
      • 111
      • 112
      • 113
      • 114
      • 115
      • 116
      • 117
      • 118
      • 119
      • 120
      • 121
      • 122
      • 123
      • 124
      • 125
      • 126
      • 127
      • 128
      • 129
      • 130
      • 131
      • 132
      • 133
      • 134
      • 135
      • 136
      • 137
      • 138
      • 139
      • 140
      • 141
      • 142
      • 143
      • 144
      • 145
      • 146
      • 147
      • 148
      • 149
      • 150
      • 151
      • 152
      • 153
      • 154
      • 155
      • 156
      • 157
      • 158
      • 159
      • 160
      • 161
      • 162
      • 163
      • 164
      • 165
      • 166
      • 167
      • 168
      • 169
      • 170
      • 171
      • 172
      • 173
      • 174
      • 175
      • 176
      • 177
      • 178
      • 179
      • 180
      • 181
      • 182
      • 183
      • 184
      • 185
      • 186
      • 187
      • 188
      • 189
      • 190
      • 191
      • 192
      • 193
      • 194
      • 195
      • 196
      • 197
      • 198
      • 199
    • 包含文件:LZBC_ENHANCE_TOOLSF01 Form功能定义代码
      16

      *----------------------------------------------------------------------*
      ***INCLUDE LZBC_ENHANCE_TOOLSF01.
      *----------------------------------------------------------------------*
      *&---------------------------------------------------------------------*
      *& Form ADD_FOLDER
      *&---------------------------------------------------------------------*
      *& text
      *&---------------------------------------------------------------------*
      *&      --> P_RELAT_KEY
      *&      --> P_NODE_TEXT
      *&      --> P_NODE_IMAGE
      *&      <-- G_FAV_KEY
      *&---------------------------------------------------------------------*
      FORM add_folder  USING  p_relat_key TYPE lvc_nkey
                               p_node_text TYPE lvc_value
                               p_node_image TYPE tv_image
                      CHANGING p_new_key.
      
        DATA: l_layout_node TYPE lvc_s_layn.
      
        l_layout_node-isfolder = 'X'.          "=>add a folder, NOT a leaf
        l_layout_node-n_image = p_node_image.  "=>Display an icon
      
        CALL METHOD lo_grid->add_node
          EXPORTING
            i_relat_node_key = p_relat_key
            i_relationship   = cl_gui_column_tree=>relat_last_child
            i_node_text      = p_node_text
            is_node_layout   = l_layout_node
          IMPORTING
            e_new_node_key   = p_new_key.
      
      ENDFORM.
      *&---------------------------------------------------------------------*
      *& Form ADD_NODES
      *&---------------------------------------------------------------------*
      *& text
      *&---------------------------------------------------------------------*
      *&      --> LT_DATA
      *&      --> L_TOP_KEY
      *&---------------------------------------------------------------------*
      FORM add_nodes  TABLES   pt_data STRUCTURE zbc_tree_t
                      USING    p_top_key.
      
        DATA: key_node1 TYPE lvc_nkey,
              key_node2 TYPE lvc_nkey.
      
        LOOP AT pt_data ASSIGNING FIELD-SYMBOL(<fs_data>).
          AT NEW node1.
            PERFORM add_node USING 'NODE1' <fs_data> p_top_key CHANGING key_node1.
          ENDAT.
      
          PERFORM add_node USING 'NODE2' <fs_data> key_node1 CHANGING key_node2.
        ENDLOOP.
      
      ENDFORM.
      *&---------------------------------------------------------------------*
      *& Form ADD_NODE
      *&---------------------------------------------------------------------*
      *& text
      *&---------------------------------------------------------------------*
      *&      --> <FS_DATA>
      *&      --> P_TOP_KEY
      *&      --> L_NODE_TEXT
      *&      --> SPACE
      *&      <-- KEY_NODE1
      *&---------------------------------------------------------------------*
      FORM add_node  USING    VALUE(p_node)
                              VALUE(p_data) TYPE zbc_tree_t
                              VALUE(p_relat_key) TYPE lvc_nkey
                     CHANGING p_new_key.
      
      
        DATA: l_node_text    TYPE lvc_value,
              l_layout_node  TYPE lvc_s_layn,
              lt_layout_item TYPE lvc_t_layi,
              ls_layout_item TYPE lvc_s_layi.
      
        CASE p_node.
          WHEN 'NODE1'.
      *§A1.USE THE LAYOUT STRUCTURE FOR NODES TO ADD AN ICON WHEN YOU
      *    build up your hierarchy.
            l_layout_node-n_image = p_data-n_image.       "Node折叠时的图标
            l_layout_node-exp_image = p_data-exp_image.   "Node展开时的图标
            l_node_text = p_data-node1.
            CLEAR: p_data-action,p_data-text.
          WHEN 'NODE2'.
            l_layout_node-n_image = p_data-t_image.       "Node折叠时的图标
            l_node_text = p_data-node2.
        ENDCASE.
      
      *§B1.USE THE LAYOUT STRUCTURE FOR ITEMS TO ADD AN ICON FOR A
      *    specific icon of one row when you build up your hierarchy.
        IF p_data-t_image IS NOT INITIAL.
          ls_layout_item-fieldname = p_node.
          ls_layout_item-t_image = p_data-t_image.    "item图标
          APPEND ls_layout_item TO lt_layout_item.
        ENDIF.
      
        CALL METHOD lo_grid->add_node
          EXPORTING
            i_relat_node_key = p_relat_key
            i_relationship   = cl_gui_column_tree=>relat_last_child
            i_node_text      = l_node_text
            is_outtab_line   = p_data
            is_node_layout   = l_layout_node
            it_item_layout   = lt_layout_item
          IMPORTING
            e_new_node_key   = p_new_key.
      
      ENDFORM.
      *&---------------------------------------------------------------------*
      *& Form FRM_EXEC_FUNCTION
      *&---------------------------------------------------------------------*
      *& text
      *&---------------------------------------------------------------------*
      *&      <-- <FS_ABAP_PGEDITOR>_>ABAP_EDITO
      *&---------------------------------------------------------------------*
      FORM frm_exec_function  USING VALUE(node_key).
        DATA: l_edit_status TYPE editorstat.
      
        DATA: l_value TYPE lvc_value,
              l_data  TYPE zbc_tree_t,
              l_mode  TYPE char30.
      
        "读取编辑模式
        CALL METHOD <fs_abap_editor>->get_editor_state( IMPORTING state = l_edit_status ). " L_EDIT_STATUS-EDDISP = 'X'显示模式
      
        CALL METHOD lo_grid->get_outtab_line
          EXPORTING
            i_node_key     = node_key
          IMPORTING
            e_node_text    = l_value
            e_outtab_line  = l_data
          EXCEPTIONS
            node_not_found = 1
            OTHERS         = 2.
        IF sy-subrc = 0.
          CASE l_data-action.
            WHEN 'A001' OR 'A002' OR 'A004' OR 'A005'.          "需要检查修改模式的功能
              IF l_edit_status-eddisp = 'X'.                "检查显示模式
                MESSAGE '此功能显示模式下禁止使用!' TYPE 'S' DISPLAY LIKE 'E'.
              ELSE.
                CASE l_data-action.
                  WHEN 'A001'.
                    PERFORM frm_process_a001.
                  WHEN 'A002'.
                    PERFORM frm_process_a002.
                  WHEN 'A004'.
                    PERFORM frm_process_a004.
                  WHEN 'A005'.
                    PERFORM frm_process_a005.
                ENDCASE.
              ENDIF.
            WHEN 'A003'.                                        "不需要检查修改模式的功能
              PERFORM frm_process_a003.
            WHEN OTHERS.
          ENDCASE.
        ENDIF.
      
      
      ENDFORM.
      *&---------------------------------------------------------------------*
      *& Form FRM_PROCESS_A001
      *&---------------------------------------------------------------------*
      *& text
      *&---------------------------------------------------------------------*
      *&      --> L_MODE
      *&---------------------------------------------------------------------*
      FORM frm_process_a001.
      
      ENDFORM.
      *&---------------------------------------------------------------------*
      *& Form FRM_PROCESS_A002
      *&---------------------------------------------------------------------*
      *& text
      *&---------------------------------------------------------------------*
      *&      --> L_MODE
      *&---------------------------------------------------------------------*
      FORM frm_process_a002.
        TYPES: BEGIN OF ts_settings,
                 indent    TYPE abap_bool,      "缩进
                 case_mode TYPE i,              "IF_PRETTY_PRINTER_SETTINGS=>CO_CASE_MODE_HIKEY
               END OF ts_settings .
      
        DATA: lt_buffer TYPE rswsourcet,
              lo_source TYPE REF TO cl_wb_source.
      
        DATA: lo_pretty TYPE REF TO cl_sedi_pretty_printer,
              l_setting TYPE ts_settings.
      
        CREATE OBJECT lo_pretty.
      
        DATA: l_FIRST_LINE TYPE i,
              L_CURSOR_LINE TYPE i,
              l_CURSOR_OFFSET TYPE i.
      
        "获取控制器中的源代码
        CALL METHOD <fs_abap_editor>->get_source_instance( IMPORTING source_object = lo_source ).
        CALL METHOD lo_source->get_source_tab( EXPORTING use_control = 'X' IMPORTING source = lt_buffer ).
      
        LOOP AT lt_buffer ASSIGNING FIELD-SYMBOL(<fs_buffer>).
          SHIFT <fs_buffer> LEFT DELETING LEADING ' '.    "前空格
          SHIFT <fs_buffer> LEFT DELETING LEADING ' '.    "前Tab
          SHIFT <fs_buffer> RIGHT DELETING TRAILING ' '.  "后空格
          SHIFT <fs_buffer> RIGHT DELETING TRAILING ' '.  "后Tab
          REPLACE ALL OCCURRENCES OF REGEX '[\s]{2,}' IN <fs_buffer> WITH ` `.
        ENDLOOP.
      
        "pretty print
        l_setting = VALUE #( indent = 'X' case_mode = if_pretty_printer_settings=>co_case_mode_hikey ).
        CALL METHOD lo_pretty->set_wb_settings( EXPORTING i_settings = l_setting ).
      
        TRY.
            lo_pretty->format_source( CHANGING c_source = lt_buffer ).
          CATCH cx_sedi_pretty_printer ##NO_HANDLER.
        ENDTRY.
      
        "回写控制器中的源代码
        CALL METHOD <fs_abap_editor>->get_cursor( IMPORTING first_line = l_FIRST_LINE cursor_line = L_CURSOR_LINE cursor_offset = l_CURSOR_OFFSET ).
      
        CALL FUNCTION 'EXECUTE_FUNCTION'
          EXPORTING
            c_editor = <fs_abap_editor>->control_handle2_i
            fcode_i  = 'SETT'
          TABLES
            content  = lt_buffer.
      
        CALL METHOD <fs_abap_editor>->set_cursor( EXPORTING first_line = l_FIRST_LINE cursor_line = L_CURSOR_LINE cursor_offset = l_CURSOR_OFFSET ).
      
        <fs_abap_editor>->edit-buf_varied = abap_true.      "设置已修改标识(对应方法CALL METHOD abap_source->set_state,但是需要set_source_instance麻烦)
        <fs_abap_editor>->status-changed  = abap_true.
        <fs_abap_editor>->pretty_printed  = abap_true.
      
      ENDFORM.
      *&---------------------------------------------------------------------*
      *& Form FRM_PROCESS_A003
      *&---------------------------------------------------------------------*
      *& text
      *&---------------------------------------------------------------------*
      *&      --> L_MODE
      *&---------------------------------------------------------------------*
      FORM frm_process_a003.
        "功能说明:跳转至编辑器指定行
      
        DATA: l_line_count   TYPE i,
              l_line_current TYPE i VALUE'1',
              lt_value       TYPE TABLE OF sval,
              l_returncode   TYPE c,
              l_message      TYPE char30.
      
        "获取编辑器行总数
        CALL METHOD <fs_abap_editor>->get_first_last_visible_lines( IMPORTING line_count = l_line_count ).
      
        lt_value = VALUE #( ( tabname = 'AFPO' fieldname = 'ANZSN' fieldtext = |行范围:(1 - { l_line_count } )| field_attr = '' novaluehlp = 'X' ) ).
      
        WHILE 1 > 0.
          CALL FUNCTION 'POPUP_GET_VALUES'
            EXPORTING
              popup_title  = |转至行:        { l_message }|
              start_column = '60'
              start_row    = '15'
            IMPORTING
              returncode   = l_returncode
            TABLES
              fields       = lt_value.
      
          IF l_returncode NE 'A'.
            IF lt_value[ 1 ]-value <= 0 OR lt_value[ 1 ]-value > l_line_count.
              l_message = '警告,请输入正确的行号!'.
            ELSE.
              l_line_current = lt_value[ 1 ]-value.
      
              CALL METHOD <fs_abap_editor>->set_cursor( EXPORTING first_line = l_line_current - 29 cursor_line = l_line_current cursor_offset = 0 ).
              EXIT.
            ENDIF.
          ELSE.
            EXIT.
          ENDIF.
        ENDWHILE.
      ENDFORM.
      *&---------------------------------------------------------------------*
      *& Form FRM_PROCESS_A003
      *&---------------------------------------------------------------------*
      *& text
      *&---------------------------------------------------------------------*
      *& -->  p1        text
      *& <--  p2        text
      *&---------------------------------------------------------------------*
      FORM frm_process_a004.
        "功能说明:调用function,并插入到代码编辑器
      
        DATA: lt_buffer      TYPE rswsourcet,
              l_line_current TYPE i.
      
        CALL FUNCTION 'Z_SDN_PATTERN_FUNC_START'        "call back buffer.
          TABLES
            buffer = lt_buffer.
      
        IF lt_buffer IS NOT INITIAL.
          " add initail line
          APPEND space TO lt_buffer.
      
          CALL METHOD <fs_abap_editor>->get_cursor( IMPORTING cursor_line = l_line_current ).
          CALL METHOD <fs_abap_editor>->insert_block( EXPORTING p_line = l_line_current + 1 CHANGING p_buffer = lt_buffer ).
      
          <fs_abap_editor>->edit-buf_varied = abap_true.      "设置已修改标识
          <fs_abap_editor>->status-changed  = abap_true.
        ENDIF.
      
      ENDFORM.
      *&---------------------------------------------------------------------*
      *& Form FRM_PROCESS_A005
      *&---------------------------------------------------------------------*
      *& text
      *&---------------------------------------------------------------------*
      *&      --> L_MODE
      *&---------------------------------------------------------------------*
      FORM frm_process_a005.
      
      ENDFORM.
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26
      • 27
      • 28
      • 29
      • 30
      • 31
      • 32
      • 33
      • 34
      • 35
      • 36
      • 37
      • 38
      • 39
      • 40
      • 41
      • 42
      • 43
      • 44
      • 45
      • 46
      • 47
      • 48
      • 49
      • 50
      • 51
      • 52
      • 53
      • 54
      • 55
      • 56
      • 57
      • 58
      • 59
      • 60
      • 61
      • 62
      • 63
      • 64
      • 65
      • 66
      • 67
      • 68
      • 69
      • 70
      • 71
      • 72
      • 73
      • 74
      • 75
      • 76
      • 77
      • 78
      • 79
      • 80
      • 81
      • 82
      • 83
      • 84
      • 85
      • 86
      • 87
      • 88
      • 89
      • 90
      • 91
      • 92
      • 93
      • 94
      • 95
      • 96
      • 97
      • 98
      • 99
      • 100
      • 101
      • 102
      • 103
      • 104
      • 105
      • 106
      • 107
      • 108
      • 109
      • 110
      • 111
      • 112
      • 113
      • 114
      • 115
      • 116
      • 117
      • 118
      • 119
      • 120
      • 121
      • 122
      • 123
      • 124
      • 125
      • 126
      • 127
      • 128
      • 129
      • 130
      • 131
      • 132
      • 133
      • 134
      • 135
      • 136
      • 137
      • 138
      • 139
      • 140
      • 141
      • 142
      • 143
      • 144
      • 145
      • 146
      • 147
      • 148
      • 149
      • 150
      • 151
      • 152
      • 153
      • 154
      • 155
      • 156
      • 157
      • 158
      • 159
      • 160
      • 161
      • 162
      • 163
      • 164
      • 165
      • 166
      • 167
      • 168
      • 169
      • 170
      • 171
      • 172
      • 173
      • 174
      • 175
      • 176
      • 177
      • 178
      • 179
      • 180
      • 181
      • 182
      • 183
      • 184
      • 185
      • 186
      • 187
      • 188
      • 189
      • 190
      • 191
      • 192
      • 193
      • 194
      • 195
      • 196
      • 197
      • 198
      • 199
      • 200
      • 201
      • 202
      • 203
      • 204
      • 205
      • 206
      • 207
      • 208
      • 209
      • 210
      • 211
      • 212
      • 213
      • 214
      • 215
      • 216
      • 217
      • 218
      • 219
      • 220
      • 221
      • 222
      • 223
      • 224
      • 225
      • 226
      • 227
      • 228
      • 229
      • 230
      • 231
      • 232
      • 233
      • 234
      • 235
      • 236
      • 237
      • 238
      • 239
      • 240
      • 241
      • 242
      • 243
      • 244
      • 245
      • 246
      • 247
      • 248
      • 249
      • 250
      • 251
      • 252
      • 253
      • 254
      • 255
      • 256
      • 257
      • 258
      • 259
      • 260
      • 261
      • 262
      • 263
      • 264
      • 265
      • 266
      • 267
      • 268
      • 269
      • 270
      • 271
      • 272
      • 273
      • 274
      • 275
      • 276
      • 277
      • 278
      • 279
      • 280
      • 281
      • 282
      • 283
      • 284
      • 285
      • 286
      • 287
      • 288
      • 289
      • 290
      • 291
      • 292
      • 293
      • 294
      • 295
      • 296
      • 297
      • 298
      • 299
      • 300
      • 301
      • 302
      • 303
      • 304
      • 305
      • 306
      • 307
      • 308
      • 309
      • 310
      • 311
      • 312
      • 313
      • 314
      • 315
      • 316
      • 317
      • 318
      • 319
      • 320
      • 321
    • 包含文件:LZBC_ENHANCE_TOOLSUXX (INCLUDE文件的插入将由SAP自动创建
      17

    4. 增强ABAP Editor Tools功能函数至标准ABAP编辑器

    =>增强ABAP Editor Tools功能至SE38

    • SE80->S38E(函数组)->LS38ETOP(包含):增强全局变量
      18

        DATA: g_docking TYPE REF TO cl_gui_docking_container,
              g_bc_tree TYPE TABLE OF zbc_tree_t.
      
      • 1
      • 2
    • SE80->S38E(函数组)->500(屏幕):增加屏幕PBO模块
      19

        MODULE apply_docking_container.
      
      • 1

      20

      MODULE apply_docking_container OUTPUT.
      DATA: l_parameter TYPE USR05.
      
        CHECK sy-tcode = 'SE38' OR sy-tcode = 'SE37' OR sy-tcode = 'SE24' OR sy-tcode = 'SEU_INT'.
      
        SELECT SINGLE * FROM USR05
          INTO l_parameter
          WHERE BNAME = sy-uname
          AND PARID = 'ZEN_ABAP_EDITOR'.
      
        CHECK l_parameter-PARVA = 'X'.
      
        IF g_docking IS INITIAL.
          CREATE OBJECT g_docking
            EXPORTING
              repid = 'SAPLS38E'
              dynnr = '0500'.
      
          CALL METHOD g_docking->dock_at( cl_gui_docking_container=>dock_at_right ).
          CALL METHOD g_docking->set_extension( 300 ).
      
          CALL FUNCTION 'Z_BC_ENHANCE_EDITOR'
            EXPORTING
              i_docking       = g_docking
            TABLES
              t_bc_tree       = g_bc_tree
            CHANGING
              i_abap_pgeditor = abap_pgeditor.
        ENDIF.
      ENDMODULE.
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26
      • 27
      • 28
      • 29
      • 30

    =>增强ABAP Editor Tools功能至SE37

    • SE80->SFUNCTION_BUILDER(函数组)->LSFUNCTION_BUILDERTOP(包含):增强全局变量
      21

        DATA: g_docking TYPE REF TO cl_gui_docking_container,
              g_bc_tree TYPE TABLE OF zbc_tree_t.
      
      • 1
      • 2
    • SE80->SFUNCTION_BUILDER(函数组)->3000(屏幕):增加屏幕PBO模块
      22

      MODULE apply_docking_container.
      
      • 1

      23

      MODULE apply_docking_container OUTPUT.
      DATA: abap_editor TYPE REF TO CL_WB_EDITOR,
            abap_source TYPE REF TO CL_WB_SOURCE.
      
        DATA: l_parameter TYPE USR05.
      
        CHECK sy-tcode = 'SE38' OR sy-tcode = 'SE37' OR sy-tcode = 'SE24' OR sy-tcode = 'SEU_INT'.
      
        SELECT SINGLE * FROM USR05
          INTO l_parameter
          WHERE BNAME = sy-uname
          AND PARID = 'ZEN_ABAP_EDITOR'.
      
        CHECK l_parameter-PARVA = 'X'.
        IF g_docking IS INITIAL.
          CREATE OBJECT g_docking
            EXPORTING
              repid = 'SAPLSFUNCTION_BUILDER'
              dynnr = '3000'.
      
        CALL METHOD g_docking->dock_at( cl_gui_docking_container=>dock_at_right ).
        CALL METHOD g_docking->set_extension( 300 ).
      
        CALL FUNCTION 'Z_BC_ENHANCE_EDITOR'
          EXPORTING
            i_docking = g_docking
          TABLES
            T_BC_TREE = g_bc_tree
          CHANGING
            I_fb_instance = fb_instance.
        ENDIF.
      ENDMODULE.
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26
      • 27
      • 28
      • 29
      • 30
      • 31
      • 32

    =>增强ABAP Editor Tools功能至SE24

    • SE80->SEO_CLEDITOR(函数组)->LSEO_CLEDITORTOP(包含):增强全局变量
      24

        DATA: g_docking TYPE REF TO cl_gui_docking_container,
              g_bc_tree TYPE TABLE OF zbc_tree_t.
      
      • 1
      • 2
    • SE80->SEO_CLEDITOR(函数组)->200(屏幕):增加屏幕PBO模块
      25

      MODULE apply_docking_container.
      
      • 1

      26

      MODULE apply_docking_container OUTPUT.
        DATA: l_parameter TYPE USR05.
      
        CHECK sy-tcode = 'SE38' OR sy-tcode = 'SE37' OR sy-tcode = 'SE24' OR sy-tcode = 'SEU_INT'.
      
        SELECT SINGLE * FROM USR05
          INTO l_parameter
          WHERE BNAME = sy-uname
          AND PARID = 'ZEN_ABAP_EDITOR'.
      
        CHECK l_parameter-PARVA = 'X'.
      
        IF g_docking IS INITIAL.
          CREATE OBJECT g_docking
            EXPORTING
              repid = 'SAPLSEO_CLEDITOR'
              dynnr = '0200'.
      
        CALL METHOD g_docking->dock_at( cl_gui_docking_container=>dock_at_right ).
        CALL METHOD g_docking->set_extension( 300 ).
      
        CALL FUNCTION 'Z_BC_ENHANCE_EDITOR'
          EXPORTING
            i_docking = g_docking
          TABLES
            T_BC_TREE = g_bc_tree
          CHANGING
            i_ed_instance = ed_instance.
        ENDIF.
      ENDMODULE.
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26
      • 27
      • 28
      • 29
      • 30

    V . 填充配置表 & 开启ABAP Editor Tools

    • SE16N:填充配置表:ZBC_TREE_T
      27

      代码处理	一二三四五	A001	功能自己补	@BV@	@FN@	@FO@
      代码处理	程序美化器(增强)	A002	格式化代码	@BY@	@FN@	@FO@
      其它功能	跳转到行	A003	跳转到指定行	@43@	@FN@	@FO@
      调用功能	调用函数	A004	调用函数自动创建变量	@K7@	@FN@	@FO@
      
      
      • 1
      • 2
      • 3
      • 4
      • 5
    • SU01:新增用户参数(ZEN_ABAP_EDITOR = ‘X’ )
      28

    • Tips:如果有用,请一键三连!!

  • 相关阅读:
    微信小程序——<image>图片组件图片显示闪烁
    【Electron】vue+electron应用设置菜单
    常用排序算法总结对比
    [Dubbo3.0.8源码解析系列]-25-为调用器对象增加容错和过滤器等功能
    使用centos搭建内网的yum源
    nuxt 不解析HTML结构bug
    抖音支付十万级 TPS 流量发券实践
    【全开源】Java短剧系统微信小程序+H5+微信公众号+APP 源码
    使用WGCLOUD监控oracle表空间大小的笔记
    Lifetime improvement through adaptive reconfiguration for nonvolatile FPGAs
  • 原文地址:https://blog.csdn.net/qq_30797051/article/details/125515831