SAP 使用cl_gui_timer自动刷新屏幕的用法详解 <转载>

原文链接:https://blog.csdn.net/SAPmatinal/article/details/130483382
SAP 使用cl_gui_timer自动刷新屏幕的用法详解

这个类在初始化的时候会设置一个定时间隔,每隔这个时间就会触发一次FINISHED事件。利用这个类的特性,可以实现很多东西,让程序自动化起来

比如定时刷新ALV,但是这个事件不能触发PBO ,此时需要去强制触发PAI,让程序走一次PBO,如果不涉及屏幕字段啥的,只是刷新ALV就不必要了,直接调用REFRESH就行了
在这里插入图片描述
正常结果屏幕刷新

*&---------------------------------------------------------------------*
*& Report Y_XB_TEST1
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT Y_XB_TEST1 NO STANDARD PAGE HEADING.
 
CLASS lcl_event_handler DEFINITION DEFERRED.
 
DATA: go_timer    TYPE REF TO cl_gui_timer,
 
      go_evt_hndl TYPE REF TO lcl_event_handler,
 
      gv_datum    TYPE sy-datum,
      gv_uzeit    TYPE sy-uzeit.
 
*&---------------------------------------------------------------------*
 
*&      START-OF-SELECTION
 
*&---------------------------------------------------------------------*
 
START-OF-SELECTION.
  gv_datum = sy-datum.
  gv_uzeit = sy-uzeit.
 
  PERFORM list_output.
 
  PERFORM init_timer.
 
*&---------------------------------------------------------------------*
 
*&      USER-COMMAND
 
*&---------------------------------------------------------------------*
 
AT USER-COMMAND.
 
  IF sy-ucomm = 'RFSH'.
    sy-lsind = sy-lsind - 1.
 
    PERFORM list_output.
  ENDIF.
 
*&---------------------------------------------------------------------*
 
*&      CLASS lcl_event_handler DEFINITION
 
*&---------------------------------------------------------------------*
 
CLASS lcl_event_handler DEFINITION.
 
  PUBLIC SECTION.
 
    METHODS:
 
      handle_timer FOR EVENT finished OF cl_gui_timer.
 
ENDCLASS.                    "lcl_event_handler DEFINITION
*&---------------------------------------------------------------------*
*&      CLASS lcl_event_handler IMPLEMENTATION
*&---------------------------------------------------------------------*
CLASS lcl_event_handler IMPLEMENTATION.
  METHOD handle_timer.
    CALL METHOD cl_gui_cfw=>set_new_ok_code
      EXPORTING
        new_code = 'RFSH'.
    CALL METHOD go_timer->run "必须重新激活定时器
      EXCEPTIONS
        OTHERS = 9.
 
  ENDMETHOD.                 "handle_timer
ENDCLASS.                    "lcl_event_handler IMPLEMENTATION
 
*&---------------------------------------------------------------------*
 
*&      Form  INIT_TIMER
 
*&---------------------------------------------------------------------*
 
FORM init_timer.
 
  CHECK go_timer IS INITIAL.
 
  CREATE OBJECT go_timer
    EXCEPTIONS
      OTHERS = 9.
 
  CREATE OBJECT go_evt_hndl.
 
  SET HANDLER go_evt_hndl->handle_timer FOR go_timer.
 
 
  go_timer->interval = 5.  "设置间隔为10CALL METHOD go_timer->run "激活定时器
    EXCEPTIONS
      OTHERS = 9.
 
ENDFORM.                    " INIT_TIMER
*&---------------------------------------------------------------------*
*& Form LIST_OUTPUT
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM list_output .
  DATA: datediff TYPE p,
        timediff TYPE p DECIMALS 2.
  datediff = sy-datum - gv_datum.
  timediff = ( sy-uzeit - gv_uzeit ) / 60.
  WRITE: /5 '本次开始时间:' ,AT 30 gv_datum , AT 45 gv_uzeit.
  WRITE: /5 '本次运行时长:' ,AT 30 datediff LEFT-JUSTIFIED,
                              AT 38 '天' ,
                              at 45 timediff LEFT-JUSTIFIED ,
                              AT 51 '分'.
ENDFORM.

layout CALL SCREEN 屏幕刷新

DATA GO_TIMER TYPE REF TO CL_GUI_TIMER .
DATA: GV_INDEX TYPE N LENGTH 2 ,
      GV_TMP TYPE N LENGTH 2 ,
      GV_OKCODE TYPE SY-UCOMM .
 
DATA: HH TYPE C LENGTH 2 , "记录时分秒
      FF TYPE C LENGTH 2 ,
      MM TYPE C LENGTH 2 .
CLASS LCL_EVENT_HANDLER DEFINITION.
  PUBLIC SECTION.
    METHODS:
      HANDLE_TIMER FOR EVENT FINISHED OF CL_GUI_TIMER.
ENDCLASS.                    "lcl_event_handler DEFINITION
*&---------------------------------------------------------------------*
*&      CLASS lcl_event_handler IMPLEMENTATION
*&---------------------------------------------------------------------*
CLASS LCL_EVENT_HANDLER IMPLEMENTATION.
  METHOD HANDLE_TIMER.
    PERFORM FRM_PROCESS_TIMER.
 
  ENDMETHOD.                 "handle_timer
ENDCLASS.                    "lcl_event_handler IMPLEMENTATION
DATA GO_EVT_HNDL TYPE REF TO LCL_EVENT_HANDLER .
 
INITIALIZATION .
 
 
 
START-OF-SELECTION  .
 
  CALL SCREEN 0100 .
*&---------------------------------------------------------------------*
*& Form FRM_PROCESS_TIMER
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM FRM_PROCESS_TIMER .
 
  CALL METHOD CL_GUI_CFW=>SET_NEW_OK_CODE "强制触发PAI
    EXPORTING
      NEW_CODE = 'RFSH'.
  CALL METHOD GO_TIMER->RUN "
    EXCEPTIONS
      OTHERS = 9.
 
ENDFORM.
*&---------------------------------------------------------------------*
*& Form INIT_TIMER
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM INIT_TIMER .
 IF GO_TIMER IS INITIAL.
    CREATE OBJECT GO_TIMER
      EXCEPTIONS
        OTHERS = 9.
    CREATE OBJECT GO_EVT_HNDL.
    SET HANDLER GO_EVT_HNDL->HANDLE_TIMER FOR GO_TIMER.
 
    GO_TIMER->INTERVAL = 1.  "设置间隔为1CALL METHOD GO_TIMER->RUN "激活定时器
      EXCEPTIONS
        OTHERS = 9.
  ELSE .
    CALL METHOD GO_TIMER->RUN "重新激活定时器
     EXCEPTIONS
       OTHERS = 9.
 ENDIF .
ENDFORM.
*&---------------------------------------------------------------------*
*& Module STATUS_0100 OUTPUT
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
MODULE STATUS_0100 OUTPUT.
  SET PF-STATUS 'STATUS_0100'.
* SET TITLEBAR 'xxx'.
  PERFORM INIT_TIMER .
ENDMODULE.
*&---------------------------------------------------------------------*
*&      Module  USER_COMMAND_0100  INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE USER_COMMAND_0100 INPUT.
 CASE GV_OKCODE.
 	WHEN 'BACK'.
 	  LEAVE TO SCREEN 0 .
  WHEN  'RFSH'.
    GV_INDEX = GV_INDEX + 1 .
    CLEAR GV_TMP.
    GV_TMP = GV_INDEX DIV 3600 . "获取小时
    HH = GV_TMP .
    CLEAR  GV_TMP .
    GV_TMP = GV_INDEX DIV 60 . "获取分钟
    FF = GV_TMP .
    CLEAR GV_TMP .
    GV_TMP  = GV_INDEX MOD 60 . "获取秒
     MM = GV_TMP .
 	WHEN OTHERS.
 ENDCASE.
ENDMODULE.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值