有关在表表达式中使用Assign语句的问题

2020-08-31 12:30发布

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

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


这里是所有ABAP专家的一个简单问题。
对于以下代码,我应该对ASSIGN关键字使用SY-SUBRC = 0还是对表表达式使用CATCH CX_SY_ITAB_LINE_NOT_FOUND? 不确定其工作原理...感谢您的见解!

"检查是否在BPC主数据昏暗表中找到了员工
ASSIGN [(lc_id)= ]到FIELD-SYMBOL()。

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

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


这里是所有ABAP专家的一个简单问题。
对于以下代码,我应该对ASSIGN关键字使用SY-SUBRC = 0还是对表表达式使用CATCH CX_SY_ITAB_LINE_NOT_FOUND? 不确定其工作原理...感谢您的见解!

"检查是否在BPC主数据昏暗表中找到了员工
ASSIGN [(lc_id)= ]到FIELD-SYMBOL()。
付费偷看设置
发送
6条回答
哎,真难
1楼 · 2020-08-31 13:17.采纳回答

如官方 ASSIGN table_exp TO的ABAP文档所述

在此变体中,语句ASSIGN设置返回码sy-subrc。

  • 如果找到指定的行,则sy-subrc设置为0。
  • 如果未找到该行,则sy-subrc设置为4,除非在已排序表的二进制搜索中到达表的末尾。 在这种情况下,sy-subrc设置为8。

如果找不到指定的行,则不会引发异常(与表的其他用法不同)

因此,无需使用TRY ... CATCH(除非您更改ASSIGN itab [XXX]的XXX以便引发异常。

>
 DATA(itab)= VALUE string_table()。

 将itab [1]分配给FIELD-SYMBOL()。  "它不需要TRY/CATCH
 未分配sy-subrc <> 0和。

 尝试。
     将itab [1/0]分配给。  "它需要TRY/CATCH
   捕获cx_root INTO DATA(lx)。
 ENDTRY。
 ASSERT lx是cx_sy_zerodivide的实例。
野沐沐
2楼-- · 2020-08-31 13:19

感谢捕获有关细节。 非常感谢!

Climb_Ma
3楼-- · 2020-08-31 13:09

您好肯尼思·默里

< p>在TRY和CATCH Block中使用表达式是一种更好的编码方式。

您还可以使用SY-SUBRC,当您尝试使用字段符号时会出现真正的问题。

< p>如果"字段符号"分配不成功,则当进一步使用"字段"符号时,代码将转储。

使用Try Catch块可以更好地处理异常,以防您使用SY-SUBRC 只需确保SY-SUBRC不为0时就不要再使用该字段符号。

还有另外一个关键字,如下所示,以防您正在寻找选项:

 CHECK <  

此致!

一只江湖小虾
4楼-- · 2020-08-31 13:12

肯尼斯·默里(Kenneth Murray)

是的,如果分配不成功,您将不会获得例外,只有在分配失败的情况下进一步使用分配的字段符号时,才会出现问题 分配。

致谢!

当学会了学习
5楼-- · 2020-08-31 13:12

嗨,肯尼思,

在许多情况下,答案是"取决于"。

原则上,Satish说" TRY-CATCH"更干净是正确的。 但是它也带来很多负担……您必须管理异常,传播,做出反应,以及所有这些爵士乐。 如果您的陈述是在具有例外管理策略的较大环境中,那将是我所采用的方法。

另一方面,如果您仅想快速进行一次成功检查,例如,根据ASSIGN的成功或失败,向左或向右走,请选择SY_SUBRC。 快速,简单且无需托运行李。

希望有帮助,
迈克

SAP砖家
6楼-- · 2020-08-31 12:57

我只想在这里再增加1点,如果您在表表达式(table [number])中使用索引,则可以将其包装起来 用TRY ... CATCH编码,但是如果您要使用组件名称(作为示例)而组件名称错误,那么它将成为不可捕获的异常。 因此,我认为使用组件名称的最佳方法是首先检查组件的存在:

 DATA(ref)= NEW flighttab()。
 将ref-> *分配给FIELD-SYMBOL()。
 选择* FROM sflight进入表@ 。
 "尝试。
 尝试。
     将 [1/0]指定为FIELD-SYMBOL()。
   捕获cx_root。
     BREAK-POINT。
 ENDTRY。
 "倾倒
 尝试。
     将 [('CARRRID')='AA']分配到场符号()。
   捕获cx_root。
     BREAK-POINT。
 ENDTRY。
 

一周热门 更多>