销售订单增加自定义小计字段

作者:ABAP三叔 约 6 分钟阅读 更新日期:2025-03-02 1 年前更新 标签:SD, 销售分销
销售订单增加自定义小计字段 - 封面图
销售订单增加自定义小计字段 - 封面图

前言

众所周知,在销售订单中,共有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中隐式增强的修改值逻辑都需要根据项目实际需求去修改。

ABAP三叔

关于作者:ABAP三叔

企业信息化与 SAP 技术顾问,长期专注 SAP ABAP、FI/CO、MM、SD 等模块的技术分享与实战经验总结。查看更多介绍

来源说明:本文内容由「销售订单增加自定义小计字段.md」整理生成,仅用于内部技术分享与学习交流。