1第三章处理错误和消息概览内容错误处理简介..................................................................................................................................1检查屏幕字段的有效性....................................................................................................................2理解自动字段检查.....................................................................................................................3检查屏幕流逻辑中的字段.........................................................................................................3在ABAP/4中检查字段..............................................................................................................4检查单个字段............................................................................................................................4检查多个字段............................................................................................................................5有条件地调用模块...........................................................................................................................6条件FIELD语句........................................................................................................................6条件CHAIN语句.......................................................................................................................6避免自动字段检查...........................................................................................................................7发布消息...........................................................................................................................................7发送消息.....................................................................................................................................8创建消息类..................................................................................................................................9创建消息.....................................................................................................................................9当用户键入屏幕输入时,事务在使用此输入之前必须检查其是否合法。SAP系统提供了错误处理的特征以尽可能地简化字段检查过程。这些特征包括用于编辑错误处理程序的关键字,以及对话处理运行时间环境方面的因素:自动字段检查(由系统执行)某些字段检查以存储在ABAP/4字典上的信息为基础,由系统自动执行。FIELD和CHAIN语句(在流逻辑语言中)FIELD和CHAIN流逻辑语句允许用户设计自己的字段检查。FIELD和CHAIN告诉系统正在检查哪些字段,以及系统是在流逻辑中进行检查还是调用ABAP/4模块。如果发现错误,则系统为用户输入一错误对话。MESSAGE语句(在ABAP/4中)MESSAGE语句(在ABAP/4中)允许用户从ABAP/4程序中输出消息。ABAP/4程序通过输出错误消息或警告将错误通知系统。相应地,系统为用户输入错误对话。错误对话(由系统执行)系统或ABAP/4模块都可以检测错误。无论是哪种情况,只要发现错误,系统就自动重新显示屏幕并输出消息。错误通常是由于特定字段。重新显示时,引起错误的字段允许输入,而其它所有字段则禁止输入。系统将光标定位于错误字段中,并且要求用户重新输入。然后重复字段检查的过程。有关信息由下列主题提供:错误处理简介(页1)检查屏幕字段的有效性(页2)发布消息(页7)示例事务:检查字段输入(页10)错误处理简介在正常的对话处理过程中,事务逐屏予以处理。然而,如果出现错误,则系统重新显示出错的屏幕。同时显示一则消息,并且,如果错误涉及到字段输入,那么该字段允许输入。(所有其它字段保持固定值。)这对用户怎样?程序如何告诉ABAP/4处理器有必要重新显示?请看错误处理示例事务TZ31。TZ31(开发类SDWA)是用于显示和更新航班信息的小事务。该事务允许系统自动进行字段检查,而且也包含指导其它错误检查的逻辑。2正常情况下,使用事务时,总是输入航空公司和航班标识符并按下ENTER。然后系统以更新模式显示所有字段细节。要作更改,请键入新信息并保存。当输入错误时会发生什么情况?假定未键入所需的信息而只按下ENTER。(其中带“?”的字段是所需的输入字段。)系统自动检查,并向您发送消息:TZ31还检查系统忽略的事情。例如,更新显示时,输入了不存在的机场代码会发生什么情况?程序向您发送消息:在该屏幕上,只能更改机场字段。所有其它输入都是固定的。当更正机场并重新输入时,事务继续其它处理。通过用TZ31测试,将看到进行几种字段检查。一些由系统自动处理,而一些由程序处理:要求输入的字段有输入吗?(自动)“航空公司“和“航班号”字段在屏幕制作器中具有要求输入的属性。系统自动检查这些字段是否从用户获得输入。输入的航空公司存在吗?(自动)在屏幕制作器中,“航空公司”字段声明为表字段SPFLI-CARRID。在字典中,CARRID字段与检查表SCARR有外部关键字关系。结果,系统自动检查SCARR中是否包含所有SPFLI-CARRID的输入。该航空公司的航班号存在吗?(ABAP/4)事务TZ31中的ABAP/4模块(CHECK_FLIGHT)检查为给定航线输入的航班号是否存在。起飞/到达城市:它们存在吗?(自动)“起飞城市”字段(SPFLI-CITYFROM)是检查表SGEOCITY的外部关键字。系统自动检查在SGEOCITY表中是否找到该字段的输入。起飞/到达机场:它们存在吗?(ABAP/4)ABAP/4模块检查输入的机场是否存在。该章其余部分讲述如何设计处理错误的程序:检查屏幕字段的有效性(页2)发布消息(页7)关于如何实现事务TZ31的讨论,参见:示例事务:检查字段输入(页10)如果想在系统中使用事务TZ31,请记住,可以使用数据浏览器查找给定航空公司代码的有效航班号。要访问数据浏览器,请进入对象浏览器(在工作台中),然后选择“环境-数据库浏览器-表格目录”。检查屏幕字段的有效性R/3系统提供检查屏幕字段的各种方法:由系统执行的自动字段检查当适合进行自动字段检查时,使用它最容易。系统在存储于ABAP/4字典的字段信息的基础上进行检查。在屏幕流逻辑中进行的检查可以在屏幕的流逻辑中指定某些字段检查。使用流逻辑语句FIELD...VALUES...来完成此操作,该语句指定屏幕字段的可能值列表。系统甚至不输入ABAP/4模块,而检查这些值的屏幕字段输入。结果,没有任何可用的ABAP/4代码就可以设计并测试屏幕。在ABAP/4中进行检查当自动字段检查和FIELD...VALUES...流逻辑语句不够灵活时,可以编码ABAP/4模块以执行字段检查。要触发该模块的调用,则可以在屏幕流逻辑中编码FIELD...MODULE...流逻辑语句。3详细信息,参见下列主题:理解自动字段检查(页3)检查屏幕流逻辑中的字段(页3)在ABAP/4中检查字段(页4)理解自动字段检查系统在屏幕字段中自动执行某些有效性检查。在用户输入之后和PAI处理开始之前执行这些检查。执行的自动检查类型如下:要求的输入在屏幕制作器中,可以设置字段的要求输入(“要求输入”)属性。完成此操作之后,系统就要求用户在输入PAI处理之前对该字段作相应的输入。正确数据格式在屏幕制作器中,每个字段都有数据格式。该格式限制了有效输入的种类。例如,DATS字段(日期字段)是格式为YYYYMMDD的8字符的字符串。所有字符都必须是数字。子字符串MM和DD必须分别小于或等于12和31。对于输入的给定月值,系统还检查日值是否有效。当用户输入不符合数据格式要求的值时,系统重新显示屏幕直到更正输入为止。字段的有效值在词典中,有两种方式将字段值限制到允许的集合中。字段可以与其它表存在外部关键字关系,或者它的域可为该字段指定固定值列表。对外部关键字字段,系统检查在相关检查表中能否找到用户的输入值。对具有已定义固定值列表的字段,系统确保用户的输入值在列表中。对外部关键字,可以用该字段存储预定义的错误消息。如果字段的有效性测试失败,那么,系统重新显示屏幕并要求用户更改输入。一旦重新输入,则将重复自动检查用户在其中输入新值的字段。要扩展自动字段检查,可以定义自己的字段检查。具体操作,参见:检查单个字段(页4)检查多个字段(页5)有时想要编码处理(应在系统执行任何自动检查之前进行)。该过程通常处理退出请求。(例如,当用户要从事务中返回时,则无须在所需字段中输入值。)要编码应在系统执行自动字段检查之前执行的逻辑,请使用流逻辑命令MODULE...ATEXIT-COMMAND。详细信息,参见避免自动字段检查(页7)。检查屏幕流逻辑中的字段用FIELD...VALUES流逻辑语句检查屏幕流逻辑中的字段值。使用该语句,指定了可能值列表,而系统则将字段输入与该列表进行对比。该语句的语法如下:FIELDscreenfieldVALUES(value-list)value-list可以包括单个值或值区间。所有值用单引号封闭。例如:FIELDSBOOK-CARRIDVALUES('AA','LH','US').FIELDSBOOK-CONNIDVALUES(BETWEEN'1'AND'10',NOT'3').如果用户输入的值不等于列表中的值(或不在指定区间内),则系统重新显示屏幕要求新输入。下表显示