前言: 为了提高在开发报表程序的效率,减少不必要的time loss,为此我在空闲时间编写了一个函数定义生产器,只需要简单执行就可以生成我们需要的函数参数定义,还可以为参数自动赋值,大大提高我们编码的效率。
FUNCTION z_func_var_gen.*"----------------------------------------------------------------------*"*"本地接口:*" IMPORTING*" VALUE(FUNCNAME) TYPE FUNCNAME*" VALUE(SCOPE) TYPE CHAR01 DEFAULT 'L'*" REFERENCE(ASSIGNING) TYPE CHAR01 OPTIONAL*" EXPORTING*" VALUE(SUBRC) TYPE SY-SUBRC*" VALUE(MESSAGE) TYPE CHAR100*"----------------------------------------------------------------------***********************************************************************************************************************************<变量声明区>**********************************************************************************************************************************TYPES:BEGIN OF ts_text , "自定义数据结构text TYPE c LENGTH 255,END OF ts_text.DATA:lv_group TYPE rs38l-area, "函数组, 函数模块属于函数组"lv_include TYPE rs38l-include, "ABAP 程序名"lv_namespace TYPE rs38l-namespace, "名称间隔"lv_str_area TYPE rs38l-str_area, "函数组名ls_header_fb TYPE header_fb, "Header Data From Function Builder"lt_tables TYPE rsfb_para WITH HEADER LINE, "Table with Parameters, Visualization"lt_import TYPE rsfb_para WITH HEADER LINE, "Table with Parameters, Visualization"lt_export TYPE rsfb_para WITH HEADER LINE, "Table with Parameters, Visualization"lt_change TYPE rsfb_para WITH HEADER LINE, "Table with Parameters, Visualization"lt_code TYPE TABLE OF ts_text WITH HEADER LINE, "定义数据内表lv_lines TYPE i. "Code lines""DATA:lcl_abap_typedescr TYPE REF TO cl_abap_typedescr. "定义类型参考"* 定义宏DEFINE add_code.CLEAR lt_code.CASE &1.WHEN 'V'.lt_code-text = | { scope }V_{ &2 } TYPE { &3 } , "--{ &4 }| .WHEN 'S'.lt_code-text = | { scope }S_{ &2 } TYPE { &3 } , "--{ &4 }| .WHEN 'T'.lt_code-text = | { scope }T_{ &2 } TYPE TABLE OF { &3 } WITH HEADER LINE , "--{ &4 }| .WHEN 'SS'.lt_code-text = | { &2 } = { scope }S_{ &2 } "--{ &4 }| .WHEN 'VV'.lt_code-text = | { &2 } = { scope }V_{ &2 } "--{ &4 }| .WHEN 'TT'.lt_code-text = | { &2 } = { scope }T_{ &2 }[] "--{ &4 }| .WHEN OTHERS.ENDCASE.APPEND lt_code.END-OF-DEFINITION.***********************************************************************************************************************************<逻辑处理区>***********************************************************************************************************************************---------------------------检查函数是否存在-----------------------------*CONDENSE funcname NO-GAPS.TRANSLATE funcname TO UPPER CASE.CONDENSE scope NO-GAPS.TRANSLATE scope TO UPPER CASE.IF scope IS INITIAL.scope = 'L'.ENDIF.CALL FUNCTION 'FUNCTION_EXISTS'EXPORTINGfuncname = funcnameIMPORTINGgroup = lv_groupinclude = lv_includenamespace = lv_namespacestr_area = lv_str_areaEXCEPTIONSfunction_not_exist = 1OTHERS = 2.* 获取返回状态subrc = sy-subrc.IF subrc <> 0.* 异常:终止运行EXIT.ELSE.* 正常:继续运行*----------------------------获取函数参数信息----------------------------*ls_header_fb-area = lv_namespace && lv_str_area .ls_header_fb-name = funcname .CALL METHOD cl_fb_parameter_db=>readIMPORTINGtables = lt_tables[]import = lt_import[]export = lt_export[]change = lt_change[]* oparam =* nparam =* fparam =* o_param_docu =* n_param_docu =* docu =* except =* frparam =CHANGINGheader = ls_header_fbEXCEPTIONScancelled = 1OTHERS = 2.* 获取返回状态subrc = sy-subrc.IF subrc <> 0.* 异常:终止运行EXIT.ELSE.* 正常:继续处理*----------------------------函数参数定义生成----------------------------*FREE:lt_code.lt_code-text = |"函数:{ funcname }参数定义如下:" |.APPEND lt_code.lt_code-text = 'DATA:'.APPEND lt_code.CLEAR lt_code.* 导入参数:IF lt_import[] IS NOT INITIAL.lt_code-text = '"IMPORT_PARAMETERS:"'.APPEND lt_code.LOOP AT lt_import.lcl_abap_typedescr ?= cl_abap_typedescr=>describe_by_name( lt_import-structure ).CALL METHOD lcl_abap_typedescr->get_ddic_headerRECEIVINGp_header = DATA(lv_header)EXCEPTIONSnot_found = 1no_ddic_type = 2OTHERS = 3.CASE lv_header-tabtype.WHEN 'J'.SELECT SINGLE ddtext INTO @DATA(lv_ddtext) FROM dd02tWHERE tabname = @lt_import-structure AND ddlanguage = '1'.add_code 'S' lt_import-parameter lt_import-structure lv_ddtext.WHEN 'E'.SELECT SINGLE ddtext INTO @lv_ddtext FROM dd04tWHERE rollname = @lv_header-tabname AND ddlanguage = '1'.add_code 'V' lt_import-parameter lt_import-structure lv_ddtext.WHEN OTHERS.ENDCASE.ENDLOOP.ENDIF.* 导出参数:IF lt_export[] IS NOT INITIAL.lt_code-text = '"EXPORT_PARAMETERS:"'.APPEND lt_code.LOOP AT lt_export.lcl_abap_typedescr ?= cl_abap_typedescr=>describe_by_name( lt_export-structure ).CALL METHOD lcl_abap_typedescr->get_ddic_headerRECEIVINGp_header = lv_headerEXCEPTIONSnot_found = 1no_ddic_type = 2OTHERS = 3.CASE lv_header-tabtype.WHEN 'J'.SELECT SINGLE ddtext INTO lv_ddtext FROM dd02tWHERE tabname = lt_export-structure AND ddlanguage = '1'.add_code 'S' lt_export-parameter lt_export-structure lv_ddtext.WHEN 'E'.SELECT SINGLE ddtext INTO @lv_ddtext FROM dd04tWHERE rollname = @lv_header-tabname AND ddlanguage = '1'.add_code 'V' lt_export-parameter lt_export-structure lv_ddtext.WHEN OTHERS.ENDCASE.ENDLOOP.ENDIF.* 更改参数:IF lt_change[] IS NOT INITIAL.lt_code-text = '"CHANGE_PARAMETERS:"'.APPEND lt_code.LOOP AT lt_change.lcl_abap_typedescr ?= cl_abap_typedescr=>describe_by_name( lt_change-structure ).CALL METHOD lcl_abap_typedescr->get_ddic_headerRECEIVINGp_header = lv_headerEXCEPTIONSnot_found = 1no_ddic_type = 2OTHERS = 3.CASE lv_header-tabtype.WHEN 'J'.SELECT SINGLE ddtext INTO lv_ddtext FROM dd02tWHERE tabname = lt_change-structure AND ddlanguage = '1'.add_code 'S' lt_change-parameter lt_change-structure lv_ddtext.WHEN 'E'.SELECT SINGLE ddtext INTO @lv_ddtext FROM dd04tWHERE rollname = @lv_header-tabname AND ddlanguage = '1'.add_code 'V' lt_change-parameter lt_change-structure lv_ddtext.WHEN OTHERS.ENDCASE.ENDLOOP.ENDIF.* 表参数:IF lt_tables[] IS NOT INITIAL.lt_code-text = '"TABLES_PARAMETERS:"'.APPEND lt_code.LOOP AT lt_tables.SELECT SINGLE ddtext INTO lv_ddtext FROM dd02tWHERE tabname = lt_tables-structure AND ddlanguage = '1'.add_code 'T' lt_tables-parameter lt_tables-structure lv_ddtext.ENDLOOP.ENDIF.CASE lines( lt_code[] ).WHEN '1'.FREE lt_code[].EXIT.WHEN OTHERS.lv_lines = lines( lt_code[] ).READ TABLE lt_code INDEX lv_lines.IF sy-subrc = 0.REPLACE ',' WITH '.' INTO lt_code-text.MODIFY lt_code INDEX lv_lines.ENDIF.ENDCASE.*-----------------------------函数参数赋值-------------------------------*IF assigning IS NOT INITIAL."添加间隔"DO 5 TIMES.APPEND INITIAL LINE TO lt_code[].ENDDO.lt_code-text = 'CALL FUNCTION' && | '{ funcname }'|.APPEND lt_code.* 导入参数:IF lt_import[] IS NOT INITIAL.lt_code-text = ' EXPORTING'.APPEND lt_code.LOOP AT lt_import.lcl_abap_typedescr ?= cl_abap_typedescr=>describe_by_name( lt_import-structure ).CALL METHOD lcl_abap_typedescr->get_ddic_headerRECEIVINGp_header = lv_headerEXCEPTIONSnot_found = 1no_ddic_type = 2OTHERS = 3.CASE lv_header-tabtype.WHEN 'J'.SELECT SINGLE ddtext INTO lv_ddtext FROM dd02tWHERE tabname = lt_import-structure AND ddlanguage = '1'.add_code 'SS' lt_import-parameter '' lv_ddtext.WHEN 'E'.SELECT SINGLE ddtext INTO @lv_ddtext FROM dd04tWHERE rollname = @lv_header-tabname AND ddlanguage = '1'.add_code 'VV' lt_import-parameter '' lv_ddtext.WHEN OTHERS.ENDCASE.ENDLOOP.ENDIF.* 导出参数:IF lt_export[] IS NOT INITIAL.lt_code-text = ' IMPORTING'.APPEND lt_code.LOOP AT lt_export.lcl_abap_typedescr ?= cl_abap_typedescr=>describe_by_name( lt_export-structure ).CALL METHOD lcl_abap_typedescr->get_ddic_headerRECEIVINGp_header = lv_headerEXCEPTIONSnot_found = 1no_ddic_type = 2OTHERS = 3.CASE lv_header-tabtype.WHEN 'J'.SELECT SINGLE ddtext INTO lv_ddtext FROM dd02tWHERE tabname = lt_export-structure AND ddlanguage = '1'.add_code 'SS' lt_export-parameter '' lv_ddtext.WHEN 'E'.SELECT SINGLE ddtext INTO @lv_ddtext FROM dd04tWHERE rollname = @lv_header-tabname AND ddlanguage = '1'.add_code 'VV' lt_export-parameter '' lv_ddtext.WHEN OTHERS.ENDCASE.ENDLOOP.ENDIF.* 更改参数:IF lt_change[] IS NOT INITIAL.lt_code-text = ' CHANGING'.APPEND lt_code.LOOP AT lt_change.lcl_abap_typedescr ?= cl_abap_typedescr=>describe_by_name( lt_change-structure ).CALL METHOD lcl_abap_typedescr->get_ddic_headerRECEIVINGp_header = lv_headerEXCEPTIONSnot_found = 1no_ddic_type = 2OTHERS = 3.CASE lv_header-tabtype.WHEN 'J'.SELECT SINGLE ddtext INTO lv_ddtext FROM dd02tWHERE tabname = lt_change-structure AND ddlanguage = '1'.add_code 'SS' lt_change-parameter '' lv_ddtext.WHEN 'E'.SELECT SINGLE ddtext INTO @lv_ddtext FROM dd04tWHERE rollname = @lv_header-tabname AND ddlanguage = '1'.add_code 'VV' lt_change-parameter '' lv_ddtext.WHEN OTHERS.ENDCASE.ENDLOOP.ENDIF.* 表参数:IF lt_tables[] IS NOT INITIAL.lt_code-text = ' TABLES'.APPEND lt_code.LOOP AT lt_tables.SELECT SINGLE ddtext INTO lv_ddtext FROM dd02tWHERE tabname = lt_tables-structure AND ddlanguage = '1'.add_code 'TT' lt_tables-parameter '' lv_ddtext.ENDLOOP.ENDIF.CASE lines( lt_code[] ).WHEN '1'.FREE lt_code[].EXIT.WHEN OTHERS.lv_lines = lines( lt_code[] ).READ TABLE lt_code INDEX lv_lines.IF sy-subrc = 0.CONCATENATE lt_code-text '.' INTO lt_code-text.MODIFY lt_code INDEX lv_lines.ENDIF.ENDCASE.ENDIF.*----------------------------复制内容到剪切板----------------------------*CALL METHOD cl_gui_frontend_services=>clipboard_exportIMPORTINGdata = lt_code[]CHANGINGrc = subrcEXCEPTIONScntl_error = 1error_no_gui = 2not_supported_by_gui = 3no_authority = 4OTHERS = 5.IF sy-subrc = subrc.message = |已复制到剪切板|.MESSAGE message TYPE 'S'.ENDIF.ENDIF.ENDIF.ENDFUNCTION.
