SAPPOworkfow

作者:SAPTAB 约 9 分钟阅读 更新日期:2025-03-02 1 年前更新 标签:ABAP, Data Engineering, MM, SD, WM, 仓库管理, 工具, 开发, 技术, 数据工程, 物料管理, 销售分销
SAPPOworkfow - 封面图
SAPPOworkfow - 封面图

# SAP PO workfow

原创 Tab Zhu [ SAP TAB ](javascript:void\(0\);)

__ _ _ _ _

最近研究了一下sap里面的PR/PO的Workflow,总结一下workflow如何开发:我们的业务场景是:如下所示,当PO创建时,发送Request

Email给第一级的审批人,当第一级审批完后发送给第二级审批人,当PO被拒绝时,发送给创建人Rejected

Email;当最后一人审批完成后,发送给创建人Approved Email

SAPPOworkfow - 封面图
SAPPOworkfow - 封面图

# 1.Workflow构建

## 1.1. PFTC新建Workflow

SAP里面有很多的标准模板存在,先在Tcode-PFTC中复制一个WS20000075 ->WS90000017

SAPPOworkfow - 封面图
SAPPOworkfow - 封面图
SAPPOworkfow - 封面图
SAPPOworkfow - 封面图

## 1.2. SWDD维护Workflow事件

复制好后,我们去事务码-SWDD中打开这个工作流模板,然后保存,输入新的名称

SAPPOworkfow - 封面图
SAPPOworkfow - 封面图

然后双击"已创建采购订单的审批步骤"

SAPPOworkfow - 封面图
SAPPOworkfow - 封面图

然后点击"已定义的绑定"可以查看从Event传到Workflow中的参数

SAPPOworkfow - 封面图
SAPPOworkfow - 封面图

切换到步数界面我们选择左下方的下拉框:选择工作流容器,双击进行创建:

SAPPOworkfow - 封面图
SAPPOworkfow - 封面图

我们需要创建2个element:WorkflowID 和 StepIdentifier,其中workflowid

用来存储当前workflow的ID,StepIdentifier用来存储当前步骤

SAPPOworkfow - 封面图
SAPPOworkfow - 封面图

然后我们切换回"可插入的步骤类型",拖动容器操作到Release of purchase order之前,并设置

SAPPOworkfow - 封面图
SAPPOworkfow - 封面图

在这之后添加一个分支,来发送邮件

SAPPOworkfow - 封面图
SAPPOworkfow - 封面图
SAPPOworkfow - 封面图
SAPPOworkfow - 封面图

我们双击其中一个空白未定义的步骤,选择收件人类型为U电子邮件地址,填写电子邮件地址,然后填写主题和内容,点击左上方-传输并返回,这时会自动生成一个任务

SAPPOworkfow - 封面图
SAPPOworkfow - 封面图

我们将Release of purchase order的作业移到另一个空白未定义的步骤,如下图所示

SAPPOworkfow - 封面图
SAPPOworkfow - 封面图

双击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-所以把这个作业给删除了

SAPPOworkfow - 封面图
SAPPOworkfow - 封面图
SAPPOworkfow - 封面图
SAPPOworkfow - 封面图

# 2.业务对象创建

对于Purchase

Order来说,我们先找一下其业务对象,我们进入事务码BAPI,然后选择物料管理->采购->PurchaseOrder,然后选择右侧工具页签,双击Business

Object Builder,点击下方显示

SAPPOworkfow - 封面图
SAPPOworkfow - 封面图

我们就可以看到PO的业务对象类型是BUS2012

SAPPOworkfow - 封面图
SAPPOworkfow - 封面图

## 2.1. SWE2配置

我们进入TCODE

SWE2,然后对于对象类别BO,对象类型BUS2012,事件RELEASESTEPCREATED的条目复制一条:接收方类型填入我们之前PFTC新建的Workflow

Template WS90000017

SAPPOworkfow - 封面图
SAPPOworkfow - 封面图

## 2.2. SWO1新建对象类型

接着我们进入SWO1事务码, 我们输入BUS2012然后点击创建子类型:然后输入我们需要创建的对象的信息,然后点击确认

SAPPOworkfow - 封面图
SAPPOworkfow - 封面图

创建完之后,返回SWO1初始界面 点击设置->委托

SAPPOworkfow - 封面图
SAPPOworkfow - 封面图

增加/修改 BUS2012条目,其委托的类型为YBUS2012

SAPPOworkfow - 封面图
SAPPOworkfow - 封面图

完成上述步骤之后,我们就可以在YBUS2012中新增或者修改方法了,在方法中添加一个checkPoStatus的方法,如下设置,然后点确定

SAPPOworkfow - 封面图
SAPPOworkfow - 封面图
SAPPOworkfow - 封面图
SAPPOworkfow - 封面图

之后光标定位在YTAB_PurchaseOrder.CheckPOStatus方法上,然后点击参数按钮:

SAPPOworkfow - 封面图
SAPPOworkfow - 封面图

接着点'创建'按钮:创建2个参数:输入:PurchaseOrder -订单号

SAPPOworkfow - 封面图
SAPPOworkfow - 封面图

输出:StepIdentifier -标记当前状态

SAPPOworkfow - 封面图
SAPPOworkfow - 封面图

保存后我们点'程序'按钮,自动创建程序选择'是', 我们需要在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.

然后我们返回对象类型界面,选择编辑->更改版本状态->对象类型组件->需要实施&已释放 来启用该方法

SAPPOworkfow - 封面图
SAPPOworkfow - 封面图

# 3\. workflow修改

## 3.1. 修改Workflow

我们返回SWDD中,给工作流WS90000017添加作业,将左下栏中的作业拖至作业Release of purchase order effected后面:

SAPPOworkfow - 封面图
SAPPOworkfow - 封面图

在弹出的界面中,点击任务旁边的按钮创建任务:

SAPPOworkfow - 封面图
SAPPOworkfow - 封面图

按下图所示填写信息,然后保存

SAPPOworkfow - 封面图
SAPPOworkfow - 封面图

我们可以看到自动生成了一个任务TS90000010,点击绑定,我们将Workflow的参数和该任务步骤参数进行绑定,然后我们点上方的✔返回

SAPPOworkfow - 封面图
SAPPOworkfow - 封面图

同样的我们需要在purchase order changed significantly后面也增加一个Check PO Status的作业

SAPPOworkfow - 封面图
SAPPOworkfow - 封面图

接着我们再Check PO Status 后面增加'条件'来决定发送邮件告诉PO请求者审批结果:

SAPPOworkfow - 封面图
SAPPOworkfow - 封面图
SAPPOworkfow - 封面图
SAPPOworkfow - 封面图

我们在Yes的分支增加发送邮件的动作,并且填入发送邮件信息

SAPPOworkfow - 封面图
SAPPOworkfow - 封面图

同理,我们在另一个Check PO Status后面也加上'条件'来发送邮件告诉PO请求者审批被拒绝

SAPPOworkfow - 封面图
SAPPOworkfow - 封面图
SAPPOworkfow - 封面图
SAPPOworkfow - 封面图

保存并激活

SAPPOworkfow - 封面图
SAPPOworkfow - 封面图

接着我们跳到转到->基本数据,然后点击'开始事件'页签,点一下活动/非活动按钮,改成绿色激活状态

SAPPOworkfow - 封面图
SAPPOworkfow - 封面图

# 4\. Agent代理增强

这里我们Workflow的配置构建流程就基本结束了,我们去创建新的PO的时候已经可以触发工作流了,但是可能显示的是错误

SAPPOworkfow - 封面图
SAPPOworkfow - 封面图

这时我们去事务码SWI1,去双击出错的任务

SAPPOworkfow - 封面图
SAPPOworkfow - 封面图

点击上方'带有技术细节的列表'

SAPPOworkfow - 封面图.textContent = new Date().getFullYear();