工单状态操作
相关函数
‘STATUS_READ’
‘STATUS_TEXT_EDIT’
‘IBAPI_ALM_ORDER_CHANGE_USRSTAT’
‘BAPI_ALM_ORDER_MAINTAIN’
获取工单状态
‘STATUS_READ’
首先获取 工单的状态有两个函数,都是要用到对象号,在AFUK表根据单号可以查到
STATUS_READ
第一个是从表中直接到JEST中取出字段STAT INACT,JEST表中STAT是一串从字面看不出意思的字符,可以根据STAT到表TJ02T中找到具体的描述。
简单的例子:
CALL FUNCTION 'STATUS_READ'
EXPORTING
client = sy-mandt
objnr = i_caufv_resb-objnr ”对象号
only_active = 'X'
* IMPORTING
* OBTYP =
* STSMA =
* STONR =
TABLES
status = i_jstat “状态
EXCEPTIONS
object_not_found = 1
OTHERS = 2.
‘STATUS_TEXT_EDIT’
STATUS_TEXT_EDIT 用的比较多一些,
CALL FUNCTION 'STATUS_TEXT_EDIT'
EXPORTING
FLG_USER_STAT = 'X'
OBJNR = p_objnr
ONLY_ACTIVE = 'X'
SPRAS = SY-LANGU
IMPORTING
LINE = line
EXCEPTIONS
OBJECT_NOT_FOUND = 01
OTHERS = 02.
获取到状态了,接着判断状态是不是符合要求,这个根据字符串操作都可以的,SERCH 字段 CS 都行。
SEARCH line FOR ‘XXXX’.
IF sy-subrc = 0.
ENDIF.
if line CS 'XXXX' .
ENDIF.
修改工单状态
到修改工单状态了,前提是工单不能被锁。
修改工单用户状态有两个函数,先介绍简单的。
‘IBAPI_ALM_ORDER_CHANGE_USRSTAT’
IBAPI_ALM_ORDER_CHANGE_USRSTAT
* ls_bapi_methods-method = 'SAVE'. 定义操作方法 保存。
* APPEND ls_bapi_methods TO lt_bapi_methods.
* LS_BAPI_USRSTAT-user_st_text = 'REJ'. "用户状态
* LS_BAPI_USRSTAT-langu = '1'.
* LS_BAPI_USRSTAT-change_event = '2'.
*
* APPEND LS_BAPI_USRSTAT TO LT_BAPI_USRSTAT.
* CLEAR LS_BAPI_USRSTAT.
*
* CALL FUNCTION 'IBAPI_ALM_ORDER_CHANGE_USRSTAT'
* EXPORTING
* iv_orderid = os_272-workno "单号
* it_usrstat = LT_BAPI_USRSTAT
* iv_event = '02'
* TABLES
* et_messages = lt_msg.
*
* LOOP AT lt_msg TRANSPORTING NO FIELDS WHERE msgty CA 'EA'.
* ENDLOOP.
*
* IF sy-subrc = 0.
* CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
* ELSE.
*
* CALL FUNCTION 'BAPI_ALM_ORDER_MAINTAIN' 执行保存方法
* TABLES
* it_methods = lt_bapi_methods
* return = lt_bapi_return.
*
* LOOP AT lt_bapi_return INTO ls_bapi_return WHERE type CA 'EA'.
* ENDLOOP.
*
* IF sy-subrc = 0.
* CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
* CLEAR:lt_bapi_return.
* ELSE.
* CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'.
* ENDIF.
* ENDIF.
‘BAPI_ALM_ORDER_MAINTAIN’
不管啥操作要加一个保存的方法
接着要来介绍的函数上面也用过了(BAPI_ALM_ORDER_MAINTAIN)
这是一个对于工单操作的集合函数,能实现多种效果,在网上也找了一些参考资料,看了源码给出参考。
这个函数最重要的参数就是(IT_METHODS)
这个表里有四个参数
1.REFNUMBER:是objecttype参数中填入的相关对象对应的内表行数,做过财务的冲销BAPI应该知道要标记两行,很类似,一行对应一个对象。
2.OBJECTTYPE:对象类型,类型如下:
来自本身函数转换的源码,共转换了19种对象
* Umsetzen der Objektbezeichnungen ************************
MOVE ls_methodline-objecttype TO lv_objecttype.
TRANSLATE lv_objecttype
USING 'aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ'.
* - und _ in space umwandeln
TRANSLATE lv_objecttype USING '_ - '.
* diese spaces entfernen
CONDENSE lv_objecttype NO-GAPS.
* ORDER entfernen
REPLACE 'ORDER' IN lv_objecttype WITH ''.
* Damit sind nun alle Kombinationen wie:
* ORDER_HEADER, ORDER-HEADER, ORDERHEADER... abgedeckt.
CASE lv_objecttype. 对象名
WHEN 'HEADER'. 订单抬头数据
MOVE gc_order_header TO
ls_methodline-objecttype.
WHEN 'PARTNER'. 合作伙伴数据
MOVE gc_order_partner TO
ls_methodline-objecttype.
WHEN 'USERSTATUS'. 用户状态
MOVE gc_order_userstatus TO
ls_methodline-objecttype.
WHEN 'OPERATION'.
MOVE gc_order_operation TO
ls_methodline-objecttype.
WHEN 'COMPONENT'.
MOVE gc_order_component TO
ls_methodline-objecttype.
WHEN 'RELATION'.
MOVE gc_order_relation TO
ls_methodline-objecttype.
WHEN 'OBJECTLIST'.
MOVE gc_order_objectlist TO
ls_methodline-objecttype.
WHEN 'OLISTRELATION'.
MOVE gc_olist_relation TO
ls_methodline-objecttype.
WHEN 'SRULE'.
MOVE gc_order_srule TO
ls_methodline-objecttype.
WHEN 'TEXT'.
MOVE gc_order_text TO
ls_methodline-objecttype.
WHEN 'TASKLIST'.
MOVE gc_order_tasklist TO
ls_methodline-objecttype.
WHEN 'PRT'.
MOVE gc_order_prt TO
ls_methodline-objecttype.
WHEN 'SERVICEOUTLINE'.
MOVE gc_order_serviceoutline TO
ls_methodline-objecttype.
WHEN 'SERVICELINE'.
MOVE gc_order_serviceline TO
ls_methodline-objecttype.
WHEN 'SERVICELIMIT'.
MOVE gc_order_servicelimit TO
ls_methodline-objecttype.
WHEN 'SERVICECONTRACTLIMIT'.
MOVE gc_order_servicecontractlimit TO
ls_methodline-objecttype.
WHEN 'PERMIT'.
MOVE gc_order_permit TO
ls_methodline-objecttype.
WHEN 'PERMITISSUE'.
MOVE gc_order_permit_issue TO
ls_methodline-objecttype.
WHEN 'ESTIMATEDCOST'. " 1672966 EAMCC PM110
MOVE gc_order_est_cost TO
ls_methodline-objecttype.
WHEN space.
MOVE space TO
ls_methodline-objecttype.
WHEN OTHERS.
* Unbekanntes Objekt => Fehler senden und abbrechen
* Objektname &1 in Methodentabelle nicht gültig
MESSAGE e101(iwo_bapi2)
WITH ls_methodline-objecttype INTO mess.
bapi_message.
MOVE gc_error TO lv_obj_error.
ENDCASE.
3.METHOD:方法,可以实现创建、修改、删除、保存等功能以及工单的状态:
Umsetzen der Methodenbezeichnungen **********************
MOVE ls_methodline-method TO lv_method.
TRANSLATE lv_method
USING 'aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ'.
CASE lv_method. 方法名
WHEN 'NOSCHEDULING'.
MOVE gc_meth_no_scheduling TO
ls_methodline-method.
WHEN 'NOCALCULATION'.
MOVE gc_meth_no_calculation TO
ls_methodline-method.
WHEN 'SAVE'.
MOVE gc_meth_save TO
ls_methodline-method.
WHEN 'DIALOG'.
MOVE gc_meth_dialog TO
ls_methodline-method.
WHEN 'DELETEDSEX' OR 'DELDSEX'. "Delete external scheduling
MOVE gc_meth_deldsex TO
ls_methodline-method.
WHEN 'CREATE'.
MOVE gc_meth_create TO
ls_methodline-method.
WHEN 'CREATETONOTIF'.
MOVE gc_meth_createtonotif TO
ls_methodline-method.
WHEN 'CHANGE'.
MOVE gc_meth_change TO
ls_methodline-method.
WHEN 'DELETE'.
MOVE gc_meth_delete TO
ls_methodline-method.
WHEN 'RELEASE'.
MOVE gc_meth_release TO
ls_methodline-method.
WHEN 'TECOMPLETE' OR 'TECO' OR 'TECHNICALCOMPLETE'.
MOVE gc_meth_tecomplete TO
ls_methodline-method.
WHEN 'ATPCHECK'.
MOVE gc_meth_atpcheck TO
ls_methodline-method.
WHEN 'CALCULATE'.
MOVE gc_meth_calculate TO
ls_methodline-method.
WHEN 'SCHEDULE'.
MOVE gc_meth_schedule TO
ls_methodline-method.
WHEN 'ADD' or 'EXPLODE'.
MOVE gc_meth_add TO
ls_methodline-method.
WHEN OTHERS.
* Methodenname &1 in Methodentabelle nicht gültig
MESSAGE e102(iwo_bapi2)
WITH ls_methodline-method INTO mess.
bapi_message.
MOVE gc_error TO lv_met_error.
ENDCASE. "lv_metho
4.OBJECTKEY: 外部对象码,详细如下:
0-12长度对应得是 Order number 工单号
13-16长度对应得是 Operation number 工序号
17-20长度对应得是 Suboperation number 子工序号
13-24 长度对应得是 Notification number (only for method CREATETONOTIF)
比较简洁了,这个函数还是可以干很多工单操作的事情的,后续继续更新。
举个改工单状态的例子,工单要先检查锁!
CLEAR ls_bapi_methods.
ls_bapi_methods-refnumber = 1.
ls_bapi_methods-objecttype = 'USERSTATUS'. 对象
ls_bapi_methods-method = 'CHANGE'. 方法
ls_bapi_methods-objectkey+0(12) = os_272-workno. 单号
APPEND ls_bapi_methods TO lt_bapi_methods.
ls_bapi_USRSTAT1-user_st_text = 'REJ'. "用户状态
ls_bapi_USRSTAT1-langu = '1'.
ls_bapi_USRSTAT1-change_event = '2'.
APPEND ls_bapi_USRSTAT1 TO lT_bapi_USRSTAT1.
IF lt_bapi_methods IS NOT INITIAL. 不管啥操作要加一个保存的方法
CLEAR ls_bapi_methods.
ls_bapi_methods-method = 'SAVE'. " 定义操作方法 保存。
APPEND ls_bapi_methods TO lt_bapi_methods.
ENDIF .
CALL FUNCTION 'BAPI_ALM_ORDER_MAINTAIN'
TABLES
it_methods = lt_bapi_methods
return = lt_bapi_return
IT_USERSTATUS = lT_bapi_USRSTAT1.
LOOP AT lt_bapi_return TRANSPORTING NO FIELDS WHERE TYPE CA 'EA'.
ENDLOOP.
IF sy-subrc = 0.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
ELSE.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'.
ENDI