CLASS lcl_rental DEFINITION. PUBLIC SECTION. METHODS: on_vehicle_created FOR EVENT vehicle_created OF lcl_vehicle IMPORTING !iv_make !sender. " 预定义参数 SENDER ENDCLASS.
CLASS lcl_rental IMPLEMENTATION. METHOD on_vehicle_created. " sender 指向触发事件的对象 " iv_make 包含事件传递的数据 APPEND sender TO mt_vehicles. ENDMETHOD. ENDCLASS.
处理器规则:
FOR EVENT evt OF class — 指定事件和定义事件的类
处理器参数 = 事件的 EXPORTING 参数 (用 IMPORTING 接收)
SENDER 是预定义隐式参数,类型为 REF TO 触发事件的类
处理器也可以被显式调用 (CALL METHOD handler)
注册事件处理
1 2 3 4 5 6 7 8 9 10 11 12
" 注册特定实例的事件 SET HANDLER lo_rental->on_vehicle_created FOR lo_vehicle.
" 注册所有实例的事件 SET HANDLER lo_rental->on_vehicle_created FOR ALL INSTANCES.
" 取消注册 SET HANDLER lo_rental->on_vehicle_created FOR lo_vehicle ACTIVATION space.
" 只处理 Bus IF lv_classname = 'LCL_BUS'. APPEND sender TO mt_vehicles. ENDIF. ENDMETHOD.
常用方法对比
方法
所属类
返回
用途
describe_by_data( data )
CL_ABAP_TYPEDESCR
类型描述
分析数据类型
describe_by_object_ref( ref )
CL_ABAP_TYPEDESCR
类描述
分析对象类型
describe_by_name( name )
CL_ABAP_TYPEDESCR
类型描述
通过名称获取
get_relative_name( )
CL_ABAP_OBJECTDESCR
类名
获取相对类名
components
CL_ABAP_STRUCTDESCR
内表
结构组件列表
RTTC (Run Time Type Creation)
从 SAP Web AS 6.40 开始,可以动态创建类型:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
" 动态创建结构类型 DATA: lt_components TYPE cl_abap_structdescr=>component_table.
" 添加组件 APPEND VALUE #( name = 'CARRID' type = cl_abap_elemdescr=>get_c( 3 ) ) TO lt_components. APPEND VALUE #( name = 'PRICE' type = cl_abap_elemdescr=>get_p( length = 15 decimals = 2 ) ) TO lt_components.
" 获取表类别 CASE lo_table->table_kind. WHEN cl_abap_tabledescr=>tablekind_std. WRITE: / '标准表'. WHEN cl_abap_tabledescr=>tablekind_sorted. WRITE: / '排序表'. WHEN cl_abap_tabledescr=>tablekind_hashed. WRITE: / '哈希表'. WHEN cl_abap_tabledescr=>tablekind_any. WRITE: / '任意表类型'. ENDCASE.
" 获取键信息 DATA(lt_keys) = lo_table->key. LOOP AT lt_keys INTO DATA(ls_key). WRITE: / '键组件:', ls_key-name. ENDLOOP.
" 检查唯一性 IF lo_table->has_unique_key = abap_true. WRITE: / '键是唯一的'. ENDIF.
" 第5步:创建数据对象 DATA: lo_data_ref TYPE REF TO data. CREATE DATA lo_data_ref TYPE HANDLE lo_table. FIELD-SYMBOLS: <lt_dynamic> TYPE STANDARD TABLE. ASSIGN lo_data_ref->* TO <lt_dynamic>.
" 第6步:填充数据(使用字段符号动态访问) DATA(lo_row_ref) = cl_abap_structdescr=>create( lt_components ). CREATE DATA lo_row TYPE HANDLE lo_row_ref. ASSIGN lo_row->* TO FIELD-SYMBOL(<ls_row>). ASSIGN COMPONENT 'FIELD1' OF STRUCTURE <ls_row> TO FIELD-SYMBOL(<lv_val>). <lv_val> = 'Hello'. APPEND <ls_row> TO <lt_dynamic>.
" 创建数据对象 DATA: lo_table_ref TYPE REF TO data, lo_row_ref TYPE REF TO data. CREATE DATA lo_table_ref TYPE HANDLE lo_table_type. CREATE DATA lo_row_ref TYPE HANDLE lo_struct.
FIELD-SYMBOLS: <lt_table> TYPE STANDARD TABLE, <ls_row> TYPE any. ASSIGN lo_table_ref->* TO <lt_table>. ASSIGN lo_row_ref->* TO <ls_row>.
" 插入数据 DO 5 TIMES. ASSIGN COMPONENT 'FIELD1' OF STRUCTURE <ls_row> TO FIELD-SYMBOL(<lv_f1>). <lv_f1> = sy-index * 10.
ASSIGN COMPONENT 'FIELD2' OF STRUCTURE <ls_row> TO FIELD-SYMBOL(<lv_f2>). <lv_f2> = |记录 { sy-index }|.
WRITE: / '表类型:', SWITCH string( lo_tab_info->table_kind WHEN cl_abap_tabledescr=>tablekind_std THEN '标准表' WHEN cl_abap_tabledescr=>tablekind_sorted THEN '排序表' WHEN cl_abap_tabledescr=>tablekind_hashed THEN '哈希表' ).
" 表类型 WRITE: / '表类型:', SWITCH string( lo_table->table_kind WHEN cl_abap_tabledescr=>tablekind_std THEN '标准表' WHEN cl_abap_tabledescr=>tablekind_sorted THEN '排序表' WHEN cl_abap_tabledescr=>tablekind_hashed THEN '哈希表' ).
LOOP AT lt_comp INTO DATA(ls_col). DATA(lv_type) = SWITCH string( ls_col-type->type_kind WHEN 'I' THEN 'INT' WHEN 'C' THEN 'CHAR' WHEN 'P' THEN 'PACK' WHEN 'D' THEN 'DATE' WHEN 'T' THEN 'TIME' WHEN 'g' THEN 'STRG' WHEN 'h' THEN 'TTAB' ELSE ls_col-type->type_kind ).
CLASS zcx_insufficient_balance DEFINITION INHERITING FROM cx_static_check. PUBLIC SECTION. DATA: mv_current_balance TYPE wrbtr, mv_required_amount TYPE wrbtr. ENDCLASS.
" ---- 自定义异常类 ---- CLASS zcx_transfer_error DEFINITION INHERITING FROM cx_static_check. PUBLIC SECTION. DATA: mv_from_account TYPE string, mv_to_account TYPE string, mv_amount TYPE wrbtr. METHODS: constructor IMPORTING iv_from_account TYPE string OPTIONAL iv_to_account TYPE string OPTIONAL iv_amount TYPE wrbtr OPTIONAL previous TYPE REF TO cx_root OPTIONAL. ENDCLASS.
" ---- 银行账户类 ---- CLASS lcl_bank_account DEFINITION. PUBLIC SECTION. METHODS: transfer IMPORTING io_to_account TYPE REF TO lcl_bank_account iv_amount TYPE wrbtr RAISING zcx_transfer_error, get_balance RETURNING VALUE(rv_balance) TYPE wrbtr. DATA: mv_balance TYPE wrbtr, mv_account_id TYPE string. ENDCLASS.
CLASS lcl_bank_account IMPLEMENTATION. METHOD transfer. " 金额有效性检查 IF iv_amount <= 0. RAISE EXCEPTION NEW zcx_transfer_error( iv_from_account = mv_account_id iv_to_account = io_to_account->mv_account_id iv_amount = iv_amount ). ENDIF.
CLASS lcl_calculator DEFINITION. PUBLIC SECTION. METHODS: divide IMPORTING !iv_a TYPE i !iv_b TYPE i RETURNING VALUE(rv_result) TYPE decfloat16 RAISING cx_sy_arithmetic_overflow. " 声明传播 ENDCLASS.
" 使用消息类的异常 METHODS: constructor IMPORTING !textid LIKE if_t100_message=>t100key OPTIONAL !previous TYPE REF TO cx_root OPTIONAL !msgv1 TYPE sy-msgv1 OPTIONAL.
局部异常类
1 2 3 4 5 6
CLASS lcx_error DEFINITION INHERITING FROM cx_static_check. PUBLIC SECTION. DATA: mv_message TYPE string. METHODS: constructor IMPORTING !iv_message TYPE string. ENDCLASS.