ALV 处理后显示状态 (REUSE_ALV_GRID_DISPLAY 三)

 我们有一个场景:

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.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

刘欣的博客

你将成为第一个打赏博主的人!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值