7121010 24 efficient abap coding

Upload: dsantos-santos

Post on 10-Apr-2018

227 views

Category:

Documents


0 download

TRANSCRIPT

  • 8/8/2019 7121010 24 Efficient ABAP Coding

    1/32

    Efficient ABAP/4 Coding Techniques

  • 8/8/2019 7121010 24 Efficient ABAP Coding

    2/32

    Efficient ABAP/4 Coding Techniques

    OBJECTIVE

    In this chapter we are going to learn efficient coding Techniques in

    ABAP/4. The following topics are covered.

    Processing Database tables

    Processing internal tablesMiscellaneous

    String Manipulation

  • 8/8/2019 7121010 24 Efficient ABAP Coding

    3/32

    Efficient ABAP/4 Coding Techniques

    1 Processing Database Tables1 Processing Database Tables

    1.1 Reading through a set of related tables

    When reading through a set of related tables, use a logical databasewhenever possible. The combination of defining a logical database (aprogram that reads a table and its dependant table entries) and using the

    logical database-related event keywords (e.g. GET) is more efficient thana set of nested SELECT ... ENDSELECT statements.

    1.2 Checking SELECT-OPTIONS when reading via a Logical Database

    When using the GET event keyword to retrieve records via a logical

    database, selection can be restricted by using the CHECK statement(using either CHECK select-option(s) or CHECK condition ).

  • 8/8/2019 7121010 24 Efficient ABAP Coding

    4/32

    Efficient ABAP/4 Coding Techniques

    In this case, a CHECK statement that returns a negative result terminatesthe processing of GET events for subordinate database tables and theassociated data is not read. For efficiency reasons, you should thereforealways perform the CHECK at the highest possible level of the databasehierarchy.

    For example:

    SELECT-OPTIONS: S_CNTRY FOR KNA1-LAND1,S_COY FOR KNB1-BUKRS.

    ...GET KNA1.

    CHECK S_CNTRY.GET KNB1.

    CHECK S_COY....

  • 8/8/2019 7121010 24 Efficient ABAP Coding

    5/32

    Efficient ABAP/4 Coding Techniques

    is more efficient than:

    SELECT-OPTIONS: S_CNTRY FOR KNA1-LAND1,S_COY FOR KNB1-BUKRS.

    ...GET KNB1.

    CHECK SELECT-OPTIONS. (or CHECK: S_CNTRY,... S_COY.)

    1.3 SELECT SINGLE vs. SELECT *

    SELECT SINGLE * is more efficient than SELECT * ENDSELECT.Whenever the full key of a table is known, use:

    SELECT SINGLE * FROM dbtab WHERE . (full key).

  • 8/8/2019 7121010 24 Efficient ABAP Coding

    6/32

    Efficient ABAP/4 Coding Techniques

    rather than:

    SELECT db_field1 db_field2 db_field3 FROM dbtabWHERE . (full key)....ENDSELECT.

    UP TO 1 ROW can be used to retrieve one record when the full key is

    not known. Whenever the full key is not known you will need to use the SELECT *

    ... ENDSELECT version of the SELECT statement.

    In this case, specifying values for as many of the tables key fields in aWHERE clause will make the SELECT statement more efficient thanchecking values after the select.

  • 8/8/2019 7121010 24 Efficient ABAP Coding

    7/32

    Efficient ABAP/4 Coding Techniques

    1.4 Selecting via non-key fields or non-key partial fields

    When selecting records from a database table when only part of a field(on which selection is based) is known, use the LIKE option as part of the WHERE clause.

    For example:

    SELECT * FROM T001GWHERE BUKRS EQ US01AND TXTKO LIKE __PERS%.

    ....ENDSELECT.

    is more efficient than:

    SELECT * FROM T001GWHERE BUKRS EQ US01.CHECK T001G-TXTKO+2(4) = PERS.

    ....ENDSELECT.

  • 8/8/2019 7121010 24 Efficient ABAP Coding

    8/32

    Efficient ABAP/4 Coding Techniques

    1.5 SELECT ,

    If you only need a few fields of a table, it is much more efficient to onlyretrieve exactly those fields from the database than to select all of them(SELECT * ).

    Example: if you only need the fields order number, order type andcustomer from the sales document table, code as follows:

    SELECT VBELN AUART KUNNR FROM VBAKINTO (VBAK-VBELN, VBAK-AUART, VBAK-KUNNR)WHERE WRITE: /

    ENDSELECT.

    See the editor help for all the variants of the INTO clause.

  • 8/8/2019 7121010 24 Efficient ABAP Coding

    9/32

    Efficient ABAP/4 Coding Techniques

    1.6 SELECT UP TO n ROWS If you only need a certain number of records specify this in your select-statement:

    SELECT FROM UP TO 10 ROWS.

    This is much faster than issuing a SELECT without the UP TO clause andthen checking for the system variable SY-DBCNT.

    1.7 SELECT INTO TABLE Reading an internal table is faster than reading a database table.Therefore, use internal tables to store information that must be accessedmultiple times throughout a program.Also, use internal tables when you have to read a header - item structurefor which you would otherwise use nested SELECTsInstead of processing a

    SELECT INTO APPEND ITABENDSELECT

  • 8/8/2019 7121010 24 Efficient ABAP Coding

    10/32

    Efficient ABAP/4 Coding Techniques

    statement it is far more efficient to select the fields straight into theinternal table and process the data from the internal table:

    SELECT FROM INTO TABLE ITAB WHERE LOOP AT ITAB.

    ENDLOOP.

    1.8 SELECT FROM ORDER BY

    In most cases it is preferable to do the sorting within the ABAP programinstead of on the database server, that means: fill the internal table via aSELECT statement and then sort via the SORT statement instead of coding a SELECT ORDER BY. The sorting of large amounts of data onthe database server affects the performance of all users on the system,whereas the sorting within the ABAP program only affects theapplication server. However, if an index exists on the table that can beused for the sorting then the SELECT ORDER BY doesnt cause anyundue strains on the system.

  • 8/8/2019 7121010 24 Efficient ABAP Coding

    11/32

    Efficient ABAP/4 Coding Techniques

    1.9 Aggregate FunctionsInstead of using ABAP, some calculations can be done by usingaggregate functions for the SELECT. These are: SUM, AVG, MIN and

    MAX.

    Example:SELECT MATNR SUM( KWMENG ) MEINS FROM VBAP INTO TABLET_VBAP WHERE GROUP BY MATNR MEINS

    This example will select the cumulative sales quantities grouped bymaterial number and quantity unit.

    1.10 SELECT without WHERE

    Coding a SELECT statement without a WHERE condition is only allowedfor very small tables (e.g. customizing settings). For all other tables thisis not permitted as performance problems will occur within a short periodof time.

  • 8/8/2019 7121010 24 Efficient ABAP Coding

    12/32

    Efficient ABAP/4 Coding Techniques

    1.11 UPDATE

    Instead of updating records within a SELECT ENDSELECT construct

    e.g.SELECT * FROM ZVBAK WHERE VBELN IN S_VBELN.ZVBAK-VKBUR = W_VKBUR.UPDATE ZVBAK.

    ENDSELECT.

    define your record selection in the UPDATE statement.

    UPDATE ZVBAK SET VKBUR = W_VKBUR WHERE VBELN INS_VBELN.

    1.12 DELETE

    The same consideration as for the UPDATE is true for the DELETE:Instead of deleting records within a SELECT ENDSELECT construct

    e.g.SELECT * FROM ZVBAK WHERE VBELN IN S_VBELN.DELETE ZVBAK.

    ENDSELECT.

  • 8/8/2019 7121010 24 Efficient ABAP Coding

    13/32

    Efficient ABAP/4 Coding Techniques

    define your record selection in the DELETE statement.

    DELETE FROM ZVBAK WHERE VBELN IN S_VBELN.

    1.13 COMMIT

    ABAP reports that issue INSERT, UPDATE or DELETE commands have toissue COMMIT WORK statements after a logical unit of work iscompleted. Missing COMMITs can lead to bottlenecks on the databaseside because the system has to keep track of the table changes viarollback segments (in order to enable a rollback of all changes since thelast commit). Rollback segments are kept in memory and missingCOMMITs can lead to overflows of the rollback segment areas. Also thedatabase system holds locks on the changed records that are notreleased until COMMIT time.

  • 8/8/2019 7121010 24 Efficient ABAP Coding

    14/32

    Efficient ABAP/4 Coding Techniques

    2. Processing Internal Tables2. Processing Internal Tables

    2.1 Filling To load an internal table from a database table where the structure of theinternal table is at least as wide as the structure of the database tableuse:

    SELECT * FROM dbtab INTO TABLE itab.

    rather than:SELECT * FROM dbtab .

    MOVE dbtab TO itab .APPEND itab.

    ENDSELECT.

    To fill an internal table without creating duplicate entries and add up thePacked, Integer, and Floating Point fields at the same time, use:

    COLLECT itab.

  • 8/8/2019 7121010 24 Efficient ABAP Coding

    15/32

    Efficient ABAP/4 Coding Techniques

    2.2 Sequential Reads

    If you are reading through an internal table sequentially using the LOOPat itab ... ENDLOOP method, but are only interested in certain entries,use a WHERE clause and specify a condition for selection. Note that theperformance of a LOOP AT ... WHERE statement is improved greatly if allfields being compared in the WHERE clause are of the same data type.Therefore, you should try defining the compare fields as follows:

    DATA: compare_field LIKE itab-field1.BEGIN OF itab OCCURS 100,

    field1 (5), field2( 5),END OF itab.

    c ompare_field = < value to compare >.LOOP AT itab WHERE field1 = compare_field ....

    ENDLOOP.

  • 8/8/2019 7121010 24 Efficient ABAP Coding

    16/32

    Efficient ABAP/4 Coding Techniques

    2.3 Direct ReadsIf you are not processing the entire internal table, use:

    READ TABLE itab WITH KEY key BINARY SEARCH.rather than:

    READ TABLE itab WITH KEY key

    The second method performs a sequential read from the first record untilif finds a match.

    The first method performs a binary search to find a matching record, butthe table must be sorted first.

  • 8/8/2019 7121010 24 Efficient ABAP Coding

    17/32

    Efficient ABAP/4 Coding Techniques

    2.4 Sorting

    Wherever possible, identify the fields to be sorted. The format:

    SORT itab BY field1 field2 .

    is more efficient than:

    SORT itab .

    SORT itab without fields specified attempts to sort the table by all fieldsother than Packed, Integer, and Floating Point fields.

    2.5 Counting Entries

    To count up the number of entries in an internal table, use:

    DESCRIBE TABLE itab LINES field .

    where field is a work field of type I (integer).

  • 8/8/2019 7121010 24 Efficient ABAP Coding

    18/32

    Efficient ABAP/4 Coding Techniques

    rather than:

    LOOP AT itab .

    W_COUNT = W_COUNT + 1.ENDLOOP.

    2.6 Reading large internal tablesIf you have to retrieve selected records from a large internal table, keepthis table sorted.

    In this way, you can access the table via theREAD TABLE T_VBAK WITH KEY VBELN = W_VBELN BINARY SEARCHstatement.If you only want to verify the existence of a record but dont need any of the fields from the record then use the addition

    TRANSPORTING NO FIELDSIf you only need a few fields from the internal table for processing then

    use the addition

    TRANSPORTING

  • 8/8/2019 7121010 24 Efficient ABAP Coding

    19/32

    Efficient ABAP/4 Coding Techniques

    2.7 Moving data from internal table 1 to internal table 2

    If you need to move all entries from one internal table to another one

    which has the same structure you can simply do it via the followingstatement:

    ITAB2[] = ITAB1[].

    2.8 Appending data from internal table 1 to internal table 2 If you need to append records from one internal table to another onewhich has the same structure you can simply do it via the followingstatement:

    APPEND LINES OF ITAB1 TO ITAB2.

  • 8/8/2019 7121010 24 Efficient ABAP Coding

    20/32

    Efficient ABAP/4 Coding Techniques

    2.9 Looping at internal tables

    If you are looping at an internal table just to count the number of records

    that fulfill certain criteria then use the following variant of the loopstatement:

    LOOP AT T_VBAK TRANSPORTING NO FIELDS WHERE ADD 1 TO COUNTER.

    ENDLOOP.

    The same applies if you only want to verify that at least one record existsthat satisfies a certain condition:

    LOOP AT T_VBAK TRANSPORTING NO FIELDS WHERE EXIT.

    ENDLOOP.IF SY-SUBRC = 0.* Record found ENDIF.

  • 8/8/2019 7121010 24 Efficient ABAP Coding

    21/32

    Efficient ABAP/4 Coding Techniques

    2.10 DELETING DATA FROM INTERNAL TABLES

    If you need to delete a subset of records from an internal table use thefollowing:

    DELETE T_VBAK WHERE

    2.11 DELETING DUPLICATE ENTRIES FROM AN INTERNAL TABLE To delete duplicate entries from an internal table the table has to besorted by the fields used in the comparing condition. If there is nocomparing condition the table should be sorted by all fields.

    DELETE ADJACENT DUPLICATES FROM T_VBAK [COMPARING field1field2 ]

  • 8/8/2019 7121010 24 Efficient ABAP Coding

    22/32

    Efficient ABAP/4 Coding Techniques

    3 Miscellaneous3 Miscellaneous

    3.1 Moving data from one table work area/structure to another one with

    an identical structure.Use:

    MOVE structure1 TO structure2 .

    rather than:

    MOVE-CORRESPONDING structure1 TO structure2 .

    3.2 Determining the length of a string.

    Use:fieldlength = STRLEN( field ).

    rather than:

    IF field CP #.ENDIF.fieldlength = SY-FDPOS.

  • 8/8/2019 7121010 24 Efficient ABAP Coding

    23/32

    Efficient ABAP/4 Coding Techniques

    3.3 ASSIGN statement

    If assigning the contants of a field belonging to a Dictionary definedtable/data structure which itself contains a name of a field to a fieldsymbol, use the ASSIGN TABLE FIELD syntax of the ASSIGN statement.

    For example:

    ASSIGN TABLE FIELD (KNA1-NAME1) TO < fs >.

    is more efficient than:

    ASSIGN (KNA1-NAME1) TO .

    This is because the search for the field (in this case KNA1-NAME1) is

    carried out only in the Data Dictionary and not in the symbol table. Thefield must then be a component field of a database table declared withthe

    TABLES statement. This improves the performance of this statementconsiderably. In contrast to the second method above, the performancedoes not depend on the number of fields used within the program.

  • 8/8/2019 7121010 24 Efficient ABAP Coding

    24/32

    Efficient ABAP/4 Coding Techniques

    3.4 Testing for Initial Value

    The use of the IF statement for checking whether a field is empty (i.e.equal to the initial value for its data type) can be made more efficient bycomparing the field with another of the same data type.

    For example:

    IF MARA-IDNRA = SPACE.

    ....ENDIF.

    is more efficient than:

    IF MARA-IDNRA IS INITIAL.....

    ENDIF.

  • 8/8/2019 7121010 24 Efficient ABAP Coding

    25/32

    Efficient ABAP/4 Coding Techniques

    3.5 Testing one field for multiple values

    When testing an individual field for multiple values, you can use:

    IF field = value1 .....

    ELSEIF field = value2.....

    ENDIF.

    or:CASE field .WHEN value1.....WHEN value2 .....WHEN value3 .....WHEN valuen .....ENDCASE.

  • 8/8/2019 7121010 24 Efficient ABAP Coding

    26/32

    Efficient ABAP/4 Coding Techniques

    The first method is more efficient when checking a field for up to aboutfive values. But the improved readability of the program code associatedwith the CASE statement dictates that its use should be applied for levelsof three or greater.

    3.6 Optimizing IF and CASE structures

    To optimize IF and CASE structures, always test values in order of thelikelihood of each value occuring.

    For example, fieldx can have values A, B, or C. A value of B is themost likely value to occur, followed by C, then A. To optimize a CASEstatement for fieldx , code the CASE statement as follows:

    CASE fieldx .WHEN B . Most likely value

    ....WHEN C. Next most likely value....WHEN A. Least likely value....

    ENDCASE.

  • 8/8/2019 7121010 24 Efficient ABAP Coding

    27/32

    Efficient ABAP/4 Coding Techniques

    3.7 Subroutine / function performance

    Because of the added overhead of calling subroutines, functions, etc.,

    you should avoid the following style of coding:Use:

    IF field NE 0.PERFORM SUB1.

    ENDIF.

    FORM SUB1.....

    ENDFORM.rather than:

    PERFORM SUB1.

    FORM SUB1.IF field NE 0.....ENDIF.

    ENDFORM.

  • 8/8/2019 7121010 24 Efficient ABAP Coding

    28/32

    Efficient ABAP/4 Coding Techniques

    3.8 Hard-coding Text (messages, report output, etc..)

    DONT ! Wherever possible, all text to be passed to messages, or to bewritten to a report should be created as Text Symbols. This allows text tobe more easily maintained and supports the maintenance of these texts

    inother languages.

    3.9 Checking Return CodeThe return code should always be checked after any database tableread/update statements.For SELECT ... ENDSELECT processing loops, the return code shouldbe checked after the ENDSELECT statement to check for the success of

    the SELECT statement.

    For LOOP AT ... ENDLOOP processing loops, the return code should bechecked after the ENDLOOP statement to check for the success of theLOOP statement.

  • 8/8/2019 7121010 24 Efficient ABAP Coding

    29/32

    Efficient ABAP/4 Coding Techniques

    44 String manipulationsString manipulations4.1 Special operatorsUse the special operators CO, CA etc. instead of programming theoperation yourself. Especially on long strings, ABAP statements per character can cause high CPU consumption.

    4.2 CONCATENATE Instead of programming a string concatenation of your own, use the

    CONCATENATE statement.Also, make use of the SPLIT statement or the STRLEN function whenever you need to split a string into several components or have to determinethe length of a string.

    4.3 Deleting leading spacesIf you want to delete the leading spaces in a string, use the ABAPstatement SHIFT LEFT DELETING LEADING

    Avoid in any case using SHIFT inside a WHILE loop.

  • 8/8/2019 7121010 24 Efficient ABAP Coding

    30/32

    Efficient ABAP/4 Coding Techniques

    CONCLUSIONCONCLUSION

    Using these techniques we can optimize our code and increase theperformance of our program effectively.

  • 8/8/2019 7121010 24 Efficient ABAP Coding

    31/32

    Efficient ABAP/4 Coding Techniques

    EXERCISE

    1. SELECT SINGLE * is more efficient than________________________ Whenever the full key of a table is known.2. Reading an ____________table is faster than reading a database table.3. If you are not processing the entire internal table use _____________ 4. DESCRIBE TABLE itab LINES field is ued to ____________________.

    5. _______________allows text to be more easily maintained andsupportsthe maintenance of these texts in other languages.6.____________ system variable used to check the return code.

    7. To delete duplicate entries from an internal table__________ statementis used.

    8. ABAP reports that issue INSERT, UPDATE or DELETE commands haveto issue _____________statement.

  • 8/8/2019 7121010 24 Efficient ABAP Coding

    32/32

    Efficient ABAP/4 Coding Techniques

    SOLUTION

    1. SELECT * ENDSELECT

    2. Internal table3. BINARY SEARCH4. to count up the number of entries in an internal table5. TEXT SYMBOLS

    6. SY-SUBRC7. DELETE ADJACENT DUPLICATES8. COMMIT WORK