# SAP PO workfow
原创 Tab Zhu [ SAP TAB ](javascript:void\(0\);)
__ _ _ _ _
最近研究了一下sap里面的PR/PO的Workflow,总结一下workflow如何开发:我们的业务场景是:如下所示,当PO创建时,发送Request
Email给第一级的审批人,当第一级审批完后发送给第二级审批人,当PO被拒绝时,发送给创建人Rejected
Email;当最后一人审批完成后,发送给创建人Approved Email
# 1.Workflow构建
## 1.1. PFTC新建Workflow
SAP里面有很多的标准模板存在,先在Tcode-PFTC中复制一个WS20000075 ->WS90000017
## 1.2. SWDD维护Workflow事件
复制好后,我们去事务码-SWDD中打开这个工作流模板,然后保存,输入新的名称
然后双击"已创建采购订单的审批步骤"
切换到步数界面我们选择左下方的下拉框:选择工作流容器,双击进行创建:
我们需要创建2个element:WorkflowID 和 StepIdentifier,其中workflowid
用来存储当前workflow的ID,StepIdentifier用来存储当前步骤
然后我们切换回"可插入的步骤类型",拖动容器操作到Release of purchase order之前,并设置
在这之后添加一个分支,来发送邮件
我们双击其中一个空白未定义的步骤,选择收件人类型为U电子邮件地址,填写电子邮件地址,然后填写主题和内容,点击左上方-传输并返回,这时会自动生成一个任务
我们将Release of purchase order的作业移到另一个空白未定义的步骤,如下图所示
双击Release of purchase
order作业我们可以看到任务TS20000166-这是一个标准的任务,PO被批准/修改/取消时触发,在结果页签中,我们可以看到3个活动的可能的结果,这样在这个作业后续可以看到有3个分支(其实这里Release
of purchase order cancelled 这个触发器事件时不用了的)当PO被release approved时触发的是Purchase
order released,当被拒绝、修改、取消时,触发的是Purchase order changed significantly
这里我们用不到Release of purchase order effected-所以把这个作业给删除了
# 2.业务对象创建
对于Purchase
Order来说,我们先找一下其业务对象,我们进入事务码BAPI,然后选择物料管理->采购->PurchaseOrder,然后选择右侧工具页签,双击Business
Object Builder,点击下方显示
我们就可以看到PO的业务对象类型是BUS2012
## 2.1. SWE2配置
我们进入TCODE
SWE2,然后对于对象类别BO,对象类型BUS2012,事件RELEASESTEPCREATED的条目复制一条:接收方类型填入我们之前PFTC新建的Workflow
Template WS90000017
## 2.2. SWO1新建对象类型
接着我们进入SWO1事务码, 我们输入BUS2012然后点击创建子类型:然后输入我们需要创建的对象的信息,然后点击确认
创建完之后,返回SWO1初始界面 点击设置->委托
增加/修改 BUS2012条目,其委托的类型为YBUS2012
完成上述步骤之后,我们就可以在YBUS2012中新增或者修改方法了,在方法中添加一个checkPoStatus的方法,如下设置,然后点确定
之后光标定位在YTAB_PurchaseOrder.CheckPOStatus方法上,然后点击参数按钮:
接着点'创建'按钮:创建2个参数:输入:PurchaseOrder -订单号
输出:StepIdentifier -标记当前状态
保存后我们点'程序'按钮,自动创建程序选择'是', 我们需要在SWC_GET_ELEMENT和SWC_SET_ELEMENT之间输入自己的代码
我们需要根据采购订单的状态(EKKO-PROCSTAT)来判断返回的StepIdentifier标识,
03:表示等待审批、05:表示审批完成、08:表示已拒绝 - 目前我只用到了这3个字段,所以我们代码如下:
begin_method checkpostatus changing container.
DATA:stepidentifier TYPE char4,
purchaseorder TYPE ekko-ebeln.
swc_get_element container 'PurchaseOrder' purchaseorder.
*-----Customerize Code-------*
WAIT UP TO 3 SECONDS.
CONSTANTS:c_step_rej TYPE char4 VALUE 'REJ' ##NO_TEXT,
c_step_reld TYPE char4 VALUE 'RELD' ##NO_TEXT,
c_step_canc TYPE char4 VALUE 'CANC' ##NO_TEXT.
SELECT SINGLE procstat INTO @DATA(lv_procstat)FROM ekko
WHERE ebeln = @purchaseorder.
IF sy-subrc EQ 0.CASE lv_procstat.
WHEN '08'."refused
stepidentifier = c_step_rej.
WHEN '03'.
stepidentifier = c_step_canc.
WHEN '05'.
stepidentifier = c_step_reld.
WHEN OTHERS.
CLEAR stepidentifier.
ENDCASE.
ENDIF.*-----Customerize Code-------*
swc_set_element container 'StepIdentifier' stepidentifier.
end_method.
然后我们返回对象类型界面,选择编辑->更改版本状态->对象类型组件->需要实施&已释放 来启用该方法
# 3\. workflow修改
## 3.1. 修改Workflow
我们返回SWDD中,给工作流WS90000017添加作业,将左下栏中的作业拖至作业Release of purchase order effected后面:
在弹出的界面中,点击任务旁边的按钮创建任务:
按下图所示填写信息,然后保存
我们可以看到自动生成了一个任务TS90000010,点击绑定,我们将Workflow的参数和该任务步骤参数进行绑定,然后我们点上方的✔返回
同样的我们需要在purchase order changed significantly后面也增加一个Check PO Status的作业
接着我们再Check PO Status 后面增加'条件'来决定发送邮件告诉PO请求者审批结果:
我们在Yes的分支增加发送邮件的动作,并且填入发送邮件信息
同理,我们在另一个Check PO Status后面也加上'条件'来发送邮件告诉PO请求者审批被拒绝
保存并激活
接着我们跳到转到->基本数据,然后点击'开始事件'页签,点一下活动/非活动按钮,改成绿色激活状态
# 4\. Agent代理增强
这里我们Workflow的配置构建流程就基本结束了,我们去创建新的PO的时候已经可以触发工作流了,但是可能显示的是错误
这时我们去事务码SWI1,去双击出错的任务
点击上方'带有技术细节的列表'
.textContent = new Date().getFullYear();