ALV用OO方式实现,似乎没有function好用,但是可以再一个屏幕上显示两个ALV。代码例子如下:
全局数据:
DATA : obj_wcl_container TYPE REF TO cl_gui_custom_container, "控制容器类
lt_f4 TYPE lvc_t_f4,
ls_f4 TYPE lvc_s_f4,
obj_wcl_alv TYPE REF TO cl_gui_alv_grid . "ALV控制类
alv显示:
FORM frm_alv_display USING gt_list LIKE gt_list.
DATA : ls_variant TYPE disvariant .
*--- 存放字段目录的内表
DATA lt_fieldcat TYPE lvc_t_fcat .
*--- 布局结构
DATA ls_layout TYPE lvc_s_layo .
DATA: lt_exclude TYPE ui_functions. "alv不需要的图标按钮
ls_variant-report = sy-repid.
IF obj_wcl_alv IS INITIAL .
CREATE OBJECT: obj_wcl_container
EXPORTING
container_name = 'OBJ_WCL_CONTAINER'.
“屏幕上要有一个定制的容器,名字必须大写为OBJ_WCL_CONTAINER
CREATE OBJECT obj_wcl_alv
EXPORTING
i_parent = obj_wcl_container.
*-----分配双击事件
CREATE OBJECT event_receiver.
SET HANDLER event_receiver->handle_double_click
FOR obj_wcl_alv.
ENDIF .
*-----消除按钮
PERFORM exclude_tb_functions CHANGING lt_exclude.
*-----设置字段
PERFORM prepare_field_catalog CHANGING lt_fieldcat .
*-----设置布局
PERFORM prepare_layout CHANGING ls_layout .
CALL METHOD obj_wcl_alv->register_f4_for_fields
EXPORTING
it_f4 = lt_f4.
*-----显示ALV
CALL METHOD obj_wcl_alv->set_table_for_first_display
EXPORTING
is_variant = ls_variant
is_layout = ls_layout
i_save = 'A'
it_toolbar_excluding = lt_exclude
CHANGING
it_outtab = gt_list[]
it_fieldcatalog = lt_fieldcat
EXCEPTIONS
invalid_parameter_combination = 1
program_error = 2
too_many_lines = 3
OTHERS = 4.
ENDFORM. " FRM_ALV_DISPLAY
消除按钮:
FORM exclude_tb_functions CHANGING pt_exclude TYPE ui_functions.
DATA ls_exclude TYPE ui_func.
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_delete_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_insert_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_copy.
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_paste.
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_undo.
APPEND ls_exclude TO pt_exclude.
ls_exclude = cl_gui_alv_grid=>mc_fc_check.
APPEND ls_exclude TO pt_exclude.
ls_exclude = cl_gui_alv_grid=>mc_fc_refresh.
APPEND ls_exclude TO pt_exclude.
ENDFORM. " EXCLUDE_TB_FUNCTIONS
设置字段:
FORM prepare_field_catalog CHANGING ct_fieldcat TYPE lvc_t_fcat.
DATA ls_fcat TYPE lvc_s_fcat .
REFRESH ct_fieldcat .
CLEAR ls_fcat .
ls_fcat-fieldname = 'SELECTED' .
ls_fcat-coltext = '选择'.
ls_fcat-outputlen = 2.
ls_fcat-checkbox = 'X' .
ls_fcat-edit = 'X' .
ls_fcat-key = 'X' .
APPEND ls_fcat TO ct_fieldcat .
init ls_fcat 'INFO_TYPE_CODE' ct_fieldcat '金税发票类型代码' 12 'X'.
init ls_fcat 'INFO_NUMBER' ct_fieldcat '金税发票号码' 12 'X'.
init ls_fcat 'SERIAL_NUMBER' ct_fieldcat '流水号' 12 'X'.
init ls_fcat 'UPDATE_DATE' ct_fieldcat '发票日期' 8 ''.
init ls_fcat 'CLIENT_NAME' ct_fieldcat '购方名称' 30 ''.
init ls_fcat 'SELLER_NAME' ct_fieldcat '销方名称' 30 ''.
ENDFORM. " PREPARE_FIELD_CATALOG
设置布局:
FORM prepare_layout CHANGING cs_layout TYPE lvc_s_layo.
cs_layout-zebra = 'X' .
cs_layout-grid_title = '打印正负销货清单' .
cs_layout-smalltitle = 'X' .
cs_layout-edit_mode = 'X' .
cs_layout-edit = '' .
cs_layout-cwidth_opt = 'X' .
ENDFORM. " PREPARE_LAYOUT
在PAI事件中如果有全选可取消全选:
form FRM_SELECT_ALL .
data: ls_list like line of gt_list .
loop at gt_list into ls_list.
MOVE 'X' TO ls_list-selected.
MODIFY gt_list FROM ls_list INDEX sy-tabix TRANSPORTING selected.
endloop.
* call method obj_wcl_alv->refresh_table_display.
endform. " FRM_SELECT_ALL
如果有双击事件需要注册双击事件,和自己写实现代码。
CLASS lcl_event_receiver DEFINITION.
PUBLIC SECTION.
METHODS:
handle_double_click
FOR EVENT double_click OF cl_gui_alv_grid
IMPORTING e_row.
ENDCLASS. "lcl_event_receiver DEFINITION
*&---------------------------------------------------------------------*
*& 双击事件的实现
*&---------------------------------------------------------------------*
CLASS lcl_event_receiver IMPLEMENTATION.
METHOD handle_double_click.
DATA wa_bkpf LIKE LINE OF gt_list.
READ TABLE gt_list INTO wa_bkpf INDEX e_row-index. "读取当前行
"进入发票
SET PARAMETER ID 'VF' FIELD wa_bkpf-vbeln.
CALL TRANSACTION 'VF03' AND SKIP FIRST SCREEN.
ENDMETHOD. "catch_doubleclick
ENDCLASS. "lcl_event_receiver IMPLEMENTATION
常见错误:
1.alv在屏幕上不显示!
一定要在屏幕里画上一个custom且名字是容器的名字,要大写!OBJ_WCL_CONTAINER
2.复选框不起作用
复选框选择了全选之后没有全选,因为在pai之后接着会pbo,我把取数写进了pbo中这样复选框字段就被覆盖更新了。还有一种情况就是字段名写错了,但是系统并没有报错。注意还要用下面的方法更新:
form FRM_RENEW_DATA_1001 .
DATA: l_valid TYPE c .
***更新内表中的选择标记位
CALL METHOD obj_wcl_alv->check_changed_data
IMPORTING
e_valid = l_valid.
endform.
DEFINE init .
*&1 structure
*&2 fieldname
*&3 tabname
*&4 seletext_m
*&5 outputlen
clear &1 .
&1-fieldname = &2 .
* &1-tabname = &3.
&1-coltext = &4.
&1-outputlen = &5.
&1-no_zero = 'X' .
&1-key = &6 .
append &1 to &3 .
END-OF-DEFINITION .
退出命令,注意要设置为E。
module exit at exit-command.
IF g_ok_code = 'BACK' .
SET SCREEN 0.
LEAVE SCREEN.
endif .