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级台阶,也可以跳上…...

智慧医疗能源事业线深度画像分析(上)
引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...
【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密
在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...

【网络安全产品大调研系列】2. 体验漏洞扫描
前言 2023 年漏洞扫描服务市场规模预计为 3.06(十亿美元)。漏洞扫描服务市场行业预计将从 2024 年的 3.48(十亿美元)增长到 2032 年的 9.54(十亿美元)。预测期内漏洞扫描服务市场 CAGR(增长率&…...

让AI看见世界:MCP协议与服务器的工作原理
让AI看见世界:MCP协议与服务器的工作原理 MCP(Model Context Protocol)是一种创新的通信协议,旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天,MCP正成为连接AI与现实世界的重要桥梁。…...
【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)
1.获取 authorizationCode: 2.利用 authorizationCode 获取 accessToken:文档中心 3.获取手机:文档中心 4.获取昵称头像:文档中心 首先创建 request 若要获取手机号,scope必填 phone,permissions 必填 …...

华硕a豆14 Air香氛版,美学与科技的馨香融合
在快节奏的现代生活中,我们渴望一个能激发创想、愉悦感官的工作与生活伙伴,它不仅是冰冷的科技工具,更能触动我们内心深处的细腻情感。正是在这样的期许下,华硕a豆14 Air香氛版翩然而至,它以一种前所未有的方式&#x…...

用机器学习破解新能源领域的“弃风”难题
音乐发烧友深有体会,玩音乐的本质就是玩电网。火电声音偏暖,水电偏冷,风电偏空旷。至于太阳能发的电,则略显朦胧和单薄。 不知你是否有感觉,近两年家里的音响声音越来越冷,听起来越来越单薄? —…...

使用Spring AI和MCP协议构建图片搜索服务
目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式(本地调用) SSE模式(远程调用) 4. 注册工具提…...

Golang——6、指针和结构体
指针和结构体 1、指针1.1、指针地址和指针类型1.2、指针取值1.3、new和make 2、结构体2.1、type关键字的使用2.2、结构体的定义和初始化2.3、结构体方法和接收者2.4、给任意类型添加方法2.5、结构体的匿名字段2.6、嵌套结构体2.7、嵌套匿名结构体2.8、结构体的继承 3、结构体与…...

【从零开始学习JVM | 第四篇】类加载器和双亲委派机制(高频面试题)
前言: 双亲委派机制对于面试这块来说非常重要,在实际开发中也是经常遇见需要打破双亲委派的需求,今天我们一起来探索一下什么是双亲委派机制,在此之前我们先介绍一下类的加载器。 目录 编辑 前言: 类加载器 1. …...