泛微-SAP集成限制对销售订单BOM修改

需求:

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

1、使用SE11创建自建表。

image.png

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 增强。

image.png

image.png

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

image.png

增强代码如下,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进行增强。

image.png

image.png

image.png

贴入代码

image.png

代码如下,代码注释部分是限制销售订单在创建发货单后不允许使用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创建函数,名字那些自己定义。函数效果自己调试,实现的效果就你传进去指定的值,程序就会自动根据你的需求去操作,更程序逻辑一样。

image.png

image.png

image.png

image.png

代码如下,至于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集成补丁自己处理),注册函数直接保存。

image.png

6、根据自己需要设置触发集成,我设置流程后触发。

image.png7、添加接口动作(默认是没有的,我是创建好了的,演示过程而已)

image.png

8、点接口来源配置参数

image.png

image.png

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

image.png

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



关键词: ABAP

网友评论

发表评论