Enhanced SQL

 REPORT zdemo_esql_02.

" Usage of Sum expression

TYPES: BEGIN OF d_final,

         carrid TYPE s_carr_id,

*         CONNID TYPE S_CONN_ID,

         price  TYPE s_price,

       END OF d_final.


DATA: gt_final TYPE STANDARD TABLE OF d_final.


SELECT sf~carrid,

*       SF~CONNID,

       SUM( sf~price ) AS price

       FROM sflight AS sf

            INNER JOIN sbook AS sb

            ON sf~carrid EQ sb~carrid

            INTO TABLE @gt_final

            GROUP BY sf~carrid

            ORDER BY sf~carrid.

IF sy-subrc EQ 0.

  LOOP AT gt_final ASSIGNING FIELD-SYMBOL(<fs>).

    WRITE:/ <fs>-carrid. "<fs>-connid,<fs>-carrid.

  ENDLOOP.

ENDIF.


REPORT zdemo_esql_03.



" Usage of Case Statement

DATA: lv_fert type mtart.

      lv_fert =  'Finished Products'.


SELECT matnr,

   MTART,

  CASE

    WHEN MTART =  'FERT' THEN @lv_fert

    WHEN MTART  = 'HALB' THEN 'Semifinished Products'"

    ELSE 'Other Material Type'

  END AS desc

  FROM mara

  INTO TABLE @DATA(gt_material) UP TO 10 ROWS.


IF sy-subrc EQ 0.

  LOOP AT gt_material ASSIGNING FIELD-SYMBOL(<fs>).

    WRITE: / <fs>-matnr, 45 <fs>-mtart, 60 <fs>-desc.

  ENDLOOP.

ENDIF.


REPORT zdemo_esql_04.


START-OF-SELECTION.

  PERFORM start_of_selection.


FORM start_of_selection.


*Select

  SELECT


*Using constants

   'Demo_Const' AS demo_of_constant,

     @abap_true AS demo_another_const,


*System fields Sy-fields

  @sy-uname AS current_user,

  @sy-datum AS current_date,


  snwd_bpa~bp_id,

  snwd_bpa~bp_role ,


*case

  CASE snwd_bpa~bp_role

  WHEN '01' THEN 'Customer'

  WHEN '02' THEN 'Suplier'

  ELSE 'un-known'

  END AS bp_role_text,


*coalesce

   coalesce( snwd_bpa~company_name, 'n/a' ) AS company_name,

   snwd_ad~country,

   snwd_ad~city,

   snwd_ad~address_type,

   snwd_so~so_id,

   snwd_so~currency_code,

*coalesce

   coalesce( snwd_so~currency_code, 'n/a' ) AS curr_code_coalesce,

*rounding

   round( snwd_so~gross_amount, 2 ) AS gross_amount,

*case - multi-level

   CASE snwd_so~lifecycle_status

   WHEN 'N' THEN 'new'

   WHEN 'P' THEN

      CASE snwd_so~billing_status

          WHEN 'P' THEN'paid'

          ELSE 'pending'

          END

       ELSE 'undefined'

       END

   AS calculated_status,


*text functions

   snwd_ad~country && '-' &&  snwd_ad~city AS country_city,


*combining sy-fields and concatenate

  @sy-sysid && '/' && @sy-mandt AS sys_info


*[further ideas here!] :-)


   FROM snwd_bpa

   INNER JOIN snwd_ad

   ON snwd_bpa~address_guid = snwd_ad~node_key

   LEFT OUTER JOIN snwd_so ON

   snwd_bpa~node_key = snwd_so~buyer_guid


   INTO TABLE @DATA(lt_data).


*display

  PERFORM display_data CHANGING lt_data.


ENDFORM.




FORM display_data USING pt_data TYPE ANY TABLE.


  DATA: lr_alv          TYPE REF TO cl_salv_table.

  DATA: lr_functions TYPE REF TO cl_salv_functions_list,

        lr_layout    TYPE REF TO cl_salv_layout,

        ls_key       TYPE salv_s_layout_key.

  TRY.

      CALL METHOD cl_salv_table=>factory

        EXPORTING

          list_display = if_salv_c_bool_sap=>false

        IMPORTING

          r_salv_table = lr_alv

        CHANGING

          t_table      = pt_data.

    CATCH cx_salv_msg .

  ENDTRY.


* Layout

  lr_layout = lr_alv->get_layout( ).


  ls_key-report = sy-repid.

  lr_layout->set_key( ls_key ).

  lr_layout->set_default( abap_true ).

  lr_layout->set_save_restriction( if_salv_c_layout=>restrict_none ).


*Functions

  lr_functions = lr_alv->get_functions( ).

  lr_functions->set_all( abap_true ).


  CALL METHOD lr_alv->display.


ENDFORM.                    "display_data


REPORT zdemo_esql_05.


* This example demonstrates one way to use a constant value in the SELECT list.


*Determines whether a row exists for a WHERE condition (regardless of the content of the row).

*A constant is specified to make it unnecessary to specify a column of the database and transport it.

*The target object exists is created using an inline declaration.


CLASS demo DEFINITION.

  PUBLIC SECTION.

    CLASS-METHODS main.

ENDCLASS.


CLASS demo IMPLEMENTATION.

  METHOD main.


    DATA carrier TYPE scarr-carrid.

    cl_demo_input=>request( CHANGING field = carrier ).


    SELECT SINGLE @abap_true

           FROM scarr

           WHERE carrid = @carrier

           INTO @DATA(exists).

      IF exists = abap_true.

        cl_demo_output=>display(

          |Carrier { carrier } exists in SCARR| ).

      ELSE.

        cl_demo_output=>display(

          |Carrier { carrier } does not exist in SCARR| ).

      ENDIF.

    ENDMETHOD.

ENDCLASS.


START-OF-SELECTION.

  demo=>main( ).


REPORT zdemo_esql_06.



* To perform floating point division with integer columns,

* these columns are updated to the type FLTP using cast.


* Integer divisions with the functions DIV, MOD, and DIVISION

* do not require this update.


CLASS demo DEFINITION.

  PUBLIC SECTION.

    CLASS-METHODS main.

ENDCLASS.


CLASS demo IMPLEMENTATION.

  METHOD main.

    DATA(rnd) = cl_abap_random_int=>create(

      seed = CONV i( sy-uzeit ) min = 1 max = 100 ).

    DELETE FROM demo_expressions.

    INSERT demo_expressions FROM TABLE @( VALUE #(

      FOR i = 0 UNTIL i > 9

      ( id = |{ i }|

        num1 = rnd->get_next( )

        num2 = rnd->get_next( ) ) ) ).


    DATA(offset) = 10000.


    SELECT id, num1, num2,

           CAST( num1 AS FLTP ) / CAST( num2 AS FLTP ) AS ratio,

           div( num1, num2 ) AS div,

           division( num1, num2, 2 ) AS division,

           mod( num1, num2 ) AS mod,

           @offset + abs( num1 - num2 ) AS sum

           FROM demo_expressions

           ORDER BY sum DESCENDING

           INTO TABLE @DATA(results).


    cl_demo_output=>display( results ).

  ENDMETHOD.

ENDCLASS.


START-OF-SELECTION.

  demo=>main( ).


REPORT zdemo_esql_07.


* Strings can also be concatenated using the SQL function CONCAT.

* The function CONCAT is restricted to concatenations of two operands

* but has the following benefits when compared to the operator &&:

* It allows expressions to be used as operands.

* It allows more data types.

* It does not apply any special handling to constants and text field literals

* that contain only blanks.

* It allows results to be longer than 255 characters.


* The operator && can only be used to chain the elementary operands stated above. Any other expressions cannot be chained.

*  The result of the chaining must be no longer than 255 characters.


CLASS demo DEFINITION.

  PUBLIC SECTION.

    CLASS-METHODS main.

ENDCLASS.


CLASS demo IMPLEMENTATION.

  METHOD main.

    DELETE FROM demo_expressions.

    INSERT demo_expressions FROM TABLE @( VALUE #(

      ( id = 'x' char1 = 'aaaaa' char2 = 'bbbbb' )

      ( id = 'y' char1 = 'xxxxx' char2 = 'yyyyy' )

      ( id = 'z' char1 = 'mmmmm' char2 = 'nnnnn' ) ) ).


    DATA(else) = 'fffff'.


    SELECT id, char1, char2,

           CASE char1

             WHEN 'aaaaa' THEN ( char1 && char2 )

             WHEN 'xxxxx' THEN ( char2 && char1 )

             ELSE @else

           END AS text

           FROM demo_expressions

           INTO TABLE @DATA(results).


    cl_demo_output=>display( results ).

  ENDMETHOD.

ENDCLASS.


START-OF-SELECTION.

  demo=>main( ).


REPORT zdemo_esql_08.


* The example shows two SELECT statements that differ only in the arrangement

* of their SELECT and FROM clauses.

* The result of the two statements,

* which access two database tables via an INNER JOIN, is identical.


DATA: cityfrom       TYPE spfli-cityfrom VALUE 'FRANKFURT',

      lcl_ex_handler TYPE REF TO cx_root.


SELECT c~carrname,

       p~connid,

       p~cityfrom,

       p~cityto

       FROM scarr AS c

            INNER JOIN spfli AS p

                  ON c~carrid = p~carrid

       WHERE p~cityfrom = @cityfrom

       ORDER BY c~carrname, p~connid, p~cityfrom, p~cityto

       INTO TABLE @DATA(result1)

       UP TO 10 ROWS.


* Alternate syntax from

SELECT FROM scarr AS c

            INNER JOIN spfli AS p

                  ON c~carrid = p~carrid

       FIELDS c~carrname, p~connid, p~cityfrom, p~cityto

       WHERE p~cityfrom = @cityfrom

       ORDER BY c~carrname, p~connid, p~cityfrom, p~cityto

       INTO TABLE @DATA(result2)

       UP TO 10 ROWS.



ASSERT result2 = result1.


cl_demo_output=>display( result1 ).


REPORT zdemo_esql_09.


CLASS demo DEFINITION.

  PUBLIC SECTION.

    CLASS-METHODS main.

ENDCLASS.


CLASS demo IMPLEMENTATION.

  METHOD main.

    DATA carrid TYPE sflight-carrid VALUE 'AA'.

    cl_demo_input=>request( CHANGING field = carrid ).


    SELECT 'I' AS mark, carrid, connid, fldate, seatsocc

           FROM sflight

           WHERE carrid = @( to_upper( carrid ) )


           UNION


           SELECT 'T' AS mark,

                        carrid,

                        connid,

                        "@( CONV d( '00000000' ) ) AS fldate,

                        CAST( '00000000' AS DATS ) AS fldate,

                        SUM( seatsocc ) AS seatsocc

                        FROM sflight

                        WHERE carrid = @( to_upper( carrid ) )

                        GROUP BY carrid, connid

           ORDER BY carrid, connid, mark, fldate, seatsocc

           INTO TABLE @DATA(result).

   cl_demo_output=>display( result ).

  ENDMETHOD.

ENDCLASS.


START-OF-SELECTION.

  demo=>main( ).

REPORT zdemo_esql_10.


  SELECT 'Item' as Mark,

         a~carrid,

         a~connid,

         b~fldate,


  CASE a~custtype

  WHEN 'B' THEN 'Business Partner'

  WHEN 'P' THEN 'Individual'

  END AS custtype,


a~forcuram * 10 as multiplied_curr,


  'From' && ' ' && c~cityfrom && ' ' &&

  'To'   && ' ' && c~cityto AS dest,


  coalesce( d~carrname, 'N/A' ) AS pname


  FROM sbook AS a

  INNER JOIN sflight as b  on  a~carrid EQ b~carrid

                           and a~connid EQ b~connid

                           and a~fldate EQ b~fldate

  LEFT OUTER JOIN spfli AS c

  ON a~carrid EQ c~carrid


  LEFT OUTER JOIN scarr AS d

  ON a~carrid EQ d~carrid


  UNION SELECT 'Totl' as Mark,

         a~carrid,

         a~connid,

         CAST( '00000000' AS DATS ) AS fldate,


  CASE a~custtype

  WHEN 'B' THEN 'Business Partner'

  WHEN 'P' THEN 'Individual'

  END AS custtype,


  SUM( a~forcuram * 10 ) AS multiplied_curr,


  @space AS dest,


  @space AS pname


  FROM sbook AS a

  INNER JOIN sflight as b  on  a~carrid EQ b~carrid

                           and a~connid EQ b~connid

                           and a~fldate EQ b~fldate

  LEFT OUTER JOIN spfli AS c

  ON a~carrid EQ c~carrid


  LEFT OUTER JOIN scarr AS d

  ON a~carrid EQ d~carrid


 GROUP BY a~carrid,

            a~connid,

            a~custtype


 ORDER BY  carrid,

           connid,

           custtype,

           mark,

           fldate

             INTO TABLE @DATA(gt_records).


  TRY.

      cl_salv_table=>factory(

         IMPORTING

           r_salv_table   = DATA(lo_alv_display)

        CHANGING

          t_table        =  gt_records ).

    CATCH cx_salv_msg INTO DATA(lref_msg). " ALV: General Error Class with Message

      DATA(lv_error) = lref_msg->get_message( ).

  ENDTRY.


  lo_alv_display->display( ).


Comments