SAP-ABAP-OOALV一般使用模板

首先创建程序,复制源码,然后添加屏幕9000,给9000屏幕添加控件取名ALV,给9000屏幕添加GUI状态和GUI标题,将9000的POB,PAI注释放开

*&---------------------------------------------------------------------*
*& Report ZOOALV_DEMO
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT zooalv_demo.
TABLES : t001." ---TODO
TYPE-POOLS:icon.

DATA: ok_code LIKE sy-ucomm.


CLASS lcl_event_receiver DEFINITION DEFERRED.
DATA: event_receiver TYPE REF TO lcl_event_receiver.

DATA: gt_fieldcat          TYPE lvc_t_fcat,
      gs_layout            TYPE lvc_s_layo,
      gs_variant           TYPE disvariant,
      gt_t_f4              TYPE lvc_t_f4,
      GT_SELCELL           TYPE LVC_T_CELL,
      it_toolbar_excluding TYPE ui_functions.

DATA: stbl TYPE lvc_s_stbl. "鼠标游标位置
DATA: et_filtered TYPE lvc_t_fidx.
DATA: gv_code TYPE sy-tcode .

DATA alv_grid TYPE REF TO cl_gui_alv_grid. "后面要用到CL_GUI_ALV_GRID类中的方法
"SET_TABLE_FIRST_DISPLAY,这个方法基于实例存在,必须
"为这个类创建一个对象。在此处声明。
DATA gs_parent TYPE REF TO cl_gui_custom_container . "定义容器
DATA gt_select TYPE lvc_t_cell . "定義選中單元格方法參數
DATA gt_selrow TYPE lvc_t_row  . "定義選中行方法參數

*DATA: gr_table TYPE REF TO cl_salv_table.
*DATA: lr_functions TYPE REF TO cl_salv_functions.


"$. Region 此处定义改为需要用到的定义-TODO
TYPES : BEGIN OF ty_item ,

          rollname   TYPE dd04t-rollname,
          ddlanguage TYPE dd04t-ddlanguage,
          as4local   TYPE dd04t-as4local,
          as4vers    TYPE dd04t-as4vers,
          ddtext     TYPE dd04t-ddtext,
          reptext    TYPE dd04t-reptext,
          scrtext_s  TYPE dd04t-scrtext_s,
          scrtext_m  TYPE dd04t-scrtext_m,
          scrtext_l  TYPE dd04t-scrtext_l.

TYPES END OF ty_item .
DATA gt_item TYPE TABLE OF ty_item .
DATA gt_sumd TYPE TABLE OF ty_item .  "存储数量合计数据
DATA gs_sumd TYPE ty_item .
FIELD-SYMBOLS <fs_data> TYPE ty_item .
"$. Endregion 此处定义改为需要用到的定义-TODO

*&---------------------------------------------------------------------*
*&       Class LCL_EVENT_RECEIVER
*&---------------------------------------------------------------------*
*        Text
*----------------------------------------------------------------------*
CLASS lcl_event_receiver DEFINITION.
  PUBLIC SECTION.

    METHODS handle_double_click FOR EVENT double_click OF cl_gui_alv_grid    "定义类中的方法---双击
      IMPORTING e_row e_column es_row_no.                                    "
    "                                                 "
    METHODS handle_onf4 FOR EVENT onf4 OF cl_gui_alv_grid                    "定义类中的方法---F4帮助
      IMPORTING e_fieldname es_row_no er_event_data .                        "
    "
    METHODS handle_toolbar      FOR EVENT toolbar OF cl_gui_alv_grid         "定义类中的方法---ALV状态栏按钮
      IMPORTING e_object e_interactive .                                     "
    "
    METHODS handle_user_command FOR EVENT user_command OF cl_gui_alv_grid    "定义类中的方法---按钮触发方法
      IMPORTING e_ucomm .                                                    "
    "
    METHODS handle_data_changed FOR EVENT data_changed OF cl_gui_alv_grid    "定义类中的方法---数据修改时的方法
      IMPORTING er_data_changed e_onf4 e_onf4_before e_onf4_after e_ucomm.   "

    METHODS  handle_data_changed_finished FOR EVENT data_changed_finished OF cl_gui_alv_grid
      IMPORTING e_modified et_good_cells.
ENDCLASS. "LCL_EVENT_RECEIVER
"$. Endregion 定义

"$. Region 选择屏幕-TODO

SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE TEXT-001.

SELECTION-SCREEN SKIP 1 .
PARAMETERS : p_mail AS CHECKBOX .
SELECTION-SCREEN END OF BLOCK b1 .

"$. Endregion 选择屏幕-TODO

INITIALIZATION.
  stbl-row = 'X'.
  stbl-col = 'X'.


AT SELECTION-SCREEN.

  "$. Region 权限-TODO

* SELECT T001~BUKRS FROM T001 WHERE T001~BUKRS IN @S_BUKRS INTO TABLE @DATA(GT_BUKRS) .
*
* LOOP AT GT_BUKRS INTO DATA(GS_BUKRS).
*  AUTHORITY-CHECK OBJECT 'F_BKPF_BUK'
*              ID 'BUKRS' FIELD GS_BUKRS-BUKRS
*               ID 'ACTVT' FIELD '03'.
*  IF SY-SUBRC <> 0.
*      MESSAGE '您没有公司代码' && GS_BUKRS-BUKRS  && '的操作权限!'   TYPE 'E' .
*
*  ENDIF.
*
* ENDLOOP.

  "$. Endregion 权限-TODO


START-OF-SELECTION.
  PERFORM frm_get_data.
  IF gt_item[] IS NOT  INITIAL .
    CALL SCREEN 9000.
  ENDIF.

  "$. Region FORM
MODULE status_9000 OUTPUT.
  SET PF-STATUS '9000'.
  SET TITLEBAR '9000'.
  DATA(gv_frist) = 'X' . "判断是不是第一次运行,自添加按钮需要刷新才能显示
  PERFORM frm_display_alv.
  IF gv_frist = 'X'.
    CALL METHOD alv_grid->refresh_table_display  "增加按钮需要刷新才会显示出来,否则无法显示。
      EXPORTING
        is_stable = stbl.
    gv_frist = '0' ."判断是否为第一次,为第一次则刷新
  ENDIF.
ENDMODULE.
*&---------------------------------------------------------------------*
*&      Module  USER_COMMAND_9000  INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE user_command_9000 INPUT.
  gv_code = ok_code .
  CASE ok_code.
    WHEN 'BACK'.
      CLEAR: gt_item.
      LEAVE TO SCREEN 0.
    WHEN 'EXIT'.
      LEAVE PROGRAM.
    WHEN 'CANCEL'.
      CLEAR: gt_item.
      LEAVE TO SCREEN 0.
  ENDCASE.
ENDMODULE.

*----------------------------------------------------------------------*
*       CLASS LCL_EVENT_RECEIVER IMPLEMENTATION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_event_receiver IMPLEMENTATION.

  METHOD handle_double_click.
    MESSAGE  '双击' TYPE 'S'. "  e_row  e_column  es_row_no
    CALL METHOD alv_grid->get_selected_cells
      IMPORTING
        et_cell = GT_SELCELL
        .

  ENDMETHOD.                    "HANDLE_DOUBLE_CLICK双击后触发该段代码,可接T-CODE跳转等功能

  METHOD handle_onf4.

    DATA: ls_modi    TYPE lvc_s_modi,
          lt_ret_tab TYPE TABLE OF ddshretval.
    IF e_fieldname = 'REPTEXT'.
      READ TABLE gt_item INDEX es_row_no-row_id ASSIGNING FIELD-SYMBOL(<fs_item>).
*      CHECK sy-subrc = 0.
      IF sy-subrc = 0.
        .
        CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
          EXPORTING
            retfield   = 'DDTEXT'
            value_org  = 'S'
          TABLES
            value_tab  = gt_item
            return_tab = lt_ret_tab.
        IF sy-subrc = 0.
          READ TABLE lt_ret_tab INDEX 1 ASSIGNING FIELD-SYMBOL(<fs_ret>).
          IF sy-subrc = 0.
            <fs_item>-REPTEXT = <fs_ret>-FIELDVAL .
            <fs_item>-SCRTEXT_S = <fs_ret>-FIELDVAL .
            <fs_item>-SCRTEXT_M = <fs_ret>-FIELDVAL .
            <fs_item>-SCRTEXT_L = <fs_ret>-FIELDVAL .
          ENDIF.
        ENDIF.
        er_event_data->m_event_handled = 'X'.
        CALL METHOD alv_grid->refresh_table_display
          EXPORTING
            is_stable = stbl.
      ENDIF .
    ENDIF .
  ENDMETHOD.                    "需在ALV中调用触发一般与filedcat中的 f4availabl 参数同用

  METHOD handle_toolbar.    "在ALV状态栏增加按钮,一般是汇总按钮,新增后的按钮可触发HANDLE_USER_COMMAND方法

    DATA: ls_toolbar        TYPE stb_button.
    CLEAR ls_toolbar.
    MOVE 3                  TO ls_toolbar-butn_type.      "分隔符
    APPEND ls_toolbar       TO e_object->mt_toolbar.

    CLEAR ls_toolbar.
    MOVE 'ADD'            TO ls_toolbar-function.        "功能码
    MOVE icon_insert_row  TO ls_toolbar-icon.            "图标
    MOVE '插入行'         TO ls_toolbar-quickinfo.
    MOVE '插入行'         TO ls_toolbar-text.            "显示名称
    MOVE ' '                TO ls_toolbar-disabled.
    APPEND ls_toolbar       TO e_object->mt_toolbar.

    CLEAR ls_toolbar.
    MOVE 'DEL'            TO ls_toolbar-function.        "功能码
    MOVE icon_delete_row  TO ls_toolbar-icon.            "图标
    MOVE '刪除行'         TO ls_toolbar-quickinfo.
    MOVE '刪除行'         TO ls_toolbar-text.            "显示名称
    MOVE ' '                TO ls_toolbar-disabled.
    APPEND ls_toolbar       TO e_object->mt_toolbar.

  ENDMETHOD.                    "在ALV状态栏增加按钮,一般是汇总按钮

  METHOD handle_user_command.
    CASE e_ucomm.
      WHEN 'ADD'.
        APPEND INITIAL LINE TO gt_item .
      WHEN 'DEL'.
        CALL METHOD alv_grid->get_selected_rows
          IMPORTING
            et_index_rows = gt_selrow.
        LOOP AT gt_selrow INTO DATA(gs_selrow).
          DELETE gt_item[]  INDEX gs_selrow-index .
        ENDLOOP .
      WHEN OTHERS.
    ENDCASE.
    CALL METHOD alv_grid->refresh_table_display
      EXPORTING
        is_stable = stbl.
  ENDMETHOD.                    "一般与HANDLE_TOOLBAR同用

  METHOD handle_data_changed.   "er_data_changed e_onf4 e_onf4_before e_onf4_after e_ucomm.
"用途在于检查这行是否能修改,数据是否合法
    LOOP AT er_data_changed->mt_good_cells  ASSIGNING FIELD-SYMBOL(<ls_good>).
    ENDLOOP .
  ENDMETHOD.                    "数据修改后触发,一般用在数据联动修改如数量字段修改,同时联动修改金额字段


  METHOD handle_data_changed_finished.
    "用途在于修改后的数据联动,
    DATA: ls_et_good_cell  TYPE lvc_s_modi.
      LOOP AT et_good_cells INTO ls_et_good_cell.
        READ TABLE gt_item ASSIGNING FIELD-SYMBOL(<fs_item>) INDEX ls_et_good_cell-row_id.
        IF sy-subrc = '0'.
          IF ls_et_good_cell-fieldname = 'SCRTEXT_L'.
            <fs_item>-SCRTEXT_M = <fs_item>-SCRTEXT_L .
            <fs_item>-SCRTEXT_S = <fs_item>-SCRTEXT_L .
          ENDIF.
        ENDIF.
      ENDLOOP.

      CALL METHOD alv_grid->refresh_table_display
        EXPORTING
          is_stable = stbl.
  ENDMETHOD.


ENDCLASS. "LCL_EVENT_RECEIVER IMPLEMENTATION

*&---------------------------------------------------------------------*
*& Form FRM_DISPLAY_ALV
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_display_alv .
  CLEAR: gt_fieldcat,gs_layout,it_toolbar_excluding.
  gs_variant-report = sy-repid.
  gs_variant-handle = '0001'.
  IF  alv_grid IS INITIAL .
******实例化 容器
    CREATE OBJECT gs_parent
      EXPORTING
        container_name = 'ALV'. " 界面中的一个CUNSTOMER CONTROL控件 用于存放类对象。
    "使用这个控件把名称赋值给CONTAINER_NAME

******将alv植入到容器中
    CREATE OBJECT alv_grid
      EXPORTING
        i_parent = gs_parent.
    PERFORM prepare_field_catalog CHANGING gt_fieldcat.
    PERFORM prepare_layout        CHANGING gs_layout.
    PERFORM toolbar_excluding_item     CHANGING it_toolbar_excluding.  "ALV按钮排除

    CALL METHOD alv_grid->set_table_for_first_display
      EXPORTING
        is_layout            = gs_layout
        i_save               = 'A'
        i_default            = 'X'
        is_variant           = gs_variant
        it_toolbar_excluding = it_toolbar_excluding
      CHANGING
        it_outtab            = gt_item
        it_fieldcatalog      = gt_fieldcat.

    CREATE OBJECT event_receiver. "创建事件
    SET HANDLER event_receiver->handle_double_click          FOR alv_grid. "双击事件
    SET HANDLER event_receiver->handle_onf4                  FOR alv_grid. "F4帮助事件
    SET HANDLER event_receiver->handle_toolbar               FOR alv_grid. "ALV状态栏
    SET HANDLER event_receiver->handle_user_command          FOR alv_grid. "按钮事件
    SET HANDLER event_receiver->handle_data_changed          FOR alv_grid. "修改事件
    SET HANDLER event_receiver->handle_data_changed_finished FOR alv_grid. "数据修改后触发事件


    gt_t_f4 = VALUE #( BASE gt_t_f4 ( fieldname = 'REPTEXT'  register = 'X' getbefore = 'X' chngeafter = 'X' ) ) .
    CALL METHOD alv_grid->register_f4_for_fields "注册F4帮助事件
      EXPORTING
        it_f4 = gt_t_f4.

    CALL METHOD alv_grid->register_edit_event "注册编辑事件,否则不会触发更新事件
      EXPORTING
        i_event_id = cl_gui_alv_grid=>mc_evt_modified.

    CALL METHOD alv_grid->set_frontend_layout
      EXPORTING
        is_layout = gs_layout.

    CALL METHOD cl_gui_control=>set_focus
      EXPORTING
        control = alv_grid.
    CALL METHOD cl_gui_cfw=>flush.
  ELSE.
    CALL METHOD alv_grid->set_frontend_layout
      EXPORTING
        is_layout = gs_layout.
    CALL METHOD alv_grid->refresh_table_display
      EXPORTING
        is_stable = stbl.
  ENDIF.
ENDFORM.

*&---------------------------------------------------------------------*
*&      Form  PREPARE_FIELD_CATALOG
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      <--P_GT_FIELDCAT  text
*----------------------------------------------------------------------*
FORM prepare_field_catalog CHANGING p_gt_fieldcat TYPE lvc_t_fcat.
  DATA ls_fcat TYPE lvc_s_fcat.
  DEFINE set_fcat.
    CLEAR ls_fcat.
    ls_fcat-fieldname = &1.   "字段
    ls_fcat-coltext   = &9.   "描述
    ls_fcat-key       = &3.   "主键
    ls_fcat-edit      = &4.   "可编辑
    ls_fcat-ref_table = &5.   "参考表
    ls_fcat-ref_field = &6.   "参考字段
    ls_fcat-icon      = &7.   "以圖標輸出
*    ls_fcat-NO_ZERO   = &8.   "前导0
    ls_fcat-outputlen = &2.   "列的字符宽度
    ls_fcat-f4availabl = &8.
    APPEND ls_fcat TO p_gt_fieldcat.
  END-OF-DEFINITION.
  set_fcat 'ROLLNAME  '   ''   ''   ''    'DD04T'     'ROLLNAME  '      ''       ''      ''.
  set_fcat 'DDLANGUAGE'   ''   ''   ''    'DD04T'     'DDLANGUAGE'      ''       ''      ''.
  set_fcat 'AS4LOCAL  '   ''   ''   ''    'DD04T'     'AS4LOCAL  '      ''       ''      ''.
  set_fcat 'AS4VERS   '   ''   ''   ''    'DD04T'     'AS4VERS   '      ''       ''      ''.
  set_fcat 'DDTEXT    '   ''   ''   ''    'DD04T'     'DDTEXT    '      ''       ''      ''.
  set_fcat 'REPTEXT   '   ''   ''   ''    'DD04T'     'REPTEXT   '      ''       'X'      ''.
  set_fcat 'SCRTEXT_S '   ''   ''   ''    'DD04T'     'SCRTEXT_S '      ''       ''      ''.
  set_fcat 'SCRTEXT_M '   ''   ''   ''    'DD04T'     'SCRTEXT_M '      ''       ''      ''.
  set_fcat 'SCRTEXT_L '   ''   ''   'X'    'DD04T'     'SCRTEXT_L '      ''       ''      ''.

ENDFORM.

*&---------------------------------------------------------------------*
*&      Form  PREPARE_LAYOUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM prepare_layout CHANGING p_gs_layout TYPE lvc_s_layo.
  p_gs_layout-zebra      = 'X'.      "斑馬紋顯示
  p_gs_layout-sel_mode   = 'A'.      "選擇模式
  p_gs_layout-cwidth_opt = 'X'.      "最佳列寬
ENDFORM.



FORM toolbar_excluding_item CHANGING pt_exclude TYPE ui_functions.
  DATA ls_exclude TYPE ui_func.
  ls_exclude = cl_gui_alv_grid=>mc_fc_loc_delete_row.
  APPEND ls_exclude TO pt_exclude.
  ls_exclude = cl_gui_alv_grid=>mc_fc_loc_insert_row.
  APPEND ls_exclude TO pt_exclude.
  ls_exclude = cl_gui_alv_grid=>mc_fc_loc_append_row.
  APPEND ls_exclude TO pt_exclude.
  ls_exclude = cl_gui_alv_grid=>mc_fc_loc_copy_row.
  APPEND ls_exclude TO pt_exclude.
  ls_exclude = cl_gui_alv_grid=>mc_fc_loc_copy.
  APPEND ls_exclude TO pt_exclude.
  ls_exclude = cl_gui_alv_grid=>mc_fc_loc_paste_new_row.
  APPEND ls_exclude TO pt_exclude.
  ls_exclude = cl_gui_alv_grid=>mc_fc_loc_move_row.
  APPEND ls_exclude TO pt_exclude.
  ls_exclude = cl_gui_alv_grid=>mc_fc_loc_paste.
  APPEND ls_exclude TO pt_exclude.
  ls_exclude = cl_gui_alv_grid=>mc_fc_loc_cut.
  APPEND ls_exclude TO pt_exclude.
  ls_exclude = cl_gui_alv_grid=>mc_fc_loc_undo.
  APPEND ls_exclude TO pt_exclude.
ENDFORM.

*&---------------------------------------------------------------------*
*& Form FRM_GET_DATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_get_data .
  SELECT * FROM dd04t INTO TABLE gt_item UP TO 30 ROWS WHERE rollname LIKE 'Z%' AND ddlanguage = '1'.

ENDFORM.

创建9000屏幕,找到CALL SCREEN 9000双击9000,创建9000屏幕

元素清单给OK_CODE

流程逻辑取消注释

点击格式,进入屏幕绘制器,在屏幕绘制器上选择1自订控件,画出2。双击2,设置2名称为ALV,调整大小的两个勾勾上

找到代码的GUI控件和GUI状态,双击创建

GUI状态的标准工具栏给上4个按钮,GUI标题自己取名称,GUI标题就是报表的名称。

将所有的东西激活,框架就搭建好了。只需要修改代码,写入自己的取值逻辑就可以展示OOALV了

这个模板预留了5个面向对象的方法,

1双击事件  :双击触发class类中的HANDLE_DOUBLE_CLICK方法,具体双击产生的效果可以在此处添加
2F4帮助事件:F4帮助一般与与filedcat中的 f4availabl 参数同用,可以自定义ALV中某个字段的搜索帮助
3ALV状态栏:在ALV状态栏增加按钮,一般是汇总按钮,新增后的按钮可触发HANDLE_USER_COMMAND方法,代码中有示例,放开注释即可在状态栏新增两个按钮
4按钮事件:第三个方法中的按钮在此处触发,具体功能可在此处添加方法
5修改事件:当ALV中某个字段被修改时触发该方法,一般用来修改一个字段,同步修改另外的字段。

  • 5
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值