前言: 为了提高在开发报表程序的效率,减少不必要的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'
EXPORTING
funcname = funcname
IMPORTING
group = lv_group
include = lv_include
namespace = lv_namespace
str_area = lv_str_area
EXCEPTIONS
function_not_exist = 1
OTHERS = 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=>read
IMPORTING
tables = lt_tables[]
import = lt_import[]
export = lt_export[]
change = lt_change[]
* oparam =
* nparam =
* fparam =
* o_param_docu =
* n_param_docu =
* docu =
* except =
* frparam =
CHANGING
header = ls_header_fb
EXCEPTIONS
cancelled = 1
OTHERS = 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_header
RECEIVING
p_header = DATA(lv_header)
EXCEPTIONS
not_found = 1
no_ddic_type = 2
OTHERS = 3.
CASE lv_header-tabtype.
WHEN 'J'.
SELECT SINGLE ddtext INTO @DATA(lv_ddtext) FROM dd02t
WHERE 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 dd04t
WHERE 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_header
RECEIVING
p_header = lv_header
EXCEPTIONS
not_found = 1
no_ddic_type = 2
OTHERS = 3.
CASE lv_header-tabtype.
WHEN 'J'.
SELECT SINGLE ddtext INTO lv_ddtext FROM dd02t
WHERE 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 dd04t
WHERE 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_header
RECEIVING
p_header = lv_header
EXCEPTIONS
not_found = 1
no_ddic_type = 2
OTHERS = 3.
CASE lv_header-tabtype.
WHEN 'J'.
SELECT SINGLE ddtext INTO lv_ddtext FROM dd02t
WHERE 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 dd04t
WHERE 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 dd02t
WHERE 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_header
RECEIVING
p_header = lv_header
EXCEPTIONS
not_found = 1
no_ddic_type = 2
OTHERS = 3.
CASE lv_header-tabtype.
WHEN 'J'.
SELECT SINGLE ddtext INTO lv_ddtext FROM dd02t
WHERE tabname = lt_import-structure AND ddlanguage = '1'.
add_code 'SS' lt_import-parameter '' lv_ddtext.
WHEN 'E'.
SELECT SINGLE ddtext INTO @lv_ddtext FROM dd04t
WHERE 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_header
RECEIVING
p_header = lv_header
EXCEPTIONS
not_found = 1
no_ddic_type = 2
OTHERS = 3.
CASE lv_header-tabtype.
WHEN 'J'.
SELECT SINGLE ddtext INTO lv_ddtext FROM dd02t
WHERE tabname = lt_export-structure AND ddlanguage = '1'.
add_code 'SS' lt_export-parameter '' lv_ddtext.
WHEN 'E'.
SELECT SINGLE ddtext INTO @lv_ddtext FROM dd04t
WHERE 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_header
RECEIVING
p_header = lv_header
EXCEPTIONS
not_found = 1
no_ddic_type = 2
OTHERS = 3.
CASE lv_header-tabtype.
WHEN 'J'.
SELECT SINGLE ddtext INTO lv_ddtext FROM dd02t
WHERE tabname = lt_change-structure AND ddlanguage = '1'.
add_code 'SS' lt_change-parameter '' lv_ddtext.
WHEN 'E'.
SELECT SINGLE ddtext INTO @lv_ddtext FROM dd04t
WHERE 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 dd02t
WHERE 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_export
IMPORTING
data = lt_code[]
CHANGING
rc = subrc
EXCEPTIONS
cntl_error = 1
error_no_gui = 2
not_supported_by_gui = 3
no_authority = 4
OTHERS = 5.
IF sy-subrc = subrc.
message = |已复制到剪切板|.
MESSAGE message TYPE 'S'.
ENDIF.
ENDIF.
ENDIF.
ENDFUNCTION.