
General setup of data replication
REPORT zslt_test_rfc.
DATA lv_test TYPE string.
CALL FUNCTION 'Z_SLT_TEST' DESTINATION 'A4C_RFC'
IMPORTING
test = lv_test
EXCEPTIONS
OTHERS = 1.
IF sy-subrc = 0.
WRITE: / lv_test.
ELSE.
WRITE: / 'Error occurred'.
ENDIF.
@EndUserText.label : 'SLT Data Replication Test'
@AbapCatalog.enhancement.category : #NOT_EXTENSIBLE
@AbapCatalog.tableCategory : #TRANSPARENT
@AbapCatalog.deliveryClass : #A
@AbapCatalog.dataMaintenance : #RESTRICTED
define table zslt_test {
key client : abap.clnt not null;
key uuid : abap.raw(16) not null;
name : abap.char(10);
description : abap.char(100);
}
REPORT zslt_test_fill_data.
PARAMETERS p_count TYPE i DEFAULT 10.
PARAMETERS p_delete AS CHECKBOX.
START-OF-SELECTION.
PERFORM main.
FORM main.
IF p_delete = abap_true.
DELETE FROM zslt_test.
COMMIT WORK.
ENDIF.
DATA lt_slt_test TYPE STANDARD TABLE OF zslt_test WITH EMPTY KEY.
DO p_count TIMES.
DATA(lv_index) = sy-index.
TRY.
APPEND VALUE #(
uuid = cl_system_uuid=>create_uuid_x16_static( )
name = |{ lv_index NUMBER = USER }|
description = |{ sy-datlo DATE = USER } { sy-timlo TIME = USER }|
) TO lt_slt_test.
CATCH cx_uuid_error.
ASSERT 1 = 2.
ENDTRY.
ENDDO.
INSERT zslt_test FROM TABLE lt_slt_test.
COMMIT WORK.
ENDFORM.
METHOD if_badi_iuuc_repl_olo_exit~write_data_for_initial_load.
CLEAR ev_error_code.
CLEAR et_return.
"push initial load
TYPES BEGIN OF ty_ls_table_w_payload_il.
TYPES tabname_source TYPE c LENGTH 30.
TYPES payload TYPE xstring.
TYPES END OF ty_ls_table_w_payload_il.
TYPES ty_lt_table_w_payload_il TYPE STANDARD TABLE OF ty_ls_table_w_payload_il
WITH DEFAULT KEY .
DATA lt_table_w_payload_il TYPE ty_lt_table_w_payload_il.
DATA lv_dbtab_xml TYPE xstring.
FIELD-SYMBOLS <lt_dbtab_data> TYPE STANDARD TABLE.
LOOP AT it_table_w_content ASSIGNING FIELD-SYMBOL(<ls_table_w_content>).
ASSIGN <ls_table_w_content>-payload->* TO <lt_dbtab_data>.
TRY.
"serialize table data to xml or json
IF 1 = 2.
"xml
CALL TRANSFORMATION id
SOURCE root = <lt_dbtab_data>
RESULT XML lv_dbtab_xml.
ELSE.
"json
DATA(lo_xml_writer) = cl_sxml_string_writer=>create( type = if_sxml=>co_xt_json ).
CALL TRANSFORMATION id
SOURCE root = <lt_dbtab_data>
RESULT XML lo_xml_writer.
lv_dbtab_xml = lo_xml_writer->get_output( ).
FREE lo_xml_writer.
ENDIF.
CATCH cx_root INTO DATA(lx_root) ##catch_all.
ev_error_code = 1.
APPEND VALUE #( type = 'E' message = lx_root->get_text( ) ) TO et_return.
RETURN.
ENDTRY.
APPEND VALUE #( tabname_source = <ls_table_w_content>-tabname_source
payload = lv_dbtab_xml ) TO lt_table_w_payload_il.
FREE lv_dbtab_xml.
ENDLOOP.
DATA lv_payload_xml TYPE xstring.
CALL TRANSFORMATION id
SOURCE root = lt_table_w_payload_il
RESULT XML lv_payload_xml.
FREE lt_table_w_payload_il.
CALL FUNCTION 'Z_SLT_WRITE_DATA_INITIAL_LOAD' DESTINATION 'A4C_RFC'
EXPORTING
iv_payload = lv_payload_xml
IMPORTING
ev_error_code = ev_error_code
et_return = et_return
EXCEPTIONS
OTHERS = 1.
IF sy-subrc <> 0.
ev_error_code = sy-subrc.
APPEND VALUE #( type = 'E' message = 'RFC error occurred' ) TO et_return ##NO_TEXT.
RETURN.
ENDIF.
ENDMETHOD.
METHOD if_badi_iuuc_repl_olo_exit~write_data_for_repl.
CLEAR ev_error_code.
CLEAR et_return.
"push delta load
TYPES BEGIN OF ty_ls_table_w_payload.
TYPES operation TYPE c LENGTH 1.
TYPES tabname_source TYPE c LENGTH 30.
TYPES payload TYPE xstring.
TYPES END OF ty_ls_table_w_payload.
TYPES ty_lt_table_w_payload TYPE STANDARD TABLE OF ty_ls_table_w_payload
WITH DEFAULT KEY .
DATA lt_table_w_payload TYPE ty_lt_table_w_payload.
DATA lv_dbtab_xml TYPE xstring.
FIELD-SYMBOLS <lt_dbtab_data> TYPE STANDARD TABLE.
LOOP AT it_table_w_content ASSIGNING FIELD-SYMBOL(<ls_table_w_content>).
ASSIGN <ls_table_w_content>-payload->* TO <lt_dbtab_data>.
TRY.
"serialize table data to xml or json
IF 1 = 2.
"xml
CALL TRANSFORMATION id
SOURCE root = <lt_dbtab_data>
RESULT XML lv_dbtab_xml.
ELSE.
"json
DATA(lo_xml_writer) = cl_sxml_string_writer=>create( type = if_sxml=>co_xt_json ).
CALL TRANSFORMATION id
SOURCE root = <lt_dbtab_data>
RESULT XML lo_xml_writer.
lv_dbtab_xml = lo_xml_writer->get_output( ).
FREE lo_xml_writer.
ENDIF.
CATCH cx_root INTO DATA(lx_root) ##catch_all.
ev_error_code = 1.
APPEND VALUE #( type = 'E' message = lx_root->get_text( ) ) TO et_return.
RETURN.
ENDTRY.
APPEND VALUE #( operation = <ls_table_w_content>-operation
tabname_source = <ls_table_w_content>-tabname_source
payload = lv_dbtab_xml ) TO lt_table_w_payload.
FREE lv_dbtab_xml.
ENDLOOP.
DATA lv_payload_xml TYPE xstring.
CALL TRANSFORMATION id
SOURCE root = lt_table_w_payload
RESULT XML lv_payload_xml.
FREE lt_table_w_payload.
CALL FUNCTION 'Z_SLT_WRITE_DATA_DELTA_LOAD' DESTINATION 'A4C_RFC'
EXPORTING
iv_payload = lv_payload_xml
IMPORTING
ev_error_code = ev_error_code
et_return = et_return
EXCEPTIONS
OTHERS = 1.
IF sy-subrc <> 0.
ev_error_code = sy-subrc.
APPEND VALUE #( type = 'E' message = 'RFC error occurred' ) TO et_return ##NO_TEXT.
RETURN.
ENDIF.
ENDMETHOD.
FUNCTION z_slt_write_data_initial_load
IMPORTING
VALUE(iv_payload) TYPE xstring
EXPORTING
VALUE(ev_error_code) TYPE i
VALUE(et_return) TYPE bapirettab.
"get initial load
TYPES BEGIN OF ty_ls_table_w_payload_il.
TYPES tabname_source TYPE c LENGTH 30.
TYPES payload TYPE xstring.
TYPES END OF ty_ls_table_w_payload_il.
TYPES ty_lt_table_w_payload_il TYPE STANDARD TABLE OF ty_ls_table_w_payload_il
WITH DEFAULT KEY .
DATA lt_table_w_payload_il TYPE ty_lt_table_w_payload_il.
TRY.
CALL TRANSFORMATION id
SOURCE XML iv_payload
RESULT root = lt_table_w_payload_il.
FREE iv_payload.
DATA lr_dbtab_data TYPE REF TO data.
LOOP AT lt_table_w_payload_il ASSIGNING FIELD-SYMBOL(<ls_table_w_payload_il>).
CREATE DATA lr_dbtab_data TYPE STANDARD TABLE OF (<ls_table_w_payload_il>-tabname_source) WITH EMPTY KEY.
CALL TRANSFORMATION id
SOURCE XML <ls_table_w_payload_il>-payload
RESULT root = lr_dbtab_data->*.
FREE <ls_table_w_payload_il>-payload.
INSERT (<ls_table_w_payload_il>-tabname_source) FROM TABLE @lr_dbtab_data->*.
COMMIT WORK.
FREE lr_dbtab_data.
ENDLOOP.
CATCH cx_root INTO DATA(lx_root) ##catch_all.
ev_error_code = 1.
APPEND VALUE #( type = 'E' message = lx_root->get_text( ) ) TO et_return.
RETURN.
ENDTRY.
ENDFUNCTION.
FUNCTION z_slt_write_data_delta_load
IMPORTING
VALUE(iv_payload) TYPE xstring
EXPORTING
VALUE(ev_error_code) TYPE i
VALUE(et_return) TYPE bapirettab.
"get initial load
TYPES BEGIN OF ty_ls_table_w_payload.
TYPES operation TYPE c LENGTH 1.
TYPES tabname_source TYPE c LENGTH 30.
TYPES payload TYPE xstring.
TYPES END OF ty_ls_table_w_payload.
TYPES ty_lt_table_w_payload TYPE STANDARD TABLE OF ty_ls_table_w_payload
WITH DEFAULT KEY .
DATA lt_table_w_payload TYPE ty_lt_table_w_payload.
TRY.
CALL TRANSFORMATION id
SOURCE XML iv_payload
RESULT root = lt_table_w_payload.
FREE iv_payload.
DATA lr_dbtab_data TYPE REF TO data.
LOOP AT lt_table_w_payload ASSIGNING FIELD-SYMBOL(<ls_table_w_payload>).
CREATE DATA lr_dbtab_data TYPE STANDARD TABLE OF (<ls_table_w_payload>-tabname_source) WITH EMPTY KEY.
CALL TRANSFORMATION id
SOURCE XML <ls_table_w_payload>-payload
RESULT root = lr_dbtab_data->*.
FREE <ls_table_w_payload>-payload.
CASE <ls_table_w_payload>-operation.
WHEN 'I'.
INSERT (<ls_table_w_payload>-tabname_source) FROM TABLE @lr_dbtab_data->*.
COMMIT WORK.
WHEN 'D'.
DELETE (<ls_table_w_payload>-tabname_source) FROM TABLE @lr_dbtab_data->*.
COMMIT WORK.
WHEN 'U'.
UPDATE (<ls_table_w_payload>-tabname_source) FROM TABLE @lr_dbtab_data->*.
COMMIT WORK.
ENDCASE.
FREE lr_dbtab_data.
ENDLOOP.
CATCH cx_root INTO DATA(lx_root) ##catch_all.
ev_error_code = 1.
APPEND VALUE #( type = 'E' message = lx_root->get_text( ) ) TO et_return.
RETURN.
ENDTRY.
ENDFUNCTION.
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
User | Count |
---|---|
16 | |
14 | |
13 | |
9 | |
9 | |
9 | |
8 | |
7 | |
7 | |
7 |