ABAP 工单状态操作(IW32)

相关函数

‘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

猜你喜欢

转载自blog.csdn.net/Pegasus666/article/details/116798910
今日推荐