После некоторых попыток я могу предложить вам возможное решение.
Это обходной путь:
Я не знаю, может ли это быть применено к вашему случаю, так как для этого нужно добавить оператор 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'