SAP Alternative BOM创建+BOM Subitem维护

1)调用 CSAI_BOM_CREATE 创建BOM,这个函数可以指定alternative BOM。

2)调用CSAP_MAT_BOM_READ读取BOM信息。

3)调用CSAP_MAT_BOM_MAINTAIN更改BOM Subitem。这个函数有个问题,会清空BOM抬头(MAST表)里的Lot size From / Lot size to,需要通过下面的语句来避免该问题。

    EXPORT data_reset_sign = abap_true TO MEMORY ID 'data_reset_sign'.

------------------------------------------------------------------------------------------------------------------

FORM create_bom.

  DATA:
    lt_messages        TYPE STANDARD TABLE OF messages,
    ls_ecsin           TYPE csin,
    ls_estkob          TYPE stkob,
    ls_estzub          TYPE stzub,
    ls_emastb          TYPE mastb,
    lt_stpob           TYPE STANDARD TABLE OF stpob,
    ls_stpob           TYPE stpob,
    lt_stpo_read       TYPE STANDARD TABLE OF stpo_api02,
    ls_stpo_read       TYPE stpo_api02,
    lt_stko_read       TYPE STANDARD TABLE OF stko_api02,
    ls_stko_read       TYPE stko_api02,
    lt_stpu_read       TYPE STANDARD TABLE OF stpu_api01,
    lt_stpo_change     TYPE STANDARD TABLE OF stpo_api03,
    ls_stpo_change     TYPE stpo_api03,
    lt_stpu_change     TYPE STANDARD TABLE OF stpu_api01,
    ls_stpu_change     TYPE stpu_api01,
    ls_stko_change     TYPE stko_api01,
    lv_material        TYPE csap_mbom-matnr,
    lv_plant           TYPE csap_mbom-werks,
    lv_bom_usage       TYPE csap_mbom-stlan,
    lv_bom_category    TYPE stlty,
    lv_alternative     TYPE csap_mbom-stlal,
    lv_valid_from      TYPE csap_mbom-datuv,
    lv_astlnr          TYPE stzub-stlnr,
    lv_warning         TYPE capiflag-flwarning,
    lv_commit_and_wait TYPE capiflag-comm_wait,
    lv_change_no       TYPE csap_mbom-aennr,
    lv_ale             TYPE csdata-xfeld,
    lv_bom_create      TYPE csdata-xfeld,
    lv_new_item        TYPE csdata-xfeld,
    lv_complete        TYPE csdata-xfeld.

  LOOP AT gt_bom ASSIGNING FIELD-SYMBOL(<lfs_bom>)
    WHERE stlnr IS INITIAL.

    lv_material = <lfs_bom>-bicsk-matnr.

    lv_plant = <lfs_bom>-bicsk-werks.

    lv_bom_usage = <lfs_bom>-bicsk-stlan.

    lv_bom_category = gc_stlty_material.

    lv_alternative = <lfs_bom>-bicsk-stlal.

    lv_valid_from = <lfs_bom>-bicsk-datuv.

    lv_change_no = <lfs_bom>-bicsk-aennr.

    CLEAR ls_ecsin.
    ls_ecsin-datuv = p_datuv.
    ls_ecsin-matnr = lv_material.
    ls_ecsin-stlal = lv_alternative.
    ls_ecsin-stlan = lv_bom_usage.
    ls_ecsin-werks = lv_plant.
    ls_ecsin-stlty = lv_bom_category.
    ls_ecsin-aennr = lv_change_no.

    CLEAR ls_estkob.
    ls_estkob-stlty = lv_bom_category.
    ls_estkob-stlal = lv_alternative.
    ls_estkob-datuv = p_datuv.
    ls_estkob-stktx = <lfs_bom>-bicsk-stktx.
    ls_estkob-bmein = <lfs_bom>-bicsk-bmein.
    ls_estkob-bmeng = <lfs_bom>-bicsk-bmeng.

    CLEAR ls_estzub.
    ls_estzub-stlty = lv_bom_category.
    ls_estzub-stlan = lv_bom_usage.
    ls_estzub-ztext = <lfs_bom>-bicsk-ztext.
    ls_estzub-altst = abap_true.

    CLEAR ls_emastb.
    ls_emastb-matnr = lv_material.
    ls_emastb-werks = lv_plant.
    ls_emastb-stlan = lv_bom_usage.
    ls_emastb-stlal = lv_alternative.
    ls_emastb-losvn = 1.
    ls_emastb-losbs = 99999999.

    CLEAR lt_stpob.

    LOOP AT <lfs_bom>-bicsp INTO DATA(ls_bicsp).

      CLEAR ls_stpob.

      MOVE-CORRESPONDING ls_bicsp TO ls_stpob.

*      IF <lfs_output>-ausch <> 0.
*        ls_stpo-comp_scrap = <lfs_output>-ausch.
*      ENDIF.
*
*      IF <lfs_output>-sanka <> 'P'.
*        ls_stpo-rel_cost = <lfs_output>-sanka.
*      ELSE.
*        CLEAR:ls_stpo-rel_cost.
*      ENDIF.
*
*      ls_stpob-sanka = ls_stpo-rel_cost.
*      ls_stpob-ausch = ls_stpo-comp_scrap.

      APPEND ls_stpob TO lt_stpob.

    ENDLOOP.

    CALL FUNCTION 'CALO_INIT_API'
      EXPORTING
        data_reset_sign          = ''
      EXCEPTIONS
        log_object_not_found     = 1
        log_sub_object_not_found = 2
        OTHERS                   = 3.

    IF sy-subrc <> 0.

      CLEAR lt_messages.

    ENDIF.

    lv_commit_and_wait = abap_true.

    lv_ale = abap_true.

    CALL FUNCTION 'CSAI_BOM_CREATE'
      EXPORTING
        ecsin              = ls_ecsin
        estkob             = ls_estkob
        estzub             = ls_estzub
        emastb             = ls_emastb
        fl_commit_and_wait = lv_commit_and_wait
        fl_ale             = lv_ale
      IMPORTING
        fl_warning         = lv_warning
        astlnr             = lv_astlnr
      TABLES
        t_stpob            = lt_stpob
      EXCEPTIONS
        error              = 1
        OTHERS             = 2.

    IF sy-subrc <> 0.

      CLEAR lv_astlnr.

    ENDIF.

    IF lv_astlnr IS INITIAL.

      CALL FUNCTION 'CALO_LOG_READ_MESSAGES'
        TABLES
          messages_and_parameters = lt_messages
        EXCEPTIONS
          warning                 = 1
          error                   = 2
          OTHERS                  = 3.
      IF sy-subrc <> 0.
        CLEAR lt_messages.
      ENDIF.

      PERFORM display_message TABLES lt_messages.

* BOM creation failed
      MESSAGE s014(zprd002) DISPLAY LIKE 'E'.

      gv_error = abap_true.

      CONTINUE.

    ENDIF.

    <lfs_bom>-stlnr = lv_astlnr.

    CALL FUNCTION 'CALO_INIT_API'
      EXPORTING
        data_reset_sign          = ''
      EXCEPTIONS
        log_object_not_found     = 1
        log_sub_object_not_found = 2
        OTHERS                   = 3.

    IF sy-subrc <> 0.

      CLEAR lt_messages.

    ENDIF.

    CALL FUNCTION 'CSAP_MAT_BOM_READ'
      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
      TABLES
        t_stpo      = lt_stpo_read
        t_stko      = lt_stko_read
        t_stpu      = lt_stpu_read
      EXCEPTIONS
        error       = 1
        OTHERS      = 2.

    IF sy-subrc <> 0.

      CLEAR: lt_stpo_read, lt_stko_read, lt_stpu_read.

      CALL FUNCTION 'CALO_LOG_READ_MESSAGES'
        TABLES
          messages_and_parameters = lt_messages
        EXCEPTIONS
          warning                 = 1
          error                   = 2
          OTHERS                  = 3.
      IF sy-subrc <> 0.
        CLEAR lt_messages.
      ENDIF.

      PERFORM display_message TABLES lt_messages.

* BOM read failed
      MESSAGE s015(zprd002) DISPLAY LIKE 'E'.

      gv_error = abap_true.

      CONTINUE.

    ENDIF.

    SORT lt_stko_read BY bom_no DESCENDING.

    SORT lt_stpo_read BY bom_no item_no.

    READ TABLE lt_stko_read INTO ls_stko_read INDEX 1.

    IF sy-subrc = 0.

      MOVE-CORRESPONDING ls_stko_read TO ls_stko_change.

    ENDIF.

    CLEAR: lt_stpo_change, lt_stpu_change.

    LOOP AT <lfs_bom>-bicsp INTO ls_bicsp.

      READ TABLE lt_stpo_read INTO ls_stpo_read
        WITH KEY bom_no = ls_stko_read-bom_no
                 item_no = ls_bicsp-posnr
                 BINARY SEARCH.
      IF sy-subrc <> 0.
        CLEAR ls_stpo_read.
      ENDIF.

      LOOP AT <lfs_bom>-bicsu INTO DATA(ls_bicsu)
        WHERE xline = ls_bicsp-xline.

        CLEAR ls_stpu_change.

        ls_stpu_change-pointer = ls_stpo_read-item_node.

        ls_stpu_change-stlkn = ls_stpo_read-item_node. "BOM item node number

        ls_stpu_change-stpoz = ls_stpo_read-item_count.

        ls_stpu_change-uposz = ls_bicsu-uposz. "Subitem Number

        ls_stpu_change-upmng = ls_bicsu-upmng. "Sub-item quantity

        ls_stpu_change-ebort = ls_bicsu-ebort.   "Installation point

        ls_stpu_change-uptxt = ls_bicsu-uptxt. "BOM sub-item text

        ls_stpu_change-vbkz = 'I'. "Insert

        ls_stpu_change-selkz = abap_true.

        APPEND ls_stpu_change TO lt_stpu_change.

      ENDLOOP.

      IF sy-subrc <> 0.

        CONTINUE.

      ENDIF.

      CLEAR ls_stpo_change.

      MOVE-CORRESPONDING ls_stpo_read TO ls_stpo_change.

      ls_stpo_change-identifier = ls_stpo_read-item_node.

      APPEND ls_stpo_change TO lt_stpo_change.

    ENDLOOP.

    IF lt_stpo_change IS INITIAL.

      CONTINUE.

    ENDIF.

    lv_bom_create = abap_false.
    lv_new_item = abap_false.
    lv_complete = abap_false.

    CLEAR ls_stko_read.

    CALL FUNCTION 'CALO_INIT_API'
      EXPORTING
        data_reset_sign          = ''
      EXCEPTIONS
        log_object_not_found     = 1
        log_sub_object_not_found = 2
        OTHERS                   = 3.

    IF sy-subrc <> 0.

      CLEAR lt_messages.

    ENDIF.

    EXPORT data_reset_sign = abap_true TO MEMORY ID 'data_reset_sign'.

    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_stko_change
        fl_commit_and_wait = lv_commit_and_wait
        fl_bom_create      = lv_bom_create
        fl_new_item        = lv_new_item
        fl_complete        = lv_complete
      IMPORTING
        fl_warning         = lv_warning
        o_stko             = ls_stko_read
      TABLES
        t_stpo             = lt_stpo_change
        t_stpu             = lt_stpu_change
      EXCEPTIONS
        error              = 1
        OTHERS             = 2.

    IF sy-subrc <> 0.

      CLEAR: ls_stko_read.

      CALL FUNCTION 'CALO_LOG_READ_MESSAGES'
        TABLES
          messages_and_parameters = lt_messages
        EXCEPTIONS
          warning                 = 1
          error                   = 2
          OTHERS                  = 3.
      IF sy-subrc <> 0.
        CLEAR lt_messages.
      ENDIF.

      PERFORM display_message TABLES lt_messages.

* BOM subitem maintain failed
      MESSAGE s016(zprd002) DISPLAY LIKE 'E'.

      gv_error = abap_true.

      CONTINUE.

    ENDIF.

    gv_bom_created = abap_true.

* BOM created
    MESSAGE s013(zprd002).

  ENDLOOP.

ENDFORM.

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值