OO ALV 实现下拉框

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

就可以了
posted @ 2014-01-22 09:25  胡来  阅读(761)  评论(0编辑  收藏  举报