金色传说:SAP-ABAP-IW21/IW22通知单保存增强:保存通知单时根据特殊条件创建新的事故通知单


前言

功能场景:设备PM通知单IW22/IW21保存时增强,完成功能:保存通知单时,判断是特定的原因代码时,创建一张事故通知单。
金色传说 很多增强中是不能直接COMMIT的,这里用的是以后台job的方式去创建通知单,在其他增强中想完成类似的操作时,可以借鉴这种方式。


提示:以下是本篇文章正文内容,下面案例可供参考

一、BADI增强

找了好多个增强点,例如SMOD的QQMA0014(小声bb:据说可以用,但是我在测试增强时,发现在IW22中点击保存后并不会进入到QQMA0014的EXIT_SAPMIWO0_020中),所以使用了BADI增强:NOTIF_EVENT_SAVE

二、增强实现

1.创建增强

1.SE19创建BADI实施:
在这里插入图片描述
在这里插入图片描述
金色传说这个BADI比较特殊,是过滤器相关的BADI,所以需要在这里限定是哪几种通知单保存时会进入到这个BADI:
在这里插入图片描述
这里要注意的是,如果你使用搜索帮助添加通知单类型,会发现,里面的通知单类型并不全,比如缺少B1类型,这里是可以手动输入的,输入后,B1类型通知单保存时就会进入到这个增强中。(手动添加的带不出描述,这个不影响使用)
在这里插入图片描述

2.代码实现逻辑

本次的实现逻辑是:进入增强后,先判断原因代码是不是自建表ztpm_004中维护的原因代码,是的话就调转到函数ZPM_FM_006,在函数中Submit调用自开发程序zpmr0003,根据特殊原因的通知单,创建事故通知单。

3.增强中的代码

*读取原因代码
    READ TABLE ct_iwqmur INTO DATA(gs_qmur) INDEX 1.
    IF gs_qmur-urcod IS NOT INITIAL.
      SELECT SINGLE urcod INTO @DATA(gs_urcod) FROM ztpm_004 WHERE urcod = @gs_qmur-urcod.
      IF gs_urcod IS NOT INITIAL."与自建表中的原因代码进行对比    
        DATA:gt_heard TYPE TABLE OF caufvdb,
             gs_heard TYPE caufvdb.
        gs_heard-aufnr = gs_qmur-qmnum.
        APPEND gs_heard TO gt_heard.
        clear:gs_heard,gs_urcod,gs_qmur.
*对比成功的通知单号发送进函数中
        CALL FUNCTION 'ZPM_FM_006'
*         IMPORTING
*           MESSAGE         =
          TABLES
*            it_status =
            it_header = gt_heard.
      ENDIF.
    ENDIF.

4.函数ZPM_FM_006中的代码

*"----------------------------------------------------------------------
*"*"本地接口:
*"  EXPORTING
*"     REFERENCE(MESSAGE) TYPE  BAPI_MSG
*"  TABLES
*"      IT_HEADER STRUCTURE  CAUFVDB
*"----------------------------------------------------------------------
  DATA:gs_afih TYPE afih.
  TYPES: BEGIN OF typ_data  ,
           qmnum TYPE  afih-qmnum,
           equnr TYPE  afih-equnr,
           fenum TYPE  qmfe-fenum,
           fegrp TYPE  qmfe-fegrp,
           fecod TYPE  qmfe-fecod,
           otgrp TYPE  qmfe-otgrp,
           oteil TYPE  qmfe-oteil,
*          fenum LIKE  qmur~fenum,
           urgrp TYPE  qmur-urgrp,
           urcod TYPE  qmur-urcod,
         END OF typ_data.
  DATA:  gt_data TYPE TABLE OF typ_data WITH HEADER LINE.
  DATA: l_date TYPE sy-datum,
        l_time TYPE sy-uzeit.
*-------------------------job相关定义-------------------S-
*job相关参数定义
DATA: l_job_jobct            TYPE tbtcjob-jobcount,
      l_job_name             TYPE tbtcjob-jobname .
*打开job的宏  
DEFINE open_job.
  CALL FUNCTION 'JOB_OPEN'
  EXPORTING
    jobname          = &1
*      sdlstrtdt        = &3
*      sdlstrttm        = &4
  IMPORTING
    jobcount         = &2
  EXCEPTIONS
    cant_create_job  = 1
    invalid_job_data = 2
    jobname_missing  = 3
    OTHERS           = 4.
END-OF-DEFINITION.
*关闭job的宏
DEFINE close_job.
  IF sy-subrc = 0.
    CALL FUNCTION 'JOB_CLOSE'
    EXPORTING
      jobcount             = &1
      jobname              = &2
      sdlstrtdt            = &3
      sdlstrttm            = &4
*        strtimmed            = 'X'
    EXCEPTIONS
      cant_start_immediate = 1
      invalid_startdate    = 2
      jobname_missing      = 3
      job_close_failed     = 4
      job_nosteps          = 5
      job_notex            = 6
      lock_failed          = 7
      OTHERS               = 8.
  ENDIF.
END-OF-DEFINITION.
*-------------------------job相关定义-------------------E-
  LOOP AT it_header.
*拼接job名称
    CONCATENATE 'IW21' sy-datum sy-uzeit sy-uname
    INTO l_job_name.
*打开job
    open_job l_job_name l_job_jobct.
*调用ZPMR003程序,此程序是根据传入的单号创建事故通知单
    SUBMIT zpmr0003 WITH p_AUFNR =  it_header-aufnr
    USER  sy-uname
    VIA JOB  l_job_name NUMBER l_job_jobct
    AND RETURN.
    CLEAR: l_date ,l_time.
    CALL FUNCTION 'C14B_ADD_TIME'         "时间函数
      EXPORTING
        i_starttime = sy-uzeit
        i_startdate = sy-datum
        i_addtime   = '000000'                          
      IMPORTING
        e_endtime   = l_time
        e_enddate   = l_date.
*一定记得关闭job
    close_job l_job_jobct  l_job_name  l_date l_time.
    CLEAR:it_header.
  ENDLOOP.

5.程序ZPMR0003中的代码

1.主程序代码

REPORT zpmr0003.
INCLUDE zpmr0003_top.
INCLUDE zpmr0003_f01.
START-OF-SELECTION . "(取数据)
  PERFORM get_pm005.
  PERFORM get_codecheck.
END-OF-SELECTION . "(展示数据)
  message '执行完毕' type 'S'.
TOP-OF-PAGE. "(普通报表输出页头)
END-OF-PAGE. "(普通报表输出页尾)

2.包含程序代码
包含程序的代码比较多,里面注意涉及的是创建事故通知单,通过webservice接口发送通知单等的逻辑。因为代码行数太多,这里就不写了,我挂个资源文件,需要的自取。
《SAP-ABAP-IW21/IW22通知单保存增强:ZPMR003程序代码》


总结展示

完成后的效果,通知单10004390选择了特定的原因代码,保存时,自动创建了事故通知单10004392.
在这里插入图片描述
在这里插入图片描述
以上
不妥之处欢迎留言指正。手动笑脸
欢迎关注公众号,每日更新:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AI云书

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值