ABAP: SM30维护事件

35 篇文章 1 订阅

日常记录一下

作为一个开发,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

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值