不知道業務怎么配置的,創建銷售單時,一堆計划行類別,什么CN,DN。。。都有,但是審核后需要計划行變更為CP,這樣在MD04才能看到需求。
原有邏輯是弄個后台程序,審核后調一下,更新一下計划行,這樣是會有需求的。。。
但是,業務有個習慣喜歡VA02直接審,或者是交貨后還來修改等等。。。這時候就需要在VA02里做增強。,
原本的開發還是調程序。。。這就產生了很多問題。后來我自己寫增強審核的時候自動修改計划行類別,巴特,不產生需求。。。這特么鬼,后來各種找,各種DEBUG,找到根源了。。。
Now,來個增強,實現:MV45AFZZ USEREXIT_SAVE_DOCUMENT_PREPARE
IF ( i_stonO = '20' AND i_stonN = '30' ). LOOP AT XVBEP INTO GX_VBEP. LY_I = SY-TABIX. CASE VBAK-AUART. WHEN 'ZOR' . IF GX_VBEP-ETTYP <> 'CP' AND GX_VBEP-ETTYP <> 'ZD'. GX_VBEP-ETTYP = 'CP'. IF SY-TCODE = 'VA01'. ELSEIF SY-TCODE = 'VA02'. GX_VBEP-UPDKZ = 'U'. GX_VBEP-BEDSD = 'X'. GX_VBEP-BDAALT = '05'. GX_VBEP-BDART = '05'. GX_VBEP-PLART = '0'. IF XVBBE[] IS INITIAL. GW_VBBE-MANDT = SY-MANDT. GW_VBBE-VBELN = GX_VBEP-VBELN. GW_VBBE-POSNR = GX_VBEP-POSNR. GW_VBBE-ETENR = GX_VBEP-ETENR. GW_VBBE-MBDAT = GX_VBEP-EDATU. GW_VBBE-VBTYP = 'C'. GW_VBBE-BDART = '05'. GW_VBBE-PLART = '0'. GW_VBBE-UPDKZ = 'I'. GW_VBBE-OMENG = GX_VBEP-LMENG. GW_VBBE-VMENG = GX_VBEP-BMENG. GW_VBBE-MEINS = GX_VBEP-VRKME. GW_VBBE-PZMNG = GX_VBEP-LMENG. GW_VBBE-AUART = XVBAK-AUART. GW_VBBE-KUNNR = XVBAK-KUNNR. READ TABLE XVBAP INTO GX_VBAP WITH KEY POSNR = GX_VBEP-POSNR. IF SY-SUBRC = 0. LY_J = SY-TABIX. GX_VBAP-SUMBD = 'A'. GX_VBAP-UPDKZ = 'U'. GX_VBAP-BEDUP = 'X'. MODIFY XVBAP FROM GX_VBAP INDEX LY_J TRANSPORTING SUMBD UPDKZ BEDUP. GW_VBBE-MATNR = GX_VBAP-MATNR. GW_VBBE-WERKS = GX_VBAP-WERKS. GW_VBBE-LGORT = GX_VBAP-LGORT. GW_VBBE-CHARG = GX_VBAP-CHARG. GW_VBBE-AWAHR = GX_VBAP-AWAHR. GW_VBBE-VPZUO = GX_VBAP-VPZUO. ENDIF. INSERT GW_VBBE INTO XVBBE INDEX GX_VBEP-ETENR. ENDIF. ENDIF. ENDIF. WHEN 'ZKB' . IF GX_VBEP-ETTYP <> 'E1'. GX_VBEP-ETTYP = 'E1'. IF SY-TCODE = 'VA01'. ELSEIF SY-TCODE = 'VA02'. GX_VBEP-UPDKZ = 'U'. GX_VBEP-BEDSD = 'X'. GX_VBEP-BDAALT = '05'. GX_VBEP-BDART = '05'. GX_VBEP-PLART = '0'. IF XVBBE[] IS INITIAL. GW_VBBE-MANDT = SY-MANDT. GW_VBBE-VBELN = GX_VBEP-VBELN. GW_VBBE-POSNR = GX_VBEP-POSNR. GW_VBBE-ETENR = GX_VBEP-ETENR. GW_VBBE-MBDAT = GX_VBEP-EDATU. GW_VBBE-VBTYP = 'C'. GW_VBBE-BDART = '05'. GW_VBBE-PLART = '0'. GW_VBBE-UPDKZ = 'I'. GW_VBBE-OMENG = GX_VBEP-LMENG. GW_VBBE-VMENG = GX_VBEP-BMENG. GW_VBBE-MEINS = GX_VBEP-VRKME. GW_VBBE-PZMNG = GX_VBEP-LMENG. GW_VBBE-AUART = XVBAK-AUART. GW_VBBE-KUNNR = XVBAK-KUNNR. READ TABLE XVBAP INTO GX_VBAP WITH KEY POSNR = GX_VBEP-POSNR. IF SY-SUBRC = 0. LY_J = SY-TABIX. GX_VBAP-SUMBD = 'A'. GX_VBAP-UPDKZ = 'U'. GX_VBAP-BEDUP = 'X'. MODIFY XVBAP FROM GX_VBAP INDEX LY_J TRANSPORTING SUMBD UPDKZ BEDUP. GW_VBBE-MATNR = GX_VBAP-MATNR. GW_VBBE-WERKS = GX_VBAP-WERKS. GW_VBBE-LGORT = GX_VBAP-LGORT. GW_VBBE-CHARG = GX_VBAP-CHARG. GW_VBBE-AWAHR = GX_VBAP-AWAHR. GW_VBBE-VPZUO = GX_VBAP-VPZUO. ENDIF. INSERT GW_VBBE INTO XVBBE INDEX GX_VBEP-ETENR. ENDIF. ENDIF. ENDIF. WHEN 'ZSP' . READ TABLE XVBAP INTO GX_VBAP WITH KEY POSNR = GX_VBEP-POSNR. IF SY-SUBRC = 0. IF GX_VBAP-PSTYV = 'ZSNN' AND GX_VBEP-ETTYP <> 'ZN'. GX_VBEP-ETTYP = 'ZN'. IF SY-TCODE = 'VA01'. ELSEIF SY-TCODE = 'VA02'. GX_VBEP-UPDKZ = 'U'. GX_VBEP-BEDSD = 'X'. GX_VBEP-BDAALT = '05'. GX_VBEP-BDART = '05'. GX_VBEP-PLART = '0'. IF XVBBE[] IS INITIAL. GW_VBBE-MANDT = SY-MANDT. GW_VBBE-VBELN = GX_VBEP-VBELN. GW_VBBE-POSNR = GX_VBEP-POSNR. GW_VBBE-ETENR = GX_VBEP-ETENR. GW_VBBE-MBDAT = GX_VBEP-EDATU. GW_VBBE-VBTYP = 'C'. GW_VBBE-BDART = '05'. GW_VBBE-PLART = '0'. GW_VBBE-UPDKZ = 'I'. GW_VBBE-OMENG = GX_VBEP-LMENG. GW_VBBE-VMENG = GX_VBEP-BMENG. GW_VBBE-MEINS = GX_VBEP-VRKME. GW_VBBE-PZMNG = GX_VBEP-LMENG. GW_VBBE-AUART = XVBAK-AUART. GW_VBBE-KUNNR = XVBAK-KUNNR. READ TABLE XVBAP INTO GX_VBAP WITH KEY POSNR = GX_VBEP-POSNR. IF SY-SUBRC = 0. LY_J = SY-TABIX. GX_VBAP-SUMBD = 'A'. GX_VBAP-UPDKZ = 'U'. GX_VBAP-BEDUP = 'X'. MODIFY XVBAP FROM GX_VBAP INDEX LY_J TRANSPORTING SUMBD UPDKZ BEDUP. GW_VBBE-MATNR = GX_VBAP-MATNR. GW_VBBE-WERKS = GX_VBAP-WERKS. GW_VBBE-LGORT = GX_VBAP-LGORT. GW_VBBE-CHARG = GX_VBAP-CHARG. GW_VBBE-AWAHR = GX_VBAP-AWAHR. GW_VBBE-VPZUO = GX_VBAP-VPZUO. ENDIF. INSERT GW_VBBE INTO XVBBE INDEX GX_VBEP-ETENR. ENDIF. ENDIF. ELSEIF GX_VBAP-PSTYV = 'ZSAN' AND GX_VBEP-ETTYP <> 'CP'. GX_VBEP-ETTYP = 'CP'. IF SY-TCODE = 'VA01'. ELSEIF SY-TCODE = 'VA02'. GX_VBEP-UPDKZ = 'U'. GX_VBEP-BEDSD = 'X'. GX_VBEP-BDAALT = '05'. GX_VBEP-BDART = '05'. GX_VBEP-PLART = '0'. IF XVBBE[] IS INITIAL. GW_VBBE-MANDT = SY-MANDT. GW_VBBE-VBELN = GX_VBEP-VBELN. GW_VBBE-POSNR = GX_VBEP-POSNR. GW_VBBE-ETENR = GX_VBEP-ETENR. GW_VBBE-MBDAT = GX_VBEP-EDATU. GW_VBBE-VBTYP = 'C'. GW_VBBE-BDART = '05'. GW_VBBE-PLART = '0'. GW_VBBE-UPDKZ = 'I'. GW_VBBE-OMENG = GX_VBEP-LMENG. GW_VBBE-VMENG = GX_VBEP-BMENG. GW_VBBE-MEINS = GX_VBEP-VRKME. GW_VBBE-PZMNG = GX_VBEP-LMENG. GW_VBBE-AUART = XVBAK-AUART. GW_VBBE-KUNNR = XVBAK-KUNNR. READ TABLE XVBAP INTO GX_VBAP WITH KEY POSNR = GX_VBEP-POSNR. IF SY-SUBRC = 0. LY_J = SY-TABIX. GX_VBAP-SUMBD = 'A'. GX_VBAP-UPDKZ = 'U'. GX_VBAP-BEDUP = 'X'. MODIFY XVBAP FROM GX_VBAP INDEX LY_J TRANSPORTING SUMBD UPDKZ BEDUP. GW_VBBE-MATNR = GX_VBAP-MATNR. GW_VBBE-WERKS = GX_VBAP-WERKS. GW_VBBE-LGORT = GX_VBAP-LGORT. GW_VBBE-CHARG = GX_VBAP-CHARG. GW_VBBE-AWAHR = GX_VBAP-AWAHR. GW_VBBE-VPZUO = GX_VBAP-VPZUO. ENDIF. INSERT GW_VBBE INTO XVBBE INDEX GX_VBEP-ETENR. ENDIF. ENDIF. ENDIF . ENDIF. WHEN OTHERS. ENDCASE. MODIFY XVBEP FROM GX_VBEP. ENDLOOP. ENDIF.