ABAP-OOALV定时刷新运行数据修改事件(无需手动触发PAI获取数据)

代码部分:

DATA GO_TIMER        TYPE REF TO CL_GUI_TIMER.

*--------------------------------------------------------------------
*       CLASS cl_event_receiver DEFINITION
*--------------------------------------------------------------------
*--------------------------------------------------------------------
CLASS CL_EVENT_RECEIVER DEFINITION.
  PUBLIC SECTION.
    声明TOOLBAR事件方法
    METHODS HANDLE_TOOLBAR
                  
FOR EVENT TOOLBAR OF CL_GUI_ALV_GRID
        
IMPORTING E_OBJECT E_INTERACTIVE.
    声明USER-COMMAND 事件方法
    METHODS HANDLE_COMMAND
                  
FOR EVENT USER_COMMAND OF CL_GUI_ALV_GRID
        
IMPORTING E_UCOMM.
   " ENTE时触发
    METHODS HANDLE_ENTE
                  
FOR EVENT DATA_CHANGED_FINISHED OF CL_GUI_ALV_GRID
        
IMPORTING E_MODIFIED ET_GOOD_CELLS.

    METHODS HANDLE_TIMER
                  FOR EVENT FINISHED OF CL_GUI_TIMER.


  PRIVATE SECTION.
ENDCLASS.                    "CL_EVENT_RECEIVER DEFINITION
*----------------------------------------------------------------------*
*       CLASS cl_event_receiver IMPLEMENTATION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS CL_EVENT_RECEIVER IMPLEMENTATION.            
  实现ENTE 事件方法
  METHOD HANDLE_ENTE.

  DATA GS_LAYOUT_ALV TYPE LVC_S_LAYO.
  DATA LV_STABLE TYPE LVC_S_STBL.   "刷新稳定性

  PERFORM FOM_REFRESH .   "获取描述

  LV_STABLE-ROW '1'.
  LV_STABLE-COL '1'.

  GS_LAYOUT_ALV-CWIDTH_OPT 'X'.    "优化列宽

  CALL METHOD GO_ALV_GRID->SET_FRONTEND_LAYOUT
    
EXPORTING
      IS_LAYOUT GS_LAYOUT_ALV.

  CALL METHOD GO_ALV_GRID->REFRESH_TABLE_DISPLAY
    
EXPORTING
      IS_STABLE LV_STABLE.

    CALL METHOD CL_GUI_CONTROL=>SET_FOCUS
      
EXPORTING
        CONTROL GO_ALV_GRID.
    CALL METHOD CL_GUI_CFW=>FLUSH.
*
    CALL METHOD GO_TIMER->RUN "必须重新激活定时器
      EXCEPTIONS
        OTHERS = 9.


  ENDMETHOD.                    "HANDLE_MODIFY

  METHOD HANDLE_TIMER.

*--------------------------------------------------------------------
  CALL METHOD CL_GUI_CFW=>DISPATCH.
  CALL METHOD GO_ALV_GRID->CHECK_CHANGED_DATA.

*--------------------------------------------------------------------

  DATA GS_LAYOUT_ALV TYPE LVC_S_LAYO.
  DATA LV_STABLE TYPE LVC_S_STBL.   "刷新稳定性

  PERFORM FOM_REFRESH .     "获取银行科目描述

  LV_STABLE-ROW '1'.
  LV_STABLE-COL '1'.

  GS_LAYOUT_ALV-CWIDTH_OPT 'X'.    "优化列宽

  CALL METHOD GO_ALV_GRID->SET_FRONTEND_LAYOUT
    
EXPORTING
      IS_LAYOUT GS_LAYOUT_ALV.

  CALL METHOD GO_ALV_GRID->REFRESH_TABLE_DISPLAY
    
EXPORTING
      IS_STABLE LV_STABLE.

    CALL METHOD CL_GUI_CONTROL=>SET_FOCUS
      
EXPORTING
        CONTROL GO_ALV_GRID.
    CALL METHOD CL_GUI_CFW=>FLUSH.

  CALL METHOD GO_TIMER->RUN "重新激活定时器
    EXCEPTIONS
      OTHERS = 9.


  ENDMETHOD.                    "handle_timer

ENDCLASS.                    "cl_event_receiver IMPLEMENTATION

 

  DATA L_FCAT_CACHE    TYPE LVC_T_FCAT.
  DATA WA_LAYOUT_CACHE TYPE LVC_S_LAYO.
  DATA WA_FIELD        TYPE LVC_S_FCAT.
  DATA LO_EVENT        TYPE REF TO CL_EVENT_RECEIVER.

  CREATE OBJECT LO_CONTAINER
    
EXPORTING
      CONTAINER_NAME 'CONT01'.

  CREATE OBJECT GO_ALV_GRID
    
EXPORTING
      I_PARENT LO_CONTAINER.

  DEFINE FILL_FIELD.
    wa_field-fieldname &1.
    wa_field-coltext &2.

    IF wa_field-fieldname 'FSFNS'
      OR wa_field-fieldname 'AFLAG'
      .
      wa_field-checkbox 'X'.
      wa_field-edit 'X'.
    ENDIF.

    IF wa_field-fieldname 'UMSKZ'
     OR wa_field-fieldname 'WRBYS'
     OR wa_field-fieldname 'SAKYH'
     OR wa_field-fieldname 'WRBXX'
     OR wa_field-fieldname 'GZDAT'
      .
      wa_field-edit 'X'.
    ENDIF.

    IF wa_field-fieldname 'GZDAT'.
      wa_field-ref_table 'VBAK'.
      wa_field-ref_field 'ERDAT'.
    ENDIF.

    IF wa_field-fieldname 'SAKYH'.
      wa_field-ref_table 'SKA1'.
      wa_field-ref_field 'SAKNR'.
    ENDIF.

    IF wa_field-fieldname 'WRBYS'
     OR wa_field-fieldname 'WRBXX'.
      wa_field-ref_table 'BSEG'.
      wa_field-REF_FIELD 'WRBTR'.
    ENDIF.

*BSEG-WRBTR

    APPEND wa_field TO l_fcat_cache .
    CLEAR wa_field.
  END-OF-DEFINITION.
  FILL_FIELD :
        'AFLAG'    '选择',
        'BUKRS_VF' '公司代码',
        'KUNNR'    '客户',
        'NAME1'    '客户名称',
        'VBELN'    '销售订单',
        'WAERK'    '货币',
        'UMSKZ'    'SGL标志',
        'SKONT'    '预收科目',
        'WRBYS'    '预收款',
        'SAKYH'    '银行科目',
        'TXT20'    '银行科目描述',
        'FSFNS'    '是否缴税',
        'WRBXX'    '销项税',
        'SAKXX'    '销项税科目',
        'RACQT'    '其他应收科目',
        'GZDAT'    '过账日期',
        'GJAHR'    '会计年度',
        'ZKJQJ'    '期间',
        'BELNR'    '会计凭证号码'.

设置enter事件
  CALL METHOD GO_ALV_GRID->REGISTER_EDIT_EVENT
    
EXPORTING
      I_EVENT_ID CL_GUI_ALV_GRID=>MC_EVT_ENTER
    
EXCEPTIONS
      ERROR      1
      OTHERS     2.

  CREATE OBJECT LO_EVENT.
  SET HANDLER LO_EVENT->HANDLE_TOOLBAR FOR GO_ALV_GRID.
  SET HANDLER LO_EVENT->HANDLE_COMMAND FOR GO_ALV_GRID.
  SET HANDLER LO_EVENT->HANDLE_ENTE    FOR GO_ALV_GRID.
*  SET HANDLER LO_EVENT->HANDLE_DATA_CHANGED  FOR GO_ALV_GRID.

  CREATE OBJECT GO_TIMER
    EXCEPTIONS
     OTHERS = 9.

  SET HANDLER LO_EVENT->HANDLE_TIMER FOR GO_TIMER.
    GO_TIMER->INTERVAL = 3. "设置间隔为3秒

  CALL METHOD GO_TIMER->RUN
    EXCEPTIONS
      OTHERS = 9.


  WA_LAYOUT_CACHE-CWIDTH_OPT 'X'.      "优化列宽

  CALL METHOD GO_ALV_GRID->SET_TABLE_FOR_FIRST_DISPLAY
    
EXPORTING
      IS_LAYOUT       WA_LAYOUT_CACHE
    
CHANGING
      IT_FIELDCATALOG L_FCAT_CACHE
      IT_OUTTAB       
GT_DATA[].

 

PS

1定时刷新相当于对屏幕上不属于alv的部分触发PAI,这样前台写入的数据会随着定时刷新儿失效,加入上面红字标注的代码处理之后便可解决问题。

2.如果在ALV中设置了很多事件则要在对应的方法中调用

      CALL METHOD GO_TIMER->RUN "重新激活定时器
        EXCEPTIONS
          OTHERS 9.

      用以重新激活定时器。

3.橙色部分为此功能的主要代码

效果展示:

本程序中用以实现输入银行科目后随即带出其描述,无需回车等操作。

猜你喜欢

转载自blog.csdn.net/Sundam/article/details/84850306
今日推荐