恒美微站 Logo 恒美微站
  • 首页
  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心
  • 联系我们

040、消息输出MESSAGE语句

  • 首页
  • 资讯中心
  • /
  • 040、消息输出MESSAGE语句

相关资讯

上汽与英飞凌合资布局功率模块,新能源汽车核心部件国产化加速 2026/8/20 11:43:06
KMS_VL_ALL_AIO 激活指南:从第一次运行到批量自动化部署 2026/8/20 11:43:06
039、类型转换与CLEAR/REFRESH 2026/8/20 11:43:06

最新资讯

Axure 汉化终极指南:axure-cn 语言包让 RP 9/10/11 三分钟变全中文
在PCB板上布线时注意事项
5 帧画面,能否讲清一整段视频?video-analyzer 视频内容分析给了答案
你的 finally 为何总抢 return 的风头?——Python try/except/else/finally 的执行顺序与隐秘陷阱
告别杂乱背景:OBS 背景移除插件 obs-backgroundremoval 完整上手指南
9、驱动性能分析与优化--性能数据采集与分析

今日推荐

类模板模板参数的全部使用场景
多态的理解,虚函数表的理解
C++ 类编译器自动生成的默认函数 | 拷贝构造函数 vs 拷贝赋值运算符(赋值构造)

本周热门

【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码
【双层规划,节点出清价,绿证交易,CVaR方法】两级电力市场环境下计及风险的省间交易商最优购电模型附Matlab代码
隐式mpc+自适应mpc+时变mpc,线性时变模型预测控制附Simulink仿真

本月精选

如何用DamaiHelper实现演唱会门票的智能自动化抢购:完整技术解决方案指南
第4篇:59 倍性能差距的索引瓶颈定位——一次教科书级的全表扫描调优
终极歌词批量下载神器:5分钟解决离线音乐库歌词同步难题

040、消息输出MESSAGE语句

发布时间:2026/8/20 11:43:06
040、消息输出MESSAGE语句 040、消息输出MESSAGE语句从一次现场问题说起。用户操作某个事务代码输入一笔单据后回车屏幕闪了一下就没了什么提示都没看到。手工重跑发现程序应该报“XX不存在”的错误但界面上干干净净。打开代码一看那处校验用的不是MESSAGE语句而是用WRITE直接打了一行红字然后……这是另一个坑。真正的问题是程序里在LSMESSAGE里塞了一堆然后用MESSAGE ... TYPE E显示但为什么没弹出来后来发现那个MESSAGE语句写在了一个更新函数里更新任务中的MESSAGE被限制错误直接被吞掉。这类问题遇到多了就明白MESSAGE不只是“弹个窗”那么简单。这篇文章就把MESSAGE语句的常见玩法、坑、和调试心得记录下来。MESSAGE语句的本质是把消息放到消息存储中然后根据类型和调用环境决定去向。最简单的用法MESSAGE 你好 TYPE I。TYPE直接指定消息类别I是弹窗E是错误中断W是警告S是成功A是终止X是短转储。工作中E和S用得最多。MESSAGE 保存成功 TYPE S。这条语句在报表里运行时成功消息会显示在状态栏不弹窗程序继续往后走。但如果后续有LIST-OUTPUT之类的可能会被覆盖。所以有时你会看到消息刚出来就被下一页的LIST刷掉了。解决办法是在程序结尾再发消息或者用ALV自带的输出这里有个小技巧如果是普通列表输出可以在发出S消息后加一句WAIT或者干脆把消息放在最后一行输出。别指望S消息能一直留在屏幕上。MESSAGE 余额不足 TYPE E。这条在普通的逻辑里会中断当前事务显示错误对话框“余额不足”然后回滚。但注意如果是在选择屏幕的事件里比如AT SELECTION-SCREENTYPE ‘E’ 不会弹窗而是把消息放到选择屏幕的状态栏并且中止当前事件让用户重新输入。这是它特别的地方。所以很多老程序在AT SELECTION-SCREEN里故意用MESSAGE 输入非法 TYPE E来阻止后续处理。这确实是一个常用模式。为什么说“踩过坑”我见过有人把校验写在START-OF-SELECTION用户点了执行后如果数据不对直接MESSAGE TYPE E然后整个程序就退出了用户回到事务码初始界面输入的数据全没了。这种体验很烂。正确做法是在AT SELECTION-SCREEN里做校验用E消息让用户留在选择屏幕保留输入。别这样写START-OF-SELECTION. IF lv_value IS INITIAL. MESSAGE 值不能为空 TYPE E. ENDIF.这样一报错用户连修正的机会都没有还骂我们程序写得不人性化。要写成AT SELECTION-SCREEN. IF lv_value IS INITIAL. MESSAGE 值不能为空 TYPE E. ENDIF.这时候E消息让选择屏幕重新显示用户看到状态栏的错误提示输入框还在。这算是最基础的一个使用场景。再讲消息类。直接用MESSAGE 文本这叫什么叫自由消息文本直接写在代码里。但生产系统往往用消息类管理。用SE91建一个消息类比如ZMSG_TEST里面定义消息001“数据不存在”然后代码里写MESSAGE ID ZMSG_TEST TYPE E NUMBER 001.也可以使用MESSAGE e001(zmsg_test).老写法。好处是这些消息文本可以翻译成多国语言运维时可以在SE91里改不用动代码。而且消息可以带变量用WITH加参数MESSAGE ID ZMSG_TEST TYPE E NUMBER 002 WITH 客户 lv_kunnr.消息文本写成“1 2 不存在”。这样输出时自动替换。这个在实际项目里很常见。注意WITH和消息文本里的占位符对应关系。消息里的1、2按顺序对应WITH后面的变量。这里也踩过坑有时候占位符是1但变量类型是CHAR长度超过消息文本里的定义显示时会被截断。所以定义消息文本时要预估一下长度。比如字段KUNNR是10位消息里写成“1 2 不存在”替换后没问题。但如果你把一个LONG STRING塞进去显示出来可能很奇怪。MESSAGE语句还影响回滚机制。在SAP的标准流程中TYPE ‘E’ 和 ‘A’ 会触发数据库回滚相当于之前的更新操作被撤销。而TYPE ‘W’ 不会回滚只是提示。TYPE ‘S’ 也不回滚但会在事务结束时清除需要区分。如果你在更新任务中调用了MESSAGE TYPE ‘E’会报“MESSAGE placement”错误因为更新函数中不允许这种操作。实际场景用户做完一个动作数据已经提交然后你试图用MESSAGE TYPE ‘E’ 把错误消息发给用户发现消息丢了。这就是为什么上面提到的现场问题。所以经验是不要在更新模块或RFC中依赖MESSAGE的交互式展示要么改用异常返回要么用返回值传递最后到显示层再MESSAGE。关于消息展示不同TYPE的表现S成功绿色状态栏不打断。I信息弹窗需要用户点“确认”才能继续。注意I类型在后台JOB里不显示会直接写入日志。W警告黄色状态栏通常不中断。但如果在选择屏幕W消息可能被忽略实际是W类型不阻止执行。想阻止用E。E错误中断当前流程回滚。对话式时出现红色错误对话框或状态栏要看上下文。A终止比E更硬直接终止程序显示“终止信息”并且回滚。在调用事务代码时A消息会退回到上一个屏幕实际上A更像“错误终止”。X异常直接生成短转储这是给程序员调试用的别用到用户界面。另外MESSAGE语句还有一个经典用法MESSAGE INTO。用MESSAGE INTO lv_msg可以把消息文本存到变量里不会输出。这个很实用比如你想把一个错误信息写到日志表同时不影响流程。语法MESSAGE ID ZMSG TYPE E NUMBER 001 INTO lv_msg.注意这里的TYPE是什么并不重要重点是“INTO”后消息不再显示而是塞进变量。所以有人用 TYPE ‘E’ 加 INTO 来获取错误文本但不会真的中断。这也是常见技巧。这里有个坑如果消息里有变量INTO得到的文本已经是替换后的完整文本。别再用REPLACE去处理占位符了。调试心得打开系统检查设置消息断点在调试器中停止MESSAGE语句执行有一个功能是breakpoint at message。调试器里可以直接按消息类、消息号断点。这比在代码里设断点更有效因为一个消息语句可能在标准程序里。你可以在调试器“Breakpoint”里选择“Breakpoint at Message”输入消息ID和号码当程序执行到该消息时自动停止。这个技巧救过我一次定位某个报错为什么在某个路径下总是触发用消息断点一下就断住了。MESSAGE语句配合“LEAVE LIST-PROCESSING”或者“SET SCREEN”也可能产生意外表现。比如在PBO/PAI中MESSAGE TYPE ‘E’ 可能不会立即显示而是被系统暂存等用户输入我们要注意。在对话模块PBO/PAI中E消息通常让模块程序重新处理实际上在PAI中MESSAGE TYPE ‘E’ 会使该屏幕的所有用户输入被撤销然后重新显示屏幕消息显示在状态栏。提到“屏幕”就多了。自定义屏幕Screen里经常这样用PROCESS BEFORE OUTPUT. MODULE status_0100. PROCESS AFTER INPUT. MODULE user_command_0100.在user_command模块里如果发现输入不对MESSAGE 输入有误 TYPE E.这个E会中断PAI处理屏幕重新显示用户在字段里输入的内容还在吗默认情况下屏幕字段会自动保留。但如果你在MODULE里对某些字段执行了CLEAR那就没了。所以不要在报错前清理字段。实际中我还遇到过一个问题一个程序里用了MESSAGE xxx TYPE I结果在后台执行时作业直接卡住因为I消息需要用户点击确认而后台根本没有用户。这属于“不把用户交互带到后台”的典型错误。后台作业只能输出S或E后台里S消息写入日志E消息可能导致作业失败实际上如果后台执行到MESSAGE TYPE ‘I’程序会终止并写日志。因为没有人点确认。所以生产环境中写后台报表时要检查是否有I类型的消息否则作业会一直“挂起”直到超时。经验遇到“消息不显示”的问题先判断MESSAGE语句是否真的执行到了。用消息断点或者临时加一条WRITE到屏幕。再判断消息类型是否适合上下文。最后看有没有被其他处理截断。个人建议能不用裸MESSAGE就不用。项目里尽量把消息集中到SE91消息类里编号按业务域划分。消息文本用中文写清楚带参数。这样用户看懂翻译也方便。遇到需要校验的地方优先用E类型在选择屏幕或PAI中处理。对于潜在的业务异常不要用A除非你想直接终止。调试消息相关问题时习惯用“Breakpoint at Message”比一行行看代码效率高。MESSAGE不是简单“输出”它是SAP会话和事务控制的一部分。下篇写“条件判断IF/ENDIF”还是“循环DO/WHILE”到时候再说。

关于恒美微站

恒美微站专注于为个体商户、工作室提供极简自助建站服务,让每个人都能轻松拥有专业网站。

快速链接

  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心

服务项目

  • 可视化建站
  • 拖拽编辑
  • 主题定制
  • SEO 优化
  • 网站托管

联系方式

  • 📍 地址:北京市朝阳区建国路 88 号
  • 📞 电话:400-888-8888
  • ✉️ 邮箱:info@hmyw.cn
  • 🕐 时间:周一至周日 9:00-18:00

© 2024 恒美微站 hmyw.cn 版权所有 | 京 ICP 备 12345678 号