ABAP Database Connectivity - позволяет подключаться к БД напрямую и использовать sql самой БД. Также данную API можно использовать для получения данных из внешних(вторичных) БД.
Давайте рассмотрим обе задачи и пути их решения.
1. Получение данных из другой SAP системы. Тут мы имеем вариантов:
a) Пожалуй, самый очевидный, это создание RFC и вызов его в целевой системе. Однако, не всегда есть возможность протащить свой ФМ в целевую систему;
b) Второй способ, использование стандартного ФМ 'RFC_READ_TABLE' . Он позволит получить данные из таблицы в целевой системы, при этом его не надо никуда переносить
Давайте проверим, есть ли указанный пользователь в таблице USR01 целевой системы.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
DATA: lt_data TYPE TABLE OF tab512, lt_fields TYPE TABLE OF rfc_db_fld, lt_options TYPE TABLE OF rfc_db_opt. APPEND |BNAME EQ 'Имя вашего пользователя'| TO lt_options. APPEND |BNAME| TO lt_fields. CALL FUNCTION 'RFC_READ_TABLE' DESTINATION 'SCD_USER_DATA' EXPORTING query_table = 'USR01' * DELIMITER = ' ' * NO_DATA = ' ' * ROWSKIPS = 0 * ROWCOUNT = 0 TABLES options = lt_options fields = lt_fields data = lt_data EXCEPTIONS table_not_available = 1 table_without_data = 2 option_not_valid = 3 field_not_valid = 4 not_authorized = 5 data_buffer_exceeded = 6 OTHERS = 7. IF sy-subrc <> 0. * Implement suitable error handling here ENDIF. |
Сразу видна проблема, что можем извлечь данные только по одной таблице.
Какие же еще есть варианты? Конечно же основной способ из заголовка статьи, а именно использование API ABAP Database Connectivity и класса cl_sql_connection. При помощи данной API можно подключаться как к своей БД, так и внешним БД.
Получим:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
DATA: lo_statement TYPE REF TO cl_sql_statement, lo_result_set TYPE REF TO cl_sql_result_set. DATA: lr_data TYPE REF TO data. DATA(lv_mandt) = sy-mandt. DATA(lv_sql_request) = |select * from usr01 where mandt = { lv_mandt } |. TRY. lo_statement = cl_sql_connection=>get_connection( )->create_statement( ). lo_result_set = lo_statement->execute_query( lv_sql_request ). DATA(lt_md_tab) = lo_result_set->get_metadata( ). * Получим данные DATA(lr_struct_ref) = lo_result_set->get_struct_ref( md_tab = lt_md_tab p_strict = abap_false ). ASSIGN lr_struct_ref->* TO FIELD-SYMBOL(<line>). CREATE DATA lr_data LIKE TABLE OF <line>. lo_result_set->set_param_table( lr_data ). DATA(lv_row) = lo_result_set->next_package( ). lo_result_set->close( ). CATCH cx_sql_exception. ENDTRY. |
Обратите внимание, что надо указывать мандант, т.к. мы обращаемся к БД напрямую. Также возможно использовать специфический синтаксис конкретной БД.
2. Получение данных из внешней БД
Для подключения к внешним БД предварительно нужно настроить соединение c дополнительной БД в транзакции DBACOCKPIT и указать соединение при вызове метода get_connection:
1 |
lo_statement = cl_sql_connection=>get_connection( 'Имя соединения с БД' )->create_statement( ). |