ABAP接口创建BOM

接口创建BOM,包括相关性

FUNCTION zplm_bom.
*"----------------------------------------------------------------------
*"*"本地接口:
*"  TABLES
*"      IT_BOM STRUCTURE  ZPLM_BOM OPTIONAL
*"      IT_MESSAGE STRUCTURE  MESSAGE OPTIONAL
*"----------------------------------------------------------------------

  DATA:ls_zplm_bomlog TYPE zplm_bomlog.

  ls_zplm_bomlog-datum = sy-datum.
  ls_zplm_bomlog-uzeit = sy-uzeit.
  LOOP AT IT_BOM INTO DATA(ls_log).
    MOVE-CORRESPONDING ls_log TO ls_zplm_bomlog.
    ADD 1 TO ls_zplm_bomlog-zsn.
    MODIFY zplm_bomlog FROM ls_zplm_bomlog.
  ENDLOOP.
  COMMIT WORK.

  DATA: l_bom_header LIKE bicsk,
        l_group_data LIKE bgr00,
        l_msgid      LIKE t100-arbgb,
        l_msgno      LIKE t100-msgnr,
        p_msgno      LIKE sy-msgno,
        l_msgty      LIKE sy-msgty,
        l_msgv1      LIKE sy-msgv1,
        l_msgv2      LIKE sy-msgv2,
        l_msgv3      LIKE sy-msgv3,
        l_msgv4      LIKE sy-msgv4 .
  DATA: lt_bom_item LIKE TABLE OF bicsp,
        ls_bom_item LIKE LINE OF lt_bom_item,
        lt_sub_item LIKE bicsu OCCURS 0 WITH HEADER LINE,
        gs_msg      LIKE  message,
        l_error(1),
        L_POSNR TYPE I.

  DATA: BEGIN OF ls_list,
          matnr LIKE rc29n-matnr ,  "物料编码
          werks LIKE mast-werks , "工厂
          sortf LIKE rc29p-sortf,   "排序字符串
          knnam LIKE cukb-knnam,   "相关性名称
          stlnr	TYPE stnum, "物料单
          knnum	TYPE knnum, "知识元素的内部号
        END OF ls_list,
        lt_list LIKE STANDARD TABLE OF ls_list.


  l_bom_header-tcode = 'CS01'.
  LOOP AT it_bom INTO DATA(ls_bom).
    l_bom_header-werks = ls_bom-werks.
    l_bom_header-matnr = ls_bom-matnr.
    l_bom_header-bmeng = ls_bom-emeng.
    l_bom_header-datuv = ls_bom-datuv.
*  l_bom_header-stlal = wa_it_upload-stlal.
    l_bom_header-stlan = '1'.

    ADD 10 TO L_POSNR.
    CLEAR ls_bom_item.
    ls_bom_item-xline = '1'.
    ls_bom_item-posnr = L_POSNR.
    ls_bom_item-posnr = |{ ls_bom_item-posnr ALPHA = IN }|.
    ls_bom_item-postp = 'L'.
    ls_bom_item-idnrk = ls_bom-idnrk.
    ls_bom_item-menge = ls_bom-menge.
    ls_bom_item-meins = ls_bom-meins.
    ls_bom_item-sortf = ls_bom-sortf.
    APPEND ls_bom_item TO lt_bom_item.

    "相关性
    ls_list-matnr = ls_bom-matnr.
    ls_list-werks = ls_bom-werks.
    ls_list-sortf = ls_bom-sortf.
    ls_list-knnam = ls_bom-knnam.
    APPEND ls_list TO lt_list.

    AT END OF matnr.
      CALL FUNCTION 'CS_BI_BOM_CREATE_BATCH_INPUT1'
        EXPORTING
*         BDC_FLAG     = ' '
          bom_header   = l_bom_header
*         CLOSE_GROUP  = ' '
          commit_work  = 'X'
          group_data   = l_group_data
*         NEW_GROUP    = ' '
          tcode_mode   = 'N'
          tcode_update = 'S'
        IMPORTING
          msgid        = l_msgid
          msgno        = l_msgno
          msgty        = l_msgty
          msgv1        = l_msgv1
          msgv2        = l_msgv2
          msgv3        = l_msgv3
          msgv4        = l_msgv4
        TABLES
          bom_item     = lt_bom_item
          bom_sub_item = lt_sub_item.

      p_msgno = l_msgno.

      CALL FUNCTION 'WRITE_MESSAGE'
        EXPORTING
          msgid  = l_msgid
          msgno  = p_msgno
          msgty  = l_msgty
          msgv1  = l_msgv1
          msgv2  = l_msgv2
          msgv3  = l_msgv3
          msgv4  = l_msgv4
          msgv5  = space
        IMPORTING
          error  = l_error
          messg  = gs_msg
        EXCEPTIONS
          OTHERS = 1.

      APPEND gs_msg TO it_message.

      CLEAR:lt_bom_item,l_msgid,l_msgno,l_msgty,l_msgv1,l_msgv2,l_msgv3,l_msgv4,l_error,gs_msg.
    ENDAT.
  ENDLOOP.

  "相关性。
  IF lt_list IS NOT INITIAL.
    DATA:ls_cuob TYPE cuob.

    "判断物料是否属于  可配置物料。
    SELECT matnr,kzkfg INTO TABLE @DATA(lt_mara)
      FROM mara
      FOR ALL ENTRIES IN @lt_list
      WHERE matnr = @lt_list-matnr.
    SORT lt_mara BY matnr.

    SELECT matnr,werks,stlnr INTO TABLE @DATA(lt_mast)
      FROM mast
      FOR ALL ENTRIES IN @lt_list
      WHERE matnr = @lt_list-matnr
      AND werks = @lt_list-werks.
    SORT lt_mast BY matnr werks.

    SELECT knnam,knnum INTO TABLE @DATA(lt_cukb)
      FROM cukb
      FOR ALL ENTRIES IN @lt_list
      WHERE knnam = @lt_list-knnam.
    SORT lt_cukb BY knnam.

    IF lt_mara IS NOT INITIAL.

*   ----取相关性编号
      SELECT MAX( knobj ) FROM stpo
          INTO @DATA(lv_knobj)
          WHERE knobj >= '300000000000000000'
            AND knobj <= '399999999999999999'
            .
      IF sy-subrc NE 0 OR  lv_knobj = '000000000000000000'.
        lv_knobj = '300000000000000000'.
      ENDIF.

      LOOP AT lt_list INTO ls_list.
        READ TABLE lt_mara INTO DATA(ls_mara) WITH KEY matnr = ls_list-matnr BINARY SEARCH.
        IF sy-subrc EQ 0.
          READ TABLE lt_cukb INTO DATA(ls_cukb) WITH KEY knnam = ls_list-knnam BINARY SEARCH.
          IF sy-subrc EQ 0.
            READ TABLE lt_mast INTO DATA(ls_mast) WITH KEY matnr = ls_list-matnr werks = ls_list-werks BINARY SEARCH.
            IF sy-subrc EQ 0.
              ls_list-stlnr = ls_mast-stlnr.
              ls_list-knnum = ls_cukb-knnum.

              ADD 1 TO lv_knobj.

              SELECT SINGLE * INTO @DATA(ls_stpo)
                FROM stpo
                WHERE stlty = 'M'
                AND stlnr = @ls_mast-stlnr
                AND sortf = @ls_list-sortf.
              IF sy-subrc EQ 0.
                IF ls_stpo-knobj NE space.
                  DELETE FROM cuob WHERE knobj = ls_stpo-knobj.
                  COMMIT WORK AND WAIT.
                ENDIF.
                ls_stpo-knobj = lv_knobj.

                MODIFY stpo FROM ls_stpo.

                ls_cuob-mandt = sy-mandt.
                ls_cuob-kntab = 'STPO'.
                ls_cuob-knobj = lv_knobj.
                ls_cuob-knnum = ls_cukb-knnum.
                MODIFY cuob FROM ls_cuob.
              ENDIF.
            ENDIF.
          ENDIF.
        ENDIF.

        CLEAR:ls_mara,ls_cukb,ls_mast,ls_stpo,ls_cuob.
      ENDLOOP.

    ENDIF.
  ENDIF.


ENDFUNCTION.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值