src/zgoog_cl_bqtr_gen_bw_object.clas.abap (1,465 lines of code) (raw):

********************************************************************** * Copyright 2024 Google LLC * * * * Licensed under the Apache License, Version 2.0 (the "License"); * * you may not use this file except in compliance with the License. * * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, * * either express or implied. * * See the License for the specific language governing permissions * * and limitations under the License. * ********************************************************************** class ZGOOG_CL_BQTR_GEN_BW_OBJECT definition public final create public . public section. types: BEGIN OF t_tlogo, tlogo TYPE rstlogo, objnm TYPE sobj_name, subtype TYPE rso_tlogo_subtype, odpname TYPE rodps_odpname, object TYPE sobj_name, updmode TYPE rsbupdmode, END OF t_tlogo . class-data MV_OBJVER type RSOBJVERS value 'M' ##NO_TEXT. class-methods CREATE_BW_DS importing !IV_DS type STRING !IV_LOGSYS type RSSLOGSYS !IV_APPLNM type RSAPPLNM !IV_DSNAM type RSOLTPSOURCER exporting !ES_TLOGO type T_TLOGO !EV_SY_SUBRC type SYST_SUBRC !ET_RETURN type BAPIRET2_T . class-methods CREATE_ADSO importing !IV_ADSONM type RSOADSONM !IV_ODPNAME type RODPS_ODPNAME !IV_LOGSYS type RSSLOGSYS exporting !ES_TLOGO type T_TLOGO !EV_SY_SUBRC type SYST_SUBRC !ET_RETURN type BAPIRET2_T . class-methods CREATE_TRNF importing !IV_MASS_TR_KEY type /GOOG/TRKEY !IV_DATA_SOURCE type STRING !IV_TLOGO_DS type T_TLOGO !IV_TLOGO_ADSO type T_TLOGO !IV_MANDT_FVAL type NAME_FELD optional exporting !ES_TLOGO type T_TLOGO !EV_SY_SUBRC type SYST_SUBRC !ET_RETURN type BAPIRET2_T . class-methods CREATE_DTP importing !IV_TLOGO_DS type T_TLOGO !IV_TLOGO_ADSO type T_TLOGO !IV_TLOGO_TRNF type T_TLOGO exporting !EV_DTPNM type RSBKDTPNM !EV_SY_SUBRC type SYST_SUBRC !ET_RETURN type BAPIRET2_T . class-methods CREATE_PROCESS_CHAIN importing !IV_CHAIN type RSPC_CHAIN optional !IV_INFOARA type RSINFOAREA default 'NODESNOTCONNECTED' !IV_STREAMING type BOOLEAN default ABAP_TRUE !IV_TRIGGER type STRING optional !IV_DTP_LOAD type STRING !IV_ADSO type STRING !IV_ACTIVE type BOOLEAN default ABAP_TRUE exporting !EV_SY_SUBRC type SYST_SUBRC !ET_RETURN type BAPIRET2_T . class-methods CREATE_TRIGGER importing !IV_TRIGGER type STRING !IV_PRDMIN type BTCPMIN optional !IV_PRDHOURS type BTCPHOUR optional exporting !EV_SY_SUBRC type SYST_SUBRC !ET_RETURN type BAPIRET2_T . class-methods DELETE_ADSO importing !IV_ADSONM type RSOADSONM exporting !EV_SY_SUBRC type SYST_SUBRC !ET_RETURN type BAPIRET2_T . class-methods DELETE_BW_DS importing !IV_NAME type STRING !IV_LOGSYS type RSSLOGSYS exporting !EV_SY_SUBRC type SYST_SUBRC !ET_RETURN type BAPIRET2_T . class-methods DELETE_PROCESS_CHAIN importing !IV_CHAIN type RSPC_CHAIN exporting !EV_SY_SUBRC type SYST_SUBRC !ET_RETURN type BAPIRET2_T . class-methods DELETE_TRIGGER importing !IV_TRIGGER type RSPC_VARIANT exporting !EV_SY_SUBRC type SYST_SUBRC !ET_RETURN type BAPIRET2_T . class-methods APPLY_ROUTINE importing !IV_MASS_TR_KEY type /GOOG/TRKEY !IV_DATA_SOURCE type STRING !IO_TRFN type ref to CL_RSTRAN_TRFN !IV_MANDT_FVAL type NAME_FELD optional exporting !EV_SY_SUBRC type SYST_SUBRC !ET_RETURN type BAPIRET2_T . class-methods CREATE_ODSO importing !IV_ADSONM type RSOADSONM !IV_IOBJ type RSIOBJNM !IV_ODPNAME type RODPS_ODPNAME !IV_LOGSYS type RSSLOGSYS exporting !ES_TLOGO type T_TLOGO !EV_SY_SUBRC type SYST_SUBRC !ET_RETURN type BAPIRET2_T . class-methods DELETE_ODSO importing !IV_ADSONM type RSOADSONM !IV_IOBJ type RSIOBJNM exporting !EV_SY_SUBRC type SYST_SUBRC !ET_RETURN type BAPIRET2_T . class-methods CREATE_TRNF_ODSO importing !IV_MASS_TR_KEY type /GOOG/TRKEY !IV_DATA_SOURCE type STRING !IV_IOBJ type RSIOBJNM !IV_TLOGO_DS type T_TLOGO !IV_TLOGO_ADSO type T_TLOGO !IV_MANDT_FVAL type NAME_FELD optional exporting !ES_TLOGO type T_TLOGO !EV_SY_SUBRC type SYST_SUBRC !ET_RETURN type BAPIRET2_T . class-methods ADD_TRNF_MAP_ODSO importing !IV_IOBJ type RSIOBJNM !IO_TRFN type ref to CL_RSTRAN_TRFN . class-methods CREATE_DTP_LEGACY importing !IV_TLOGO_DS type T_TLOGO !IV_TLOGO_ADSO type T_TLOGO !IV_TLOGO_TRNF type T_TLOGO exporting !EV_DTPNM type RSBKDTPNM !EV_SY_SUBRC type SYST_SUBRC !ET_RETURN type BAPIRET2_T . PROTECTED SECTION. private section. class-methods MANAGE_ODP_DS_ACC_METHODS importing !IO_DS type ref to CL_RSDS_RSDS !IV_DATA_SOURCE type ROOSOURCER !IV_LOGSYS type RSSLOGSYS !IV_ODPNAME type RODPS_ODPNAME exporting !EV_SY_SUBRC type SYST_SUBRC !ET_RETURN type BAPIRET2_T !EO_ACCESS type ref to CL_RSDS_ACCESSMETHODS . class-methods CHECK_ODP_LOGSYS_EXIST importing !IV_LOGSYS type RSSLOGSYS exporting !EV_EXIST type ABAP_BOOL !EV_CONTEXT type RODPS_CONTEXT !EV_SY_SUBRC type SYST_SUBRC !ET_RETURN type BAPIRET2_T . class-methods ADD_BAPIRET2_FROM_RS_ERROR importing !IO_RS_ERROR type ref to CX_RS_ERROR changing !CT_BAPIRET2 type BAPIRET2_T . class-methods ADD_BAPIRET2_FROM_CX_ROOT importing !IO_ERROR type ref to CX_ROOT changing !CT_BAPIRET2 type BAPIRET2_T . class-methods CONVERT_FREE_TEXT_TO_BAPIRET2 importing !IV_TEXT type STRING !IV_MSG_TYPE type SYMSGTY default 'E' returning value(RS_BAPIRET2) type BAPIRET2 . ENDCLASS. CLASS ZGOOG_CL_BQTR_GEN_BW_OBJECT IMPLEMENTATION. METHOD add_bapiret2_from_cx_root. DATA: ls_bapiret2 TYPE bapiret2. DATA lv_text_exception TYPE string. lv_text_exception = io_error->get_text( ). ls_bapiret2 = convert_free_text_to_bapiret2( iv_text = lv_text_exception iv_msg_type = 'E' ). APPEND ls_bapiret2 TO ct_bapiret2. ENDMETHOD. METHOD add_bapiret2_from_rs_error. DATA: ls_bal_msg TYPE bal_s_msg. DATA: ls_bapiret2 TYPE bapiret2. ls_bal_msg = io_rs_error->get_message( ). ls_bapiret2-id = ls_bal_msg-msgid. ls_bapiret2-number = ls_bal_msg-msgno. ls_bapiret2-message_v1 = ls_bal_msg-msgv1. ls_bapiret2-message_v2 = ls_bal_msg-msgv2. ls_bapiret2-message_v3 = ls_bal_msg-msgv3. ls_bapiret2-message_v4 = ls_bal_msg-msgv4. APPEND ls_bapiret2 TO ct_bapiret2. ENDMETHOD. METHOD apply_routine. DATA: lt_abap_source TYPE rstran_t_abapsource. DATA: ls_source TYPE abapsource. DATA: lo_cmp TYPE REF TO cl_cmp_composer, lo_cmpf TYPE REF TO cx_cmp_failure, lo_root TYPE REF TO cx_root, lt_buffer TYPE rswsourcet. TYPES: BEGIN OF lty_param, mass_tr_key TYPE /goog/trkey, data_source TYPE string, cdc_framework TYPE string, mandt_fnam TYPE name_feld, END OF lty_param. DATA: ls_param TYPE lty_param. CONSTANTS: lc_start TYPE string VALUE 'ZGOOG_I_BQTR_TEMPLATE_START', lc_end TYPE string VALUE 'ZGOOG_I_BQTR_TEMPLATE_END'. CLEAR: et_return, ev_sy_subrc. ls_param = VALUE #( mass_tr_key = iv_mass_tr_key data_source = iv_data_source cdc_framework = 'ODQ' mandt_fnam = iv_mandt_fval ). lcl_code_composer_util=>generate_code_using_cc( EXPORTING iv_template = lc_start is_params = ls_param IMPORTING ev_error = DATA(lv_error) et_code = lt_abap_source ). DATA: lo_ex TYPE REF TO cx_root. TRY. * Create routine and get reference and codeid of routine CALL METHOD io_trfn->create_start_routine( ). DATA: lo_routine_start TYPE REF TO cl_rstran_step_rout. lo_routine_start = io_trfn->get_start_routine( ). DATA: lv_codeid_start TYPE rscodeid. lo_routine_start->get_codeid( IMPORTING e_codid = lv_codeid_start ). * Set new routine code lo_routine_start->store_routine( i_codeid = lv_codeid_start i_t_source = lt_abap_source ). CATCH cx_root INTO lo_ex. ev_sy_subrc = 4. add_bapiret2_from_cx_root( EXPORTING io_error = lo_ex CHANGING ct_bapiret2 = et_return ). RETURN. RETURN. ENDTRY. TRY. * Create routine and get reference and codeid of routine CALL METHOD io_trfn->create_end_routine( ). DATA: lo_routine_end TYPE REF TO cl_rstran_step_rout. lo_routine_end = io_trfn->get_end_routine( ). DATA: lv_codeid_end TYPE rscodeid. lo_routine_end->get_codeid( IMPORTING e_codid = lv_codeid_end ). CLEAR lt_abap_source. ls_source-line = | CLEAR RESULT_PACKAGE[]. |. APPEND ls_source TO lt_abap_source. * Set new routine code lo_routine_end->store_routine( i_codeid = lv_codeid_end i_t_source = lt_abap_source ). CATCH cx_root INTO lo_ex. ev_sy_subrc = 4. add_bapiret2_from_cx_root( EXPORTING io_error = lo_ex CHANGING ct_bapiret2 = et_return ). RETURN. ENDTRY. ENDMETHOD. METHOD check_odp_logsys_exist. DATA: ls_context TYPE cl_rsds_access_odp=>ts_odp_context. CLEAR: et_return, ev_sy_subrc, ev_context. CALL FUNCTION 'RSDS_ODP_SYSTEM_PROP' EXPORTING i_logsys = iv_logsys i_no_dialog = abap_true IMPORTING es_context = ls_context 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 ). ELSE. ev_exist = abap_true. ev_context = ls_context-context. ENDIF. ENDMETHOD. METHOD convert_free_text_to_bapiret2. DATA: BEGIN OF lv_text_converter, part1 TYPE symsgv, part2 TYPE symsgv, part3 TYPE symsgv, part4 TYPE symsgv, END OF lv_text_converter. lv_text_converter = iv_text. CALL FUNCTION 'BALW_BAPIRETURN_GET2' EXPORTING type = iv_msg_type cl = '/GOOG/BQ' number = '001' par1 = lv_text_converter-part1 par2 = lv_text_converter-part2 par3 = lv_text_converter-part3 par4 = lv_text_converter-part4 IMPORTING return = rs_bapiret2. ENDMETHOD. METHOD create_adso. DATA: lt_field TYPE cl_rsds_access_odp=>tt_repl_field. CLEAR: et_return, ev_sy_subrc. CALL METHOD cl_rsds_access_odp=>rodps_repl_odp_get_detail EXPORTING i_logsys = iv_logsys i_odpname = iv_odpname IMPORTING et_fields = lt_field et_return = et_return. LOOP AT et_return TRANSPORTING NO FIELDS WHERE type CA 'AEX'. EXIT. ENDLOOP. IF sy-subrc IS INITIAL. ev_sy_subrc = 4. RETURN. ENDIF. DATA: ls_key_field TYPE REF TO cl_rsds_access_odp=>ts_repl_field. READ TABLE lt_field REFERENCE INTO ls_key_field WITH KEY keyflag = 'X'. IF sy-subrc IS NOT INITIAL. RETURN. ENDIF. DATA: lt_key TYPE cl_rso_adso_api=>tn_t_key, lt_obj TYPE cl_rso_adso_api=>tn_t_object, lt_dimension TYPE cl_rso_adso_api=>tn_t_dimension, lt_msg TYPE rs_t_msg. DATA: ls_dimension TYPE cl_rso_adso_api=>tn_s_dimension. ls_dimension-name = 'KEY'. ls_dimension-txtsh = 'Key'. APPEND ls_dimension TO lt_dimension. ls_dimension-name = 'DATA'. ls_dimension-txtsh = 'Data'. APPEND ls_dimension TO lt_dimension. DATA:ls_key TYPE string. APPEND ls_key_field->name TO lt_key. DATA: ls_obj TYPE cl_rso_adso_api=>tn_s_object. ls_obj-fieldname = ls_key_field->name. ls_obj-datatp = ls_key_field->type. ls_obj-length = ls_key_field->length. ls_obj-decimals = ls_key_field->decimals. ls_obj-dimension = 'KEY'. ls_obj-sid_determination_mode = 'N'. ls_obj-txtsh = ls_key_field->description. APPEND ls_obj TO lt_obj. TRY. DATA: lo_exception TYPE REF TO cx_root. DATA: lv_text TYPE rsoadsodescr. lv_text = iv_adsonm. cl_rso_adso_api=>create( EXPORTING i_adsonm = iv_adsonm i_text = lv_text i_infoarea = '' i_s_adsoflags = cl_rso_adso_api=>get_adso_flags_from_model_tmpl( cl_rso_adso_api=>tn_c_model_tmpl-standard ) i_t_object = lt_obj i_t_key = lt_key i_t_dimension = lt_dimension IMPORTING e_t_msg = lt_msg ). CATCH cx_root INTO lo_exception. ev_sy_subrc = 4. add_bapiret2_from_cx_root( EXPORTING io_error = lo_exception CHANGING ct_bapiret2 = et_return ). RETURN. ENDTRY. es_tlogo-objnm = iv_adsonm. es_tlogo-tlogo = 'ADSO'. ENDMETHOD. 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' ). ENDMETHOD. METHOD create_dtp. CONSTANTS: lc_delta_load TYPE rsbupdmode VALUE 'D'. DATA: lo_exception TYPE REF TO cx_root, lo_dtp TYPE REF TO cl_rsbk_dtp, lv_dtpnm_empty TYPE rsbkdtpnm, ls_dtp TYPE rsbkdtp, lo_collection TYPE REF TO cl_rsbk_dtp_collection, lv_objnm TYPE sobj_name, ls_tlogo TYPE rstran_s_tlogo, lt_tlogo TYPE rstran_t_tlogo. CLEAR: et_return, ev_sy_subrc. MOVE-CORRESPONDING iv_tlogo_ds TO ls_tlogo. APPEND ls_tlogo TO lt_tlogo. MOVE-CORRESPONDING iv_tlogo_trnf TO ls_tlogo. APPEND ls_tlogo TO lt_tlogo. MOVE-CORRESPONDING iv_tlogo_adso TO ls_tlogo. APPEND ls_tlogo TO lt_tlogo. TRY. lo_dtp = cl_rsbk_dtp=>factory( i_dtp = lv_dtpnm_empty ). lo_dtp->copy_nvers_from_tlogo_list( i_t_tlogo = lt_tlogo ). lo_dtp->if_rsbk_dtp_maintain~set_updmode( iv_tlogo_ds-updmode ). ls_dtp = lo_dtp->if_rsbk_dtp_display~get_dtp( ). MOVE ls_dtp-dtp TO lv_objnm. CREATE OBJECT lo_collection. lo_collection->add_tlogo( EXPORTING i_objnm = lv_objnm ). lo_collection->save( EXPORTING i_with_cto = abap_false ). CATCH cx_root INTO lo_exception. ev_sy_subrc = 4. add_bapiret2_from_cx_root( EXPORTING io_error = lo_exception CHANGING ct_bapiret2 = et_return ). RETURN. ENDTRY. * Try to activate dtp TRY. lo_collection->activate( EXPORTING i_with_cto = abap_false i_force_activation = abap_true i_show_check_protocol = abap_false i_with_check = abap_false ). CATCH cx_root INTO lo_exception. ev_sy_subrc = 4. add_bapiret2_from_cx_root( EXPORTING io_error = lo_exception CHANGING ct_bapiret2 = et_return ). RETURN. ENDTRY. * Return generated DTP name ev_dtpnm = ls_dtp-dtp. lo_dtp->dequeue_dtp_for_request( ). ENDMETHOD. METHOD create_process_chain. DATA: lo_chain TYPE REF TO cl_rspc_chain, lt_variant TYPE rspc_t_variante. CLEAR: et_return, ev_sy_subrc. * ==== Create Chain-Object ==== CREATE OBJECT lo_chain EXPORTING i_chain = iv_chain " Process chain i_objvers = mv_objver i_t_variant = lt_variant " Type and Variant i_with_dialog = '' " With online i_new = abap_true EXCEPTIONS aborted_by_user = 1 " User would actually rather not process a chain ... not_unique = 2 " Selection not unique - & user requests not allowed wrong_name = 3 " Incorrect Name of (New) Chain display_only = 4 " Only Display Allowed OTHERS = 5. IF sy-subrc <> 0. ev_sy_subrc = sy-subrc. /goog/cl_bqtr_utility=>add_bapiret2_from_sy( CHANGING ct_bapiret2 = et_return ). RETURN. ENDIF. lo_chain->set_streaming( EXPORTING i_streaming = iv_streaming EXCEPTIONS not_possible = 1 warning = 2 OTHERS = 3 ). 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: lt_process_data TYPE rspc_t_variante, lv_trigger TYPE string. * IF iv_trigger IS SUPPLIED. lv_trigger = iv_trigger. ELSE. lv_trigger = 'ZT_' && iv_chain. ENDIF. APPEND VALUE #( type = rspc1_c_type-trigger variante = lv_trigger ) TO lt_process_data. APPEND VALUE #( type = rspc1_c_type-dtpload variante = iv_dtp_load ) TO lt_process_data. APPEND VALUE #( type = rspc1_c_type-adsoact variante = iv_adso ) TO lt_process_data. * ==== Put processes into chain ==== LOOP AT lt_process_data ASSIGNING FIELD-SYMBOL(<ls_process>). lo_chain->add_process( EXPORTING i_type = <ls_process>-type " Process Type i_variant = <ls_process>-variante i_with_dialog = '' " With Dialog, Where Necessary IMPORTING e_variant = <ls_process>-variante EXCEPTIONS aborted_by_user = 1 " User would actually rather not ... 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: lo_variant TYPE REF TO cl_rspc_variant, lv_variant TYPE rspc_variant, ls_variant TYPE rspcvariant, lt_adso_variant TYPE rspc_t_variant. IF <ls_process>-type = rspc1_c_type-adsoact. lv_variant = <ls_process>-variante. " get an instance CALL METHOD cl_rspc_variant=>create EXPORTING i_type = rspc1_c_type-adsoact i_variant = lv_variant RECEIVING r_r_variant = lo_variant EXCEPTIONS locked = 1 OTHERS = 2. . " fill l_t_variant ls_variant-type = rspc1_c_type-adsoact. ls_variant-variante = lv_variant. ls_variant-objvers = rs_c_objvers-active. ls_variant-lnr = '0000000001'. ls_variant-fnam = rsmpc_c_odsactivate-no_condense. ls_variant-sign = 'I'. ls_variant-opt = 'EQ'. ls_variant-low = abap_false. APPEND ls_variant TO lt_adso_variant. ls_variant-fnam = rsmpc_c_type-adso. ls_variant-lnr = 1. ls_variant-sign = 'I'. ls_variant-opt = 'EQ'. ls_variant-low = lv_variant. APPEND ls_variant TO lt_adso_variant. DATA(lv_lnr) = ls_variant-lnr + 1. " fill l_t_variant ls_variant-type = rspc1_c_type-adsoact. ls_variant-variante = lv_variant. ls_variant-objvers = rs_c_objvers-active. ls_variant-lnr = lv_lnr. ls_variant-fnam = rsmpc_c_odsactivate-noreqactwarn. ls_variant-sign = 'I'. ls_variant-opt = 'EQ'. ls_variant-low = abap_false. APPEND ls_variant TO lt_adso_variant. DATA: ls_variantt TYPE rspcvariantt. ls_variantt-langu = sy-langu. ls_variantt-type = rspc1_c_type-adsoact. ls_variantt-variante = lv_variant. ls_variantt-objvers = 'A'. ls_variantt-txtlg = lv_variant. CALL METHOD lo_variant->save EXPORTING i_t_rspcvariant = lt_adso_variant i_s_rspcvariantt = ls_variantt EXCEPTIONS failed = 1 OTHERS = 2. ENDIF. ENDLOOP. DATA: ls_chain TYPE rspc_s_chain, ls_chain_h TYPE rspc_s_chain. * ==== Connect processes Serially==== LOOP AT lt_process_data ASSIGNING <ls_process>. ls_chain-type = <ls_process>-type. ls_chain-variante = <ls_process>-variante. SELECT SINGLE eventrange FROM rsprocesstypes INTO @DATA(ls_eventrange) WHERE type = @ls_chain_h-type. IF ls_eventrange > 0. lo_chain->connect( EXPORTING i_s_start = ls_chain_h i_s_end = ls_chain i_color = 'G' i_no_question_double = rs_c_true EXCEPTIONS not_possible = 1 OTHERS = 2 ). ENDIF. ls_chain_h = ls_chain. ENDLOOP. lo_chain->save( EXPORTING i_objvers = mv_objver " Object version i_activation = abap_true " Chain is being activated... EXCEPTIONS failed = 1 " Failed 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. IF iv_active = abap_true. lo_chain->activate( IMPORTING e_t_conflicts = DATA(lt_co) EXCEPTIONS errors = 1 " Errors occurred warnings = 2 " Warnings occurred OTHERS = 3 ). 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. ENDMETHOD. METHOD create_trnf. DATA: ls_source TYPE rstran_s_tlogo, ls_target TYPE rstran_s_tlogo, lv_subrc TYPE sysubrc, lo_trfn TYPE REF TO cl_rstran_trfn, lx_ex TYPE REF TO cx_root. CLEAR: et_return, ev_sy_subrc. "TODO - Check existance MOVE-CORRESPONDING iv_tlogo_ds TO ls_source. MOVE-CORRESPONDING iv_tlogo_adso TO ls_target. TRY. lo_trfn = cl_rstran_trfn=>factory( EXPORTING i_s_source = ls_source i_s_target = ls_target ). CATCH cx_root INTO lx_ex. ev_sy_subrc = 4. add_bapiret2_from_cx_root( EXPORTING io_error = lx_ex CHANGING ct_bapiret2 = et_return ). RETURN. ENDTRY. DATA: lv_tranid TYPE rstranid. lo_trfn->get_tranid( IMPORTING e_tranid = lv_tranid ). apply_routine( iv_mass_tr_key = iv_mass_tr_key iv_data_source = iv_data_source io_trfn = lo_trfn iv_mandt_fval = iv_mandt_fval ). * Try to save object TRY. lo_trfn->if_rso_tlogo_maintain~save( EXPORTING i_with_cto = abap_false IMPORTING e_subrc = lv_subrc ). IF lv_subrc <> 0. ev_sy_subrc = lv_subrc. /goog/cl_bqtr_utility=>add_bapiret2_from_sy( CHANGING ct_bapiret2 = et_return ). RETURN. ENDIF. CATCH cx_root INTO lx_ex. ev_sy_subrc = 4. add_bapiret2_from_cx_root( EXPORTING io_error = lx_ex CHANGING ct_bapiret2 = et_return ). RETURN. ENDTRY. * Try to activate object lo_trfn->if_rso_tlogo_maintain~activate( EXPORTING i_force_activation = abap_true i_with_cto = abap_false IMPORTING e_subrc = lv_subrc ). IF lv_subrc <> 0. ev_sy_subrc = lv_subrc. /goog/cl_bqtr_utility=>add_bapiret2_from_sy( CHANGING ct_bapiret2 = et_return ). RETURN. ENDIF. es_tlogo-objnm = lv_tranid. es_tlogo-tlogo = 'TRFN'. ENDMETHOD. METHOD delete_adso. DATA: lt_msg TYPE rs_t_msg. CLEAR: et_return, ev_sy_subrc. TRY. DATA: lo_exception TYPE REF TO cx_root. cl_rso_adso_api=>delete( EXPORTING i_adsonm = iv_adsonm i_force_deletion = abap_true " Delete despite inconsistencies or dependencies IMPORTING e_t_msg = lt_msg " BW: Table with Messages (Application Log) ). CATCH cx_rs_all_msg INTO lo_exception. " Operation Failed ev_sy_subrc = 4. add_bapiret2_from_cx_root( EXPORTING io_error = lo_exception CHANGING ct_bapiret2 = et_return ). RETURN. ENDTRY. ENDMETHOD. METHOD manage_odp_ds_acc_methods. CLEAR: et_return, ev_sy_subrc. DATA: lv_fieldname TYPE string, lo_access TYPE REF TO cl_rsds_accessmethods, lt_method TYPE rsds_t_r_accessattr, lt_fields TYPE cl_rsds_access_odp=>tt_fields, ls_t100_key TYPE scx_t100key. FIELD-SYMBOLS: <ls_field> TYPE cl_rsds_access_odp=>ts_fields, <ls_method> LIKE LINE OF lt_method. CALL METHOD cl_rsds_accessmethods=>create_object EXPORTING i_datasource = iv_data_source i_logsys = iv_logsys i_infopackage = space i_objvers = rs_c_objvers-new IMPORTING e_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. CALL METHOD lo_access->get_methods( EXPORTING i_filter = 'X' RECEIVING r_t_methods = lt_method ). LOOP AT lt_method ASSIGNING <ls_method>. lo_access->get_methods( ). CALL METHOD lo_access->set_attributes EXPORTING i_accessmethod = <ls_method>-accessmethod. CALL FUNCTION 'RSDS_ODP_SET_GET_GLOBAL' EXPORTING i_odp = iv_odpname i_logsys = iv_logsys i_datasource = iv_data_source. CALL METHOD lo_access->get_attributes EXPORTING i_accessmethod = <ls_method>-accessmethod. CALL METHOD lo_access->set_structure_for_prop EXPORTING i_accessmethod = <ls_method>-accessmethod. CALL FUNCTION 'RSDS_ODP_SET_GET_GLOBAL' IMPORTING et_fields = lt_fields. LOOP AT lt_fields ASSIGNING <ls_field> WHERE name_ds = cl_rs_b4htapd_dp_odp_ds=>co_forbidden_fieldnm-record OR name_ds = cl_rs_b4htapd_dp_odp_ds=>co_forbidden_fieldnm-request OR name_ds = cl_rs_b4htapd_dp_odp_ds=>co_forbidden_fieldnm-datapakid OR name_ds = cl_rs_b4htapd_dp_odp_ds=>co_forbidden_fieldnm-partno. MOVE <ls_field>-name_ds TO lv_fieldname. "lv_fieldname = mo_dp_odp_cds->correct_field( lv_fieldname ). TODO MOVE lv_fieldname TO <ls_field>-name_ds. ENDLOOP. CALL FUNCTION 'RSDS_ODP_SET_GET_GLOBAL' EXPORTING it_fields = lt_fields. CALL METHOD lo_access->get_structure_for_prop EXPORTING i_accessmethod = <ls_method>-accessmethod i_no_popup = rs_c_true 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. ENDLOOP. eo_access = lo_access. ENDMETHOD. METHOD delete_process_chain. CLEAR: et_return, ev_sy_subrc. DATA: lo_chain TYPE REF TO cl_rspc_chain, lt_variant TYPE rspc_t_variante. * ==== Create Chain-Object ==== CREATE OBJECT lo_chain EXPORTING i_chain = iv_chain " Process chain i_objvers = mv_objver i_with_dialog = '' " With online i_new = abap_false EXCEPTIONS aborted_by_user = 1 " User would actually rather not process a chain ... not_unique = 2 " Selection not unique - & user requests not allowed wrong_name = 3 " Incorrect Name of (New) Chain display_only = 4 " Only Display Allowed OTHERS = 5. IF sy-subrc <> 0. ev_sy_subrc = sy-subrc. /goog/cl_bqtr_utility=>add_bapiret2_from_sy( CHANGING ct_bapiret2 = et_return ). RETURN. ENDIF. lo_chain->delete( EXCEPTIONS failed = 1 " Failed 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. ENDMETHOD. METHOD delete_trigger. CLEAR: et_return, ev_sy_subrc. CALL FUNCTION 'RSPC_TRIGGER_DELETE' EXPORTING i_variant = iv_trigger * i_no_transport = " No Transport Connection EXCEPTIONS failed = 1 " Failed 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. ENDMETHOD. METHOD create_trigger. CLEAR: et_return, ev_sy_subrc. DATA: lt_process_data TYPE rspc_t_variante, lv_trigger TYPE string, ls_startspecs TYPE tbtcstrt. ls_startspecs-startdttyp = 'I'. ls_startspecs-periodic = abap_true. IF iv_prdmin IS NOT INITIAL. ls_startspecs-prdmins = iv_prdmin. ELSEIF iv_prdhours IS NOT INITIAL. ls_startspecs-prdhours = iv_prdhours. ELSE. "Default to 1 min. ls_startspecs-prdmins = '01'. ENDIF. lv_trigger = iv_trigger. CALL FUNCTION 'RSPC_TRIGGER_GENERATE' EXPORTING i_variant = CONV rspc_variant( lv_trigger ) i_variant_text = 'Start Trigger' i_startspecs = ls_startspecs " Start Data Description / Repetition Period of Background Job * i_meta = " Start via meta chain * i_no_transport = " No Transport Connection * i_modify = " No error if existence EXCEPTIONS exists = 1 " already exists failed = 2 " Failed OTHERS = 3. IF sy-subrc <> 0. ev_sy_subrc = sy-subrc. /goog/cl_bqtr_utility=>add_bapiret2_from_sy( CHANGING ct_bapiret2 = et_return ). RETURN. ENDIF. ENDMETHOD. METHOD delete_bw_ds. CLEAR: et_return, ev_sy_subrc. CALL METHOD cl_rsds_rsds=>delete_ds EXPORTING i_datasource = CONV #( iv_name ) i_logsys = iv_logsys EXCEPTIONS failed = 1 " Failed not_exists = 2 " Does Not Exist OTHERS = 3. IF sy-subrc <> 0. ev_sy_subrc = sy-subrc. /goog/cl_bqtr_utility=>add_bapiret2_from_sy( CHANGING ct_bapiret2 = et_return ). RETURN. ENDIF. ENDMETHOD. METHOD add_trnf_map_odso. CONSTANTS: co_input TYPE rstran_paramtype VALUE '0', co_output TYPE rstran_paramtype VALUE '1'. DATA: lt_posit TYPE rstran_t_posit_mapping, ls_posit TYPE rstran_s_posit_mapping. TRY. "First field of input ls_posit-posit = 0001. ls_posit-segid = '0001'. ls_posit-paramtype = co_input. APPEND ls_posit TO lt_posit. io_trfn->get_target( IMPORTING e_r_target = DATA(lo_target) ). lo_target->get_header( IMPORTING e_s_head = DATA(ls_header) ). lo_target->get_list( IMPORTING e_t_field = DATA(lt_target_field) ). READ TABLE lt_target_field TRANSPORTING NO FIELDS WITH KEY iobjnm = iv_iobj. IF sy-subrc IS INITIAL. ls_posit-posit = sy-tabix. ls_posit-segid = '0001'. ls_posit-paramtype = co_output. APPEND ls_posit TO lt_posit. ELSE. RETURN. ENDIF. io_trfn->add_rule( EXPORTING i_ruletype = 'DIRECT' i_t_posit = lt_posit i_groupid = '02' ). CLEAR lt_posit. ls_posit-posit = lines( lt_target_field ). ls_posit-segid = '0001'. ls_posit-paramtype = co_output. APPEND ls_posit TO lt_posit. io_trfn->add_rule( EXPORTING i_t_posit = lt_posit i_groupid = '02' ). CATCH cx_root. ENDTRY. ENDMETHOD. METHOD create_dtp_legacy. DATA: ls_src TYPE RSTRAN_S_TLOGO. DATA: ls_trg TYPE RSTRAN_S_TLOGO. ls_src = CORRESPONDING #( IV_TLOGO_DS ). ls_trg = CORRESPONDING #( IV_TLOGO_ADSO ). CALL FUNCTION 'RSDF_GENERATE_DTPA' EXPORTING i_s_src = ls_src i_s_tgt = ls_trg IMPORTING e_dtp = ev_dtpnm 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 ). ENDIF. ENDMETHOD. METHOD create_odso. DATA: lt_field TYPE cl_rsds_access_odp=>tt_repl_field. CLEAR: et_return, ev_sy_subrc. CALL METHOD cl_rsds_access_odp=>rodps_repl_odp_get_detail EXPORTING i_logsys = iv_logsys i_odpname = iv_odpname IMPORTING et_fields = lt_field et_return = et_return. LOOP AT et_return TRANSPORTING NO FIELDS WHERE type CA 'AEX'. EXIT. ENDLOOP. IF sy-subrc IS INITIAL. ev_sy_subrc = 4. RETURN. ENDIF. DATA: ls_key_field TYPE REF TO cl_rsds_access_odp=>ts_repl_field. READ TABLE lt_field REFERENCE INTO ls_key_field INDEX 1. IF sy-subrc IS NOT INITIAL. RETURN. ENDIF. CALL FUNCTION 'RSDF_GENERATE_IOBJ_SIMPLE' EXPORTING i_iobjnm = iv_iobj i_type = 'CHA' i_description = ls_key_field->description i_datatype = 'CHAR' "Anything can go into CHAR i_leng = ls_key_field->length EXCEPTIONS failed = 1 OTHERS = 2. IF sy-subrc <> 0. /goog/cl_bqtr_utility=>add_bapiret2_from_sy( CHANGING ct_bapiret2 = et_return ). ev_sy_subrc = 4. RETURN. ENDIF. DATA: lt_info_obj TYPE STANDARD TABLE OF bapi6108io. lt_info_obj = VALUE #( ( infoobject = iv_iobj ) ). CALL FUNCTION 'BAPI_IOBJ_ACTIVATE_MULTIPLE' TABLES infoobjects = lt_info_obj return = et_return. LOOP AT et_return TRANSPORTING NO FIELDS WHERE type CA 'AEX'. EXIT. ENDLOOP. IF sy-subrc IS INITIAL. ev_sy_subrc = 4. RETURN. ENDIF. DATA: ls_odso_details TYPE bapi6116. DATA: lt_info_obj_odso TYPE STANDARD TABLE OF bapi6116io. ls_odso_details-odsobject = iv_adsonm. ls_odso_details-objvers = 'N'. APPEND VALUE #( odsobject = iv_adsonm posit = 0001 keyflag = 'X' infoobject = iv_iobj iobjtp = 'CHA' ) TO lt_info_obj_odso. CALL FUNCTION 'RSDF_GENERATE_ODSO' EXPORTING i_details = ls_odso_details TABLES i_t_infoobjects = lt_info_obj_odso EXCEPTIONS failed = 1 OTHERS = 2. IF sy-subrc <> 0. /goog/cl_bqtr_utility=>add_bapiret2_from_sy( CHANGING ct_bapiret2 = et_return ). ev_sy_subrc = 4. RETURN. ENDIF. es_tlogo-objnm = iv_adsonm. es_tlogo-tlogo = 'ODSO'. ENDMETHOD. METHOD create_trnf_odso. DATA: ls_source TYPE rstran_s_tlogo, ls_target TYPE rstran_s_tlogo, lv_subrc TYPE sysubrc, lo_trfn TYPE REF TO cl_rstran_trfn, lx_ex TYPE REF TO cx_root. CLEAR: et_return, ev_sy_subrc. "TODO - Check existance MOVE-CORRESPONDING iv_tlogo_ds TO ls_source. MOVE-CORRESPONDING iv_tlogo_adso TO ls_target. TRY. lo_trfn = cl_rstran_trfn=>factory( EXPORTING i_s_source = ls_source i_s_target = ls_target ). CATCH cx_root INTO lx_ex. ev_sy_subrc = 4. add_bapiret2_from_cx_root( EXPORTING io_error = lx_ex CHANGING ct_bapiret2 = et_return ). RETURN. ENDTRY. DATA: lv_tranid TYPE rstranid. lo_trfn->get_tranid( IMPORTING e_tranid = lv_tranid ). add_trnf_map_odso( iv_iobj = iv_iobj io_trfn = lo_trfn ). apply_routine( iv_mass_tr_key = iv_mass_tr_key iv_data_source = conv #( iv_tlogo_ds-object ) io_trfn = lo_trfn iv_mandt_fval = iv_mandt_fval ). * Try to save object TRY. lo_trfn->if_rso_tlogo_maintain~save( EXPORTING i_with_cto = abap_false IMPORTING e_subrc = lv_subrc ). IF lv_subrc <> 0. ev_sy_subrc = lv_subrc. /goog/cl_bqtr_utility=>add_bapiret2_from_sy( CHANGING ct_bapiret2 = et_return ). RETURN. ENDIF. CATCH cx_root INTO lx_ex. ev_sy_subrc = 4. add_bapiret2_from_cx_root( EXPORTING io_error = lx_ex CHANGING ct_bapiret2 = et_return ). RETURN. ENDTRY. * Try to activate object lo_trfn->if_rso_tlogo_maintain~activate( EXPORTING i_force_activation = abap_true i_with_cto = abap_false IMPORTING e_subrc = lv_subrc ). IF lv_subrc <> 0. ev_sy_subrc = lv_subrc. /goog/cl_bqtr_utility=>add_bapiret2_from_sy( CHANGING ct_bapiret2 = et_return ). RETURN. ENDIF. es_tlogo-objnm = lv_tranid. es_tlogo-tlogo = 'TRFN'. ENDMETHOD. METHOD delete_odso. DATA: l_t_ods TYPE TABLE OF rso_s_tlogo, l_s_ods TYPE rso_s_tlogo, l_th_ods TYPE rso_th_tlogo, l_s_odstab TYPE rstran_ut_ods_delete, g_r_odso TYPE REF TO cl_rsd_odso, l_ods TYPE rsdodsobject. l_s_ods-tlogo = 'ODSO'. l_s_ods-objnm = iv_adsonm. l_ods = iv_adsonm. CALL METHOD cl_rsd_odso=>factory EXPORTING i_odsobject = l_ods RECEIVING r_r_odso = g_r_odso EXCEPTIONS input_invalid = 1 cancelled = 2 OTHERS = 3. IF sy-subrc <> 0. /goog/cl_bqtr_utility=>add_bapiret2_from_sy( CHANGING ct_bapiret2 = et_return ). ev_sy_subrc = 4. RETURN. ENDIF. APPEND l_s_ods TO l_t_ods. l_th_ods = l_t_ods. TRY. CALL METHOD g_r_odso->prepare EXPORTING i_with_enqueue = rs_c_true i_with_authority = rs_c_true. CATCH cx_rs_error INTO DATA(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. TRY. CALL METHOD g_r_odso->delete EXPORTING i_th_tlogo = l_th_ods i_external = rs_c_false i_show_protocol = rs_c_false i_with_cto = rs_c_true. CATCH cx_rs_cancelled INTO DATA(lr_rs_cancelled). ev_sy_subrc = 4. add_bapiret2_from_rs_error( EXPORTING io_rs_error = lr_rs_cancelled CHANGING ct_bapiret2 = et_return ). RETURN. ENDTRY. COMMIT WORK. DATA: lt_iobj_del TYPE rsd_t_c30. DATA: lt_msg TYPE rs_t_msg. DATA: lv_subrc TYPE sysubrc. lt_iobj_del = VALUE #( ( objnm = iv_iobj ) ). CALL FUNCTION 'RSDG_IOBJ_MULTI_DELETE' EXPORTING i_t_iobjnm = lt_iobj_del IMPORTING e_t_msg = lt_msg e_subrc = lv_subrc. LOOP AT lt_msg ASSIGNING FIELD-SYMBOL(<ls_msg>) WHERE msgty = 'E'. DATA(ls_bapiret2) = VALUE 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. COMMIT WORK. ENDMETHOD. ENDCLASS.