When proxy error occurs, soap fault message always returns "MESSAGE.GENERAL"
you can get the detail message from XI server.
*--- Call Method
CALL METHOD lo_proxy->(ls_header-obj_name1)
PARAMETER-TABLE
lt_params[]
EXCEPTION-TABLE
lt_except[].
COMMIT WORK.
IF iv_async IS NOT INITIAL.
CALL FUNCTION 'ZDK_GET_PROXY_ASYNC_ACK'
EXPORTING
io_proxy = lo_proxy
IMPORTING
ev_status = ev_status
ev_message = ev_message.
ENDIF.
FUNCTION zdk_get_proxy_async_ack.
*"----------------------------------------------------------------------
*"*"Local Interface:
*" IMPORTING
*" REFERENCE(IO_PROXY) TYPE REF TO CL_PROXY_CLIENT
*" EXPORTING
*" REFERENCE(EV_STATUS)
*" REFERENCE(EV_MESSAGE) TYPE CSEQUENCE
*"----------------------------------------------------------------------
CONSTANTS: lc_wait_max TYPE i VALUE 600.
CONSTANTS: lc_error_max TYPE i VALUE 300.
CONSTANTS: lc_code_notyet TYPE sxmserrid
VALUE cx_xms_syserr_proxy=>co_id_no_ack_arrived_yet.
DATA: lv_count TYPE i.
DATA: lv_pattern TYPE string.
DATA: lo_ack TYPE REF TO if_ws_acknowledgment.
DATA: lo_message TYPE REF TO if_wsprotocol_message_id.
DATA: ls_status TYPE prx_ack_status.
DATA: lv_msgid TYPE sxmsmguid.
DATA: lt_ack_detail TYPE prx_ack_status_detail_table.
DATA: ls_ack_detail LIKE LINE OF lt_ack_detail.
DATA: lt_ack_table TYPE prx_ack_status_table.
DATA: ls_ack_table LIKE LINE OF lt_ack_table.
DATA: ls_app_fault TYPE prx_ack_app_fault.
DATA: cx_system TYPE REF TO cx_ai_system_fault.
TRY.
lo_message ?= io_proxy->get_protocol( if_wsprotocol=>message_id ).
CATCH cx_ai_system_fault.
ev_status = gc_failure.
ev_message = 'get message protocol failed'.
EXIT.
ENDTRY.
IF sy-subrc IS INITIAL.
lv_msgid = lo_message->get_message_id( ).
DO.
TRY.
lo_ack = cl_proxy_access=>get_acknowledgment( lv_msgid ).
ls_status = lo_ack->get_status( ).
IF sy-subrc IS INITIAL
AND ls_status-is_final = 'X'.
ev_status = gc_success.
EXIT.
ELSE.
CASE ls_status-ack_status.
WHEN if_xms_persist_const=>co_stat_ack_app_error_trans " 73
OR if_xms_persist_const=>co_stat_ack_app_error_final " 83
OR if_xms_persist_const=>co_stat_ack_sys_error_trans " 75
OR if_xms_persist_const=>co_stat_ack_sys_error_final " 85
OR if_xms_persist_const=>co_stat_ack_not_supported " 88
OR if_xms_persist_const=>co_stat_ack_cancel. " 90
CALL METHOD lo_ack->get_status_detail
IMPORTING
ack_status_detail_table = lt_ack_detail.
IF lt_ack_detail IS NOT INITIAL.
READ TABLE lt_ack_detail INTO ls_ack_detail INDEX 1.
IF ls_ack_detail-ack_data IS NOT INITIAL.
READ TABLE ls_ack_detail-ack_data INTO ls_ack_table INDEX 1.
ls_app_fault = ls_ack_table-faultdata.
* lv_pattern = ': *([^:]+): *[^:]+: *[^:]+: *[^:]+$'.
lv_pattern = ': *[^:]+: *[^:]+: *([^:]+: *[^:]+)$'. "Oracle error
FIND REGEX lv_pattern IN ls_app_fault-fault_text
SUBMATCHES ev_message.
IF sy-subrc IS NOT INITIAL.
ev_message = ls_app_fault-fault_text.
ENDIF.
ENDIF.
ENDIF.
WHEN if_xms_persist_const=>co_stat_ack_not_yet. "071
WAIT UP TO 1 SECONDS.
lv_count = lv_count + 1.
IF lv_count = lc_wait_max.
ev_message = 'MESSAGE not yet Received ( 10 Min. )'.
ENDIF.
WHEN OTHERS.
"?
ENDCASE.
IF ev_message IS NOT INITIAL.
ev_status = gc_failure.
EXIT.
ENDIF.
ENDIF.
CATCH cx_ai_system_fault INTO cx_system.
IF cx_system->code = lc_code_notyet.
sy-subrc = 1.
WAIT UP TO 1 SECONDS.
lv_count = lv_count + 1.
IF lv_count = lc_error_max.
ev_status = gc_failure.
ev_message = 'Exceeded waiting limit ( 5 min ).'.
EXIT.
ENDIF.
CONTINUE.
ELSE.
ev_status = gc_failure.
EXIT.
ENDIF.
ENDTRY.
ENDDO.
ELSE.
ev_status = gc_failure.
ev_message = 'failed'.
ENDIF.
ENDFUNCTION.
'SAP > ABAP' 카테고리의 다른 글
ALV shows 99 columns only (0) | 2023.10.23 |
---|---|
Routing maintenance (0) | 2022.11.17 |
Hana Error: cannot use duplicate index name (0) | 2022.08.03 |
ENQUEUE_READ (0) | 2022.06.24 |
SQL Editor for Hana ( Native ) (0) | 2022.06.09 |