【ABAP】重复制造模式下BOM中油类物料如何进行投料管理

重复制造模式下BOM中油类物料如何进行投料管理

  • 背景

汽车零部件如发动机、变速器等的生产常常采用重复制造模式。这些零部件的生产工艺相对成熟和固定,企业根据汽车主机厂的需求计划,在一定时期内大量生产相同规格和型号的零部件,通过稳定的生产流程和质量控制,确保零部件的供应和质量稳定性。

本例中公司A主要生产传动轴与万向节,传动轴在传递动力时需要不断地改变角度,万向节是实现这一功能的关键部件,其内部的滚针轴承、十字轴等零件在运转过程中需要润滑油的润滑。润滑油能够降低摩擦阻力,防止零件磨损,保证传动轴的正常运转和动力传递效率,减少振动和噪音。

该企业将油类物料定义为散装物料,在 BOM中体现其物料结构,但不纳入生产订单的成本统计,也不在生产订单发料时进行数量管理,可以采用成本中心消耗的模式,因为油类物料的价值相对较低,且每次使用量难以精确控制。

<批量修改BOM组件中生产相关标识>Demo

"打开 BOM
    REFRESH : LT_STPO[].
    CLEAR LV_VALID.
    LV_VALID  = P_DATUV+0(4)
             && P_DATUV+4(2)
             && P_DATUV+6(2).
    CALL FUNCTION 'CSAP_MAT_BOM_OPEN'
      EXPORTING
        MATERIAL               = LW_CONFIRM-MATNR
        PLANT                  = LW_CONFIRM-WERKS
        BOM_USAGE              = LW_CONFIRM-STLAN
        ALTERNATIVE            = LW_CONFIRM-VWALT
        VALID_FROM             = LV_VALID
        CHANGE_NO              = P_AENNR
*   REVISION_LEVEL         =
*   FL_NO_CHANGE_DOC       = ' '
* IMPORTING
*   O_STKO                 =
*   FL_WARNING             =
     TABLES
       T_STPO                 = LT_STPO[]
*   T_DEP_DATA             =
*   T_DEP_DESCR            =
*   T_DEP_ORDER            =
*   T_DEP_SOURCE           =
*   T_DEP_DOC              =
     EXCEPTIONS
       ERROR                  = 1
              .


    "修改 BOM
    LOOP AT LT_STPO WHERE COMPONENT = LW_CONFIRM-IDNRK.

*      CLEAR:      LT_MESSAGES, LT_MESSAGES[].
*      CALL FUNCTION 'CALO_INIT_API'
*        EXCEPTIONS
*          LOG_OBJECT_NOT_FOUND     = 1
*          LOG_SUB_OBJECT_NOT_FOUND = 2
*          OTHER_ERROR              = 3
*          OTHERS                   = 4.

      LT_STPO-CHANGE_NO  = P_AENNR.
      LT_STPO-REL_PROD   = ''.
*      I_STPO-VALID_FROM = LW_CONFIRM-DATUV.

      CALL FUNCTION 'CSAP_BOM_ITEM_MAINTAIN'
        EXPORTING
          I_STPO                   = LT_STPO
*   FL_DEP_ALE_CONFORM       = ' '
* IMPORTING
*   O_STPO                   =
*   FL_WARNING               =
* TABLES
*   T_DEP_DATA               =
*   T_DEP_DESCR              =
*   T_DEP_ORDER              =
*   T_DEP_SOURCE             =
*   T_DEP_DOC                =
       EXCEPTIONS
         ERROR                    = 1
                .
      IF SY-SUBRC = 0.
        LW_CONFIRM-SANFE = ''.
        LW_CONFIRM-AENNR = P_AENNR.
        LW_CONFIRM-DATUV = GW_AENR-DATUV.
        LW_CONFIRM-ICON = ICON_LED_GREEN.
        LW_CONFIRM-MESSAGE = TEXT-002."更新成功
      ELSE.
        LW_CONFIRM-ICON = ICON_LED_RED.
        LW_CONFIRM-MESSAGE = TEXT-007."更新异常
      ENDIF.

*      CALL FUNCTION 'CALO_LOG_READ_MESSAGES'
*        TABLES
*          MESSAGES_AND_PARAMETERS = LT_MESSAGES
*        EXCEPTIONS
*          OTHERS                  = 1.
*
*      CLEAR : GV_ERROR_FLAG.
*      LOOP AT LT_MESSAGES WHERE MSG_TYPE = 'E'.
*        GV_ERROR_FLAG = GV_ERROR_FLAG + 1.
*        LW_CONFIRM-ICON = ICON_LED_RED.
*        LW_CONFIRM-MESSAGE = LT_MESSAGES-MSG_TXT.
*      ENDLOOP.
*      IF GV_ERROR_FLAG IS NOT INITIAL.
*      ELSE.
*        LW_CONFIRM-SANFE = ''.
*        LW_CONFIRM-ICON = ICON_LED_GREEN.
*        LW_CONFIRM-MESSAGE = TEXT-002."更新成功
*      ENDIF.

    ENDLOOP.


    " 关闭BOM
    CALL FUNCTION 'CSAP_MAT_BOM_CLOSE'
      EXPORTING
        FL_COMMIT_AND_WAIT = 'X'
*      IMPORTING
*        FL_WARNING         = LT_FL_WARNING
      EXCEPTIONS
        ERROR              = 1
        OTHERS             = 2.
    IF SY-SUBRC <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
*         WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
    ENDIF.

公司A目前采用的是在月末生产结束后,根据实际产量以及BOM中油类物料的标准用量进行分摊,一次性投入,即下图所示的程序功能。

  • 实现

 

1、首先在ZGREASE表视图下维护油类物料清单。

2、新建中间仓代码,月间将油类物料移动到该仓库,后续该仓的库存参与投料分配。

*&---------------------------------------------------------------------*
*&      Form  BAPI_GOODSMVT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM BAPI_GOODSMVT .

  DATA : LS_HEADER  LIKE BAPI2017_GM_HEAD_01,
         LS_CODE    LIKE BAPI2017_GM_CODE,
         LS_HEADRET LIKE BAPI2017_GM_HEAD_RET.

  DATA : LT_ITEM   LIKE BAPI2017_GM_ITEM_CREATE OCCURS 0 WITH HEADER LINE,
         LT_RETURN LIKE BAPIRET2 OCCURS 0 WITH HEADER LINE.

  DATA : LT_ZMJMPPT311 LIKE ZMJMPPT311 OCCURS 0 WITH HEADER LINE.

  DATA : BEGIN OF LT_MSEG OCCURS 0,
          MBLNR LIKE MSEG-MBLNR,
          MJAHR LIKE MSEG-MJAHR,
          WERKS LIKE MSEG-WERKS,
          MATNR LIKE MSEG-MATNR,
          ZEILE LIKE MSEG-ZEILE,
          CPUDT LIKE MKPF-CPUDT,
          CPUTM LIKE MKPF-CPUTM,
          BWART LIKE MSEG-BWART,
          LGORT LIKE MSEG-LGORT,
          UMLGO LIKE MSEG-UMLGO,
          CHARG LIKE MSEG-CHARG,
          SOBKZ LIKE MSEG-SOBKZ,
          PSPNR LIKE MSEG-PS_PSP_PNR,
          BLDAT LIKE MKPF-BLDAT,
          BUDAT LIKE MKPF-BUDAT,
          ERFMG LIKE MSEG-ERFMG,
          ERFME LIKE MSEG-ERFME,
          USNAM LIKE MKPF-USNAM,
          BKTXT LIKE MKPF-BKTXT,
        END OF LT_MSEG.

  DATA : LV_ANSWER(1).
  PERFORM FRM_POPUP_INFO USING TEXT-T08
       'Infomation' CHANGING LV_ANSWER.
  IF LV_ANSWER <> 'J'.
    EXIT.
  ENDIF.

  LOOP AT GT_MAIN.

    IF  GT_MAIN-ERFMG IS INITIAL
     OR GT_MAIN-ERFMG EQ '0.000'.

      CONTINUE.

    ENDIF.

    CLEAR : LT_ITEM[], LT_ITEM.

    LS_HEADER-PSTNG_DATE = GT_MAIN-BUDAT.
    LS_HEADER-DOC_DATE   = GT_MAIN-BLDAT.
    LS_HEADER-HEADER_TXT = GT_MAIN-BKTXT.

    LS_CODE-GM_CODE = '04'.

    LT_ITEM-MATERIAL = GT_MAIN-MATNR.
    LT_ITEM-PLANT    = GT_MAIN-WERKS.
    LT_ITEM-STGE_LOC = GT_MAIN-LGORT.  "库存地点
*    LT_ITEM-BATCH    = GT_MAIN-CHARG.  "批次(不需要)
    LT_ITEM-ENTRY_QNT = GT_MAIN-ERFMG. "以输入单位计的数量
    LT_ITEM-ENTRY_UOM = GT_MAIN-ERFME. "条目单位
    LT_ITEM-MOVE_STLOC = GT_MAIN-UMLGO."收货/发货库存地点 RC19

    IF GT_MAIN-SOBKZ EQ 'Q'.

      LT_ITEM-MOVE_TYPE  = '411'.
      LT_ITEM-SPEC_STOCK = GT_MAIN-SOBKZ.
      LT_ITEM-VAL_WBS_ELEM = GT_MAIN-POSID.

    ELSE.

      LT_ITEM-MOVE_TYPE = '311'.

    ENDIF.

    APPEND LT_ITEM.
    CLEAR LT_ITEM.

    CALL FUNCTION 'BAPI_GOODSMVT_CREATE'
      EXPORTING
        GOODSMVT_HEADER  = LS_HEADER
        GOODSMVT_CODE    = LS_CODE
      IMPORTING
        GOODSMVT_HEADRET = LS_HEADRET
      TABLES
        GOODSMVT_ITEM    = LT_ITEM[]
        RETURN           = LT_RETURN[].

    IF LS_HEADRET IS NOT INITIAL.

      CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
        EXPORTING
          WAIT = 'X'.

      "获取物料凭证
      SELECT MSEG~MBLNR
             MSEG~MJAHR
             MSEG~WERKS
             MSEG~MATNR
             MSEG~ZEILE
             MKPF~CPUDT
             MKPF~CPUTM
             MSEG~BWART
             MSEG~LGORT
             MSEG~UMLGO
             MSEG~CHARG
             MSEG~SOBKZ
             MSEG~PS_PSP_PNR AS PSPNR
             MKPF~BLDAT
             MKPF~BUDAT
             MSEG~ERFMG
             MSEG~ERFME
             MKPF~USNAM
             MKPF~BKTXT
        INTO CORRESPONDING FIELDS OF TABLE LT_MSEG
        FROM MSEG
        JOIN MKPF
          ON MSEG~MBLNR EQ MKPF~MBLNR
         AND MSEG~MJAHR EQ MKPF~MJAHR
       WHERE MSEG~MBLNR EQ LS_HEADRET-MAT_DOC
         AND MSEG~MJAHR EQ LS_HEADRET-DOC_YEAR
         AND MSEG~SHKZG EQ 'H'.

      CLEAR : LT_ZMJMPPT311[], LT_ZMJMPPT311.

      LOOP AT LT_MSEG.

        LT_ZMJMPPT311-WERKS     = LT_MSEG-WERKS.
        LT_ZMJMPPT311-MATNR     = LT_MSEG-MATNR.
        LT_ZMJMPPT311-MBLNR     = LT_MSEG-MBLNR.
        LT_ZMJMPPT311-MJAHR     = LT_MSEG-MJAHR.
        LT_ZMJMPPT311-ZEILE     = LT_MSEG-ZEILE.
        LT_ZMJMPPT311-CPUDT     = LT_MSEG-CPUDT.
        LT_ZMJMPPT311-CPUTM     = LT_MSEG-CPUTM.
        LT_ZMJMPPT311-BWART     = LT_MSEG-BWART.
        LT_ZMJMPPT311-LGORT     = LT_MSEG-LGORT.
        LT_ZMJMPPT311-UMLGO     = LT_MSEG-UMLGO.
        LT_ZMJMPPT311-CHARG     = LT_MSEG-CHARG.
        LT_ZMJMPPT311-SOBKZ     = LT_MSEG-SOBKZ.
        LT_ZMJMPPT311-POSID     = GT_MAIN-POSID.
        LT_ZMJMPPT311-BLDAT     = LT_MSEG-BLDAT.
        LT_ZMJMPPT311-BUDAT     = LT_MSEG-BUDAT.
        LT_ZMJMPPT311-ERFMG     = LT_MSEG-ERFMG.
        LT_ZMJMPPT311-ERFME     = LT_MSEG-ERFME.
        LT_ZMJMPPT311-USNAM     = LT_MSEG-USNAM.
        LT_ZMJMPPT311-BKTXT     = LT_MSEG-BKTXT.
        LT_ZMJMPPT311-ERNAM     = SY-UNAME.
        LT_ZMJMPPT311-ERDAT     = SY-DATUM.
        LT_ZMJMPPT311-ERZET     = SY-UZEIT.

        APPEND LT_ZMJMPPT311.
        CLEAR  LT_ZMJMPPT311.

      ENDLOOP.

      INSERT ZMJMPPT311 FROM TABLE LT_ZMJMPPT311.

      GT_MAIN-MBLNR = LS_HEADRET-MAT_DOC.
      GT_MAIN-MJAHR = LS_HEADRET-DOC_YEAR.

      GT_MAIN-ZLABSTF = GT_MAIN-ZLABSTF - GT_MAIN-ERFMG.
      GT_MAIN-ZLABSTT = GT_MAIN-ZLABSTT + GT_MAIN-ERFMG.
      GT_MAIN-ERFMG_M = GT_MAIN-ERFMG_M + GT_MAIN-ERFMG.

      CLEAR GT_MAIN-ERFMG.

    ELSE.

      CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.

      READ TABLE LT_RETURN WITH KEY TYPE = 'E'.

      IF SY-SUBRC EQ '0'.
        GT_MAIN-ZRSLT = LT_RETURN-MESSAGE.
      ENDIF.

    ENDIF.

    MODIFY GT_MAIN.
    CLEAR  GT_MAIN.

  ENDLOOP.


ENDFORM.                    " BAPI_GOODSMVT

3、月末生产截至,确认产量,执行分配。

投入数量分配:出库数量合计 × ( 理论投入数量 ÷ 理论投入合计 )

*&---------------------------------------------------------------------*
*&      Form  EXCUTE_BACKFLUSH
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM EXCUTE_BACKFLUSH .

  DATA : LT_ROWID TYPE LVC_T_ROID,
         LS_ROWID TYPE LVC_S_ROID.

  DATA : LS_FLAG   LIKE BAPI_RM_FLG,
         LS_DATGEN LIKE BAPI_RM_DATGEN.

  DATA : LS_RETURN  LIKE BAPIRET2,
         LS_CONFIRM LIKE BAPI_RM_DATKEY-CONFIRMATION.

  DATA : LV_MSG TYPE BAPI_MSG.

  DATA : LT_ITEM LIKE BAPI2017_GM_ITEM_CREATE OCCURS 0 WITH HEADER LINE.

  DATA : LT_MAIN LIKE GT_MAIN OCCURS 0 WITH HEADER LINE.

  DATA : LT_ZMJMPPT261 LIKE ZMJMPPT261 OCCURS 0 WITH HEADER LINE.

  DATA : LV_BELNR LIKE BLPP-BELNR,
         LV_BUDAT(7),
         LV_ERROR.

  DATA : BEGIN OF LT_EXCUTE OCCURS 0,
          MATNR LIKE GT_MAIN-MATNR,
         END OF LT_EXCUTE.

  DATA : BEGIN OF LT_MSEG OCCURS 0,
          MBLNR LIKE MSEG-MBLNR,
          MJAHR LIKE MSEG-MJAHR,
          WERKS LIKE MSEG-WERKS,
          MATNR LIKE MSEG-MATNR,
          ZEILE LIKE MSEG-ZEILE,
          CPUDT LIKE MKPF-CPUDT,
          CPUTM LIKE MKPF-CPUTM,
          BWART LIKE MSEG-BWART,
          LGORT LIKE MSEG-LGORT,
          UMLGO LIKE MSEG-UMLGO,
          CHARG LIKE MSEG-CHARG,
          BLDAT LIKE MKPF-BLDAT,
          BUDAT LIKE MKPF-BUDAT,
          ERFMG LIKE MSEG-ERFMG,
          ERFME LIKE MSEG-ERFME,
          USNAM LIKE MKPF-USNAM,
          BKTXT LIKE MKPF-BKTXT,
         END OF LT_MSEG.

*  CALL METHOD GO_ALV->CHECK_CHANGED_DATA.

  CALL METHOD GO_ALV->GET_SELECTED_ROWS
    IMPORTING
      ET_ROW_NO = LT_ROWID.

  CHECK LT_ROWID IS NOT INITIAL.

  DATA : LV_ANSWER(1).
  PERFORM FRM_POPUP_INFO USING TEXT-T09
       'Infomation' CHANGING LV_ANSWER.
  IF LV_ANSWER <> 'J'.
    EXIT.
  ENDIF.

  LS_FLAG-BCKFLTYPE = '11'."个别组件消耗反冲
*  LS_FLAG-COMPONENTS_TYPE = '1'."反冲所有发货

  LOOP AT LT_ROWID INTO LS_ROWID.

    READ TABLE GT_MAIN INDEX LS_ROWID-ROW_ID.

    IF SY-SUBRC EQ '0' AND GT_MAIN-MBLNR IS INITIAL.

      LT_EXCUTE-MATNR = GT_MAIN-MATNR.

      APPEND LT_EXCUTE.
      CLEAR LT_EXCUTE.

    ENDIF.

  ENDLOOP.

  SORT LT_EXCUTE BY MATNR.
  DELETE ADJACENT DUPLICATES FROM LT_EXCUTE COMPARING MATNR.

  LOOP AT LT_EXCUTE.

    CLEAR LV_ERROR.

    LOOP AT GT_MAIN WHERE MATNR EQ LT_EXCUTE-MATNR.

      "出库数量 = 投入出库(合计)
      IF  GT_MAIN-ZGISUM EQ GT_MAIN-ZINGISUM.

        CLEAR : LT_ITEM[], LS_DATGEN, LT_ITEM.

        LS_DATGEN-MATERIALNR  = GT_MAIN-ZMATNR_UP.
        LS_DATGEN-PRODPLANT   = GT_MAIN-WERKS.
        LS_DATGEN-PLANPLANT   = GT_MAIN-WERKS.
        LS_DATGEN-PRODVERSION = GT_MAIN-VERID.
        LS_DATGEN-POSTDATE    = GT_MAIN-BUDAT.
        LS_DATGEN-DOCDATE     = GT_MAIN-BLDAT.
        LS_DATGEN-BACKFLQUANT = '1.000'.
        LS_DATGEN-DOCHEADERTXT = 'ZMJMPPR7001'.

        LT_ITEM-MATERIAL = GT_MAIN-MATNR.
        LT_ITEM-PLANT    = GT_MAIN-WERKS.
        LT_ITEM-STGE_LOC = GT_MAIN-LGORT.
        LT_ITEM-MOVE_TYPE = '261'.
        LT_ITEM-ENTRY_QNT = GT_MAIN-ZINGIQT.
        LT_ITEM-ENTRY_UOM = GT_MAIN-ZMEINS.

        APPEND LT_ITEM.
        CLEAR LT_ITEM.

        CALL FUNCTION 'BAPI_REPMANCONF1_CREATE_MTS'
          EXPORTING
            BFLUSHFLAGS    = LS_FLAG
            BFLUSHDATAGEN  = LS_DATGEN
          IMPORTING
            CONFIRMATION   = LS_CONFIRM
            RETURN         = LS_RETURN
          TABLES
            GOODSMOVEMENTS = LT_ITEM[].

        IF LS_CONFIRM IS NOT INITIAL.

          GT_MAIN-CONFIRM = LS_CONFIRM.
          CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
            EXPORTING
              WAIT = 'X'.

          CLEAR LV_BELNR.

          "获取物料凭证
          SELECT SINGLE BELNR
            INTO LV_BELNR
            FROM BLPP
           WHERE PRTNR EQ GT_MAIN-CONFIRM.

          GT_MAIN-MBLNR = LV_BELNR.
          GT_MAIN-MJAHR = GT_MAIN-BUDAT(4).
          GT_MAIN-ZEILE = '1'.
          "原辅材料已成功投放。
          GT_MAIN-ZRSLT = TEXT-S01.

          MODIFY GT_MAIN.

        ELSE.

          CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.

          GT_MAIN-ZRSLT = LS_RETURN-MESSAGE.
          LV_MSG = LS_RETURN-MESSAGE.
          LV_ERROR = 'X'.
          MODIFY GT_MAIN.
          EXIT.

        ENDIF.

      ELSE.

        "投入出库(合计)与出库数量(合计)不符。
        GT_MAIN-ZRSLT = TEXT-E04.
        LV_MSG = TEXT-E04.
        LV_ERROR = 'X'.
        MODIFY GT_MAIN.
        EXIT.

      ENDIF.

    ENDLOOP.

    IF LV_ERROR IS INITIAL.

      LOOP AT GT_MAIN WHERE MATNR EQ LT_EXCUTE-MATNR.

        SELECT MSEG~MBLNR
               MSEG~MJAHR
               MSEG~WERKS
               MSEG~MATNR
               MSEG~ZEILE
               MKPF~CPUDT
               MKPF~CPUTM
               MSEG~BWART
               MSEG~LGORT
               MSEG~UMLGO
               MSEG~CHARG
               MKPF~BLDAT
               MKPF~BUDAT
               MSEG~ERFMG
               MSEG~ERFME
               MKPF~USNAM
               MKPF~BKTXT
          INTO CORRESPONDING FIELDS OF TABLE LT_MSEG
          FROM MSEG
          JOIN MKPF
            ON MSEG~MBLNR EQ MKPF~MBLNR
           AND MSEG~MJAHR EQ MKPF~MJAHR
         WHERE MSEG~MBLNR EQ GT_MAIN-MBLNR
           AND MSEG~MJAHR EQ GT_MAIN-MJAHR.

        CLEAR : LT_ZMJMPPT261, LT_ZMJMPPT261[].

        LOOP AT LT_MSEG.

          LT_ZMJMPPT261-WERKS = LT_MSEG-WERKS.
          LT_ZMJMPPT261-MATNR = LT_MSEG-MATNR.
          LT_ZMJMPPT261-MBLNR = LT_MSEG-MBLNR.
          LT_ZMJMPPT261-MJAHR = LT_MSEG-MJAHR.
          LT_ZMJMPPT261-ZEILE = LT_MSEG-ZEILE.
          LT_ZMJMPPT261-CPUDT = LT_MSEG-CPUDT.
          LT_ZMJMPPT261-CPUTM = LT_MSEG-CPUTM.
          LT_ZMJMPPT261-BWART = LT_MSEG-BWART.
          LT_ZMJMPPT261-LGORT = LT_MSEG-LGORT.
          LT_ZMJMPPT261-CHARG = LT_MSEG-CHARG.
          LT_ZMJMPPT261-BLDAT = LT_MSEG-BLDAT.
          LT_ZMJMPPT261-BUDAT = LT_MSEG-BUDAT.
          LT_ZMJMPPT261-ERFMG = LT_MSEG-ERFMG.
          LT_ZMJMPPT261-ERFME = LT_MSEG-ERFME.
          LT_ZMJMPPT261-USNAM = LT_MSEG-USNAM.
          LT_ZMJMPPT261-BKTXT = LT_MSEG-BKTXT.

          LT_ZMJMPPT261-ZITNO     = GT_MAIN-ZITNO.
          LT_ZMJMPPT261-ZGISUM    = GT_MAIN-ZGISUM.
          LT_ZMJMPPT261-ZMATNR_UP = GT_MAIN-ZMATNR_UP.
          LT_ZMJMPPT261-AUFNR     = GT_MAIN-AUFNR.
          LT_ZMJMPPT261-PROCNR    = GT_MAIN-PROCNR.
          LT_ZMJMPPT261-VERID     = GT_MAIN-VERID.
          LT_ZMJMPPT261-ZPRDQT    = GT_MAIN-ZPRDQT.
          LT_ZMJMPPT261-ZMENGE    = GT_MAIN-ZMENGE.
          LT_ZMJMPPT261-ZMEINS    = GT_MAIN-ZMEINS.
          LT_ZMJMPPT261-ZLGIQT    = GT_MAIN-ZLGIQT.
          LT_ZMJMPPT261-ZLGISUM   = GT_MAIN-ZLGISUM.
          LT_ZMJMPPT261-ZLDISQT   = GT_MAIN-ZLDISQT.
          LT_ZMJMPPT261-ZINGIQT   = GT_MAIN-ZINGIQT.
          LT_ZMJMPPT261-ZINGISUM  = GT_MAIN-ZINGISUM.

          LT_ZMJMPPT261-ERNAM = SY-UNAME.
          LT_ZMJMPPT261-ERDAT = SY-DATUM.
          LT_ZMJMPPT261-ERZET = SY-UZEIT.

          APPEND LT_ZMJMPPT261.
          CLEAR LT_ZMJMPPT261.

        ENDLOOP.

        INSERT ZMJMPPT261 FROM TABLE LT_ZMJMPPT261.

      ENDLOOP.

      UPDATE ZMJMPPT311 SET ZGIID = 'X'
                          ZACTM = P_BUDAT
                          AENAM = SY-UNAME
                          AEDAT = SY-DATUM
                          AEZET = SY-UZEIT
                    WHERE WERKS   EQ P_WERKS
                      AND MATNR   EQ LT_EXCUTE-MATNR
                      AND ZCANCID NE 'X'
                      AND ZGIID   NE 'X'.

    ELSE.

      LS_FLAG-BCKFLTYPE = '31'."个别组件消耗反冲(凭证相关冲销)

      LOOP AT GT_MAIN WHERE MATNR EQ LT_EXCUTE-MATNR.

        IF GT_MAIN-MBLNR IS NOT INITIAL.

          CLEAR : LT_ITEM[], LS_DATGEN, LT_ITEM.

          LS_DATGEN-MATERIALNR  = GT_MAIN-ZMATNR_UP.
          LS_DATGEN-PRODPLANT   = GT_MAIN-WERKS.
          LS_DATGEN-PLANPLANT   = GT_MAIN-WERKS.
          LS_DATGEN-PRODVERSION = GT_MAIN-VERID.
          LS_DATGEN-POSTDATE    = GT_MAIN-BUDAT.
          LS_DATGEN-DOCDATE     = GT_MAIN-BLDAT.
          LS_DATGEN-BACKFLQUANT = '1.000'.


          LT_ITEM-MATERIAL = GT_MAIN-MATNR.
          LT_ITEM-PLANT    = GT_MAIN-WERKS.
          LT_ITEM-STGE_LOC = GT_MAIN-LGORT.
          LT_ITEM-MOVE_TYPE = '262'.
          LT_ITEM-ENTRY_QNT = GT_MAIN-ZINGIQT.
          LT_ITEM-ENTRY_UOM = GT_MAIN-ZMEINS.

          APPEND LT_ITEM.
          CLEAR LT_ITEM.

          CALL FUNCTION 'BAPI_REPMANCONF1_CREATE_MTS'
            EXPORTING
              BFLUSHFLAGS    = LS_FLAG
              BFLUSHDATAGEN  = LS_DATGEN
            IMPORTING
              CONFIRMATION   = LS_CONFIRM
              RETURN         = LS_RETURN
            TABLES
              GOODSMOVEMENTS = LT_ITEM[].

          IF LS_CONFIRM IS NOT INITIAL.

            CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
              EXPORTING
                WAIT = 'X'.

            CLEAR : GT_MAIN-MBLNR, GT_MAIN-MJAHR, GT_MAIN-ZEILE.

            GT_MAIN-ZRSLT = TEXT-E05.

          ELSE.

            CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.

            GT_MAIN-ZRSLT = LS_RETURN-MESSAGE.

          ENDIF.

        ELSE.

          GT_MAIN-ZRSLT = LV_MSG.

        ENDIF.

        MODIFY GT_MAIN.

      ENDLOOP.

    ENDIF.

  ENDLOOP.


ENDFORM.                    " EXCUTE_BACKFLUSH

### 查找ABAP中通过BOM反查顶层物料的方法 在SAP ABAP环境中,为了实现从底层物料反查至顶层物料的功能,通常采用递归方法。具体来说,先将目标底层或中间层物料放入内表`gt_mast`,随后调用`CS_WHERE_USED_MAT`函数模块来查找上一层级的物料[^3]。 由于每次调用仅能返回直接上级的信息,因此需要构建一个循环机制直到达到最高层级为止。当检测到某次查询的结果指向的是成品或是已经到达最顶级时,则设置特定标记位为'X'。此过程持续执行直至所有记录都被标记完毕,最后依据需求筛选并去除冗余数据项完成整个流程。 下面是一段用于演示如何利用递归来遍历整条产品结构链路直至找到根节点(即顶层物料)的示例代码: ```abap DATA: lt_materials TYPE TABLE OF mara, ls_material TYPE mara. FIELD-SYMBOLS: <fs_mat> LIKE LINE OF lt_materials. PARAMETERS: p_matnr TYPE matnr OBLIGATORY. START-OF-SELECTION. " 初始化:加载初始材料列表 SELECT * FROM mara INTO CORRESPONDING FIELDS OF TABLE lt_materials WHERE matnr = @p_matnr. PERFORM find_top_level USING lt_materials CHANGING lt_materials. END-OF-SELECTION. LOOP AT lt_materials ASSIGNING FIELD-SYMBOL(<fs_mat>). WRITE:/ 'Top Level Material:', |{ <fs_mat>-matnr }|. ENDLOOP. FORM find_top_level USING it_input TYPE TABLE OF mara CHANGING ct_output TYPE TABLE OF mara. DATA: lv_found_all TYPE c VALUE space, lt_used_list TYPE TABLE OF cs_where_used_item OCCURS 0 WITH HEADER LINE. CLEAR: lv_found_all, lt_used_list[]. CALL FUNCTION 'CS_WHERE_USED_MAT' EXPORTING material = 'MATNR' plant = 'PLANT' * OTHER PARAMETER... TABLES whereusedlist= lt_used_list[] EXCEPTIONS NOT_FOUND = 1 OTHERS = 2. IF sy-subrc EQ 0 AND lines( lt_used_list ) GT 0. DELETE ADJACENT DUPLICATES FROM lt_used_list COMPARING matnr. APPEND LINES OF lt_used_list TO ct_output. MODIFY ct_output TRANSPORTING NO FIELDS WHERE top_flag NE 'X'. READ TABLE ct_output INDEX 1 ASSIGNING FIELD-SYMBOL(<top>). WHILE ASSIGNED( <top> ). CHECK <top>-top_flag IS INITIAL. REFRESH lt_used_list. CALL FUNCTION 'CS_WHERE_USED_MAT' EXPORTING material = <top>-matnr ... TABLES whereusedlist= lt_used_list[] EXCEPTIONS NOT_FOUND = 1 OTHERS = 2. IF sy-subrc EQ 0 AND lines( lt_used_list ) GT 0. INSERT LINES OF lt_used_list INTO TABLE ct_output. MODIFY ct_output TRANSPORTING NO FIELDS WHERE top_flag NE 'X'. ELSE. MODIFY ct_output SETTING <top>-top_flag = 'X'. ENDIF. READ TABLE ct_output INDEX 1 ASSIGNING (top>. ENDWHILE. ENDIF. ENDFORM. ``` 这段程序展示了基本逻辑框架,实际开发过程中可能还需要考虑更多细节如异常处理、性能优化等问题。此外,对于大型企业系统而言,建议充分测试以确保算法稳定性和准确性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

SAP剑客

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

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

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

打赏作者

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

抵扣说明:

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

余额充值