COOIS生产订单系统状态处理逻辑

COOIS的系统状态处理逻辑较为复杂,经过自己尝试组合方式写了6组还是不全,然后套用COOIS标准的逻辑。

标准逻辑的大概思路:

  1. 如果填写了状态和排除,就会直接把状态转换为标识码和标记是否排除形成一个状态码TAB。

  2. 根据其他条件获取生产订单,拿到订单的对象编号(就是生产订单号前面加OR啥的那个字段)。

  3. 循环状态码TAB,将获取到的生产订单、状态码、排除标识传进BAPI:STATUS_CHECK_MULTI,这个BAPI就会根据每次执行的状态码TAB进行订单状态处理,最终保留符合状态条件的订单。

*&---------------------------------------------------------------------*
*& Report ZTEST_LUOLIN_001
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ztest_luolin_001.

TABLES:aufk.
*主要包含以下几个代码段:
*
*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


INITIALIZATION.

START-OF-SELECTION.

*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
  BREAK-POINT.
  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


关键词: ABAP

网友评论

发表评论