ABAP之SM30触发数据附加功能

举报
百里丶落云 发表于 2023/01/18 10:37:48 2023/01/18
【摘要】 序HELLO,这里百里,一个学习中的ABAPER,昨天我讲了在工作中的自建立表的通过ALV的方式实现,增删改查的功能.理想还是很好,我给你做了新增,修改,删除,查询的功能. 就在昨天写完,百里看到了一个令人崩溃的东西.就是说,我可以自动带出数据的内容,一个数据都没有,吓得百里以为是程序的问题,赶紧排查,最终发现,是用户通过SM30批量导入的.那么就问.我给你做好了,为什么要用导入,然后说系...

HELLO,这里百里,一个学习中的ABAPER,昨天我讲了在工作中的自建立表的通过ALV的方式实现,增删改查的功能.理想还是很好,我给你做了新增,修改,删除,查询的功能. 就在昨天写完,百里看到了一个令人崩溃的东西.就是说,我可以自动带出数据的内容,一个数据都没有,吓得百里以为是程序的问题,赶紧排查,最终发现,是用户通过SM30批量导入的.那么就问.我给你做好了,为什么要用导入,然后说系统有问题呢…ε=(´ο`*)))唉 .百里赶紧通过学习发现了一个补救的方法,就是今天所讲的. SM30触发附加功能.

什么是附加功能.

其实可以理解为触发器.就是说当我进行新增,修改时.我通过指定字段修改某些字段,或者直接附加系统字段,或者是进行字段检查,权限检查等等都可以.
可以直接理解为传中sql server 的触发器.不过就是没有对应的删除触发动作 .

技术解析

创建表

通过SE11创建自建表,并在对应的表格维护生成器中生成对应的屏幕.

在SM30中屏幕增加子例程

进入SM30后,点击上面系统–>状态–>双击屏幕编号–>增加附加子例程–>调用

image.png
image.png

以上就是在SM30中,实现数据附加功能的基本原理,很简单,但是如果不会的还是很难受的.

案例

新建表

首先在SE11中 ,将属性内容选择为C即允许用户编辑修改,然后增加字段及数据元素 .

image.png
在技术设置中.
分配对应的权限组及权限对象.
最后在表格维护生成器中,进行数据维护,按照系统自动逻辑分配屏幕 .

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.

要注意: 使用的内容要激活,每一层及都要激活

结果

image.png
我们无论是新增,修改 都可以自动带出创建人及时间 ,这就是我们要的结果

技术总结

当你在自建表时,如果需要某些字段,需要自动带出附加的内容时,可以使用该技术. 实现类似sql中触发器的功能.

百里鸡汤

梦想,在什么地方
总是那么令人向往,我不顾一切走在路上
就是为了来到你的身旁,梦想
在不在前方,今夜的星光分外明亮
想着远方想着心上的姑娘,回头路已是那么漫长

这里是百里,一个努力的学习者. 努力学习好好记录,点滴进步,就是成功.

wallhaven-49ool8.jpg

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。