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