首先创建程序,复制源码,然后添加屏幕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中某个字段被修改时触发该方法,一般用来修改一个字段,同步修改另外的字段。