业务场景:
采购申请在完成部分采购后,不需继续采购,需要关闭采购申请,需要将询价单多出的数量进行修改。
问题点:
采购订单的数量与询价单的数量一致的时候,询价单不应被修改;
采购订单数量小于询价单数量,询价单数量不能低于采购订单数量,即修改为采购订单数量;
因为以上2点属于已采购的数量,所以采购申请的有效数量需要减去以上数量;
以上3点处理完后,采购申请还存在有效数量的,同时没有有效的采购订单,申请的有效数量修改为询价单数量,此处需要考虑询价单的处理顺序将采购订单数量为空的放在后面,就相当于先把有效的单据处理;同时减去有效采购申请的数量。
以上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.
网友评论