ABAP DIALOG屏幕编程2
在上一篇博客ABAP DIALOG屏幕编程1中阐述了DIALOG、PBO、PAI的概念并且对常用页面元素怎么用进行了演示。在这一篇博文中会讲述怎么添加下拉框、搜索帮助,怎么创建表控件、屏幕跳转等。会用到上一篇里面的内容。
有关程序包含文件结构如下。

一、响应用户指令
如上一篇博文中提到的,因为有时候会涉及到清空指令的情况,为了保证程序正常运行,我们一般不直接使用SY-UCOMM这个系统变量处理用户指令,而是用OK_CODE(自定义的变量名)来接收用户指令进行处理。
1、声明全局变量OK_CODE
在zvia_screen_d01中添加变量声明,TYPE SY-UCOMM。

2、 在屏幕的元素清单处添加变量
不知道怎么展开的点击显示对象列表。有多个屏幕可以使用同一个变量名,只需要声明一次。但记住需要在每个屏幕的元素清单添加变量。

3、演示点击按钮操作
上篇文章演示过给按钮添加功能码的操作。给按钮添加功能码的方法与 HTML 中的 id 或 name 属性相似,主要是通过 屏幕(Dynpro)设计 和 ABAP 代码中的命令 来绑定按钮的功能。在 SAP GUI 中,按钮的功能码用于定义按钮点击时的行为。
a、这里我们画了一个按钮,并给它的功能码设置成BUTTON。

b、因为点击功能码是用户输入的一种,所以对用户指令的响应应该放在PAI中。
点击到屏幕的逻辑流处可以看到注释的地方存在一个处理用户指令的模块,解开注释双击创建。

因为是PAI模块,根据之前的模块划分,给它放在zvia_screen_i01中。

c、使用CASE来对OK_CODE进行分情况操作
WHEN + 操作名(这里是按钮的功能码).
需要进行的处理/PERFORM子例程/不处理.
MODULE user_command_0100 INPUT.CASE ok_code.WHEN 'BUTTON'."与按钮对应的功能码保持一致MESSAGE s013(zvia_dialog_msg)."之前创建的消息类"WHEN '按钮名'."PERFORM OR 其他操作。WHEN OTHERS.ENDCASE.
ENDMODULE.
点击按钮后,左下角显示信息。这里可以进行更复杂的处理,最好使用子例程,使代码更加简洁、结构更清楚。

4、菜单栏的指令响应
菜单栏应该在屏幕显示之前就进行定义,所以应该在PBO模块中进行声明。
a、点击到屏幕的逻辑流处可以看到注释的地方存在一个定义菜单栏的模块,解开注释双击创建。

因为是PBO模块,根据之前的模块划分,给它放在zvia_screen_o01中。

b、在每次通过以上步骤创建的PBO模块时都会出现如下被注释的两句话。解开注释,填写名称,双击创建。

MODULE status_0100 OUTPUT.SET PF-STATUS 'PFSTATUS01'.SET TITLEBAR 'TITLEBAR01'.
ENDMODULE.
c、双击PFSTATUS01创建菜单栏。这里的标准工具条的命名是在进行处理的时候会用到的,可以直接使用标准的进行定义,也可以自己定义。填写功能码,需要用到什么就给什么按钮填,功能码不能相同,建议按照常识或者SAP的习惯定义按钮。记得激活。
使用标准的:附加->调整模板 程序SAPLKKBL 状态STANDARD_FULLSCREEN。

d、双击 TITLEBAR01填写标题。
e、两者创建完成之后的页面如下。这里我是直接使用了标准的,但实际上不需要这么多按钮,可以自己添加。填写对应的功能键的功能码之后就能亮起来了,但是现在点击是没有用的,我们还没有实现功能。

f、实现功能。
使用标准的的按钮的功能码如下。

跟上面的按钮一样。我们在user_command_0100模块进行功能实现。这里我们只是演示绑定过程,具体实现的功能自己进行书写。比如我们这里实现点击保存按钮。看到定义的功能码是&DATA_SAVE(如果自己定义的按照自定义的进行)。
这里因为一般我们的保存操作涉及到很多语句,所以创建子例程编写。双击创建。
MODULE user_command_0100 INPUT.CASE ok_code.WHEN 'BUTTON'."与按钮对应的功能码保持一致MESSAGE s013(zvia_dialog_msg)."之前创建的消息类 TCODE:SE91WHEN '&DATA_SAVE'.PERFORM frm_data_save.WHEN OTHERS.ENDCASE.
ENDMODULE.
保存至 zvia_screen_f01中。

在子例程里面进行处理。这里其他部分都注释掉了,只留一个MESSAGE显示,尝试点击看能否响应。
*&---------------------------------------------------------------------*
*& Form frm_data_save
*&---------------------------------------------------------------------*
*& 保存数据子例程
*&---------------------------------------------------------------------*
FORM frm_data_save ."数据判断、处理"数据库处理
* IF sy-subrc = 0."如果成功则MESSAGE s014(zvia_dialog_msg).
* ELSE."失败的话
* MESSAGE e015(zvia_dialog_msg).
* ENDIF.
ENDFORM.
点击之后显示消息。

二、添加下拉框
ABAP下拉框可替代多个RADIO,不需要画多个单选进行分组。有Listbox和Listbox with key两种。
1、下拉框分类
a、Listbox
1)用途
Listbox 主要用于显示一组 简单的文本项,用户可以从这些文本中选择一个。
2)显示内容
在 Listbox 中,列出的每一项通常只显示文本,不包含与之关联的其他信息。
3)返回值
当用户做出选择时,Listbox 仅返回所选项的 索引值,即该选项在列表中的位置(从 0 开始)。这意味着你只能通过索引来识别选中的项。
b、Listbox with key
1)用途
Listbox with Key 用于显示带有 文本和值(Key)对 的列表。在这种情况下,每一项都不仅包含 显示的文本,还包含与之关联的 键值(Key)。用户选择一个文本项时,系统返回的是这个项的 键值(而不是索引)。
2)显示内容
显示内容与 Listbox 类似,都是文本列表,但每项文本背后都有一个与之关联的键(Key)
3)返回值
当用户选择某一项时,Listbox with Key 返回的是该选项对应的 键值,而不仅仅是索引。这个键值通常是实际存储或用于处理的标识符。
举例:我们在表ZVIA_STU中存有学生信息,现在依据学生性别属性做下拉框。
2、使用表中的字段作为选项
a、先在变量处声明类型为表的结构体和内表。
先激活!一定要先激活,后面才可以读到数据。

b、在屏幕布局处点击如下图按钮——字典/程序字段窗口。

点击从程序中获取,这里如果获取不到的话,请检查变量定义包含程序有没有激活。

选中对应字段点击确认,这里可以看到后面有文本/复选框/单选的选项,我们选择文本。

在需要位置拖选出范围。双击,点击下拉的下拉框,可以看到有Listbox和Listbox with key两种 。我们这里需要的返回值是代表性别的F或者M,所以选择Listbox with key。

完成之后可以看到出现下拉框按钮。因为取的值就是数据库里面的,所以这里不需要再赋值。

3、通过内表给下拉框值
用函数VRM_SET_VALUES
a、设置下拉框应该在屏幕显示之前,所以应该放在PBO中。双击创建模块,具体的实现放在zvia_screen_o01中。

b、具体的代码如下,先定义一个类型为vrm_values的内表和类型为它的结构体。往内表中插入选项,一个值为key一个为对应的text。调用函数 VRM_SET_VALUES 传入参数 id 是屏幕上的输入框对应的名称,如图所示,一定要保持一致才可以关联起来。另一个传入参数是定义的选项内表。

*&---------------------------------------------------------------------*
*& Module SET_SEX_LIST OUTPUT
*&---------------------------------------------------------------------*
*& 设置性别下拉列表 用函数VRM_SET_VALUES
*&---------------------------------------------------------------------*
MODULE set_sex_list OUTPUT.DATA : lt_sex TYPE vrm_values,"函数参数类型ls_sex LIKE LINE OF lt_sex."其中行项目的类型CLEAR lt_sex.ls_sex-key = 'F'."放在数据库的key值ls_sex-text = '女'."描述值APPEND ls_sex TO lt_sex."插入内表ls_sex-key = 'M'."放在数据库的key值ls_sex-text = '男'."描述值APPEND ls_sex TO lt_sex.CALL FUNCTION 'VRM_SET_VALUES'EXPORTINGid = 'GS_STU-SEX' "屏幕上的字段名values = lt_sex."将存放list的内表作为数据传入
ENDMODULE.
显示的效果:

c、后续需要获取其值直接用输入框的名称即可。
三、添加搜索帮助
添加搜索帮助一共有两种方式。
(1)若之间对使用的字段或者创建过专门的搜索帮助,直接使用。
(2)调用函数F4IF_INT_TABLE_VALUE_REQUEST创建搜索帮助。
下面将分别演示怎么使用。
1、使用之前创建过的搜索帮助。
先建一个输入框,双击,在搜索帮助处填写创建过的搜索帮助名。

完成之后会有个小角标。

完成之后可以看到搜索帮助按钮。
2、使用函数创建搜索帮助。
使用PAI中的关键字PROCESS ON VALUE-REQUEST。
FILED后的字段需要和屏幕上对应的字段保持一致。双击创建。放在zvia_screen_i01里。
PROCESS AFTER INPUT.
PROCESS ON VALUE-REQUEST."用于响应搜索帮助的过程 FIELD gv_stu-stuid MODULE zstuid_f4."给学号添加搜索帮助
zvia_screen_i01中调用函数F4IF_INT_TABLE_VALUE_REQUEST。
这里好像有点问题,但是相同的代码在其他屏幕能够实现,在这个屏幕实现不了,要是发现错误麻烦私信我一下。
MODULE zstuid_f4 INPUT.
* 1、得到学生ID的数据 ID 和 NAME *TYPES : BEGIN OF ty_stuid,stuid TYPE zde_via_stuid,stuname TYPE zde_via_stuname,END OF ty_stuid.
* 2、用类型定义一个内表 *DATA : lt_stuid TYPE TABLE OF ty_stuid.
* 3、将所有学生ID,NAME信息查询出来放到内表里,等会函数用 *SELECT stuid stunameFROM zvia_stuINTO TABLE lt_stuid.
* 4、调用函数 F4IF_INT_TABLE_VALUE_REQUEST *CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'EXPORTINGretfield = 'STUID' "显示于屏幕的主字段,内表中的字段value_org = 'S' "必要的 表示数据来源是内表dynpprog = sy-cprog "调用的程序dynpnr = sy-dynnr "调用的屏幕dynprofield = 'GS_STU-STUID' "给屏幕上的哪个字段添加搜索帮助 GV_TRAIN-ZCODEwindow_title = '学生学号的搜索帮助'TABLESvalue_tab = lt_stuid.IF sy-subrc <> 0.MESSAGE e006(zvia_dialog_msg).ENDIF.
ENDMODULE.
四、屏幕跳转
屏幕跳转常和菜单栏里的返回、退出键或者屏幕中的其他查询页面关联。
一般一个屏幕默认的下个屏幕是自己。在屏幕属性处可以看到。可以更改。

1、LEAVE TO SCREEN '屏幕编号'。
LEAVE TO SCREEN '屏幕编号' 用于跳转到指定的屏幕编号。该命令在当前屏幕(Dynpro)上执行后,系统会立即跳转到另一个指定的屏幕。
若是使用 LEAVE TO SCREEN 0.会跳转至当前屏幕序列的第一个屏幕。
2、SET SCREEN '屏幕编号'. & LEAVE SCREEN。
SET SCREEN 用于设置目标屏幕的编号,但不会立即跳转。LEAVE SCREEN 用来离开当前屏幕并跳转到目标屏幕。通常,这两个命令一起使用,先使用 SET SCREEN 设置目标屏幕,再用 LEAVE SCREEN 执行跳转。两者一起使用相当于LEAVE TO SCREEN '屏幕编号'。
因为默认下一个屏幕是自己,若不使用SET SCREEN,只使用LEAVE SCREEN会跳转至当前屏幕(无任何输入的初始状态),也可以直接在屏幕属性处进行更改。
3、CALL SCREEN '屏幕编号'。
CALL SCREEN 用于显示指定的屏幕编号,且会在当前屏幕的上下文中启动目标屏幕。调用后,立即跳转至目标屏幕,控制会传递到目标屏幕,且该屏幕被视为一个嵌套屏幕(Subscreen)。
使用CALL SCREEN时会开启一个新的屏幕序列,而同时存在的屏幕序列是有限制的,所以一般不建议使用。
4、LEAVE PROGRAM。
LEAVE PROGRAM 用于退出当前的程序(或事务)。它不仅会结束当前屏幕,也会结束整个 ABAP 程序的执行,通常会回到 SAP GUI 或返回到上一个程序或事务。
5、CALL TRANSACTION '事务码'。
CALL TRANSACTION 允许你在当前程序中启动另一个事务,跳转至该事务码的界面。这与屏幕跳转不同,它是在后台启动另一个事务的处理,并将控制权交给新事务。
6、CALL DIALOG '对话框'。
CALL DIALOG 用于调用一个对话框(如一个自定义的弹出窗口)。它并不是标准的屏幕跳转,而是显示一个对话框作为弹出窗口,可以在当前屏幕的上下文中执行额外的操作。
7、在代码中的实现。
比如在菜单栏我们需要进行返回的时候。这里第三个按钮对应的功能码的实现。

相关文章:
ABAP DIALOG屏幕编程2
在上一篇博客ABAP DIALOG屏幕编程1中阐述了DIALOG、PBO、PAI的概念并且对常用页面元素怎么用进行了演示。在这一篇博文中会讲述怎么添加下拉框、搜索帮助,怎么创建表控件、屏幕跳转等。会用到上一篇里面的内容。 有关程序包含文件结构如下。 一、响应用户指令 如上…...
获取缓存大小与清除 Web 缓存 - 鸿蒙 HarmonyOS Next
针对浏览器 Web 组件清除缓存相关,具体实现如下 code 实例所示: /*公共方法类*/ export class PublicUtils {/*获取缓存大小*/static async getCacheSize(): Promise<number> {try {let bundleStats await storageStatistics.getCurrentBundleStats()let size bundleS…...
在Unreal Engine中,UHT与反射机制
UHT(Unreal Header Tool) 是虚幻引擎(Unreal Engine)中的一个重要工具,它用于处理和生成引擎所需的元数据,使得虚幻引擎能够执行许多复杂的功能,如反射、序列化、蓝图交互、垃圾回收等。简而言之…...
SQL项目实战与综合应用——项目设计与需求分析
项目设计与需求分析是软件开发过程中的核心环节,尤其在涉及数据库的应用时,良好的设计将直接影响到项目的可扩展性、性能和维护性。本文将深入探讨数据库设计的最佳实践,结合 C 与 SQL 的实际应用场景,涵盖项目需求收集、数据库设…...
分布式中的CAP定理和BASE理论与强弱一致性
分布式中的CAP定理和BASE理论与强弱一致性 CAP定理 CAP定理,也称为布鲁尔定理(Brewer’s Theorem),是由加州大学伯克利分校的Eric Brewer教授在2000年提出的,并由麻省理工学院的Seth Gilbert和Nancy Lynch于2002年正…...
C/C++常见符号与运算符
C/C常见符号与运算符对照表 符号用法与意义与Java类比:在条件运算符中 (cond ? x : y) 表示条件为假的分支;在 switch-case 中如 case 1:表示标签结束点;在自定义标签如 label: 中用于 goto 跳转Java中? :三元运算相同;switch-case中也有:…...
了解 k8s 网络基础知识
了解 Docker 网络模式 在使用 Docker run 创建 Docker 容器时,可以使用 --net 选项指定容器的网络模式,Docker 可以有4种网络模式。 host 模式。–nethost 指定和宿主机共用一个 NetWork Namespace,容器中的网络环境(ip 地址、路…...
用户信息界面按钮禁用+发送消息功能
用户信息界面按钮禁用发送消息功能 前言 那么在上一集我们就完成了个人信息窗口所有的内容的修改,那么我们就需要进一步来看我们别的用户的信息界面的窗口。 需求分析 在之前的我们也讲了用户信息界面窗口一共有下图几种组件。 用户头像、用户id、用户昵称、用户…...
接近开关传感器-PCB线图电感式传感器【衰减系数1】
设计和工作原理 衰减系数为1的传感器是在电感式接近开关的基础上装备了特殊的振荡器。传感器内部有两个耦合空心线圈,能够保证根据不同的金属特性作合适的检测调整。无需考虑目标物是不同的金属,因为传感器能在同一感应距离下检测所有金属。 衰减系数为…...
C/C++流星雨
系列文章 序号直达链接1C/C爱心代码2C/C跳动的爱心3C/C李峋同款跳动的爱心代码4C/C满屏飘字表白代码5C/C大雪纷飞代码6C/C烟花代码7C/C黑客帝国同款字母雨8C/C樱花树代码9C/C奥特曼代码10C/C精美圣诞树11C/C俄罗斯方块12C/C贪吃蛇13C/C孤单又灿烂的神-鬼怪14C/C闪烁的爱心15C/C…...
计算机网络:传输层、应用层、网络安全、视频/音频/无线网络、下一代因特网
目录 (五)传输层 1.传输层寻址与端口 2.无连接服务与面向连接服务 3. 传输连接的建立与释放 4. UDP 的优点 5. UDP 和 TCP 报文段报头格式 6. TCP 的流量控制 7.TCP 的拥塞控制 8. TCP 传送连接的管理 &#…...
[漏洞挖掘与防护] 05.CVE-2018-12613:phpMyAdmin 4.8.1后台文件包含缺陷复现及防御措施
这是作者新开的一个专栏——“漏洞挖掘与防护”,前期会复现各种经典和最新漏洞,并总结防护技巧;后期尝试从零学习漏洞挖掘技术,包括Web漏洞和二进制及IOT相关漏洞,以及Fuzzing技术。新的征程,新的开启,漫漫长征路,偏向虎山行。享受过程,感谢您的陪伴,一起加油~ 欢迎关…...
GroundingDINO微调训练_训练日志解释
文章目录 1. 训练日志1. Epoch 和 Iteration2. Learning Rate(学习率)3. ETA(预计剩余时间)4. Time 和 Data Time5. Memory6. Gradient Norm(梯度范数)7. Loss(损失)8. Individual L…...
【0362】Postgres内核 XLogReaderState readBuf 有完整 XLOG page header 信息 ? ( 7 )
上一篇: 【0361】Postgres内核 page_read 读取所请求数据长度(至少 short page header)( 6 ) 文章目录 1. 检查 page_read 返回值 readLen2. 根据 readBuf 计算 XLogPageHeader 大小2.1 验证 XLOG Page header2.2 更新 XLogReaderState 读取状态信息1. 检查 page_read 返回…...
H5接入Steam 获取用户数据案例 使用 OpenID 登录绑定公司APP账户 steam公开用户信息获取 steam webapi文档使用
官方文档地址 1.注册 Steam API Key: 你需要一个 Steam Web API Key,可以在 Steam API Key 页面 获取。https://steamcommunity.com/dev/apikey 这里开发做demo用自己steam账户的就好,后续上线要用公司的账户 2.使用 OpenID 登录ÿ…...
pytorch多GPU训练教程
pytorch多GPU训练教程 文章目录 pytorch多GPU训练教程1. Torch 的两种并行化模型封装1.1 DataParallel1.2 DistributedDataParallel 2. 多GPU训练的三种架构组织方式2.2 数据不拆分,模型拆分(Model Parallelism)2.3 数据拆分,模型…...
力扣--LCR 178.训练计划VI
题目 教学过程中,教练示范一次,学员跟做三次。该过程被混乱剪辑后,记录于数组 actions,其中 actions[i] 表示做出该动作的人员编号。请返回教练的编号。 示例 1: 输入:actions [5, 7, 5, 5] 输出&#…...
Linux 网络接口配置
在 Linux 中,网络接口配置文件用于控制系统中的软件网络接口,并通过接口实现对网络设备的控制。当系统启动时,系统通过这些接口配置文件决定启动哪些接口,以及如此对这些接口进行配置. 在 Linux 中,网络接口配置文件用于控制系统中的软件网络接口,并通过这些接口实现对网络…...
【从零开始入门unity游戏开发之——C#篇01】理论开篇
文章目录 前言前置条件什么是编程?什么是代码?什么是编程语言?常见的编程语言什么是C#?学习Unity为什么要先学习C#?选择适合自己的IDE集成开发环境VSCode安装和环境配置VSCode调试模式专栏推荐完结 前言 这个系列我想…...
ABAP开发-批量导入BAPI和BDC_1
系列文章目录 文章目录 系列文章目录[TOC](文章目录) 前言一、概念二、BDC和BAPI数据导入1、BDC数据导入(录屏)2、BAPI数据导入 三、实例1、BAPI2、BDC 总结 前言 一、概念 SAP中,对一个事务码反复操作并且达到批量处理数据的效果࿰…...
SAP ABAP开发必看:FOR ALL ENTRIES性能翻倍的隐藏参数rsdb/max_blocking_factor实战调优
SAP ABAP性能调优实战:FOR ALL ENTRIES参数优化全解析 当你在ABAP开发中处理百万级数据时,是否遇到过这样的场景:明明使用了FOR ALL ENTRIES语句,程序却像蜗牛一样缓慢?这背后隐藏着一个关键参数——rsdb/max_blocking…...
别再用重启就丢数据的流量统计了!OpenWrt上nlbwmon的持久化配置与性能优化全攻略
OpenWrt高级流量监控:nlbwmon持久化配置与性能优化实战 每次重启路由器后流量统计归零?图表加载慢到怀疑人生?这些问题困扰着许多OpenWrt用户。本文将带你深入解决nlbwmon的两大核心痛点——数据持久化和界面响应速度,打造一个真正…...
JS 侦探社:如何精准判断一个对象是不是数组?
🕵️♂️ JS 侦探社:如何精准判断一个对象是不是数组? 🤔 为什么判断数组这么难? 在 JavaScript 中,数组本质上也是一种对象。 console.log(typeof []); // "object" console.log(typeof {}…...
从零到精通Gemini Deep Research:手把手带跑通生物医药/法律/金融三大垂直领域真实案例
更多请点击: https://intelliparadigm.com 第一章:Gemini Deep Research功能概览与核心价值 Gemini Deep Research 是 Google 推出的面向专业研究者的增强型推理能力模块,专为处理长上下文、跨文档溯源、多跳逻辑推演与学术可信验证而设计。…...
浏览器扩展开发实战:深入解析Markdown Viewer架构设计与实现
浏览器扩展开发实战:深入解析Markdown Viewer架构设计与实现 【免费下载链接】markdown-viewer Markdown Viewer / Browser Extension 项目地址: https://gitcode.com/gh_mirrors/ma/markdown-viewer 在现代Web开发工作流中,Markdown文档的即时预…...
2026年5月AI编程工具最新横评
摘要本文基于2026年4-5月AtomGit开源社区、SegmentFault等平台的最新实测数据,覆盖当前市占率最高的5款主流AI编程工具,从功能、价格、适用场景三个维度拆解优劣,不管你是学生、职场开发者还是独立开发者,都能直接抄作业选到最适合…...
玩转Proteus虚拟仪器与图表仿真:用示波器、逻辑分析仪调试数字电路的完整指南
玩转Proteus虚拟仪器与图表仿真:用示波器、逻辑分析仪调试数字电路的完整指南 在数字电路设计领域,仿真验证环节往往决定着项目的成败。传统面包板调试需要反复焊接元器件、连接示波器探头,而一个简单的接线错误就可能导致数小时的排查。Prot…...
5个关键技巧:让魔兽争霸III在现代Windows系统流畅运行
5个关键技巧:让魔兽争霸III在现代Windows系统流畅运行 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 还在为魔兽争霸III在Windows 10/11上…...
从仿真到实践:三相SPWM并网逆变器的电流环PI参数整定心得(附PSIM波形分析)
从仿真到实践:三相SPWM并网逆变器的电流环PI参数整定实战解析 当你在PSIM中完成开环逆变器仿真后,看着屏幕上完美的SPWM波形,可能会产生一种错觉——并网控制的核心难题已经解决。直到你第一次尝试加入电流环控制,才发现真正的挑战…...
Win10/Win11网络适配器‘罢工’终极排查指南:从驱动、服务到协议栈的完整修复流程
Win10/Win11网络适配器深度修复指南:从驱动到协议栈的全面诊断 当你的Windows设备突然无法联网,只剩下孤零零的飞行模式图标时,那种焦虑感每个IT从业者都深有体会。上周我的主力开发机就遭遇了这样的"罢工"事件——所有网络连接突然…...


