日常记录一下
作为一个开发,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