为了实现一些特殊的定价计算规则,需要新增定价例程,可通过Tcode VOFM选择菜单中 公式—> 定价值 查看所有例程或者新增例程。
示例新增一个例程编号945,用于计算采购订单单价,双击该行可进入源代码编辑,需留意采购订单对应SAP标准程序 SAPLV61A 是非固定点算术,所以要留意金额的小数位数,代码如下:
FORM FRM_KONDI_WERT_945.
*{ INSERT ESDK930660 1
** 按照百万英热*百万英热单价/采购订单数量得出采购订单单价
* DATA: ls_komv TYPE komv,
* lv_zpb1 TYPE komv-kwert,
* lv_zpb2 TYPE komv-kwert.
*
** 读取条件类型ZPB1(百万英热)金额
* READ TABLE xkomv INTO ls_komv WITH KEY kschl = 'ZPB1'.
* IF sy-subrc = 0.
* lv_zpb1 = ls_komv-kwert.
* ENDIF.
*
** 读取ZPB2(百万英热单价)金额
* READ TABLE xkomv INTO ls_komv WITH KEY kschl = 'ZPB2'.
* IF sy-subrc = 0.
* lv_zpb2 = ls_komv-kwert.
* ENDIF.
*
** 订单单价 = 百万英热 * 百万英热单价 / 采购订单数量
* IF lv_zpb1 IS NOT INITIAL
* AND lv_zpb2 IS NOT INITIAL
* AND komp-mglme IS NOT INITIAL.
* TRY.
* xkomv-kpein = 10000.
* xkomv-kbetr = lv_zpb1 * lv_zpb2 * xkomv-kpein * 10 / komp-mglme.
* xkwert = xkomv-kbetr * komp-mglme / xkomv-kpein / 1000.
* CATCH cx_sy_arithmetic_overflow.
* ENDTRY.
* ENDIF.
IF komp-zzbtu is not initial and komp-zzbutp is not initial.
TRY.
data:l_kbetr type p length 16 DECIMALS 14.
l_kbetr = komp-zzbtu * komp-zzbutp.
xkomv-kpein = 1.
CALL FUNCTION 'ROUND'
EXPORTING
decimals = 2
input = l_kbetr
sign = 'X'
IMPORTING
output = xkomv-kbetr
EXCEPTIONS
input_invalid = 1
overflow = 2
type_invalid = 3
OTHERS = 4.
xkwert = xkomv-kbetr.
CATCH cx_root.
ENDTRY.
ENDIF.
*} INSERT
ENDFORM.
然后就可以在 SPRO—>物料管理—>采购—>条件—>定义价格确认流程—>设置计算方案 - 采购 将例程编号填入条件类型为PBXX那行的条件金额备选计算例程。