CSAP_MAT_BOM_MAINTAIN修改问题

使用此函数修改时,

只要ITEM_NODE  项目节点号  ITEM_COUNT 内部计数器字段相同,就可以对原BOM种的相同项做修改。

特别要注意一点,单原项目带安装地点,修改的时候不带安装地点,例如只修改数量,而该项目的STPU数据为空,执行后的结果是,安装地点的标志被取消了(但STPU中数据仍然存在),数量并没有修改,目前的解决办法是,人为加入判断这种情况(原来BOM项有安装地点,则传给函数就变成两条数据,一条用于删除原来的数据,一条用于新增加来达到修改的目的)

下面是一个修改BOM的行数。本接口用于PDM发生ECO BOM变更于SAP的接口。

FUNCTION zpdm_eco_bom.
*"----------------------------------------------------------------------
*"*"Local interface:
*"  IMPORTING
*"     VALUE(MATERIAL) LIKE  CSAP_MBOM-MATNR OPTIONAL
*"     VALUE(PLANT) LIKE  CSAP_MBOM-WERKS OPTIONAL
*"     VALUE(BOM_USAGE) LIKE  CSAP_MBOM-STLAN OPTIONAL
*"     VALUE(ALTERNATIVE) LIKE  CSAP_MBOM-STLAL OPTIONAL
*"     VALUE(VALID_FROM) LIKE  CSAP_MBOM-DATUV OPTIONAL
*"     VALUE(CHANGE_NO) LIKE  CSAP_MBOM-AENNR OPTIONAL
*"     VALUE(REVISION_LEVEL) LIKE  CSAP_MBOM-REVLV OPTIONAL
*"     VALUE(FL_NO_CHANGE_DOC) LIKE  CAPIFLAG-NO_CHG_DOC OPTIONAL
*"     VALUE(I_STKO) LIKE  STKO_API01 STRUCTURE  STKO_API01 OPTIONAL
*"  EXPORTING
*"     VALUE(O_STKO) LIKE  STKO_API02 STRUCTURE  STKO_API02
*"     VALUE(FL_WARNING) LIKE  CAPIFLAG-FLWARNING
*"     VALUE(RETURN) TYPE  CHAR100
*"     VALUE(RETURN2) TYPE  CHAR100
*"  TABLES
*"      T_DEP_DATA STRUCTURE  CSDEP_DAT OPTIONAL
*"      T_DEP_DESCR STRUCTURE  CSDEP_DESC OPTIONAL
*"      T_DEP_ORDER STRUCTURE  CSDEP_ORD OPTIONAL
*"      T_DEP_SOURCE STRUCTURE  CSDEP_SORC OPTIONAL
*"      T_DEP_DOC STRUCTURE  CSDEP_DOC OPTIONAL
*"      T_STPO1 STRUCTURE  STPO_API03
*"      T_STPU STRUCTURE  STPU_API01 OPTIONAL
*"----------------------------------------------------------------------
  DATA: t_stpo_line_mod LIKE TABLE OF stpo_api02 WITH HEADER LINE.
  DATA: t_stpo_line_add LIKE TABLE OF stpo_api03 WITH HEADER LINE.
  DATA: t_stpo_new LIKE TABLE OF stpo_api03 WITH HEADER LINE.
  DATA: w_stlnr LIKE mast-stlnr.
  DATA: t_stpo_mod LIKE TABLE OF stpo_api03 WITH HEADER LINE.
  DATA: temp-component LIKE stpo-idnrk.

  DATA: i_stpo LIKE TABLE OF stpo WITH HEADER LINE.
  DATA: i_stpu LIKE TABLE OF stpu WITH HEADER LINE.

  w_stlnr = ''.
  CLEAR i_stpo[].
  i_stko-base_quan = 1.
  SELECT SINGLE  stlnr INTO w_stlnr FROM mast WHERE matnr = material AND werks = plant AND stlan = 1 .
  SELECT * INTO CORRESPONDING FIELDS OF TABLE i_stpo
  FROM stpo WHERE stlnr = w_stlnr AND stlty = 'M'
  .
  SELECT * INTO CORRESPONDING FIELDS OF TABLE i_stpu
 FROM stpu WHERE stlnr = w_stlnr AND stlty = 'M'
 .
  SORT i_stpo BY posnr idnrk stlkn DESCENDING .

  LOOP AT t_stpo1.
    CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
      EXPORTING
        input  = t_stpo1-component
      IMPORTING
        utput = temp-component.
    IF t_stpo1-fldelete = 'X'."删除处理
      READ TABLE i_stpo WITH KEY posnr = t_stpo1-item_no idnrk = temp-component postp = t_stpo1-item_categ.
      IF sy-subrc = 0.
        MOVE-CORRESPONDING t_stpo1 TO t_stpo_mod.
        t_stpo_mod-item_node = i_stpo-stlkn.
        t_stpo_mod-item_count = i_stpo-stpoz.
        APPEND t_stpo_mod.
*        DELETE FROM STPU WHERE stlnr = w_stlnr AND stlty = 'M' AND STLKN = i_stpo-stlkn.
      ELSE.
        CONCATENATE '要删除的物料没有找到' t_stpo1-component INTO return.
        WRITE:/ '删除处理',return.
        LEAVE .
      ENDIF.
    ENDIF.

    IF t_stpo1-fldelete = 'A'."新增处理
      MOVE-CORRESPONDING t_stpo1 TO t_stpo_mod.
      t_stpo_mod-fldelete = ''.
      APPEND t_stpo_mod.
      WRITE:/ 'ZCSAP_MAT_BOM_MAINTAIN-return',return.
    ENDIF.

    IF t_stpo1-fldelete = 'M'."修改处理
      READ TABLE i_stpo WITH KEY posnr = t_stpo1-item_no idnrk = temp-component postp = t_stpo1-item_categ.
      IF sy-subrc = 0.
*        当修改数量,原物料有安装地点,而新的没有安装地点时,需要先删除以前的,再新增加一条。
        READ TABLE i_stpu WITH KEY stlkn = i_stpo-stlkn.
        IF sy-subrc = 0.
          READ TABLE t_stpu WITH KEY pointer = t_stpo1-identifier.
          IF sy-subrc <> 0."而新的没有安装地点时.
*           原来一条删除
            t_stpo_mod-item_node = i_stpo-stlkn.
            t_stpo_mod-item_count = i_stpo-stpoz.
            t_stpo_mod-fldelete = 'X'.
            APPEND t_stpo_mod.
*           新增一条
            MOVE-CORRESPONDING t_stpo1 TO t_stpo_mod.
            t_stpo_mod-fldelete = ''.
            APPEND t_stpo_mod.
          ENDIF.
        ELSE."原有物料也没有安装地点,直接修改
          MOVE-CORRESPONDING t_stpo1 TO t_stpo_mod.
          t_stpo_mod-item_node = i_stpo-stlkn.
          t_stpo_mod-item_count = i_stpo-stpoz.
          t_stpo_mod-fldelete = ''.
          APPEND t_stpo_mod.

        ENDIF.


      ELSE.
        CONCATENATE '要修改的物料没有找到' t_stpo1-component INTO return.
        WRITE:/ '修改处理',return.
        LEAVE .
      ENDIF.
    ENDIF.
  ENDLOOP.


*新增
  CALL FUNCTION 'CSAP_MAT_BOM_MAINTAIN'
         EXPORTING
          material                  = material
          plant                     = plant
         bom_usage                 = bom_usage
*       VALID_FROM                =
        change_no                 =  change_no
        i_stko                    = i_stko
        fl_bom_create             = 'X'
        fl_new_item               = 'X'
*        fl_commit_and_wait = 'X'
*        fl_default_values = 'X'
      IMPORTING
        fl_warning                = fl_warning
        o_stko                    = o_stko
      TABLES
        t_stpo                    = t_stpo_mod
        t_stpu                    = t_stpu
      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.


  IF sy-subrc <> 0.
    return2 = return+12(10).
    WRITE:/    '建立时错误信息:',return2.
    WRITE: return2.

  ELSE.
    WRITE:/ return2.
    WRITE:/ '建立时信息:',return.

  ENDIF.

ENDFUNCTION.

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

ChampaignWolf

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

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

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

打赏作者

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

抵扣说明:

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

余额充值