Enterprise Resource Planning Blogs by SAP
Get insights and updates about cloud ERP and RISE with SAP, SAP S/4HANA and SAP S/4HANA Cloud, and more enterprise management capabilities with SAP blog posts.
cancel
Showing results for 
Search instead for 
Did you mean: 
Tony_Yan
Advisor
Advisor
0 Kudos

本文通过一个实际案例向大家描述如何通过S4HC自带的工作流工具实现对含折扣的销售订单(或报价)的审批。


下面描述一个需求场景:


对于一般销售订单,由于价格都取自标准定价条件,若标准价格设定不允许手动更改,销售经理认为并不需要审批一般的销售订单。


但对于具有折扣条的销售订单,则需要特别审批,并希望根据折扣金额设置相关的审批层级(两级)。


如何通过S4HC自带的工作流功能实现这个功能呢?


**********************


1. 定义审批请求的原因码。SSCUI: 102751


创建两个审批代码,如:


Z001 一级折扣审批


Z002 二级折扣审批


2. 分配审批请求的原因。SSCUI: 102752


将Z001和Z002 分配给销售订单“C”。


3. 配置定价过程。 SSCUI: 101117


创建自定义定价过程。将需要审批的折扣定价条件设置小计(如小计6或小计5等)


此处的折扣小计可以针对某个单一的定价条件,也可以设置若干个折扣的合计值(参考300步骤)。



4. 设置定价程序确定。 SSCUI: 101118


将自定义的定价程序分配给相关销售范围和客户/凭证定价组合。


5. 创建In-app BADI. app: "自定义字段和逻辑“


创建自定义逻辑:



写入代码如下:


______________________________________________________________


DATA: ls_salesdocumentitem TYPE line of TDT_BD_SD_APM_ITEM.


DATA: lv_sumkzwi6 TYPE KZWI6.



* Sales order approval workflow with discount



IF salesdocument-sddocumentcategory = 'C' .



LOOP AT salesdocumentitem INTO ls_salesdocumentitem.


IF ls_salesdocumentitem-subtotal6amount NE 0.


lv_sumkzwi6 = lv_sumkzwi6 + ls_salesdocumentitem-subtotal6amount.


ENDIF.


CLEAR ls_salesdocumentitem.


ENDLOOP.



IF lv_sumkzwi6 >= 10000.


salesdocapprovalreason = 'Z002'.


ELSEIF lv_sumkzwi6 > 0.


salesdocapprovalreason = 'Z001'.


ENDIF.



CLEAR lv_sumkzwi6.


ENDIF.


______________________________________________________


该段BADI的逻辑为:


(1) 读取销售订单行项目中的小计字段(代码中使用的小计6),并逐行累加。


(2) 判断销售订单中的小计累计值(累计折扣值)若大于10000元则进行二级审批,否则执行一级审批。


可按需调整此段代码逻辑。


测试后,激活BADI。


6. 创建销售订单工作流。


设置相应工作流, Z001审批原因代码为折扣一级审批,Z002审批原因代码为折扣二级审批。



关于工作流,设定相关的开始条件和审批步骤。


开始条件:按照申请原因代码,也可以加入组织结构限制。


审批步骤:可以直接分配给用户,也可使用角色(只有两级),配合“管理团队和职责” 使用。


**********************


以上是如何利用现有S4HC内嵌的工作流实现带折扣的销售订单审批,思路供大家参考。


更为复杂的逻辑和计算如不能通过in-app BADI实现,则无法在S4HC中直接实现,可以考虑使用SCP上的工作流工具实现。