zoukankan      html  css  js  c++  java
  • ABAP 工单状态筛选(参考COOIS)

    转载 https://blog.csdn.net/Sundam/article/details/96116998

    如果想在自开发的报表中使用类似COOIS的状态来筛选工单可以参考其源码(注意 老版本的ECC和HANA的代码源码有细微的区别)

    主要包含以下几个代码段:
    
    1.定义屏幕元素,由于表TJ02T不含搜索帮助,所以要手工添加:
    
    屏幕元素:
    
    SELECTION-SCREEN BEGIN OF LINE.
    SELECTION-SCREEN:
      COMMENT 1(20) TEXT-SYS FOR FIELD P_SYST1    MODIF ID C1,
      POSITION 33.
    PARAMETERS:
      P_SYST1 LIKE TJ02T-TXT04                    MODIF ID C1,
      P_SYSH1 LIKE JEST-STAT                      NO-DISPLAY.
    SELECTION-SCREEN
      POSITION 46.
    PARAMETERS:
      P_EXCL1   LIKE RCOSA-EXCL1                  MODIF ID C1.
    SELECTION-SCREEN:
      COMMENT 40(5) TEXT-EXC FOR FIELD P_EXCL1    MODIF ID C1,
      COMMENT 52(3) TEXT-AND FOR FIELD P_SYST2    MODIF ID C1,
        POSITION 58.
    PARAMETERS:
      P_SYST2 LIKE TJ02T-TXT04                    MODIF ID C1,
      P_SYSH2 LIKE JEST-STAT                      NO-DISPLAY.
    SELECTION-SCREEN
        POSITION 71.
    PARAMETERS:
      P_EXCL2   LIKE RCOSA-EXCL1                  MODIF ID C1.
    SELECTION-SCREEN:
        COMMENT 65(5) TEXT-EXC FOR FIELD P_EXCL2  MODIF ID C1.
    SELECTION-SCREEN END   OF LINE.
    PARAMETERS:
      P_SELID  LIKE TJ48T-SELID                   NO-DISPLAY.
    
     
    
    搜索帮助:
    
    AT SELECTION-SCREEN ON VALUE-REQUEST FOR P_SYST1.
      PERFORM VAL_REQ_STATUS USING 'P_SYST1' CHANGING P_SYST1 P_SYSH1.
    
    AT SELECTION-SCREEN ON VALUE-REQUEST FOR P_SYST2.
      PERFORM VAL_REQ_STATUS USING 'P_SYST2' CHANGING P_SYST2 P_SYSH2.
    
    *&---------------------------------------------------------------------*
    *&      Form  val_req_status
    *&---------------------------------------------------------------------*
    *       F4-Help to select system status by text, providing also code
    *----------------------------------------------------------------------*
    *      -->I_DYNPF    Name of dynpro field
    *      -->C_TXT04    Status short text
    *      -->C_STAT     Status code
    *----------------------------------------------------------------------*
    FORM VAL_REQ_STATUS USING    I_DYNPF
                        CHANGING C_TXT04 LIKE TJ02T-TXT04
                                 C_STAT  LIKE JEST-STAT.
    
      TYPES: BEGIN OF TY_VALUE,
               ISTAT TYPE J_ISTAT,
               TXT04 TYPE J_TXT04,
               TXT30 TYPE J_TXT30,
             END OF TY_VALUE.
    
      DATA: L_VALUE   TYPE DYNFIELDVALUE,
            L_REPID   TYPE SY-REPID,
            LS_DYNP   TYPE DYNPREAD,
            LS_TJ02   TYPE TJ02,
            LS_VALUE  TYPE TJ02T,
            LS_RETURN TYPE DDSHRETVAL,
            LT_DYNP   TYPE STANDARD TABLE OF DYNPREAD,
            LT_TJ02   TYPE STANDARD TABLE OF TJ02,
            LT_VALUE  TYPE STANDARD TABLE OF TJ02T,
            LT_RETURN TYPE STANDARD TABLE OF DDSHRETVAL.
    
    * personal value key
      DATA: L_PVALKEY TYPE DDSHPVKEY.
    
    * Get current value from screen
      LS_DYNP-FIELDNAME = I_DYNPF.
      APPEND LS_DYNP TO LT_DYNP.
      CALL FUNCTION 'DYNP_VALUES_READ'
        EXPORTING
          DYNAME     = SY-REPID
          DYNUMB     = SY-DYNNR
        TABLES
          DYNPFIELDS = LT_DYNP
        EXCEPTIONS
          OTHERS     = 0.
      READ TABLE LT_DYNP INTO LS_DYNP INDEX 1.
    
    * Get all possible values
      SELECT * FROM TJ02 INTO TABLE LT_TJ02
                         WHERE NODIS = SPACE.
      IF LT_TJ02 IS NOT INITIAL.
        SELECT * FROM TJ02T INTO TABLE LT_VALUE
                          FOR ALL ENTRIES IN LT_TJ02
                          WHERE ISTAT = LT_TJ02-ISTAT
                            AND SPRAS = SY-LANGU.
      ENDIF.
      IF LINES( LT_TJ02 ) <> LINES( LT_VALUE ).
    *   Not all status available in current language, try in german
    *   as in FORM value_state(saplcoss)
        LOOP AT LT_TJ02 INTO LS_TJ02.
          READ TABLE LT_VALUE INTO LS_VALUE WITH KEY ISTAT = LS_TJ02-ISTAT.
          CHECK SY-SUBRC <> 0.
          SELECT SINGLE * FROM TJ02T INTO LS_VALUE
                              WHERE ISTAT = LS_TJ02-ISTAT
                                AND SPRAS = 'D'.
          IF SY-SUBRC = 0.
            APPEND LS_VALUE TO LT_VALUE.
          ENDIF.
        ENDLOOP.
      ENDIF.
      SORT LT_VALUE BY ISTAT.
    
    * Call own F4-help, not showing internal status number
      L_VALUE = LS_DYNP-FIELDVALUE.
      L_REPID = 'PPIO_ENTRY'.
    * fill key for personal value list
      L_PVALKEY = SY-UNAME.
      CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
        EXPORTING
          DDIC_STRUCTURE   = 'TJ02T'
          RETFIELD         = 'TXT04'
          PVALKEY          = L_PVALKEY
          VALUE            = L_VALUE
          VALUE_ORG        = 'S'
          CALLBACK_PROGRAM = L_REPID
          CALLBACK_FORM    = 'VAL_REQ_STATUS_CALLBACK'
        TABLES
          VALUE_TAB        = LT_VALUE
          RETURN_TAB       = LT_RETURN.
    
    * Get selectect value and internal status number
      READ TABLE LT_RETURN INTO LS_RETURN WITH KEY FIELDNAME = 'ISTAT'.
      IF SY-SUBRC = 0.
        READ TABLE LT_VALUE WITH KEY ISTAT = LS_RETURN-FIELDVAL
                            INTO LS_VALUE.
        CHECK SY-SUBRC = 0.
        C_TXT04 = LS_VALUE-TXT04.
        C_STAT  = LS_VALUE-ISTAT.
      ELSE.
        CLEAR: C_TXT04, C_STAT.
      ENDIF.
    
    ENDFORM.                    "val_req_status
    
     
    
    2.工单校验:
    
    DATA: BEGIN OF STATUS_TMP OCCURS 0,
            STAT LIKE JEST-STAT,
            EXCL LIKE RC27X-FLG_SEL,
          END   OF STATUS_TMP.
    DATA: STATUS_HDR_TAB LIKE STATUS_TMP OCCURS 0 WITH HEADER LINE,
          STATUS_OPR_TAB LIKE STATUS_TMP OCCURS 0 WITH HEADER LINE,
          STATUS_CMP_TAB LIKE STATUS_TMP OCCURS 0 WITH HEADER LINE.
    TYPES:
      BEGIN OF TYP_S_AUFNR,
        AUFNR TYPE AUFNR,
      END OF TYP_S_AUFNR,
      TYP_TS_AUFNR TYPE SORTED TABLE OF TYP_S_AUFNR
                   WITH NON-UNIQUE KEY AUFNR,
      BEGIN OF TYP_S_OBJNR,
        AUFNR TYPE AUFNR,
        AUFPL TYPE CO_AUFPL,
        APLFL TYPE PLNFOLGE,
        PLNFL TYPE PLNFOLGE,
        OBJNR TYPE J_OBJNR,
      END OF TYP_S_OBJNR,
      TYP_TS_AUFNR_OBJNR TYPE SORTED TABLE OF TYP_S_OBJNR
                         WITH NON-UNIQUE KEY AUFNR OBJNR,
      TYP_TS_AUFPL_OBJNR TYPE SORTED TABLE OF TYP_S_OBJNR
                         WITH NON-UNIQUE KEY AUFPL OBJNR,
      TYP_TS_OBJNR       TYPE SORTED TABLE OF TYP_S_OBJNR,
      BEGIN OF TYP_S_VBELN,
        VBELN TYPE VBELN,
      END OF TYP_S_VBELN,
      TYP_TS_VBELN TYPE SORTED TABLE OF TYP_S_VBELN
                   WITH NON-UNIQUE KEY VBELN.
    
    DATA: YX VALUE 'X'.
    
      DATA:LTS_OBJNR TYPE TYP_TS_AUFNR_OBJNR.
    
    * APPEND STATUS TO IMPORTED TABLE FOR HEADER SELECTION
      PERFORM FILL_STATUS_TABLE
              TABLES STATUS_HDR_TAB
              USING  P_SYST1
                     P_SYSH1
                     P_EXCL1
                     P_SYST2
                     P_SYSH2
                     P_EXCL2.
    
      IF STATUS_HDR_TAB[] IS NOT INITIAL.
        CLEAR LTS_OBJNR[] .
        SELECT AUFNR OBJNR FROM AUFK
               INTO CORRESPONDING FIELDS OF TABLE LTS_OBJNR[]
                 WHERE WERKS  = P_PWERK
                   AND AUFNR IN S_AUFNR
                  .
    
        PERFORM REDUCE_AUFNR_OBJNR_BY_STATUS
                TABLES STATUS_HDR_TAB
                USING  P_SELID
                CHANGING LTS_OBJNR[].
      ENDIF.
    
    *&---------------------------------------------------------------------*
    *&      Form  FILL_STATUS_TABLE
    *&---------------------------------------------------------------------*
    FORM FILL_STATUS_TABLE TABLES   STATUS_TAB STRUCTURE STATUS_HDR_TAB
                           USING    SYST1      LIKE TJ02T-TXT04
                                    SYSH1      LIKE JEST-STAT
                                    EXCL1      LIKE RCOSA-EXCL1
                                    SYST2      LIKE TJ02T-TXT04
                                    SYSH2      LIKE JEST-STAT
                                    EXCL2      LIKE RCOSA-EXCL1.
      DATA STATUS_TMP LIKE STATUS_HDR_TAB.
    
    * Append status from selection screen to imported status table
      IF NOT SYSH1 IS INITIAL.
        STATUS_TMP-STAT = SYSH1.
        STATUS_TMP-EXCL = EXCL1.
        COLLECT STATUS_TMP INTO STATUS_TAB.
      ELSEIF NOT SYST1 IS INITIAL.
        CALL FUNCTION 'STATUS_TEXT_CONVERSION'
          EXPORTING
            LANGUAGE           = SY-LANGU
            TXT04              = SYST1
          IMPORTING
            STATUS_NUMBER      = STATUS_TMP-STAT
          EXCEPTIONS
            INSUFFICIENT_INPUT = 1
            NOT_FOUND          = 2
            OBJECT_NOT_FOUND   = 3
            WRONG_MODE         = 4
            OTHERS             = 5.
        IF SY-SUBRC EQ 0.
          STATUS_TMP-EXCL = EXCL1.
          COLLECT STATUS_TMP INTO STATUS_TAB.
        ENDIF.
      ENDIF.
      IF NOT SYSH2 IS INITIAL.
        STATUS_TMP-STAT = SYSH2.
        STATUS_TMP-EXCL = EXCL2.
        COLLECT STATUS_TMP INTO STATUS_TAB.
      ELSEIF NOT SYST2 IS INITIAL.
        CALL FUNCTION 'STATUS_TEXT_CONVERSION'
          EXPORTING
            LANGUAGE           = SY-LANGU
            TXT04              = SYST2
          IMPORTING
            STATUS_NUMBER      = STATUS_TMP-STAT
          EXCEPTIONS
            INSUFFICIENT_INPUT = 1
            NOT_FOUND          = 2
            OBJECT_NOT_FOUND   = 3
            WRONG_MODE         = 4
            OTHERS             = 5.
        IF SY-SUBRC EQ 0.
          STATUS_TMP-EXCL = EXCL2.
          COLLECT STATUS_TMP INTO STATUS_TAB.
        ENDIF.
      ENDIF.
    ENDFORM.                               " FILL_STATUS_TABLE
    *&---------------------------------------------------------------------*
    *&      Form  REDUCE_AUFNR_OBJNR_BY_STATUS
    *&---------------------------------------------------------------------*
    FORM REDUCE_AUFNR_OBJNR_BY_STATUS
         TABLES   STATUS_TAB STRUCTURE STATUS_HDR_TAB
         USING    SELID      LIKE P_SELID
         CHANGING CTS_OBJNR  TYPE TYP_TS_OBJNR.
    
    * Statusobjekte
      DATA:
        OBJNR_TAB LIKE JSTO_PRE OCCURS 0 WITH HEADER LINE.
      FIELD-SYMBOLS:
        <LS_OBJNR> TYPE TYP_S_OBJNR.
    
      CHECK NOT SELID        IS INITIAL
      OR    NOT STATUS_TAB[] IS INITIAL.
    * preread
      LOOP AT CTS_OBJNR[] ASSIGNING <LS_OBJNR>.
        OBJNR_TAB-OBJNR = <LS_OBJNR>-OBJNR.
        APPEND OBJNR_TAB.
      ENDLOOP.
      CALL FUNCTION 'STATUS_PRE_READ'
        TABLES
          JSTO_PRE_TAB = OBJNR_TAB.
    
      DATA OBJECTS_DELETED.
      PERFORM REDUCE_OBJNR_BY_STATUS
              TABLES   OBJNR_TAB
                       STATUS_TAB
              USING    SELID
              CHANGING OBJECTS_DELETED.
    
      IF OBJECTS_DELETED = YX.
    * Alle Aufträge entfernen, deren OBJNR nicht mehr in der Tabelle
    * OBJNR_TAB enthalten ist.
        IF OBJNR_TAB[] IS INITIAL.
          REFRESH CTS_OBJNR[].
        ELSE.
          SORT OBJNR_TAB BY OBJNR.
          LOOP AT CTS_OBJNR[] ASSIGNING <LS_OBJNR>.
            READ TABLE OBJNR_TAB
                 WITH KEY OBJNR = <LS_OBJNR>-OBJNR
                 BINARY SEARCH.
            IF SY-SUBRC <> 0.
              DELETE CTS_OBJNR[].
            ENDIF.
          ENDLOOP.
        ENDIF.
      ENDIF.
    ENDFORM.                               " REDUCE_AUFNR_OBJNR_BY_STATUS
    *&---------------------------------------------------------------------*
    *&      Form  REDUCE_OBJNR_BY_STATUS
    *&---------------------------------------------------------------------*
    FORM REDUCE_OBJNR_BY_STATUS
         TABLES   OBJNR_TAB  STRUCTURE OBJNR_TAB
                  STATUS_TAB STRUCTURE STATUS_HDR_TAB
         USING    SELID      LIKE P_SELID
         CHANGING OBJECTS_DELETED.
      DATA OBJNR_CNT LIKE SY-DBCNT.
    
      CLEAR OBJECTS_DELETED.
      CHECK NOT OBJNR_TAB[]  IS INITIAL.
      DESCRIBE TABLE OBJNR_TAB LINES OBJNR_CNT.
    * Statusprüfung gegen Status in Statustabelle
      LOOP AT STATUS_TAB.
        IF OBJNR_TAB[] IS INITIAL.
          EXIT.
        ELSE.
    * Alle Objektnummern, bei denen der geforderte Status (nicht) sitzt,
    * werden aus der Tabelle OBJNR_TAB gelöscht.
          CALL FUNCTION 'STATUS_CHECK_MULTI'
            EXPORTING
              STATUS      = STATUS_TAB-STAT
              FLG_EXCLUDE = STATUS_TAB-EXCL
            TABLES
              OBJECTS     = OBJNR_TAB.
        ENDIF.
      ENDLOOP.
    * Statusprüfung gegen das Selektionsschema
      IF NOT SELID IS INITIAL.
        LOOP AT OBJNR_TAB.
          DATA FLG_STATUS_OK TYPE C.       "Statusprüfung OK
          CALL FUNCTION 'STATUS_CHECK_BY_SELSCHEM'
            EXPORTING
              OBJNR          = OBJNR_TAB-OBJNR
              SELID          = SELID
            IMPORTING
              FULLFILL       = FLG_STATUS_OK
            EXCEPTIONS
              NO_STAT_SCHEME = 01
              NO_STAT_TAB    = 02.
          IF  SY-SUBRC      IS INITIAL
          AND FLG_STATUS_OK IS INITIAL.
            DELETE OBJNR_TAB.
          ENDIF.
        ENDLOOP.
      ENDIF.
    
      DESCRIBE TABLE OBJNR_TAB LINES SY-DBCNT.
      IF SY-DBCNT <> OBJNR_CNT.
        OBJECTS_DELETED = YX.
      ENDIF.
    ENDFORM.                               " REDUCE_OBJNR_BY_STATUS

    执行FORM REDUCE_AUFNR_OBJNR_BY_STATUS 后 表LTS_OBJNR[]中剩余的工单即为通过状态筛选的工单,可以通过 FOR ALL ENTRIES IN 将 LTS_OBJNR[]作为条件

  • 相关阅读:
    2020.7.11
    2020.7.13
    2020.7.9
    2020.7.10
    Java入门——day13
    Java入门——day12
    Java入门——day11
    虚拟交换机
    KVM虚拟化 ProxmoxVE
    【路径】python环境错误调试【执行路径】【操作系统,版本】
  • 原文地址:https://www.cnblogs.com/liangliang245916893/p/15213412.html
Copyright © 2011-2022 走看看