首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >捕捉SAPSQL_DATA_LOSS

捕捉SAPSQL_DATA_LOSS
EN

Stack Overflow用户
提问于 2019-03-07 11:34:10
回答 2查看 4.2K关注 0票数 2

我想在我的ABAP代码中捕获和处理SAPSQL_DATA_LOSS

我试过这个:

代码语言:javascript
复制
  try. 
    SELECT *
      FROM (rtab_name) AS rtab
      WHERE (sub_condition)
      into table @<sub_result>
   .

  catch SAPSQL_DATA_LOSS into error.
    ...
  endtry.

但上述代码无效。我收到这样的信息:

输入"SAPSQL_DATA_LOSS“无效

我试过这个:

代码语言:javascript
复制
  catch SYSTEM-EXCEPTIONS SAPSQL_DATA_LOSS = 123.
    SELECT *
      ...
    .
  endcatch.

  if sy-subrc = 123.
      ...
  endif.

但是上面的代码给了我:

而不是"SAPSQL_DATA_LOSS“预期的”系统例外“(由我从德文翻译成英文)

如何捕捉SAPSQL_DATA_LOSS

这个问题不是关于“为什么会出现这种例外?”。这个问题已经解决了。我的代码应该处理异常。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-03-07 13:04:12

SAPSQL_DATA_LOSS是一个运行时错误。

由于SAPSQL_DATA_LOSS不是一个基于类的异常,所以不可能使用try catch捕获它。

由于SAPSQL_DATA_LOSS不是一个可捕获的运行时错误,因此不可能使用try catch SYSTEM-EXCEPTIONS捕获它。

请参阅下面的可捕获运行时错误。

htm/7.51/en-US/abenueb-abfb-sysexc.htm

票数 6
EN

Stack Overflow用户

发布于 2019-03-11 16:09:28

经过几次尝试,我可以给你一个可能的解决方案。

这是一个解决办法:

我不知道它是否可以应用于您的情况,因为它需要select语句被包装到一个RFC函数模块中!

要点是可以在RFC调用中处理短转储(消息类型X)。

因此,使用RFC (例如CALL FUNCTION 'xxxxx' destination 'NONE')和使用特殊的异常SYSTEM_FAILURE,系统不会终止调用程序,而是返回包含系统消息字段(SY-MSGxx)中的短转储信息的SY-SUBRC > 0

步骤

使用select语句输入+结果表的行类型创建函数模块(RFC已启用)。(通过值传递的所有参数)

您需要最后一个参数,因为不能在RFC中传递泛型表(不允许“键入任何表”)。

代码语言:javascript
复制
FUNCTION Z_DYN_SEL .
*"----------------------------------------------------------------------
*"*"Local interface:
*"  IMPORTING
*"     VALUE(RTAB_NAME) TYPE  TABNAME16
*"     VALUE(SUB_CONDITION) TYPE  STRING
*"     VALUE(RESULT_TYPE) TYPE  STRING
*"----------------------------------------------------------------------

* RTAB_NAME: DB Table
* SUB_CONDITION: WHERE Condition
* RESULT_TYPE: The ROW type of the internal table

field-symbols <sub_result> type any table.

* DEFINE LOCAL DYNAMIC TABLE TO STORE THE RESULT
data: lr_res type ref to data.
create data lr_res type standard table of (result_type).
assign lr_res->* to <sub_result>.

* DYNAMIC SELECT
select *
  from (rtab_name) as rtab
 where (sub_condition)
  into table @<sub_result>.

* EXPORT RESULT TO A MEMORY ID, SO IT CAN BE RETRIEVED BY CALLER
export res = <sub_result> to memory id 'RES'.

主程序:,在这个调用者示例中,一些参数被传递给RFC。

KTOKD字段(应该是4个字符长)以char10值传递(产生短转储)。

如果在函数中触发了任何转储,我们现在可以处理它。

如果一切顺利,IMPORT结果来自RFC内的EXPORT语句。

代码语言:javascript
复制
field-symbols <sub_result> type any table.
data: lr_res type ref to data.
create data lr_res type standard table of KNA1.
assign lr_res->* to <sub_result>.

data lv_msg type char255.

call function 'Z_DYN_SEL' destination 'NONE'
exporting
  rtab_name           = 'KNA1'
  sub_condition       = `KTOKD = 'D001xxxxxx'`
  result_type         = 'KNA1'
exceptions
  system_failure = 1 message lv_msg.

if sy-subrc = 0.
  import res = <sub_result> from memory id 'RES'.
else.
  write: / lv_msg.
  write : / sy-msgid, sy-msgno, sy-msgty, sy-msgv1, sy-msgv2, sy-msgv3, sy-msgv4.
endif.

结果

在select语句中出现短转储的情况下,RFC调用之后,程序不会终止,下面的信息是可用的

代码语言:javascript
复制
SY-SUBRC = 1

lv_msg是错误文本(数据在复制值时丢失)。

代码语言:javascript
复制
Sy-msgid = 00
Sy-msgno = '341'
Sy-msgty = 'X'
Sy-msgv1 = 'SAPSQL_DATA_LOSS'
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55042812

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档