ABAP Chapter 3: Open SQL Internal Table

Download as pdf or txt
Download as pdf or txt
You are on page 1of 101

ABAP Chapter 3

 Open SQL
 Internal Table
SAP System : 3 Tier Client/Server
SAP GUI SAP GUI SAP GUI Presentation
Server

SAP
Application
Server

DB Server
SAP SYSTEM (3 Tier Architecture)
SAP GUI SAP GUI

Presentation Layer
(Windows based)

SAP Instance
Application Layer
Dispatcher M
(Windows Server/UNIX)
Request SAP Buffer
Queue
(Shared Mem)

D D B V S E
G

Oracle
Database Layer
Informix
(Windows Server/UNIX)
DB2
Database Server
MS SQL Server
SAP DB/MaxDB
SAP System : Dialog Processing
SAP GUI

Report zpsm1.

Request Tables customers.


List Select single * from
Generate
1 10
customers where id = 1.
Screen(List)
Application Server Send Request Write: / customers-name.

Store request
to queue3 Dispatcher
Send 2 Search for SAP Buffer
List
9 free WP
Request Check Program in 7
Program
Queue Send request Program
5 Buffer Execute
to WP
4 ABAP
Table
D D D … D stateme
nt

8 6

SQL Load&Gen
Database Server Request Program
Dialog Work Process Architecture
Dialog Work Process Local Memory

Memory Space
TaskHandler

ABAP Processor
List buffer

DYNPRO Processor

DB Interface
Result Set Memory

Database Server
Open SQL
 SELECT ...
 INSERT ...
 UPDATE ...
 DELETE ...
DB Interface
SAP Application Server

Dialog WP Local Memory


TaskHandler Memory Space

ABAP Processor
DYNPRO
List Buffer
DB Interface

Result Set

~ 32 KB in length
Database Server

Data Data
Data Data
Data
Example Tables in DB

customers
spfli id name city

carrid connid cityfrom cityto distance


1 John New York
LH 0400 LA NY 100 2 Peter Singapore
LH 0402 BK NY 540 3 David London
SQ 0110 SQ BK 250
Example Tables in DB
sflight
carrid connid fldate price

LH 0400 20010101 150

LH 0400 20010110 145

LH 0400 20010228 130

SQ 0110 20010226 75
Select Overview
Select <result> Which Columns?
From <table> Which Table?
Into <destination> Where to place?
Where <condition> Which Lines?
Select Statement
 Select multiple records from database
SELECT * FROM customers.

ENDSELECT.

 Select single record from database


SELECT SINGLE * FROM customers WHERE id = 1.

Select Multiple Records
Tables spfli.
Seclect * from spfli.
write: / spfli-carrid, spfli-connid,
spfli-cityto.
endselect.
if sy-subrc <> 0.
write: / ‘No Data’.
endif.
Dialog WP
Dialog WP Local Memory
Memory Space
TaskHandler

ABAP Processor

List buffer
DYNPRO Processor

DB Interface
Result Set

Database
SELECT Statement Working Steps
1. Transform open SQL to DB SQL and return result set
into result set work area

SELECT * FROM spfli. SELECT * FROM spfli;



ENDSELECT.

2. Loop with data in result set and transfer each record to


work area in memory space
Table Structure in Memory
SELECT * FROM spfli. Space

ENDSELECT.
Select … Into Table Structure
Tables spfli.
Seclect * from spfli into spfli.
write: / spfli-carrid, spfli-connid,
spfli-cityfrom, spfli-cityto.
endselect.
if sy-subrc <> 0.
write: / ‘No Data’.
endif.
Select … Into Work Area
Data wa like spfli.
Seclect * from spfli into wa.
write: / wa-carrid, wa-connid,
wa-cityfrom, wa-cityto.
endselect.
if sy-subrc <> 0.
write: / ‘No Data’.
endif.
Exercise I

customers-name customers-city
customers-id
SELECT with WHERE Clause
Loop Processing with Restriction
Tables spfli.
Select * from spfli
where cityfrom = ‘FRANKFURT’.
write: / spfli-carrid, spfli-cityto.
endselect.
If sy-subrc <> 0.
write / ‘no data’.
endif.
Select With Range
Tables sflight.
Select * From sflight
Where price between 100 and
1000.
Write: / sflight-carrid, sflight-connid,
sflight-price.
Endselect.
SELECT … With IN List
Tables sflight.
Select * From sflight
Where price in ( 100, 1000 ).
Write: / sflight-carrid, sflight-connid,
sflight-price.
Endselect.
Select Single Record
Select Single Record
Tables spfli.
Select single * from spfli
where carrid = ‘LH’ and
connid = ‘0400’.
if sy-subrc = 0.
write: / spfli-carrid, spfli-connid,
spfli-cityfrom, spfli-cityto.
else.
write: / ‘Data not found’.
endif.
Select Column List
Select * : Example

SELECT *
Reading Selected Column
Data: id like customers-id,
name like customers-name,
city like customers-city.
Select id name city
into (id, name, city)
from customers.
write: / id, name, city.
endselect.
if sy-subrc <> 0.
write / ‘No Data found’.
endif.
Reading Selected Column
Data: begin of wa,
id like customers-id,
name like customers-name,
city like customers-city,
end of wa.
Select id name city
into wa
from customers.
write: / wa-id, wa-name , wa-city.
endselect.
if sy-subrc <> 0.
write / ‘No Data found’.
endif.
Select Column : Example I
Reading Selected Column
Tables customers.
Select id name city
into (customers-id, customers-name, customers-city)
from customers.
write: / customers-id, customers-name, customers-city.
endselect.
if sy-subrc <> 0.
write / ‘No Data found’.
endif.
Select Column : Example II
Corresponding Fields of...
Tables: customers.
Select id name city
into corresponding fields of customers
from customers.
Write: / customers-id, customers-name,
customers-city.
Endselect.
Select Statement : Special Topics
DB Count : SY-DBCNT
Tables customers.
Select * from customers.
write: / sy-dbcnt, customers-id, customers-name.
endselect.
if sy-subrc <> 0.
write: / ‘No Data found’.
else.
write: / sy-dbcnt, ‘Record found’.
endif.
SELECT … ORDER BY ...
Tables: spfli.
Select * from spfli
Order by cityfrom.
Write: / spfli-carrid, spfli-connid,
spfli-cityfrom.
Endselect.
SELECT … With Template
Tables customers.
Select * From customers
Where name Like ‘_r%’.
Write: / customers-id,customers-name.
Endselect.
Aggregate Functions
Data: maxdat like sflight-distance,
mindat like sflight-distance,
counter type I.
Select COUNT( * ) MIN( distance ) MAX( distance )
into (counter ,mindat, maxdat)
from spfli.
Write: / ‘Count :’ , counter,
/ ‘Min :’ , mindat,
/ ‘Max :’ , maxdat.

Aggregate Functions : COUNT,MIN,MAX,AVG and SUM


SELECT … GROUP BY ...
Data: carrid like sflight-carrid,
sflight 2,
mindat Type P Decimals
maxdat Type P Decimals
carrid
2.
connid fldate Price

Select carrid Min( price )LHMax( 0400price )


20010101 150
Into (carrid, mindat, maxdat)
LH 0400 20010110 145
From sflight
Group by carrid. LH 0400 20010228 130
Write: / carrid, mindat,SQ maxdat.
0110 20010226 75
Endselect.
ยากทราบว่า ในแต่ละสายการบิน มีราคาตั๋วตำำาสุดและสูงสุดเท่าไร
Sub Query
tables customers. ลูกค้าคนใดทีอ ่ ยู่เมือง
เดียวกับลูกค้ารหัส ID 1
select *
from customers
where id <> 1 and
city =
( select city
from customers
where id = 1 ).
write: / customers-id, customers-name.
endselect.
Exercise I

ห้ามใช้ SELECT *

customers-name customers-city
customers-id
Exercise II

ห้ามใช้ SELECT *

usr02-bname usr02-trdat usr02-ltime


ABAP : Inner Join
Tables Join

sflight
spfli
carrid connid fldate price
carrid connid cityfrom cityto distance
LH 0400 20010101 150
LH 0400 NY BK 100
LH 0400 20010110 145
LH 0402 BK NY 540
LH 0400 20010228 130
SQ 0110 SQ BK 250
SQ 0110 20010226 75
Tables Join
Question: Select carrid, connid and cityto from spfli
and fldate,price from sflight where carrid = ‘LH’

spfli-carrid spfli-connid sflight-fldate spfli-cityto sflight-price

เงืำอนไข : ให้แสดงข้อมูลเฉพาะสายการบิน ‘LH’ เท่านัน



Standard SQL

Select spfli.carrid, spfli.connid, sflight.fldate,


sflight.price
From spfli, sflight
Where spfli.carrid = sflight.carrid and
spfli.connid = sflight.connid and
spfli.carrid = ‘LH’;
Tables Join Methods
 Nested select statement
 Internal table
 View
 Inner join of Select statement
Nested Select Statement
Tables: spfli,sflight.
Select * from spfli where carrid = ‘LH’.
Select * from sflight
where carrid = spfli-carrid and
connid = spfli-connid.
Write: / spfli-carrid, spfli-connid, sflight-fldate,
sflight-price.
Endselect.
Endselect.
Open SQL – Inner Join
Tables: spfli,sflight.
Select spfli~carrid spfli~connid sflight~fldate spfli~cityto sflight~price
into (spfli-carrid, spfli-connid, sflight-fldate, spfli-cityto, sflight-price)
from spfli inner join sflight
on spfli~carrid = sflight~carrid and
spfli~connid = sflight~connid
where spfli~carrid = ‘LH’.
Write: / spfli-carrid, spfli-connid, sflight-fldate,
spfli-cityto, sflight-price.
Endselect.
Open SQL – Inner Join
Tables: A,B.
A-a B-b B-c
Select A~a B~b B~c
into (A-a,B-b,B-c)
from A inner join B
on A~b = B~b. Table : B
Write: / A-a,B-b,B-c.
b c
Endselect.
Table : A b1 c1
a b b2 c2
a1 b1 b3 c3
a2 b2
Open SQL – Inner Join
Table : A Table : B
Database
a b b c
Server
a1 b1 b1 c1
a2 b2 b2 c2
b3 c3

Application Server Single Result Table(Result set) 1

2
Select … A~a B~b B~c
inner join.. a1 b1 c1
Endselect. a2 b2 c2
Open SQL – Alias Table Name
Tables: spfli,sflight.
Select a~carrid a~connid b~fldate a~cityto b~price
into (spfli-carrid, spfli-connid, sflight-fldate, spfli-cityto, sflight-price)
from spfli as a inner join sflight as b
on a~carrid = b~carrid and
a~connid = b~connid
where a~carrid = ‘LH’.
Write: / spfli-carrid, spfli-connid, sflight-fldate, spfli-cityto, sflight-price
Endselect.
Inner Join/Outer Join Example
ZCUSTOMERS ZSALEREPS
id name city tel sale_id name
1 John New York 111111 01 Somchai
2 Peter London 222222 02 Pipop
3 David Singapore 432555
4 Micheal Bangkok 234111
ZSALES
cust_id prod_id sale_date qty sale_id
ZPRODUCTS
1 A1 20020318 10 01
p_id prod_name on_hand
1 A2 20020318 50 01
A1 Pen 100
3 X1 20020321 90 02
A2 Pencil 125
B1 Ruler 80
X1 Tape 120
Y1 CD 99
Open SQL – Inner Join
REPORT ZINNERJOIN01 .
TABLES: ZCUSTOMERS,ZSALES.
SELECT A~NAME B~PROD_ID
INTO (ZCUSTOMERS-NAME,ZSALES-PROD_ID)
FROM ZSALES AS B INNER JOIN ZCUSTOMERS AS A
ON B~CUST_ID = A~ID.
WRITE: / ZCUSTOMERS-NAME,ZSALES-PROD_ID.
ENDSELECT.
Open SQL – Inner Join > 2 Tables
Table : C
Tables: A,B,C. A-a B-c C-y
Select A~a B~c C~y x y
into (A-a,B-c,C-y) … ...
from A inner join B
on A~b = B~b Table : B
inner join C
b c
on C~x = B~c.
Write: / A-a,B-c,C-y.
… ...
Endselect. … ...
Table : A … …
a b
… …
Open SQL – Inner Join > 2 Tables
REPORT ZINNERJOIN02 .
TABLES: ZCUSTOMERS,ZPRODUCTS,ZSALES.
SELECT A~NAME C~PROD_NAME B~QTY
INTO (ZCUSTOMERS-NAME, ZPRODUCTS-PROD_NAME, ZSALES-QT
FROM ZSALES AS B INNER JOIN ZCUSTOMERS AS A
ON B~CUST_ID = A~ID
INNER JOIN ZPRODUCTS AS C
ON C~P_ID = B~PROD_ID.
WRITE: / ZCUSTOMERS-NAME,ZPRODUCTS-PROD_NAME,ZSALES-
QTY.
ENDSELECT.
Exercise
 List customers who buy product from
company as following fields:

zcustomers-id
 zcustomers-name
 zsales-sale_date
 zproducts-prod_name
 zsales-qty
 zsalereps-name
Exercise : User Master
USR02-BNAME USR02-TRDAT ADCP-TEL_NUMBER Tables Relationship

USR02

BNAME

USR21

PERSNUMBER
ADDRNUMBER

ADCP
ABAP : Outer Join
Open SQL – Outer Join
REPORT ZOUTERJOIN .
TABLES: ZCUSTOMERS,ZSALES.
SELECT A~NAME B~PROD_ID
INTO (ZCUSTOMERS-NAME,ZSALES-PROD_ID)
FROM ZCUSTOMERS AS A LEFT OUTER JOIN ZSALES AS B
ON A~ID = B~CUST_ID.
WRITE: / ZCUSTOMERS-NAME,ZSALES-PROD_ID.
ENDSELECT.
Single Result Table
A~NAME B~PROD_ID
John A1
John A2
Peter
David X1
Micheal
Exercise
 List customers name who do not buy any
product from company
Sub Query
REPORT ZSUBQUERY .
tables: zcustomers. ลูกค้าชื่ออะไรที่ไม่ได้ซื้อ
สินค้าจากเรา มีใครบ้าง
select * from zcustomers as a
where not exists
( select *
from zsales as b
where b~cust_id = a~id ).
write: / zcustomers-name.
endselect.
Internal Table
Data Objects in ABAP
Memory Space
Variable Structure

Table Structure Internal Table

Constants <Field-symbols>
INTERNAL TABLE
Flight (Structure)
Carrid Connid Date Price

Internal Table
Flight (Internal Table) Header Line
Carrid Connid Date Price
Structure
Data: Begin of flight,
carrid like sflight-carrid,
connid like sflight-connid,
date like sflight-fldate,
price like sflight-price.
Data: End of flight.
flight-carrid = ‘LH’.
Write: / flight-carrid.
INTERNAL TABLE
Data: begin of tab occurs 10,
carrid like sflight-carrid,
connid like sflight-connid,
fldate like sflight-fldate,
price like sflight-price.
Data end of tab.
USING ABAP DICTIONARY STRUCTURE

Data: begin of tab occurs 0.


Include structure sflight.
Data end of tab.
INTERNAL TABLE USING LIKE

Data tab LIKE sflight OCCURS 0 WITH HEADER LINE.


FILLING INTERNAL TABLE (APPEND)

Tables sflight.
Data flight like sflight occurs 0 with header line.
Select * from sflight.
Move sflight to flight.
Append flight.
Endselect.
Standard Key of Internal Table
tab

Data: begin of tab occurs 0, f1 f2 f3 f4


f1 type C,
f2 type I,
f3 type N,
f4 type P,
end of tab.
Reading Data From Internal Table
Data tab like sflight occurs 0 with header line.
Select * from sflight into table tab.
If sy-subrc = 0.
Loop at tab.
Write: / tab-carrid, tab-price.
Endloop.
Else.
Write: / ‘No Data’.
Endif.
Access Database Without Internal Table
Access Database Using Internal Table
Reading Data From Internal Table
Data: begin of tab occurs 0,
id like customers-id,
name like customers-name,
end of tab.
Select id name from customers into table tab.
If sy-subrc = 0.
Loop at tab.
Write: / tab-id, tab-name.
Endloop.
else.
Write: / ‘No Data’.
Endif.
Exercise I : Change

Using Internal Table


SORTING INTERNAL TABLE (SORT)

Sort flight.
Sort flight by price fldate.
Sort flight by price ascending
fldate descending.
SORTING INTERNAL TABLE
Data tab like spfli occurs 0 with header line.
Select * from spfli into table tab.
Sort tab by cityfrom.

Loop at tab.
write: / tab-carrid, tab-connid,tab-cityfrom.
Endloop.
PROCESSING INTERNAL TABLE
...
Loop at flight.
Write: / flight-carrid, flight-connid.
Endloop.

Loop at flight where carrid = ‘LH’.


Write: / flight-carrid, flight-connid.
Endloop.
Loop at flight from 1 to 10.
Write: / sy-tabix ,flight-carrid, flight-connid.
Endloop.
Internal Table Template Condition
...
loop at tab where name cp ‘+r*’.
...
Reading Single Record
...
Sort flight by carrid connid fldate.
Read table flight
with key carrid = ‘LH’
connid = ‘0400’
fldate = ‘19990201’
Binary Search.
if sy-subrc = 0.
write : / flight-carrid,flight-connid,
flight-fldate, flight-price.
endif.
Reading Single Record using Index
...
Read table flight index 3.
If sy-subrc = 0.
write: / flight-carrid, flight-connid.
Endif.
CHANGING INTERNAL TABLE

...
Delete flight index 5.
Delete flight where carrid = ‘LH’.

flight-carrid = ‘XX’.
flight-price = 100.

Insert flight index 1.
DELETING INTERNAL TABLE
DATA flight LIKE sflight occurs 0 with header line.

Clear flight.
Refresh flight.
Free flight.
Total Record of Internal Table

Data: line_count type i.


Data tab like sflight occurs 0 with header line.
Select * from sflight into table tab.
Describe table tab lines line_count.
Write: / line_count.
Exercise I
Internal Table Processing
Data tab like spfli occurs 0 with Header line.

Select * from spfli
appending table tab
where carrid = ‘LH’.
SELECT … INNER JOIN
REPORT ZINNERJOIN01 .
TABLES: ZCUSTOMERS,ZSALES.
SELECT A~NAME B~PROD_ID
INTO (ZCUSTOMERS-NAME,ZSALES-PROD_ID)
FROM ZSALES AS B INNER JOIN ZCUSTOMERS AS A
ON B~CUST_ID = A~ID.
WRITE: / ZCUSTOMERS-NAME,ZSALES-PROD_ID.
ENDSELECT.
Inner Join into Internal Table
REPORT ZJOIN01 .
DATA: begin of tab occurs 0,
name like zcustomers-name,
prod_id like zsales-prod_id,
end of tab.
SELECT A~NAME B~PROD_ID
INTO TABLE tab
FROM ZSALES AS B INNER JOIN ZCUSTOMERS AS A
ON B~CUST_ID = A~ID.

LOOP AT tab.
WRITE: / TAB-NAME,TAB-PROD_ID.
ENDLOOP.
Internal Table Without Header Line
DATA tab LIKE customers OCCURS 0.
DATA wa LIKE customers.

LOOP AT tab INTO wa.
WRITE: / wa-id, wa-name.
ENDLOOP.
Internal Table Declaration
DATA tab TYPE TABLE OF customers.
DATA wa LIKE LINE OF customers.

ABAP Practice
Database Table Processing

 INSERT
 UPDATE
Database
 MODIFY
 DELETE
Insert (Table)
Tables customers.
customers-id = ‘999’.
customers-name = ‘Test’.
Insert customers.
if sy-subrc <> 0.
write: / ‘Data Already Exists’.
endif.
Update Statement

Tables customers.
Select single * from customers where id
= 1.
If sy-subrc = 0.
customers-name = ‘John’.
update customers.
Endif. Update customers
set name = ‘John’
where id = 1.
Update Statement
Data wa like customers.
wa-id = ‘1’.
wa-name = ‘Test No 1’.
wa-city = ‘Bangkok’.
update customers from wa.
If sy-subrc <> 0.
write: / ‘Data not found’.
Endif.
Modify Statement
Tables customers.
customers-id = ‘1’.
customers-name = ‘Test No 1’.
Modify customers.
Deleting Database Table Entries
Tables customers.
customers-id = ‘1’.
Delete customers.

Delete customers From Table


delcustomers.

Delete From customers Where city =


Exercise II
Exercise II
1. ห้ามใช้ SELECT * 2. ใช้ Internal Table

usr02-bname usr02-trdat usr02-ltime


Exercise III
Tables Relationship for User Master
USR02-BNAME USR02-TRDAT ADCP-TEL_NUMBER Tables Relationship

USR02

BNAME

USR21

PERSNUMBER
ADDRNUMBER

ADCP
Exercise III : User Master

usr02-trdat

usr02-bname

adcp-tel_number

ใช้ Internal Table

You might also like