当前位置 博文首页 > 少年休闲海:【SD】自定义销售订单审批状态
销售订单可以在其抬头或者项目中定义审批状态,一般在抬头定义的话就相当于针对整单的审批,可以实现多级审批,每级审批设置能进行何种操作,这里就需要在IMG中定义审批状态参数文件。
配置路径:SPRO→销售与分销→销售→销售凭证→定义并分配状态参数文件→定义状态参数文件
事务代码:BS02
首先需要在“对象类型”中确定类型是销售订单标题还是销售订单项目,这里我们就以销售订单标题为例进行说明。
在用户状态界面输入需要控制几级审批,系统会自动为第一条设置初始状态。
双击各个状态进入事务控制界面,可以选择在此状态下哪些操作是禁止的。
依次设置完毕后保存即可。
状态参数文件基本信息保存的数据表是TJ20,对应的语言描述表TJ20T;
用户状态条目保存的数据表是TJ30,对应的语言描述表TJ30T,注意字段TJ30-ESTAT(用户状态)是条目的自增长值,不可以编辑,格式“Exxx”,例如E0001、E0002;
用户状态控制保存的数据表是TJ31,字段MODKZ存放编辑标志,1为允许、2为允许但警告、3为禁止。
配置路径:SPRO→销售与分销→销售→销售凭证→定义并分配状态参数文件→分配订单类型/状态参数文件&分配状态参数文件到项目类型
事务代码:VOV8 / VOV7
分配完成之后会将相关信息保存于数据库表TVAK 和 TVAP中。
? Tip :
- 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.
cs