zl程序教程

您现在的位置是:首页 >  Java

当前栏目

ABAP之SM30触发数据附加功能

2023-02-18 16:37:21 时间

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第30天,点击查看活动详情

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中触发器的功能.

百里鸡汤

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

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