第203章处理错误和消息.docx
《第203章处理错误和消息.docx》由会员分享,可在线阅读,更多相关《第203章处理错误和消息.docx(23页珍藏版)》请在冰点文库上搜索。
第203章处理错误和消息
第三章1处理错误和消息
概览
内容
错误处理简介
检查屏幕字段的有效性
理解自动字段检查
检查屏幕流逻辑中的字段
在ABAP/4中检查字段
检查单个字段
检查多个字段
有条件地调用模块
条件FIELD语句
条件CHAIN语句
避免自动字段检查
发布消息
发送消息
创建消息类
创建消息
当用户键入屏幕输入时,事务在使用此输入之前必须检查其是否合法。
SAP系统提供了错误处理的特征以尽可能地简化字段检查过程。
这些特征包括用于编辑错误处理程序的关键字,以及对话处理运行时间环境方面的因素:
_自动字段检查(由系统执行)
某些字段检查以存储在ABAP/4字典上的信息为基础,由系统自动执行。
_FIELD和CHAIN语句(在流逻辑语言中)
FIELD和CHAIN流逻辑语句允许用户设计自己的字段检查。
FIELD和CHAIN告诉系统正在检查哪些字段,以及系统是在流逻辑中进行检查还是调用ABAP/4模块。
如果发现错误,则系统为用户输入一个错误对话。
_MESSAGE语句(在ABAP/4中)
MESSAGE语句(在ABAP/4中)允许用户从ABAP/4程序中输出消息。
ABAP/4程序通过输出错误消息或警告将错误通知系统。
相应地,系统为用户输入错误对话。
_错误对话(由系统执行)
系统或ABAP/4模块都可以检测错误。
无论是哪种情况,只要发现错误,系统就自动重新显示屏幕并输出消息。
错误通常是由于特定字段。
重新显示时,引起错误的字段允许输入,而其它所有字段则禁止输入。
系统将光标定位于错误字段中,并且要求用户重新输入。
然后重复字段检查的过程。
有关信息由下列主题提供:
错误处理简介(页3–2)
检查屏幕字段的有效性(页3–4)
发布消息(页3–13)
示例事务:
检查字段输入(页3–17)
1错误处理简介
在正常的对话处理过程中,事务逐屏予以处理。
然而,如果出现错误,则系统重新显示出错的屏幕。
同时显示一则消息,并且,如果错误涉及到字段输入,那么该字段允许输入。
(所有其它字段保持固定值。
)这对用户怎样?
程序如何告诉ABAP/4处理器有必要重新显示?
请看错误处理示例事务TZ31。
TZ31(开发类SDWA)是用于显示和更新航班信息的小事务。
该事务允许系统自动进行字段检查,而且也包含指导其它错误检查的逻辑。
正常情况下,使用事务时,总是输入航空公司和航班标识符并按下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模块检查输入的机场是否存在。
该章其余部分讲述如何设计处理错误的程序:
检查屏幕字段的有效性(页3–4)
发布消息(页3–13)
关于如何实现事务TZ31的讨论,参见:
示例事务:
检查字段输入(页3–17)
如果想在系统中使用事务TZ31,请记住,可以使用数据浏览器查找给定航空公司代码的有效航班号。
要访问数据浏览器,请进入对象浏览器(在工作台中),然后选择“环境->数据库浏览器->表格目录”。
2检查屏幕字段的有效性
R/3系统提供检查屏幕字段的各种方法:
_由系统执行的自动字段检查
当适合进行自动字段检查时,使用它最容易。
系统在存储于ABAP/4字典的字段信息的基础上进行检查。
_在屏幕流逻辑中进行的检查
可以在屏幕的流逻辑中指定某些字段检查。
使用流逻辑语句FIELD...VALUES...来完成此操作,该语句指定屏幕字段的可能值列表。
系统甚至不输入ABAP/4模块,而检查这些值的屏幕字段输入。
结果,没有任何可用的ABAP/4代码就可以设计并测试屏幕。
_在ABAP/4中进行检查
当自动字段检查和FIELD...VALUES...流逻辑语句不够灵活时,可以编码ABAP/4模块以执行字段检查。
要触发该模块的调用,则可以在屏幕流逻辑中编码FIELD...MODULE...流逻辑语句。
详细信息,参见下列主题:
理解自动字段检查(页3–5)
检查屏幕流逻辑中的字段(页3–6)
在ABAP/4中检查字段(页3–7)
3理解自动字段检查
系统在屏幕字段中自动执行某些有效性检查。
在用户输入之后和PAI处理开始之前执行这些检查。
执行的自动检查类型如下:
_要求的输入
在屏幕制作器中,可以设置字段的要求输入(“要求输入”)属性。
完成此操作之后,系统就要求用户在输入PAI处理之前对该字段作相应的输入。
_正确数据格式
在屏幕制作器中,每个字段都有数据格式。
该格式限制了有效输入的种类。
例如,DATS字段(日期字段)是格式为YYYYMMDD的8字符的字符串。
所有字符都必须是数字。
子字符串MM和DD必须分别小于或等于12和31。
对于输入的给定月值,系统还检查日值是否有效。
当用户输入不符合数据格式要求的值时,系统重新显示屏幕直到更正输入为止。
_字段的有效值
在词典中,有两种方式将字段值限制到允许的集合中。
字段可以与其它表存在外部关键字关系,或者它的域可为该字段指定固定值列表。
对外部关键字字段,系统检查在相关检查表中能否找到用户的输入值。
对具有已定义固定值列表的字段,系统确保用户的输入值在列表中。
对外部关键字,可以用该字段存储预定义的错误消息。
如果字段的有效性测试失败,那么,系统重新显示屏幕并要求用户更改输入。
一旦重新输入,则将重复自动检查用户在其中输入新值的字段。
要扩展自动字段检查,可以定义自己的字段检查。
具体操作,参见:
检查单个字段(页3–7)
检查多个字段(页3–9)
有时想要编码处理(应在系统执行任何自动检查之前进行)。
该过程通常处理退出请求。
(例如,当用户要从事务中返回时,则无须在所需字段中输入值。
)要编码应在系统执行自动字段检查之前执行的逻辑,请使用流逻辑命令MODULE...ATEXIT-COMMAND。
详细信息,参见避免自动字段检查(页3–12)。
3检查屏幕流逻辑中的字段
用FIELD...VALUES流逻辑语句检查屏幕流逻辑中的字段值。
使用该语句,指定了可能值列表,而系统则将字段输入与该列表进行对比。
该语句的语法如下:
FIELDVALUES()
可以包括单个值或值区间。
所有值用单引号封闭。
例如:
FIELDSBOOK-CARRIDVALUES('AA','LH','US').
FIELDSBOOK-CONNIDVALUES(BETWEEN'1'AND'10',NOT'3').
如果用户输入的值不等于列表中的值(或不在指定区间内),则系统重新显示屏幕要求新输入。
下表显示的所有可能格式。
比较
语法
单值
('')
单值的补集
(NOT'')
几个单值或补集
('','',NOT'')
值区间
(BETWEEN''AND'')
某区间之外的值
(NOTBETWEEN''AND'')
要使用FIELD...VALUES选项,用于比较的字段必须具有数据类型CHAR或NUMC。
还必须记住在单引号中给定的所有值应大写。
4在ABAP/4中检查字段
要在ABAP/4中进行字段检查,请使用FIELD和CHAIN流逻辑语言语句。
FIELD语句的以下形式允许调用进行字段检查的ABAP/4模块:
FIELDMODULE.
FIELD语句可能包含多个MODULE调用:
FIELD:
MODULE,
MODULE.
也可以在FIELD语句中指定多个字段。
当用CHAIN语句链接多个字段检查时,它特别有用。
例如,FIELD语句的以下两种形式都是允许的:
CHAIN.
FIELD.
FIELD.
FIELD:
,,....
MODULE.
MODULE.
ENDCHAIN.
ABAP/4模块发现错误时,就输出错误消息或警告以通知用户。
发布这些消息以提醒系统需要错误对话框。
系统重新显示屏幕,要求用户为出错的字段输入新值。
所有其它字段都不允许输入。
如果找到错误,那么,屏幕就使用CHAIN语句重新显示链中允许输入的所有字段。
有关信息在下列主题中提供:
检查单个字段(页3–7)
检查多个字段(页3–9)
有条件地调用模块(页3–10)
避免自动字段检查(页3–12)
4检查单个字段
FIELD...MODULE流逻辑语句使您将有效性检查与特定屏幕字段联系起来。
FIELD...MODULE触发对检查特定字段的ABAP/4模块的调用,并且一发现错误就发送错误消息。
在这种情况下,系统重新显示屏幕,并禁止输入除指定字段以外的其他所有字段。
要通知系统已发现错误,ABAP/4模块必须输出错误消息(类型E)或警告(类型W)。
例如:
****Screenflowlogic:
****
PROCESSAFTERINPUT.
FIELDSPFLI-AIRPFROM
MODULECHECK_FR_AIRPORT.
****ABAP/4module:
****
MODULECHECK_FR_AIRPORTINPUT.
SELECTSINGLE*FROMSAIRPORT
WHEREID=SPFLI-AIRPFROM.
IFSY-SUBRCNE0.MESSAGEE003WITHSPFLI-AIRPFROM.ENDIF.
ENDMODULE
错误消息导致系统重新显示屏幕并要求用户输入新值。
重新显示时,只有SPFLI-AIRPFROM字段可接纳新的输入。
而其它所有字段则不允许输入。
有关错误消息的详细信息,参见发布消息(页3–13)。
FIELD语句如何传送数据
系统将数据从屏幕传送到ABAP/4程序时,对每个屏幕显示只传送一次。
一般都是在系统已经执行完自动字段检查之后PAI处理开始时才传送。
但是也有例外。
FIELD语句中所提及字段的数据传送被延迟,直到实际执行FIELD语句。
如果屏幕字段出现在多条FIELD语句中,则只在使用该字段的第一条FIELD语句中的传送字段值。
因为在数据从屏幕传送之前不应在ABAP/4模块中使用字段,所以传送时间非常重要。
若此,则ABAP/4字段将包含在用户的屏幕输入之前就已存在的值。
该值可能是上一屏幕保留的值,也可能是无效的值。
在多条FIELD语句中使用某字段
有时需要在多条FIELD语句中指定相同字段。
这使得错误处理更复杂。
当某模块发现错误时,系统重新显示屏幕并用更正的输入重新启动PAI处理。
然而,系统无法用包含该模块的FIELD语句简单地重新启动。
此出错的字段也可能在某条更早的FIELD或CHAIN语句中出现过。
在这种情况下,系统有确定应在何处重新启动处理的专门程序。
详细信息,参见在错误对话框之后重新启动PAI(页3–15)。
5检查多个字段
有时想作为一组检查几个字段。
为此,请在FIELD语句中包含这些字段,并将它们放入CHAIN-ENDCHAIN块中。
在示例事务TZ31中使用了CHAIN语句:
****Screenflowlogic:
****
CHAIN.
FIELD:
SPFLI-CARRID,SPFLI-CONNID.
MODULECHECK_FLIGHT.
ENDCHAIN.
****ABAP/4module:
****
MODULECHECK_FLIGHTINPUT.
SELECTSINGLE*FROMSPFLI
WHERECARRID=SPFLI-CARRID
ANDCONNID=SPFLI-CONNID.
IFSY-SUBRCNE0.
MESSAGEE005WITHSPFLI-CARRIDSPFLI-CONNID.
ENDIF.
*.....
ENDMODULE
在链块中,所有字段相互依赖。
链内发现错误时,会重新显示屏幕,并允许输出链中任何地方发现的字段,但仍不允许输入任何非链字段。
在用户重新输入值(输入到链字段之一)之后,重新启动PAI并将链中的所有语句作为一个单元重新执行。
链可以包括其它任何允许的流逻辑语言语句。
而且,链可以包含多条FIELD语句。
一般情况下,所有FIELD语句应出现在CHAIN块的开始处。
CHAIN.
FIELD:
A,B,C.
FIELD:
D,E,F.
MODULEX.
MODULEY.
ENDCHAIN.
允许将MODULE语句添加到包含在CHAIN块中的FIELD语句中,但这样实际上并没有意义:
CHAIN.
FIELDF1.
FIELD:
F2,F3MODULEm1."(在F3后无周期)
MODULEm2.
ENDCHAIN.
如果模块m发现错误,则在重新显示时它打开所有要输入的链字段,而不只是F2和F3。
只有当使用AT-或ON-条件之一时,用该方式使用FIELD...MODULE才意义。
详细信息,参见条件CHAIN语句(页3–11)。
6有条件地调用模块
可以在模块调用(从屏幕流逻辑)中设置条件。
例如,可以指定某模块只在给定字段具有值(非初始值)时才被调用:
FIELDXMODULECHECK_FIELDXONINPUT.
使用FIELD语句的条件形式,可以防止不必要的模块调用。
尤其当更新表输入时,条件调用可以极大地提高性能。
有关信息在下列主题中提供:
条件FIELD语句(页3–10)
条件CHAIN语句(页3–11)
6条件FIELD语句
添加ON-和AT-条件之后,FIELD...MODULE流逻辑语句就变成了条件语句。
请使用以下条件指定何时应调用模块:
_ONINPUT
只有当字段包含初始值以外的值时,才调用ABAP/4模块。
此初始值由该字段的数据类型决定:
空格对应于字符字段,零对应于数字字段。
如果用户将字段值更改回初始值,则ONINPUT不触发调用。
(与ONREQUEST调用相比,此时它不触发调用。
)
_ONREQUEST
只有自上一屏幕显示以来用户已输入字段值时,才调用ABAP/4模块。
即使用户键入已存在的值,值也象已变化了一样予以记数。
一般地,通过任何形式的“手工输入”都可以触发ONREQUEST条件。
系统将设置字段的下列方式作为手工输入:
-实际用户输入
-SETPARAMETER字段输入(手工和自动两种)
-HOLDDATA字段输入
-用于参数事务的参数输入(CALLTRANSACTION...USING)
-用于定制系统的全局字段(这些为某些字段指定自动设置)
所有这些符合ONREQUEST条件并将触发模块调用。
_ON*-INPUT
如果用户在字段的首字符中已经输入“*”,并且该字段在屏幕制作器中具有属性*-entry,则调用ABAP/4模块。
可以在想只检查某些输入类型的例外情况下使用该选项。
有些条件只适用于FIELD语句,而其它条件则适用于CHAIN块中的FIELD语句。
尤其是,ON-和AT-条件在包含多字段但又未包含在CHAIN块中的FIELD语句中有特殊意义,。
详细信息,参见检查多个字段(页5)。
6条件CHAIN语句
要在条件CHAIN中调用模块,有两个选项:
_ONCHAIN-INPUT
类似于ONINPUT。
如果链中的任一字段包含初始值(空值或零)以外的值,则调用ABAP/4模块。
_ONCHAIN-REQUEST
该条件功能类似于ONREQUEST,但是如果链中的任一字段的值发生更改,则调用ABAP/4模块。
例如:
CHAIN.
FIELD:
A,B,C.
FIELD:
D,E,F.
MODULEXONCHAIN-INPUT.
MODULEY.
ENDCHAIN.
在此,如果字段A、B、C、D、E和F中任何一个具有不同于初始值的值,则调用模块X。
而始终调用模块Y。
如果Y发现错误,则在错误对话期间,重新打开这六个字段并等待输入。
要将条件限制到特定字段,请将MODULE语句连接到相关FIELD语句。
CHAIN.
FIELD:
A,B,CMODULEXONINPUT.
ENDCHAIN.
在该示例子中,只有当列表(C)中的最后字段包含非初始值的值时,才调用模块X。
但是,如果X发现错误,则在错误对话框中重新打开这三个字段(A,B,C)并等待输入。
有时想要的调用只取决于几个字段,而不是其它字段。
为明确起见,将正在使用的链断开并为独立字段组合创建独立链是最简单的。
在每种情况下,都使用ONCHAIN-INPUT或ONCHAIN-REQUEST。
例如:
CHAIN.
FIELD:
A,B,CMODULEXONCHAIN-REQUEST.
ENDCHAIN.
CHAIN.
FIELD:
A,B,D,EMODULEYONCHAIN-REQUEST.
ENDCHAIN.
7避免自动字段检查
在进行自动字段检查之前,有时希望系统执行某种处理逻辑。
例如,如果用户想从屏幕退出,则无须在需要输入的字段中输入数据。
流逻辑关键字ATEXIT-COMMAND在流逻辑中是MODULE语句的特殊附加部分。
ATEXIT-COMMAND允许在系统执行自动字段检查之前调用模块:
****Screenflowlogic:
****
PROCESSAFTERINPUT.
MODULEEXITATEXIT-COMMAND.
要使用ATEXIT-COMMAND,则必须将功能类型E赋给菜单制作器或屏幕制作器中的相关功能。
在屏幕制作器中,调用用于所需按钮的属性,并将属性“FctType”设置为“E”。
在菜单制作器中,选择“转向->功能列表”,然后在“类型”列中为每个应作为退出命令的功能代码输入E。
一旦已经将功能定义为类型E,则在执行任何字段检查之前,可以用ATEXIT-COMMAND选项告诉系统处理所有与该功能相关的ABAP/4模块。
只有当用户激活定义为类型E的功能时,才触发ATEXIT-COMMAND事件。
****ABAP/4module:
****
MODULEEXITINPUT.
CASEOK_CODE.
WHEN'NEW'.
CLEAR:
SPFLI,OK_CODE.
LEAVESCREEN.
WHEN'CANC'.
CLEAROK_CODE.
SETSCREEN0.LEAVESCREEN.
ENDCASE.
ENDMODULE.
正常情况下