根据采购申请(PR)修改询价单数量(RFQ)

业务场景:

采购申请在完成部分采购后,不需继续采购,需要关闭采购申请,需要将询价单多出的数量进行修改。

问题点:

  1. 采购订单的数量与询价单的数量一致的时候,询价单不应被修改;

  2. 采购订单数量小于询价单数量,询价单数量不能低于采购订单数量,即修改为采购订单数量;

  3. 因为以上2点属于已采购的数量,所以采购申请的有效数量需要减去以上数量;

  4. 以上3点处理完后,采购申请还存在有效数量的,同时没有有效的采购订单,申请的有效数量修改为询价单数量,此处需要考虑询价单的处理顺序将采购订单数量为空的放在后面,就相当于先把有效的单据处理;同时减去有效采购申请的数量。

  5. 以上4点处理完之后,采购申请的有效数量应该变为空,所以后面的询价单都应该被删除。

FUNCTION ZFM_MM_CHANGE_ENQUERY.
*"----------------------------------------------------------------------
*"*"本地接口:
*"  IMPORTING
*"     VALUE(I_BANFN) TYPE  BANFN DEFAULT '10201791'
*"  EXPORTING
*"     VALUE(E_CODE) TYPE  CHAR1
*"     VALUE(E_MSG) TYPE  STRING
*"----------------------------------------------------------------------
  DATA LV_BANFN TYPE  BANFN.
  CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
    EXPORTING
      INPUT  = I_BANFN
    IMPORTING
      OUTPUT = LV_BANFN.

  SELECT
     EKET~EBELN,"报价单号
     EKET~EBELP,"报价单项目
*     EKPO~LOEKZ,"删除标识
     EKET~MENGE AS MENGE_RFQ,"计划数量
*     EBAN~EBAKZ,"关系标识
*     EBAN~MENGE,"申请数量
     EBAN~BANFN, "采购申请
     EBAN~BNFPO, "采购申请项目
     EBAN~BSMNG, "订单数量

*     ZEKPO~EBELN AS EBELN_PO,"PO
*     ZEKPO~EBELP AS EBELP_PO,"PO
     SUM( ZEKPO~MENGE ) AS MENGE_PO "PO

  FROM EKET
    JOIN EBAN ON EKET~BANFN EQ EBAN~BANFN
             AND EBAN~BNFPO EQ EKET~BNFPO

    JOIN EKKO ON  EKET~EBELN EQ EKKO~EBELN
             AND EKKO~BSART EQ 'ZAN'

    JOIN EKPO ON EKPO~EBELN EQ EKET~EBELN
                  AND EKPO~EBELP EQ EKET~EBELP
                  AND EKPO~LOEKZ <> 'L'
    LEFT JOIN EKPO AS ZEKPO
           ON ZEKPO~ANFNR EQ EKET~EBELN
          AND ZEKPO~ANFPS EQ EKET~EBELP
   WHERE EKET~BANFN EQ @LV_BANFN
     AND EBAN~EBAKZ EQ 'X'
     AND EBAN~MENGE <> EBAN~BSMNG
    GROUP BY EKET~EBELN,EKET~EBELP,EKET~MENGE,
             EBAN~BANFN,EBAN~BNFPO,EBAN~BSMNG
    ORDER BY EBAN~BANFN,EBAN~BNFPO
    INTO TABLE @DATA(LT_EKET).

  IF SY-SUBRC NE 0. "如获取不到数据,直接判断处理成功
    E_CODE = 'S'.
    E_MSG  = '处理完成!'.
    RETURN.
  ENDIF.

  DATA(LT_EKET_PR) = LT_EKET[].

  DELETE ADJACENT DUPLICATES FROM LT_EKET_PR COMPARING BANFN BNFPO. "采购申请数量


  DATA:LW_NEKKO  TYPE EKKO,
       LW_OEKKO  TYPE EKKO,
       LT_XKOMV  TYPE TABLE OF KOMV,
       LT_YKOMV  TYPE TABLE OF KOMV,
       LT_XEKET  TYPE TABLE OF UEKET,
       LT_YEKET  TYPE TABLE OF UEKET,
       LS_EKET   TYPE UEKET,
       LT_XEKKN  TYPE TABLE OF UEKKN,
       LT_YEKKN  TYPE TABLE OF UEKKN,
       LT_XEKPO  TYPE TABLE OF UEKPO,
       LT_YEKPO  TYPE TABLE OF UEKPO,
       LS_EKPO   TYPE UEKPO,
       LT_XEKBES TYPE TABLE OF EKBES.

  SORT LT_EKET BY BANFN BNFPO MENGE_PO DESCENDING.

  LOOP AT LT_EKET INTO DATA(WA_EKET).

*  采购申请的有效数量计算
    READ TABLE LT_EKET_PR ASSIGNING FIELD-SYMBOL(<FS_EKET_PR>)
                                    WITH KEY BANFN = WA_EKET-BANFN
                                             BNFPO = WA_EKET-BNFPO
                                             BINARY SEARCH.
    IF SY-SUBRC EQ 0.

      IF  WA_EKET-MENGE_RFQ EQ WA_EKET-MENGE_PO.
        <FS_EKET_PR>-BSMNG = <FS_EKET_PR>-BSMNG - WA_EKET-MENGE_RFQ. "采购订单数量与询价单数量一致的询价单不做修改
        EXIT.
      ENDIF.

      "修改RFQ
      SELECT SINGLE * FROM EKKO INTO @LW_OEKKO WHERE EBELN EQ @WA_EKET-EBELN.

      SELECT SINGLE * FROM EKPO INTO CORRESPONDING FIELDS OF @LS_EKPO
      WHERE EBELN EQ @WA_EKET-EBELN AND EBELP EQ @WA_EKET-EBELP.

      SELECT SINGLE * FROM EKET INTO CORRESPONDING FIELDS OF @LS_EKET
      WHERE EBELN EQ @WA_EKET-EBELN AND EBELP EQ @WA_EKET-EBELP.

      MOVE-CORRESPONDING LW_OEKKO TO LW_NEKKO."抬头数据

      APPEND LS_EKPO TO LT_YEKPO."旧数据

      "PR可分配数量为0的时候就删除询价单
      IF <FS_EKET_PR>-BSMNG IS INITIAL.
        LS_EKPO-KZ = 'U'.
        LS_EKPO-LOEKZ = 'L'.
        LS_EKPO-STAPO = 'X'.
        APPEND LS_EKPO TO LT_XEKPO.

      ELSE.
        LS_EKPO-KZ = 'U'.
        LS_EKPO-STAPO = 'X'.
*因为上面已经按照PO数量倒叙,PO数量为空的时候,将RFQ数量修改为采购申请剩余数量
*如果还有询价单的会因采购申请数量为0而被删除
        IF WA_EKET-MENGE_PO IS INITIAL.
          LS_EKPO-KTMNG = <FS_EKET_PR>-BSMNG.
        ELSE.
*PO订单数量不为空的时候说明是已经生效,将RFQ数量修改为RFQ数量
          LS_EKPO-KTMNG = WA_EKET-MENGE_PO.
        ENDIF.

        APPEND LS_EKPO TO LT_XEKPO.

      ENDIF.

      APPEND LS_EKET TO LT_YEKET."旧数据

      LS_EKET-KZ = 'U'.
      IF WA_EKET-MENGE_PO IS INITIAL.
        LS_EKET-MENGE = <FS_EKET_PR>-BSMNG.
      ELSE.
        LS_EKET-MENGE = WA_EKET-MENGE_PO.
      ENDIF.

      APPEND LS_EKET TO LT_XEKET.

      CALL FUNCTION 'ME_UPDATE_DOCUMENT'
        EXPORTING
          NEKKO  = LW_NEKKO
          OEKKO  = LW_OEKKO
        TABLES
          XEKET  = LT_XEKET
          XEKKN  = LT_XEKKN
          XEKPO  = LT_XEKPO
          XKOMV  = LT_XKOMV
          YEKET  = LT_YEKET
          YEKKN  = LT_YEKKN
          YEKPO  = LT_YEKPO
          YKOMVI = LT_YKOMV
          XEKBES = LT_XEKBES.
      IF SY-SUBRC = 0.
        COMMIT WORK.
        E_CODE = 'S'.
        E_MSG  = '处理成功!'.
        <FS_EKET_PR>-BSMNG = <FS_EKET_PR>-BSMNG - LS_EKPO-KTMNG. "已处理成功的数量从采购申请减去
      ELSE.
        ROLLBACK WORK .
        E_CODE = 'E'.
        E_MSG  = '处理失败!'.
      ENDIF.
    ENDIF.
    CLEAR:WA_EKET,LW_NEKKO,LW_OEKKO,LT_XKOMV,LT_YKOMV,LT_XEKET,LT_YEKET,
          LS_EKET,LT_XEKKN,LT_YEKKN,LT_XEKPO,LT_YEKPO,LS_EKPO,LT_XEKBES.
  ENDLOOP.

  IF E_CODE IS INITIAL.
    E_CODE = 'S'.
    E_MSG  = '处理完成!'.
  ENDIF.

ENDFUNCTION.


关键词: ABAP MM

网友评论

发表评论