Иногда возникает необходимость логирования (SLG1) во время выполнения какого либо процесса. Например, создание заявки. Часто бывает так, что rollback откатывает данные по текущему LUW, при этом записи в лог не попадают. Возникает зависимость от общего COMMIT.
Для решения этой проблемы у SAP предусмотрены параметры ФМ BAL_DB_SAVE:
1 2 |
i_2th_connection i_2th_connect_commit |
Они отвечают за создание Secondary Database Connections, которая зависит от Commit в рамках этого подключения. Т.о. зависимость от Commit подключения DEFAULT опускается.
Посмотреть/создать подключения можно в транзакции DBACOCKPIT.
Примеры использования (взято отсюда https://blogs.sap.com/2017/06/27/database-connections-prepublished/)
ООП:
1 2 3 4 5 6 7 8 9 10 11 |
DATA(conn) = CONV dbcon-con_name( `R/3*DEMO` ). NEW cl_sql_statement( con_ref = cl_sql_connection=>get_connection( con_name = conn sharable = abap_true ) )->execute_update( `DELETE FROM demo_update` ). COMMIT CONNECTION (conn). INSERT demo_update CONNECTION (conn) FROM @( VALUE #( id = 'X' col1 = 1 col2 = 2 col3 = 3 col4 = 4 ) ). COMMIT CONNECTION (conn). |
Без ООП:
1 2 3 4 |
DELETE FROM demo_update CONNECTION default. INSERT demo_update CONNECTION default FROM @( VALUE #( id = 'X' col1 = 1 col2 = 2 col3 = 3 col4 = 4 ) ). COMMIT CONNECTION default. |
Native SQL:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
SELECT * FROM scarr INTO TABLE @DATA(itab) CONNECTION r/3*demo1. DATA(con) = cl_sql_connection=>get_connection( `R/3*Demo2` ). EXEC SQL. CONNECT TO 'R/3*Demo3' ENDEXEC. EXEC SQL. DISCONNECT 'R/3*DEMO1' ENDEXEC. |
Пример для AMDP (Managed Database Procedures):
1 2 3 4 5 6 7 8 9 10 11 12 |
DATA(conn) = CONV dbcon-con_name( `R/3*...` ). TRY. NEW cl_demo_amdp_connection( )->get_scarr( EXPORTING connection = conn clnt = sy-mandt IMPORTING carriers = DATA(result) ). CATCH cx_amdp_error INTO DATA(amdp_error). ... ENDTRY. |