Вы находитесь на странице: 1из 34

SAP TechEd ‘03 Basel

ABAP for Power


Users

Björn Mielenhausen, SAP

Learning Objectives

After this workshop, you will


be able to:
Understand the different kinds of Internal Tables
Add more flexibility to your programs with Strings, Field
Symbols and References
Use Dynamic Token Specification for dynamic operations
Build and generate ABAP programs at runtime

Commonality among topics


Overview of the ABAP types and operations
Memory and performance costs

 SAP AG 2003, TechED_Basel / ABAP 254, Björn Mielenhausen/ 2

© 2003 SAP AG ABAP 255, Björn Mielenhausen 1


SAP TechEd ‘03 Basel

Agenda

Internal Tables
Strings, Field Symbols and
References
Coffee Break
Dynamic Token Specification
Program Generation

Summary
Q&A

 SAP AG 2003, TechED_Basel / ABAP 254, Björn Mielenhausen/ 3

Internal Tables

 SAP AG 2003, TechED_Basel / ABAP 254, Björn Mielenhausen/ 4

© 2003 SAP AG ABAP 255, Björn Mielenhausen 2


SAP TechEd ‘03 Basel

Properties of Internal Table Types

• Line Type
• Kind of Table
CARRID CONNID DISTANCE
• Key
• Kind of Uniqueness
AA 0017 2.572
LH 0400 6.162
LH 0400 6.162
access by index
QF 0005 1.000 5
SQ 0866 1.625
UA 0007 2.572 access by key
UA 0007

 SAP AG 2003, TechED_Basel / ABAP 254, Björn Mielenhausen/ 5

Hierarchy of Internal Table Types

Any Table

Index Table Hashed Table

Standard Table Sorted Table

Key access table scan binary hash


search function

Access costs slow efficient fast


for n entries (increase linearly) (increase logarithmically) (constant)

Access n

mainly by index mainly by key by key

Uniqueness kind non-unique unique or non-unique unique

 SAP AG 2003, TechED_Basel / ABAP 254, Björn Mielenhausen/ 6

© 2003 SAP AG ABAP 255, Björn Mielenhausen 3


SAP TechEd ‘03 Basel

Internal Table Definition Syntax

DATA: name TYPE <kind> TABLE OF <linetype>


WITH <uniqueness> <key>
[INITIAL SIZE n]
[WITH HEADER LINE].
CARRID CONNID DISTANCE
<kind>
STANDARD | SORTED | HASHED
(for types: INDEX | ANY)

LH 0400 6.162
LH 0400 6.162
<uniqueness> QF 0005 1.000
UNIQUE | NON-UNIQUE
SQ 0866 1.625
UA 0007 2.572

<key>
KEY <f1> ... <fn> |
DEFAULT KEY |
KEY TABLE_LINE

 SAP AG 2003, TechED_Basel / ABAP 254, Björn Mielenhausen/ 7

Generic Key Operations

Single record processing Multiple record processing

Read READ TABLE itab FROM wa ... . LOOP AT itab ...


WHERE cond.
READ TABLE itab ...
WITH KEY k1 = v1 ... kn = vn.
Insert INSERT wa INTO TABLE itab. INSERT LINES OF itab1
INTO TABLE itab2.

Change MODIFY TABLE itab FROM wa. MODIFY itab ...


TRANSPORTING ...
WHERE cond.
Delete DELETE TABLE itab FROM wa. DELETE itab
WHERE cond.
DELETE TABLE itab
WITH KEY k1 = v1 ... kn = vn.

 SAP AG 2003, TechED_Basel / ABAP 254, Björn Mielenhausen/ 8

© 2003 SAP AG ABAP 255, Björn Mielenhausen 4


SAP TechEd ‘03 Basel

Time Costs for Key Access

Access with table key

Standard table: linear slow


Sorted table: logarithmic efficient
Hash table: constant fast

Access with key ≠ table key

Standard table: slow


Sorted table:
Key partly contains table key: efficient
For all other access by key: slow
Hashed table: slow

 SAP AG 2003, TechED_Basel / ABAP 254, Björn Mielenhausen/ 9

When to Use Which Table Type

Standard tables
Processed mainly by index operations
Infrequent key operations (slow)
Operations with different keys
If RFC (Remote Function Call) functionality is required

Sorted tables
Access mainly by key (efficient)
Partial sequential processing (LOOP ... WHERE)
Infrequent index operations

Hashed tables
Access only by key (fast)
Key must be unique, no index operations possible

 SAP AG 2003, TechED_Basel / ABAP 254, Björn Mielenhausen/ 10

© 2003 SAP AG ABAP 255, Björn Mielenhausen 5


SAP TechEd ‘03 Basel

Explicit Binary Search

For sorted standard tables the same algorithm as for


sorted tables can be used.

Attention: the table must be sorted by the same key used


for the access! Otherwise it is not guaranteed that the
entry is found!

Syntax:
READ TABLE itab WITH name = 'Miller'
BINARY SEARCH.

 SAP AG 2003, TechED_Basel / ABAP 254, Björn Mielenhausen/ 11

Memory Costs: Table Body

DATA: Table reference


itab TYPE TABLE OF struc.
Table header

APPEND wa TO itab. Table body


1
APPEND wa TO itab. 2 1. page:

2. page:
m

3. page:

4. page:

 SAP AG 2003, TechED_Basel / ABAP 254, Björn Mielenhausen/ 12

© 2003 SAP AG ABAP 255, Björn Mielenhausen 6


SAP TechEd ‘03 Basel

Memory Costs: Linear Index

DELETE itab INDEX 2. Table header


DELETE itab INDEX 51. Linear index
Free list Table body
INSERT wa INTO itab 51
2 1 1 1. page
51 3 2
INDEX 3. 2
4
4
5
m 2. page

50
52
3. page

4. page

 SAP AG 2003, TechED_Basel / ABAP 254, Björn Mielenhausen/ 13

Memory Costs: Tree Index

Table header

B-Tree index Table body


1
2 1. page

m 2. page

1 3 2 4 5 6 7 8 9 49 50 52 3. page

51
4. page
Free list

 SAP AG 2003, TechED_Basel / ABAP 254, Björn Mielenhausen/ 14

© 2003 SAP AG ABAP 255, Björn Mielenhausen 7


SAP TechEd ‘03 Basel

Memory Costs: Hash Index

Hash function
Key Index in Hash array

Table header

Table body
Hash array 1 1. page
2
1
2 m 2. page

27 2
3. page

4. page

 SAP AG 2003, TechED_Basel / ABAP 254, Björn Mielenhausen/ 15

Summary: Memory Costs

Empty table
8 bytes per table

Table body
C x L bytes (C = count of line, L = bytes per line)

Linear index
4 bytes per item

Tree-like index
approx. 6 bytes per item

Hash index
approx. 18 bytes per item (without DELETE/SORT)
approx. 30 bytes per item (with DELETE/SORT)

 SAP AG 2003, TechED_Basel / ABAP 254, Björn Mielenhausen/ 16

© 2003 SAP AG ABAP 255, Björn Mielenhausen 8


SAP TechEd ‘03 Basel

Debugger: Memory Costs Display

Goto ->
Display data object ->
Internal table

Settings ->
Memory Display on/off

 SAP AG 2003, TechED_Basel / ABAP 254, Björn Mielenhausen/ 17

Debugger: Memory Costs Display

Goto ->
Display condition ->
Memory use

 SAP AG 2003, TechED_Basel / ABAP 254, Björn Mielenhausen/ 18

© 2003 SAP AG ABAP 255, Björn Mielenhausen 9


SAP TechEd ‘03 Basel

Exercise: Performance Analysis of Internal Tables

Define a PARAMETER to specify the count of entries for the


internal tables to be analyzed - default value 100.

Define a STANDARD, SORTED and HASHED TABLE with line type


Integer and the key TABLE_LINE.

Fill the three tables using three DO loops with the number of
entries specified by the PARAMETER. Calculate the run time of
all three loops and write the result devided by the count of
entries to the ABAP list for every table.

Now use a DO loop to READ WITH KEY each entry of the three
tables and calculate the run time for every table.

At the end, use a DO loop to READ with INDEX each entry of the
standard and sorted table and calculate the run time.

TIP: Use GET RUN TIME FIELD to get run time.


Use SY-INDEX to fill and read the tables. SY_INDEX contains the
actual loop count within DO and ENDDO.

 SAP AG 2003, TechED_Basel / ABAP 254, Björn Mielenhausen/ 19

Strings,
Field Symbols, References

 SAP AG 2003, TechED_Basel / ABAP 254, Björn Mielenhausen/ 20

© 2003 SAP AG ABAP 255, Björn Mielenhausen 10


SAP TechEd ‘03 Basel

String Types

New ABAP types STRING and XSTRING

DATA:
str TYPE STRING,
xstr TYPE XSTRING.

STRING : variable sequence of characters ( ABAP TYPE C )


XSTRING: variable sequence of bytes ( ABAP TYPE X )

 SAP AG 2003, TechED_Basel / ABAP 254, Björn Mielenhausen/ 21

Strings

Strings in ABAP:

value semantics ( like C,X )

dynamic length at run time no difference between


defined and used length

significant trailing blanks ( STRING )

substring access via (dynamic) offset/length on read


positions

ABAP run time: (re)allocation, garbage collection,


sharing, copy on write

 SAP AG 2003, TechED_Basel / ABAP 254, Björn Mielenhausen/ 22

© 2003 SAP AG ABAP 255, Björn Mielenhausen 11


SAP TechEd ‘03 Basel

Strings

Constructing strings
MOVE
CONCATENATE

READ DATASET ... INTO str

...

Processing strings
SEARCH, REPLACE
SHIFT, CONDENSE

CA,CO,CS,CP

str+off(len) "substring access


...

 SAP AG 2003, TechED_Basel / ABAP 254, Björn Mielenhausen/ 23

Strings

Keep in mind

Field symbols CANNOT be used for substring access

DATA: c(20) TYPE c,


str TYPE STRING.
FIELD-SYMBOLS:
<fs> TYPE ANY.

ASSIGN c+5(10) TO <fs>.

ASSIGN str+5(10) TO <fs>.

Use (dynamic) offset / length technique instead

Substr = str+5(10).

 SAP AG 2003, TechED_Basel / ABAP 254, Björn Mielenhausen/ 24

© 2003 SAP AG ABAP 255, Björn Mielenhausen 12


SAP TechEd ‘03 Basel

Strings

Keep in mind

Structures with string elements are DEEP structures:


STRUC1 is flat.
DATA: BEGIN OF STRUC1,
a(3) TYPE N, 1 2 3 A B C D E F G H I J 4 5 6
b(10) TYPE C,
c(3) TYPE N,
END OF STRUC1.

STRUC2 is deep.
DATA: BEGIN OF STRUC2,
a(3) TYPE N, 1 2 3 String-Reference 4 5 6
b TYPE STRING,
c(3) TYPE N,
END OF STRUC2. A B C D E F G H I J

 SAP AG 2003, TechED_Basel / ABAP 254, Björn Mielenhausen/ 25

Memory Costs of Strings

DATA: String reference: 8 bytes

str TYPE STRING.


String header: 16 - 32 bytes
str = 'Hello'.
str = 'This is a longer string'. Hello

SHIFT str BY 5 PLACES.


This is a longer
is a longer stringstring
str = 'Bye'.
Bye

 SAP AG 2003, TechED_Basel / ABAP 254, Björn Mielenhausen/ 26

© 2003 SAP AG ABAP 255, Björn Mielenhausen 13


SAP TechEd ‘03 Basel

Strings and Internal Tables

The following example shows how to read a line structured


file into an internal table

FORM read_file USING dsn TYPE string.


DATA: line TYPE string,
tab TYPE TABLE OF string.

OPEN DATASET dsn IN TEXT MODE.


DO.
READ DATASET dsn INTO line.
IF sy-subrc <> 0. EXIT. ENDIF.
APPEND line TO tab.
ENDDO.
CLOSE DATASET dsn.
ENDFORM.

 SAP AG 2003, TechED_Basel / ABAP 254, Björn Mielenhausen/ 27

Memory Cost Display (I)

Goto ->
Display data object ->
String

 SAP AG 2003, TechED_Basel / ABAP 254, Björn Mielenhausen/ 28

© 2003 SAP AG ABAP 255, Björn Mielenhausen 14


SAP TechEd ‘03 Basel

Memory Costs Display

Goto ->
Display condition ->
Memory use

 SAP AG 2003, TechED_Basel / ABAP 254, Björn Mielenhausen/ 29

Strings,
Field Symbols, References

 SAP AG 2003, TechED_Basel / ABAP 254, Björn Mielenhausen/ 30

© 2003 SAP AG ABAP 255, Björn Mielenhausen 15


SAP TechEd ‘03 Basel

Field Symbols

Field symbols are NOT pointers


Field symbols are aliases representing fields dynamically
Assignment of fields to field symbols at run time

DATA:
DATA:
Text(20)
Text(20) TYPE
TYPE CC VALUE
VALUE 'Hello
'Hello world'.
world'.

FIELD-SYMBOLS:
FIELD-SYMBOLS:
<fs>
<fs> TYPE
TYPE ANY.
ANY.

ASSIGN
ASSIGN Text
Text TO
TO <fs>.
<fs>.
WRITE
WRITE // <fs>.
<fs>.

 SAP AG 2003, TechED_Basel / ABAP 254, Björn Mielenhausen/ 31

Copy Free Loop

LOOP ... INTO wa. LOOP ... ASSIGNING <wa>.


... ...
ENDLOOP. ENDLOOP.

wa

CARRID CONNID CARRID CONNID


AA 0017 AA 0017
LH 0400 <wa> LH 0400

 SAP AG 2003, TechED_Basel / ABAP 254, Björn Mielenhausen/ 32

© 2003 SAP AG ABAP 255, Björn Mielenhausen 16


SAP TechEd ‘03 Basel

Copy Free Loop

Attached field-symbols are controlled


Key components of HASHED and SORTED tables cannot be changed
via the field-symbol
A loop field-symbol cannot be attached to a different data object
within the loop body

In general, copy free loop is faster than a normal loop


break-even: ca. 5 loop steps

Specify a type for a field symbol, if the type is statically known

 SAP AG 2003, TechED_Basel / ABAP 254, Björn Mielenhausen/ 33

Copy Free Read

READ TABLE ... ASSIGNING <wa>


break-even for a simple READ: line size > 1000 bytes
break-even for READ + MODIFY: line size > 100 bytes

More than one field-symbol can be attached to


the same line

Field-symbols are kept attached even after a SORT

Detach a field-symbol explicitly with UNASSIGN

No write access to key components of sorted or hashed tables

Specify type for a field-symbol, if the type is statically known

 SAP AG 2003, TechED_Basel / ABAP 254, Björn Mielenhausen/ 34

© 2003 SAP AG ABAP 255, Björn Mielenhausen 17


SAP TechEd ‘03 Basel

Casting Field Symbols

Casting variants:
TYPES:
TYPES: MY_TYPE(9)
MY_TYPE(9) TYPE
TYPE C.
C.

DATA:
DATA: Field9(9)
Field9(9) TYPE
TYPE C,
C,
Field10(10)
Field10(10) TYPE
TYPE CC VALUE
VALUE '1234567890',
'1234567890',
TypeName(7)
TypeName(7) TYPE
TYPE CC VALUE
VALUE 'MY_TYPE'.
'MY_TYPE'.

FIELD-SYMBOLS:
FIELD-SYMBOLS: <fs>
<fs> TYPE
TYPE ANY.
ANY.

Casting to static type ASSIGN


ASSIGN Field10
Field10 TO
TO <fs>
<fs> CASTING
CASTING TYPE
TYPE MY_TYPE.
MY_TYPE.

Casting to generic type ASSIGN


ASSIGN Field10
Field10 TO
TO <fs>
<fs> CASTING
CASTING TYPE
TYPE N.
N.

TypeName
TypeName == 'MY_TYPE'.
'MY_TYPE'.
Casting to dynamic type ASSIGN
ASSIGN Field10
Field10 TO
TO <fs>
<fs> CASTING
CASTING TYPE
TYPE (TypeName).
(TypeName).

Casting to static field type ASSIGN


ASSIGN Field10
Field10 TO
TO <fs>
<fs> CASTING
CASTING LIKE
LIKE Field9.
Field9.

Casting to dynamic field type ASSIGN


ASSIGN Field10
Field10 TO
TO <fs>
<fs> CASTING
CASTING LIKE
LIKE <fs>.
<fs>.

 SAP AG 2003, TechED_Basel / ABAP 254, Björn Mielenhausen/ 35

Strings,
Field Symbols, References

 SAP AG 2003, TechED_Basel / ABAP 254, Björn Mielenhausen/ 36

© 2003 SAP AG ABAP 255, Björn Mielenhausen 18


SAP TechEd ‘03 Basel

Data References

New reference type REF TO typename for references to arbitrary


data objects
The contents of a data reference variable is set by
CREATE DATA dref TYPE | LIKE ...
GET REFERENCE OF DataObject INTO dref

Access to data object of reference


X = dref->*. “for typed references
ASSIGN dref->* TO <f>. “for untyped references

Save pointers
Containers for arbitrary data objects e.g., tables of data references
Can be defined in the dictionary

 SAP AG 2003, TechED_Basel / ABAP 254, Björn Mielenhausen/ 37

Dynamic Creation of Data Objects

Dynamic instantiation of data types, very useful for generic


programming

Syntax

CREATE
CREATE DATA
DATA dref
dref TYPE
TYPE type.
type.
CREATE
CREATE DATA
DATA dref
dref TYPE
TYPE (typename).
(typename).
CREATE
CREATE DATA
DATA dref
dref TYPE
TYPE TABLE
TABLE OF
OF (typename).
(typename).
CREATE
CREATE DATA
DATA dref
dref LIKE
LIKE field.
field.

 SAP AG 2003, TechED_Basel / ABAP 254, Björn Mielenhausen/ 38

© 2003 SAP AG ABAP 255, Björn Mielenhausen 19


SAP TechEd ‘03 Basel

Dynamic Creation of Data Objects

TYPES:
TYPES: BEGIN
BEGIN OF
OF struc,
struc,
aa TYPE
TYPE i,
i,
bb TYPE
TYPE cc LENGTH
LENGTH 8,
8, dref 36
36 ABC
ABC
END
END OF
OF STRUC.
STRUC.

DATA:
DATA: dref
dref TYPE
TYPE REF
REF TO
TO DATA,
DATA, <str>
<str>
tname
tname TYPE
TYPE string,
string,
str
str TYPE
TYPE struc,
struc,
int
int TYPE
TYPE i.
i.

FIELD-SYMBOLS:
FIELD-SYMBOLS: <int>
<int> TYPE
TYPE i,
i, 55
<str>
<str> TYPE
TYPE struc,
struc,
<f>
<f> TYPE
TYPE any.
any.
<int>
<int>
CREATE DATA dref TYPE struc.
ASSIGN dref->* TO <str>.
<str>-a = 36. <str>-b = 'ABC'.

CREATE DATA dref LIKE int. 000


000 AA
AA 0017
0017
ASSIGN dref->* TO <int>.
<int> = 5.
<f>
<f>
tname = 'SFLIGHT'.
CREATE DATA dref TYPE (tname).
ASSIGN dref->* TO <f>.
SELECT SINGLE * FROM (tname) INTO <f>.

 SAP AG 2003, TechED_Basel / ABAP 254, Björn Mielenhausen/ 39

Example: Internal Table as a Data Container

Using data reference as line type for tables

DATA: itab TYPE HASHED TABLE OF REF TO DATA


WITH UNIQUE KEY table_line.

DATA: ref TYPE REF TO DATA,


int TYPE i VALUE 999,
float TYPE f VALUE '0.5',
name(10) TYPE c VALUE 'Hugo'.

FIELD-SYMBOLS: <f> TYPE ANY.

GET REFERENCE OF int INTO ref. INSERT ref INTO TABLE itab.
GET REFERENCE OF float INTO ref. INSERT ref INTO TABLE itab.
GET REFERENCE OF name INTO ref. INSERT ref INTO TABLE itab.

LOOP AT itab INTO ref.


ASSIGN ref->* TO <f>.
WRITE: / <f>.
ENDLOOP.

 SAP AG 2003, TechED_Basel / ABAP 254, Björn Mielenhausen/ 40

© 2003 SAP AG ABAP 255, Björn Mielenhausen 20


SAP TechEd ‘03 Basel

Generic Types

Full generic ANY, DATA


SIMPLE, NUMERIC

Generic length C, N, X, P
CSEQUENCE, XSEQUENCE, CLIKE

Generic table kind and key

ANY TABLE

INDEX TABLE HASHED TABLE

STANDARD TABLE SORTED TABLE

 SAP AG 2003, TechED_Basel / ABAP 254, Björn Mielenhausen/ 41

Exercise: Internal Table List Writer

Write a form WRITE_TABLE which accepts any internal


table. Write the contents of the internal table to the ABAP
list, line by line and field by field.

Define and fill an internal table with a line type of your


choice to test the form WRITE_TABLE.

TIP: Use LOOP ASSIGNING nested with ASSIGN


COMPONENT compindex OF STRUCTURE and DO loop to
access each field of every line.

TIP: If you need more information about the syntax and the
semantics of an ABAP statement use Online-Help by
pressing F1 and entering the first word of the statement.

 SAP AG 2003, TechED_Basel / ABAP 254, Björn Mielenhausen/ 42

© 2003 SAP AG ABAP 255, Björn Mielenhausen 21


SAP TechEd ‘03 Basel

Coffee Break

 SAP AG 2003, TechED_Basel / ABAP 254, Björn Mielenhausen/ 43

Dynamic Token Specification

 SAP AG 2003, TechED_Basel / ABAP 254, Björn Mielenhausen/ 44

© 2003 SAP AG ABAP 255, Björn Mielenhausen 22


SAP TechEd ‘03 Basel

Dynamic Token Specification

ABAP statements allow one to specify some parts


dynamically.
General syntax: “(token)” where token is a field which is
evaluated at run time.

** Static
Static SORT
SORT statement
statement
SORT
SORT itab
itab BY
BY comp.
comp.

** Dynamic
Dynamic SORT
SORT statement
statement
name
name == 'COMP'.
'COMP'.
...
...
SORT
SORT itab
itab BY
BY (name).
(name).

Rule: The contents of the token must be in upper case.


No static type checks for dynamic statements.
Run time errors occur if the contents of the token are invalid.

 SAP AG 2003, TechED_Basel / ABAP 254, Björn Mielenhausen/ 45

Different Types of Dynamic Token Specification

There are 5 types of dynamic token specifications

Dynamic field specification:


The token contains the name of a field
Dynamic type specification:
The token contains a type name
Dynamic component specification:
The token contains the name of a component of a
structure
Dynamic clause specification:
The token is an internal table which represents a list
of tokens to be inserted and interpreted at run
time
Dynamic subroutine specification:
The token contains the name of a form, method,
function, program, ...

 SAP AG 2003, TechED_Basel / ABAP 254, Björn Mielenhausen/ 46

© 2003 SAP AG ABAP 255, Björn Mielenhausen 23


SAP TechEd ‘03 Basel

Dynamic Field Specification

The token contains the name of a field or database table


ASSIGN (field) TO ...
CONSTANTS:
CONSTANTS: aa TYPE
TYPE ii VALUE
VALUE 1,
1,
SELECT ... FROM (dbtab) ... bb TYPE
TYPE ii VALUE
VALUE 2.
2.
DELETE ... FROM (dbtab) ...
DATA:
DATA: name(5)
name(5) TYPE
TYPE c.
c.
MODIFY (dbtab) ...
FIELD-SYMBOLS:
FIELD-SYMBOLS: <i>
<i> TYPE
TYPE i.
i.
UPDATE (dbtab) ...
WRITE ... TO (field) ** Dynamic
Dynamic ASSIGN
ASSIGN to
to constant
constant aa
name
name == 'A'.
'A'.
WRITE (field) TO ... ASSIGN
ASSIGN (name)
(name) TO
TO <i>.
<i>.
WRITE:
WRITE: <i>.
<i>. "=1
"=1

** Dynamic
Dynamic ASSIGN
ASSIGN to
to constant
constant bb
name
name == 'B'.
'B'.
ASSIGN
ASSIGN (name)
(name) TO
TO <i>.
<i>.
WRITE:
WRITE: <i>.
<i>. "=2
"=2

The dynamic ASSIGN makes it possible to pass parameters


dynamically to arbitrary ABAP statements

 SAP AG 2003, TechED_Basel / ABAP 254, Björn Mielenhausen/ 47

Dynamic Type Specification

The token contains the name of dictionary (global) or internal


type
ASSIGN ... CASTING TYPE (type)
CREATE DATA ... TYPE (type) ...

TYPES:
TYPES: BEGIN
BEGIN OF
OF struc,
struc,
aa TYPE
TYPE i,
i,
bb TYPE
TYPE p,
p,
END
END OF
OF struc.
struc.
DATA:
DATA: dref
dref TYPE
TYPE REF
REF TO
TO DATA.
DATA.
FIELD-SYMBOLS:
FIELD-SYMBOLS: <dobj>
<dobj> TYPE
TYPE any.
any.

PERFORM
PERFORM DoSomething
DoSomething USING
USING dref
dref 'SFLIGHT'.
'SFLIGHT'.
ASSIGN
ASSIGN dref->*
dref->* to
to <dobj>.
<dobj>.
...
...
FORM
FORM DoSomething
DoSomething USING
USING dref
dref TYPE
TYPE REF
REF TO
TO DATA
DATA
tname
tname TYPE
TYPE string.
string.
** Create
Create aa data
data object
object of
of type
type 'tname'
'tname'
CREATE
CREATE DATA
DATA dref
dref TYPE
TYPE (tname).
(tname).
...
...
ENDFORM.
ENDFORM.

 SAP AG 2003, TechED_Basel / ABAP 254, Björn Mielenhausen/ 48

© 2003 SAP AG ABAP 255, Björn Mielenhausen 24


SAP TechEd ‘03 Basel

Dynamic Component Specification

The token contains the name of a component of a structure


SORT ... BY (comp1) ... (compn)
READ TABLE ... WITH KEY (k1) = v1 ... (kn) = vn
DELETE ... COMPARING (comp1) ... (compn)
MODIFY ... TRANSPORTING (comp1) ... (compn)
AT NEW/END OF (comp)
ASSIGN COMPONENT (comp) OF STRUCTURE ...

Empty tokens are ignored in statements for internal tables

DATA:
DATA: itab
itab TYPE
TYPE TABLE
TABLE OF
OF ...,
...,
key1
key1 TYPE
TYPE string,
string,
key2
key2 TYPE
TYPE string,
string, ...
...
** Sort
Sort table
table dynamically
dynamically to
to set
set up
up aa dynamic
dynamic READ
READ with
with binary
binary search
search
SORT
SORT itab
itab BY
BY (key1)
(key1) (key2).
(key2).
READ
READ TABLE
TABLE itab
itab INTO
INTO wa
wa WITH
WITH KEY
KEY (key1)
(key1) == val1
val1 (key2)
(key2) == val2
val2
BINARY
BINARY SEARCH.
SEARCH.

 SAP AG 2003, TechED_Basel / ABAP 254, Björn Mielenhausen/ 49

Dynamic Clause Specification

Dynamic clause represents a sequence of tokens

The syntax of the clause is checked at run time


SELECT (fieldlist) ...
SELECT ... GROUP BY (fieldlist)
SELECT ... WHERE (condlist)

TYPES:
TYPES: cond(72)
cond(72) TYPE
TYPE c.
c.

DATA:
DATA: wa
wa TYPE
TYPE spfli,
spfli,
condtab
condtab TYPE
TYPE TABLE
TABLE OF
OF cond.
cond.

** Fill
Fill the
the condition
condition table
table
APPEND
APPEND 'CARRID
'CARRID == ''LH''
''LH'' AND'
AND' TO
TO condtab.
condtab.
APPEND
APPEND 'CITYTO
'CITYTO == ''NEW
''NEW YORK''.'
YORK''.' TO
TO condtab.
condtab.

** Database
Database fetch
fetch with
with aa dynamic
dynamic WHERE
WHERE condition
condition
SELECT
SELECT ** FROM
FROM spfli
spfli INTO
INTO wa
wa WHERE
WHERE (condtab).
(condtab).
WRITE:
WRITE: // wa-carrid,
wa-carrid, wa-connid,
wa-connid, wa-cityfrom,
wa-cityfrom, wa-cityto.
wa-cityto.
ENDSELECT.
ENDSELECT.

 SAP AG 2003, TechED_Basel / ABAP 254, Björn Mielenhausen/ 50

© 2003 SAP AG ABAP 255, Björn Mielenhausen 25


SAP TechEd ‘03 Basel

Dynamic Subroutine Specification

The name of a form, function, method or program is


interpreted at run time to execute the corresponding program
unit
PERFORM (form) IN PROGRAM (prog) ...
SUBMIT (program) ...
CALL FUNCTION ... PERFORMING (form) ...
CALL METHOD oref->(method) ...

DATA:
DATA: pname
pname TYPE
TYPE string,
string,
fname
fname TYPE
TYPE string.
string.

fname
fname == 'DO_SOMETHING'.
'DO_SOMETHING'.
pname
pname == 'UTILITIES'.
'UTILITIES'.

** External
External PERFORM
PERFORM
PERFORM
PERFORM (fname)
(fname) IN
IN PROGRAM
PROGRAM (pname)
(pname) USING
USING 999.
999.

 SAP AG 2003, TechED_Basel / ABAP 254, Björn Mielenhausen/ 51

Exercise: Database List Writer

Define two PARAMETERs, one for a name of a database


table and one for a WHERE-Condition.

Use the CREATE DATA statement to create an


appropriate internal table as a destination for a SELECT
on the database table.

Use the OpenSQL SELECT together with Dynamic Token


Specification for the FROM and WHERE clause.

At the end, take the form WRITE_TABLE from „Exercise:


Generic Internal Table List Writer“ to write the result of
the SELECT to the ABAP list.

 SAP AG 2003, TechED_Basel / ABAP 254, Björn Mielenhausen/ 52

© 2003 SAP AG ABAP 255, Björn Mielenhausen 26


SAP TechEd ‘03 Basel

Program Generation

 SAP AG 2003, TechED_Basel / ABAP 254, Björn Mielenhausen/ 53

Transient Program Generation

Generating transient programs


Frequent change of dynamic input data
Code generation of a subroutine pool
Only accessible for internal mode

Input Data processing


Generation on the fly

data ..... Data processing


.....
.. .....

..

Result .....

 SAP AG 2003, TechED_Basel / ABAP 254, Björn Mielenhausen/ 54

© 2003 SAP AG ABAP 255, Björn Mielenhausen 27


SAP TechEd ‘03 Basel

Persistent Program Generation

Generating persistent programs


Rare change of dynamic input data
Code generation can be done by separate process
Global access

Input Data processing


data ..... Data processing

..... Persistent
..
generation
.....
by another process
..

Result .....

 SAP AG 2003, TechED_Basel / ABAP 254, Björn Mielenhausen/ 55

Program Generation

Generating transient programs


Lack of dynamic programming abilities
No dynamic WHERE-clause in internal table statements
No dynamic type creation

Generating persistent program


Code generation as part customizing

 SAP AG 2003, TechED_Basel / ABAP 254, Björn Mielenhausen/ 56

© 2003 SAP AG ABAP 255, Björn Mielenhausen 28


SAP TechEd ‘03 Basel

How To Generate Transient Programs

DATA:
code TYPE TABLE OF string,
prog(8) TYPE c,
msg(120) TYPE c,
lin(10) TYPE c,
wrd(10) TYPE c,
off(3) TYPE c.

APPEND 'PROGRAM SUBPOOL.' TO code.


APPEND 'FORM DYN1.' TO code.
APPEND 'WRITE / ''Hello, I am a temporary subroutine!''.' TO code.
APPEND 'ENDFORM.' TO code.

GENERATE SUBROUTINE POOL code NAME


prog MESSAGE msg LINE lin WORD wrd OFFSET off.

IF sy-subrc <> 0.
WRITE: / 'Error during generation in line', lin,
/ msg, / 'Word:', wrd, 'at offset', off.
ENDIF.

PERFORM dyn1 IN PROGRAM (prog).

 SAP AG 2003, TechED_Basel / ABAP 254, Björn Mielenhausen/ 57

How To Generate Persistent Programs

DATA:
Code TYPE TABLE OF string.

CONSTANTS:
Rep(40) VALUE 'ZDYN1'.

APPEND 'PROGRAM ZDYN1.'


TO code.
APPEND 'WRITE / ''Hello, I am dynamically created!''.' TO code.
INSERT REPORT Rep FROM code.

SUBMIT (Rep) AND RETURN.

READ REPORT Rep INTO code.


APPEND 'WRITE / ''and I am a dynamic extension!''.' TO code.
INSERT REPORT Rep FROM code.

GENERATE REPORT Rep.

SUBMIT (Rep) AND RETURN.

 SAP AG 2003, TechED_Basel / ABAP 254, Björn Mielenhausen/ 58

© 2003 SAP AG ABAP 255, Björn Mielenhausen 29


SAP TechEd ‘03 Basel

Time Costs of Program Generation

Static statement
SELECT CARRID CITYTO CITYFROM
INTO wa
FROM SPFLI ~ 200 ms
WHERE CARRID = 'UA' AND
CITYFROM = 'NEW YORK' AND
CITYTO = 'SAN FRANCISCO'.

Dynamic statement
SELECT (ItabSelect)
INTO CORRESPONDING FIELDS OF wa ~ 300 ms
FROM (TabName)
WHERE (ItabWhere).

Code generation
SELECT CARRID CITYTO CITYFROM
INTO wa
FROM SPFLI ~ 25 000 ms
WHERE CARRID = 'UA' AND
CITYFROM = 'NEW YORK' AND
CITYTO = 'SAN FRANCISCO'.
 SAP AG 2003, TechED_Basel / ABAP 254, Björn Mielenhausen/ 59

Exercise: Performance of Generating Program

Write a program that creates at run time an empty


program and a subroutine pool with one empty form.

Define a PARAMETER for a counter with default value


100.

Perform the form and submit the program counter times


and calculate the runtime for one SUBMIT and one
PERFORM IN PROGRAM.

TIP: Use GET RUN TIME FIELD to get relative runtime (see
Exercise: Performance Analysis of Internal Tables).

 SAP AG 2003, TechED_Basel / ABAP 254, Björn Mielenhausen/ 60

© 2003 SAP AG ABAP 255, Björn Mielenhausen 30


SAP TechEd ‘03 Basel

Summary

Internal tables
Properties
Table kind

Strings

Field symbols
Copy free loop
Casting

References
Dynamic creating of data objects

 SAP AG 2003, TechED_Basel / ABAP 254, Björn Mielenhausen/ 61

Summary

Dynamic token specification


Field
Type
Component
Clause
Subroutine

Program generation
Transient
Persistent

 SAP AG 2003, TechED_Basel / ABAP 254, Björn Mielenhausen/ 62

© 2003 SAP AG ABAP 255, Björn Mielenhausen 31


SAP TechEd ‘03 Basel

Further Information

Online-Documentation:
Transaction ABAPDOCU

Books:
„ABAP Objects“ by Horst Keller

 SAP AG 2003, TechED_Basel / ABAP 254, Björn Mielenhausen/ 63

Further Information

Public Web:
www.sap.com
SAP Customer Services Network: www.sap.com/services/

Consulting Contact
Roy Wood, VP SAP Consulting

Related Workshops/Lectures at SAP TechEd 2003


Why use ABAP Objects, Hands-on

 SAP AG 2003, TechED_Basel / ABAP 254, Björn Mielenhausen/ 64

© 2003 SAP AG ABAP 255, Björn Mielenhausen 32


SAP TechEd ‘03 Basel

Questions?

Q&A

 SAP AG 2003, TechED_Basel / ABAP 254, Björn Mielenhausen/ 65

Feedback

Please complete your session evaluation and


drop it in the box on your way out.

Thank You !

The SAP TechEd ’03 Basel Team

 SAP AG 2003, TechED_Basel / ABAP 254, Björn Mielenhausen/ 66

© 2003 SAP AG ABAP 255, Björn Mielenhausen 33


SAP TechEd ‘03 Basel

Copyright 2003 SAP AG. All Rights Reserved

No part of this publication may be reproduced or transmitted in any form or for any purpose without the express
permission of SAP AG. The information contained herein may be changed without prior notice.
Some software products marketed by SAP AG and its distributors contain proprietary software components of other
software vendors.
Microsoft®, WINDOWS®, NT®, EXCEL®, Word®, PowerPoint® and SQL Server® are registered trademarks of Microsoft
Corporation.
IBM®, DB2®, DB2 Universal Database, OS/2®, Parallel Sysplex®, MVS/ESA, AIX®, S/390®, AS/400®, OS/390®,
OS/400®, iSeries, pSeries, xSeries, zSeries, z/OS, AFP, Intelligent Miner, WebSphere®, Netfinity®, Tivoli®, Informix
and Informix® Dynamic ServerTM are trademarks of IBM Corporation in USA and/or other countries.
ORACLE® is a registered trademark of ORACLE Corporation.
UNIX®, X/Open®, OSF/1®, and Motif® are registered trademarks of the Open Group.
Citrix®, the Citrix logo, ICA®, Program Neighborhood®, MetaFrame®, WinFrame®, VideoFrame®, MultiWin® and other
Citrix product names referenced herein are trademarks of Citrix Systems, Inc.
HTML, DHTML, XML, XHTML are trademarks or registered trademarks of W3C®, World Wide Web Consortium,
Massachusetts Institute of Technology.
JAVA® is a registered trademark of Sun Microsystems, Inc.
JAVASCRIPT® is a registered trademark of Sun Microsystems, Inc., used under license for technology invented and
implemented by Netscape.
MarketSet and Enterprise Buyer are jointly owned trademarks of SAP AG and Commerce One.
SAP, R/3, mySAP, mySAP.com, xApps, xApp and other SAP products and services mentioned herein as well as their
respective logos are trademarks or registered trademarks of SAP AG in Germany and in several other countries all
over the world. All other product and service names mentioned are the trademarks of their respective companies.

 SAP AG 2003, TechED_Basel / ABAP 254, Björn Mielenhausen/ 67

© 2003 SAP AG ABAP 255, Björn Mielenhausen 34

Вам также может понравиться