








标准功能


增强功能







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


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

新建ABAP Editor Tools功能主函数模块:Z_BC_ENHANCE_EDITOR

IMPORTING参数

changing参数

tables参数

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.
新建调用函数(A004功能)对应的函数模块:Z_SDN_PATTERN_FUNC_START
函数模块来源(博主进行过部分代码的修正):Call a function module in the ABAP Editor: Stop Crying – Start Laughing.

tables参数

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
包含文件:LZBC_ENHANCE_TOOLSTOP 全局变量 Class 定义代码

```
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
```
包含文件:LZBC_ENHANCE_TOOLSF01 Form功能定义代码

*----------------------------------------------------------------------*
***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.
包含文件:LZBC_ENHANCE_TOOLSUXX (INCLUDE文件的插入将由SAP自动创建)

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

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

MODULE apply_docking_container.

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.
SE80->SFUNCTION_BUILDER(函数组)->LSFUNCTION_BUILDERTOP(包含):增强全局变量

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

MODULE apply_docking_container.

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.
SE80->SEO_CLEDITOR(函数组)->LSEO_CLEDITORTOP(包含):增强全局变量

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

MODULE apply_docking_container.

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.
SE16N:填充配置表:ZBC_TREE_T

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

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