VF04添加自定义字段
一、业务场景和目的
-
VF04 公司间的单据没有价格和单位,所以通过二代增强加了两个字段,效果如图所示:
二、增强过程
-
SE11 给结构 VKDFIF 加上所要的字段,直接加或者使用接口append都可以。
-
通过查询得到SMOD: V60P0001 点击组件 EXIT_SAPLV60P_008 里面的 ZXV6PU08 。
-
写入代码:
*&---------------------------------------------------------------------* *& 包含 ZXV6PU08 *&---------------------------------------------------------------------* DATA(LT_VKDFIF) = C_VKDFIF[] . " 交货类型是 ZN* 的取 EKPO 汇总金额 SELECT A~VBELN , B~VGBEL , B~VGPOS , B~LFIMG FROM @LT_VKDFIF AS A INNER JOIN LIPS AS B ON A~VBELN = B~VBELN WHERE LFIMG <> 0 INTO TABLE @DATA(LT_LIPS1). SORT LT_LIPS1 BY VBELN . IF LT_LIPS1[] IS NOT INITIAL . SELECT EKKO~EBELN , EBELP , NETWR , MENGE , WAERS FROM EKKO INNER JOIN EKPO ON EKKO~EBELN = EKPO~EBELN FOR ALL ENTRIES IN @LT_LIPS1 WHERE EKKO~EBELN = @LT_LIPS1-VGBEL INTO TABLE @DATA(LT_EKPO). SORT LT_EKPO BY EBELN EBELP . ENDIF . " 交货类型不是 ZN* 的取 VBAP 汇总金额 SELECT A~VBELN , B~POSNR , B~VGBEL , B~VGPOS , B~LFIMG , C~NETWR , C~KZWI5 , C~KWMENG , D~WAERK FROM @LT_VKDFIF AS A INNER JOIN LIPS AS B ON A~VBELN = B~VBELN INNER JOIN VBAP AS C ON B~VGBEL = C~VBELN AND B~VGPOS = C~POSNR INNER JOIN VBAK AS D ON C~VBELN = D~VBELN WHERE LFIMG <> 0 INTO TABLE @DATA(LT_VBAP). SORT LT_VBAP BY VBELN . LOOP AT C_VKDFIF ASSIGNING FIELD-SYMBOL(<VKDIF>). IF <VKDIF> - FKTYP = 'A' . " 订单相关 <VKDIF> - ZNETWR = <VKDIF> - NETWR . <VKDIF> - ZWAERK = <VKDIF> - WAERK . ELSEIF <VKDIF> - FKTYP = 'I' OR <VKDIF> - FKTYP = 'L' . " 交货相关,公司间开票 IF CL_ABAP_MATCHER => MATCHES( PATTERN = '^ZN.*$' TEXT = <VKDIF>-VBART ) = ABAP_TRUE . " 采购 LOOP AT LT_LIPS1 ASSIGNING FIELD-SYMBOL(<FS_LIPS1>) WHERE VBELN = <VKDIF> - VBELN . READ TABLE LT_EKPO ASSIGNING FIELD-SYMBOL(<FS_EKPO>) WITH KEY EBELN = <FS_LIPS1> - VGBEL EBELP = <FS_LIPS1> - VGPOS BINARY SEARCH . IF SY - SUBRC = 0 AND <FS_EKPO> - MENGE <> 0 . <VKDIF> - ZNETWR = <VKDIF> - ZNETWR + <FS_EKPO> - NETWR / <FS_EKPO> - MENGE * <FS_LIPS1> - LFIMG . <VKDIF> - ZWAERK = <FS_EKPO> - WAERS . ENDIF . ENDLOOP . ELSE . " 销售 " 系统票类型为: ZIV/ZIG/ZIV9/ZIG9 : IF <VKDIF> - FKART = 'ZIV' OR <VKDIF> - FKART = 'ZIG' OR <VKDIF> - FKART = 'ZIV9' OR <VKDIF> - FKART = 'ZIG9' . LOOP AT LT_VBAP ASSIGNING FIELD-SYMBOL(<FS_VBAP>) WHERE VBELN = <VKDIF> - VBELN . IF SY - SUBRC = 0 AND <FS_VBAP> - KWMENG <> 0 . <VKDIF> - ZNETWR = <VKDIF> - ZNETWR + <FS_VBAP> - KZWI5 / <FS_VBAP> - KWMENG * <FS_VBAP> - LFIMG . ENDIF . ENDLOOP . IF SY - SUBRC = 0 . " 最后把货币加上 <VKDIF> - ZWAERK = <FS_VBAP> - WAERK . ENDIF . ELSE . LOOP AT LT_VBAP ASSIGNING <FS_VBAP> WHERE VBELN = <VKDIF> - VBELN . IF SY - SUBRC = 0 AND <FS_VBAP> - KWMENG <> 0 . <VKDIF> - ZNETWR = <VKDIF> - ZNETWR + <FS_VBAP> - NETWR / <FS_VBAP> - KWMENG * <FS_VBAP> - LFIMG . ENDIF . ENDLOOP . IF SY - SUBRC = 0 . " 最后把货币加上 <VKDIF> - ZWAERK = <FS_VBAP> - WAERK . ENDIF . ENDIF . ENDIF . " 系统票类型 : ZG2/ZIG/ZIG1/ ZIV9/ZIVS/ZRE/ZS1 :金额 *-1 按交货单号汇总 IF <VKDIF> - FKART = 'ZG2' OR <VKDIF> - FKART = 'ZIG' OR <VKDIF> - FKART = 'ZIG1' OR <VKDIF> - FKART = 'ZIV9' OR <VKDIF> - FKART = 'ZIVS' OR <VKDIF> - FKART = 'ZRE' OR <VKDIF> - FKART = 'ZS1' . <VKDIF> - ZNETWR = - 1 * <VKDIF> - ZNETWR . ENDIF . ENDIF . ENDLOOP .