CS01/CS02/CS03 BOM修改 CSAP_MAT_BOM_MAINTAIN

CS02

背景:根据变更编号和数据对BOM进行修改操作

image-20221219193452420

I_HEAD 和 I_ITEM分别为接口的导入抬头数据和导入项目数据

I_HEAD结构

image-20221219193727459

I_ITEM结构

image-20221219193802970

image-20221219193751830

创建变更编号关键代码:

  LV_CHANGE_NO = I_HEAD-AENNR.
  LV_CHANGE_NO = |{ LV_CHANGE_NO ALPHA = IN }|.
  LS_CHANGE_HEADER-CHANGE_NO = LV_CHANGE_NO.
  LS_CHANGE_HEADER-STATUS = I_HEAD-AENST.
  LS_CHANGE_HEADER-VALID_FROM = I_HEAD-DATUV.
  LS_CHANGE_HEADER-DESCRIPT = I_HEAD-AETXT.
  "勾选下列四个
  LS_OBJECT_BOM_MAT-ACTIVE      = 'X'.
  LS_OBJECT_BOM_MAT-OBJ_REQU    = 'X'.
  LS_OBJECT_BOM_MAT-MGTREC_GEN  = 'X'.
  LS_OBJECT_BOM_MAT-GEN_NEW     = 'X'.

  LS_OBJMGREC-BOM_USAGE   = I_HEAD-STLAN.   "BOM 用途
  LS_OBJMGREC-MATERIAL = I_HEAD-MATNR.
  LS_OBJMGREC-PLANT = I_HEAD-WRKAN.
  LS_OBJMGREC-CHG_OBJTYP  = '1'.  "工程更改管理对象\
  LS_OBJMGREC-BOM_CAT = 'M'.
  APPEND LS_OBJMGREC TO LT_OBJMGREC.
  CLEAR LS_OBJMGREC.
  "查看当前变更编号是否已在系统中存在
  CALL FUNCTION 'CCAP_ECN_HEADER_READ'
    EXPORTING
      CHANGE_NO       = LV_CHANGE_NO
    IMPORTING
      CHANGE_HEADER   = LS_CHG
    EXCEPTIONS
      NO_RECORD_FOUND = 1
      OTHERS          = 2.

  IF SY-SUBRC <> 0. "不存在创建
    CALL FUNCTION 'CCAP_ECN_CREATE'
      EXPORTING
        CHANGE_HEADER            = LS_CHANGE_HEADER
        OBJECT_BOM               = LS_OBJECT_BOM_MAT
        OBJECT_BOM_MAT           = LS_OBJECT_BOM_MAT
        FL_COMMIT_AND_WAIT       = 'X'
      IMPORTING
        CHANGE_NO                = LV_CHANGE_NO
      TABLES
        OBJMGREC                 = LT_OBJMGREC
        EFFECTIVITY              = LT_EFFECTIVITY
      EXCEPTIONS
        CHANGE_NO_ALREADY_EXISTS = 1
        ERROR                    = 2
        OTHERS                   = 3.
    CALL FUNCTION 'MESSAGE_TEXT_BUILD'
      EXPORTING
        MSGID               = SY-MSGID
        MSGNR               = SY-MSGNO
        MSGV1               = SY-MSGV1
        MSGV2               = SY-MSGV2
        MSGV3               = SY-MSGV3
        MSGV4               = SY-MSGV4
      IMPORTING
        MESSAGE_TEXT_OUTPUT = RETURN.
  ELSE. "存在做修改
    CALL FUNCTION 'CCAP_ECN_MAINTAIN'
      EXPORTING
        CHANGE_HEADER     = LS_CHANGE_HEADER
        OBJECT_BOM        = LS_OBJECT_BOM_MAT
        OBJECT_BOM_MAT    = LS_OBJECT_BOM_MAT
*       object_bom_psp    = ls_object_bom_mat
        FL_NO_COMMIT_WORK = SPACE
        FL_SYNCH          = SPACE
      TABLES
        OBJMGREC          = LT_OBJMGREC
        EFFECTIVITY       = LT_EFFECTIVITY
      EXCEPTIONS
        ERROR             = 1
        OTHERS            = 2.
    CALL FUNCTION 'MESSAGE_TEXT_BUILD'
      EXPORTING
        MSGID               = SY-MSGID
        MSGNR               = SY-MSGNO
        MSGV1               = SY-MSGV1
        MSGV2               = SY-MSGV2
        MSGV3               = SY-MSGV3
        MSGV4               = SY-MSGV4
      IMPORTING
        MESSAGE_TEXT_OUTPUT = RETURN.
  ENDIF.

情况1、仅对指定行项目和物料号的数据进行修改,不更改其他

    LOOP AT I_ITEM INTO DATA(LS_I_ITEM).
      LV_POSNR = LS_I_ITEM-POSNR.
      LS_T_STPO-ID_ITEM_NO = LV_POSNR. "项目号
      CALL FUNCTION 'CONVERSION_EXIT_NUMCV_INPUT'
        EXPORTING
          INPUT  = LS_T_STPO-ID_ITEM_NO
        IMPORTING
          OUTPUT = LS_T_STPO-ID_ITEM_NO.
      CLEAR LV_POSNR.


      LS_T_STPO-ITEM_CATEG = LS_I_ITEM-POSTP. "项目类型
      LS_T_STPO-ID_COMP = LS_I_ITEM-IDNRK. "子件物料
      LS_T_STPO-COMP_QTY = LS_I_ITEM-MENGE. "数量
      LS_T_STPO-VALID_FROM = LV_VALID_FROM.
      LS_T_STPO-ITEM_NO = LS_T_STPO-ID_ITEM_NO.
      LS_STPO-ITEM_NO = LS_T_STPO-ID_ITEM_NO.
      LS_T_STPO-COMPONENT = LS_T_STPO-ID_COMP.
*      LS_T_STPO-FLDELETE = 'X'."此字段不为空的话表示删除LV_POSNR和LS_I_ITEM-IDNRK对应的BOM组件
      APPEND LS_T_STPO TO LT_T_STPO.
      CLEAR: LS_T_STPO.
    ENDLOOP.

    CALL FUNCTION 'CSAP_MAT_BOM_MAINTAIN'
      EXPORTING
        MATERIAL           = LV_MATERIAL
        PLANT              = LV_PLANT
        BOM_USAGE          = LV_BOM_USAGE
        ALTERNATIVE        = LV_ALTERNATIVE
        VALID_FROM         = LV_VALID_FROM
        CHANGE_NO          = LV_CHANGE_NO
        I_STKO             = LS_I_STKO
        FL_COMMIT_AND_WAIT = 'X'
        FL_BOM_CREATE      = 'X'
        FL_NEW_ITEM        = 'X'
        FL_COMPLETE        = 'X'
*       FL_DEFAULT_VALUES  = 'X'
      IMPORTING
        FL_WARNING         = LV_FL_WARNING
        O_STKO             = LS_O_STKO
      TABLES
        T_STPO             = LT_T_STPO
      EXCEPTIONS
        ERROR              = 1
        OTHERS             = 2.

情况2、在修改BOM组件之前删除掉旧的组件

对于这种情况,在T_STPO中有个字段为FLDELETE,如果情况1中的ITEM数据都给这个字段赋值为X,则表示删除掉该BOM中对应项目号和组件号的BOM组件。

如果直接使用CS_BOM_EXPL_MAT_V2展开这个BOM,则只能得到变更生效的组件项目,而不能得到未生效的组件项目,因此,我们需要先使用函数CSAP_MAT_BOM_OPEN来获得BOM的组件项目,并将组件项目全部删除,主要代码如下:

V_MATERIAL = I_HEAD-MATNR. "父件物料
    LV_PLANT = I_HEAD-WRKAN.  " 工厂
    LV_BOM_USAGE = I_HEAD-STLAN. "用途
    LV_ALTERNATIVE = I_HEAD-STLAL. "备选
    LV_VALID_FROM = I_HEAD-DATUV. "生效时间
    LV_CHANGE_NO = LV_CHANGE_NO. "变更号
*    LS_I_STKO-BOM_STATUS = I_HEAD-STLST. "状态
*    LS_I_STKO-BASE_QUAN = I_HEAD-BMENG.
*    LS_I_STKO-BOM_GROUP = I_HEAD-STLAL.
*    LS_I_STKO-DELETE_IND
    CALL FUNCTION 'CSAP_MAT_BOM_OPEN'
      EXPORTING
        MATERIAL    = LV_MATERIAL
        PLANT       = LV_PLANT
        BOM_USAGE   = LV_BOM_USAGE
        ALTERNATIVE = LV_ALTERNATIVE
        VALID_FROM  = LV_VALID_FROM
      TABLES
        T_STPO      = LT_STPO"这里得到了LV_MATERIAL对应的BOM的所有的组件数据
      EXCEPTIONS
        ERROR       = 1
        OTHERS      = 2.
    IF SY-SUBRC EQ 0.
      LOOP AT LT_STPO ASSIGNING FIELD-SYMBOL(<LFS_STPO>).
        <LFS_STPO>-FLDELETE = 'X'."注意,这里将得到的组件项目打上删除标记
      ENDLOOP.
      CALL FUNCTION 'CSAP_MAT_BOM_MAINTAIN'
        EXPORTING
          MATERIAL           = LV_MATERIAL
          PLANT              = LV_PLANT
          BOM_USAGE          = LV_BOM_USAGE
          ALTERNATIVE        = LV_ALTERNATIVE
          VALID_FROM         = LV_VALID_FROM
          CHANGE_NO          = LV_CHANGE_NO
          I_STKO             = LS_I_STKO
          FL_COMMIT_AND_WAIT = 'X'
          FL_BOM_CREATE      = 'X'
          FL_NEW_ITEM        = 'X'
          FL_COMPLETE        = 'X'
        IMPORTING
          FL_WARNING         = LV_FL_WARNING
          O_STKO             = LS_O_STKO
        TABLES
          T_STPO             = LT_STPO
        EXCEPTIONS
          ERROR              = 1
          OTHERS             = 2.

    ENDIF.

接口全部代码如下所示:

FUNCTION Z_XXXX.
*"----------------------------------------------------------------------
*"*"本地接口:
*"  IMPORTING
*"     VALUE(I_HEAD) TYPE  ZPPS_PDM_ECN
*"     VALUE(I_ITEM) TYPE  ZPPT_PDM_ECN_ITEM
*"  EXPORTING
*"     VALUE(E_TYP) TYPE  CHAR1
*"     VALUE(E_MSG) TYPE  CHAR255
*"----------------------------------------------------------------------
  DATA:RETURN TYPE STRING.
  DATA:LV_MATERIAL    TYPE CSAP_MBOM-MATNR,
       LV_PLANT       TYPE CSAP_MBOM-WERKS,
       LV_BOM_USAGE   TYPE CSAP_MBOM-STLAN,
       LV_ALTERNATIVE TYPE CSAP_MBOM-STLAL,
       LV_VALID_FROM  TYPE CSAP_MBOM-DATUV,
       LV_CHANGE_NO   TYPE CSAP_MBOM-AENNR,
       LS_I_STKO      TYPE STKO_API01,
       LS_O_STKO      TYPE STKO_API02,
       LT_T_STPO      TYPE TABLE OF STPO_API03,
       LS_T_STPO      TYPE STPO_API03,
       LT_STPO        TYPE TABLE OF STPO_API03,
       LS_STPO        TYPE STPO_API03.
  DATA:LV_FL_WARNING TYPE CAPIFLAG-FLWARNING.
  "创建变更号参数
  DATA: LS_CHANGE_HEADER  TYPE AENR_API01.
  DATA: LS_CHG            TYPE AENR_API02.
  DATA: LS_RETURN_MSG     TYPE BAPIRET2.
  DATA: LS_OBJECT_BOM_MAT TYPE AENV_API01..
  DATA: LS_OBJECT_BOM_PSP TYPE AENV_API01..
  DATA: LS_OBJECT_DOC     TYPE AENV_API01.
  DATA: LT_OBJMGREC       TYPE STANDARD TABLE OF AEOI_API01.
  DATA: LS_OBJMGREC       TYPE AEOI_API01.
  DATA: LT_EFFECTIVITY    TYPE STANDARD TABLE OF AEEF_API01.
  DATA: LS_EFFECTIVITY    TYPE AEEF_API01.
  DATA:LV_POSNR TYPE I.
  DATA:LT_STB   TYPE TABLE OF STPOX.

  CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT'
    EXPORTING
      INPUT  = I_HEAD-MATNR
    IMPORTING
      OUTPUT = I_HEAD-MATNR.

  LV_CHANGE_NO = I_HEAD-AENNR.
  LV_CHANGE_NO = |{ LV_CHANGE_NO ALPHA = IN }|.
  LS_CHANGE_HEADER-CHANGE_NO = LV_CHANGE_NO.
  LS_CHANGE_HEADER-STATUS = I_HEAD-AENST.
  LS_CHANGE_HEADER-VALID_FROM = I_HEAD-DATUV.
  LS_CHANGE_HEADER-DESCRIPT = I_HEAD-AETXT.

  LS_OBJECT_BOM_MAT-ACTIVE      = 'X'.
  LS_OBJECT_BOM_MAT-OBJ_REQU    = 'X'.
  LS_OBJECT_BOM_MAT-MGTREC_GEN  = 'X'.
  LS_OBJECT_BOM_MAT-GEN_NEW     = 'X'.

  LS_OBJMGREC-BOM_USAGE   = I_HEAD-STLAN.   "BOM 用途
  LS_OBJMGREC-MATERIAL = I_HEAD-MATNR.
  LS_OBJMGREC-PLANT = I_HEAD-WRKAN.
  LS_OBJMGREC-CHG_OBJTYP  = '1'.  "工程更改管理对象\
  LS_OBJMGREC-BOM_CAT = 'M'.
  APPEND LS_OBJMGREC TO LT_OBJMGREC.
  CLEAR LS_OBJMGREC.

  CALL FUNCTION 'CCAP_ECN_HEADER_READ'
    EXPORTING
      CHANGE_NO       = LV_CHANGE_NO
    IMPORTING
      CHANGE_HEADER   = LS_CHG
    EXCEPTIONS
      NO_RECORD_FOUND = 1
      OTHERS          = 2.

  IF SY-SUBRC <> 0. "不存在创建
    CALL FUNCTION 'CCAP_ECN_CREATE'
      EXPORTING
        CHANGE_HEADER            = LS_CHANGE_HEADER
        OBJECT_BOM               = LS_OBJECT_BOM_MAT
        OBJECT_BOM_MAT           = LS_OBJECT_BOM_MAT
        FL_COMMIT_AND_WAIT       = 'X'
      IMPORTING
        CHANGE_NO                = LV_CHANGE_NO
      TABLES
        OBJMGREC                 = LT_OBJMGREC
        EFFECTIVITY              = LT_EFFECTIVITY
      EXCEPTIONS
        CHANGE_NO_ALREADY_EXISTS = 1
        ERROR                    = 2
        OTHERS                   = 3.
    CALL FUNCTION 'MESSAGE_TEXT_BUILD'
      EXPORTING
        MSGID               = SY-MSGID
        MSGNR               = SY-MSGNO
        MSGV1               = SY-MSGV1
        MSGV2               = SY-MSGV2
        MSGV3               = SY-MSGV3
        MSGV4               = SY-MSGV4
      IMPORTING
        MESSAGE_TEXT_OUTPUT = RETURN.
  ELSE. "存在做修改
    CALL FUNCTION 'CCAP_ECN_MAINTAIN'
      EXPORTING
        CHANGE_HEADER     = LS_CHANGE_HEADER
        OBJECT_BOM        = LS_OBJECT_BOM_MAT
        OBJECT_BOM_MAT    = LS_OBJECT_BOM_MAT
*       object_bom_psp    = ls_object_bom_mat
        FL_NO_COMMIT_WORK = SPACE
        FL_SYNCH          = SPACE
      TABLES
        OBJMGREC          = LT_OBJMGREC
        EFFECTIVITY       = LT_EFFECTIVITY
      EXCEPTIONS
        ERROR             = 1
        OTHERS            = 2.
    CALL FUNCTION 'MESSAGE_TEXT_BUILD'
      EXPORTING
        MSGID               = SY-MSGID
        MSGNR               = SY-MSGNO
        MSGV1               = SY-MSGV1
        MSGV2               = SY-MSGV2
        MSGV3               = SY-MSGV3
        MSGV4               = SY-MSGV4
      IMPORTING
        MESSAGE_TEXT_OUTPUT = RETURN.
  ENDIF.
  IF SY-SUBRC = 0 .
    CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
      EXPORTING
        WAIT = 'X'.
    .
  ELSE.
    E_TYP = 'E'.
    E_MSG = LV_CHANGE_NO && '创建修改失败,请检查上传的数据.'.
  ENDIF.



  IF E_TYP IS INITIAL.
    LV_MATERIAL = I_HEAD-MATNR. "父件物料
    LV_PLANT = I_HEAD-WRKAN.  " 工厂
    LV_BOM_USAGE = I_HEAD-STLAN. "用途
    LV_ALTERNATIVE = I_HEAD-STLAL. "备选
    LV_VALID_FROM = I_HEAD-DATUV. "生效时间
    LV_CHANGE_NO = LV_CHANGE_NO. "变更号
    CALL FUNCTION 'CSAP_MAT_BOM_OPEN'
      EXPORTING
        MATERIAL    = LV_MATERIAL
        PLANT       = LV_PLANT
        BOM_USAGE   = LV_BOM_USAGE
        ALTERNATIVE = LV_ALTERNATIVE
        VALID_FROM  = LV_VALID_FROM
      TABLES
        T_STPO      = LT_STPO
      EXCEPTIONS
        ERROR       = 1
        OTHERS      = 2.
    IF SY-SUBRC EQ 0.
      LOOP AT LT_STPO ASSIGNING FIELD-SYMBOL(<LFS_STPO>).
        <LFS_STPO>-FLDELETE = 'X'.
      ENDLOOP.
      CALL FUNCTION 'CSAP_MAT_BOM_MAINTAIN'
        EXPORTING
          MATERIAL           = LV_MATERIAL
          PLANT              = LV_PLANT
          BOM_USAGE          = LV_BOM_USAGE
          ALTERNATIVE        = LV_ALTERNATIVE
          VALID_FROM         = LV_VALID_FROM
          CHANGE_NO          = LV_CHANGE_NO
          I_STKO             = LS_I_STKO
          FL_COMMIT_AND_WAIT = 'X'
          FL_BOM_CREATE      = 'X'
          FL_NEW_ITEM        = 'X'
          FL_COMPLETE        = 'X'
        IMPORTING
          FL_WARNING         = LV_FL_WARNING
          O_STKO             = LS_O_STKO
        TABLES
          T_STPO             = LT_STPO
        EXCEPTIONS
          ERROR              = 1
          OTHERS             = 2.
    ENDIF.

    LOOP AT I_ITEM INTO DATA(LS_I_ITEM).
      LV_POSNR = LS_I_ITEM-POSNR.
      LS_T_STPO-ID_ITEM_NO = LV_POSNR. "项目号
      CALL FUNCTION 'CONVERSION_EXIT_NUMCV_INPUT'
        EXPORTING
          INPUT  = LS_T_STPO-ID_ITEM_NO
        IMPORTING
          OUTPUT = LS_T_STPO-ID_ITEM_NO.
      CLEAR LV_POSNR.


      LS_T_STPO-ITEM_CATEG = LS_I_ITEM-POSTP. "项目类型
      LS_T_STPO-ID_COMP = LS_I_ITEM-IDNRK. "子件物料
      LS_T_STPO-COMP_QTY = LS_I_ITEM-MENGE. "数量
      LS_T_STPO-VALID_FROM = LV_VALID_FROM.
      LS_T_STPO-ITEM_NO = LS_T_STPO-ID_ITEM_NO.
      LS_STPO-ITEM_NO = LS_T_STPO-ID_ITEM_NO.
      LS_T_STPO-COMPONENT = LS_T_STPO-ID_COMP.
      APPEND LS_T_STPO TO LT_T_STPO.
      CLEAR: LS_T_STPO.
    ENDLOOP.
    CALL FUNCTION 'CSAP_MAT_BOM_MAINTAIN'
      EXPORTING
        MATERIAL           = LV_MATERIAL
        PLANT              = LV_PLANT
        BOM_USAGE          = LV_BOM_USAGE
        ALTERNATIVE        = LV_ALTERNATIVE
        VALID_FROM         = LV_VALID_FROM
        CHANGE_NO          = LV_CHANGE_NO
        I_STKO             = LS_I_STKO
        FL_COMMIT_AND_WAIT = 'X'
        FL_BOM_CREATE      = 'X'
        FL_NEW_ITEM        = 'X'
        FL_COMPLETE        = 'X'
      IMPORTING
        FL_WARNING         = LV_FL_WARNING
        O_STKO             = LS_O_STKO
      TABLES
        T_STPO             = LT_T_STPO
      EXCEPTIONS
        ERROR              = 1
        OTHERS             = 2.

    IF SY-SUBRC NE 0.
      CALL FUNCTION 'MESSAGE_TEXT_BUILD'
        EXPORTING
          MSGID               = SY-MSGID
          MSGNR               = SY-MSGNO
          MSGV1               = SY-MSGV1
          MSGV2               = SY-MSGV2
          MSGV3               = SY-MSGV3
          MSGV4               = SY-MSGV4
        IMPORTING
          MESSAGE_TEXT_OUTPUT = RETURN.
      E_MSG = RETURN.
*      BREAK-POINT.
    ELSE.
      E_TYP = 'S'.
      E_MSG = I_HEAD-MATNR && '  BOM修改成功 更改号为' && LV_CHANGE_NO.
      CLEAR LV_CHANGE_NO.
    ENDIF.
  ENDIF.
ENDFUNCTION.
  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值