SAP ABAP ALV(LVC)的一个自定义事件(F4帮助事件,回车ENTER按钮事件)的一个实例

来源:互联网 发布:mysql函数与存储过程 编辑:程序博客网 时间:2024/05/17 06:04
1. 定义和注册事件接受器类
*----------------------------------------------------------------------**       CLASS LCL_EVENT_RECEIVER DEFINITION DEFERRED*----------------------------------------------------------------------**       LCL_EVENT_RECEIVER*----------------------------------------------------------------------*CLASS lcl_event_receiver DEFINITION DEFERRED.DATA gv_flg  TYPE char01.*----------------------------------------------------------------------**       CLASS LCL_EVENT_RECEIVER DEFINITION*----------------------------------------------------------------------**       lcl_event_receiver的类定义:*----------------------------------------------------------------------*CLASS lcl_event_receiver DEFINITION.  PUBLIC SECTION.    METHODS:      handle_modify        FOR EVENT data_changed_finished OF cl_gui_alv_grid        IMPORTING e_modified                  et_good_cells.    METHODS:      handle_f4        FOR EVENT onf4 OF cl_gui_alv_grid        IMPORTING e_fieldname                  es_row_no                  er_event_data                  et_bad_cells.ENDCLASS.                    "LCL_EVENT_RECEIVER DEFINITION*----------------------------------------------------------------------**       CLASS LCL_EVENT_RECEIVER IMPLEMENTATION*----------------------------------------------------------------------***----------------------------------------------------------------------*CLASS lcl_event_receiver IMPLEMENTATION.  METHOD  handle_modify.    DATAlv_enter    TYPE REF TO cl_gui_event,          lv_eventid  TYPE i.*   获取当前事件    lv_enter   tem_grid->cur_event.*   实例化成功的时候    IF lv_enter IS NOT INITIAL.      lv_eventid lv_enter->eventid.    ENDIF.*   只有在[回车]事件的时候,再进行检查(19:代表回车事件)    IF lv_eventid 19   AND sy-ucomm   ''.      IF p_mmvds 'X'.*       设置供应商描述字段和物料描述字段        PERFORM set_name1_maktx.*       设置后,alv稳定刷新        PERFORM refresh_table_alv.*       添加行项目检查(多频次包装基础表)        PERFORM check_line_mmvds.      ELSEIF p_detail 'X'.*       添加行项目检查(窗口时间表)        PERFORM check_line_dtdetail.      ELSEIF p_vds 'X'.*       设置供应商描述字段(供应商供货信息基础表)        PERFORM set_name1_vds.*       设置后,alv稳定刷新        PERFORM refresh_table_alv.*       添加行项目检查(供应商供货信息基础表)        PERFORM check_line_vds.      ENDIF.    ENDIF.*   设置后,alv稳定刷新    PERFORM refresh_table_alv.  ENDMETHOD.                    "HANDLE_MODIFY  METHOD  handle_f4.*   供应商供货信息基础表的情况    IF p_vds 'X'.*     窗口时间参数的自定义f4检索帮助      PERFORM f4_help_zsjcs USING e_fieldname                                  es_row_no.*     设置后,alv稳定刷新      PERFORM refresh_table_alv.    ENDIF.  ENDMETHOD.                    "HANDLE_F4ENDCLASS.                    "LCL_EVENT_RECEIVER IMPLEMENTATION
 
 
2. 调用alv函数
 
**EVENT LAYOUT  DATAls_events     TYPE slis_alv_event,        lt_event      TYPE slis_t_event,        ls_layout     TYPE lvc_s_layo.  ls_events-name 'CALLER_EXIT'.  ls_events-form 'FM_BUTTON'.  APPEND ls_events TO lt_event.  ls_layout-stylefname 'FIELD_STYL'.  ls_layout-zebra      'X'.  ls_layout-box_fname  'CHK_BOX'.  ls_layout-cwidth_opt 'X'.  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'    EXPORTING      i_callback_program       sy-repid      i_callback_pf_status_set 'PF_STATUS_SET'      i_callback_user_command  'USER_COMMAND'      is_layout_lvc            ls_layout      it_fieldcat_lvc          gt_fieldcat_lvc      i_save                   'X'      it_events                lt_event    TABLES      t_outtab                 pt_outdata    EXCEPTIONS      program_error            1      OTHERS                   2.
 
 
 
 
 
 
3. 定义是事件子程序
*&---------------------------------------------------------------------**&      Form  FM_BUTTON*&---------------------------------------------------------------------**       设置enter事件*----------------------------------------------------------------------**      -->E_GRID     text*----------------------------------------------------------------------*FORM fm_button USING e_grid TYPE slis_data_caller_exit.  DATAlv_event_receiver TYPE REF TO lcl_event_receiver,        lt_f4             TYPE lvc_t_f4,        ls_f4             TYPE lvc_s_f4.  CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'    IMPORTING      e_grid tem_grid.* 设置enter事件  CALL METHOD tem_grid->register_edit_event    EXPORTING      i_event_id cl_gui_alv_grid=>mc_evt_enter    EXCEPTIONS      error      1      OTHERS     2.  CREATE OBJECT lv_event_receiver.  SET HANDLER lv_event_receiver->handle_modify FOR tem_grid.* 设置f4事件  CHECK gv_flg IS INITIAL.  gv_flg 'X'.  ls_f4-fieldname  'ZSJCS'.   "窗口时间参数(需要定义F4帮助按钮的字段)  ls_f4-register   'X'.  ls_f4-getbefore  'X'.  ls_f4-chngeafter 'X'.  INSERT ls_f4 INTO TABLE lt_f4.  CREATE OBJECT lv_event_receiver.  SET HANDLER lv_event_receiver->handle_f4 FOR tem_grid.  CALL METHOD tem_grid->register_f4_for_fields    EXPORTING      it_f4 lt_f4[].ENDFORM.                    "FM_BUTTON
 
 
4. 定义alv-status子程序
 
*&---------------------------------------------------------------------**&      Form  PF_STATUS_SET*&---------------------------------------------------------------------**       status设定*----------------------------------------------------------------------**      -->RT_EXTAB   text*----------------------------------------------------------------------*FORM pf_status_set USING rt_extab TYPE slis_t_extab.  SET PF-STATUS 'STATUS_ALV'.ENDFORM.                    "PF_STATUS_SET
 
 
5. 定义alv-comman子程序
 
*&---------------------------------------------------------------------**&      Form  USER_COMMAND*&---------------------------------------------------------------------**       USER COMMMAND*----------------------------------------------------------------------**      -->P_UCOMM      text*      -->PS_SELFIELD  text*----------------------------------------------------------------------*FORM user_command USING ucomm    LIKE sy-ucomm                        selfield TYPE slis_selfield.  DATA l_grid TYPE REF TO cl_gui_alv_grid.*------------将ALV上修改的内容保存到内表---------------------------------*  CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'    IMPORTING      e_grid l_grid.  CALL METHOD l_grid->check_changed_data.  CASE ucomm.*   [行项目追加]按钮    WHEN 'CREATE'.*     多频次包装基础表      IF p_mmvds 'X'.*       添加行项目(多频次包装基础表)        PERFORM cteate_line_mmvds.*     窗口时间基础表      ELSEIF p_detail 'X'.*       添加行项目(窗口时间基础表)        PERFORM cteate_line_dtdetail.*     供应商供货信息基础表      ELSEIF p_vds 'X'.*       添加行项目(供应商供货信息基础表)        PERFORM cteate_line_vds.      ENDIF.      selfield-refresh 'X'.      "将更新后内表的数据反馈到alv画面,自动刷新功能*   [行项目删除]按钮    WHEN 'DELETE'.*     多频次包装基础表      IF p_mmvds 'X'.*       删除行项目(多频次包装基础表)        PERFORM delete_line_mmvds.*     窗口时间基础表      ELSEIF p_detail 'X'.*       删除行项目(窗口时间基础表)        PERFORM delete_line_dtdetail.*     供应商供货信息基础表      ELSEIF p_vds 'X'.*       删除行项目(供应商供货信息基础表)        PERFORM delete_line_vds.      ENDIF.      selfield-refresh 'X'.      "将更新后内表的数据反馈到alv画面,自动刷新功能*   [保存]按钮    WHEN 'SAVE'.*     多频次包装基础表      IF p_mmvds 'X'.*       保存处理(多频次包装基础表)        PERFORM save_data_mmvds.*     窗口时间基础表      ELSEIF p_detail 'X'.*       保存处理(窗口时间基础表)        PERFORM save_data_dtdetail.*     供应商供货信息基础表      ELSEIF p_vds 'X'.*       保存处理(供应商供货信息基础表)        PERFORM save_data_vds.      ENDIF.  ENDCASE.*------------将ALV上修改的内容保存到内表---------------------------------*  CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'    IMPORTING      e_grid l_grid.  CALL METHOD l_grid->check_changed_data.ENDFORM.                    "USER_COMMAND
 
 
 
6. 其他子程序定义
*&---------------------------------------------------------------------**&      Form  REFRESH_TABLE_ALV*&---------------------------------------------------------------------**       设置后,alv稳定刷新*----------------------------------------------------------------------*FORM refresh_table_alv .  DATAstbl        TYPE lvc_s_stbl.*  stbl-row 'X'." 基于行的稳定刷新  stbl-col 'X'." 基于列稳定刷新  CALL METHOD tem_grid->refresh_table_display    EXPORTING      is_stable stbl.ENDFORM.                    " REFRESH_TABLE_ALV
*&---------------------------------------------------------------------**&      Form  F4_HELP_ZSJCS*&---------------------------------------------------------------------**       窗口时间参数的自定义f4检索帮助*----------------------------------------------------------------------*FORM f4_help_zsjcs USING p_fieldname  TYPE lvc_fname                         p_row_no     TYPE lvc_s_roid.  DATAlt_dtdetail TYPE STANDARD TABLE OF ztpp_dtdetail,        lt_return   TYPE STANDARD TABLE OF ddshretval,        ls_return   TYPE ddshretval.  CLEAR gw_vds.  READ TABLE gt_vds INTO gw_vds INDEX p_row_no-row_id.  IF p_fieldname 'ZSJCS'.    SELECT *      INTO TABLE lt_dtdetail      FROM ztpp_dtdetail     WHERE werks gw_vds-werks.    SORT lt_dtdetail BY werks zsjcs.    DELETE ADJACENT DUPLICATES FROM lt_dtdetail                          COMPARING werks zsjcs.  ENDIF.  CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'    EXPORTING      retfield         'ZSJCS'            "lt内表里面的字段      dynpprog         sy-repid      dynpnr           sy-dynnr      dynprofield      'ZSJCS'            "画面上绑定字段      value_org        'S'      callback_program sy-repid    TABLES      value_tab        lt_dtdetail        "需要显示帮助的值内表      return_tab       lt_return          "返回值    EXCEPTIONS      parameter_error  1      no_values_found  2      OTHERS           3.  IF sy-subrc 0.    READ TABLE lt_return INTO ls_return INDEX 1.    gw_vds-zsjcs ls_return-fieldval.    MODIFY gt_vds FROM gw_vds INDEX p_row_no-row_id                       TRANSPORTING zsjcs.  ENDIF.ENDFORM.                    " F4_HELP_ZSJCS
 
 
1 0
原创粉丝点击