批量TECO/撤销TECO
REPORT xxxx.
*-----------------------------------------------------------------------
* TABLES
*-----------------------------------------------------------------------
TABLES: aufk.
*-----------------------------------------------------------------------
* TYPES
*-----------------------------------------------------------------------
TYPES: BEGIN OF ty_alv,
werks TYPE aufk-werks, "工厂
aufnr TYPE aufk-aufnr, "生产订单
istat TYPE tj02-istat, "生产订单状态代码
txt04 TYPE tj02t-txt04, "生产订单状态
txt30 TYPE tj02t-txt30, "生产订单状态描述
objnr TYPE aufk-objnr, "对象号
zicon(4) TYPE c, "指示灯
ztype TYPE c, "消息类型
zmsg TYPE string, "返回消息
zsel TYPE c,
END OF ty_alv.
*-----------------------------------------------------------------------
* DATA
*-----------------------------------------------------------------------
DATA: gs_alv TYPE ty_alv,
gt_alv TYPE TABLE OF ty_alv.
*-----------------------------------------------------------------------
* P A R A M E T E R S & S E L E C T - O P T I O N S
*-----------------------------------------------------------------------
SELECTION-SCREEN BEGIN OF BLOCK bk1.
SELECT-OPTIONS: s_werks FOR aufk-werks, "工厂
s_aufnr FOR aufk-aufnr. "生产订单
SELECTION-SCREEN END OF BLOCK bk1.
*----------------------------------------------------------------------*
* ALV层级关系定义
*----------------------------------------------------------------------*
DATA:gs_fieldcat TYPE lvc_s_fcat,
gt_fieldcat TYPE lvc_t_fcat.
DATA:gs_layout TYPE lvc_s_layo.
*&---------------------------------------------------------------------*
*& Define marco
*&---------------------------------------------------------------------*
DEFINE marco_fieldacat.
&1 = &1 + 1.
gs_fieldcat-col_pos = &1.
gs_fieldcat-fieldname = &2.
gs_fieldcat-coltext = &3.
gs_fieldcat-icon = &4.
gs_fieldcat-no_zero = &5.
gs_fieldcat-checkbox = &6.
gs_fieldcat-ref_table = &7.
gs_fieldcat-ref_field = &8.
gs_fieldcat-edit = &9.
APPEND gs_fieldcat TO gt_fieldcat.
END-OF-DEFINITION.
*&---------------------------------------------------------------------*
*& INITIALIZATION
*&---------------------------------------------------------------------*
INITIALIZATION.
*&---------------------------------------------------------------------*
*& START-OF-SELECTION
*&---------------------------------------------------------------------*
START-OF-SELECTION.
PERFORM frm_set_fieldacat.
PERFORM frm_layout.
PERFORM frm_get_data.
PERFORM frm_display_alv.
END-OF-SELECTION.
*&---------------------------------------------------------------------*
*& Form FRM_SET_FIELDACAT
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_set_fieldacat .
DATA l_colpos TYPE lvc_s_fcat-col_pos VALUE 0.
CHECK gt_fieldcat IS INITIAL.
marco_fieldacat:
l_colpos 'ZICON' '指示灯' '' '' '' '' '' '',
l_colpos 'ZTYPE' '消息类型' '' '' '' '' '' '',
l_colpos 'ZMSG' '返回消息' '' '' '' '' '' '',
l_colpos 'WERKS' '工厂' '' '' '' '' '' '',
l_colpos 'AUFNR' '生产订单' '' '' '' '' '' '',
l_colpos 'TXT04' '生产订单状态' '' '' '' '' '' '',
l_colpos 'TXT30' '生产订单状态描述' '' '' '' '' '' ''.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_LAYOUT
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_layout .
gs_layout-box_fname = 'ZSEL'.
gs_layout-zebra = 'X'.
gs_layout-cwidth_opt = 'X'."设置Grid的字段列宽度自动适应
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_GET_DATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_get_data .
SELECT
aufk~werks,
aufk~aufnr,
aufk~objnr,
tj02~istat,
tj02t~txt04,
tj02t~txt30
INTO CORRESPONDING FIELDS OF TABLE @gt_alv
FROM
aufk
INNER JOIN jest ON aufk~objnr EQ jest~objnr AND
jest~stat IN ( 'I0002' , 'I0045' ) AND
jest~inact NE 'X'
INNER JOIN tj02 ON jest~stat EQ tj02~istat
INNER JOIN tj02t ON tj02~istat EQ tj02t~istat AND
tj02t~spras EQ @sy-langu
WHERE
aufk~werks IN @s_werks AND
aufk~aufnr IN @s_aufnr.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_DISPLAY_ALV
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_display_alv .
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
EXPORTING
i_callback_program = sy-repid
i_callback_pf_status_set = 'FRM_SET_PF_STATUS'
i_callback_user_command = 'FRM_USER_COMMAND'
is_layout_lvc = gs_layout
it_fieldcat_lvc = gt_fieldcat
i_save = 'A'
TABLES
t_outtab = gt_alv
EXCEPTIONS
program_error = 1
OTHERS = 2.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_CALL_BAPI
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_call_bapi USING lv_flag.
DATA lv_check TYPE c.
DATA: ls_order TYPE bapi_order_key,
lt_order TYPE TABLE OF bapi_order_key,
ls_return TYPE bapiret2,
ls_status TYPE jstat,
lt_status TYPE TABLE OF jstat.
"TECO
IF lv_flag EQ 'TECO'.
LOOP AT gt_alv INTO gs_alv WHERE zsel EQ 'X' .
ls_order-order_number = gs_alv-aufnr.
APPEND ls_order TO lt_order.
CLEAR: ls_order , gs_alv.
ENDLOOP.
CALL FUNCTION 'BAPI_PRODORD_COMPLETE_TECH'
EXPORTING
scope_compl_tech = '1'
work_process_group = 'COWORK_BAPI'
work_process_max = 99
IMPORTING
return = ls_return
TABLES
orders = lt_order.
IF ls_return-type CA 'AE'.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
LOOP AT gt_alv INTO gs_alv WHERE zsel EQ 'X'.
gs_alv-zicon = icon_led_red.
gs_alv-ztype = 'E'.
gs_alv-zmsg = 'TECO失败!'.
MODIFY gt_alv FROM gs_alv TRANSPORTING zicon ztype zmsg.
CLEAR gs_alv.
ENDLOOP.
ELSE.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'.
LOOP AT gt_alv INTO gs_alv WHERE zsel EQ 'X'.
gs_alv-zicon = icon_led_green.
gs_alv-ztype = 'S'.
gs_alv-zmsg = 'TECO成功!'.
MODIFY gt_alv FROM gs_alv TRANSPORTING zicon ztype zmsg.
CLEAR gs_alv.
ENDLOOP.
ENDIF.
ENDIF.
"撤销TECO
IF lv_flag EQ 'INTERN'.
ls_status-stat = 'I0002'.
ls_status-inact = ''.
APPEND ls_status TO lt_status.
ls_status-stat = 'I0045'.
ls_status-inact = 'X'.
APPEND ls_status TO lt_status.
LOOP AT gt_alv INTO gs_alv WHERE zsel EQ 'X' .
CALL FUNCTION 'STATUS_CHANGE_INTERN'
EXPORTING
client = sy-mandt
objnr = gs_alv-objnr
TABLES
status = lt_status
EXCEPTIONS
object_not_found = 1
status_inconsistent = 2
status_not_allowed = 3
OTHERS = 4.
IF ls_return-type CA 'AE'.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
gs_alv-zicon = icon_led_red.
gs_alv-ztype = 'E'.
gs_alv-zmsg = '撤销TECO失败!'.
ELSE.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'.
gs_alv-zicon = icon_led_green.
gs_alv-ztype = 'S'.
gs_alv-zmsg = '撤销TECO成功!'.
ENDIF.
MODIFY gt_alv FROM gs_alv TRANSPORTING zicon ztype zmsg.
CLEAR gs_alv.
ENDLOOP.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_SET_PF_STATUS
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_set_pf_status USING t_extab TYPE slis_t_extab.
SET PF-STATUS 'STATUS'.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_USER_COMMAND
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_user_command USING i_ucomm TYPE sy-ucomm
i_selfield TYPE slis_selfield.
DATA lv_flag(10) TYPE c.
CASE i_ucomm.
WHEN '&INTERN'. "撤销TECO
lv_flag = 'INTERN'.
WHEN '&TECO'.
lv_flag = 'TECO'. "TECO
WHEN '&IC1'.
PERFORM frm_update.
ENDCASE.
PERFORM frm_call_bapi USING lv_flag.
i_selfield-refresh = 'X'.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_UPDATE
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_update .
SELECT
aufk~werks,
aufk~aufnr,
aufk~objnr,
tj02~istat,
tj02t~txt04,
tj02t~txt30
INTO TABLE @DATA(lt_aufk)
FROM
aufk
INNER JOIN jest ON aufk~objnr EQ jest~objnr AND
jest~stat IN ( 'I0002' , 'I0045' ) AND
jest~inact NE 'X'
INNER JOIN tj02 ON jest~stat EQ tj02~istat
INNER JOIN tj02t ON tj02~istat EQ tj02t~istat AND
tj02t~spras EQ @sy-langu
WHERE
aufk~werks IN @s_werks AND
aufk~aufnr IN @s_aufnr.
LOOP AT gt_alv INTO gs_alv.
READ TABLE lt_aufk INTO DATA(ls_aufk) WITH KEY werks = gs_alv-werks
aufnr = gs_alv-aufnr.
IF sy-subrc EQ 0.
gs_alv-txt04 = ls_aufk-txt04.
gs_alv-txt30 = ls_aufk-txt30.
ENDIF.
MODIFY gt_alv FROM gs_alv TRANSPORTING txt04 txt30.
CLEAR: gs_alv , ls_aufk.
ENDLOOP.
ENDFORM.