需求:
通过销售订单计划行下达后,就拒绝使用CU51进行修改,需要修改的正常情况需使用OA说明修改原因,经过审批后即可允许修改,另附加特殊情况的时候可直接处理程序。
1、使用SE11创建自建表。

2、使用SE38创建配套的修改程序,自己创建事物码。
REPORT ZR_PP_109. SELECTION-SCREEN BEGIN OF BLOCK flag1 WITH FRAME TITLE text-001. PARAMETERS s_vbeln TYPE zppcu-vbeln OBLIGATORY. "销售订单号 SELECTION-SCREEN END OF BLOCK flag1. SELECTION-SCREEN BEGIN OF BLOCK flag2 WITH FRAME TITLE text-002. PARAMETERS:p_a RADIOBUTTON GROUP g1 DEFAULT 'X', p_b RADIOBUTTON GROUP g1. SELECTION-SCREEN END OF BLOCK flag2. DATA:gt_zppcu TYPE STANDARD TABLE OF zppcu WITH HEADER LINE. SELECT * FROM zppcu INTO TABLE gt_zppcu WHERE vbeln = s_vbeln. IF p_a IS NOT INITIAL. IF gt_zppcu[] IS NOT INITIAL. LOOP AT gt_zppcu. IF gt_zppcu-xloek = 'X'. MESSAGE '当前销售订单号已经关闭修改,是否开启修改?' TYPE 'I'. UPDATE zppcu SET xloek = '' WHERE vbeln = s_vbeln."FROM gt_zppcu. MESSAGE '销售订单开启CU51修改操作成功.' TYPE 'S'. ELSE. MESSAGE '当前销售订单号已经开启修改,请勿重复操作。' TYPE 'E'. ENDIF. ENDLOOP. ELSE. gt_zppcu-vbeln = s_vbeln. gt_zppcu-xloek = ''. gt_zppcu-erdat = sy-datum. gt_zppcu-erzet = sy-uzeit. gt_zppcu-ernam = sy-uname. APPEND gt_zppcu. INSERT zppcu FROM gt_zppcu. ENDIF. ENDIF. IF p_b IS NOT INITIAL. IF gt_zppcu[] IS INITIAL. MESSAGE '当前销售订单号无修改开启记录.' TYPE 'E'. ELSE. LOOP AT gt_zppcu. IF gt_zppcu-xloek = 'X'. MESSAGE '当前销售订单号已经关闭修改,请勿重复操作.' TYPE 'E'. ELSE. UPDATE zppcu SET xloek = 'X' zgbrq = sy-datum zgbsj = sy-uzeit zgbr = sy-uname WHERE vbeln = s_vbeln."FROM gt_zppcu. MESSAGE '销售订单关闭CU51修改操作成功.' TYPE 'S'. ENDIF. ENDLOOP. ENDIF. * DELETE FROM zppcu WHERE vbeln = s_vbeln. ENDIF.
3、使用SE38打开MV45AFZZ,对VA02保存出口USEREXIT_SAVE_DOCUMENT_PREPARE 增强。


显示隐式增强后会看到黑色大箭头,在大箭头行点击右键。

增强代码如下,VA02保存的时候如果计划项是CP就触发创建数据。
ENHANCEMENT 1 ZUSEREXIT_SAVE_DOCUMENT_PREPAR. "active version IF sy-tcode = 'VA02' AND VBEP-ETTYP = 'CP' AND ( VBAK-AUART = 'ZGN' OR VBAK-AUART = 'ZGW' OR VBAK-AUART = 'ZYL'). DATA gt_zppcu TYPE STANDARD TABLE OF zppcu WITH HEADER LINE. SELECT * FROM zppcu INTO TABLE gt_zppcu WHERE vbeln = VBAK-VBELN. IF gt_zppcu[] IS not INITIAL. LOOP AT gt_zppcu. IF gt_zppcu-xloek ne 'X'. UPDATE zppcu SET xloek = 'X' zgbrq = sy-datum zgbsj = sy-uzeit zgbr = sy-uname WHERE vbeln = VBAK-VBELN. ENDIF. ENDLOOP. ELSE. gt_zppcu-vbeln = VBAK-VBELN. gt_zppcu-xloek = 'X'. gt_zppcu-erdat = sy-datum. gt_zppcu-erzet = sy-uzeit. gt_zppcu-ernam = sy-uname. APPEND gt_zppcu. INSERT zppcu FROM gt_zppcu. ENDIF. * break-point. ENDIF. ENDENHANCEMENT.
3、使用CMOD对CU51的打开访问接口CCUXDATU进行增强。



贴入代码

代码如下,代码注释部分是限制销售订单在创建发货单后不允许使用CU51.
*&---------------------------------------------------------------------* *& 包含 ZXCUC1U01 *& 2018-11-13 LUOLIN 限制计划行下达后,就不允许直接使用CU51,需要使用ZPP109开启 *&---------------------------------------------------------------------* IF sy-tcode = 'CU51'. "检测是否是CU51操作 DATA gt_zppcu TYPE STANDARD TABLE OF zppcu WITH HEADER LINE. SELECT * FROM zppcu INTO TABLE gt_zppcu WHERE vbeln = i_order_number AND xloek = 'X'. IF gt_zppcu[] IS NOT INITIAL. MESSAGE '当前销售订单拒绝使用CU51.' TYPE 'E'. ENDIF. * IF sy-uname NE 'YANGWJ'. "备用功能,仅该帐号有特殊权限 * DATA:w_comwa LIKE vbco6, * it_doc TYPE STANDARD TABLE OF vbfa WITH HEADER LINE. * DATA t_mseg TYPE STANDARD TABLE OF mseg WITH HEADER LINE. * CLEAR it_doc[]. * w_comwa-mandt = sy-mandt. * w_comwa-vbeln = i_order_number. * w_comwa-posnr = i_item_number. * CALL FUNCTION 'RV_ORDER_FLOW_INFORMATION' * EXPORTING * comwa = w_comwa * TABLES * vbfa_tab = it_doc * EXCEPTIONS * no_vbfa = 1 * no_vbuk_found = 2 * OTHERS = 3. * IF it_doc[] IS NOT INITIAL. "凭证流 * READ TABLE it_doc WITH KEY vbtyp_n = 'J' vbelv = i_order_number posnv = i_item_number. * IF sy-subrc = 0 . * MESSAGE '发货凭证已创建,拒绝你的本次访问,可使用CU52查看相关数据。(26#)' TYPE 'E'. * ENDIF. * ENDIF. * ENDIF. ENDIF.
以上部分是针对系统内部数据的处理意见完毕,接下来做跟集成相关的。
4、SE37创建函数,名字那些自己定义。函数效果自己调试,实现的效果就你传进去指定的值,程序就会自动根据你的需求去操作,更程序逻辑一样。




代码如下,至于RFC接口的功能根据自己需要设。注:OA传输过来的值即使参照了SAP的字段,一样要做补全后在进行数据处理。
FUNCTION zr_rfc_ppcu51. *"---------------------------------------------------------------------- *"*"本地接口: *" IMPORTING *" VALUE(S_VBELN) TYPE ZPPCU-VBELN *" EXPORTING *" VALUE(MESSAGE) TYPE STRING *"---------------------------------------------------------------------- DATA:gt_zppcu TYPE STANDARD TABLE OF zppcu WITH HEADER LINE. CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT' EXPORTING input = s_vbeln IMPORTING output = s_vbeln. SELECT * FROM zppcu INTO TABLE gt_zppcu WHERE vbeln = s_vbeln. IF gt_zppcu[] IS NOT INITIAL. LOOP AT gt_zppcu. IF gt_zppcu-xloek = 'X'. COMMIT WORK. UPDATE zppcu SET xloek = '' WHERE vbeln = s_vbeln. MESSAGE '允许修改操作成功.' TYPE 'S'. ELSE. MESSAGE '已禁止修改,请勿重复操作。' TYPE 'S'. ENDIF. ENDLOOP. ELSE. MESSAGE '无禁止修改记录,可能未下达.' TYPE 'S'. ENDIF. message = sy-msgv1. ENDFUNCTION.
以上属于SAP设置需要设置的全部做完,接下来需要做OA方面的。
5、在OA集成接口中添加SAP的集成(SAP集成补丁自己处理),注册函数直接保存。

6、根据自己需要设置触发集成,我设置流程后触发。
7、添加接口动作(默认是没有的,我是创建好了的,演示过程而已)

8、点接口来源配置参数


可以在后台集成日志中看到成功与否

此次集成需求较为简单,有一定ABAP基础的很很容易明白,我也是第一次弄OA集成数据到SAP,复杂的就是字段多一些,弄清楚需要的值就行。有兴趣的朋友可以一起研究。
网友评论