ooALV相关的:
至于下拉框,主要的地方如下:
*…………………………………………………………………………………………
*
lvc_s_fcat 指定某字段为下拉框
*…………………………………………………………………………………………
DATA: wa_fieldcatalog TYPE lvc_s_fcat, "显示数据列内表工作区域
it_fieldcatalog TYPE lvc_t_fcat. "显示数据列内表
DEFINE mac_fieldlog.
* g_pos = g_pos + 1. "第几列
* wa_fieldcatalog-col_pos = g_pos. "列
wa_fieldcatalog-fieldname = &1. "字段名称
* wa_fieldcatalog-coltext = &2. "显示名称,跟reptext效果基本相同
wa_fieldcatalog-reptext = &2.
wa_fieldcatalog-outputlen = &3. "显示长度
…… 其他相关逻辑 ……
"对AAA字段实现下拉框显示
if &1 eq 'AAA'.
wa_fieldcatalog-edit = 'X'. "可编辑
wa_fieldcatalog-drdn_hndl = '1'. "下拉框句柄1
wa_fieldcatalog-outputlen = 7.
endif.
"对BBB字段实现下拉框显示
if &1 eq 'BBBB'.
wa_fieldcatalog-drdn_hndl = '2'. "下拉框句柄2
endif.
append wa_fieldcatalog to it_fieldcatalog.
clear wa_fieldcatalog.
END-OF-DEFINITION.
*…………………………………………………………………………………………
*
调用类,实现下拉框功能
*…………………………………………………………………………………………
DATA: g_alv_grid TYPE REF TO cl_gui_alv_grid, "ALV类
alv_ctner TYPE REF TO cl_gui_docking_container.
FORM zform_alv_show .
DATA: l_style TYPE i,
ls_layout TYPE lvc_s_layo,
is_stable TYPE lvc_s_stbl,
l_disvariant TYPE disvariant.
* 屏幕初始化
IF alv_ctner IS INITIAL.
CREATE OBJECT alv_ctner
EXPORTING
repid = sy-repid
dynnr = '9001'
* side = cl_gui_docking_container=>dock_at_right ”ALV贴屏幕右边,从屏幕右边开始算宽度
side = cl_gui_docking_container=>dock_at_left "ALV贴屏幕左边,从左边算屏幕宽度,
extension = 900 "屏幕宽度
* style = cl_gui_control=>ws_child "可选参数,设置ALV是否可用手动拖动大小
EXCEPTIONS
cntl_error = 1
cntl_system_error = 2
create_error = 3
lifetime_error = 4
lifetime_dynpro_dynpro_link = 5
OTHERS = 6.
IF sy-subrc <> 0.
MESSAGE s001(00) WITH '屏幕初始化失败'.
LEAVE LIST-PROCESSING.
ENDIF.
*添加自定义工具条
PERFORM frm_set_alv_toolbar.
*
CREATE OBJECT g_alv_grid
EXPORTING
i_parent = alv_ctner.
*构建显示字段样式
PERFORM frm_build_fieldcat.
"Set/Reset Ready for Input Status
CALL METHOD g_alv_grid->set_ready_for_input
EXPORTING
i_ready_for_input = 1.
* layout 设定样式
CLEAR ls_layout.
ls_layout-cwidth_opt = 'X'. "优化列宽
CLEAR l_disvariant.
l_disvariant-report = sy-repid. "当前程序
* event 绑定事件
CREATE OBJECT g_event.
SET HANDLER g_event->toolbar FOR g_alv_grid.
SET HANDLER g_event->handle_data_changed FOR g_alv_grid.
*这里是下拉框相关逻辑…………………………………………
DATA: lt_dropdown TYPE lvc_t_drop,
ls_dropdown TYPE lvc_s_drop.
"第一个下拉框:AAA字段
ls_dropdown-handle = '1'. "指定下拉框句柄
ls_dropdown-value = '1 春天'.
APPEND ls_dropdown TO lt_dropdown.
ls_dropdown-handle = '1'.
ls_dropdown-value = '2 夏天'.
APPEND ls_dropdown TO lt_dropdown.
ls_dropdown-handle = '1'.
ls_dropdown-value = '3 冬天'.
APPEND ls_dropdown TO lt_dropdown.
"第二个下拉框:BBB字段
ls_dropdown-handle = '2'. "指定下拉框句柄
ls_dropdown-value = '0 启用'.
APPEND ls_dropdown TO lt_dropdown.
ls_dropdown-handle = '2'.
ls_dropdown-value = '1 禁止'.
APPEND ls_dropdown TO lt_dropdown.
CALL METHOD g_alv_grid->set_drop_down_table "调用alv类的下拉框方法
EXPORTING
it_drop_down = lt_dropdown.
*end………………………………………………………………
* "显示内表数据
CALL METHOD g_alv_grid->set_table_for_first_display
EXPORTING
is_layout = ls_layout
is_variant = l_disvariant
it_toolbar_excluding = gt_tools
CHANGING
it_fieldcatalog = it_fieldcatalog[]
it_outtab = g_it_show[].
如上即可
有时候有你会发现点保存的时候报错:
比如你有个状态字段,在库表里是char1类型的,
你下拉框里显示:0:启用 1:禁用
当你定义alv字段的时候,直接参考库表的char1类型
点保存的时候会提示:
“条目0 启用 过长 大于1”
这个时候,在定义alv子段的时候,不参考char1类型
而是定义成string
就可以了