【背景】
SM30在维护自建表中,经常需要后台自动填充和修改一些值,比如创建者、创建日期、创建时间、修改者、修改日期、修改时间等。
【实现】
这些是通过SE54中的“事件(EVENT)”来实现的。
实例:SM30自动填充创建者、创建日期、创建时间、修改者、修改日期、修改时间
STEP1 首先准备一张自建表
STEP2创建表维护.
新增维护视图,点击“表维护生成器”
PS:也可以使用SE54创建
STEP3创建事件
在“表维护生成器”界面,选择菜单路径:“环境”-->"修改"-->“事件”。
STEP4添加新条目
01 在数据库保存前触发
05 建立新的条目
21填充隐藏字段
点击例程后面的编辑器按钮,跳转到对应的自定义include文件中,代码实现。
创建子程序
DEFINE assign_field.
ASSIGN COMPONENT &1 OF STRUCTURE <ls_maintview> TO <lv_field>.
IF sy-subrc = 0.
IF <lv_field> IS ASSIGNED.
<lv_field> = &2.
ENDIF.
ENDIF.
END-OF-DEFINITION.
*&---------------------------------------------------------------------*
*& 新增记录触发事件
*&---------------------------------------------------------------------*
FORM create_entry.
FIELD-SYMBOLS:
<ls_maintview> TYPE any,
<lv_field> TYPE any.
CHECK x_header-maintview IS NOT INITIAL.
ASSIGN (x_header-maintview) TO <ls_maintview>.
CHECK sy-subrc = 0.
CHECK <ls_maintview> IS ASSIGNED.
assign_field 'DATUM' sy-datum.
assign_field 'UZEIT' sy-uzeit.
assign_field 'CNAME' sy-uname.
ENDFORM.
*&---------------------------------------------------------------------*
*& 修改记录触发事件
*&---------------------------------------------------------------------*
FORM change_entry.
DATA:
lo_data TYPE REF TO data,
lv_tabix TYPE sy-tabix.
FIELD-SYMBOLS:
<ls_maintview> TYPE any,
<lv_field> TYPE any.
IF x_header-maintview IS NOT INITIAL.
CREATE DATA lo_data TYPE (x_header-maintview).
IF lo_data IS BOUND.
ASSIGN lo_data->* TO <ls_maintview>.
ENDIF.
IF <ls_maintview> IS ASSIGNED.
IF <action> = 'U'.
LOOP AT total.
READ TABLE extract WITH KEY <vim_xtotal_key>.
IF sy-subrc = 0.
lv_tabix = sy-tabix.
ELSE.
CONTINUE.
ENDIF.
IF <action> = 'U'.
CLEAR <ls_maintview>.
MOVE-CORRESPONDING <vim_total_struc> TO <ls_maintview>.
assign_field 'AEDAT' sy-datum.
assign_field 'AEZET' sy-uzeit.
assign_field 'UNAME' sy-uname.
MOVE-CORRESPONDING <ls_maintview> TO <vim_total_struc>.
MODIFY total.
extract = total.
MODIFY extract INDEX lv_tabix.
ENDIF.
ENDLOOP.
ENDIF.
ENDIF.
ENDIF.
sy-subrc = 0.
ENDFORM.
TIPS: 新增的include文件如果没有自动包含到维护视图函数组对应的SAPL*程序中,需要手动加下,不然找不到报错。