OpenSQL Enhancements

  Entwicklung von und mit ABAP / ABAP Objects   Home  Profil  Links  Datenschutz  Impressum

Inline-Deklaration

alt
 
DATA lt_sflight TYPE STANDARD TABLE OF sflight WITH EMPTY KEY.
SELECT * FROM sflight
  INTO TABLE lt_sflight.
neu
 
SELECT * FROM sflight
  INTO TABLE @DATA(lt_sflight).
 

mit Feldliste

alt
 
TYPES: BEGIN OF ts_sflight,
  carrid TYPE sflight-carrid,
  connid TYPE sflight-connid,
  fldate TYPE sflight-fldate,
END OF ts_sflight.
DATA lt_sflight TYPE STANDARD TABLE OF ts_sflight.
SELECT carrid connid fldate FROM sflight
  INTO TABLE lt_sflight.
neu
 
SELECT carrid, connid, fldate FROM sflight
  INTO TABLE @DATA(lt_sflight).
 

mit Host-Variablen (@)

alt
 
TYPES: BEGIN OF ts_sflight,
  carrid TYPE sflight-carrid,
  connid TYPE sflight-connid,
  fldate TYPE sflight-fldate,
END OF ts_sflight.
DATA lt_sflight TYPE STANDARD TABLE OF ts_sflight.
SELECT carrid connid fldate FROM sflight
  INTO TABLE lt_sflight
  WHERE carrid IN s_carrid.
neu
 
SELECT carrid, connid, fldate FROM sflight
  WHERE carrid IN @s_carrid
  INTO TABLE @DATA(lt_sflight).
 

Definition von anderen Feldnamen und Zusatzfeldern

alt
 
TYPES: BEGIN OF ts_sflight,
  carrer_id        TYPE sflight-carrid,
  connection_id  TYPE sflight-connid,
  flight_date    TYPE sflight-fldate,
  status_flag    TYPE abap_true, "Zusatzfeld
END OF ts_sflight.
DATA lt_sflight TYPE STANDARD TABLE OF ts_sflight.
SELECT carrid AS carrer_id
       connid AS connection_id
       fldate AS flight_date
  FROM sflight
  INTO CORRESPONDING FIELDS OF TABLE lt_sflight
  WHERE carrid IN s_carrid.
neu
 
SELECT carrid AS carrier,
       connid AS connection,
       fldate AS flight_date
       ' ' AS status_flag
  FROM sflight
  WHERE carrid IN @s_carrid
  INTO TABLE @DATA(lt_sflight).
 

Arithmetische Operationen

alt
neu
 
SELECT carrid,
       connid,
       fltime + 90 AS total_time,
       DIVISION( fltime, 60, 2 ) AS flight_time
  FROM spfli
  WHERE carrid IN @s_carrid
  INTO TABLE @DATA(lt_sflight).
 

String-Operationen

alt
neu
 
SELECT SINGLE CONCAT( vorna, nachn ) AS name_concat,
              CONCAT_WITH_SPACE( vorna, nachn, 1 ) AS nachn_concat_with_space
              LENGTH( nachn ) AS nachn_length,
              LEFT( nachn, 2 ) AS nachn_left,
              LOWER( nachn ) AS nachn_lower,
              UPPER( nachn ) AS nachn_upper,
              RIGHT( nachn, 2 ) AS nachn_right,
              SUBSTRING( nachn, 2, 2 ) AS nachn_substring,
              REPLACE( nachn, 'ß' , 'ss' ) AS nachn_replace,
  FROM pa0002 INTO @DATA(ls_pa0002)
  WHERE pernr = @iv_pernr
  AND   begda <= @sy-datum
  AND   endda >= @sy-datum.
 

Datumsfunktionen

alt
neu
 
SELECT SINGLE dats_is_valid( begda ) AS valid,
              dats_days_between( begda, endda ) AS days_between,
              dats_add_days( begda, 100 ) AS add_days,
              dats_add_months( begda, -1 ) AS add_month
  FROM hrp1001
  INTO @DATA(ls_hrp1001).
 

CASE-Bedingungen

alt
neu
 
Simple case
 
SELECT mandt, cccategory,
       CASE cccategory
         WHEN 'C' THEN 'Customizing'
         WHEN 'P' THEN 'Production'
         WHEN 'T' THEN 'Testing'
         ELSE 'Something Else'
       END AS group
  FROM t000
  INTO @DATA(ls_t000).
 
 
Complex Case / Searched case
 
SELECT carrid, connid, fldate, seatsocc_b, seatsocc,
       CASE
         WHEN seatsocc_b < 10 AND seatsocc < 10 THEN 'Both less than 10'
         WHEN seatsocc_b ≥ 10 AND seatsocc ≥ 10 THEN 'Both more than 10'
         ELSE 'Something Else'
       END AS group
  FROM sflight
  INTO @DATA(ls_sflight).
 

Aggregierungsabfragen

alt
neu
 
SELECT carrid,
       SUM( price ) AS total_price
  FROM sflight
  GROUP BY carrid
  INTO TABLE @DATA(lt_sflight).
 
 
SELECT carrid, seatsocc_f, seatsocc_b, seatsocc,
       seatsocc_f + seatsocc_b + seatsocc AS occupied,
       COUNT( * ) AS count
  FROM sflight
  GROUP BY seatsocc_f + seatsocc_b + seatsocc
  HAVING COUNT( * ) > 10
  ORDER BY occupied
  INTO TABLE @DATA(lt_sflight).
 

Mandantenbehandlung

alt
 
DATA lt_sflight TYPE STANDARD TABLE OF sflight WITH DEFAULT KEY,
SELECT * FROM sflight INTO TABLE lt_sflight
  CLIENT SPECIFIED
  WHERE mandt = '100'
  AND   carrid IN s_carrid.
neu
 
SELECT * FROM sflight
  USING CLIENT '100'
  WHERE carrid IN @s_carrid
  INTO TABLE @DATA(lt_sflight).
 

INNER JOIN / LEFT INNER JOIN

alt
 
DATA lt_sflight TYPE STANDARD TABLE OF sflight WITH DEFAULT KEY.
SELECT a~carrname b~connid FROM scarr AS a
  INNER JOIN spfli AS b ON  b~carrid = a~carrid
  INTO TABLE lt_sflight
  WHERE b~cityfrom = 'BERLIN'.
neu
 
DATA(lv_city_from) = 'BERLIN'.
SELECT a~carrname, b~connid FROM scarr AS a
  INNER JOIN spfli AS b ON  b~carrid = a~carrid
                        AND b~cityfrom = @lv_city_from
  INTO TABLE @DATA(lt_sflight).
 

LEFT OUTER JOIN

alt
 
TYPES:
  BEGIN OF ts_sflight,
    carrname TYPE scarr-carrname,
    connid   TYPE spfli-connid,
  END OF ts_sflight.
DATA:
  lt_sflight TYPE STANDARD TABLE OF ts_sflight.
  lv_city_from TYPE spfli-cityfrom.
lv_city_from = 'BERLIN'.
SELECT a~carrname, b~connid
  INTO TABLE lt_sflight FROM scarr AS a
  LEFT OUTER JOIN spfli AS b ON b~carrid = a~carrid
  WHERE b~cityfrom = lv_city_from.
neu
 
DATA(lv_city_from) = 'BERLIN'.
SELECT a~carrname, b~connid
  FROM scarr AS a
  LEFT OUTER JOIN spfli AS b ON  b~carrid = a~carrid
                             AND b~cityfrom = @lv_city_from
  INTO TABLE @DATA(lt_sflight).
 

COALESCE

alt
neu
 
DATA(lv_city_from) = 'BERLIN'.
SELECT a~carrname, COALESCE( b~connid, '9999' ) AS connid
  FROM scarr AS a
  LEFT OUTER JOIN spfli AS b ON  b~carrid = a~carrid
                             AND b~cityfrom = @lv_city_from
  INTO TABLE @DATA(lt_sflight).
 

RIGHT OUTER JOIN

alt
 
TYPES:
  BEGIN OF ts_sflight,
    carrname TYPE scarr-carrname,
    connid   TYPE spfli-connid,
  END OF ts_sflight.
DATA:
  lt_sflight TYPE STANDARD TABLE OF ts_sflight.
  lv_city_from TYPE spfli-cityfrom.
lv_city_from = 'BERLIN'.
SELECT a~carrname, b~connid
  INTO TABLE lt_sflight FROM scarr AS a
  RIGHT OUTER JOIN spfli AS b ON b~carrid = a~carrid
  WHERE b~cityfrom = lv_city_from.
neu
 
DATA(lv_city_from) = 'BERLIN'.
SELECT a~carrname, b~connid
  FROM scarr AS a
  RIGHT OUTER JOIN spfli AS b ON  b~carrid = a~carrid
                              AND b~cityfrom = @lv_city_from
  INTO TABLE @DATA(lt_sflight).
 

Alle Datenfelder aus einer Tabelle in einem JOIN selektieren

alt
neu
 
SELECT FROM sflight
  INNER JOIN spfli ON  sflight~carrid = spfli~carrid
                   AND sflight~connid = spfli~connid
  FIELDS spfli~*, sflight~fldate
  INTO TABLE @DATA(lt_spfli).
 

SELECT mit UNION

alt
 
SELECT schedule~carrid, schedule~connid, schedule~fldate,
       flight~cityfrom, flight~cityto
  FROM sflight AS schedule
  INNER JOIN spfli AS flight
    ON  schedule~carrid = flight~carrid
    AND schedule~connid = flight~connid
  WHERE flight~cityfrom = 'FRANKFURT'
  INTO TABLE @DATA(lt_sflight).
SELECT schedule~carrid, schedule~connid, schedule~fldate,
       flight~cityfrom, flight~cityto
  FROM sflight AS schedule
  INNER JOIN spfli AS flight
    ON  schedule~carrid = flight~carrid
    AND schedule~connid = flight~connid
  WHERE flight~cityfrom = 'SAN FRANCISCO'
  APPENDING TABLE @lt_sflight.
neu
 
SELECT schedule~carrid, schedule~connid, schedule~fldate,
       flight~cityfrom, flight~cityto
  FROM sflight AS schedule
  INNER JOIN spfli AS flight
    ON  schedule~carrid = flight~carrid
    AND schedule~connid = flight~connid
    WHERE flight~cityfrom = 'FRANKFURT'
UNION ALL
SELECT schedule~carrid, schedule~connid, schedule~fldate,
       flight~cityfrom, flight~cityto
  FROM sflight AS schedule
  INNER JOIN spfli AS flight
    ON  schedule~carrid = flight~carrid
    AND schedule~connid = flight~connid
  WHERE flight~cityfrom = 'SAN FRANCISCO'
INTO TABLE @DATA(lt_sflight).
 

SELECT auf einer internen Tabelle

alt
neu
 
"1. Daten aus einer Datenbanktabelle selektieren und internte Tabelle bestücken
SELECT schedule~carrid AS carrier_id,
       schedule~connid AS connection_id,
       schedule~fldate AS flight_date,
       flight~cityfrom AS city_from,
       flight~cityto   AS city_to
  FROM sflight AS schedule
INNER JOIN spfli AS flight
    ON  schedule~carrid = flight~carrid
    AND schedule~connid = flight~connid
  INTO TABLE @DATA(lt_flights).
 
"2. Daten aus der internen Tabelle selektieren
SELECT carrier_id, connection_id, flight_date
  FROM @lt_flights AS flights
  WHERE city_from = 'FRANKFURT'
  INTO TABLE @DATA(lt_new_flights).
 

Feldliste mittels FIELD spezifizieren

alt
neu
 
SELECT SINGLE FROM @lt_flights AS flights
  FIELDS carrier_id, connection_id
  WHERE flight_date = @sy-datum
  AND   city_from = 'FRANKFURT'
  INTO @DATA(lt_todays_flight).
 

Verwendung einer temporären interne Tabelle mittels WITH (ab Release 7.51 und höher)

alt
neu
 
WITH
  +cities AS ( SELECT cityfrom AS city FROM spfli WHERE carrid = 'LH'
               UNION DISTINCT
               SELECT cityto AS city FROM spfli WHERE carrid = 'LH' )
  SELECT * FROM sgeocity
    WHERE city IN ( SELECT city FROM +cities )
    INTO TABLE @DATA(result).
 

Suche unabhängig von der Gross-/Kleinschreibung

alt
neu
 
DATA(lv_search_string) = 'IRon'.
DATA(lv_search_text) = |%{ to_upper( lv_search_string ) }%|.
SELECT * FROM t100
  WHERE upper( text ) LIKE @lv_search_text
  INTO TABLE @DATA(lt_t100).
 

Komplexe WHERE-Bedingung

alt
neu
 
Arithmetische Operation in der WHERE-Bedingung
 
SELECT * FROM sflight
  WHERE ( seatsmax - seatsocc ) > 10
  INTO TABLE @DATA(lt_sflight).
 
Methodenaufruf in der WHERE-Bedingung
 
SELECT * FROM sflight
  WHERE connid = @( lcl_local_class->get_connid( ) )
  INTO TABLE @DATA(lt_sflight).
 
IS INITIAL oder IS NOT INITIAL in der WHERE-Bedingung
 
SELECT * FROM sflight
  WHERE price IS NOT INITIAL
  AND   seatsmax IS NOT INITIAL
  INTO TABLE @DATA(lt_sflight).