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

news2024/12/24 0:37:57

在这里插入图片描述

💂作者简介: 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输出

在这里插入图片描述

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

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下拉列表子例程示例代码如下,仅供参考:

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事件设置子例程示例代码如下,仅供参考:

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事件设置调用的就是我们这一步创建的子例程。

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

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编辑器中即可运行看到相应的效果!

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}{评论,你的意见是我进步的财富!} 评论,你的意见是我进步的财富!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1021169.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

聚焦数据库和新兴硬件的技术合力 中科驭数受邀分享基于DPU的数据库异构加速方案

随着新型硬件成本逐渐降低,充分利用新兴硬件资源提升数据库性能是未来数据库发展的重要方向之一,SIGMOD、VLDB、CICE数据库顶会上出现越来越多新兴硬件的论文和专题。在需求侧,随着数据量暴增和实时性的要求越来越高,数据库围绕处…

【TCP】三次握手 与 四次挥手 详解

三次握手 与 四次挥手 1. 三次握手2. 四次挥手三次握手和四次挥手的区别 在正常情况下,TCP 要经过三次握手建立连接,四次挥手断开连接 1. 三次握手 服务端状态转化: [CLOSED -> LISTEN] 服务器端调用 listen 后进入 LISTEN 状态&#xff…

系统架构设计师(第二版)学习笔记----信息安全系统及信息安全技术

【原文链接】系统架构设计师(第二版)学习笔记----信息加解密技术 文章目录 一、信息安全系统的组成框架1.1 信息安全系统组成框架1.2 信息安全系统技术内容1.3 常用的基础安全设备1.4 网络安全技术内容1.5 操作系统安全内容1.6 操作系统安全机制1.7 数据…

双节履带机械臂小车实现蓝牙遥控功能

1.功能描述 本文示例所实现的功能为:采用蓝牙远程遥控双节履带机械臂小车进行运动。 2.结构说明 双节履带机械臂小车,采用履带底盘,可适用于任何复杂地形。 前节履带抬起高度不低于10cm,可用于履带车进行爬楼行进。 底盘上装有一…

三维模型3DTile格式轻量化压缩文件大小的技术方法研究

三维模型3DTile格式轻量化压缩文件大小的技术方法研究 倾斜摄影三维模型,由于数据量大、复杂度高,轻量化压缩成为其在网络传输和实时渲染中必不可少的环节。以下是几种常用的3DTile格式轻量化压缩技术方法: 几何简化:这是一种最…

Mac中IntelliJ IDEA每次打开立刻“意外退出”的解决方法

本文介绍在Mac电脑中,无法打开IntelliJ IDEA软件,出现“意外退出”的报错提示,且重启软件依然出现这一情况的通用解决思路与方法。 最近,不知道怎么回事,点击图标准备打开IntelliJ IDEA软件时,很快就会出现…

ADB底层原理

介绍 adb的全称为Android Debug Bridge,就是起到调试桥的作用。通过adb我们可以在Eclipse/Android Studio中方便通过DDMS来调试Android程序,说白了就是debug工具。adb是android sdk里的一个工具, 用这个工具可以直接操作管理android模拟器或者真实的and…

【逗老师的无线电】艾德克斯TTL串口转网口

最近手搓了一个可以用于艾德克斯ITECH电源或者电子负载的TTL串口转网口的模块,用上之后,上位机软件就可以配置以太网IP连接设备啦。就像这样。 一、ITECH TTL接口定义 二、整体逻辑 嗯,就这么简单。IT9000控制软件的Ethernet功能就是直接S…

【校招VIP】测试方案分析之压力测试

考点介绍: 软件压力测试是校招面试里面经常会碰到的题型。 基本思路是在计算机数量较少或系统资源匮乏的条件下运行测试。要求面试者了解压力测试的基本概念,压测的目的,压测的要求以及说出实例。 测试方案分析之压力测试-相关题目及解析内容…

从理解js双重递归执行顺序到用递归方式实现二叉树中序遍历

今天在学习力扣上94题二叉树的中序遍历时,js的实现方法之一是递归,但是函数内递归是双重,花了一些时间来理解双重递归调用的执行顺序。 先看如下例子,参考文章(双递归的执行过程理解) 示例代码如下&#xf…

Vue基础之模板语法介绍

前言 上篇我分享了关于Vue的入门,简单的入了个门。本篇文章将要分享的内容为Vue的模板语法。 一、插值 1.1、文本 1.2、html 1.3、属性 1.4、class、style绑定 1.5、表达式 在Vue的模板语法中,插值是一种常用的方式来动态地将数据渲染到视图中。Vue使用双…

CentOS 7 安装Libevent

CentOS 7 安装Libevent 1.下载安装包 新版本是libevent-2.1.12-stable.tar.gz。(如果你的系统已经安装了libevent,可以不用安装) 官网:http://www.monkey.org/~provos/libevent/ 2.创建目录 # mkdir libevent-stable 3.解压 …

数字森林:无人机航测技术在林业调查中的应用

林业调查是林业工作的基础,对于森林资源的管理、规划、保护、经济发展和农业种植等方面都具有重要的意义。传统林业调查主要依赖人工进行,存在工作效率低、数据精度低、数据分析困难、受地形限制、无法实时监测等缺陷。 随着科技的不断发展,无…

DJYOS开源往事三:DJYOS源码发布网络实证

在DJYOS经营开发社区的时候,DJYOS的代码更新记录是在自己的官网上。然后散发到各种技术论坛上。这里我实证的举例以第三方网站为数据源头,罗列2009年之后发布的一些源码实证信息。 1、2009年2月2日:djyos含example的0.2.0版本发布了&#xf…

JDK1.8下载

https://www.oracle.com/cn/java/technologies/downloads/#java8-windows

git log和git reflog命令

工作区 版本历史库 ,暂存区 (1)git log (2)git log --oneline (3)git log -n4 --graph (4)git log -n4 --graph --oneline (5)git log --all (6)git log master 查看master分支历史记录(1)HEAD指向当前工作commit,是个变量 (2)git reset HEAD^,git log找不到之前的commi…

函数式编程------JDK8新特性

函数式编程式jdk 8中的语法糖,在许多地方都有用到,以下是一些优点. 能够看懂公司里的代码大数量下处理集合效率高代码可读性高消灭嵌套地狱 Lamda表达式 lamda表达式是函数是编程的基础,先看一个列子 新建一个线程,参数是匿名类内部类(匿名内部类是一个匿名子类对象。这里使…

Web应用系统的小安全漏洞及相应的攻击方式

写作目的 本文讲述一个简单的利用WebAPI来进行一次基本没有破坏力的“黑客”行为。 主要目的如下: 了解什么叫安全漏洞 知道什么是api 了解一些获取api的工具 通过对API的认识了解白盒接口测试基本概念和技术 免责声明: 本文主要是以学习交流为目的&a…

python抠图(去水印)开源库lama-cleaner入门应用实践

1. 关于 Lama Cleaner Lama Cleaner 是由 SOTA AI 模型提供支持的免费开源图像修复工具。可以从图片中移除任何不需要的物体、缺陷和人,或者擦除并替换(powered by stable diffusion)图片上的任何东西。 特征: 完全免费开源&am…

axios取消上一页面的请求

请求拦截 声明变量用于存放请求请求拦截存放请求导出请求 导航守卫 导入请求集合路由前置守卫中遍历取消所有请求 登录失效取消后续请求