開票定價例程

定價例程原理
先配置條件類型和定價例程的對應關係(一個條件類型只會對應一個例程,一個例程可以配給多個條件)
一個行項目的定價數據存在內表xkomv中,程序loop xkomv,判斷xkomv-kofrm,如果配置了例程,執行例程的處理邏輯。
對工作區xkomv的字段值修改後,最後修改內表xkomv,完成定價數據的修改
1.如果修改定價值,需要修改變量xkwet,因爲執行完定價後會有執行一句xkomv-xkwet = xkwet。
2.如果修改單價和其他字段,直接修改工作區xkwet,注意不要loop xkwet再修改,因爲例程本身就在loop中(觸發時修改的工作區xkomv就是對應配置的條件類型),而且如果該行是外幣,在進入例程之前會有匯率轉換的邏輯,工作區中存放的是外幣金額,而內表xkomv中存放的卻是本位幣金額。

定價例程增強步驟
vofm-公式-定價值
新建例程,比如901-雙擊,修改程序後,激活程序,激活例程(選中行,在菜單上有激活),業務配置條件類型和定價例程的對應關係就行。
常用變量:xkomv 內表、komk、komv、komp、xkbetr 。
例程沒有固定點算術,所以計算和賦值時需要注意小數位。
一個例程只對應一種條件類型,所以修改的單價和總金額都是這種條件類型的
請求傳輸後需要在目標系統se38運行RV80HGEN重新生成所有的VOFM(會在RV64ANNN中增加一行INCLUDE)。
定價例程在vf03時也會觸發,但修改無效
可以在前臺看到條件類型關聯的例程
注意:當“條件控制”爲E、F、H時(在copy control配置pricing type),在例程中修改金額是無效的。例程在另一個地方被調用了,執行完之後xkomv會被RETTKOMV覆蓋掉,
PREISFINDUNGSART = ‘E’時就會進入修改無效的地方調用例程,如果例程可能會被多次調用,只有PREISFINDUNGSART ne 'E'的時候修改纔是有效的

例子(從600copy過來的改內表的應該都不規範)
最全的例子
FORM FRM_KONDI_WERT_917.
*{ INSERT DEVK900694 1
*計算NETW單價
case xkomv-kschl.
when 'ZFR1'.
read table xkomv into DATA(LS_xkomv1) WITH key kschl = 'Z001'.
read table xkomv into DATA(LS_xkomv2) WITH key kschl = 'ZA01'.
xkwert = LS_xkomv1-kwert + LS_xkomv2-kwert. "子越配置成負的了,直接加
when 'ZFR2'.
read table xkomv into LS_xkomv1 WITH key kschl = 'Z002'.
read table xkomv into LS_xkomv2 WITH key kschl = 'ZA02'.
xkwert = LS_xkomv1-kwert + LS_xkomv2-kwert. "子越配置成負的了,直接加
when 'ZFR3'.
read table xkomv into LS_xkomv1 with key kschl = 'Z003'.
read table xkomv into LS_xkomv2 with key kschl = 'ZA03'.
xkwert = LS_xkomv1-kwert + LS_xkomv2-kwert. "子越配置成負的了,直接加
when 'ZFR4'.
read table xkomv into LS_xkomv1 with key kschl = 'Z004'.
read table xkomv into LS_xkomv2 with key kschl = 'ZA04'.
xkwert = LS_xkomv1-kwert + LS_xkomv2-kwert. "子越配置成負的了,直接加
when 'ZFR5'.
read table xkomv into LS_xkomv1 WITH key kschl = 'Z005'.
read table xkomv into LS_xkomv2 WITH key kschl = 'ZA05'.
xkwert = LS_xkomv1-kwert + LS_xkomv2-kwert. "子越配置成負的了,直接加
when 'ZFR6'.
read table xkomv into LS_xkomv1 with key kschl = 'Z006'.
read table xkomv into LS_xkomv2 with key kschl = 'ZA06'.
xkwert = LS_xkomv1-kwert + LS_xkomv2-kwert. "子越配置成負的了,直接加
when 'ZFR7'.
read table xkomv into LS_xkomv1 with key kschl = 'Z007'.
read table xkomv into LS_xkomv2 with key kschl = 'ZA07'.
xkwert = LS_xkomv1-kwert + LS_xkomv2-kwert. "子越配置成負的了,直接加
when 'ZFR8'.
read table xkomv into LS_xkomv1 with key kschl = 'Z008'.
read table xkomv into LS_xkomv2 with key kschl = 'ZA08'.
xkwert = LS_xkomv1-kwert + LS_xkomv2-kwert. "子越配置成負的了,直接加
endcase.

xkomv-kbetr = 1000 * xkwert / komp-mglme.
*} INSERT
ENDFORM.


1.根據日期調整定價(更新單價和單位)
************************************************************
*** 注意: 複製的例程 ! *
*** 注意 : ***
*** 所有字符串 ?1 用?2 替換 ! ***
************************************************************

* value excluding tax
form frm_kondi_wert_901.
*{ INSERT HSDK901167 2

* XKOMV-KSTAT = 'X'.

DATA: lv_vkorg TYPE vkorg,
lv_knumh TYPE knumh,
ls_komk TYPE komk,
ls_komp TYPE komp,
ls_komv TYPE komv,
ls_ekko TYPE ekko.

IF komk-fkart = 'ZIV1' OR komk-fkart = 'ZIG'.
SELECT SINGLE ekko~bsart INTO CORRESPONDING FIELDS OF ls_ekko
FROM ekko
INNER JOIN lips on lips~vgbel = ekko~ebeln
WHERE lips~vbeln = komp-vgbel and lips~posnr = komp-vgpos.

if ls_ekko-BSART = 'EB'.

LOOP AT xkomv WHERE kschl = 'ZPB1'.

* SELECT SINGLE vkorg INTO ls_komp-werks
* FROM tvko
* WHERE kunnr = komk-kunnr.
* SELECT SINGLE lifnr INTO ls_komk-lifnr
* FROM t001w
* WHERE werks = komk-vkorg.

ls_komp-werks = '2600'.
ls_komk-lifnr = '0000010142'.

ls_komp-matkl = komp-matkl.
ls_komp-matnr = komp-matnr.
ls_komk-reswk = komk-vkorg. "發出工廠

CALL FUNCTION 'ZGET_CONDITION_KOMV'
EXPORTING
kschl = xkomv-kschl
datum = komk-fkdat "開票日期
kappl = 'M'
komk = ls_komk
komp = ls_komp
IMPORTING
komv = ls_komv
EXCEPTIONS
not_found = 1
value_init = 2
kschl_not_found = 3
OTHERS = 4.
IF sy-subrc = 0.
IF ls_komv-krech CA 'AHIKJ'. "百分比等
ls_komv-kbetr = ls_komv-kbetr * 10 .
ENDIF.
xkomv-kbetr = ls_komv-kbetr.
MODIFY xkomv.
ENDIF.
ENDLOOP.

xkomv-kstat = 'X'.
ENDIF.
endif.


*} INSERT
*{ DELETE HSDK901167 1
*\ xkwert = komp-netwr.
*} DELETE
endform.

FUNCTION zget_condition_komv.
*"----------------------------------------------------------------------
*"*"局部接口:
*" IMPORTING
*" VALUE(KSCHL) TYPE KSCHL
*" VALUE(DATUM) TYPE DATUM
*" VALUE(KAPPL) TYPE KAPPL
*" VALUE(KOMK) TYPE KOMK
*" VALUE(KOMP) TYPE KOMP
*" EXPORTING
*" VALUE(KOMV) TYPE KOMV
*" EXCEPTIONS
*" NOT_FOUND
*" VALUE_INIT
*" KSCHL_NOT_FOUND
*"----------------------------------------------------------------------
DATA: BEGIN OF lt_682 OCCURS 0,
kolnr LIKE t682i-kolnr,
kotabnr LIKE t682i-kotabnr, "表名
zifna LIKE t682z-zifna, "字段名
qustr LIKE t682z-qustr,
qufna LIKE t682z-qufna,
END OF lt_682.
DATA: BEGIN OF lt_talbes OCCURS 0,
kotabnr LIKE t682i-kotabnr,
tabname(4),"表名
knumh TYPE knumh,
END OF lt_talbes.
DATA: wa_t685 LIKE t685.
DATA: wherestr(1000).

IF kappl IS INITIAL .
kappl = 'V'.
ENDIF.

IF kschl IS INITIAL OR datum IS INITIAL OR kappl IS INITIAL OR
( komk IS INITIAL AND komp IS INITIAL ) .
RAISE value_init.
ELSE.
SELECT SINGLE * INTO wa_t685 FROM t685 "條件類型獲取存取順序
WHERE kvewe = 'A' AND
kappl = kappl AND
kschl = kschl.
IF sy-subrc <> 0.
RAISE kschl_not_found.
ENDIF.
ENDIF.

SELECT * INTO CORRESPONDING FIELDS OF TABLE lt_682
FROM t682i INNER JOIN t682z ON t682i~kvewe = t682z~kvewe AND
t682i~kappl = t682z~kappl AND
t682i~kozgf = t682z~kozgf AND
t682i~kolnr = t682z~kolnr
WHERE t682i~kvewe = 'A' AND
t682i~kappl = kappl AND
t682i~kozgf = wa_t685-kozgf AND
t682z~qustr <> ''
ORDER BY t682i~kolnr.

LOOP AT lt_682.
lt_talbes-kotabnr = lt_682-kotabnr.
lt_talbes-tabname = 'A' && lt_682-kotabnr.
COLLECT lt_talbes.
ENDLOOP.

LOOP AT lt_talbes.
CLEAR wherestr.
LOOP AT lt_682 WHERE kotabnr = lt_talbes-kotabnr.
CONCATENATE wherestr ` ` lt_682-zifna ` = `
lt_682-qustr '-' lt_682-qufna ` AND `
INTO wherestr.
ENDLOOP.
* SHIFT wherestr RIGHT DELETING TRAILING 'AND ' .
wherestr = shift_right( val = wherestr sub = 'AND' ).

SELECT SINGLE knumh INTO lt_talbes-knumh
FROM (lt_talbes-tabname)
WHERE kappl = kappl AND
kschl = kschl AND
datbi >= datum AND
datab <= datum AND
(wherestr).
IF sy-subrc = 0.
SELECT SINGLE * INTO CORRESPONDING FIELDS OF komv
FROM konp
WHERE knumh = lt_talbes-knumh AND loevm_ko = ''.
IF sy-subrc = 0.
IF komv-krech CA 'AHIKJ'. "百分比等
komv-kbetr = komv-kbetr / 10 .
ENDIF.
EXIT.
ENDIF.
ENDIF.
ENDLOOP.

IF komv IS INITIAL.
RAISE not_found.
ENDIF.

ENDFUNCTION.

2.計算單價
FORM FRM_KONDI_WERT_916.
*{ INSERT DEVK900651 1
*計算NETW單價

xkomv-kbetr = 1000 * xkomv-KWERT / komp-mglme.

*} INSERT
ENDFORM.

3.更新定價值(總金額)
FORM FRM_KONDI_WERT_915.
*{ INSERT DEVK900554 1
*Z002寫入金額

data:begin of lt_con occurs 0.
include structure bapikomv.
data:
vgbel like lips-vgbel,
vgpos like lips-vgpos,
end of lt_con.

import
lt_con = lt_con
from memory id 'ZFLG_VF01_MIRO'.

read table lt_con with key vgbel = komp-vgbel vgpos = komp-vgpos.
if sy-subrc = 0.
xkwert = lt_con-cond_value / 100. "沒有固定點算術
endif.

*} INSERT
ENDFORM.

發佈了45 篇原創文章 · 獲贊 8 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章