前言
众所周知,在销售订单中,共有6个小计字段KZWI1-KZWI6。在比较复杂的定价过程中,6个小计字段可能不够用,需要额外增加小计字段,本文将为大家介绍具体实现过程。
增强实现
1\. 增强表,添加自定义字段
VBAP/VBRP/KOMP/KOMPAX 这几个表都需要添加,增加的字段个数根据需求确定
2.自定义的小计字段,不能像标准小计字段一样可根据定价过程自动累加,需要在定价例程中自己计算。如以下代码所示
FORM frm_kond_basis_909. DATA: ls_a903 TYPE a903, lt_a903 TYPE TABLE OF a903. DATA: ls_konp TYPE konp, lt_konp TYPE TABLE OF konp. DATA: lv_bukrs TYPE bukrs, DATA: lv_vkorg TYPE vkorg. DATA: lv_kunnr TYPE kunnr. SELECT SINGLE a~vkorg b~bukrs INTO ( lv_vkorg, lv_bukrs ) FROM t001w AS a JOIN t001k AS b ON a~bwkey = b~bwkey WHERE a~werks = komp-werks. CHECK lv_bukrs <> komk-bukrs. lv_kunnr = |{ komk-bukrs ALPHA = IN }|. IF lt_konp[] IS INITIAL. SELECT * FROM a903 INTO TABLE lt_a903 WHERE kappl = 'V' AND kschl = 'ZDS1' AND vkorg = lv_vkorg AND knrze = lv_kunnr AND kfrst = '' AND datbi >= komk-prsdt AND datab <= komk-prsdt. IF sy-subrc = 0. SELECT * FROM konp INTO TABLE lt_konp FOR ALL ENTRIES IN lt_a903 WHERE knumh = lt_a903-knumh AND loevm_ko <> 'X'. ENDIF. ENDIF.READ TABLE lt_konp INTO ls_konp INDEX 1. IF sy-subrc = 0. xkomv-kbetr = ls_konp-kbetr. "公司间售价 = 吊牌价*公司间折扣 komp-zzkzwi7 = komp-kzwi3 * ls_konp-kbetr / 100000. ENDIF.ENDFORM.税差处理
小计如果涉及到税计算,会出现税差的情况。 标准的小计字段,会自动处理;自定义小计字段需要自己处理税差,需要以下两个步骤:
1. 定价例程处理。
税差的值存放在 xkomv-kdiff 字段中,小计计算完后,需要加上税差值。
示例代码如下:
FORM frm_kond_basis_910. DATA: ls_a002 TYPE a002, lt_a002 TYPE TABLE OF a002. DATA: ls_konp TYPE konp, lt_konp TYPE TABLE OF konp. DATA: lv_bukrs TYPE bukrs, lv_vkorg TYPE vkorg. DATA: lv_kunnr TYPE kunnr. DATA: lv_taxkd TYPE knvi-taxkd.
SELECT SINGLE bukrs INTO lv_bukrs FROM tvko WHERE vkorg = komk-vkorg. CHECK sy-subrc = 0. lv_kunnr = |{ lv_bukrs ALPHA = IN }|.
SELECT SINGLE taxkd INTO lv_taxkd FROM knvi WHERE kunnr = lv_kunnr AND aland = 'CN' AND tatyp = 'MWST'. CHECK sy-subrc = 0.
SELECT * FROM a002 INTO TABLE lt_a002 WHERE kappl = 'V' AND kschl = 'MWST' AND aland = 'CN' AND taxk1 = lv_taxkd AND taxm1 = '1' AND datbi >= komk-prsdt AND datab <= komk-prsdt. IF sy-subrc = 0. SELECT * FROM konp INTO TABLE lt_konp FOR ALL ENTRIES IN lt_a002 WHERE knumh = lt_a002-knumh AND loevm_ko <> 'X'. ENDIF.
READ TABLE lt_konp INTO ls_konp INDEX 1. IF sy-subrc = 0. xkomv-kbetr = ls_konp-kbetr. "公司间售价 = 吊牌价*公司间折扣 DATA: lv_tax LIKE xkomv-kbetr, lv_kbetr LIKE xkomv-kbetr. lv_tax = xkomv-kbetr / 1000. CALL FUNCTION 'ZFM_SD_CALCULATE' EXPORTING iv_p1 = 1 iv_p2 = lv_tax iv_op = '+' IMPORTING rv = lv_tax.
CALL FUNCTION 'ZFM_SD_CALCULATE' EXPORTING iv_p1 = komp-zzkzwi7 iv_p2 = lv_tax iv_op = '/' IMPORTING rv = lv_kbetr.
komp-zzkzwi8 = komp-zzkzwi7 - lv_kbetr + xkomv-kdiff. ENDIF.ENDFORM.2.定价例程的税差重计算后,自定义小计值没有自动更新到VBAP表中,需要增强程序。
SE38:打开程序RV61AFZB,找到FORM
USEREXIT_XKOMV_BEWERTEN_END,在开始处创建隐式增强,代码如下
FORM USEREXIT_XKOMV_BEWERTEN_END."""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""$"$\SE:(1) Form USEREXIT_XKOMV_BEWERTEN_END, Start A*$*$-Start: (1)---------------------------------------------------------------------------------$*$*ENHANCEMENT 2 ZE_PROCESS_TAX_DIFF. "active versionFIELD-SYMBOLS:<fs_komv> LIKE LINE OF xkomv.CHECK komk-trtyp <> 'A'. "非显示CHECK gkomv_key-kschl+0(1) = 'Z'."解决因为条件排斥导致的此FORM重复计算READ TABLE xkomv TRANSPORTING NO FIELDS WITH KEY kinak = 'A'.CHECK sy-subrc <> 0.READ TABLE xkomv WITH KEY kschl = gkomv_key-kschl.CHECK sy-subrc = 0 AND xkomv-kdiff <> 0.CASE xkomv-kschl. WHEN 'ZST2'. komp-zzkzwi8 = komp-zzkzwi8 + xkomv-kdiff. komp-zzkzwi9 = komp-zzkzwi7 - komp-zzkzwi8. READ TABLE xkomv ASSIGNING <fs_komv> WITH KEY kschl = 'ZVP2'. IF sy-subrc = 0. <fs_komv>-kwert = komp-zzkzwi9. ENDIF. WHEN 'ZST1'. komp-zzkzwi11 = komp-zzkzwi11 + xkomv-kdiff. komp-zzkzwi12 = komp-zzkzwi10 - komp-zzkzwi11. READ TABLE xkomv ASSIGNING <fs_komv> WITH KEY kschl = 'ZVP1'. IF sy-subrc = 0. <fs_komv>-kwert = komp-zzkzwi12. ENDIF. WHEN 'ZST3'. komp-zzkzwi13 = komp-zzkzwi13 + xkomv-kdiff. komp-zzkzwi14 = komp-zzkzwi10 - komp-zzkzwi13. READ TABLE xkomv ASSIGNING <fs_komv> WITH KEY kschl = 'ZVP3'. IF sy-subrc = 0. <fs_komv>-kwert = komp-zzkzwi14. ENDIF.ENDCASE."写入标准成本wavwrIF <fs_komv> IS ASSIGNED AND <fs_komv>-kzwiw = 'B'. komp-wavwr = <fs_komv>-kwert.ENDIF.ENDENHANCEMENT.*$*$-End: (1)---------------------------------------------------------------------------------$*$*ENDFORM.
补充
定价例程因为未开启固定点运算,导致运算会出现与预期不一致的情况,自定义FM ZFM_SD_CALCULATE 就是解决这个问题的,代码如下:
FUNCTION zfm_sd_calculate.*"----------------------------------------------------------------------*"*"本地接口:*" IMPORTING*" REFERENCE(IV_P1) TYPE P*" REFERENCE(IV_P2) TYPE P*" REFERENCE(IV_OP) TYPE C*" EXPORTING*" REFERENCE(RV) TYPE P*"----------------------------------------------------------------------CASE iv_op. WHEN '+'. rv = iv_p1 + iv_p2. WHEN '-'. rv = iv_p1 - iv_p2. WHEN '*'. rv = iv_p1 * iv_p2. WHEN '/'. CHECK iv_p2 <> 0. rv = iv_p1 / iv_p2. ENDCASE.
ENDFUNCTION.总结
本文只是介绍了自定义小计字段增加的方法和注意事项,定价过程的具体取值逻辑和
USEREXIT_XKOMV_BEWERTEN_END中隐式增强的修改值逻辑都需要根据项目实际需求去修改。