ABAP之SM30触发数据附加功能
序
HELLO,这里百里,一个学习中的ABAPER,昨天我讲了在工作中的自建立表的通过ALV的方式实现,增删改查的功能.理想还是很好,我给你做了新增,修改,删除,查询的功能. 就在昨天写完,百里看到了一个令人崩溃的东西.就是说,我可以自动带出数据的内容,一个数据都没有,吓得百里以为是程序的问题,赶紧排查,最终发现,是用户通过SM30批量导入的.那么就问.我给你做好了,为什么要用导入,然后说系统有问题呢…ε=(´ο`*)))唉 .百里赶紧通过学习发现了一个补救的方法,就是今天所讲的. SM30触发附加功能.
什么是附加功能.
其实可以理解为触发器.就是说当我进行新增,修改时.我通过指定字段修改某些字段,或者直接附加系统字段,或者是进行字段检查,权限检查等等都可以.
可以直接理解为传中sql server 的触发器.不过就是没有对应的删除触发动作 .
技术解析
创建表
通过SE11创建自建表,并在对应的表格维护生成器中生成对应的屏幕.
在SM30中屏幕增加子例程
进入SM30后,点击上面系统–>状态–>双击屏幕编号–>增加附加子例程–>调用
以上就是在SM30中,实现数据附加功能的基本原理,很简单,但是如果不会的还是很难受的.
案例
新建表
首先在SE11中 ,将属性内容选择为C即允许用户编辑修改,然后增加字段及数据元素 .
在技术设置中.
分配对应的权限组及权限对象.
最后在表格维护生成器中,进行数据维护,按照系统自动逻辑分配屏幕 .
SM表格维护生成器增加代码
标准代码
PROCESS BEFORE OUTPUT.
MODULE LISTE_INITIALISIEREN.
LOOP AT EXTRACT WITH CONTROL
TCTRL_ZCECS1220TABLE CURSOR NEXTLINE.
MODULE LISTE_SHOW_LISTE.
ENDLOOP.
*
PROCESS AFTER INPUT.
MODULE LISTE_EXIT_COMMAND AT EXIT-COMMAND.
MODULE LISTE_BEFORE_LOOP.
LOOP AT EXTRACT.
MODULE LISTE_INIT_WORKAREA.
CHAIN.
FIELD ZCECS1220TABLE-MATNR .
FIELD ZCECS1220TABLE-VKORG .
FIELD ZCECS1220TABLE-ERNAM .
FIELD ZCECS1220TABLE-ERDAT .
FIELD ZCECS1220TABLE-ERZET .
MODULE SET_UPDATE_FLAG ON CHAIN-REQUEST.
ENDCHAIN.
FIELD VIM_MARKED MODULE LISTE_MARK_CHECKBOX.
CHAIN.
FIELD ZCECS1220TABLE-MATNR .
MODULE LISTE_UPDATE_LISTE.
ENDCHAIN.
ENDLOOP.
MODULE LISTE_AFTER_LOOP.
附加子例程
IF zsdt0003e-kunnr IS NOT INITIAL.
SELECT SINGLE name1 INTO @DATA(lv_name1) FROM kna1 WHERE kunnr = @zsdt0003e-kunnr.
IF sy-subrc <> 0.
MESSAGE '客户不存在' TYPE 'E'.
ENDIF.
ELSE.
MESSAGE '客户号必输' TYPE 'E'.
ENDIF.
IF zsdt0003e-zport IS NOT INITIAL.
SELECT SINGLE ztext INTO @DATA(lv_text) FROM zkhgk WHERE zport = @zsdt0003e-zport.
IF sy-subrc <> 0.
MESSAGE '港口不存在' TYPE 'E'.
ENDIF.
ELSE.
MESSAGE '港口号必输' TYPE 'E'.
ENDIF.
IF zsdt0003e-matnr IS INITIAL.
MESSAGE '包材料号必输' TYPE 'E'.
ELSE.
SELECT SINGLE meins INTO @lv_meins FROM mara WHERE matnr = @zsdt0003e-matnr.
IF sy-subrc <> 0 .
MESSAGE '包材料号不存在' TYPE 'E'.
ELSE.
IF zsdt0003e-meins IS INITIAL.
zsdt0003e-meins = lv_meins.
ENDIF.
ENDIF.
ENDIF.
zsdt0003e-ernam = sy-uname.
zsdt0003e-erdat = sy-datum.
zsdt0003e-erzet = sy-uzeit.
调用
MODULE CHECK_DATA_E.
要注意: 使用的内容要激活,每一层及都要激活
结果
我们无论是新增,修改 都可以自动带出创建人及时间 ,这就是我们要的结果
技术总结
当你在自建表时,如果需要某些字段,需要自动带出附加的内容时,可以使用该技术. 实现类似sql中触发器的功能.
百里鸡汤
梦想,在什么地方
总是那么令人向往,我不顾一切走在路上
就是为了来到你的身旁,梦想
在不在前方,今夜的星光分外明亮
想着远方想着心上的姑娘,回头路已是那么漫长
这里是百里,一个努力的学习者. 努力学习好好记录,点滴进步,就是成功.
- 点赞
- 收藏
- 关注作者
评论(0)