ALV下拉列表

前言:不仅仅可以选择屏幕可以下拉列表,ALV也可以进行下拉列表,

本文主要讲述FUNCTION ALV下拉列表,对于OOALV来说“换汤不换药”,理解了就不会有什么具体的难点。

具体实现方法:(本文章自定义一个下拉列表字段LISBOX)

1.ALV展示结构类型定义:

增加 handle TYPE i, "下拉列表分组

2.相关定义:

DATA:gt_events TYPE slis_t_event."ALV事件

DATA: gt_ddval TYPE lvc_t_drop.    "ALV下拉列表赋值用

3.fieldcat

edit       = 'X'."可编辑

drdn_hndl  = '1'."分组标识  下拉列表

drdn_field = 'HANDLE'." 内部表字段的字段名称

4.在ALV显示之前对下拉列表进行赋值

   gt_ddval = VALUE #( ( handle = '1'
                                       value = '红' )
                                    ( handle = '1'
                                      value = '绿' )
                                    ( handle = '1'
                                      value = '黄' )
                                  ).

5.本文章是根据ALV下拉列表通过ALV回车、光标焦点变化事件进行ALV状态灯的更新变化。

代码如下:

*&---------------------------------------------------------------------*
*& 程 序 名:YTEST_DEMO2
*& 程序描述:ALV单元格按钮
*& 创 建 者:你们的小涵
*& 创建日期:2023/03/13
*&---------------------------------------------------------------------*
*& 版本     修改者(公司)     日期         修改描述
*& 1.0.0    XXXX           YYYYMMDD      创建程序
*&---------------------------------------------------------------------*

REPORT ytest_demo2.

TYPE-POOLS: slis."类型池
TYPES:
  "选择屏幕用
  BEGIN OF typ_s_screen,
    ebeln TYPE ekko-ebeln, "采购凭证编号
    bukrs TYPE ekko-bukrs, "公司代码
    werks TYPE ekpo-werks, "工厂
    ernam TYPE ekko-ernam, "对象创建人姓名
  END OF typ_s_screen,
  "ALV显示用
  BEGIN OF ty_out,
    sel    TYPE sel,
    ebeln  TYPE ekko-ebeln, "采购凭证编号
    bukrs  TYPE ekko-bukrs, "公司代码
    ekorg  TYPE ekko-ekorg, "采购组织
    ekgrp  TYPE ekko-ekgrp, "采购组
    ebelp  TYPE ekpo-ebelp, "凭证项目编号
    matnr  TYPE ekpo-matnr, "物料编号
    werks  TYPE ekpo-werks, "工厂
    lgort  TYPE ekpo-lgort, "库存地点
    matkl  TYPE ekpo-matkl, "物料组
    menge  TYPE ekpo-menge, "采购订单数量
    meins  TYPE ekpo-meins, "采购订单计量单位
    lisbox TYPE char10,     "自定义下拉列表
    handle TYPE i,         "下拉列表分组
    icon   TYPE icon-name,  "显示灯
  END OF ty_out,
  "表类型
  tt_out TYPE STANDARD TABLE OF ty_out.

DATA:
  gt_alv    TYPE tt_out,
  gv_screen TYPE typ_s_screen.

DATA:
  gs_layout   TYPE lvc_s_layo,
  gt_fieldcat TYPE lvc_t_fcat.

"ALV事件
DATA:
  gt_events TYPE slis_t_event.

"ALV下拉列表赋值用
DATA:
  gt_ddval TYPE lvc_t_drop.

SELECTION-SCREEN BEGIN OF BLOCK b01 WITH FRAME TITLE TEXT-001.
  SELECT-OPTIONS:
    s_ebeln FOR gv_screen-ebeln,
    s_bukrs FOR gv_screen-bukrs.
  PARAMETERS: p_werks TYPE werks_d OBLIGATORY DEFAULT '1000'.
SELECTION-SCREEN END OF BLOCK b01.

INITIALIZATION.
  CLEAR:
  gt_alv,
  gt_fieldcat,
  gt_events,
  gt_ddval.

*&---------------------------------------------------------------------*
*               START-OF-SELECTION 执行主逻辑
*&---------------------------------------------------------------------*
START-OF-SELECTION.

  "数据取得
  SELECT
    ekko~ebeln,
    ekko~bukrs,
    ekko~ekorg,
    ekko~ekgrp,
    ekpo~ebelp,
    ekpo~matnr,
    ekpo~werks,
    ekpo~lgort,
    ekpo~matkl,
    ekpo~menge,
    ekpo~meins
    FROM ekko
    INNER JOIN ekpo ON ekko~ebeln = ekpo~ebeln
    WHERE ekpo~werks = @p_werks
      AND ekko~ebeln IN @s_ebeln
      AND ekko~bukrs IN @s_bukrs
    INTO CORRESPONDING FIELDS OF TABLE @gt_alv
    UP TO 20 ROWS.

  "给ALV画面做初始值
  MODIFY gt_alv FROM VALUE #( lisbox = '红' ) TRANSPORTING lisbox WHERE sel = abap_off.
  MODIFY gt_alv FROM VALUE #( icon = icon_red_light ) TRANSPORTING icon WHERE sel = abap_off.

  "Layout
  gs_layout-cwidth_opt      = 'X'.  "优化行宽度
  gs_layout-zebra           = 'X'.  "斑马纹!
  gs_layout-box_fname       = 'SEL'. "选择列

  "Fieldcat
  DATA: ls_fieldcat TYPE lvc_s_fcat.
  DEFINE hong.
    ls_fieldcat-fieldname = &1."字段名
    ls_fieldcat-scrtext_l = &2."文本描述
    ls_fieldcat-edit      = &3."可编辑
    ls_fieldcat-no_out    = &4."不显示列
    APPEND ls_fieldcat TO gt_fieldcat.
    CLEAR ls_fieldcat.
  END-OF-DEFINITION.

  hong 'EBELN' '采购凭证编号' '' ''.
  hong 'BUKRS' '公司代码' '' ''.
  hong 'EKORG' '采购组织' '' ''.
  hong 'EKGRP' '采购组' '' ''.
  hong 'EBELP' '凭证项目编号' '' ''.
  hong 'MATNR' '物料编号' '' ''.
  hong 'WERKS' '工厂' '' ''.
  hong 'LGORT' '库存地点' '' ''.
  hong 'MATKL' '物料组' '' ''.
  hong 'MENGE' '采购订单数量' '' ''.
  hong 'MEINS' '采购订单计量单位' '' ''.
  hong 'LISBOX' '下拉列表' '' ''.
  hong 'ICON' '灯-------灯' '' ''.

  "给下拉列表的字段分配分组、给分组标识
  READ TABLE gt_fieldcat ASSIGNING FIELD-SYMBOL(<fs_fieldcat>)
                                     WITH KEY fieldname = 'LISBOX'.
  IF sy-subrc = 0.
    <fs_fieldcat>-edit       = 'X'."可编辑
    <fs_fieldcat>-drdn_hndl  = '1'."分组标识  下拉列表
    <fs_fieldcat>-drdn_field = 'HANDLE'." 内部表字段的字段名称
  ENDIF.

  "下拉列表赋值1
  gt_ddval = VALUE #( ( handle = '1'
                         value = '红' )
                       ( handle = '1'
                         value = '绿' )
                       ( handle = '1'
                         value = '黄' )
                      ).

  "ALV事件
  PERFORM f_set_alv_event."下拉列表事件

  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
    EXPORTING
      i_callback_program = sy-repid
*     i_callback_pf_status_set = 'F_STATUS_SET '
*     i_callback_user_command  = 'F_USER_COMMAND '
*     i_grid_title       = ''
      is_layout_lvc      = gs_layout
      it_fieldcat_lvc    = gt_fieldcat
      i_save             = 'A'
      it_events          = gt_events "ALV事件
    TABLES
      t_outtab           = gt_alv
    EXCEPTIONS
      program_error      = 1
      OTHERS             = 2.
  IF sy-subrc <> 0.
*   系统返回消息
    MESSAGE ID sy-msgid
          TYPE sy-msgty
        NUMBER sy-msgno
          WITH sy-msgv1
               sy-msgv2
               sy-msgv3
               sy-msgv4.
  ENDIF.
*&---------------------------------------------------------------------*
*& Form f_set_alv_event
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM f_set_alv_event .

  "下拉列表事件/捕捉事件
  gt_events = VALUE #( ( name = 'CALLER_EXIT'
                          form = 'FRM_SET_EVENT'    ) "下拉列表的事件
                        ( name = 'DATA_CHANGED'
                          form = 'FRM_DATA_CHANGED' ) "捕捉事件
                      ).

ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  caller_exit
*&---------------------------------------------------------------------*
*       设置下拉列表,使Grid和内表能链接上
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
FORM frm_set_event USING ls_data TYPE slis_data_caller_exit.

  DATA
    lo_grid TYPE REF TO cl_gui_alv_grid.

  DATA:
    l_lvc_s_modi TYPE lvc_s_modi,
    l_lvc_t_modi TYPE lvc_t_modi.

  CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
    IMPORTING
      e_grid = lo_grid.

  "下拉列表
  CALL METHOD lo_grid->set_drop_down_table
    EXPORTING
      it_drop_down = gt_ddval.

  "当我光标焦点发生变化的时候
  CALL METHOD lo_grid->register_edit_event
    EXPORTING
      i_event_id = cl_gui_alv_grid=>mc_evt_modified
    EXCEPTIONS
      error      = 1
      OTHERS     = 2.
  IF sy-subrc <> 0.
*   Implement suitable error handling here
  ENDIF.

  "敲回车的时候
  CALL METHOD lo_grid->register_edit_event
    EXPORTING
      i_event_id = cl_gui_alv_grid=>mc_evt_enter
    EXCEPTIONS
      error      = 1
      OTHERS     = 2.
  IF sy-subrc <> 0.
*   Implement suitable error handling here
  ENDIF.

ENDFORM.
*&---------------------------------------------------------------------*
*&      F_DATA_CHANGE
*&---------------------------------------------------------------------*
*       DATA CHANGE
*----------------------------------------------------------------------*
FORM frm_data_changed USING pr_data_changed
                      TYPE REF TO cl_alv_changed_data_protocol.

  DATA lo_grid TYPE REF TO cl_gui_alv_grid.

  DATA:
    stbl TYPE lvc_s_stbl.

  DATA:
    l_lvc_s_modi TYPE lvc_s_modi,
    l_lvc_t_modi TYPE lvc_t_modi,   "列的内容
    lv_value     TYPE lvc_value.

  CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
    IMPORTING
      e_grid = lo_grid.

  "获取变化行
  l_lvc_t_modi = pr_data_changed->mt_mod_cells.

  READ TABLE l_lvc_t_modi INTO l_lvc_s_modi INDEX 1.

  READ TABLE gt_alv ASSIGNING FIELD-SYMBOL(<fs_zo>) INDEX l_lvc_s_modi-row_id.
  IF sy-subrc = 0.

*    "当前字段取值
*    CALL METHOD ir_data_changed->get_cell_value "获取单元格中的值
*      EXPORTING
*        i_row_id    = l_lvc_s_modi-row_id    "行号
*        i_fieldname = l_lvc_s_modi-fieldname "要获取的列的列名
*      IMPORTING
*        e_value     = lv_value. "获取到的单元格中的值

    CASE l_lvc_s_modi-fieldname."变化的字段名称
      WHEN 'LISBOX'.
        CASE l_lvc_s_modi-value."变化后的字段值
          WHEN '红'.
            <fs_zo>-icon = icon_red_light.
          WHEN '绿'.
            <fs_zo>-icon = icon_green_light.
          WHEN '黄'.
            <fs_zo>-icon = icon_yellow_light.
          WHEN OTHERS.
*            "如果验证不通过,记录错误消息日志
*            CALL METHOD ir_data_changed->add_protocol_entry
*              EXPORTING
*                i_msgid     = '00'
*                i_msgno     = '001'
*                i_msgty     = 'E'
*                i_msgv1     = lv_error
*                i_msgv2     = ''
*                i_msgv3     = ''
*                i_fieldname = l_lvc_s_modi-fieldname
*                i_row_id    = l_lvc_s_modi-row_id.
**            CALL METHOD ir_data_changed->modify_cell
**              EXPORTING
**                i_row_id    = l_lvc_s_modi-row_id
**                i_fieldname = 'LISBOX'
**                i_value     = lv_umlgo.
        ENDCASE.
      WHEN OTHERS.
    ENDCASE.
  ENDIF.

  IF lo_grid IS NOT INITIAL.
    "稳定刷新
    stbl-row = 'X'." 基于行的稳定刷新
    stbl-col = 'X'." 基于列稳定刷新

    CALL METHOD lo_grid->refresh_table_display
      EXPORTING
        is_stable = stbl.
  ENDIF.

ENDFORM.

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值