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

相关推荐
雪隐40 分钟前
个人电脑玩AI00-前言
人工智能·后端
我是一颗柠檬1 小时前
【Java后端技术亮点】动态路由权限(按钮级权限),细粒度控制到按钮级别
java·开发语言·后端·状态模式
前端Hardy1 小时前
CSS 动画真的比 JS 快?Josh Comeau 做了组实验,结果跟直觉不一样
前端·javascript·后端
Front思1 小时前
调取支付宝支付正式环境不可以唤起来,但是沙箱可以
后端
foggyprojects1 小时前
AI 生成 SQL 模板以后,为什么还需要固定 helper 规则
后端
明天一点1 小时前
Cloudflare 通知转发钉钉机器人
前端·后端
前端Hardy1 小时前
前端日历组件,要变天了?Schedule-X v4.6 彻底杀疯了
前端·javascript·后端
Oo_行者_oO1 小时前
微服务 Feign 从“万能公共服务”到“业务客户端”
后端·架构
wei_shuo1 小时前
别再踩坑了!KingbaseES 存储过程与触发器开发避坑实录
后端
元宝骑士1 小时前
MySQL 实战:跨表排序 + 指定类型置顶四种写法
后端·mysql