需求描述
- ZMMT100中项目保存时需查找是否存在与保存行中“运费类型描述”值相同的行
- 如果存在,继续校验当前保存行的“运输类型”+“运费类型代码”与“运费类型描述”相同行的“运输类型”+“运费类型代码”是否完全一致
- 如果不一致则报错“已存在相同描述的运费类型代码”
实现效果
实现步骤
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左边字段内容即将发生变化时,执行代码段。