怎么用ABAP 实现通用的类方法调用记录保存到数据库表,并可以用ALV查询,双击可以重调用类方法,提供一下示例代码
时间: 2024-03-01 12:56:18 浏览: 95
以下是一个示例代码,用于演示如何使用ABAP实现通用的类方法调用记录保存到数据库表,并可以用ALV查询,双击可以重调用类方法:
```abap
CLASS lcl_method_logger DEFINITION.
PUBLIC SECTION.
CLASS-METHODS:
save_method_call
IMPORTING
iv_classname TYPE string
iv_methodname TYPE string,
display_method_calls.
PRIVATE SECTION.
TYPES:
BEGIN OF ty_method_call,
id TYPE i,
classname TYPE string,
methodname TYPE string,
calltime TYPE timestampl,
END OF ty_method_call.
DATA:
mt_method_calls TYPE STANDARD TABLE OF ty_method_call.
ENDCLASS.
CLASS lcl_method_logger IMPLEMENTATION.
METHOD save_method_call.
DATA(ls_method_call) = VALUE ty_method_call(
id = lines( mt_method_calls ) + 1
classname = iv_classname
methodname = iv_methodname
calltime = sy-uzeit ).
INSERT ls_method_call INTO TABLE mt_method_calls.
COMMIT WORK.
ENDMETHOD.
METHOD display_method_calls.
DATA(lo_alv) = NEW cl_salv_table( ).
DATA(lo_model) = lo_alv->get_model( ).
lo_model->set_data( mt_method_calls ).
" set double click handler
SET HANDLER double_click FOR lo_alv.
lo_alv->display( ).
ENDMETHOD.
METHOD double_click.
DATA(lo_table) = CAST cl_salv_table( sender ).
DATA(ls_method_call) = lo_table->get_selected_line( )->get_cells( )->get_value( ).
DATA(lo_class) = cl_abap_classdescr=>get( ls_method_call-classname ).
DATA(lo_method) = lo_class->get_method_by_name( ls_method_call-methodname ).
lo_method->call( ).
ENDMETHOD.
ENDCLASS.
CLASS lcl_demo DEFINITION.
PUBLIC SECTION.
CLASS-METHODS:
sample_method.
ENDCLASS.
CLASS lcl_demo IMPLEMENTATION.
METHOD sample_method.
lcl_method_logger=>save_method_call( cl_abap_classdescr=>get_caller( )->get_name( )
me->method_name ).
ENDMETHOD.
ENDCLASS.
START-OF-SELECTION.
lcl_demo=>sample_method( ).
lcl_method_logger=>display_method_calls( ).
```
在这个示例代码中,我们定义了两个本地类:`lcl_method_logger`和`lcl_demo`。`lcl_method_logger`类有两个公共类方法:`save_method_call`和`display_method_calls`。`save_method_call`方法将调用记录添加到内部数据库表`mt_method_calls`中。`display_method_calls`方法使用ALV网格控件显示数据库表中存储的所有调用记录,并为双击事件注册了一个处理程序。
在`lcl_demo`类中,我们定义了一个名为`sample_method`的公共类方法。当`sample_method`被调用时,它会记录所调用的类名和方法名,并将该记录保存到`mt_method_calls`中。
在主程序的`START-OF-SELECTION`块中,我们调用`lcl_demo=>sample_method( )`方法,触发`save_method_call`记录日志。然后,我们调用`lcl_method_logger=>display_method_calls( )`方法,使用ALV网格控件显示所有调用记录。如果用户双击任何一行,则会调用`double_click`方法,该方法将类和方法名提取出来,并使用`call`语句调用相应的方法。
阅读全文