CSAP_MAT_BOM_MAINTAIN修改问题

本文介绍了一个用于处理产品结构(BOM)变更的SAP接口函数。该函数能够实现物料清单的增删改操作,并特别关注了安装地点字段在修改过程中的处理方式。通过实例演示了如何使用该接口进行具体的BOM维护。

使用此函数修改时,

只要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.

 

<think>好的,用户在使用CSAP_MAT_BOM_MAINTAIN创建BOM时遇到报错,需要解决。首先,我需要回顾相关的引用资料。根据引用[1],用户可能在创建备选BOM时没有指定备选编号,导致错误。引用[4]提到这个函数本身不返回消息,需要调用CALO_INIT_API来获取错误日志。另外,引用[2]指出正确使用CSAP系列的三个函数来维护BOM,可能用户没有按照正确的顺序调用。 接下来,用户的问题可能涉及参数填写错误,比如物料号、工厂、BOM用途等必填字段是否正确。另外,备选BOM的编号是否有效,需要检查是否在后台配置中存在。引用[3]提到用户可能没有正确处理返回消息,因此需要确认是否调用了必要的函数来捕获错误信息。 可能的解决方案步骤包括:检查必填参数是否完整,确保备选BOM编号正确,调用CALO_INIT_API初始化日志,然后执行BOM维护函数,最后使用CALO_SHOW_MESSAGES显示错误。同时,按照引用[2]的建议,分步骤使用OPEN、ITEM_MAINTAIN和CLOSE函数可能更可靠。 还要考虑用户是否有权限问题,或者后台配置是否正确。比如,BOM类型是否允许创建备选,工厂参数是否正确等。如果用户是改造了标准函数,可能还需要检查自定义代码是否影响了原有逻辑。 总结来说,需要从参数检查、备选编号、日志初始化、函数调用顺序等方面逐步排查,确保每一步都符合SAP的要求,同时参考官方文档和已有的解决方案来处理报错。</think>### 逐步解决方案:CSAP_MAT_BOM_MAINTAIN 创建BOM报错处理 1. **检查必填参数完整性** 确保调用函数时传递了以下关键参数: - `MATNR`(物料号) - `WERKS`(工厂代码) - `STLAN`(BOM用途,如生产/设计) - `STLAL`(备选BOM编号,若需要创建备选BOM则必填) 若未指定`STLAL`,需明确是否需要备选BOM,或检查后台配置是否允许空值[^1]。 2. **初始化消息日志** 在调用`CSAP_MAT_BOM_MAINTAIN`前,**必须调用`CALO_INIT_API`**以初始化消息处理: ```abap CALL FUNCTION 'CALO_INIT_API' EXPORTING data_reset_sign = ' ' EXCEPTIONS log_object_not_found = 1 log_sub_object_not_found = 2 other_error = 3. ``` 调用后可通过`CALO_SHOW_MESSAGES`显示详细错误信息[^4]。 3. **分步维护BOM(替代方案)** 若直接使用`CSAP_MAT_BOM_MAINTAIN`仍失败,可改用以下组合函数: - **打开BOM**:`CSAP_MAT_BOM_OPEN` - **维护BOM行项目**:`CSAP_BOM_ITEM_MAINTAIN` - **关闭BOM**:`CSAP_MAT_BOM_CLOSE` 此方法更适合复杂BOM的增量修改[^2]。 4. **验证备选BOM配置** 若错误与备选BOM相关(如消息`STLAL not maintained`),需检查: - 物料主数据的BOM视图是否允许备选BOM - 事务代码`OS20`中是否配置了备选BOM的编号范围 - 备选编号`STLAL`是否在允许的范围内。 5. **示例代码模板** ```abap DATA: lt_messages TYPE TABLE OF bdcmsgcoll. CALL FUNCTION 'CALO_INIT_API'. CALL FUNCTION 'CSAP_MAT_BOM_MAINTAIN' EXPORTING material = 'MATERIAL_001' plant = '1000' bom_usage = '1' "生产用途 alternate_bom = '01' "备选BOM编号 valid_from = sy-datum TABLES return_messages = lt_messages EXCEPTIONS error = 1. IF sy-subrc <> 0. CALL FUNCTION 'CALO_SHOW_MESSAGES' EXPORTING show_msg_prefix = 'X'. ENDIF. ``` --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值