UB单修改

FUNCTION Z_SD_UB_CHANGE.
*"----------------------------------------------------------------------
*"*"Local Interface:
*"  IMPORTING
*"     REFERENCE(IM_EBELN) TYPE  EBELN
*"     REFERENCE(IM_TYPE) TYPE  CHAR4
*"     REFERENCE(IM_BUDAT) TYPE  BUDAT DEFAULT SY-DATUM
*"  TABLES
*"      IT_ITEM STRUCTURE  ZSDS0025
*"      IT_RETURN STRUCTURE  BAPIRET2 OPTIONAL
*"----------------------------------------------------------------------
***********************************************************************
*  Function <Z_SD_UB_CHANGE>
************************************************************************
*
*  作者:            DZHANGHUI
*  完成日期:        2014/12/31
*  描述:            UB单返写 发货
************************************************************************
*  版本号 日期   作者   修改描述 功能更改说明书
************************************************************************
*  1.  YYYY/MM/DD author  Read dataset from app. Server @001
************************************************************************
  DATA : LV_EBELN    TYPE BAPIMEPOHEADER-PO_NUMBER,
         LV_ITEM     LIKE GS_POITEM-PO_ITEM,
         LV_WERKS    LIKE GS_POITEM-PLANT,
         LV_SUPPL    LIKE GS_POITEM-SUPPL_STLOC,
         LV_CAT      LIKE GS_POITEM-ITEM_CAT,
         LV_VAL_TYPE LIKE GS_POITEM-VAL_TYPE,
         LV_BWTTY    LIKE MARC-BWTTY.         "评估类别

  DATA : LS_ITEM TYPE ZSDS0025.

  LV_EBELN = IM_EBELN.

  REFRESH : GT_POITEM,GT_POITEMX,
            GT_POSCHEDULE,GT_POSCHEDULEX.

* 获取PO的Detail
  CALL FUNCTION 'BAPI_PO_GETDETAIL1'
    EXPORTING
      PURCHASEORDER = LV_EBELN
    TABLES
      POITEM        = GT_POITEM.


*  IF IM_TYPE = 'SJ'."素金
*   删除原来的行项目
  LOOP AT GT_POITEM INTO GS_POITEM.
    IF ( GS_POITEM-BATCH IS INITIAL OR GS_POITEM-BATCH  EQ GS_POITEM-MATERIAL ) AND
        GS_POITEM-DELETE_IND IS INITIAL.
      GS_POITEM-DELETE_IND = 'D'.
      MODIFY GT_POITEM FROM GS_POITEM INDEX SY-TABIX TRANSPORTING DELETE_IND.

      GS_POITEMX-PO_ITEM = GS_POITEM-PO_ITEM.
      GS_POITEMX-DELETE_IND = 'X'.
      APPEND GS_POITEMX TO GT_POITEMX.
    ENDIF.

    LV_ITEM = GS_POITEM-PO_ITEM.
    LV_WERKS = GS_POITEM-PLANT.
    LV_SUPPL = GS_POITEM-SUPPL_STLOC.
    LV_CAT   = GS_POITEM-ITEM_CAT.
    LV_VAL_TYPE   = GS_POITEM-VAL_TYPE.
  ENDLOOP.

*   获取工厂 项目类型
  IF SY-SUBRC NE 0.
    READ TABLE GT_POITEM INTO GS_POITEM INDEX 1.
    LV_ITEM = GS_POITEM-PO_ITEM.
    LV_WERKS = GS_POITEM-PLANT.
    LV_SUPPL = GS_POITEM-SUPPL_STLOC.
    LV_CAT   = GS_POITEM-ITEM_CAT.
    LV_VAL_TYPE   = GS_POITEM-VAL_TYPE.
  ENDIF.

*   新增需要发货的行项目
  LOOP AT IT_ITEM INTO LS_ITEM.
*   检查不存在相同物料和批次的行项目
    READ TABLE GT_POITEM INTO GS_POITEM WITH KEY MATERIAL = LS_ITEM-ZSPKH BATCH = LS_ITEM-ZSPPC DELETE_IND = ''.
    CHECK SY-SUBRC NE 0.

    ADD 10 TO LV_ITEM.

    CLEAR GS_POITEM.
    GS_POITEM-PO_ITEM     = LV_ITEM.
    GS_POITEM-MATERIAL    = LS_ITEM-ZSPKH.
    GS_POITEM-PLANT       = LV_WERKS.
    GS_POITEM-BATCH       = LS_ITEM-ZSPPC.
    GS_POITEM-SUPPL_STLOC = LV_SUPPL.
    GS_POITEM-QUANTITY    = LS_ITEM-ZSPJH.
    GS_POITEM-ITEM_CAT    = LV_CAT.
*     检查物料是否启用评估类别
    PERFORM FRM_CHECK_VALUE_TYPE USING    LV_WERKS LS_ITEM-ZSPKH
                                 CHANGING LV_BWTTY.
*     评估类型
    IF LV_BWTTY EQ 'X'.
      GS_POITEM-VAL_TYPE    = LS_ITEM-ZSPPC.
    ENDIF.

    APPEND GS_POITEM TO GT_POITEM.

    CLEAR GS_POITEMX.
    GS_POITEMX-PO_ITEM     = LV_ITEM.
    GS_POITEMX-MATERIAL    = 'X'.
    GS_POITEMX-PLANT       = 'X'.
    GS_POITEMX-BATCH       = 'X'.
    GS_POITEMX-SUPPL_STLOC = 'X'.
    GS_POITEMX-QUANTITY    = 'X'.
    GS_POITEMX-ITEM_CAT    = 'X'.
    IF LV_BWTTY EQ 'X'.
      GS_POITEMX-VAL_TYPE    = 'X'.
    ENDIF.
    APPEND GS_POITEMX TO GT_POITEMX.

*   更新计划行
    CLEAR GS_POSCHEDULE.
    GS_POSCHEDULE-PO_ITEM = LV_ITEM.
    GS_POSCHEDULE-SCHED_LINE = 1.
    GS_POSCHEDULE-DELIVERY_DATE = IM_BUDAT.
    APPEND GS_POSCHEDULE TO GT_POSCHEDULE.

    CLEAR GS_POSCHEDULEX.
    GS_POSCHEDULEX-PO_ITEM = LV_ITEM.
    GS_POSCHEDULEX-SCHED_LINE = 1.
    GS_POSCHEDULEX-DELIVERY_DATE = 'X'.
    APPEND GS_POSCHEDULEX TO GT_POSCHEDULEX.
  ENDLOOP.
*  ELSEIF IM_TYPE = 'XQ'."镶嵌
*    LOOP AT IT_ITEM INTO LS_ITEM.
**     检查是否存在相同的物料和批次,若存在则不需返写
*      READ TABLE GT_POITEM INTO GS_POITEM WITH KEY MATERIAL = LS_ITEM-ZSPKH
*                                                   BATCH    = LS_ITEM-ZSPPC.
*      CHECK SY-SUBRC NE 0.
*
**     查找无批次的行项目 - 返写批次信息
*      READ TABLE GT_POITEM INTO GS_POITEM WITH KEY MATERIAL = LS_ITEM-ZSPKH
*                                                   BATCH    = ''.
*      IF SY-SUBRC EQ 0.
*        GS_POITEM-BATCH = LS_ITEM-ZSPPC.
*        GS_POITEM-QUANTITY = LS_ITEM-ZSPJH.
*        MODIFY GT_POITEM FROM GS_POITEM INDEX SY-TABIX TRANSPORTING BATCH.
*
*        GS_POITEMX-PO_ITEM = GS_POITEM-PO_ITEM.
*        GS_POITEMX-BATCH = 'X'.
*        GS_POITEMX-QUANTITY = 'X'.
*        APPEND GS_POITEMX TO GT_POITEMX.
*      ENDIF.
*    ENDLOOP.
*  ENDIF.
  CHECK GT_POITEM IS NOT INITIAL.

* 修改订单
  CALL FUNCTION 'BAPI_PO_CHANGE'
    EXPORTING
      PURCHASEORDER = LV_EBELN
    TABLES
      RETURN        = GT_RETURN
      POITEM        = GT_POITEM
      POITEMX       = GT_POITEMX
      POSCHEDULE    = GT_POSCHEDULE
      POSCHEDULEX   = GT_POSCHEDULEX.

  LOOP AT GT_RETURN INTO GS_RETURN WHERE TYPE = 'X' OR
                                         TYPE = 'A' OR
                                         TYPE = 'E'.
    EXIT.
  ENDLOOP.

  IF SY-SUBRC EQ 0.
    CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
  ELSE.
    CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
      EXPORTING
        WAIT = 'X'.
  ENDIF.

  IT_RETURN[] = GT_RETURN.
ENDFUNCTION.
FORM FRM_CHECK_VALUE_TYPE  USING    P_WERKS
                                    P_MATNR
                           CHANGING P_BWTTY.
  CLEAR P_BWTTY.

  SELECT SINGLE BWTTY INTO P_BWTTY
    FROM MARC
    WHERE WERKS = P_WERKS
      AND MATNR = P_MATNR.
ENDFORM.                    " FRM_CHECK_VALUE_TYPE
原文地址:https://www.cnblogs.com/sapSB/p/5771705.html