在MESSAGE中使用带有IF_T100_MESSAGE和数字变量的异常类的问题

2020-08-25 19:22发布

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


这是在ECC EHP6 ABAP 7.31系统中。 我使用IF_T100_MESSAGE接口创建了一个全局异常类。 此异常类将在将验证选择屏幕字段的本地方法中使用。 这些方法将引发异常(使用此新的异常类),并通过它传递不同的消息ID,编号等,以便可以在选择屏幕上显示适当的错误消息。

数据:screen_error类型参考zcx_sel_screen_error。
 尝试。
 validate_input(...)。
 捕获zcx_sel_screen_error INTO屏幕错误。
 消息screen_error类型" E"。
 ENDTRY。

在validate_input()内,我们调用具有一个或多个参数的另一个本地方法raise_exception,以引发上下文相关消息的异常。 这是引发异常的方式:

 METHODraise_exception。
  DATA error_message类似于if_t100_message => t100key。
 error_message-msgid ='Z ...'。
  error_message-msgno = i_msgno。
  error_message-attr1 = i_text1。
  error_message-attr2 = i_text2。
  error_message-attr3 = i_text3。
  error_message-attr4 = i_text4。
  引发例外类型zcx_sel_screen_error
  正在导出textid = error_message。
 终结法。  " raise_exception 

这很好用,但是当消息文本属性(ATTR1)是数字变量(类型为N或I)时,我遇到了一个奇怪的问题。问题在于消息文本显示的是&号,例如:

如果我直接在MESSAGE命令中使用数字变量,则不会发生这种情况。 一种"强力"方法将是拥有一个中间文本类型变量,并在调用异常方法之前在其中移动数值,但我希望避免这种情况。 (注意:我在方法定义中对ATTTR1 ... 4使用TYPE ANY,因为在接口中使用的类型会导致使用数字变量的语法错误。这部分也不很满意,但这不是主要问题。)

我做错什么了吗,除了"蛮力"解决方案以外,还有其他可行的解决方案吗? 谢谢!

P.S。 在有人建议之前,IF_T100_DYN_MSG在7.31中不存在。

scn.jpg (36.4 kB)

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


这是在ECC EHP6 ABAP 7.31系统中。 我使用IF_T100_MESSAGE接口创建了一个全局异常类。 此异常类将在将验证选择屏幕字段的本地方法中使用。 这些方法将引发异常(使用此新的异常类),并通过它传递不同的消息ID,编号等,以便可以在选择屏幕上显示适当的错误消息。

数据:screen_error类型参考zcx_sel_screen_error。
 尝试。
 validate_input(...)。
 捕获zcx_sel_screen_error INTO屏幕错误。
 消息screen_error类型" E"。
 ENDTRY。

在validate_input()内,我们调用具有一个或多个参数的另一个本地方法raise_exception,以引发上下文相关消息的异常。 这是引发异常的方式:

 METHODraise_exception。
  DATA error_message类似于if_t100_message => t100key。
 error_message-msgid ='Z ...'。
  error_message-msgno = i_msgno。
  error_message-attr1 = i_text1。
  error_message-attr2 = i_text2。
  error_message-attr3 = i_text3。
  error_message-attr4 = i_text4。
  引发例外类型zcx_sel_screen_error
  正在导出textid = error_message。
 终结法。  " raise_exception 

这很好用,但是当消息文本属性(ATTR1)是数字变量(类型为N或I)时,我遇到了一个奇怪的问题。问题在于消息文本显示的是&号,例如:

如果我直接在MESSAGE命令中使用数字变量,则不会发生这种情况。 一种"强力"方法将是拥有一个中间文本类型变量,并在调用异常方法之前在其中移动数值,但我希望避免这种情况。 (注意:我在方法定义中对ATTTR1 ... 4使用TYPE ANY,因为在接口中使用的类型会导致使用数字变量的语法错误。这部分也不很满意,但这不是主要问题。)

我做错什么了吗,除了"蛮力"解决方案以外,还有其他可行的解决方案吗? 谢谢!

P.S。 在有人建议之前,IF_T100_DYN_MSG在7.31中不存在。

scn.jpg (36.4 kB)
付费偷看设置
发送
6条回答
吹牛啤
1楼 · 2020-08-25 20:17.采纳回答

您好,Jelena,

如果系统确定无法将ATTR1-4转换为占位符文本,这似乎是设计使然。 这是帮助中的屏幕截图-看来您必须先进行某种形式的转换,然后才能将消息提升为适当的字符类型,以避免出现此问题。

致谢

Ryan Crosby

南山jay
2楼-- · 2020-08-25 20:21

我知道我使用的是最新的7.52系统,但以防万一,如果您尝试使用此代码(不确定它是否有效),是否会看到"条目23存在(条目正确)"或"条目&23&存在( 项正确)"?

如果它起作用并且您看到第一个,那么您可以比较一下您的案例与本案例的不同之处。

 CLASS lcx_t100定义从 cx_static_check。
   公共部分。
     接口if_t100_message。
     方法构造函数。
     常数:
       开始于zcx_t100,
         msgstr TYPE symsgid VALUE'00',
         msgno TYPE symsgno VALUE'057',
         attr1 TYPE scx_attrname值'AA',
         attr2 TYPE scx_attrname VALUE'',
         attr3 TYPE scx_attrname VALUE'',
         attr4 TYPE scx_attrname VALUE'',
       zcx_t100的结尾。
     数据类型a。
   受保护的部分。
   专用部分。
 ENDCLASS。
 类别lcx_t100实施。
   METHOD构造函数。
     调用方法超级->构造函数。
     清除我-> textid。
     aa ='23'。
     if_t100_message〜t100key = zcx_t100。
   终结法。
 ENDCLASS。
 参数哑元。
 在选择屏幕上。
   DATA(exception)= NEW lcx_t100()。
   MESSAGE异常类型'E'。
小灯塔
3楼-- · 2020-08-25 20:01

我记得遇到了这种问题。 您假设要传递包含消息参数的异常类的属性名称,而不是直接传递参数值本身。

 DATA:textid LIKE if_t100_message => t100key,
       异常类型REF TO zcx_my_error。

 textid-msgid = msgid。
 textid-msgno = msgno。
 textid-attr1 ='PARAMETER1'。
 textid-attr2 ='PARAMETER2'。
 textid-attr3 ='PARAMETER3'。
 textid-attr4 ='PARAMETER4'。

 CREATE OBJECT异常
    出口
       textid = textid。

 异常->参数1 = msgv1。
 exception-> parameter2 = msgv2。
 exception-> parameter3 = msgv3。
 exception-> parameter4 = msgv4。

 RAISE EXCEPTION异常。
 
My梦
4楼-- · 2020-08-25 20:10

Sandra Rossi -感谢您的答复! 我不得不对下行声明行内声明进行一些小改动,然后得到"条目23存在(条目正确)"。 正如Ryan在他(现已接受)的答案中正确指出的那样,我使用参考文献误解了MESSAGE的设计。 ATTR1 ... 4应该是类属性的名称(例如您的示例中的" AA"),而不仅仅是值。 在我的示例中,我只是使用i_text1 = max_orders(max_orders类型为i)来调用raise_exception。 (即使在7.31中,它实际上在文档中也有详细说明,但是谁看了,对吗?:))

无论如何,谢谢! 这很有启发性。

粗暴的香蕉
5楼-- · 2020-08-25 20:18

Jelena Perfiljeva -我也更喜欢避免sy组件,除了消息 相关的(当然还有subrc :-))。 在最近引入语法元素RAISE EXCEPTION ... MESSAGE ...之前,我一直选择以这种方式在OOP上下文中处理消息。 我还没有发现这种形式的任何缺点,但是即使存在交叉引用也可以弥补这一不足。 当用户要求随机调查错误时,我发现使用列表的价值像金币。
但是也许有一天有人会说服我。 :-)

路亽曱_Ryan
6楼-- · 2020-08-25 20:09

谢谢您的回答! 我只能"接受"一个,但这也是正确的。 我应该更仔细地阅读文档。

一周热门 更多>