【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下拉列表编辑,希望能帮助到各位小伙伴,码文不易,还望各位大佬们多多支持哦,你们的支持是我最大的动力!

✨ <math xmlns="http://www.w3.org/1998/Math/MathML"> 原创不易,还希望各位大佬支持一下 \textcolor{blue}{原创不易,还希望各位大佬支持一下} </math>原创不易,还希望各位大佬支持一下

👍 <math xmlns="http://www.w3.org/1998/Math/MathML"> 点赞,你的认可是我创作的动力! \textcolor{9c81c1}{点赞,你的认可是我创作的动力!} </math>点赞,你的认可是我创作的动力!

⭐️ <math xmlns="http://www.w3.org/1998/Math/MathML"> 收藏,你的青睐是我努力的方向! \textcolor{ed7976}{收藏,你的青睐是我努力的方向!} </math>收藏,你的青睐是我努力的方向!

✏️ <math xmlns="http://www.w3.org/1998/Math/MathML"> 评论,你的意见是我进步的财富! \textcolor{98c091}{评论,你的意见是我进步的财富!} </math>评论,你的意见是我进步的财富!

相关推荐
用户479492835691512 分钟前
给客户做私有化部署,我是如何优雅搞定 NPM 依赖管理的?
前端·后端·程序员
间彧17 分钟前
混沌工程在SpringBoot项目中的实践与应用
后端
隔壁阿布都24 分钟前
使用LangChain4j +Springboot 实现大模型与向量化数据库协同回答
人工智能·spring boot·后端
上进小菜猪1 小时前
基于 YOLOv8 的智能火灾识别系统设计与实现— 从数据集训练到 PyQt5 可视化部署的完整工程实践
后端
古城小栈1 小时前
Spring Boot 数据持久化:MyBatis-Plus 分库分表实战指南
spring boot·后端·mybatis
ConardLi2 小时前
AI:我裂开了!现在的大模型评测究竟有多变态?
前端·人工智能·后端
Victor3562 小时前
Hibernate(2)Hibernate的核心组件有哪些?
后端
Victor3562 小时前
Hibernate(1)什么是Hibernate?
后端
+VX:Fegn08952 小时前
计算机毕业设计|基于springboot + vue宠物寄养系统(源码+数据库+文档)
数据库·vue.js·spring boot·后端·课程设计·宠物
一 乐2 小时前
校园实验室|基于springboot + vue校园实验室管理系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·后端