in src/zgoog_cl_bqtr_gen_bw_object.clas.abap [0:0]
METHOD create_bw_ds.
CONSTANTS:
lc_transactional_data TYPE rsds_requtype VALUE 'D',
lc_odp_suffix TYPE c LENGTH 2 VALUE '$F'.
DATA:
lv_data_source TYPE roosourcer,
lo_attr TYPE REF TO object,
ls_t100_key TYPE scx_t100key,
lv_odpname TYPE rodps_odpname,
ls_ds TYPE rsds,
ls_dst TYPE rsdst,
ls_msg TYPE bal_s_msg,
lv_subrc TYPE sysubrc,
lt_dst TYPE rsds_t_rsdst,
lt_rs_msg TYPE rs_t_msg,
lo_ds TYPE REF TO cl_rsds_rsds,
lo_access_meth TYPE REF TO cl_rsds_accessmethods,
lx_err_msg TYPE REF TO cx_rs_error_with_message,
lv_context TYPE rodps_context,
lx_root TYPE REF TO cx_root.
FIELD-SYMBOLS: <ls_msg> TYPE bal_s_msg.
DATA: lv_logsys_exists TYPE flag.
CLEAR: et_return, ev_sy_subrc.
check_odp_logsys_exist(
EXPORTING
iv_logsys = iv_logsys
IMPORTING
ev_exist = lv_logsys_exists
ev_context = lv_context
ev_sy_subrc = ev_sy_subrc
et_return = et_return ).
IF lv_logsys_exists <> abap_true.
RETURN.
ENDIF.
IF lv_context <> 'ABAP_CDS' AND
lv_context <> 'SAPI'.
ev_sy_subrc = sy-subrc.
MESSAGE s000(/goog/bqtr) WITH 'Only ODP ABAP-CDS' '& SAPI sources are supported' INTO DATA(lv_temp_message).
/goog/cl_bqtr_utility=>add_bapiret2_from_sy(
CHANGING
ct_bapiret2 = et_return ).
RETURN.
ENDIF.
lv_data_source = iv_ds.
DATA: lv_search_pattern TYPE rodps_odpname.
DATA: lt_nodes TYPE rodps_repl_t_node.
lv_search_pattern = iv_ds && '*'.
CALL METHOD cl_rsds_access_odp=>rodps_repl_odp_get_list
EXPORTING
i_logsys = iv_logsys
i_search_pattern = lv_search_pattern
i_langu = sy-langu
IMPORTING
et_nodes = lt_nodes
et_return = et_return
EXCEPTIONS
communication_failed = 1
OTHERS = 2.
IF sy-subrc <> 0.
ev_sy_subrc = sy-subrc.
/goog/cl_bqtr_utility=>add_bapiret2_from_sy(
CHANGING
ct_bapiret2 = et_return ).
RETURN.
ENDIF.
DATA: ls_node TYPE REF TO rodps_repl_s_node.
READ TABLE lt_nodes REFERENCE INTO ls_node
WITH KEY display_name = iv_ds.
IF sy-subrc IS NOT INITIAL.
ev_sy_subrc = 4.
APPEND VALUE #( id = '/GOOG/BQTR'
number = '000'
type = 'E'
message_v1 = 'Datasource not found!'
message_v2 = 'Provide SQL View Name for CDS!'
) TO et_return.
RETURN.
ENDIF.
lv_odpname = ls_node->nodename.
lv_data_source = iv_dsnam.
CALL METHOD cl_rsds_access_odp=>if_rsds_attributes_maintain~init
EXPORTING
i_datasource = lv_data_source
i_logsys = iv_logsys
i_r_attributes = lo_attr
i_r_accessmethods = lo_access_meth.
TRY.
CALL METHOD cl_rsds_rsds=>create_object
EXPORTING
i_datasource = lv_data_source
i_logsys = iv_logsys
i_new = rs_c_true
i_type = lc_transactional_data
i_modify = rs_c_true
i_with_cto = rs_c_true
RECEIVING
r_r_datasource = lo_ds.
CALL METHOD lo_ds->create_version
EXPORTING
i_objvers = rs_c_objvers-new
i_allow_empty_version = rs_c_true
i_with_field = rs_c_false
EXCEPTIONS
OTHERS = 1.
IF sy-subrc <> 0.
ev_sy_subrc = sy-subrc.
/goog/cl_bqtr_utility=>add_bapiret2_from_sy(
CHANGING
ct_bapiret2 = et_return ).
RETURN.
ENDIF.
ls_ds-datasource = lv_data_source.
ls_ds-logsys = iv_logsys.
ls_ds-objvers = rs_c_objvers-modified.
ls_ds-primsegid = '0001'.
ls_ds-type = lc_transactional_data.
ls_dst-langu = sy-langu.
ls_dst-txtlg = lv_data_source.
ls_dst-txtmd = lv_data_source.
ls_dst-txtsh = lv_data_source.
APPEND ls_dst TO lt_dst.
CALL METHOD lo_ds->update_head
EXPORTING
i_objvers = rs_c_objvers-new
i_s_ds = ls_ds
i_t_dst = lt_dst.
CALL METHOD lo_ds->update_applnm
EXPORTING
i_applnm = iv_applnm.
DATA: lo_access TYPE REF TO cl_rsds_accessmethods.
manage_odp_ds_acc_methods(
EXPORTING
io_ds = lo_ds
iv_data_source = lv_data_source
iv_logsys = iv_logsys
iv_odpname = lv_odpname
IMPORTING
eo_access = lo_access
ev_sy_subrc = ev_sy_subrc
et_return = et_return ).
CALL METHOD lo_ds->update_head
EXPORTING
i_objvers = rs_c_objvers-new
i_s_ds = ls_ds
i_t_dst = lt_dst.
CALL METHOD lo_ds->update_methods
EXPORTING
i_objvers = rs_c_objvers-new
i_r_methods = lo_access
EXCEPTIONS
failed = 1
OTHERS = 2.
IF sy-subrc <> 0.
ev_sy_subrc = sy-subrc.
/goog/cl_bqtr_utility=>add_bapiret2_from_sy(
CHANGING
ct_bapiret2 = et_return ).
RETURN.
ENDIF.
* As last thing save and activate data source
TRY.
lo_ds->if_rso_tlogo_maintain~save(
EXPORTING
i_with_cto = abap_false ).
CATCH cx_rs_error_with_message INTO lx_err_msg.
ev_sy_subrc = sy-subrc.
add_bapiret2_from_rs_error(
EXPORTING
io_rs_error = lx_err_msg
CHANGING
ct_bapiret2 = et_return ).
RETURN.
ENDTRY.
* Clear the log, to find out a potentional error in activation
cl_rso_application_log=>appl_log_delete( ).
lo_ds->if_rso_tlogo_maintain~activate(
EXPORTING
i_with_cto = abap_false
IMPORTING
e_subrc = lv_subrc ).
IF lv_subrc <> 0.
ev_sy_subrc = lv_subrc.
cl_rso_application_log=>appl_log_msg_read(
IMPORTING
e_t_msg = lt_rs_msg ).
DATA: ls_bapiret2 TYPE bapiret2.
LOOP AT lt_rs_msg ASSIGNING <ls_msg>
WHERE msgty = 'E'.
CLEAR ls_bapiret2.
ls_bapiret2-id = <ls_msg>-msgid.
ls_bapiret2-number = <ls_msg>-msgno.
ls_bapiret2-message_v1 = <ls_msg>-msgv1.
ls_bapiret2-message_v2 = <ls_msg>-msgv2.
ls_bapiret2-message_v3 = <ls_msg>-msgv3.
ls_bapiret2-message_v4 = <ls_msg>-msgv4.
APPEND ls_bapiret2 TO et_return.
ENDLOOP.
RETURN.
ENDIF.
CATCH cx_root INTO lx_root.
ev_sy_subrc = 4.
add_bapiret2_from_cx_root(
EXPORTING
io_error = lx_root
CHANGING
ct_bapiret2 = et_return ).
RETURN.
ENDTRY.
* Return what was generated
es_tlogo-objnm(30) = lv_data_source.
es_tlogo-objnm+30(10) = iv_logsys.
es_tlogo-tlogo = 'RSDS'.
es_tlogo-odpname = lv_odpname.
" Some additional details for SAPI / Legacy systems
IF lv_context = 'SAPI'.
DATA: ls_oltpsource TYPE rsaot_s_osource.
DATA: lv_oltpsource TYPE rsaot_oltpsource.
lv_oltpsource = iv_ds.
CALL FUNCTION 'RSA1_SINGLE_OLTPSOURCE_GET'
EXPORTING
i_oltpsource = lv_oltpsource
IMPORTING
e_s_oltpsource = ls_oltpsource
EXCEPTIONS
no_authority = 1
not_exist = 2
inconsistent = 3
OTHERS = 4.
IF sy-subrc <> 0.
ev_sy_subrc = sy-subrc.
/goog/cl_bqtr_utility=>add_bapiret2_from_sy(
CHANGING
ct_bapiret2 = et_return ).
RETURN.
ENDIF.
ENDIF.
es_tlogo-object =
COND #( WHEN lv_context = 'ABAP_CDS'
THEN iv_ds
WHEN lv_context = 'SAPI'
THEN COND #( WHEN ls_oltpsource-exmethod = 'V'
THEN ls_oltpsource-extractor
ELSE ls_oltpsource-exstruct ) ).
es_tlogo-updmode =
COND #( WHEN lo_ds->realtime_supported( ) = 'X'
THEN 'D'
ELSE 'F' ).