Поймать SAPSQL_DATA_LOSS - PullRequest
       29

Поймать SAPSQL_DATA_LOSS

2 голосов
/ 07 марта 2019

Я хочу поймать и обработать SAPSQL_DATA_LOSS в моем коде ABAP.

Я пробовал это:

  try. 
    SELECT *
      FROM (rtab_name) AS rtab
      WHERE (sub_condition)
      into table @<sub_result>
   .

  catch SAPSQL_DATA_LOSS into error.
    ...
  endtry.

Но приведенный выше код недействителен. Я получаю это сообщение:

Тип "SAPSQL_DATA_LOSS" недействителен

И я попробовал это:

  catch SYSTEM-EXCEPTIONS SAPSQL_DATA_LOSS = 123.
    SELECT *
      ...
    .
  endcatch.

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

Но приведенный выше код дает мне:

Вместо «SAPSQL_DATA_LOSS» ожидается «системное исключение» (переведено мной с немецкого на английский)

Как поймать SAPSQL_DATA_LOSS?

Этот вопрос не о том, «почему происходит это исключение?». Это уже решено. Мой код должен обрабатывать исключение.

Ответы [ 2 ]

6 голосов
/ 11 марта 2019

После некоторых попыток я могу предложить вам возможное решение.

Это обходной путь:

Я не знаю, может ли это быть применено к вашему случаю, так как для этого нужно добавить оператор select вфункциональный модуль RFC!

Суть в том, что короткий вызов (тип сообщения X) МОЖЕТ быть обработан в вызовах RFC.

Таким образом, используя RFC (например, CALL FUNCTION 'xxxxx' destination 'NONE')) и используя специальное исключение SYSTEM_FAILURE, система не завершает программу вызова, а вместо этого возвращает SY-SUBRC > 0 с информацией о коротком дампе в полях системного сообщения (SY-MSGxx).

ШАГИ

Создайте функциональный модуль (с поддержкой RFC) с помощью ввода оператора select + тип строки таблицы результатов.(Все параметры передаются по значению)

Вам нужен этот последний параметр, так как общие таблицы не могут быть переданы в RFC (нельзя использовать «TYPE ANY TABLE»)

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 будет получено из оператора EXPORT внутри RFC

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.

РЕЗУЛЬТАТЫ

После вызова RFC в случае короткого дампа в операторе выбора программа не завершается и доступны следующие фрагменты информации

SY-SUBRC = 1

lv_msg - текст ошибки (данные были потеряны при копировании значения.)

Sy-msgid = 00
Sy-msgno = '341'
Sy-msgty = 'X'
Sy-msgv1 = 'SAPSQL_DATA_LOSS'
6 голосов
/ 07 марта 2019

SAPSQL_DATA_LOSS - ошибка времени выполнения.

Поскольку SAPSQL_DATA_LOSS не является исключением на основе классов, его невозможно отловить с помощью try catch.

Поскольку SAPSQL_DATA_LOSS не является перехватываемой ошибкой во время выполнения , ее невозможно отловить с помощью try catch SYSTEM-EXCEPTIONS.

см. Ниже улавливаемые ошибки времени выполнения.

https://help.sap.com/doc/abapdocu_751_index_htm/7.51/en-US/abenueb-abfb-sysexc.htm

...