COOIS的系统状态处理逻辑较为复杂,经过自己尝试组合方式写了6组还是不全,然后套用COOIS标准的逻辑。
标准逻辑的大概思路:
如果填写了状态和排除,就会直接把状态转换为标识码和标记是否排除形成一个状态码TAB。
根据其他条件获取生产订单,拿到订单的对象编号(就是生产订单号前面加OR啥的那个字段)。
循环状态码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
网友评论