create_bw_ds

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' ).