Quantcast
Channel: SCN: Message List - Push down SELECT-OPTIONS to HANA
Viewing all articles
Browse latest Browse all 9

Re: Push down SELECT-OPTIONS to HANA

$
0
0

Hi Thorsten,

 

I had this post as bookmark just in case there would be more discussion on this.

 

This is something i could come up with to convert Select Options  into Native SQL for HANA. Probably you may have already found the solution.

 

SAP Demo Report      RSMDS_DEMO

 

Please change the MANDT and Schema Information

 

 

 

REPORT  zztest_hana_0001_sdn.

 

TABLES vbak.

 

PARAMETERS pa_con    TYPE dbcon_name DEFAULT 'XXX'.

 

SELECT-OPTIONS : so_erdat FOR vbak-erdat,

                  so_vdatu FOR vbak-erdat,

                  so_kunnr FOR vbak-kunnr.

 

 

TYPES: BEGIN OF typ_dynamic,

        vbeln TYPE vbeln,

        END OF typ_dynamic.

 

*-- HANA Call Variables

DATA l_sql_con   TYPE REF TO cl_sql_connection.

DATA l_sql       TYPE REF TO cl_sql_statement.

DATA l_result    TYPE REF TO cl_sql_result_set.

DATA l_statement TYPE string.

DATA ls_dbcon    TYPE dbcon.

DATA lt_result   TYPE STANDARD TABLE OF typ_dynamic.

DATA ls_result   TYPE typ_dynamic.

DATA lf_result   TYPE REF TO data.

DATA l_string    TYPE string.

 

*-- Runtime Calc Variables

DATA dbcnt       TYPE sy-dbcnt.

DATA seconds     TYPE i.

DATA rate        TYPE i.

DATA time_start  TYPE timestampl.

DATA time_stop   TYPE timestampl.

 

*-- Where clause generation

DATA acc_gen_cp TYPE rsmds_boolean.

DATA r_universe TYPE REF TO cl_rsmds_universe.

DATA r_dim0     TYPE REF TO if_rsmds_dimension.

DATA r_dim1     TYPE REF TO if_rsmds_dimension.

DATA r_renderer TYPE REF TO if_rsmds_condition_renderer.

DATA r_dim2     TYPE REF TO if_rsmds_dimension.

DATA r_dim3     TYPE REF TO if_rsmds_dimension.

DATA r_seti     TYPE REF TO cl_rsmds_set.

DATA r_set      TYPE REF TO cl_rsmds_set.

DATA incl_null  TYPE rsmds_boolean.

DATA r_set0     TYPE REF TO cl_rsmds_set.

DATA rx_message TYPE REF TO cx_rsmds_message.

 

DEFINE start_timer.

   get time stamp field time_start.

END-OF-DEFINITION.

 

DEFINE stop_timer.

   get time stamp field time_stop.

   perform calculate_rate

     using    time_start time_stop dbcnt

     changing &2.

   check &1 = &1.

END-OF-DEFINITION.

 

 

*&---------------------------------------------------------------------*

*&      Form  calculate_rate

*&---------------------------------------------------------------------*

FORM calculate_rate

   USING

     i_time_start LIKE time_start

     i_time_stop  LIKE time_stop

     i_records    TYPE i

   CHANGING

     e_rate       LIKE rate.

 

   DATA:

     l_date_start TYPE d,

     l_date_stop  TYPE d,

     l_time_start TYPE t,

     l_time_stop  TYPE t.

 

   CONSTANTS:

 

     c_tzone_utc TYPE timezone VALUE IS INITIAL.

   IF i_time_start LT i_time_stop.

     CONVERT TIME STAMP i_time_start TIME ZONE c_tzone_utc

             INTO DATE l_date_start TIME l_time_start.

     CONVERT TIME STAMP i_time_stop TIME ZONE c_tzone_utc

             INTO DATE l_date_stop  TIME l_time_stop.

     TRY.

         e_rate = i_records /

                  ( ( l_date_stop  * 86400 + l_time_stop  + frac( i_time_stop  ) ) -

                    ( l_date_start * 86400 + l_time_start + frac( i_time_start ) )   ).

       CATCH cx_sy_arithmetic_overflow.

         CLEAR e_rate.

     ENDTRY.

   ELSE.

     CLEAR e_rate.

   ENDIF.

 

ENDFORM.                    "calculate_rate

 

 

START-OF-SELECTION.

 

 

   start_timer.

   r_universe = cl_rsmds_ddic_universe=>create_by_tabname( 'VBAK' ).

 

* Get references of dimensions from the dimension model by name

   r_dim0 = r_universe->get_dimension_by_name( 'MANDT' ).

   r_dim1 = r_universe->get_dimension_by_name( 'KUNNR' ).

   r_dim2 = r_universe->get_dimension_by_name( 'ERDAT' ).

   r_dim3 = r_universe->get_dimension_by_name( 'VDATU' ).

 

 

   r_renderer = cl_rsmds_native_sql_renderer=>get_condition_renderer( ).

   r_set0     = r_dim0->create_set_from_value( sy-mandt ).

   r_seti     = cl_rsmds_set=>get_universal_set( ).

 

   TRY.

       r_set = r_dim1->create_set_from_ranges(

                 i_t_ranges                = so_kunnr[]

                 i_final                   = rsmds_c_boolean-true

                 i_accept_general_patterns = acc_gen_cp           ).

     CATCH cx_rsmds_input_invalid INTO rx_message.

       MESSAGE rx_message TYPE 'I'.

       LEAVE PROGRAM.

   ENDTRY.

   r_seti = r_seti->intersect( r_set ).

 

   TRY.

       r_set = r_dim2->create_set_from_ranges(

                 i_t_ranges                = so_erdat[]

                 i_final                   = rsmds_c_boolean-true

                 i_accept_general_patterns = acc_gen_cp           ).

     CATCH cx_rsmds_input_invalid INTO rx_message.

       MESSAGE rx_message TYPE 'I'.

       LEAVE PROGRAM.

   ENDTRY.

   r_seti = r_seti->intersect( r_set ).

 

   TRY.

       r_set = r_dim3->create_set_from_ranges(

                 i_t_ranges                = so_vdatu[]

                 i_final                   = rsmds_c_boolean-true

                 i_accept_general_patterns = acc_gen_cp           ).

     CATCH cx_rsmds_input_invalid INTO rx_message.

       MESSAGE rx_message TYPE 'I'.

       LEAVE PROGRAM.

   ENDTRY.

   r_seti = r_seti->intersect( r_set ).

 

 

   l_string = r_seti->to_string(

                i_r_renderer = r_renderer

                i_include_null_conditions = incl_null  ).

 

   GET REFERENCE OF lt_result INTO lf_result.

 

   SELECT SINGLE * FROM dbcon INTO ls_dbcon

    WHERE con_name = pa_con

      AND dbms     = 'HDB'"HANA

   IF sy-subrc NE 0.

     MESSAGE 'Invalid DB Con ID' TYPE 'E'.

   ENDIF.

 

   l_sql_con = cl_sql_connection=>get_connection( pa_con ).

   CREATE OBJECT l_sql

     EXPORTING

       con_ref = l_sql_con.

 

 

   l_sql->execute_ddl( |set schema { 'XXX'  }| ).    "Please substitue your Schema Name

 

   IF l_string IS NOT INITIAL.

     l_statement = |select vbeln from "VBAK" where mandt = '800' and |.

     CONCATENATE l_statement l_string INTO l_statement.

   ELSE.

     l_statement = |select vbeln from "VBAK" where mandt = '800' |.

   ENDIF.

   TRY.

       l_result = l_sql->execute_query( l_statement ).

 

       l_result->set_param_table( lf_result ).

       l_result->next_package( ).

       l_result->close( ).

     CATCH cx_sql_exception.

       MESSAGE 'Call to HANA System Failed' TYPE 'E'.

   ENDTRY.

 

   dbcnt = lines( lt_result ).

   stop_timer dbcnt rate.

 

   WRITE: / 'ABAP (HANA DB)  :   SY-DBCNT =', dbcnt, 'RATE =', rate, '1/S'.

 

 

 

Regards,

Arun Sambargi

 

 

 



Viewing all articles
Browse latest Browse all 9

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>