ABAP T04-001 OpenSQL
ABAP T04-001 OpenSQL
Agenda
1. Open SQL Part 1 – SELECT using obsolete TABLES
2. Open SQL Part 2 – SELECT using standard Internal
Table
3. OpenSQL to modify data (INSERT / UPDATE / MODIFY /
DELETE)
4. New OpenSQL syntaxes
Open SQL Part 1 –
SELECT using obsolete TABLES
Section 1
Topic Objectives
» What is Open SQL?
» Use the SELECT statement and the WHERE clause
» Describe the SELECT SINGLE statement
» Explain the ORDER BY addition
» Describe retrieving individual columns
» Exclude duplicate records during selection
» Describe the SELECT statement syntax
» Define Aggregate expressions
Introducing to Open SQL
»Open SQL statements are a subset of Standard SQL that is fully
integrated in the ABAP language.
»Open SQL statements allow uniform data access to the ABAP
programmer regardless of the database system installed.
»The database interface dynamically converts Open SQL
statements to database-specific SQL statements
Open SQL Architecture
SELECT Statement
• SELECT clause
• FROM clause
• INTO clause *** If you use obsolete TABLES keyword, there will be no INTO
• WHERE clause
SELECT using obsolete TABLES
Table
SPFLI
TABLES: SPFLI.
SELECT * FROM SPFLI
WHERE COUNTRYFR = 'US’.
statements
ENDSELECT.
IF SY-SUBRC <> 0.
statements
ENDIF.
TABLES: SPFLI.
SELECT SINGLE * FROM SPFLI
WHERE CARRID = 'LH'
AND CONNID = '2407'.
ENDSELECT. No ENDSELECT
IF SY-SUBRC <> 0. required
statements
ENDIF.
Example: Single Access…UP TO <n> ROWS
TABLES: SPFLI.
IF SY-SUBRC = 0.
WRITE: / SPFLI-CARRID, SPFLI-CONNID,
SPFLI-CITYFROM, SPFLI-CITYTO.
ENDIF.
Retrieving Records in Sequence - ORDER BY
TABLES: SPFLI.
SELECT * FROM SPFLI
ORDER BY PRIMARY KEY.
statements
ENDSELECT.
TABLES: SPFLI.
SELECT * FROM SPFLI
WHERE COUNTRYFR = 'US'
ORDER BY ID CITYFROM CITYTO.
statements
ENDSELECT.
Retrieving Individual Columns
TABLES: SPFLI.
DATA: GD_COUNTRY LIKE SPFLI-COUNTRYFR.
SELECT COUNTRYFR INTO GD_COUNTRY
FROM SPFLI.
statements
ENDSELECT.
TABLES: SPFLI.
DATA: GD_COUNTRY LIKE SPFLI-COUNTRYFR,
GD_CITY LIKE SPFLI-CITYFROM.
SELECT COUNTRYFR CITYFROM INTO (GD_COUNTRY, GD_CITY)
FROM SPFLI.
statements
ENDSELECT.
Excluding Duplicates - SELECT DISTINCT
TABLES: SPFLI.
DATA: W_COUNTRY TYPE SPFLI-COUNTRYFR.
SELECT DISTINCT COUNTRYFR INTO W_COUNTRY TABNA
FROM SPFLI. CountryFr ConnID
statements 1st pass US 0017
ENDSELECT. US 2407
2nd pass JP 1689
JP 0254
TABLES: SPFLI. IT 0008
DATA: W_CONNID TYPE SPFLI-CONNID,
W_COUNTRY TYPE SPFLI-COUNTRYFR. TABNA
SELECT DISTINCT CONNID COUNTRYFR CountryFr ConnID
INTO (W_CONNID, W_COUNTRY)
1st pass US 0017
FROM SPFLI. US 2407
statements 2nd pass
JP 1689
ENDSELECT.
JP 0254
IT 0008
Aggregate Expressions
PROGRAM <name>.
TYPE: BEGIN OF TY_ADDRESS,
FLAG TYPE C,
NAME TYPE C LEGNTH 25,
Declaration of a
CITY TYPE C LEGNTH 20,
SALES TYPE EKPO-NETPR, structure.
END OF TY_ADDRESS.
DATA: WA_ADDRESS TYPE TY_ADDRESS.
* All of the above syntax will be explained in detail later in this section!
Differences when SELECT … INTO TABLE …
SELECT * FROM <db_table> • No TABLES declaration
• We need to specify <internal_table> to store data that
INTO TABLE <internal_table> SELECTed from DB.
… • Usable in ABAP OOP programming
ENDSELECT.
• No TABLES declaration
SELECT SINGLE * UP TO <n> ROWS • We need to specify <work_area> to store data that
FROM <db_table> SELECTed from DB
• Usable in ABAP OOP programming
INTO <work_area>
…
ENDSELECT.
• No TABLES declaration
SELECT * UP TO <n> ROWS • We need to specify <internal_table> to store data that
FROM <db_table> SELECTed from DB
• Usable in ABAP OOP programming
INTO TABLE <internal_table>
…
ENDSELECT.
Automatically mapping with
INTO CORESPONDING FIELD OF TABLE
SELECT CONNID
CTRY1~LANDX AS COUNTRYFR "First join to get Country Name of CountryFr
CTRY2~LANDX AS COUNTRYTO "Second join to get Country Name of CountryTo
INTO TABLE GT_CONN
FROM SPFLI INNER JOIN T005T AS CTRY1 "First join
ON SPFLI~COUNTRYFR = CTRY1~LAND1
AND CTRY1~SPRAS = 'EN'
INNER JOIN T005T AS CTRY2 "Second join
ON SPFLI~COUNTRYTO = CTRY2~LAND1
AND CTRY2~SPRAS = 'EN'.
Use Internal table as filter conditions:
SELECT … FOR ALL ENTRIES
» 'FOR ALL ENTRIES' statement allows you to build an internal
table “itab” and then restrict the database select to only get
entries contained in that internal table “itab”.
DATA: IT_DOCTYPE TYPE STANDARD TABLE OF TY_DOCTYPE.
INSERT YTXXX_EMPLOYEE.
IF SY-SUBRC <> 0.
MESSAGE 'Insert error!' TYPE 'E'.
ENDIF.
CLEAR: GS_EMP.
GS_EMP-EMPLOYEE = '3000000004'.
GS_EMP-LASTNAME = 'Employee 1'.
GS_EMP-FIRSTNAME = 'First Name'.
GS_EMP-GENDER = 'M'.
INSERT YTXXX_EMPLOYEE FROM GS_EMP.
INSERT
*-- Method 3 - Internal Table
DATA: GS_EMP TYPE YTXXX_EMPLOYEE.
DATA: GT_EMP TYPE STANDARD TABLE OF YTXXX_EMPLOYEE.
GS_EMP-EMPLOYEE = '3000000004'.
GS_EMP-LASTNAME = 'James'.
GS_EMP-FIRSTNAME = 'Hornor'.
GS_EMP-GENDER = 'F'.
APPEND GS_EMP TO GT_EMP.
IF SY-SUBRC <> 0.
MESSAGE 'Insert error!' TYPE 'E'.
ENDIF.
UPDATE
*-- Method 1 - Update by Work area
DATA: GS_EMP TYPE YTXXX_EMPLOYEE.
CLEAR: GS_EMP.
GS_EMP-EMPLOYEE = '3000000004'.
GS_EMP-LASTNAME = 'Updated Employee 1'.
GS_EMP-FIRSTNAME = 'Updated First Name'.
GS_EMP-GENDER = 'M’.
UPDATE YTXXX_EMPLOYEE FROM GS_EMP.