自定义销售订单审批状态
销售订单可以在其抬头或者项目中定义审批状态,一般在抬头定义的话就相当于针对整单的审批,可以实现多级审批,每级审批设置能进行何种操作,这里就需要在IMG中定义审批状态参数文件。
一、定义状态参数文件
配置路径:SPRO→销售与分销→销售→销售凭证→定义并分配状态参数文件→定义状态参数文件
事务代码:BS02
首先需要在“对象类型”中确定类型是销售订单标题还是销售订单项目,这里我们就以销售订单标题为例进行说明。
在用户状态界面输入需要控制几级审批,系统会自动为第一条设置初始状态。
双击各个状态进入事务控制界面,可以选择在此状态下哪些操作是禁止的。
依次设置完毕后保存即可。
状态参数文件基本信息保存的数据表是TJ20,对应的语言描述表TJ20T;
用户状态条目保存的数据表是TJ30,对应的语言描述表TJ30T,注意字段TJ30-ESTAT(用户状态)是条目的自增长值,不可以编辑,格式“Exxx”,例如E0001、E0002;
用户状态控制保存的数据表是TJ31,字段MODKZ存放编辑标志,1为允许、2为允许但警告、3为禁止。
二、分配订单类型/状态参数文件&分配状态参数文件到项目类型
配置路径:SPRO→销售与分销→销售→销售凭证→定义并分配状态参数文件→分配订单类型/状态参数文件&分配状态参数文件到项目类型
事务代码:VOV8 / VOV7
分配完成之后会将相关信息保存于数据库表TVAK 和 TVAP中。
TVAK中的是根据销售凭证类型分配需要在销售订单抬头进行审批的;
TVAP中的是根据项目类型分配需要在销售订单项目进行审批的。
三、订单审批
路径:SAP 菜单→后勤→销售与分销→销售→订单→更改
路径:SAP 菜单→后勤→销售与分销→销售→合同→更改
事务代码:VA42/VA02
在CBO程序中就可以用函数” I_CHANGE_STATUS”进行逐层审批。
【样例代码】
DATA : LV_OBJNR TYPE J_OBJNR.
LV_OBJNR = 'VB' && E_VBELN && IT_ITEM-POSNR.
CALL FUNCTION 'I_CHANGE_STATUS'
EXPORTING
OBJNR = LV_OBJNR
ESTAT_INACTIVE = 'E0001'
ESTAT_ACTIVE = 'E0002'
STSMA = 'ZFMSD02'
* EXCEPTIONS
* CANNOT_UPDATE = 1
* OTHERS = 2.
FUNCTION I_CHANGE_STATUS.
*"----------------------------------------------------------------------
*"*"Update function module:
*"
*"*"Local interface:
*" IMPORTING
*" VALUE(OBJNR) LIKE JEST-OBJNR
*" VALUE(ESTAT_INACTIVE) LIKE TJ30-ESTAT
*" VALUE(ESTAT_ACTIVE) LIKE TJ30-ESTAT
*" VALUE(STSMA) LIKE JSTO-STSMA OPTIONAL
*" EXCEPTIONS
*" CANNOT_UPDATE
*"----------------------------------------------------------------------
************************************************************************
*
* Description: Changes the status for an object
* (ex. a notification or a notification task).
* This function does not validate if the status
* transition is valid (a call to I_CHECK_CHANGE_STATUS
* function should be done before).
*
************************************************************************
TABLES: JSTO.
DATA: T_JEST_INS LIKE JEST_UPD OCCURS 0 WITH HEADER LINE,
T_JEST_UPD LIKE JEST_UPD OCCURS 0 WITH HEADER LINE,
T_JSTO_INS LIKE JSTO OCCURS 0,
T_JSTO_UPD LIKE JSTO_UPD OCCURS 0,
T_OBJ_DEL LIKE ONR00 OCCURS 0.
SELECT SINGLE * FROM JSTO WHERE OBJNR = OBJNR.
IF NOT ESTAT_INACTIVE IS INITIAL.
SELECT SINGLE * INTO T_JEST_UPD FROM JEST
WHERE OBJNR = OBJNR
AND STAT = ESTAT_INACTIVE.
IF SY-SUBRC = 0.
T_JEST_UPD-INACT = 'X'.
ADD 1 TO T_JEST_UPD-CHGNR.
T_JEST_UPD-CHGKZ = JSTO-CHGKZ.
T_JEST_UPD-OBTYP = 'ORI'.
T_JEST_UPD-STSMA = STSMA.
APPEND T_JEST_UPD.
ELSE.
RAISE CANNOT_UPDATE.
ENDIF.
ENDIF.
SELECT SINGLE * INTO T_JEST_UPD FROM JEST
WHERE OBJNR = OBJNR
AND STAT = ESTAT_ACTIVE.
IF SY-SUBRC = 0.
T_JEST_UPD-MANDT = SY-MANDT.
T_JEST_UPD-INACT = ' '.
ADD 1 TO T_JEST_UPD-CHGNR.
T_JEST_UPD-CHGKZ = JSTO-CHGKZ.
T_JEST_UPD-OBTYP = 'ORI'.
T_JEST_UPD-STSMA = STSMA.
APPEND T_JEST_UPD.
ELSE.
T_JEST_INS-MANDT = SY-MANDT.
T_JEST_INS-OBJNR = OBJNR.
T_JEST_INS-STAT = ESTAT_ACTIVE.
T_JEST_INS-INACT = ' '.
T_JEST_INS-CHGNR = '001'.
T_JEST_INS-CHGKZ = JSTO-CHGKZ.
T_JEST_INS-OBTYP = 'ORI'.
T_JEST_INS-STSMA = STSMA.
APPEND T_JEST_INS.
ENDIF.
CALL FUNCTION 'STATUS_UPDATE'
TABLES
JEST_INS = T_JEST_INS
JEST_UPD = T_JEST_UPD
JSTO_INS = T_JSTO_INS
JSTO_UPD = T_JSTO_UPD
OBJ_DEL = T_OBJ_DEL
EXCEPTIONS
OTHERS = 1.
IF SY-SUBRC <> 0.
RAISE CANNOT_UPDATE.
ENDIF.
ENDFUNCTION.