ABAP: SM30维护事件

日常记录一下

作为一个开发,SM30使用的频率相当高,但是有时候需要对录入的数据做校验,直接在屏幕的PAI写逻辑,不是那么方便,因此可以考虑使用事件。 

在表格维护生成器的界面 环境->修改->事件

这里因为需求是校验录入的数据是否符合条件,因此我增加了数据保存前的事件01,

然后输入FORM程序的名字,保存即可。

 

保存完后单机编辑器的按钮,就会创建一个子程序,然后在子程序中完成代码的编辑。注意子程序中的FORM名要和前面维护的名字一致,如果不一致,运行SM30的时候会弹出如下dump

FORM中完成我们需要的校验逻辑

FORM frm_check_data_before_save.

  DATA: lt_0048 LIKE TABLE OF zmmt0048,
        ls_0048 LIKE zmmt0048.
  DATA: lt_0048_tem TYPE TABLE OF zmmt0048,
        ls_0048_tem TYPE zmmt0048.
  DATA: lt_0048_sql TYPE TABLE OF zmmt0048.
  DATA: lv_zbdpe TYPE zmmt0048-zbdpe.
  DATA: lv_mess TYPE string.
  DATA: lv_error TYPE c.
  DATA: lv_matnr  TYPE mara-matnr.
  REFRESH lt_0048.

  LOOP AT total.
    IF <action> = 'U' OR <action> = 'N'.
      MOVE-CORRESPONDING <vim_total_struc> TO ls_0048.
      APPEND ls_0048 TO lt_0048.
      CLEAR ls_0048.
    ENDIF.
  ENDLOOP.
  IF lt_0048[] IS NOT INITIAL.
    REFRESH lt_0048_tem.
    lt_0048_tem[] = lt_0048[].
    SORT lt_0048_tem BY datab datbi matnr.
    DELETE ADJACENT DUPLICATES FROM lt_0048_tem COMPARING datab datbi matnr.
    REFRESH lt_0048_sql.
    "取历史数据
    SELECT * FROM zmmt0048
     INTO CORRESPONDING FIELDS OF TABLE lt_0048_sql
       FOR ALL ENTRIES IN lt_0048_tem
     WHERE datab = lt_0048_tem-datab
       AND datbi = lt_0048_tem-datbi
       AND matnr = lt_0048_tem-matnr.
    IF lt_0048_sql[] IS NOT INITIAL.
      "修改历史数据
      LOOP AT lt_0048_sql INTO ls_0048_tem.
        CLEAR ls_0048.
        READ TABLE lt_0048 INTO ls_0048 WITH KEY datab = ls_0048_tem-datab
                                                 datbi = ls_0048_tem-datbi
                                                 matnr = ls_0048_tem-matnr
                                                 lifnr = ls_0048_tem-lifnr.
        IF sy-subrc = 0.
          ls_0048_tem-zbdpe = ls_0048-zbdpe.
          MODIFY lt_0048_sql FROM ls_0048_tem TRANSPORTING zbdpe.
        ENDIF.
        CLEAR: ls_0048_tem,ls_0048.
      ENDLOOP.
      REFRESH lt_0048[].
      lt_0048[] = lt_0048_sql[].
      REFRESH lt_0048_sql.
    ENDIF.

    sy-subrc = 0.
    CLEAR: lv_zbdpe,lv_error,lv_mess.
    LOOP AT lt_0048_tem INTO ls_0048_tem.
      CLEAR: lv_zbdpe,lv_error,lv_mess.
      LOOP AT lt_0048 INTO ls_0048 WHERE datab = ls_0048_tem-datab
                                      AND datbi = ls_0048_tem-datbi
                                      AND matnr = ls_0048_tem-matnr.
        lv_zbdpe = lv_zbdpe + ls_0048-zbdpe.
      ENDLOOP.
      IF lv_zbdpe NE 100.
        lv_mess = '标段期间' && ls_0048_tem-datab && '到' && ls_0048_tem-datbi.
        lv_error = 'E'.
        EXIT.
      ENDIF.


    ENDLOOP.
    IF lv_error = 'E'.
      sy-subrc = 4.
      vim_abort_saving = 'X'.
      MESSAGE s001(00) WITH lv_mess '物料' ls_0048_tem-matnr
                  '配额不等于100,请检查数据' DISPLAY LIKE 'E'.
    ENDIF.
  ELSE.
    sy-subrc = 0.
  ENDIF.
ENDFORM.                    "frm_check_data_before_save

<think>嗯,用户想知道在ABAP中如何通过SM30进行维护检查的最佳实践。首先,我需要回顾一下SM30的基本功能。SM30是SAP用来维护表视图的工具,允许用户对数据库表进行增删改查操作。维护检查通常涉及数据完整性和业务规则的执行,所以用户可能希望确保输入的数据符合特定条件。 接下来,我得考虑维护检查的几种实现方式。首先想到的是维护事件,比如在保存前触发检查。ABAP中有维护事件如`before_save`和`after_save`,用户可以在这些事件中编写校验逻辑。例如,在`before_save`中检查必填字段是否填写,或者在`after_save`中进行更复杂的业务逻辑验证。 然后,使用维护检查函数`VIEWPROCESS`也是一个常见方法。这个函数可以在维护视图时被调用,允许开发者在特定点插入检查逻辑。比如,检查输入的数据是否符合某些业务规则,如果不符合就阻止保存。 另外,增强点或BADI可能也是用户需要的。通过使用增强技术,比如隐式增强点`EHV5*`,可以在标准维护流程中添加自定义检查,而无需修改SAP的标准代码。这对于保持系统升级的兼容性很重要。 然后,用户可能需要了解如何在代码中具体实现这些检查。比如,在维护事件中编写FORM子程序,使用`FIELD_VALUE`函数获取字段值并进行判断。如果有错误,使用`E`类型的消息来阻止保存,或者`W`类型给出警告。此外,事务代码SE54用于生成维护对话框,这里也可以配置一些检查逻辑。 还有需要考虑权限检查,确保只有授权用户才能修改数据。这可能涉及在检查逻辑中集成权限对象检查,比如使用AUTHORITY-CHECK语句。 用户可能还关心如何测试和维护这些检查逻辑,比如使用SM30直接测试,或者通过调试工具跟踪代码执行。此外,性能优化也是一个方面,比如避免在检查中使用复杂的数据库查询,以免影响响应速度。 最后,总结这些方法的最佳实践,应该包括使用标准事件和函数,合理使用增强技术,编写清晰的错误消息,以及进行充分的测试。同时,保持代码的可维护性和遵循SAP的标准开发规范也很重要。</think>### ABAP SM30维护视图检查最佳实践 #### 1. 使用维护事件校验 在视图维护对话框的`Events`选项卡中配置校验逻辑: ```abap FORM before_save. LOOP AT total. IF <action> = 'U' OR <action> = 'I'. IF <vim_total_struc>-field1 IS INITIAL. MESSAGE e001(zmsg) WITH '字段1必须填写'. ENDIF ENDIF ENDLOOP. ENDFORM. ``` 使用`FIELD_VALUE`函数获取字段值,`MESSAGE e...`阻止非法数据保存[^1] #### 2. 实现维护检查函数 在`VIEWPROCESS`函数模块中添加检查: ```abap CASE function. WHEN 'CHECK'. IF sy-tcode = 'SM30'. IF vim_object_viewkey-field2 < 0. RAISE EXCEPTION TYPE cx_sy_arithmetic_error. ENDIF ENDIF. ENDCASE. ``` #### 3. 增强点应用 通过隐式增强点`EHV5*`添加业务规则: ```abap ENHANCEMENT 1 ZEHV5XXX. IF sy-tcode = 'SM30' AND vim_object_viewkey-field3 NOT IN valid_range. MESSAGE e098(zmsg) DISPLAY LIKE 'E'. ENDIF. ENDENHANCEMENT. ``` #### 4. 权限控制 在`AUTH_CHECK`事件中集成权限检查: ```abap FORM authority_check USING value(activity) TYPE activ_auth. AUTHORITY-CHECK OBJECT 'S_TCODE' ID 'TCD' FIELD 'SM30' ID 'ACTVT' FIELD activity. IF sy-subrc <> 0. MESSAGE e208(00) WITH '无操作权限'. ENDIF. ENDFORM. ``` #### 5. 事务配置要点 通过事务代码SE54配置时: - 在`Maintenance Screens`设置检查表外键约束 - 激活`Check Required Fields`自动校验必填项 - 使用`Technical Settings`设置日志记录
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值