💂作者简介: THUNDER王,阿里云社区专家博主,华为云·云享专家,腾讯云社区认证作者,CSDN SAP应用技术领域优质创作者。在学习工作中,我通常使用偏后端的开发语言ABAP,SQL进行任务的完成,对SAP企业管理系统,SAP ABAP开发和数据库具有较深入的研究。
在实际业务中,我们会经常碰到这样一个问题,在给用户提供输出的ALV报表时,要求某一字段列可编辑,并且要提供下拉选值,不允许用户自己维护其他值。今天就来带带大家了解一下该如何实现ALV下拉列表的功能吗,并且文末附上一个简易的示例代码,大家CV下来直接就能运行看到效果。
下面将用一个最简单的例子来实现ALV下拉列表
的全流程。总的来说,分为如下四步操作:
ALV报表显示
下拉列表设置
下拉事件设置
Grid链接下拉内表
本案例中我们直接引用SFLIGHT
数据库表中的部分字段数据来作为我们的航班信息。
从数据库表SFLIGHT中读取相应数据存放到该内表中
FIELDCAT
设置LAYOUT
设置下面是对应的示例代码,仅供参考:
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.
drdn_field
,用于后续控制不同下拉列表组
;并且在定义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链接到存取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下拉列表编辑
,希望能帮助到各位小伙伴,码文不易,还望各位大佬们多多支持哦,你们的支持是我最大的动力!