我们有一个场景:
ALV界面一开始显示全部的数据,用户选中其中的一部分,点击自定义的按钮,处理自开发的程序逻辑,处理中显示进度条,处理完成后,显示状态和错误的消息。
接前面2篇文章:ALV 添加自定义按钮 (REUSE_ALV_GRID_DISPLAY 一)_james-lx的博客-CSDN博客
ALV 多选说明 (REUSE_ALV_GRID_DISPLAY 二)_james-lx的博客-CSDN博客
我们继续在按钮里面加我们的程序逻辑,FORM ALV_USER_COMMAND 代码逻辑为:
1、算进度条。
2、自定义功能处理选中行的数据。
3、刷新ALV(可惜只能都处理完成才刷新显示)。
FORM progress_indicator 是进度条的子函数。
*&---------------------------------------------------------------------*
*& Report ZTEST_51
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ZTEST_51.
TABLES:ztpd0008,ZTSD0033.
TYPES:BEGIN OF ty_alv,
ordid LIKE ztpd0002_ordstat-ordid,
ztp LIKE ztpd0008-ztp,
ordno LIKE ztpd0002_ordstat-ordno,
werks LIKE ztpd0002_ordstat-werks,
matnr LIKE ztpd0002_ordstat-matnr,
status TYPE c,
message TYPE zmessage,
selxxx type c,
END OF ty_alv .
DATA:gt_alv TYPE STANDARD TABLE OF ty_alv,
gs_alv TYPE ty_alv.
DATA gv_rptname TYPE /SAPAPO/AHT_ACTION_POINT.
types:BEGIN OF ty_batch,
ordno LIKE ztpd0002_ordstat-ordno,
vbeln like ztpd0002_ordstat-vbeln,
posnr like ztpd0002_ordstat-posnr,
zbatch like ZTSD0033-ZBATCH,
END OF ty_batch.
data:gt_batch type STANDARD TABLE OF ty_batch.
INCLUDE zalv_common.
SELECTION-SCREEN BEGIN OF BLOCK bk WITH FRAME TITLE TEXT-b01.
PARAMETER: p_werks TYPE ztpd0008-werks OBLIGATORY DEFAULT '1000',
p_budat TYPE datum DEFAULT sy-datum.
SELECT-OPTIONS:s_ord FOR ztpd0008-ordno OBLIGATORY.
PARAMETER:p_back RADIOBUTTON GROUP rp1 ,
p_go RADIOBUTTON GROUP rp1 DEFAULT 'X'.
SELECTION-SCREEN END OF BLOCK bk.
SELECTION-SCREEN BEGIN OF BLOCK bk1 WITH FRAME TITLE TEXT-b02.
PARAMETER:
p_2100 RADIOBUTTON GROUP rp2,
p_2999 RADIOBUTTON GROUP rp2,
p_4100 RADIOBUTTON GROUP rp2,
p_4999 RADIOBUTTON GROUP rp2,
p_6100 RADIOBUTTON GROUP rp2,
p_6999 RADIOBUTTON GROUP rp2,
p_8000 RADIOBUTTON GROUP rp2 DEFAULT 'X'.
SELECTION-SCREEN END OF BLOCK bk1.
START-OF-SELECTION.
PERFORM frm_get_data.
PERFORM frm_show_data.
*&---------------------------------------------------------------------*
*& Form frm_get_data
*&---------------------------------------------------------------------*
*& 获取数据并检查是否能冲销
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_get_data.
CLEAR gv_rptname.
CASE 'X'.
WHEN p_2100.
CONCATENATE p_werks '_TP_2100' INTO gv_rptname.
WHEN p_2999.
CONCATENATE p_werks '_TP_2999' INTO gv_rptname.
WHEN p_4100.
CONCATENATE p_werks '_TP_4100' INTO gv_rptname.
WHEN p_4999.
CONCATENATE p_werks '_TP_4999' INTO gv_rptname.
WHEN p_6100.
CONCATENATE p_werks '_TP_6100' INTO gv_rptname.
WHEN p_6999.
CONCATENATE p_werks '_TP_6999' INTO gv_rptname.
WHEN p_8000.
CONCATENATE p_werks '_TP_8000' INTO gv_rptname.
ENDCASE.
SELECT ordid , @gv_rptname as ZTP , ordno, werks, matnr
FROM ztpd0002_ordstat
WHERE werks = @p_werks
AND ordno IN @s_ord
INTO TABLE @gt_alv .
SORT gt_alv BY ordid.
DELETE ADJACENT DUPLICATES FROM gt_alv COMPARING ordid.
DATA: lv_tp_8000 TYPE c.
LOOP AT gt_alv ASSIGNING FIELD-SYMBOL(<f_alv>).
IF gv_rptname CA '8000'.
PERFORM frm_check_ord_pass_8000(zppu0029_pd_f01) USING p_werks
<f_alv>-ordno
CHANGING lv_tp_8000.
IF lv_tp_8000 IS INITIAL.
IF p_back EQ 'X'.
<f_alv>-status = 'E'.
<f_alv>-message = '此订单尚未过点8000,不能冲销'.
ENDIF.
ENDIF.
IF lv_tp_8000 IS NOT INITIAL.
IF p_go EQ 'X'.
<f_alv>-status = 'E'.
<f_alv>-message = '此订单已过点8000,不能重复过点'.
ENDIF.
ENDIF.
ENDIF.
ENDLOOP.
if gv_rptname ca '8000'.
select t2~ordno,t2~vbeln,t2~posnr,t3~zbatch
from @gt_alv as t1
INNER JOIN ztpd0002_ordstat as t2 on t1~ordno = t2~ordno
INNER JOIN ZTSD0033 as t3 on t2~VBELN = t3~vbeln and t2~posnr = t3~posnr
into TABLE @gt_batch.
endif.
ENDFORM.
*---------------------------------------------------------------------
* Form SHOW_DATA
*---------------------------------------------------------------------
FORM FRM_SHOW_DATA .
DATA: WS_FIELDCAT TYPE SLIS_T_FIELDCAT_ALV WITH HEADER LINE,
WS_FIELDGROUPS_TAB TYPE SLIS_T_SP_GROUP_ALV,
WS_LAYOUT TYPE SLIS_LAYOUT_ALV,
WS_SORTFIELDS_TAB TYPE SLIS_T_SORTINFO_ALV WITH HEADER LINE,
WS_EVENTS TYPE SLIS_T_EVENT.
DATA: NN TYPE I VALUE 0.
DATA: TITLE TYPE LVC_TITLE.
DATA: COLOR TYPE SLIS_T_SPECIALCOL_ALV WITH HEADER LINE.
*
DEFINE HOUT.
NN = NN + 1.
WS_FIELDCAT-COL_POS = NN.
WS_FIELDCAT-TABNAME = 'GT_ALV'.
WS_FIELDCAT-KEY = &1.
WS_FIELDCAT-FIELDNAME = &2.
WS_FIELDCAT-SELTEXT_M = &3.
WS_FIELDCAT-CFIELDNAME = &4.
WS_FIELDCAT-DATATYPE = &5.
WS_FIELDCAT-DO_SUM = &6.
WS_FIELDCAT-HOTSPOT = &7.
WS_FIELDCAT-INTTYPE = &8.
WS_FIELDCAT-INTLEN = &9.
APPEND WS_FIELDCAT.
CLEAR WS_FIELDCAT.
END-OF-DEFINITION.
HOUT:
'' 'ordid' '订单ID' '' '' '' '' 'C' '22',
'' 'ZTP' '点位' '' '' '' '' 'C' '18',
'' 'ordno' '订单号' '' '' '' '' 'C' '12',
'' 'werks' '工厂' '' '' '' '' 'C' '4',
'' 'matnr' '物料' '' '' '' '' 'C' '40',
'' 'status' '状态' '' '' '' '' 'C' '1',
'' 'message' '消息' '' '' '' '' 'C' '200'.
WS_LAYOUT-BOX_FIELDNAME = 'SELXXX'.
WS_LAYOUT-ZEBRA = 'X'.
WS_LAYOUT-GET_SELINFOS = 'X'.
WS_LAYOUT-COLWIDTH_OPTIMIZE = 'X'.
WS_LAYOUT-DETAIL_POPUP = 'X'.
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
I_CALLBACK_PROGRAM = SY-REPID
I_CALLBACK_PF_STATUS_SET = 'ALV_STATUS_SET'
I_CALLBACK_USER_COMMAND = 'ALV_USER_COMMAND'
IS_LAYOUT = WS_LAYOUT
IT_FIELDCAT = WS_FIELDCAT[]
IT_SPECIAL_GROUPS = WS_FIELDGROUPS_TAB[]
IT_SORT = WS_SORTFIELDS_TAB[]
IT_EVENTS = WS_EVENTS[]
I_GRID_TITLE = TITLE
I_DEFAULT = 'X'
I_SAVE = 'A'
TABLES
T_OUTTAB = GT_ALV[]
EXCEPTIONS
PROGRAM_ERROR = 1
OTHERS = 2.
ENDFORM. " OUTPUT_DATA
FORM ALV_STATUS_SET USING PT_EXTAB TYPE SLIS_T_EXTAB.
CLEAR: PT_EXTAB[].
SET PF-STATUS '100'.
ENDFORM.
FORM ALV_USER_COMMAND USING P_UCOMM LIKE SY-UCOMM P_SELFIELD TYPE SLIS_SELFIELD. "P_SELFIELD 用户鼠标选择的一个变量
CASE P_UCOMM.
WHEN '&GO'.
DATA lv_line TYPE I VALUE 0."进度
DATA lv_all TYPE I VALUE 0."进度
LOOP AT gt_alv ASSIGNING FIELD-SYMBOL(<fs231>) WHERE SELXXX = 'X'.
lv_all = lv_all + 1.
ENDLOOP.
LOOP AT gt_alv ASSIGNING FIELD-SYMBOL(<f_alv>) WHERE SELXXX = 'X' and status NE 'E'.
lv_line = lv_line + 1.
PERFORM progress_indicator USING lv_line lv_all '处理中...' .
PERFORM frm_point_pass CHANGING <f_alv>.
UPDATE ztpd0008 SET execute_status = <f_alv>-status
execute_msg = <f_alv>-message
WHERE ordno = <f_alv>-ordno AND ztp = <f_alv>-ztp.
p_selfield-refresh = 'X'. "内表改变后,马上刷新ALV控件
ENDLOOP.
WHEN 'B2'.
ENDCASE.
ENDFORM.
FORM progress_indicator USING value(p_cur)
value(p_total)
value(p_text).
DATA:lv_text(50) TYPE c,
lv_idx(3) TYPE n.
lv_idx = ( P_CUR / P_TOTAL ) * 99 .
CONCATENATE lv_idx+1(2) '%:' p_text INTO lv_text.
CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
EXPORTING
percentage = lv_idx
text = lv_text
EXCEPTIONS
OTHERS = 0.
ENDFORM.
FORM frm_point_pass CHANGING cs_alv TYPE ty_alv.
CHECK cs_alv-status <> 'S'.
DATA:ls_conf TYPE /sapapo/ppc_input,
lt_conf TYPE /sapapo/ppc_input_tab.
DATA:lt_return TYPE /sapapo/bapi_ppc_return_tab,
ls_return TYPE /sapapo/bapi_ppc_return,
lt_conford TYPE /sapapo/ppc_conford_tab,
ls_conford TYPE /sapapo/ppc_conford_str.
DATA lt_auto_conf TYPE /sapapo/ppc_confirm_tab.
DATA lv_confid TYPE /sapapo/bapi_ppc_headid.
CLEAR lt_conf[].
CLEAR ls_conf.
ls_conf-ordid = cs_alv-ordid.
ls_conf-ordnr = cs_alv-ordno.
ls_conf-matnr = cs_alv-matnr.
ls_conf-cunit = 'EA'.
ls_conf-postdate = p_budat.
ls_conf-timzone = 'UTC+8'.
IF p_back EQ 'X'.
ls_conf-cquan = -1.
ls_conf-finalind = 'S'.
ls_conf-cancelflg = 'X'.
ENDIF.
IF p_go EQ 'X'.
ls_conf-cquan = 1.
ls_conf-finalind = ''.
* ls_conf-cancelflg = ''.
ENDIF.
* CONCATENATE p_werks '_TP_8000' INTO ls_conf-rptnam.
ls_conf-rptnam = gv_rptname.
if gv_rptname CA '8000'.
READ TABLE gt_batch INTO DATA(LS_BATCH) WITH KEY ordno = cs_alv-ordno.
IF SY-SUBRC EQ 0.
LS_CONF-BATCH = LS_BATCH-ZBATCH.
ENDIF.
ENDIF.
ls_conf-excrdate = p_budat.
ls_conf-excrtime = SY-UZEIT.
ls_conf-excrname = sy-uname.
APPEND ls_conf TO lt_conf.
CALL FUNCTION '/SAPAPO/PPC_SIMSESSION_CREATE'.
CALL FUNCTION '/SAPAPO/PPC_CONF_CREATE'
EXPORTING
it_conf = lt_conf
IMPORTING
et_rc = lt_return
et_conford = lt_conford
et_auto_conf = lt_auto_conf
e_confid = lv_confid
EXCEPTIONS
confirmation_error = 1
not_found = 2
locked = 3
inconsistent_import_data = 4
fatal_error = 5
OTHERS = 6.
IF sy-subrc <> 0.
CALL FUNCTION '/SAPAPO/PPC_ROLLBACK'.
LOOP AT lt_return INTO ls_return WHERE type CA 'EA'.
cs_alv-status = 'E'.
cs_alv-message = ls_return-message.
EXIT.
ENDLOOP.
ELSE.
CALL FUNCTION '/SAPAPO/PPC_COMMIT'
EXCEPTIONS
error = 1
OTHERS = 2.
cs_alv-status = 'S'.
cs_alv-message = '过点成功'.
ENDIF .
ENDFORM.