ABAP 中的消息简介
原文链接:An Introduction to Messages in ABAP
简要的历史
ABAP 中的消息和所有其他编程语言一样,用于向程序员或用户描述代码执行过程中发生的事情。它们最早是作为对话信息被发明的,用于显示简短的信息,并在经典的 dynpro 处理过程中处理不正确的用户输入。 在这里,一个异常情况通常需要直接向用户输出信息。作为一个很好的例子,人们可以运行 ABAP 文档的 dynpro 输入检查。这显示了 ABAP 中最古老的消息指令方式。它通过强迫用户在字段中输入某些值来注意输入是否正确。让我们仔细看一下这段代码的一部分:
IF input1 < 50.
MESSAGE e888(sabapdemos) WITH text-001 '50' text-002.
ENDIF.
运行程序后,按 Enter 键,您会收到以下形式的通知:
这条信息提醒用户输入正确的金额,并以此来满足信息的要求,这是最基本的。
在早期的 ABAP 世界中,一切都采用对话式编程。然而,后来消息传递的概念被用于其他情况,如有针对性的程序终止或处理异常。
在异常类被引入之前,人们可以通过一般的异常 "error_message "将函数模块中的错误信息作为带文本的异常进行处理。这种非类的异常也可以在函数模块以及类的定义中通过定义一个异常并’提高’它来处理。
后来,人们要求将对象与消息联系起来,并使用语句 MESSAGE
来显示它们。这主要是针对异常类的异常文本。当异常类的概念被定义后,主要的问题是,如何将消息与类联系起来。这就是系统接口IF_T100_MESSAGE
和 IF_T100_DYN_MSG
出现的原因,它们可以连接到类,使类成为消息的载体。然而,由于双重指示,这造成了复杂性。
IF_T100_MESSAGE
和 IF_T100_DYN_MSG
对象,特别是异常对象,也可以成为任何消息的载体。这允许将 "旧 "的异常变成新的异常。然后,整个语法只用来把被 MESSAGE
填入的系统字段的内容弄到类的属性中。在下文中,我试图更详细地解释这一切。所以,如果你也很想知道消息传递在 ABAP 中是如何发展的,请接着往下看。
从 ABAP 中的消息开始
消息是使用消息维护(事务 SE91
)创建的文本,并存储在系统表 T100
中。在 ABAP 程序中,语句 MESSAGE
是使用消息的主要元素。它是比较古老的,是为了处理对话错误而发明的。在其基本形式中,该语句通过指定消息类型和后续程序行为来发送消息。也可以通过定义显示类型来确定消息必须如何在显示屏上显示。消息类型总是与上下文有关。
对于语句 MESSAGE
的基本形式,消息类型定义了消息的显示方式,决定了后续的程序流程。有效的消息类型有 A
、E
、I
、S
、W
和 X
。这些缩写代表终止(中止)消息、错误消息、信息消息、状态消息、警告和退出消息。
如下:
MESSAGE
命令显示由程序开始处 REPORT
语句中指定的消息 ID 定义的消息。 消息 ID 是一个 2 字符代码,用于定义在使用 MESSAGE
命令时程序将访问的 1000 个消息的集合。
消息编号从 000 到 999.与每个数字相关联的消息文本最多为 80 个字符。 调用消息号时,将显示相应的文本。
以下是用于 Message
命令的字符。
信息 | 类型 | 后果 |
---|---|---|
E | Error | 消息出现,应用程序在当前点暂停。 如果程序在后台模式下运行,则作业将被取消,并且消息将记录在作业日志中。 |
W | Warning | 将出现该消息,用户必须按 Enter 键才能继续应用程序。 在后台模式下,消息将记录在作业日志中。 |
I | Information | 将打开一个弹出窗口,其中包含消息文本,用户必须按Enter键才能继续。 在后台模式下,消息将记录在作业日志中。 |
A | Abend | 此消息类将取消用户当前正在使用的事务。 |
S | Success | 这会在屏幕底部提供一条信息性消息。 显示的信息是正性的,它只是为用户反馈。 该消息不以任何方式阻碍程序。 |
X | Abort | 此消息中止程序并生成 ABAP 短转储。 |
错误消息通常用于阻止用户做不应该做的事情。 警告消息通常用于提醒用户他们的行动的后果。 信息消息给用户有用的信息。
您主要可以通过两种方式向程序添加消息。通过在程序中硬编码消息文本或使用消息类。更准确地说,前者就像在程序中使用消息格式发送任何类型的文本。在这种情况下,在程序中编码消息之前不需要定义。
如果使用消息类别,则从使用 MESSAGE-ID
定义的消息类别(简称为 id)显示消息。消息编号范围从 000 到 999(即 1000 条消息)。每条消息与消息编号和消息长度相关,最多可达 80 个字符。
最初,人们可以使用以下语法发送静态消息:
…MESSAGE tn(id) …
从数据库表 T100
中指定一条消息,其中 t 和 n 连续用作单字符消息类型和三位数消息编号。在静态长格式中,消息类别是使用 id 直接在括号中指定的。
例 1
将消息类别 ZCL_MSG_DEMO
中编号为 001 的消息的短文本显示为信息消息。首先,我们创建一个消息类:
现在我们定义消息 000:
将代码写为:
MESSAGE i000(ZCL_MSG_DEMO).
您可以在程序开始时一次性给出消息 ID。所以,语法可以更短!
REPORT ZBLOG MESSAGE-ID ZCL_MSG_DEMO.
MESSAGE i000.
如前所述,发送消息后的实际系统行为高度依赖于上下文。当前版本的 ABAP 关键字文档包含不同上下文中不同消息类型(例如对话框处理、后台处理、RFC 期间和 HTTP 请求处理期间)所造成的影响的详细列表。
例如,在列表处理的情况下,这样的消息将终止程序。
REPORT ZBLOG MESSAGE-ID ZCL_MSG_DEMO.
START-OF-SELECTION.
MESSAGE e003.
另外,在列表处理中,W 类型的信息在进一步的上下文处理之前总是被转换为 E 类型。所以,这样的警告也会终止程序!
现在,如果我们把它改成对话处理,行为就会改变,这取决于发送消息的对话模块或事件块:
REPORT zblog MESSAGE-ID zcl_msg_demo.
PARAMETERS p.
AT SELECTION-SCREEN.
IF p IS INITIAL.
MESSAGE e003.
ENDIF.
错误消息将会出现,直到满足条件。
这就是消息控制对话的方式。由于除了对话处理之外总是存在其他上下文,因此 SAP 必须发明方法来处理此类情况。因此,定义了其他消息类型。
消息的动态形式
稍后介绍消息的动态形式为:
MESSAGE ID mid TYPE mtype NUMBER num.
消息类别、消息类型和消息编号被指定为数据对象 mid
、mtype
和 num
的内容。 mid
和 mtype
需要类似字符的数据对象,其中必须包含大写字母的消息类或消息类型。无效的消息类型会引发无法捕获的异常。 num
需要一个类型为 n 且长度为 3 的数据对象。在我们的例子中,它们将是:
DATA: mid TYPE sy-msgid VALUE 'ZCL_MSG_DEMO',
mtype TYPE sy-msgty VALUE 'I',
num TYPE sy-msgno VALUE '000'.
动态形式和静态形式的消息传递之间的最大区别在于,在动态形式中,您可以在消息语句中使用变量,例如:
DATA(class) = 'ZCL_MSG_DEMO' .
MESSAGE id class TYPE 'I' NUMBER '001'.
但这种事情在静态形式下是不可能的。
当程序中使用消息编号时,将从消息类中检索相应的消息并显示。在此过程中,有关异常文本的信息通过系统字段传递给处理程序。此外,最多可以指定四个操作数。 MESSAGE…WITH
语句用于在程序执行期间传递动态或运行时文本。可选添加 WITH
用于提供消息的占位符。语法是:
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4 DISPLAY LIKE dtype.
此处
系统字段
字段名 | 含义 |
---|---|
sy-msgid | 包含消息发送后的消息类别。 |
sy-msgno | 包含消息发送后的消息编号。 |
sy-msgty | 包含信息类型的标识符,该信息或文本是用它发送的。 |
sy-msgv1 to sy-msgv4 | 消息发送后,按照对象的顺序包含添加 WITH 后指定的数据对象的内容。发送任何文本后,请包含数据对象文本的前 200 个字符。 |
操作数的位置决定替换哪个占位符。例如,操作数 field1、…、field4
的格式化内容按顺序分配给系统字段 sy-msgv1
至 sy-msgv4
。当使用附加 DISPLAY LIKE
时,将显示 dtype
中指定的消息类型的图标,而不是关联的图标。 dtype
需要一个类似字符的数据对象,其中包含大写字母的值“A”、“E”、“I”、“S” 或 “W” 之一。请注意,此附加功能的使用不会影响消息类型确定的行为,而只会影响显示类型。
例 2
在定义的消息类中,我们创建另一个带有三个占位符的消息:
现在您可以将此消息定义为:
START-OF-SELECTION.
MESSAGE id 'ZCL_MSG_DEMO' TYPE 'I' NUMBER '001' WITH 'Eat' 'Drink' 'Rest'.
结果正如预期:
它也可以写成简短的形式:
MESSAGE i001(ZCL_MSG_DEMO) WITH 'Eat' 'Drink' 'Rest'.
添加 INTO
的语句 MESSAGE
将消息的短文本分配给目标字段文本。程序流程不会中断,并且不会进行消息处理。
文本可以是现有的类似字符的变量,也可以是内联声明 DATA(var)
或 FINAL(var)
,其中声明了字符串类型的变量。语法是:
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
INTO DATA(mtext)
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
例 3
在前面的示例中,消息的短文本被分配给使用相应系统字段声明为内联的数据对象 mtext。
MESSAGE ID 'ZCL_MSG_DEMO' TYPE 'I' NUMBER '000'
INTO DATA(mtext)
WITH 'Eat' 'Drink' 'Rest'.
cl_demo_output=>display( mtext ).
如前所述,可以使用消息语法来简单地发送文本。发出此类消息的语法如下:
MESSAGE <message> TYPE <message type>.
<message>
– 80 个字符的用户定义消息。<message type>
——指定消息类型。
例 4
消息编码很简单如下:
* Displaying error Message of type E
MESSAGE 'This is an Error message' TYPE 'E'.
显示为:
在不同的程序和功能要求中,信息的使用会有所不同。程序员应该注意对消息的正确和良好的专业使用。
总结
在这里,我解释了 ABAP 中消息传递的基础知识。在下一篇文章中,我将更详细地介绍基于(非)类的异常和包含消息接口的异常类。所以,敬请期待!
- 点赞
- 收藏
- 关注作者
评论(0)