ABAP SM30保存校验

这篇博客介绍了如何在SAP系统中实现表维护的保存事件,通过检查是否存在相同描述的运费类型代码来确保数据的唯一性。作者使用FORM子程序进行校验,通过循环遍历、删除重复项和错误提示来防止重复记录的保存。在较旧的SAP系统版本中,由于不支持GROUP BY语法,作者采用了AT END OF来处理数据分组。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

需求描述

  1. ZMMT100中项目保存时需查找是否存在与保存行中“运费类型描述”值相同的行
  2. 如果存在,继续校验当前保存行的“运输类型”+“运费类型代码”与“运费类型描述”相同行的“运输类型”+“运费类型代码”是否完全一致
  3. 如果不一致则报错“已存在相同描述的运费类型代码”

实现效果

在这里插入图片描述

实现步骤

1.1 打开表维护生成器

在这里插入图片描述

1.2 环境-事件

在这里插入图片描述

1.3 实现FORM子程序

这里有很多表维护对话事件,我这里是使用了01事件
在这里插入图片描述

1.4 子程序源码

*----------------------------------------------------------------------*
***INCLUDE LZMMT037F01.
*----------------------------------------------------------------------*

FORM check_save_zmmt037.
  DATA:BEGIN OF ls_temp,
         ztranstype LIKE zmmt037-ztranstype,
         zfrename   LIKE zmmt037-zfrename,
         zfretype   LIKE zmmt037-zfretype,
       END OF ls_temp,
       lt_temp LIKE TABLE OF ls_temp.

  DATA:lt_zmmt037 TYPE TABLE OF zmmt037,
       ls_zmmt037 TYPE          zmmt037.

  DATA:lv_count TYPE i,
       lv_flag.

  LOOP AT total.
    IF <action> NE 'D' AND
       <action> NE 'X' .
      APPEND <vim_total_struc> TO lt_zmmt037.
    ENDIF.
  ENDLOOP.

  REFRESH:lt_temp.
  IF lt_zmmt037[] IS NOT INITIAL.
    LOOP AT lt_zmmt037 INTO ls_zmmt037.
      CLEAR ls_temp.
      ls_temp-ztranstype = ls_zmmt037-ztranstype.
      CONDENSE ls_temp-ztranstype NO-GAPS.

      ls_temp-zfretype = ls_zmmt037-zfretype.
      CONDENSE ls_temp-zfretype NO-GAPS.

      ls_temp-zfrename = ls_zmmt037-zfrename.
      CONDENSE ls_temp-zfrename NO-GAPS.
      APPEND ls_temp TO lt_temp.
    ENDLOOP.

    CLEAR:lv_flag,lv_count.

    SORT lt_temp BY ztranstype zfrename zfretype.
    DELETE ADJACENT DUPLICATES FROM lt_temp COMPARING ztranstype zfrename zfretype.

    LOOP AT lt_temp INTO ls_temp.
      ADD 1 TO lv_count.
      AT END OF zfrename.
        IF lv_count > 1.
          lv_flag = abap_true.
          EXIT.
        ELSE.
          CLEAR lv_count.
        ENDIF.
      ENDAT.
    ENDLOOP.

  ENDIF.

  IF lv_flag IS NOT INITIAL.
    MESSAGE '已存在相同描述的运费类型代码' TYPE 'S' DISPLAY LIKE 'E'.
    vim_abort_saving = abap_true."c_abrt_save.
    sy-subrc = 4.
  ENDIF.
ENDFORM.

1.5 反思总结

这里对内表做分类汇总的时候可以使用group by,但是由于我们的系统版本比较老,不支持这个语法,我就使用了at end of。在使用at end of的也遇到了一个小坑,是包括f字段的。

2. AT END OF F.
        代码段..
    ENDAT.
当f字段以及f左边字段内容即将发生变化时,执行代码段。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值