前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【ABAP】一文了解如何实现ALV下拉列表编辑(附完整示例代码)

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

作者头像
THUNDER王
发布2023-10-13 09:13:26
5860
发布2023-10-13 09:13:26
举报
文章被收录于专栏:THUNDER王——CSDN内容同步

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

前言

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

实现效果


实现步骤

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

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

  ALV报表显示

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

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

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

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

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

代码语言:javascript
复制
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事件设置调用的就是我们这一步创建的子例程。

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

代码语言:javascript
复制
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编辑器中即可运行看到相应的效果!

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-09-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 实现效果
  • 实现步骤
    •   ALV报表显示
      •   下拉列表设置
        •   下拉事件设置
          •   Grid链接下拉内表
          • 完整示例代码
          • 写在最后的话
          相关产品与服务
          数据库
          云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档