前言
功能场景:设备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.
以上
不妥之处欢迎留言指正。手动笑脸
欢迎关注公众号,每日更新: