前言: 为了提高在开发报表程序的效率,减少不必要的time loss,为此我在空闲时间编写了一个函数定义生产器,只需要简单执行就可以生成我们需要的函数参数定义,还可以为参数自动赋值,大大提高我们编码的效率。

    1. FUNCTION z_func_var_gen.
    2. *"----------------------------------------------------------------------
    3. *"*"本地接口:
    4. *" IMPORTING
    5. *" VALUE(FUNCNAME) TYPE FUNCNAME
    6. *" VALUE(SCOPE) TYPE CHAR01 DEFAULT 'L'
    7. *" REFERENCE(ASSIGNING) TYPE CHAR01 OPTIONAL
    8. *" EXPORTING
    9. *" VALUE(SUBRC) TYPE SY-SUBRC
    10. *" VALUE(MESSAGE) TYPE CHAR100
    11. *"----------------------------------------------------------------------
    12. *******************************************************************************************
    13. ****************************************<变量声明区>***************************************
    14. *******************************************************************************************
    15. TYPES:BEGIN OF ts_text , "自定义数据结构
    16. text TYPE c LENGTH 255,
    17. END OF ts_text.
    18. DATA:
    19. lv_group TYPE rs38l-area, "函数组, 函数模块属于函数组"
    20. lv_include TYPE rs38l-include, "ABAP 程序名"
    21. lv_namespace TYPE rs38l-namespace, "名称间隔"
    22. lv_str_area TYPE rs38l-str_area, "函数组名
    23. ls_header_fb TYPE header_fb, "Header Data From Function Builder"
    24. lt_tables TYPE rsfb_para WITH HEADER LINE, "Table with Parameters, Visualization"
    25. lt_import TYPE rsfb_para WITH HEADER LINE, "Table with Parameters, Visualization"
    26. lt_export TYPE rsfb_para WITH HEADER LINE, "Table with Parameters, Visualization"
    27. lt_change TYPE rsfb_para WITH HEADER LINE, "Table with Parameters, Visualization"
    28. lt_code TYPE TABLE OF ts_text WITH HEADER LINE, "定义数据内表
    29. lv_lines TYPE i. "Code lines"
    30. "
    31. DATA:lcl_abap_typedescr TYPE REF TO cl_abap_typedescr. "定义类型参考"
    32. * 定义宏
    33. DEFINE add_code.
    34. CLEAR lt_code.
    35. CASE &1.
    36. WHEN 'V'.
    37. lt_code-text = | { scope }V_{ &2 } TYPE { &3 } , "--{ &4 }| .
    38. WHEN 'S'.
    39. lt_code-text = | { scope }S_{ &2 } TYPE { &3 } , "--{ &4 }| .
    40. WHEN 'T'.
    41. lt_code-text = | { scope }T_{ &2 } TYPE TABLE OF { &3 } WITH HEADER LINE , "--{ &4 }| .
    42. WHEN 'SS'.
    43. lt_code-text = | { &2 } = { scope }S_{ &2 } "--{ &4 }| .
    44. WHEN 'VV'.
    45. lt_code-text = | { &2 } = { scope }V_{ &2 } "--{ &4 }| .
    46. WHEN 'TT'.
    47. lt_code-text = | { &2 } = { scope }T_{ &2 }[] "--{ &4 }| .
    48. WHEN OTHERS.
    49. ENDCASE.
    50. APPEND lt_code.
    51. END-OF-DEFINITION.
    52. *******************************************************************************************
    53. ****************************************<逻辑处理区>***************************************
    54. *******************************************************************************************
    55. *---------------------------检查函数是否存在-----------------------------*
    56. CONDENSE funcname NO-GAPS.
    57. TRANSLATE funcname TO UPPER CASE.
    58. CONDENSE scope NO-GAPS.
    59. TRANSLATE scope TO UPPER CASE.
    60. IF scope IS INITIAL.
    61. scope = 'L'.
    62. ENDIF.
    63. CALL FUNCTION 'FUNCTION_EXISTS'
    64. EXPORTING
    65. funcname = funcname
    66. IMPORTING
    67. group = lv_group
    68. include = lv_include
    69. namespace = lv_namespace
    70. str_area = lv_str_area
    71. EXCEPTIONS
    72. function_not_exist = 1
    73. OTHERS = 2.
    74. * 获取返回状态
    75. subrc = sy-subrc.
    76. IF subrc <> 0.
    77. * 异常:终止运行
    78. EXIT.
    79. ELSE.
    80. * 正常:继续运行
    81. *----------------------------获取函数参数信息----------------------------*
    82. ls_header_fb-area = lv_namespace && lv_str_area .
    83. ls_header_fb-name = funcname .
    84. CALL METHOD cl_fb_parameter_db=>read
    85. IMPORTING
    86. tables = lt_tables[]
    87. import = lt_import[]
    88. export = lt_export[]
    89. change = lt_change[]
    90. * oparam =
    91. * nparam =
    92. * fparam =
    93. * o_param_docu =
    94. * n_param_docu =
    95. * docu =
    96. * except =
    97. * frparam =
    98. CHANGING
    99. header = ls_header_fb
    100. EXCEPTIONS
    101. cancelled = 1
    102. OTHERS = 2.
    103. * 获取返回状态
    104. subrc = sy-subrc.
    105. IF subrc <> 0.
    106. * 异常:终止运行
    107. EXIT.
    108. ELSE.
    109. * 正常:继续处理
    110. *----------------------------函数参数定义生成----------------------------*
    111. FREE:lt_code.
    112. lt_code-text = |"函数:{ funcname }参数定义如下:" |.
    113. APPEND lt_code.
    114. lt_code-text = 'DATA:'.
    115. APPEND lt_code.
    116. CLEAR lt_code.
    117. * 导入参数:
    118. IF lt_import[] IS NOT INITIAL.
    119. lt_code-text = '"IMPORT_PARAMETERS:"'.
    120. APPEND lt_code.
    121. LOOP AT lt_import.
    122. lcl_abap_typedescr ?= cl_abap_typedescr=>describe_by_name( lt_import-structure ).
    123. CALL METHOD lcl_abap_typedescr->get_ddic_header
    124. RECEIVING
    125. p_header = DATA(lv_header)
    126. EXCEPTIONS
    127. not_found = 1
    128. no_ddic_type = 2
    129. OTHERS = 3.
    130. CASE lv_header-tabtype.
    131. WHEN 'J'.
    132. SELECT SINGLE ddtext INTO @DATA(lv_ddtext) FROM dd02t
    133. WHERE tabname = @lt_import-structure AND ddlanguage = '1'.
    134. add_code 'S' lt_import-parameter lt_import-structure lv_ddtext.
    135. WHEN 'E'.
    136. SELECT SINGLE ddtext INTO @lv_ddtext FROM dd04t
    137. WHERE rollname = @lv_header-tabname AND ddlanguage = '1'.
    138. add_code 'V' lt_import-parameter lt_import-structure lv_ddtext.
    139. WHEN OTHERS.
    140. ENDCASE.
    141. ENDLOOP.
    142. ENDIF.
    143. * 导出参数:
    144. IF lt_export[] IS NOT INITIAL.
    145. lt_code-text = '"EXPORT_PARAMETERS:"'.
    146. APPEND lt_code.
    147. LOOP AT lt_export.
    148. lcl_abap_typedescr ?= cl_abap_typedescr=>describe_by_name( lt_export-structure ).
    149. CALL METHOD lcl_abap_typedescr->get_ddic_header
    150. RECEIVING
    151. p_header = lv_header
    152. EXCEPTIONS
    153. not_found = 1
    154. no_ddic_type = 2
    155. OTHERS = 3.
    156. CASE lv_header-tabtype.
    157. WHEN 'J'.
    158. SELECT SINGLE ddtext INTO lv_ddtext FROM dd02t
    159. WHERE tabname = lt_export-structure AND ddlanguage = '1'.
    160. add_code 'S' lt_export-parameter lt_export-structure lv_ddtext.
    161. WHEN 'E'.
    162. SELECT SINGLE ddtext INTO @lv_ddtext FROM dd04t
    163. WHERE rollname = @lv_header-tabname AND ddlanguage = '1'.
    164. add_code 'V' lt_export-parameter lt_export-structure lv_ddtext.
    165. WHEN OTHERS.
    166. ENDCASE.
    167. ENDLOOP.
    168. ENDIF.
    169. * 更改参数:
    170. IF lt_change[] IS NOT INITIAL.
    171. lt_code-text = '"CHANGE_PARAMETERS:"'.
    172. APPEND lt_code.
    173. LOOP AT lt_change.
    174. lcl_abap_typedescr ?= cl_abap_typedescr=>describe_by_name( lt_change-structure ).
    175. CALL METHOD lcl_abap_typedescr->get_ddic_header
    176. RECEIVING
    177. p_header = lv_header
    178. EXCEPTIONS
    179. not_found = 1
    180. no_ddic_type = 2
    181. OTHERS = 3.
    182. CASE lv_header-tabtype.
    183. WHEN 'J'.
    184. SELECT SINGLE ddtext INTO lv_ddtext FROM dd02t
    185. WHERE tabname = lt_change-structure AND ddlanguage = '1'.
    186. add_code 'S' lt_change-parameter lt_change-structure lv_ddtext.
    187. WHEN 'E'.
    188. SELECT SINGLE ddtext INTO @lv_ddtext FROM dd04t
    189. WHERE rollname = @lv_header-tabname AND ddlanguage = '1'.
    190. add_code 'V' lt_change-parameter lt_change-structure lv_ddtext.
    191. WHEN OTHERS.
    192. ENDCASE.
    193. ENDLOOP.
    194. ENDIF.
    195. * 表参数:
    196. IF lt_tables[] IS NOT INITIAL.
    197. lt_code-text = '"TABLES_PARAMETERS:"'.
    198. APPEND lt_code.
    199. LOOP AT lt_tables.
    200. SELECT SINGLE ddtext INTO lv_ddtext FROM dd02t
    201. WHERE tabname = lt_tables-structure AND ddlanguage = '1'.
    202. add_code 'T' lt_tables-parameter lt_tables-structure lv_ddtext.
    203. ENDLOOP.
    204. ENDIF.
    205. CASE lines( lt_code[] ).
    206. WHEN '1'.
    207. FREE lt_code[].
    208. EXIT.
    209. WHEN OTHERS.
    210. lv_lines = lines( lt_code[] ).
    211. READ TABLE lt_code INDEX lv_lines.
    212. IF sy-subrc = 0.
    213. REPLACE ',' WITH '.' INTO lt_code-text.
    214. MODIFY lt_code INDEX lv_lines.
    215. ENDIF.
    216. ENDCASE.
    217. *-----------------------------函数参数赋值-------------------------------*
    218. IF assigning IS NOT INITIAL.
    219. "添加间隔"
    220. DO 5 TIMES.
    221. APPEND INITIAL LINE TO lt_code[].
    222. ENDDO.
    223. lt_code-text = 'CALL FUNCTION' && | '{ funcname }'|.
    224. APPEND lt_code.
    225. * 导入参数:
    226. IF lt_import[] IS NOT INITIAL.
    227. lt_code-text = ' EXPORTING'.
    228. APPEND lt_code.
    229. LOOP AT lt_import.
    230. lcl_abap_typedescr ?= cl_abap_typedescr=>describe_by_name( lt_import-structure ).
    231. CALL METHOD lcl_abap_typedescr->get_ddic_header
    232. RECEIVING
    233. p_header = lv_header
    234. EXCEPTIONS
    235. not_found = 1
    236. no_ddic_type = 2
    237. OTHERS = 3.
    238. CASE lv_header-tabtype.
    239. WHEN 'J'.
    240. SELECT SINGLE ddtext INTO lv_ddtext FROM dd02t
    241. WHERE tabname = lt_import-structure AND ddlanguage = '1'.
    242. add_code 'SS' lt_import-parameter '' lv_ddtext.
    243. WHEN 'E'.
    244. SELECT SINGLE ddtext INTO @lv_ddtext FROM dd04t
    245. WHERE rollname = @lv_header-tabname AND ddlanguage = '1'.
    246. add_code 'VV' lt_import-parameter '' lv_ddtext.
    247. WHEN OTHERS.
    248. ENDCASE.
    249. ENDLOOP.
    250. ENDIF.
    251. * 导出参数:
    252. IF lt_export[] IS NOT INITIAL.
    253. lt_code-text = ' IMPORTING'.
    254. APPEND lt_code.
    255. LOOP AT lt_export.
    256. lcl_abap_typedescr ?= cl_abap_typedescr=>describe_by_name( lt_export-structure ).
    257. CALL METHOD lcl_abap_typedescr->get_ddic_header
    258. RECEIVING
    259. p_header = lv_header
    260. EXCEPTIONS
    261. not_found = 1
    262. no_ddic_type = 2
    263. OTHERS = 3.
    264. CASE lv_header-tabtype.
    265. WHEN 'J'.
    266. SELECT SINGLE ddtext INTO lv_ddtext FROM dd02t
    267. WHERE tabname = lt_export-structure AND ddlanguage = '1'.
    268. add_code 'SS' lt_export-parameter '' lv_ddtext.
    269. WHEN 'E'.
    270. SELECT SINGLE ddtext INTO @lv_ddtext FROM dd04t
    271. WHERE rollname = @lv_header-tabname AND ddlanguage = '1'.
    272. add_code 'VV' lt_export-parameter '' lv_ddtext.
    273. WHEN OTHERS.
    274. ENDCASE.
    275. ENDLOOP.
    276. ENDIF.
    277. * 更改参数:
    278. IF lt_change[] IS NOT INITIAL.
    279. lt_code-text = ' CHANGING'.
    280. APPEND lt_code.
    281. LOOP AT lt_change.
    282. lcl_abap_typedescr ?= cl_abap_typedescr=>describe_by_name( lt_change-structure ).
    283. CALL METHOD lcl_abap_typedescr->get_ddic_header
    284. RECEIVING
    285. p_header = lv_header
    286. EXCEPTIONS
    287. not_found = 1
    288. no_ddic_type = 2
    289. OTHERS = 3.
    290. CASE lv_header-tabtype.
    291. WHEN 'J'.
    292. SELECT SINGLE ddtext INTO lv_ddtext FROM dd02t
    293. WHERE tabname = lt_change-structure AND ddlanguage = '1'.
    294. add_code 'SS' lt_change-parameter '' lv_ddtext.
    295. WHEN 'E'.
    296. SELECT SINGLE ddtext INTO @lv_ddtext FROM dd04t
    297. WHERE rollname = @lv_header-tabname AND ddlanguage = '1'.
    298. add_code 'VV' lt_change-parameter '' lv_ddtext.
    299. WHEN OTHERS.
    300. ENDCASE.
    301. ENDLOOP.
    302. ENDIF.
    303. * 表参数:
    304. IF lt_tables[] IS NOT INITIAL.
    305. lt_code-text = ' TABLES'.
    306. APPEND lt_code.
    307. LOOP AT lt_tables.
    308. SELECT SINGLE ddtext INTO lv_ddtext FROM dd02t
    309. WHERE tabname = lt_tables-structure AND ddlanguage = '1'.
    310. add_code 'TT' lt_tables-parameter '' lv_ddtext.
    311. ENDLOOP.
    312. ENDIF.
    313. CASE lines( lt_code[] ).
    314. WHEN '1'.
    315. FREE lt_code[].
    316. EXIT.
    317. WHEN OTHERS.
    318. lv_lines = lines( lt_code[] ).
    319. READ TABLE lt_code INDEX lv_lines.
    320. IF sy-subrc = 0.
    321. CONCATENATE lt_code-text '.' INTO lt_code-text.
    322. MODIFY lt_code INDEX lv_lines.
    323. ENDIF.
    324. ENDCASE.
    325. ENDIF.
    326. *----------------------------复制内容到剪切板----------------------------*
    327. CALL METHOD cl_gui_frontend_services=>clipboard_export
    328. IMPORTING
    329. data = lt_code[]
    330. CHANGING
    331. rc = subrc
    332. EXCEPTIONS
    333. cntl_error = 1
    334. error_no_gui = 2
    335. not_supported_by_gui = 3
    336. no_authority = 4
    337. OTHERS = 5.
    338. IF sy-subrc = subrc.
    339. message = |已复制到剪切板|.
    340. MESSAGE message TYPE 'S'.
    341. ENDIF.
    342. ENDIF.
    343. ENDIF.
    344. ENDFUNCTION.