【ABAP】一文了解如何实现ALV下拉列表编辑(附完整示例代码)

💂作者简介: THUNDER王,阿里云社区专家博主,华为云·云享专家,腾讯云社区认证作者,CSDN SAP应用技术领域优质创作者。在学习工作中,我通常使用偏后端的开发语言ABAP,SQL进行任务的完成,对SAP企业管理系统,SAP ABAP开发和数据库具有较深入的研究。


💅文章概要: 在实际业务中,我们会经常碰到这样一个问题,在给用户提供输出的ALV报表时,要求某一字段列可编辑,并且要提供下拉选值,不允许用户自己维护其他值。今天就来带大家了解一下该如何实现ALV下拉列表的功能,并且文末附上一个简易的示例代码,大家CV下来直接就能运行看到效果


🤟每日一言: 永远年轻,永远热泪盈眶!


前言

在实际业务中,我们会经常碰到这样一个问题,在给用户提供输出的ALV报表时,要求某一字段列可编辑,并且要提供下拉选值,不允许用户自己维护其他值。今天就来带带大家了解一下该如何实现ALV下拉列表的功能吗,并且文末附上一个简易的示例代码,大家CV下来直接就能运行看到效果。


实现效果


实现步骤

  下面将用一个最简单的例子来实现ALV下拉列表的全流程。总的来说,分为如下四步操作:

  • ALV报表显示
  • 下拉列表设置
  • 下拉事件设置
  • Grid链接下拉内表

  ALV报表显示

  本案例中我们直接引用SFLIGHT数据库表中的部分字段数据来作为我们的航班信息。

  • 首先要自定义一个存取ALV数据的内表并且从数据库表SFLIGHT中读取相应数据存放到该内表中
  • 然后进行ALV字段显示FIELDCAT设置
  • 其次是ALV输出格式LAYOUT设置
  • 最后是ALV输出

  下面是对应的示例代码,仅供参考:

sql 复制代码
TYPE-POOLS: slis.

TABLES:sflight.

TYPES:BEGIN OF ty_tab,
        carrid  LIKE sflight-carrid,      "航线代码
        connid  LIKE sflight-connid,      "航班连接编号
        fldate  LIKE sflight-fldate,      "航班日期
        price   LIKE sflight-price,       "航空运费
        handle1 TYPE int4,                "下拉列表组1
        handle2 TYPE int4,                "下拉列表组2
        wdbs    TYPE char10,              "晚点标识
        hblx    TYPE char10,              "航班类型
      END OF ty_tab.
DATA:gt_tab TYPE TABLE OF ty_tab WITH HEADER LINE.

DATA:
  gs_layout   TYPE lvc_s_layo,
  gt_fieldcat TYPE TABLE OF lvc_s_fcat,
  gs_fieldcat TYPE lvc_s_fcat,
  "定义存储下拉列表的数据
  gt_ddval    TYPE lvc_t_drop,
  gw_ddval    TYPE lvc_s_drop,
  gt_events   TYPE slis_t_event,
  gw_events   TYPE slis_alv_event.

DEFINE fill_field.
  CLEAR gs_fieldcat.
  gs_fieldcat-fieldname     = &1.  "字段的名字(内表中定义的字段名)
  gs_fieldcat-scrtext_l     = &2.  "字段的文本描述,输出时候显示。长描述
  gs_fieldcat-edit          = &3.  "当前列可编辑
  gs_fieldcat-drdn_field    = &4.  "下拉列表
  APPEND gs_fieldcat TO gt_fieldcat.
END-OF-DEFINITION.

INITIALIZATION.

START-OF-SELECTION.
  PERFORM frm_get_data.
  PERFORM frm_dis_data.

FORM frm_get_data.
  SELECT * INTO CORRESPONDING FIELDS OF TABLE gt_tab FROM sflight .
ENDFORM.

FORM frm_dis_data.
  CLEAR:gs_layout.
  gs_layout-cwidth_opt = 'X'. "自动优化列宽
  gs_fieldcat-edit     = 'X'.

  REFRESH gt_fieldcat.
  fill_field:'CARRID'   '航线代码'      ' ' ' ' .
  fill_field:'CONNID'   '航班连接编号'  ' ' ' ' .
  fill_field:'FLDATE'   '航班日期'      ' ' ' ' .
  fill_field:'PRICE'    '航线价格'      ' ' ' ' .
  fill_field:'WDBS'     '晚点标识'      'X' 'HANDLE1'.
  fill_field:'HBLX'     '航班类型'      'X' 'HANDLE2'.

  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
    EXPORTING
      i_callback_program = sy-repid
      it_fieldcat_lvc    = gt_fieldcat[]
      it_events          = gt_events[]
    TABLES
      t_outtab           = gt_tab.
ENDFORM.
  • 在FIELDCAT的设置中提前设置了drdn_field,用于后续控制不同下拉列表组;并且在定义ALV内表时加入了两个对应的下拉列表组字段
  • 在ALV显示函数中,设置了ALV事件EVENT

  下拉列表设置

  在上述FIELDCAT设置下方调用一个子例程creat_dropdown_values用于ALV下拉列表的设置,如下图所示:

  ALV下拉列表子例程示例代码如下,仅供参考:

sql 复制代码
FORM creat_dropdown_values .
  "*------------第一组下拉列表设置------------*
  CLEAR gw_ddval.
  gw_ddval-handle = '1'.
  gw_ddval-value = '晚点'.
  APPEND gw_ddval TO gt_ddval.
  gt_tab-handle1 = 1.

  CLEAR gw_ddval.
  gw_ddval-handle = '1'.
  gw_ddval-value = '不晚点'.
  APPEND gw_ddval TO gt_ddval.
  gt_tab-handle1 = 1.

  "*------------第二组下拉列表设置------------*
  CLEAR gw_ddval.
  gw_ddval-handle = '2'.
  gw_ddval-value = '国内航班'.
  APPEND gw_ddval TO gt_ddval.
  gt_tab-handle2 = 2.

  CLEAR gw_ddval.
  gw_ddval-handle = '2'.
  gw_ddval-value = '国际航班'.
  APPEND gw_ddval TO gt_ddval.
  gt_tab-handle2 = 2.

  MODIFY gt_tab TRANSPORTING handle1 WHERE handle1 IS INITIAL.
  MODIFY gt_tab TRANSPORTING handle2 WHERE handle2 IS INITIAL.
ENDFORM.

  下拉事件设置

  当ALV下拉列表设置完后,我们还需要将ALV下拉事件设置到ALV显示函数中去,在调用子例程creat_dropdown_values下方继续调用一个ALV事件设置的子例程creat_event_exits,如下图所示:

  ALV事件设置子例程示例代码如下,仅供参考:

sql 复制代码
FORM creat_event_exits .
  gw_events-name = 'CALLER_EXIT'.
  gw_events-form = 'CALLER_EXIT'.
  APPEND gw_events TO gt_events.
ENDFORM.                   

PS: 此处name中和form中引用的字符串是标准写法,不能更改!!!

  Grid链接下拉内表

  在完成所有上述步骤后,我们还要将Grid链接到存取ALV下拉数据的内表。这里我们要再定义一个FORM,名称就是上面的CALLER_EXIT,实际上,上面的ALV事件设置调用的就是我们这一步创建的子例程。

  子例程示例代码如下,仅供参考:

sql 复制代码
FORM caller_exit USING ls_data TYPE slis_data_caller_exit.
  DATA: l_ref_alv TYPE REF TO cl_gui_alv_grid.
  CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
    IMPORTING
      e_grid = l_ref_alv.
  CALL METHOD l_ref_alv->set_drop_down_table
    EXPORTING
      it_drop_down = gt_ddval.
ENDFORM.

PS: 此处的写法也基本是标准的,在实际开发中,只需要将gt_ddval替换为大家自己定义的存取ALV下拉数据的内表即可!


完整示例代码

  下面是整个案例的完整示例代码,各位小伙伴们只需要复制粘贴到ABAP编辑器中即可运行看到相应的效果!

sql 复制代码
TYPE-POOLS: slis.

TABLES:sflight.

TYPES:BEGIN OF ty_tab,
        carrid  LIKE sflight-carrid,      "航线代码
        connid  LIKE sflight-connid,      "航班连接编号
        fldate  LIKE sflight-fldate,      "航班日期
        price   LIKE sflight-price,       "航空运费
        handle1 TYPE int4,                "下拉列表组1
        handle2 TYPE int4,                "下拉列表组2
        wdbs    TYPE char10,              "晚点标识
        hblx    TYPE char10,              "航班类型
      END OF ty_tab.
DATA:gt_tab TYPE TABLE OF ty_tab WITH HEADER LINE.

DATA:
  gs_layout   TYPE lvc_s_layo,
  gt_fieldcat TYPE TABLE OF lvc_s_fcat,
  gs_fieldcat TYPE lvc_s_fcat,
*定义存储下拉列表的数据
  gt_ddval    TYPE lvc_t_drop,
  gw_ddval    TYPE lvc_s_drop,

  gt_events   TYPE slis_t_event,
  gw_events   TYPE slis_alv_event.

DEFINE fill_field.
  CLEAR gs_fieldcat.
  gs_fieldcat-fieldname     = &1.  "字段的名字(内表中定义的字段名)
  gs_fieldcat-scrtext_l     = &2.  "字段的文本描述,输出时候显示。长描述
  gs_fieldcat-edit          = &3.  "当前列可编辑
  gs_fieldcat-drdn_field    = &4.  "下拉列表
  APPEND gs_fieldcat TO gt_fieldcat.
END-OF-DEFINITION.

INITIALIZATION.

START-OF-SELECTION.
  PERFORM frm_get_data.
  PERFORM frm_dis_data.

FORM frm_get_data.
  SELECT * INTO CORRESPONDING FIELDS OF TABLE gt_tab FROM sflight .
ENDFORM.

FORM frm_dis_data.
  CLEAR:gs_layout.
  gs_layout-cwidth_opt = 'X'. "自动优化列宽
  gs_fieldcat-edit     = 'X'.

  REFRESH gt_fieldcat.
  fill_field:'CARRID'   '航线代码'      ' ' ' ' .
  fill_field:'CONNID'   '航班连接编号'  ' ' ' ' .
  fill_field:'FLDATE'   '航班日期'      ' ' ' ' .
  fill_field:'PRICE'    '航线价格'      ' ' ' ' .
  fill_field:'WDBS'     '晚点标识'      'X' 'HANDLE1'.
  fill_field:'HBLX'     '航班类型'      'X' 'HANDLE2'.

  PERFORM creat_dropdown_values.
  PERFORM creat_event_exits.
  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
    EXPORTING
      i_callback_program = sy-repid
      it_fieldcat_lvc    = gt_fieldcat[]
      it_events          = gt_events
    TABLES
      t_outtab           = gt_tab.
ENDFORM.

FORM creat_dropdown_values .
  "*------------第一组下拉列表设置------------*
  CLEAR gw_ddval.
  gw_ddval-handle = '1'.
  gw_ddval-value = '晚点'.
  APPEND gw_ddval TO gt_ddval.
  gt_tab-handle1 = 1.

  CLEAR gw_ddval.
  gw_ddval-handle = '1'.
  gw_ddval-value = '不晚点'.
  APPEND gw_ddval TO gt_ddval.
  gt_tab-handle1 = 1.

  "*------------第二组下拉列表设置------------*
  CLEAR gw_ddval.
  gw_ddval-handle = '2'.
  gw_ddval-value = '国内航班'.
  APPEND gw_ddval TO gt_ddval.
  gt_tab-handle2 = 2.

  CLEAR gw_ddval.
  gw_ddval-handle = '2'.
  gw_ddval-value = '国际航班'.
  APPEND gw_ddval TO gt_ddval.
  gt_tab-handle2 = 2.

  MODIFY gt_tab TRANSPORTING handle1 WHERE handle1 IS INITIAL.
  MODIFY gt_tab TRANSPORTING handle2 WHERE handle2 IS INITIAL.
ENDFORM.

FORM creat_event_exits .
  gw_events-name = 'CALLER_EXIT'.
  gw_events-form = 'CALLER_EXIT'.
  APPEND gw_events TO gt_events.
ENDFORM.                    " creat_event_exits
*---------------------------------------------------------------------*
*设置下拉列表,使Grid和内表能链接上
*---------------------------------------------------------------------*
FORM caller_exit USING ls_data TYPE slis_data_caller_exit.
  DATA: l_ref_alv TYPE REF TO cl_gui_alv_grid.
  CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
    IMPORTING
      e_grid = l_ref_alv.
  CALL METHOD l_ref_alv->set_drop_down_table
    EXPORTING
      it_drop_down = gt_ddval.
ENDFORM.

写在最后的话

  本文花费大量时间介绍了ABAP如何实现ALV下拉列表编辑,希望能帮助到各位小伙伴,码文不易,还望各位大佬们多多支持哦,你们的支持是我最大的动力!

原创不易,还希望各位大佬支持一下 \textcolor{blue}{原创不易,还希望各位大佬支持一下} 原创不易,还希望各位大佬支持一下

👍 点赞,你的认可是我创作的动力! \textcolor{9c81c1}{点赞,你的认可是我创作的动力!} 点赞,你的认可是我创作的动力!

⭐️ 收藏,你的青睐是我努力的方向! \textcolor{ed7976}{收藏,你的青睐是我努力的方向!} 收藏,你的青睐是我努力的方向!

✏️ 评论,你的意见是我进步的财富! \textcolor{98c091}{评论,你的意见是我进步的财富!} 评论,你的意见是我进步的财富!

相关推荐
Dong先生8 分钟前
Harness vibecoding:从 PRD 到可交付代码的结构化工法
后端
雪隐1 小时前
用Flutter做背单词APP-03为了给单词库塞满数据,我让AI给我打了上万份工
前端·人工智能·后端
苏三说技术1 小时前
为什么越来越多的人使用PostgreSQL?
后端
Csvn1 小时前
📊 SQL 入门 Day 1:SELECT & WHERE — 数据查询的基本功
后端·sql
不一样的少年_1 小时前
不用框架,手搓 AI Agent:(一) 先让它跑起来
前端·后端·agent
用户526835677902 小时前
《拒绝当背锅侠!写了个 WebHook 中间件,让局域网硬件在服务挂掉时“喊”出来》
后端
云技纵横2 小时前
线上报 Deadlock,怎么从日志里找出是哪两条 SQL 打架?
后端
卷无止境2 小时前
Python数据进阶专题:用声明式验证让数据管道告别"惊喜"
后端·python·数据分析
glartchen2 小时前
win11下使用 WSL2 部署kali 虚拟机(不踩坑版)
后端
聂二AI落地内参2 小时前
ComfyUI 平台化:能力契约、节点白名单和积分预扣怎么串起来
后端