当前位置: 代码迷 >> 综合 >> OOnbsp;ALVnbsp;实现下拉框
  详细解决方案

OOnbsp;ALVnbsp;实现下拉框

热度:87   发布时间:2024-01-18 14:39:31.0
ooALV相关的:
http://blog.sina.com.cn/s/blog_c0978c9b0101hesn.html

至于下拉框,主要的地方如下:

*…………………………………………………………………………………………
* 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

就可以了