本篇文章会用到SAP abap oop 相关知识,可参考如下连接:
SAP OO面向对象理论知识(部分一)
SAP OO面向对象理论知识(部分二)
SAP ABAP OOP面向对象(一)
SAP OO面向对象 求圆的周长Demo(二)
可参考Jerry博客:
SAP ABAP关键字语法图和ABAP代码自动生成工具Code Composer
代码自动生成思路
- 首先我先创建一个
INCLUDE
包含文件,在这个文件中编写我们的要自动生成的代码模板. - 其次就是创建一个
REPORT
可执行程序,用来把我们需要的参数传递给INCLUDE
包含文件的模板中 - 最后执行程序,把代码复制就ok了.
创建INCLUDE包含文件
下面的这个include
只是一个骨架,不能直接使用,需要我们对其赋值,赋的就是一些类名,方法名之类的,使之成为一个完整的程序
我们可以看到下面@
这个字符,他的作用就是处理一下条件或分支,$
美元符号就是表示的变量
如果参数:i_param-class = cl_p
那么这代码CLASS $i_param-class$ definItion.
就等价于CLASS cl_p definItion.
从效果上看是那个反斜杠是 换行,但最后的 \.
可以点出语法,具体没弄清楚.
(之前在群里讨论是控制语法的呜呜呜呜.应该不对)
*&---------------------------------------------------------------------*
*& Include ZSINGLETON_HCF_01
*& txt 使用ABAP Code Composer自动生成代码
*&---------------------------------------------------------------------*
CLASS $i_param-class$ definItion.
@if i_param-global @notinitial
\ public"
@end
\ final create private.
PUBLIC SECTION.
INTERFACES:
$i_param-interface$.
CLASS-METHODS:
s_get_instance
RETURNING
VALUE(r_ref_instance) TYPE REF TO $i_param-interface$.
@IF i_param-exception @notinitial
raising
$i_param-exception$
@end
\.
PRIVATE SECTION.
CLASS-DATA :
s_ref_songleton TYPE REF TO $i_param-interface$.
CLASS-METHODS:
s_create_instance
RETURNING
VALUE(r_ref_instance)
TYPE REF TO $i_param-class$.
@if i_param-exception @notinitial
raising
$i_param-exception$
@end
\. "
ENDCLASS.
class $i_param-class$ implementation.
method s_create_instance.
@if i_param-exception @notinitial
@end
@if i_param-exception @notinitial
data l_ref_instance type ref to $i_param-class$.
.
CREATE OBJECT l_ref_instance.
@slot object_construction
@end
r_ref_instance = l_ref_instance.
@else
create object r_ref_instance.
@end
endmethod.
method s_get_instance.
@if i_param-exception @notinitial
@end
if s_ref_singleton is not bound.
s_ref_singleton = s_create_instance( ).
endif.
r_ref_instance = s_ref_singleton.
ENDMETHOD.
ENDCLASS.
创建REPORT可执行程序
cx_root
所有全局异常的抽象类
cl_cmp_composer
SAP内部用法的代码编辑器,tab_code
是它的一个类型
*&---------------------------------------------------------------------*
*& Report ZSINGLETON_REPORT
*&---------------------------------------------------------------------*
*& txt 使用ABAP Code Composer自动生成代码
*&---------------------------------------------------------------------*
REPORT zsingleton_report.
TYPES:BEGIN OF ty_param,
class TYPE string,
global TYPE abap_bool,
interface TYPE string,
exception TYPE string,
END OF ty_param.
DATA:l_ref_composer TYPE REF TO cl_cmp_composer,
lx_root TYPE REF TO cx_root, "所有全局异常的抽象类
lv_error TYPE string,
lt_teb_code TYPE cl_cmp_composer=>tab_code,
ls_param TYPE ty_param.
START-OF-SELECTION.
ls_param-class = 'ZCL_HCF'.
ls_param-interface = 'ZIF_HCF'.
ls_param-global = ABAP_FALSE.
ls_param-exception = 'ERROR'.
*创建一个实例代码编写器
l_ref_composer = cl_cmp_composer=>s_create( ).
*确定你的上下文,通过下面的参数可以看出来是 ls_param 赋值到 i_param
l_ref_composer->add_var( i_name = 'I_PARAM' I_VALUE = ls_param ).
TRY. "捕获异常
*创建生成代码
lt_teb_code = l_ref_composer->build_code( I_TEMPLATE_INCLUDE = 'ZSINGLETON_INCLUDE' ) .
CATCH cx_root into lx_root.
" lv_error = lx_root->get_longtext( )."获取错误长文本
lv_error = lx_root->get_text( )."获取文本
WRITE: / lv_error.
return.
ENDTRY.
*输出你生成的代码
cl_demo_output=>display_data( lt_teb_code ).
生成的代码(最终结果)
下面框选住的就是我们赋值过去的数据.
总结
自动生成代码理论上是可以实现代码的复用的,可以大大提高程序员的开发效率.就按照本篇的可执行程序来说,我们其实可以 使用屏幕进行动态输入参数.
以上所述案例仅供参考