ABAP SALV实现弹出ALV选择
问题场景
需要弹出一个ALV并获取选择的数据
实现思路
- 跳转屏幕
- 弹出ALV(通过SALV)
- 弹出ALV(通过REUSE_ALV_POPUP_TO_SELECT)
实现效果
因为这里需要的是单选,所以没有多选列

实现代码
MODULE sel_zfretype INPUT.DATA:lt_zmmt041 LIKE TABLE OF zmmt041,lt_twlad LIKE TABLE OF twlad,lt_twlad01 LIKE TABLE OF twlad.DATA:lfdnr TYPE lfdnr_twlad.DATA: lt_msg TYPE rs_t_msg,ls_msg TYPE bal_s_msg.DATA: lf_one_msg_as_sys_msg TYPE flag.DATA go_alv TYPE REF TO cl_salv_table.DATA: go_functions TYPE REF TO cl_salv_functions_list,go_selections TYPE REF TO cl_salv_selections,go_layout TYPE REF TO cl_salv_layout,go_display TYPE REF TO cl_salv_display_settings.DATA: gr_columns TYPE REF TO cl_salv_columns_table.DATA: gr_column TYPE REF TO cl_salv_column_table.DATA lt_rows TYPE salv_t_row.DATA:ls_row TYPE LINE OF salv_t_row.DATA:lv_wlzs LIKE zmmtydand-menge.DATA:BEGIN OF lt_sel OCCURS 1,zbjh LIKE zmmt041-zbjh,zxmh LIKE zmmt041-zxmh,zfylx LIKE zmmt041-zfylx,zfylx_t LIKE zmmt041-zfylx_t,zvendor LIKE zmmt041-zvendor,name2 LIKE zmmt041-name2,zkunnr LIKE zmmt041-zkunnr,name1 LIKE zmmt041-name1,zarea LIKE zmmt041-zarea,zcity LIKE zmmt041-zcity,zcountry LIKE zmmt041-zcountry,zarea_t LIKE zsdt010-zarea_t,zcity_t LIKE zsdt010-zcity_t,zcountry_t LIKE zsdt010-zcounty_t,zdj LIKE zmmt041-zdj,zdtszl LIKE zmmt041-zdtszl,zsl LIKE zmmt041-zsl,zbz LIKE zmmt041-zbz.DATA:END OF lt_sel.DATA:lt_lfa1 LIKE TABLE OF lfa1 WITH HEADER LINE,lt_zsdt0101 TYPE TABLE OF zsdt010 WITH HEADER LINE.REFRESH:lt_zmmt041,lt_twlad,lt_twlad01."校验供应商IF g_wa_data-lifnr IS INITIAL.REFRESH lt_msg.CLEAR ls_msg.ls_msg-msgty = 'E'.ls_msg-msgid = 'ZMM01'.ls_msg-msgno = '113'.APPEND ls_msg TO lt_msg.IF lt_msg IS NOT INITIAL.cl_epic_ui_services=>show_messages_with_alog(it_messages = lt_msgiv_one_msg_direct = lf_one_msg_as_sys_msg ).CLEAR:g_wa_item_fre-zfretype.RETURN.ENDIF.ENDIF."处理费用类型描述CHECK g_wa_item_fre-zfrename <> '运输费用'.IF g_wa_item_fre-zfrename EQ '运输费用'.RETURN.ELSE.SELECT SINGLE zfrename INTO g_wa_item_fre-zfrenameFROM zmmt037WHERE zfretype = g_wa_item_fre-zfretype.ENDIF.CLEAR:g_wa_item_fre-zfredj,g_wa_item_fre-zfresl,g_wa_item_fre-zfretax,g_wa_item_fre-zfrecefy,g_wa_item_fre-zfreje."处理单价和税率SELECT * FROM zmmt041 INTO CORRESPONDING FIELDS OF TABLE lt_zmmt041WHERE zvendor = g_wa_data-lifnr AND vstel = g_wa_data-vstelAND zwxp = g_wa_data-zwxp AND zfylx = g_wa_item_fre-zfretypeAND zstatus = '3' AND zyxqc < sy-datum AND zyxqd > sy-datumAND zwzc = g_wa_data-zwzc."modify by wangk at 20230214 其他费用选择逻辑变更"处理最小桶数/重量,过滤高于最小桶数/重量的lv_wlzs = 0.LOOP AT g_it_item.lv_wlzs = lv_wlzs + g_it_item-menge.ENDLOOP.DELETE lt_zmmt041[] WHERE zdtszl >= lv_wlzs.IF lt_zmmt041[] IS INITIAL.g_wa_item_fre-zfrejhw = 'X'.RETURN.ENDIF."选择报价REFRESH:lt_sel,lt_lfa1,lt_zsdt0101.MOVE-CORRESPONDING lt_zmmt041[] TO lt_sel[].SELECT * FROM lfa1 INTO CORRESPONDING FIELDS OF TABLE lt_lfa1FOR ALL ENTRIES IN lt_selWHERE lifnr = lt_sel-zvendor.SELECT * FROM zsdt010 INTO CORRESPONDING FIELDS OF TABLE lt_zsdt0101.LOOP AT lt_sel INTO DATA(ls_sel)."供应商READ TABLE lt_lfa1 WITH KEY lifnr = ls_sel-zvendor.IF sy-subrc = 0.ls_sel-name2 = lt_lfa1-sortl.ENDIF."三级地址IF ls_sel-zarea IS NOT INITIAL.READ TABLE lt_zsdt0101 WITH KEY zarea = ls_sel-zarea.IF sy-subrc = 0.ls_sel-zarea_t = lt_zsdt0101-zarea_t.ENDIF.ENDIF.IF ls_sel-zcity IS NOT INITIAL.READ TABLE lt_zsdt0101 WITH KEY zcity = ls_sel-zcity zarea = ls_sel-zarea.IF sy-subrc = 0.ls_sel-zcity_t = lt_zsdt0101-zcity_t.ENDIF.ENDIF.IF ls_sel-zcountry IS NOT INITIAL.READ TABLE lt_zsdt0101 WITH KEY zcounty = ls_sel-zcountry zcity = ls_sel-zcity zarea = ls_sel-zarea.IF sy-subrc = 0.ls_sel-zcountry_t = lt_zsdt0101-zcounty_t.ENDIF.ENDIF.MODIFY lt_sel FROM ls_sel.CLEAR:ls_sel.ENDLOOP.TRY.cl_salv_table=>factory(IMPORTINGr_salv_table = go_alv"方法生成的ALV容器对象CHANGINGt_table = lt_sel[] )."alv展示的数据CATCH cx_salv_msg.ENDTRY.go_functions = go_alv->get_functions( ).go_functions->set_all( 'X' )."设置默认按键go_selections = go_alv->get_selections( ).go_selections->set_selection_mode( if_salv_c_selection_mode=>single )."设置选择模式go_display = go_alv->get_display_settings( ).go_display->set_fit_column_to_table_size( 'X' )."列自适应gr_columns = go_alv->get_columns( ).gr_columns->set_optimize( 'X' ).gr_column ?= gr_columns->get_column( 'ZBZ' )."需处理的列gr_column->set_long_text( '备注' ).gr_column->set_medium_text( '备注' ).gr_column->set_short_text( '备注' ).
*gr_column->set_output_length( 15 ).gr_column ?= gr_columns->get_column( 'NAME2' )."需处理的列gr_column->set_long_text( '分包方' ).gr_column->set_medium_text( '分包方' ).gr_column->set_short_text( '分包方' ).gr_column ?= gr_columns->get_column( 'NAME1' )."需处理的列gr_column->set_long_text( '送达方' ).gr_column->set_medium_text( '送达方' ).gr_column->set_short_text( '送达方' ).gr_column ?= gr_columns->get_column( 'ZAREA_T' )."需处理的列gr_column->set_long_text( '目的城市(省)' ).gr_column->set_medium_text( '目的城市(省)' ).gr_column->set_short_text( '省' ).gr_column ?= gr_columns->get_column( 'ZCITY_T' )."需处理的列gr_column->set_long_text( '目的城市(市)' ).gr_column->set_medium_text( '目的城市(市)' ).gr_column->set_short_text( '市' ).gr_column ?= gr_columns->get_column( 'ZCOUNTRY_T' )."需处理的列gr_column->set_long_text( '目的城市(县/区/镇)' ).gr_column->set_medium_text( '目的城市(县/区/镇)' ).gr_column->set_short_text( '县/区/镇' ).gr_column ?= gr_columns->get_column( 'ZDTSZL' )."需处理的列gr_column->set_long_text( '最低桶数/重量' ).gr_column->set_medium_text( '最低桶数/重量' ).gr_column->set_short_text( '最低桶数/重量' ).gr_column ?= gr_columns->get_column( 'ZDJ' )."需处理的列gr_column->set_long_text( '单价' ).gr_column->set_medium_text( '单价' ).gr_column->set_short_text( '单价' ).gr_column ?= gr_columns->get_column( 'ZAREA' ).gr_column->set_visible( cl_salv_column_table=>false ).gr_column ?= gr_columns->get_column( 'ZCITY' ).gr_column->set_visible( cl_salv_column_table=>false ).gr_column ?= gr_columns->get_column( 'ZCOUNTRY' ).gr_column->set_visible( cl_salv_column_table=>false ).gr_column ?= gr_columns->get_column( 'ZFYLX' ).gr_column->set_visible( cl_salv_column_table=>false ).gr_column ?= gr_columns->get_column( 'ZBJH' ).gr_column->set_visible( cl_salv_column_table=>false ).gr_column ?= gr_columns->get_column( 'ZXMH' ).gr_column->set_visible( cl_salv_column_table=>false ).gr_column ?= gr_columns->get_column( 'ZVENDOR' ).gr_column->set_visible( cl_salv_column_table=>false ).gr_column ?= gr_columns->get_column( 'ZKUNNR' ).gr_column->set_visible( cl_salv_column_table=>false ).gr_column ?= gr_columns->get_column( 'ZSL' ).gr_column->set_visible( cl_salv_column_table=>false ).IF go_alv IS BOUND.go_alv->set_screen_popup(start_column = 10end_column = 110start_line = 5end_line = 15 ).go_alv->display( ). "调用显示方法ENDIF.REFRESH:lt_rows.lt_rows = go_selections->get_selected_rows( ).IF lt_rows[] IS INITIAL.g_wa_item_fre-zfrejhw = 'X'.RETURN.ENDIF.LOOP AT lt_rows INTO ls_row.READ TABLE lt_sel INTO DATA(ls_zmmt041) INDEX ls_row.g_wa_item_fre-zfredj = ls_zmmt041-zdj.g_wa_item_fre-zfretax = ls_zmmt041-zsl.g_wa_item_fre-zfrejhw = ''.CLEAR:ls_row.ENDLOOP.
ENDMODULE.
实现过程思路
- 因为屏幕这块做的比较多了,所以这次就想通过ALV实现,一开始使用的函数:REUSE_ALV_POPUP_TO_SELECT。使用这个函数遇到了1个问题:无法实现单选。一直没有找到解决方案,就放弃了。
- 采用SALV实现,系统提供了一个示例程序可以参考:SALV_TEST_TABLE_SELECTIONS
使用这个方案也是需要解决几个问题:a.列的宽度自适应 b.隐藏列 c.实现单单选效果 d.修改列对应的描述 e.获取返回的数据
问题a: 想通过下面这个方法实现
go_display = go_alv->get_display_settings( ).
go_display->set_fit_column_to_table_size( 'X' )."列自适应
但是调试一直不生效,没找到问题出在哪里。
后面通过另外一种方案实现:
gr_columns = go_alv->get_columns( ).
gr_columns->set_optimize( 'X' ).
成功达到了想要的效果。
问题b:
这里我想到了fieldcat,但是SALV的fieldcat是通过以下实现的
gr_column ?= gr_columns->get_column( 'ZAREA' ).
gr_column->set_visible( cl_salv_column_table=>false ).
问题c:
go_selections = go_alv->get_selections( ).
go_selections->set_selection_mode( if_salv_c_selection_mode=>single )."设置选择模式
这里有几种选择模式

问题d:
gr_columns = go_alv->get_columns( ).
gr_column ?= gr_columns->get_column( 'ZBZ' )."需处理的列
gr_column->set_long_text( '备注' ).
gr_column->set_medium_text( '备注' ).
gr_column->set_short_text( '备注' ).
*gr_column->set_output_length( 15 ).
gr_column下面有很多方法

这里面也有几个关于前导0的函数,我也是多次调试没有生效,截止到现在没有找到问题的原因,因为最近需求比较急,我就没花时间去深究。
问题e:
在display( )方法后面可以通过函数获取选择的行。
IF go_alv IS BOUND.go_alv->set_screen_popup(start_column = 10end_column = 110start_line = 5end_line = 15 ).go_alv->display( ). "调用显示方法
ENDIF.REFRESH:lt_rows.
lt_rows = go_selections->get_selected_rows( ).LOOP AT lt_rows INTO ls_row.READ TABLE lt_sel INTO DATA(ls_zmmt041) INDEX ls_row.
ENDLOOP.
附加收获
下面是一段逻辑流,遇到的问题及解决方案:
- 编辑后保存不了——没有写FIELD
- 写了MODULE没有生效——需要计算的数据一定顺序一定在被计算的后面,比如下面的zfreje和zfrecefy是由zfredj和zfresl计算出来的,那么顺序上zfreje和zfrecefy要在上面
- 改了zfretype其他字段没有更新——因为zfretype的优先级最高,所以要放在最后,这样zfretype对应的MODULE才会覆盖前面的字段。
LOOP AT g_it_item_fre.CHAIN.FIELD g_wa_item_fre-zno.FIELD g_wa_item_fre-zfreje.FIELD g_wa_item_fre-zfrecefy.FIELD g_wa_item_fre-zfredj MODULE js_zfreje ON REQUEST.FIELD g_wa_item_fre-zfresl MODULE js_zfreje ON REQUEST.FIELD g_wa_item_fre-zfretax.FIELD g_wa_item_fre-zfrejhw.FIELD g_wa_item_fre-zfretype MODULE sel_zfretype ON REQUEST.MODULE tab_item_fre_modify ON CHAIN-REQUEST.ENDCHAIN.FIELD g_wa_item_fre-boxMODULE tab_item_fre_mark ON REQUEST.ENDLOOP.
相关文章:
ABAP SALV实现弹出ALV选择
问题场景 需要弹出一个ALV并获取选择的数据 实现思路 跳转屏幕弹出ALV(通过SALV)弹出ALV(通过REUSE_ALV_POPUP_TO_SELECT) 实现效果 因为这里需要的是单选,所以没有多选列 实现代码 MODULE sel_zfretype INPUT.…...
git check-pick,git patch 与 git stash 详解
大家好,我是 17。 今天和大家聊一聊 git check-pick,git patch 与 git stash 的用法。 git cherry-pick 为什么要用 cherry-pick? 不适合 merge 的场景就可以考虑 cherry-pick。 试想下面这些场景 只想同步分支的部分提交。两个分支是两上完全独立…...
OA漏洞-到处搜集整理
一米OA getfile.jsp 任意文件读取漏洞 原文链接 漏洞复现 一米OA getfile.jsp 任意文件读取漏洞 一米OA协同办公系统,集成了OA办公自动化系统、手机客户端、专业报表工具,为全国千万企业用户提供全功能、性价比高的OA软件。一米OA getfile.jsp文件存在任意文件读取漏洞&am…...
web端接收读卡器卡片信息
项目背景 通过电脑连接的读卡器读取卡片信息,并由web页面接收和处理卡片信息。 读卡器抛出卡片信息流程 卡片贴近或放置到读卡器上读卡器解析卡片信息,并形成固定格式的字符串,包括的信息有:卡片写入的数据、卡片原数据&#x…...
BUUCTF-练习场-WEB-第一部分(8道)
[极客大挑战 2019]EasySQL 1payload:1 or 11#是闭合前面的查询语句,or 11恒成立,可以使用or句子绕过判断,#用于注释,注释后面的内容不再执行,所以该sql命令会返回表内所有内容,其实就是实现一个…...
Java Reflection 实战- Class类
Java Reflection 实战 - Class Java 反射使得在运行时检查类、接口、字段和方法成为可能,而不需要在编译时知道类、方法等的名称。也可以使用反射来实例化新对象、调用方法和获取/设置字段值。 Java反射的功能相当强大,可以说是非常有用。例如ÿ…...
背包问题理解思路(01背包、完全背包、分组背包)
这两天把经典的三个背包问题看了一下,网上大多文章是以代码和公式为主,因为平时没刷过算法题所以理解起来花了些时间,固写一篇文章记录理解思路,本文不包含代码实现(理解了思路代码实现应该是小问题,网上一…...
Mr. Cappuccino的第39杯咖啡——Kubernetes之深入理解Pod
Kubernetes之深入理解PodPod相关概念Pod详细配置清单Pod核心配置Pod基本配置1. 创建yaml文件2. 创建namespace并根据yaml文件创建资源3. 查看namespace下的pod列表以及pod的详细信息Pod中多个容器的名称和端口号不能相同Pod镜像拉取策略Pod环境变量Pod端口相关设置Pod资源相关配…...
SqlSession 和 SqlSessionTemplate 简单使用及注意事项
1、SqlSession 简单使用 先简单说下 SqlSession 是什么?SqlSession 是对 Connection 的包装,简化对数据库操作。所以你获取到一个 SqlSession 就相当于获取到一个数据库连接,就可以对数据库进行操作。 SqlSession API 如下图示:…...
1. QSaveFile和QFile的简单使用
1. 说明 QSaveFile和QFile两个类都是用来操作文件的,区别在于QSaveFile在对文件进行写入时有一种保护机制,再写入出错时,不会对源文件中的内容进行操作。该类在执行写操作时,会先将内容写入到一个临时文件中,如果没有…...
工业4.0是如何优化垃圾处理行业的
如今,工业4.0正在影响着制造业和物流等行业,其发展潜力在未来还有望进一步扩大。一些全球领先的垃圾处理公司已经开始在水处理和废物回收等领域应用工业4.0。工业4.0的创新给这个领域带来了一些必要的改进。随着环境危机的加剧,垃圾处理行业面…...
vue 动画(transition)
一、 实现原理 在插入、更新、移除 DOM 元素时,在合适的时候给元素添加样式类名,配合 CSS 样式使用,实现动画效果。 通俗来讲,就是将要进行动画操作的 DOM 元素用 transition 标签包裹起来。在此html元素运动前,运动…...
Python 爬虫工程师面试经验分享,金三银四
🙃 作为一个 Python 爬虫工程师,我可以分享一些我在面试中的经验和建议。 首先一点是在面试中要表现自信、友好、乐于合作,同时对公司的业务和文化也要有一定的了解和兴趣,这些也是公司在招聘中看重的因素。 文章目录🕛…...
MySQL实战篇-MySQL 降配导致的实例宕机
问题描述 由于近期对服务器进行了降配,该mysql数据库会进行批量写入操作,直接导致实例宕机 查看错误日志: 2021-02-02T09:09:23.557505Z 0 [Note] InnoDB: page_cleaner: 1000ms intended loop took 16791ms. The settings might not be optimal. (fl…...
时隔多年,这次我终于把动态代理的源码翻了个地儿朝天
本文内容整理自 博学谷狂野架构师 动态代理简介 Proxy模式是常用的设计模式,其特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后处理消息等。 用户可以更加结构图࿰…...
数据分析-深度学习 Tensorflow Day6
我们需要解决的问题:1: 什么是bp 神经网络?2:理解bp神经网络需要哪些数学知识?3:梯度下降的原理4: 激活函数5:bp的推导。1.什么是bp网络?引用百度知道回复:“我们最常用的…...
leaflet 设置多个marker,导出为一个geojson文件(066)
第066个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+leaflet中使用L.marker设置多个markers, 通过数据重组,导出为geojson文件。 这里面 ayer instanceof L.Marker 是一个很重要的判断条件,可以灵活地去运用。 直接复制下面的 vue+openlayers源代码,操作2分钟即可…...
企业与第三方供应商合作时,会存在哪些安全风险?
随着现代社会的发展,企业供应链、产业供应链已日渐成熟。其中,供应商与企业的关系也由最初的纯粹买卖关系发展成了合作伙伴关系。在整个供应链体系中,供应商与其受众承担着供应链中环环相扣的责任,可以说,企业安全的薄…...
技术源自洛克希德·马丁,光场XR眼镜FYR解析
专注于医疗场景的一家XR眼镜厂商FYR(全称:FYR Medical)近期亮相,并宣布完成了260万美元A轮融资,本轮融资由NuVasive领投,资金将用于开发世界上第一个XR光场“放大镜”类产品。据青亭网了解,NuVa…...
剑指 Offer 10- II. 青蛙跳台阶问题(LeetCode 70. 爬楼梯)(动态规划打表)
题目: 链接:剑指 Offer 10- II. 青蛙跳台阶问题;LeetCode 70. 爬楼梯 难度:简单 相关博文:剑指 Offer 10- I. 斐波那契数列(动态规划打表) 一只青蛙一次可以跳上1级台阶,也可以跳上…...
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造,完美适配AGV和无人叉车。同时,集成以太网与语音合成技术,为各类高级系统(如MES、调度系统、库位管理、立库等)提供高效便捷的语音交互体验。 L…...
eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)
说明: 想象一下,你正在用eNSP搭建一个虚拟的网络世界,里面有虚拟的路由器、交换机、电脑(PC)等等。这些设备都在你的电脑里面“运行”,它们之间可以互相通信,就像一个封闭的小王国。 但是&#…...
深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录
ASP.NET Core 是一个跨平台的开源框架,用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录,以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...
HTML 语义化
目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案: 语义化标签: <header>:页头<nav>:导航<main>:主要内容<article>&#x…...
TDengine 快速体验(Docker 镜像方式)
简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能,本节首先介绍如何通过 Docker 快速体验 TDengine,然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker,请使用 安装包的方式快…...
树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法
树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作,无需更改相机配置。但是,一…...
模型参数、模型存储精度、参数与显存
模型参数量衡量单位 M:百万(Million) B:十亿(Billion) 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的,但是一个参数所表示多少字节不一定,需要看这个参数以什么…...
【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器
——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的一体化测试平台,覆盖应用全生命周期测试需求,主要提供五大核心能力: 测试类型检测目标关键指标功能体验基…...
Java面试专项一-准备篇
一、企业简历筛选规则 一般企业的简历筛选流程:首先由HR先筛选一部分简历后,在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如:Boss直聘(招聘方平台) 直接按照条件进行筛选 例如:…...
pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)
目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关࿰…...
