ABAP Programming Standards
ABAP Programming Standards
This document is the final version of the ABAP Programming Standards and Guidelines that will be utilized by application developers. It has been signed off by NASA and will also be delivered as part of the Application Development Teams final deliverable. Following this document is the superseded version that was developed by the Technical Architecture Team and signed off by the NASA.
Sign Off
Date Name Signature
Change Log
Date Version Author Change Description
Reviewed By
Date Name
Page 2 of 83
1 2 3
3.2
Source Code......................................................................................................................... 11
3.2.1 General Programming Requirements .............................................................................................. 11 3.2.1.1 Authorization Checking ......................................................................................................... 11 3.2.2 Executable Programs: (Template Y_EXECUTABLE_PROGRAM) ............................................. 11 3.2.3 INCLUDE Programs:...................................................................................................................... 13 3.2.4 Module Pool Programs: .................................................................................................................. 14 3.2.5 Function Pool (Group) Programs:................................................................................................... 15 3.2.6 Function Module Programs:............................................................................................................ 15 3.2.7 Subroutine Pool Programs: ............................................................................................................. 16 3.2.8 Class Pool Programs: ...................................................................................................................... 17 3.2.9 Interface Pool Programs:................................................................................................................. 17
3.3
Documentation .................................................................................................................... 17
3.3.1 Program Documentation: ................................................................................................................ 17 3.3.1.1 Class Pool Documentation ..................................................................................................... 18 3.3.1.2 Interface Pool Documentation................................................................................................ 18 3.3.2 Changes and Enhancements:........................................................................................................... 19 3.3.3 User Documentation: ...................................................................................................................... 19
3.4
3.4.1 3.4.2 3.4.3
Text Elements...................................................................................................................... 19
Titles and Headings ........................................................................................................................ 19 Selection Texts................................................................................................................................ 20 Text-Symbols.................................................................................................................................. 20
3.5
Variants................................................................................................................................ 20
4.2
4.2.1 4.2.2 4.2.3 4.2.4 4.2.5
Message Classes................................................................................................................... 23 Views .................................................................................................................................... 23 Internal Tables:................................................................................................................... 24 Possible Uses Of Internal Tables ....................................................................................... 24
A Large Number Of Database Accesses Are Foreseen ................................................................... 24 Replacing Nested Selects ................................................................................................................ 24
5.5
5.5.1 5.5.2
5.6 5.7
5.7.1 5.7.2 5.7.3 5.7.4
5.8
5.8.1
5.9 5.10
6 7 8
Customer Enhancements Enhancement Projects.......................................................29 Changing SAP Code........................................................................................................30 APPENDIX A: Programming Guidelines ......................................................................31
8.1
8.1.1 8.1.2 8.1.3 8.1.4 8.1.5 8.1.6 8.1.7 8.1.8 8.1.9
8.2
8.2.1 8.2.2 8.2.3 8.2.4
8.3 8.4
8.4.1 8.4.2 8.4.3 8.4.4 8.4.5
Working with Logical Operators and Control Structures ............................................. 38 Performance and Tuning Guidelines ................................................................................ 40
Use SORT to organize reports and data.......................................................................................... 40 Defining Custom Tables. ................................................................................................................ 41 Use of SELECT with Transparent and Pool tables. ........................................................................ 41 Use of the SELECT statement with Cluster tables.......................................................................... 42 Matching field attributes in the SELECT WHERE clause.............................................................. 43 Page 4 of 83
8.5
8.5.1 8.5.2 8.5.3 8.5.4
SECONDARY INDEXES................................................................................................... 48
Always ensure your index is being used: ........................................................................................ 48 General Rules for creating and using secondary indexes: ............................................................... 48 When to Create an Index................................................................................................................. 49 When Not to Create an Index:......................................................................................................... 50
8.6
8.6.1 8.6.2
8.7 8.8
Developers Issues for the Transport System................................................................... 52 Transport Checklist for Developer ................................................................................... 52
9.2
9.2.1 9.2.2 9.2.3 9.2.4 9.2.5 9.2.6
9.3
9.3.1 9.3.2 9.3.3 9.3.4 9.3.5 9.3.6 9.3.7 9.3.8 9.3.9 9.3.10 9.3.11 9.3.12 9.3.13 9.3.14 9.3.15 9.3.16
9.4
9.4.1
Typing .................................................................................................................................. 68
Page 5 of 83
9.5
9.5.1 9.5.2 9.5.3
9.6
9.6.1 9.6.2 9.6.3 9.6.4 9.6.5
10
10.1 10.2 10.3
11
11.1 11.2 11.3
11.4
11.5
11.6 11.7
Note I: Optimization of individual SQL statement ......................................................... 77 Note II: Performance & Load Balancing for Batch Input ............................................. 78
Background of SAP BDC programs........................................................................................... 78 Where are the bottlenecks ?........................................................................................................ 78 What can we do to get around the bottlenecks ?......................................................................... 78 TIP: When one uses the MOVE statement, ............................................................................... 79 TIP: Use the FREE <table> command ...................................................................................... 79 TIP: When defining DATA statements....................................................................................... 80 TIP: When using the SORT statement,....................................................................................... 80 TIP: When processing an internal table use the LOOP .............................................................. 80 TIP: When the LOOP...AT...WHERE........................................................................................ 80 TIP: Use the BINARY SEARCH, .............................................................................................. 81 Page 6 of 83
11.8
Page 7 of 83
1 Overview
The purpose of this document is to detail uniform program standards for NASA Core Financials implementation, and to provide guidelines and useful information for programmers in the SAP environment. Programming standards are needed to ensure the readability and maintainability of custom development programs and to provide a consistent and meaningful interface for the user on screens and report output.
2 General Standards
There are several general considerations, which must be recognized in conjunction with these programming standards. The following can be regarded as the basic rules-of-thumb for the creation of ABAPs at NASA. 1. Changes should not be made to standard SAP development objects unless they are endorsed by SAP or are deemed by client management to be a necessity. If changes to standard SAP code are made, please refer to the Changes to SAP Code section. 2. Documentation for all custom developments, excluding temporary objects not for transport, will be maintained in the Lotus Notes MDM Custom Development and Product Test databases. 3. ?product name? will be used for change management and managing SAP Corrections and Transport through testing and approval cycles. 4. Before the creation of a new ABAP, existing programs will be reviewed to determine if they may be used as a template or potentially fill the reporting requirement. Also, a determination should be made regarding whether or not the report would be better served by use of the Data Warehouse. 5. All custom ABAP development objects will be named according to the NASA Core Financials Development Naming Standards. The naming standards can be found in the Lotus Notes MDM Document Repository under the category General Deliverables. 6. Online documentation will be utilized to describe program functionality to end users and functional leads. ABAPs will not be transported to the System Test and Production systems without supporting on-line documentation. 7. Proper usage of SAP online tools in addition to the ABAP Editor. These include Function Modules, Online Documentation, Message Classes, Screen Painter, Menu Painter, Logical Databases, etc. 8. Adherence to software ergonomics and design guidelines found in the SAP Style Guide and documented in ISO Dialogue Principals ISO9241-10. 9. Completion of all work unit deliverables supporting the program development.
Page 8 of 83
3.1
Attributes
Program attributes are one of the 5 sub-objects of an ABAP program where defining attributes of the program are set. You must maintain these before entering program code or any other subobject.
3.1.1
Title
The title should be a short concise, meaningful description. It can be up to 70 characters long and appears in the header section of a report when it is executed. Example: Create BDC Session for Transaction MM01 - Create Material Master
3.1.2
Type
Specifies the type of program: Executable Program (1) can be started without a transaction, may be executed on-line or in the background. Include Program (I) contain program code which is not executable by itself. Rather it is included in other programs by the INCLUDE statement. Module Pools (M) contain processing steps for screen modules. They are executed via a Transaction or a menu function. Subroutines (S) contain common FORM routines that are called using an external PERFORM statement. Function Groups (F) contain Function Modules and are managed by the Function Builder. They cannot be assigned or changed in attributes screen. Interface Pools (J) contain interfaces and are part of the object oriented extensions to ABAP. They are managed by the Class Builder and cannot be assigned or changed in attributes screen. Class Pools (K) contains classes and class methods, and are part of the object oriented extensions to ABAP. They are managed by the Class Builder and cannot be assigned or changed in attributes screen.
3.1.3
Status
SAP standard production program (P).
Page 9 of 83
3.1.4
Application
Optionally, you may associate the program with an Application Area. For custom development, SAP suggests choosing either the Customer Head Office Programs or the Customer Branch Office Programs category.
3.1.5
Authorization Group
Used to restrict access to users without a matching authorization group in their profile. Checks are performed before report execution, and before access to utility functions, report attributes, and the ABAP editor. NASA requires that all custom developed programs have an authorization group assignment that meets the NASA SAP Security and Authorization Guidelines.
3.1.6
Development Class
Development classes are used in the Transport system. They are used to group all objects that are related to the same development to ensure they are and transported together. Custom developed objects must be associated with a custom development class. Refer to NASA Core Financials Development Naming Standards.
3.1.7
Logical Database
Assigns the logical database to be evaluated by the report program. The workbench provides access to all logical database programs delivered by SAP.
3.1.8
Screen
For report programs that use a logical database. Here you can specify the screen version of the database program. Selection screen versions are stored in the database include DCxyzSEL. The selection screen version defaults to the version specified in the database access program.
3.1.9
Editor Lock
To be set while a program is being created or modified. It allows only the user ID to set the flag to modify the program. This is to prevent alteration of a program while a programmer makes modifications to it. As a standard, use the Workbench Organizer as a locking mechanism when changing objects. This will reduce the number of changes when a program is ready to be transported to the test or production environment.
3.2
Source Code
When coding programs, it is desirable to have a consistent format for maximum readability, and thus maintainability.
3.2.1
3.2.2
All executable programs should have the following structure: 1. Header documentation (YREPORTHDR)
*--------------------------------------------------------------**************************************************************** * Confidential and Proprietary * Copyright 2001, NASA * All Rights Reserved **************************************************************** * ABAP Name: Zxxxxxxxxxxxxxxx * Created by: ________ * Created on: mm/dd/yyyy. * Version: n.n *--------------------------------------------------------------* Comments: purpose, use, design, structure, testing hints, etc * * *--------------------------------------------------------------* Modification Log: * Date Programmer Correction Description * 01/29/2001 Added DEV190001 Added *---------------------------------------------------------------
You can insert this header into the ABAP using the Insert Statement function found on menu path Edit Pattern. 2. Introductory REPORT or PROGRAM Statement 3. Local Classes, Interfaces and Methods for Object Oriented Programming (if needed). 4. Declarative elements or TOP include(s) for declarative elements TYPES OR TYPE-POOLS SELECTION-SCREEN BEGIN / END SELECT-OPTIONS PARAMETERS TABLES
Page 11 of 83
5. Event elements INITIALIZATION AT SELECTION-SCREEN START-OF-SELECTION GET / GET LATE END-OF-SELECTION TOP-OF-PAGE END-OF-PAGE TOP-OF-PAGE DURING LINE-SELECTION AT LINE-SELECTION AT PFnn AT USER-COMMAND
Events should have a defining header to separate them from the processing logic. Example ******************************************************************* * * START-OF-SELECTION PROCESSING * ******************************************************************* * 6. Subroutines FORM Local data declarations: DATA STATICS (like global CONSTANTS) Etc.
ENDFORM
All forms should have defining headers with a short description of what the form does at each logical break in the code. Example:
*-------------------------------------------------------------* * FORM AUART_VALUE_REQUEST * *-------------------------------------------------------------* * Returns a pop-up screen with order types that are used for * * the Sales organization, distribution channel, division. *
Page 12 of 83
3.2.3
INCLUDE Programs:
An INCLUDE program is not executable on its own. It used to define common data objects and/or logic which may be incorporated in many other programs by reference via the ABAP statement INCLUDE <report name>. Include program contents are therefore usually has quite a discrete structure: 1. Report documentation (YREPORTHDR)
*--------------------------------------------------------------**************************************************************** * Confidential and Proprietary * Copyright 2001, NASA * All Rights Reserved **************************************************************** * ABAP Name: Zxxxxxxxxxxxxxxx * Created by: ________ * Created on: mm/dd/yyyy. * Version: n.n *--------------------------------------------------------------* Comments: purpose, use, design, structure, testing hints, etc * * *--------------------------------------------------------------* Modification Log: * Date Programmer Correction Description * 01/29/2001 B. Johnson DEV190001 Added *---------------------------------------------------------------
You can insert this header into the ABAP using the Insert Statement function found on menu path Edit Pattern. Followed by either: 2. Declarative elements. or 3. Program logic Functions Function documentation. For function modules use the function documentation pattern YFUNCTIONHDR instead of YREPORTHDR. FUNCTION <name>. Function local interface documentation generated by the function builder. Do not change. Local data declarations: DATA Etc.
Page 13 of 83
FORM <name> Local data declarations: DATA STATICS (like global CONSTANTS) Etc. Subroutine logic ENDFORM
3.2.4
Module pools (also known as Dialog Modules) are associated with transaction screen flow. The programs consist of data definitions, MODULE / ENDMODULE coding blocks, and subroutines. These program elements may be found directly in the program or, using the traditional approach, as INCLUDE programs within the module pool program. Custom module pool program structure: 1. Header documentation (YREPORTHDR)
*--------------------------------------------------------------**************************************************************** * Confidential and Proprietary * Copyright 2001, NASA * All Rights Reserved **************************************************************** * ABAP Name: SAPLZxxxxxxxxxxxxxxx * Created by: ________ * Created on: mm/dd/yyyy. * Version: n.n *--------------------------------------------------------------* Comments: purpose, use, design, structure, testing hints, etc * * *---------------------------------------------------------------
Page 14 of 83
You can insert this header into the ABAP using the Insert Statement function found on menu path Edit Pattern. 2. 3. 4. 5. INCLUDE LZxxxxxxxxTOP Data declarations INCLUDE LZxxxxxxxxOxx Process Before Output Modules INCLUDE LZxxxxxxxxIxx Process After Input Modules INCLUDE LZxxxxxxxxFxx - Subroutines
3.2.5
Function groups programs are containers for function modules and are maintained by the function builder. Like Module Pool programs, they only contain INCLUDE statements. They should not be changed manually.
3.2.6
Function modules are ABAP routines that are stored in a pool called a Function Group in a central function library. They are maintained by the function builder. Like form routines, function modules encapsulate program code, and provide an interface for data exchange. They differ from form routines in that they: possess a fixed interface for data exchange, making it easier to pass input and output parameters to and from the function module. support exception handling. use their own memory area and do not share memory with the calling program.
Page 15 of 83
You can insert this header into the ABAP using the Insert Statement function found on menu path Edit Pattern. 2. 3. 4. 5. 6. FUNCTION statement. Local interface documentation Local data declarations. Function logic ENDFUNCTION
3.2.7
Subroutine pool programs are collections of FORM routines called from external programs. Custom subroutine pool program structure: 1. Header documentation (YREPORTHDR) for subroutine pool
*--------------------------------------------------------------**************************************************************** * Confidential and Proprietary * Copyright 2001, NASA * All Rights Reserved **************************************************************** * ABAP Name: Zxxxxxxxxxxxxxxx * Created by: ________ * Created on: mm/dd/yyyy. * Version: n.n *--------------------------------------------------------------* Comments: purpose, use, design, structure, testing hints, etc * * *--------------------------------------------------------------* Modification Log: * Date Programmer Correction Description * 01/29/2001 B. Johnson DEV190001 Added *---------------------------------------------------------------
You can insert this header into the ABAP using the Insert Statement function found on menu path Edit Pattern. 2. Descriptive header for each FORM.
Page 16 of 83
3. 4. 5. 6.
FORM statement with interface parameters Local data declarations. Subroutine logic ENDFORM
3.2.8
Classes are created and maintained using the Class Builder. Header documentation for class programs is placed in the Class Documentation, as the ABAP editor cannot edit class pools.
3.2.9
Header documentation for interface programs is placed in the Interface Documentation, as the ABAP editor cannot edit interface pools.
3.3
ABAP code is fairly self-documenting, and the version management, object navigator and cross-reference tools of the ABAP Workbench provide a very good technical perspective of an ABAP and its change history. However, the purpose of changes, the specific business or technical need being addressed may not be obvious. Also, there may be prerequisite or follow-on activities, or precautions on the use of the program. Therefore it is prudent to provide future programmers with documentation of the program purpose, use, changes, enhancements, additions, and deletions. A complete repository of the program, from requirements identification through functional design, technical design, program documentation, test results and implementation is maintained on the Lotus Notes MDM Change Management DB. To aid in future maintenance and enhancement of the program, the programmer should briefly explain the purpose, use, design, structure and any testing hints at the top of the program. Additionally, maintain a chronological history of modification notes; with the latest change being the last entry in the modification log. The documentation block should be placed at the top of the main program. Comments should be placed throughout the program to identify ABAP events, explain program logic, and the purpose of subroutines.
Page 17 of 83
Core Financials ABAP Programming Standards and Gudelines 3.3.1.1 Class Pool Documentation
Class pool documentation is maintained in the Class Builder. For custom classes, the documentation should have the following format.
CL ZCL_nnnnnnnnnnnnnnnnn Ownership: Confidential and Proprietary Copyright 2001, NASA All Rights Reserved Created by: ________ Created on: mm/dd/yyyy. Version: n.n Modification Log: Date 01/29/2001 Programmer B. Johnson Correction Description DEV190001 Added
Functionality: Description of class Relationships: Relationships with other classes Example: Example showing use of CLASS Notes: Special considerations Further Information: Where to find more informaiton
IF ZIF_nnnnnnnnnnnnnnnnn Ownership: Confidential and Proprietary Copyright 2001, NASA All Rights Reserved Created by: ________ Created on: mm/dd/yyyy. Version: n.n Modification Log: Date 01/29/2001 Programmer B. Johnson Correction Description DEV190001 Added
Functionality: Description of class Relationships: Relationships with other classes Example: Example showing use of CLASS Notes: Special considerations Further Information: Where to find more informaiton
Page 18 of 83
3.3.2
If a modification is made to an existing custom ABAP program, an entry should be made in the modification log with the date, programmers initials, correction number, change management number (?) and brief description. Also, in the program code, a comment should be added to the effected lines indicating the correction number. Example: IF SY-SUBRC NE 0. Exit. ENDIF. DevK9000045 DevK9000045 DevK9000045
3.3.3
User Documentation:
User or use documentation should be maintained using the ABAP documentation feature through the menu toolbar Goto Documentation Change. You will then be presented with SAPs standard program documentation template with paragraph headers for: TITLE: copied from the attributes screen title field. PURPOSE: detailed User description of the programs purpose. Include any precautions the user should be aware of resulting from the execution of this program. INTEGRATION: integration points with other applications or partner systems PREREQUISITES: describe any prerequisite activities. FEATURES: Selection: - advice on selection screen fields Standard Variants: - pre-defined variants set up for general reporting needs Output: - content of the print list
ACTIVITIES: - follow-on activities. As an example, instructions for interactive reporting EXAMPLES: - processing hints, helpful information on running the program.
This documentation is then available to the user at execution time through the same menu path described above or though Program Documentation icon which is automatically added to the report selection screen Application Toolbar in the GUI interface.
3.4
Text Elements
Each ABAP should have associated text elements and constants from the source code placed within the Text Elements section of the ABAP Editor:
3.4.1
- The heading should always be completed in as much detail as possible. Use of standard headings is preferred as they can be easily made multilingual. The alternative is coded headings, which require further coding for each language supported. Note: Any data
Page 19 of 83
3.4.2
Selection Texts
All system SELECT-OPTIONS and PARAMETERS are limited to 8 characters and as a consequence should always have selection texts set to improve user understanding.
3.4.3
Text-Symbols
Literal text that is printed on the report can be handled two ways. One way is to hard code the literal in the code and give the option of maintaining Text Elements for multilingual clients. Example: WRITE: / Grand Total:(001). The advantages of this method are readability and only the text element needs to be maintained for multilingual clients. As a standard, use the following example. Example: TEXT-001 defined as Grand Total: WRITE: / TEXT-001. The advantage of this method is ease of maintainability if TEXT-001 is coded several times in the program and needs to be changed.
3.5
Variants
Variants may be created for executable ABAP programs. They are sub-objects of a program and are not shared with any other program. Variants allow you to save sets of input values for programs that you often start with the same selections. The naming conventions for variants are found in NASA Core Financials Development Naming Standards.
Page 20 of 83
4 Style Guidelines
4.1 ABAP Style Guidelines
The SAP Style Guide found on the online help, menu path Help SAP Library, provides guidelines for developing the user interface for R/3 applications. The aim of the Style Guide is to support developers when creating user-friendly and standard software for the SAP System. The goals of Style Guide are: higher user productivity greater user satisfaction with the product lower user error rate
The Style Guide concerns all the applicable SAP design guidelines. The SAP Style Guide is based on platform-specific style guides such as the IBM CUA Guidelines, the Windows Style Guide or the Apple Macintosh Human Interface Guidelines, which have been adapted and added to meet SAPs business needs. Stated another way, the Style Guide concerns design guidelines for the graphical user interface (GUI) or, the presentation and interaction of the application with the active user. These guidelines primarily pertain to the screen (window) components shown below and window navigation.
4.1.1
Page 21 of 83
Core Financials ABAP Programming Standards and Gudelines 4.1.2 Work Area Design Elements
4.2
4.2.1
Window Titles
Custom transaction and program selection screens must identify their ownership and purpose. Example NASA MSFC PROJECT STS100 MATERIAL REQUIREMENTS
4.2.2
Selection Screens
Fields should be grouped and arranged in order of importance from upper left to bottom right.
4.2.3
Transaction Screens
Ergonomic examples
Page 22 of 83
Core Financials ABAP Programming Standards and Gudelines 4.2.4 Online Help
Each custom program / transaction must have sufficient online help for the user to
effectively use the function. Additionally, field level help and Possible entries support should be utilized whenever possible.
4.2.5
Report Titles
Report titles should appear at the top of each page and include title line(s) centered in the page and the date at the right, top margin. If the report is for a specific business object (ie. Purchase Order, Cost Center), this should be included in the title. Example
Purchasing Documents Per Vendor 03/29/2001
4.2.6
4.2.7
Report Footings
Footings should appear on each page and include the program name at the left margin and the page number at the right margin. Example
ZMM_PUR_VENDOR_POS Page 1
5.2
Views
A view is a virtual table. This is a table that is not physically stored but is instead derived from one or more other tables. This derivation process might involve simply transferring only certain records from a base table to the view. More complex views can be assembled from several tables. A view can be tailored to the needs of a specific report, making it possible to directly access specific data. The structure of such a view is defined by specifying the tables and fields to be contained in the virtual table. If a table contains many fields and only a few of these fields has to be read by a report, access to the data can be simplified by creating a view containing only these fields. By accessing the view instead of the table, significant performance enhancements can be made.
Page 23 of 83
5.3
Internal Tables:
The main purpose of this section is to examine ABAP performance and how that relates to overall system requirements and constraints. As is most often the case, the majority of processing time for custom developed ABAPs, (upwards of 90% in most cases), is spent in database accesses. This is usually a result of 1. nested select statements, 2. inefficient where clauses in select statements, or 3. simply functional requirements that do not match well with SAPs table relationships. Regardless of the cause, the use of internal tables can drastically reduce database access, and thus, reduce report run time.
5.4
Possible Uses Of Internal Tables 5.4.1 A Large Number Of Database Accesses Are Foreseen
In situations where a large number of database accesses are foreseen on a given table or where certain information from a table may be needed more than once, it may be a good idea to move all (or a significant portion) the necessary fields into an internal table in one statement. This information will then be available to the program as many times as is necessary and will require no further database accesses.
5.4.2
Another very beneficial use of internal tables is to replace one or many levels of nested selects in report selection logic. Loop processing can then be performed on this internal table for subsequent selects into other tables. The key benefit in this approach is that the number of accesses to the higher level table in the database is significantly reduced. This also takes away the risk that Oracle will lose track of the database cursor in its roll area. (A problem for some larger reports.)
5.5
Page 24 of 83
Core Financials ABAP Programming Standards and Gudelines 5.5.1 The tradeoff
If you will only need the data once and it is a small amount of data, (number of accesses) the use of an internal table is not necessary. If there is a lot of data and several selects based on that data, use an internal table. Common sense is key, i.e. It does not make sense to load the entire material master into an internal table, but a specific list of materials, transactions, or documents from which to start looping is an ideal situation for internal tables. The primary goal is to fill this table with the most finite list of data that can be constructed from the select statement that will be used to populate it. In terms of nesting, each record at a high level table can result in hundreds of records that relate to it in subsequent lower level select statements, which is why it is so necessary to be specific.
5.5.2
Select statements that query only the necessary columns from a table are more efficient than select * from table. Only the fields that are needed for report functionality are selected and stored for later use. Selecting directly into an internal table also reduces run time and negates the need for an end select and an append. (This is not conducive to loop processing since the table is populated instantly) When selecting by columns into an internal table or structure, the order in which the columns appear in the database must correspond to the order in the select statement, as well as the order of the fields in the internal table/structure data declaration. Example: Data: begin of i_tab occurs 10, kunnr like kna1-kunnr, name1 like kna1-name1, telf1 like kna1-telf1, end of i_tab. Select kunnr name1 telf1 from kna1 into table i_tab where land1 eq USA. Or Select kunnr name1 telf1 from kna1 into i_tab where land1 eq USA. Append i_tab. Endselect. Sort i_tab by kunnr. The data contained in this table can now either be looped through, or read one line at a time by the statement: Read table i_tab with key kunnr binary search. This will move the values within the selected line into the header of the table and make it available for use within the program.
Page 25 of 83
Core Financials ABAP Programming Standards and Gudelines 5.6 Free System Resources
As a final note on the usage of internal tables, it is important to free up the space reserved for the tables after the data contained within is no longer needed. Each user has a predefined limit concerning memory usage and availability. This amount is reserved at the application server level. By freeing up this space, there is less risk of surpassing the memory capacity of the roll area that would result in paging of the held data. Retrieving data that has been paged is more time consuming than data held in the roll area. The free command is usually issued immediately after the last line of code that processes the internal table. This will keep the roll area that is reserved for that particular user to a minimum level. Example of Free Command: Loop at i_tab. Select vbeln posnr from vbak into xvbak where kunnr eq i_tab-kunnr. Append xvbak. Endselect. Endloop. Free I_tab. (if fields in i_tab are no longer needed.)
5.7
Field Groups
A field group combines several existing fields together under one name. You use the INSERT statement to determine which fields belong to a field group at runtime Example: FIELD-GROUPS: HEADER, ORDER, PRODUCT. Neither defining a field group (statically) using FIELD-GROUPS nor filling a field group (dynamically) with INSERT generates more memory. Rather, there exists for each field group element a pointer to an (existing) field. The use of field groups is an alternative method to internal tables for data storage and loop processing. Data selection itself does not vary whether you are using internal tables or field groups. Some distinguishing characteristics are the method in which they are populated, and the manner in which you can process them. An internal table is declared through explicit definition of the structure and an occurs statement, and is populated through appending. Field groups are declared, then specific fields are inserted into each field group for definition. At field group population time, the term Extract <field group> populates all fields in the field group with the current value for those fields from within the report. There is no tangible table to see, as SAP stores the information internally in existing SAP tables.
5.7.1
Inserts one or more fields into the field group fg. 1. This basic form of INSERT is not a declarative, but an operational, statement, i.e. it must be executed at runtime. 2. A field group can only accept global data objects, not data objects which have been defined locally in a FORM or FUNCTION.
Page 26 of 83
5.7.2
Extract <fg>.
Writes all fields of the field group fg as one record to a sequential dataset (paging). If a field group HEADER has been defined, its fields prefix each record to form a sort key. You can sort this dataset with SORT and process it with LOOP ... ENDLOOP. After this, EXTRACT cannot be execuuted again As soon as the first dataset for a field group has been extracted with EXTRACT, the field group cannot be expanded using INSERT. The field group HEADER, in particular, cannot be expanded after the first EXTRACT (regardless of field group).
5.7.3
Loop processing for field groups is similar to loop processing for internal tables. This is accomplished through the use of LoopEndloop construct. Some key differences are that field group processing allows more flexibilty regarding sorting, resorting, control breaks, and subtotaling and totaling functionality. A field group can be sorted and resorted by any field or combination of fields that are declared in the header field group. These fields are also the ones available for control breaks, i.e. at new company code, at end of customer numberThese are all accomplished through the use of the AtEndat construct. The fields referenced in the At statement must be contained in the Header field group.
5.7.4
Page 27 of 83
5.8
5.8.1
These call functions are a convenient for taking a calendar date and converting it into a period, creating date ranges based on fiscal period, and vise versa. These are essential because the system classifies transactions according to calendar date, period in which they occur, or both. DATE_TO_PERIOD_CONVERT Pass the module a calendar date (YYYYMMDD) and it returns the corresponding fiscal year and fiscal period. FIRST_DAY_IN_PERIOD_GET Pass the function module the desired fiscal period, fiscal year, and fiscal year variant, and the function module returns the calendar date of the first day of the required period. LAST_DAY_IN_PERIOD_GET Pass the function module the desired fiscal period, fiscal year, and fiscal year variant, and the function module returns the calendar date of the last day of the required period. LAST_DAY_IN_YEAR_GET Pass the function module the desired fiscal year and fiscal year variant, and the function module returns the calendar date of the last day of the fiscal year. WEEK_GET_FIRST_DAY
Page 28 of 83
5.9
Logical Database:
A logical database is a predefined view of the database. This path provides a link to records that are physically separate but functionally link. The use of logical databases in ABAP programming takes away the need for manually creating the linking of tables through select statements, providing all of the necessary tables are contained in the structure of the logical database. Although these provide a major time savings for the developer, they can often pull far more data than is actually necessary since there is no discrimination of data that is selected. When a logical database is entered in the attributes section of the report, a predefined selection screen for the report is generated. Additional selections can be added below the standard selection screen by the developer and can be referenced between the appropriate Get statements for the logical database.
Page 29 of 83
The code changes made in the SAP Standard Programs must follow the documentation standards used by SAP, with the addition of the correction number in the comments. Example
*>> BEGIN OF INSERT OSS 1234567 DEVK900012 IF SY-SUBRC<> 0. PERFORM CHECK_RFC. ENDIF. *<< END OF INSERT OSS 1234567 DEVK900012
Page 30 of 83
This section is an overview of general programming guidelines intended for less experienced ABAP programmers.
8.1
8.1.1
Program Structure
Client Information ABAP Name authors name create date version number Comments (purpose, use, design, structure, testing hints, etc) Modification Log with date, programmer, CTS number and Description
Next, place all data declarations at the top of your program. This does two important things. The code becomes easy to read and search for table or field definitions. And the data becomes globally available, should you need to add routines later in the program. Data that is defined throughout the program without any forethought can cause problems when something gets reused or redefined unnecessarily. It also breaks your train of thought when debugging complex logic. Following the data declarations are the event elements of the program. They should be placed in the following order: INITIALIZATION AT SELECTION-SCREEN START-OF-SELECTION GET / GET LATE or SQL statements END-OF-SELECTION TOP-OF-PAGE END-OF-PAGE TOP-OF-PAGE DURING LINE-SELECTION AT LINE-SELECTION AT PFnn
Page 31 of 83
After the event elements are the local subroutines (FORM routines) performed by the event processing logic or from other FORMs.
8.1.2
Modularization
Usually, the main processes of an ABAP program occur at the START-OF-SELECTION or at the END-OF-SELECTION events. Design your code so that the main processing section, or client, controls all program action. Organize all remaining code into logical groups or subroutines that are executed, called, performed, or passed temporary control by the client. That is, they should all work as servers to the main processing section, of your program. Control should always return to the client, unless errors occur that need to be amended immediately, or in rare instances, when you need to pass explicit control to the next module. Place the server sections of code after all event elements of the program in the normal order they will be processed. This will make your code more readable. If a section of code is called by several subroutines, place it after the last subroutine that calls it. When it does not make sense to separate the code into subroutines, separate the functionally related code via comments and blank lines to logically group sections of code that will be processed and/or maintained together.
8.1.3
Statement Format
Avoid using comments on statement lines. Use separate and distinct comment lines at the beginning of the form/module containing the code. If you are writing a particularly complex statement (IF, CASE, etc.), place your comments just prior to the code being described / executed. Although ABAP allows multiple commands on the same line, place each command on a separate line for readability. This also makes it easier to update / delete code. After you have checked your program via syntax Check and successfully saved it, use pretty printer to align statements and make the code more readable. If you have aligned all of the statements yourself, make sure you have saved the program and compared the before and after product. Your own indentations, etc. may be preferable to the pretty printer output. Do not keep blocks of dead code in custom developed programs, as they can be confusing. Use version management to create a backup version of source code if you feel you may need the code and a version has not been generated by prior transport(s) of the program.
8.1.4
Use the ready-made patterns or structures available via the editor Pattern function to insert tailored ABAP statement structures or, comment or coding blocks into your program. To insert ready-made patterns: 1. Place the cursor on the line following where you want the pattern and click on the Pattern function or press CNTL-F6. 2. In the pop-up window, select the appropriate radio button for the statement or pattern desired. 3. Enter the development object name (ie. Function Module, Database Table, Authorization Object, etc) or , the comment or coding block name.
Page 32 of 83
Example In your program, you need to determine the first day in the fiscal period. To do this you choose to use the FIRST_DAY_IN_PERIOD_GET function module. The screen below shows the Pattern Insert screen with the needed selections to insert this function call.
This results in the following coding block being inserted into the program with all the interface parameters identified and basic return code check coding. CALL FUNCTION 'FIRST_DAY_IN_PERIOD_GET' EXPORTING I_GJAHR = * I_MONMIT = 00 I_PERIV = I_POPER = * IMPORTING * E_DATE = * EXCEPTIONS * INPUT_FALSE = 1 * T009_NOTFOUND = 2 * T009B_NOTFOUND = 3 * OTHERS =4 . IF SY-SUBRC <> 0. * MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO * WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4. ENDIF.
Page 33 of 83
Core Financials ABAP Programming Standards and Gudelines 8.1.5 Performance Considerations
Remember to free the data spaces (see the FREE command in your ABAP manual or refer to Performance and Tuning Guidelines in a later chapter) for large tables or field strings that are no longer needed. When performance is a major concern, organize your program into distinct modules that can define the data needed, process it, and free the space. In these situations, it may make sense to separate your code into include modules or external function modules for clarity of code and possibly performance (different rule sets apply for tuning modules and calls). If properly organized, you can write code in this fashion, so that data is defined throughout the program, rather than all at the top. When coding in this fashion, use liberal comments to explain what is going on and when and why data can be defined and freed. If the data is to be used only within a function module or subroutine, place the definition at the top of the routine and free the space at the end. Remember to pay close attention to rules for global and local data definitions for programs with sub-routines, especially external routines.
8.1.6
Version Management
Version management of the ABAP editor allows you to keep historical versions of your program throughout its life, from initial development through the layered testing and approval staging to production, and, ongoing maintenance and enhancement. Each time you release your program for transport, a new version is created. You can also choose to generate a version yourself if, for example, you are at a major mile stone in the development and new requirements have been identified, which are a substantive change. In both cases the version created becomes backup copy of the program.
8.1.7
If you use a constant frequently, do not define it as an explicit literal value over and over. Set up an internal field with the CONSTANTS statement with the VALUE option. If the value changes, you will only need to change the constant once to effect the change. If the value changes over time, consider using PARAMETER, SELECT-OPTION, dynamic TVAR variable, etc. to avoid program maintenance. Example
MOVE 150 TO MY_SCREEN_NUM. ... MOVE 150 TO MY_SCREEN_NUM. ... MOVE 150 TO MY_SCREEN_NUM. ==> Will work, but requires changes be make in several places when the screens renumbered. CONSTANTS: SCREEN_LITERAL(3) TYPE N VALUE 150. ... MOVE SCREEN_LITERAL TO MY_SCREEN_NUM. ... MOVE SCREEN_LITERAL TO MY_SCREEN_NUM. ... MOVE SCREEN_LITERAL TO MY_SCREEN_NUM. are
==>
Will require only one change when the screen numbers change.
Page 34 of 83
If you need extra work fields for database fields, use SAP field names whenever possible and use the LIKE option to ensure the data attributes match. This will also avoid maintenance problems should the data base field change. When naming fields, avoid the use of hyphens, since they indicate field strings and ABAP keywords. Instead of hard-coding text literals, use Text Elements for headers, report titles, column headings, selection texts and numbered texts. They are easier to find and change, and only need to be changed in one place - one time. When the same literals are used in several programs, they are easy to copy from one program to the other, rather then cut-and-paste or retyping of hard-coding. When defining customer tables or internal tables: Use the same field names as any existing SAP tables - e.g. Use MANDT, not CLIENT. If the SAP name is confusing, use the short text (in table/DD) and comments in DATA(ABAP) to clarify. The SELECTs, Ifs, CASE, etc. will be much easier to understand and debug when all data fields match. Use the same DATA ELEMENT, TYPE, DOMAIN, etc. for any fields where comparisons will take place. Although the system will perform automatic type conversions, they are CPU/DB intensive and results can not be guaranteed for all comparisons after data conversion.
8.1.8
Field symbols
Field symbols are symbolic fields or structures that can be assigned dynamically to other fields and field structures at runtime using the ASSIGN statement. Field symbols can dramatically reduce the amount of code used in a routine, therefore reducing execution time. However, because the code becomes symbolic, it can be difficult to read later and becomes less maintainable. Example Code using absolute field names
get cursor field v_field. case v_field. when ZSCRFLD-WEEK01. perform f_process_week using zscrfld-week01. when ZSCRFLD-WEEK02. perform f_process_week using zscrfld-week02. when ZSCRFLD-WEEK03. perform f_process_week using zscrfld-week03. when ZSCRFLD-WEEK04. perform f_process_week using zscrfld-week04. ... ... when ZSCRFLD-WEEK51. perform f_process_week using zscrfld-week51. when ZSCRFLD-WEEK52. Page 35 of 83
8.1.9
Example Program
REPORT ZRIM01 . ************************************************************************************* *** AUTHOR: JOHN DOE. *** DATE: 10-15-94. *** DESCRIPTION: THIS IS A SAMPLE PROGRAM THAT READS DATA, BUILD A TABLE *** AND PRINTS THE DATA. SEE SAMPLE SYSTEMS MANUAL *** SPECIFICATION #4804, PAGE 12. *** USER AREA: THIS PROGRAM WAS WRITTEN FOR ACCOUNTS PAYABLE. *** ***PROGRAM CHANGE LOG: DATE DESCRIPTION / REASON FOR CHANGE *** NAME *** J. DOE 10-31-95 ADD COLUMN FOR CITY TO REPORT *** ************************************************************************************* TABLES: LFA1. DATA: BEGIN OF MYTAB OCCURS 10, LAND1 LIKE LFA1-LAND1, ORT01 LIKE LFA1-ORT01, END OF MYTAB, BAD_REGION_COUNTER(4) TYPE P VALUE 0, BAD_REGION_COUNTER_TOT(4) TYPE P VALUE 0. *** BEGINNING OF MAIN PROCESSING LOGIC *** 10-31-95 ADDED CITY TO WRITE STATEMENT SELECT * FROM LFA1. IF LFA1-LAND1 = 'US'. * AND LFA1-ORT01 = 'HOUSTON'. WRITE:/ 'COUNTRY = ', LFA1-LAND1, ' CITY = ', LFA1-ORT01. MOVE LFA1-LAND1 TO MYTAB-LAND1. MOVE LFA1-ORT01 TO MYTAB-ORT01. APPEND MYTAB. IF LFA1-REGIO NE 'TX'. PERFORM PRINT_BAD_REGION_MSG. ENDIF. ENDIF. ENDSELECT. SKIP 3. WRITE: / 'TOTAL RECORDS WITH INCORRECT REGION CODE =', BAD_REGION_COUNTER_TOT. *** END OF MAIN PROCESSING LOGIC TOP-OF-PAGE. WRITE: / THIS IS MY REPORT. SKIP.
Page 36 of 83
END-OF-PAGE. WRITE: / THIS IS THE END OF THE PAGE. *---------------------------------------------------------------------* * FORM PRINT_BAD_REGION_MSG * *---------------------------------------------------------------------* * * *---------------------------------------------------------------------* FORM PRINT_BAD_REGION_MSG. WRITE: / 'THE FOLLOWING RECORD HAS A BAD REGION CODE'. WRITE: / LFA1. ADD 1 TO BAD_REGION_COUNTER. ADD 1 TO BAD_REGION_COUNTER_TOT. IF BAD_REGION_COUNTER GT 25. PERFORM PRINT_SPECIAL_MSG. ENDIF. ENDFORM. *---------------------------------------------------------------------* * FORM PRINT_SPECIAL_MSG * *---------------------------------------------------------------------* * * *---------------------------------------------------------------------* FORM PRINT_SPECIAL_MSG. SKIP 4. CLEAR BAD_REGION_COUNTER. WRITE: / 'TOO MANY BAD STATE CODES', / 'CHECK THE TABLE FOR INPUT ERRORS', / 'HIRE A NEW CLERK IF THIS HAPPENS AGAIN'. ULINE /2(80). SKIP 4. ENDFORM.
8.2
Check SY-SUBRC to ensure proper inputs when dealing with tables (e.g.- READ, SELECT, WRITE, GET, PUT). Value Description 0 Read was successful (or the looping structure has terminated successfully) 2 Entry found, field values different 4 Record was not found 8 Record key was not qualified null End of file
8.2.2
Use CLEAR <field> to initialize rather than explicit moves. When combined with the VALUE option for data definition, you only need to change one statement in the data declaration area should maintenance be required. Example
Page 37 of 83
DATA: AFIELD(2) TYPE P VALUE 1. ... CLEAR AFIELD. ==> is preferred and requires less maintenance.
Always CLEAR tables at the end of a loop process to ensure data is not left in the header and mistakenly processed with the next record(s). Use REFRESH <table> to initialize table records, as opposed to CLEAR for table headers.
8.2.3
MOVE-CORRESPONDING
MOVE-CORRESPONDING is good for small tables or tables where most, but not all, fields need to be moved. When all fields need to be moved and the attributes for every field and position are identical, move the table as a group. MOVE-CORRESPONDING will require less maintenance for tables / fields that change over time. However, if the table has several fields the MOVE-CORRESPONDING statement can be very costly performance wise.
8.2.4
SORT
Do not use SORT APPENDS. It is very CPU intensive and results are often unpredictable. At best, the statement is confusing for the average ABAP programmer. Always specify Ascending or Descending (even though the default is Ascending) for all SORTS, for readability and unmistakable clarity. Always code a BY data field(s) clause with the SORT command to increase performance and improve readability. See Performance and Tuning of ABAP Programs for examples.
8.3
Break down all LOOPs, Ifs, CASE, etc. statements to their simplest form. Dont complicate via nesting unless absolutely unavoidable. Never nest more than 3 levels deep. Avoid the use of negative logic in IF, CASE, SELECT, etc. structures whenever possible. Example ... SELECT * FROM KNA1, WHERE NOT MANDT = 001. ... IF NOT FILEDA = FIELDB. ... ENDIF. ==> Will both work, but is confusing when used in complex or nested structures. ... SELECT * FROM KNA1, WHERE MANDT NE 001. ... IF FIELDA NE FIELDB. ... ENDIF. ==> Is much simpler to read and maintain, expecially when combined with other logical conditions.
Page 39 of 83
Core Financials ABAP Programming Standards and Gudelines 8.4 Performance and Tuning Guidelines 8.4.1 Use SORT to organize reports and data.
Qualify all SORT statements with the BY option and limit the sorting of data to only the fields that must be used to satisfy your reporting requirements. Sorts, in general are very expensive and should be avoided and/or limited whenever possible. Whenever possible, store data in a table in the order needed for reporting / processing, so that sorting is not required. Example The customers report calls for various fields and totals to be output in order by Company Code, Cost Center, and General Ledger. In this example ZCOMP is filled with Company Code, ZSORT1 is filled with Cost Center, and ZSORT2 is filled with General Ledger. The data area for the sort were defined in ABAP as follows: FIELD-GROUPS: HEADER, DETAIL. INSERT: ZCOMP ZSORT1 ZSORT2 ZDATE ZDOC ZLINE ZFY ZTEXT ZAMT ZDCIND ZPERIOD ZACCT ZACCT2 ZCCNTR INTO HEADER. ... ... SORT. ==> Very inefficient for internal tables, however for field groups this is efficient. The system will have to sort based on every field in the table. SORT ASCENDING BY ZCOMP ZSORT1 ZSORT2. ==> Most effective. Will require about one-fourth the resources as the qualified SORT above and process in a fraction of the time.
Page 40 of 83
Core Financials ABAP Programming Standards and Gudelines 8.4.2 Defining Custom Tables.
When defining a custom table, always place the key fields at the front of the record layout (the first few columns). The database attempts data compression for all fields in a table, but cannot compress key fields. Therefore, compression of the data records cannot take place until after the last key field in the table. Example For the following table definition: Field name Key MANDT * KUNNR * FIELDB FIELDC FIELDD FIELDA * FIELDE FIELDF Data Element MANDT KUNNR FIELDB FIELDC FIELDD FIELDA FIELDE FIELDF Type CLNT CHAR CHAR CHAR CHAR CHAR CHAR CHAR Length 3 10 15 15 15 5 20 15
Only FIELDE and FIELDF can be properly compressed by the data base. The other fields, FIELDB, FIELDC, and FIELDD, cannot be compressed and therefore need more disk space and processing resources than necessary. If the same table is defined as follows, the data base can compress FIELDB, FIELDC, FIELDD, FIELDE, and FIELDF, and therefore, save space and processing time every time the table is accessed. The gains in performance become even greater if the table is placed in a pool or cluster, or processed with foreign keys (matchcodes, etc.). Field name Key MANDT * KUNNR * FIELDA * FIELDB FIELDC FIELDD FIELDE FIELDF Data Element MANDT KUNNR FIELDA FIELDB FIELDC FIELDD FIELDE FIELDF Type CLNT CHAR CHAR CHAR CHAR CHAR CHAR CHAR Length 3 10 5 15 15 15 20 15
8.4.3
Familiarize yourself with the data being processed before using the SELECT statement. Table types greatly influence how you should process data within the ABAP program. To find out what kind of table you are working with use transaction SE12, ToolsABP WorkbenchDevelopmentABAP Dictionary. Enter the name of the table and click on DISPLAY to get information on the TABLE TYPE. If the TABLE TYPE is Transparent or Pool, you should always qualify your SELECT statement as fully as possible with the WHERE option. This includes data fields that may not be part of the key. This allows the database to evaluate the records and return only the records matching your selection criteria. Example SELECT * FROM ZZLT2
Page 41 of 83
SELECT * FROM ZZLT2 WHERE RLDNR = LDGR AND RRCTY = 0 AND RVERS = 001 AND BUKRS = COMP AND RYEAR = YEAR AND RACCT = ACCT AND RCNTR = CCNTR. ==> More efficient for Transparent & Pool tables.
8.4.4
If the TABLE TYPE is CLUSTER, then just the opposite is true. When working with Cluster tables, you should only qualify SELECT statements with fields that are part of the key. To find out what the key is you should follow the steps above to get the TABLE TYPE and then click on FIELDS. The system will display detailed data about the fields in the table and place a dot under the column marked KEYS for fields that can be used in a WHERE clause as part of a SELECT for Cluster tables. Another way to find out whether a field is part of a key is from within the ABAP editor, you may enter SHOW table name on the Command Line to list the table. The key fields will be marked with an X under the column KEY. If the table is a cluster table, you should then use the CHECK command to eliminate records, after you have narrowed your selections via the WHERE clause for key fields. Cluster tables cannot be processed by the data base directly, as can transparent tables. Forcing the data base to unpack and check fields (as with SELECT statements containing non-key fields in WHERE clauses) is less efficient, in most cases, then qualifying only with key fields and letting ABAP check non-key fields after the data is returned. Example For cluster table, BSEG with keys MANDT, BUKRS, BELNR, GJAHR, and BUZEI: SELECT * FROM BSEG WHERE REBZG = BSIK-BELNR AND BUKRS = BSIK-BUKRS AND LIFNR = BSIK-LIFNR AND SHKZG = S AND KOART = K. ==> Will work, but requires a lot of available memory, buffer space, & data base time to unpack non-keyed data for verification/inclusion. This work takes place at the
Page 42 of 83
8.4.5
Fields that are compared in SELECT statements should have similar attributes. If they dont the system will have to convert the data every time a comparison is made. When you cant match data fields via table definitions, then you should move the data to a temporary field in your program before doing the compare (if you will be using the same field for several comparisons). Example SELECT * FROM ZZLT2 WHERE RLDNR = LDGR AND RRCTY = 0 AND RVERS = 001 AND RYEAR = YEAR. SELECT * FROM WHERE RLDNR AND RRCTY = AND BUKRS = ZZLS2 = ZZLT2-RLDNR ZZLT2-RRCTY ZZLT2-BUKRS.
SELECT * FROM BSEG WHERE BUKRS = ZZLS2-BUKRS AND BELNR = ZZLS2-DOCNR AND GJAHR = ZZLS2-RYEAR AND BUZEI = ZZLS2-DOCLN. ==> Compares a NUMC 3 to a CHAR 3 field. Since this SELECT will be cycled through several times in this nesting structure, it would be more efficient to move the data field before processing the looping SELECT. DATA: ZZ_TEMP_DOCLN LIKE BESG-BUZEI. ... SELECT * FROM ZZLT2 WHERE RLDNR = LDGR
Page 43 of 83
MOVE ZZLS2-DOCLN TO ZZ_TEMP_DOCLN. SELECT * FROM BSEG WHERE BUKRS = ZZLS2-BUKRS AND BELNR = ZZLS2-DOCNR AND GJAHR = ZZLS2-RYEAR AND BUZEI = ZZ_TEMP_DOCLN. NOTE: Your comparison may still fail in both examples due to the conversion of alpha-numeric characters to numeric. Data comparisons are accomplished at the hexadecimal level and some values, characters, or signed values may not convert as you anticipate. You must check SY-SUBRC in these examples and/or find other ways to verify that your record selection was successful. Results are unpredictable with data conversion.
8.4.6
When dealing with a table, if possible, process the table completely before performing SORTs, SELECTs, READs, etc. with other tables. Example Several internal tables have been created to store totals for output to a report. They are STOCKS, PROCUREMENT, ABC, HIERARCHY, and GROUPS. During processing of other data these tables have been generated and are ready for sorting and output to a report. SORT STOCKS BY STOCKOBJ. SORT PROCUREMENT BY PROCOBJ. SORT ABC BY ABCOBJ. SORT HIERARCHY BY HIEROBJ. SORT GROUPS BY GRPOBJ. ... LOOP AT STOCKS. READ TABLE STOCKS... WRITE.... SUMTOT = SUMTOT + STOCKS-VALUE. ENDLOOP. WRITE: / TOTAL: SUMTOT. LOOP AT PROCUREMENT. READ TABLE PROCUREMENT... WRITE....
Page 44 of 83
Page 46 of 83
Core Financials ABAP Programming Standards and Gudelines 8.4.7 Processing large tables.
When dealing with a large table, you should process as much information as possible on your first pass through the data and, if possible, eliminate any other pass through the table. Sometimes this requires the use of internal tables or data fields to store summary totals, etc. You must evaluate each situation to determine whether it makes sense to store this data and pass through it separately or make another pass through the original table. Factors to consider are: - How large is the original table versus the sub-set that would be stored as an internal table? - How much storage space would be required to store the data in an internal table? If processing only needs to take place once (e.g.- store a field for comparison in a data field), be sure this action takes place outside of any looping structure (SELECT, LOOP, DO, etc.) so that the processing does not repeat unnecessarily.
8.4.8
General Tips:
The IN operator is very expensive in terms of machine time and should not be used in place of an individual EQ operator. Logical expressions are evaluated from left to right. The evaluation is ended when the final result has been established (elimination or complete inclusion). Therefore, when using the AND or OR operator (in IF, WHERE, etc.), the most likely elimination criterion should be specified first. The opposite will be true for negative comparisons and some OR conditions. Example The following table is to be read with printing of employees from ABC company in Georgia: EMPLOYEE# 001 002 003 004 005 006 007 008 009 010 NAME Doe, J. Doe, M. Jones, A. Jones, B. Jones, C. Jones, D. Jones, E. Smith, A. Smith, B. Smith, C. COMPANY ABC ABC XYZ ABC ABC XYZ ABC ABC ABC ABC STATE TX OK TX GA TX GA TX GA TX OK
IF COMPANY = ABC AND STATE = GA WRITE ... ENDIF. = => Will work, but will need to evaluate both the company and state fields for eight of ten records. IF STATE = GA AND COMPANY = ABC WRITE...
Page 47 of 83
8.5
A well defined and properly implemented index is one of the best performance and tuning tools available. However, because of the diversity of various database systems, and in particular various database optimizers, it is not possible to lay down any hard and fast rules for creating and using database indexes. Additionally, it is impossible to guarantee the data base optimizers will use your index. Therefore, always check to ensure the proper index is being used. 1. Use the SQL trace transaction ST05 to turn the trace on and off. 2. Click TRACE ON. 3. Execute the transaction in question via a separate session. 4. Return to ST05 and click TRACE OFF. 5. Click LIST TRACE to view the results of your trace. 6. Click on the PREPARE, OPEN or REOPEN statement to select the SQL statement for evaluation. 7. Click EXPLAIN to obtain the results of the SQL statement and optimizer actions.
8.5.2
An index supports data searches in the database. All SAP tables have a primary
index, which consists of the key fields that the user defines when creating a custom table. For SELECTs in which the primary index cannot be used in the WHERE clause, or when SELECTs are not properly qualified, the data base searches the entire table (performs a full table scan). Indexes should, generally, only be created with less than five fields. The most unique / selective fields should come first in the index definition, unless you can match the generic keys of the primary index for the table (e.g.-MANDT, BUKRS). In general, if a condition includes OR, the optimizer stops processing (and invokes a full table scan) as soon as the first OR is encountered. The possible exception is an OR that proposes a separate and unique condition for evaluation. Example ZTABLE is defined with a secondary index:
Page 48 of 83
IN clauses are often interpreted as OR conditions and may lead to the same problems. Indexes will not be used for IS (NOT) NULL conditions. Most optimizers have problems with OR, NEQ and LIKE conditions. A field in an index is only valid for use if all fields that precede it in the index definition are fully qualified. Example ZTABLE is defined with a secondary index: Field name FIELDA FIELDB FIELDC Type Length CHAR 3 CHAR 3 CHAR 2FIELDD
CHAR
Deleted:
SELECT * FROM ZTABLE WHERE FIELDA = 'ABC' AND FIELDB = 'XYZ' AND FIELDD = 'DEFG'. => Will not use the index as expected and will probably invoke a full table scan based on the primary index.
8.5.3
1. Non-key fields or fields for which index support does not currently exist are repeatedly used to make selections. 2. Only a small part of a large table is selected (<5%). 3. The WHERE-condition of the SELECT is simple.
Page 49 of 83
8.5.4
1. If the data redundancy of storing the index creates problems due to the size of the table / index. 2. If constant updates create excessive overhead / lost performance while updating the index. 3. Maintenance of the index (reorganizing, etc.) outweighs the benefits. 4. Using fields whose value for most records in the table is an initial value or has a value that is identical in most records.
8.6
Development quality assurance activities start with the technical designers review of the functional design and continue throughout the life of the development to its production implementation and hand-over to production support. The full scope of the QA activities is detailed in the Development Quality Assurance document.
8.6.2
CROSS-REFERENCING A PROGRAM
To help you get an outline on extensive programs, the Program Reference List function can create several types of cross references. When you use this function (by selecting Utilities ->Development/test -> Program Ref. List), the reference list screen appears. Here you can select the type of cross reference you want. If you set the Expand INCLUDE lines field, INCLUDE program code is cross-referenced along with the code for the main program. In addition, the display of program code contains the text of INCLUDE programs inline. Most cross references list the places (report name and line number) where a certain statement type or variable reference occurs. A table of contents is also generated for the output as a whole. This lists the cross references created and their page numbers. This table of contents always appears at the very end (last page) of the list. INCLUDE Reference Lists The INCLUDE reference list shows all INCLUDE members copied into your program, and the line where the INCLUDE statement occurs. MODULE Reference Lists The Module reference list shows the program in which a module is coded and the line in which the module starts. FORM/PERFORM Reference Lists
Page 50 of 83
Page 51 of 83
Core Financials ABAP Programming Standards and Gudelines 8.7 Developers Issues for the Transport System
The Transport System should not be used for data transfer except Configuration Tables. Data can be transported but is exempt from overwrite protection in Transport system. The tables must total less than 50,000 entries to guarantee success (depends on main memory). Original objects can disappear or get lost in the transport system if you export an object with control authority and do not successfully import on the target system. You cannot overwrite, add to, or delete the original copy of an object or an object that is system specific or under repair. A Private Object is exempt from the transport system but can be transported. Used for objects that are being developed and possibly unit tested, but dont need to have restricted access or version control. Can be placed under corrections control when development work has stabilized. Can be transported to another development system and placed under control once it is imported on the target system. A Local Private Object is exempt from the transport system and cannot be ransported. Used for objects that will be used once and thrown away. Used for early development work that has not been assigned a name/number/development class. You can Lock objects prior to use via corrections to protect a group of objects you will be working with. If you lock an object that is part of a development object, the system attempts to lock all other related objects. The system will list objects unsuccessfully locked. You can Protect an object so that others may not Link corrections to it. If you Link corrections, you must transport them together. In order to do this all of the corrections must all be released prior to transporting. Development Class is a collection of environment objects that are dependent upon one another (e.g.- SD objects). If you dont require segregation of objects, you may place all CTS objects in one Development Class (e.g.-Z01). The Development Class specifies the consolidation and integration system for that environment. You must match Development Classes in source and target systems, when attempting a transport. The Environment Analyzer can generate the list of objects that belong to a Development Class.
8.8
Page 54 of 83
9.1
Select + Check statement SELECT * FROM VERI_CLNT. CHECK: VERI_CLNT-ARG1 = 7. ENDSELECT. 88,234 microsec
Always specify your conditions in the Where-clause instead of checking them yourself with check-statements The database can then use an index (if possible) and the network load is considerable less
9.1.2
SELECT ENDSELECT SELECT * FROM VERI_CLNT. WHERE ARG1 = 7 AND ARG2 = . ENDSELECT. 4,549 microsec
4,160 microsec
If you are interested in exactly one row of a database table or view, use the SELECT SINGLE statement instead of a SELECT-ENDSELECT loop. SELECT SINGLE requires 1 communication (I/O) with the database system, whereas SELECTENDSELECT needs 2.
Page 55 of 83
9.1.3
Select aggregates
Select using an aggregate function SELECT MAX(MSGNR) FROM T100 INTO C4A WHERE SPRSL = D AND ARBGB = 00.
Select Where + Check C4A = 000. SELECT * FROM T100 WHERE SPRSL = 00. CHECK: T100-MSGNR > C4A. C4A = T100-MSGNR. ENDSELECT. 221,213 microsec
24,470 microsec
If you want to find the maximum, minimum, sum and average value or the count of a database column, use a select list with aggregate functions instead of computing the aggregates yourself. Network load is considerably less.
9.1.4
Nested Select statements SELECT * FROM DD01L WHERE DOMNAME LIKE CHAR% AND AS4LOCAL = A. SELECT SINGLE * FROM DD01T WHERE DOMNAME - DD01LDOMNAME AND AS4LOCAL = A AND AS4VERS = DD01LAS4VERS AND DDLANGUAGE = SYLANGU. ENDSELECT. 1,472,996 microsec
308,670 microsec
9.1.5
Select without buffer support SELECT SINGLE * FROM T100 BYPASSING BUFFER WHERE SPRSL = D AND ARBGB = 00 AND MSGNR = 999. 4,395 microsec
242 microsec
Page 56 of 83
9.1.6
Column Update
Column Update UPDATE VERI_CLNT SET FUNCTINT = FUNCTINT + 1.
Single line update SELECT * FROM VERI_CLNT VERI_CLNT-FUNCTINT = VERI_CLNT-FUNCTINT + 1. UPDATE VERI_CLNT. ENDSELECT. 545,008 microsec
70,487 microsec
Whenever possible, use column updates instead of single-row updates to update your database tables.
9.1.7
Select without index support SELECT * FROM T100 WHERE ARBGB = 00 AND MSGNR = 999. ENDSELECT.
3,749,142 microsec
For all frequently used Select statements, try to use an index. You always use an index if you specify (a generic part of) the index fields concatenated with logical ANDs in the Select statements WHERE clause. Note that complex WHERE clauses are poison for the statement optimizer in any database system.
9.1.8
Select + Append statement REFRESH X006. SELECT * FROM T006 INTO X006. APPEND X006. ENDSELECT. 2,246 microsec
829 microsec
It is always faster to use the INTO TABLE version of a SELECT statement than to use APPEND statements.
Page 57 of 83
Core Financials ABAP Programming Standards and Gudelines 9.1.9 Select-Endselect vs. Array-Select
Select Into Table t Loop at t SELECT * FROM T006 INTO TABLE I_T006. LOOP AT TABLE I_T006. ENDLOOP. ENDSELECT. 1,117 microsec
2,022 microsec
If you process your data only once and memory is more a concern than performance, use a SELECT-ENDSELECT loop instead of collecting data in an internal table with SELECT INTO TABLE and then LOOPing through the internal table.
240,062 microsec
Use a select list or a view instead of a SELECT *, if you are only interested in specific columns of the table.
53,917 microsec
Whenever possible, use array operations instead of single row operations to modify the database tables. Frequent communication between the application program and the database system produces considerable overhead.
9.2
ASSIGN CHA(1) TO <C>. DO 200 TIMES. IF <C> = '(' OR <C> = ')'. "...any actions EXIT. ENDIF. ASSIGN <C>+1 TO <C>. ENDDO. 1,263 microsec
443 microsec
Use special operators CO, CA, CS instead of programming the operations yourself. If ABAPs statements are executed per character on long strings, CPU consumption can rise substantially.
9.2.2
String concatenation II
Use of the CONCATENATE statement " MOVE 'Jane' TO CMA. " MOVE 'Miller' TO CMB. " MOVE 'New York City' TO CMC. CONCATENATE 'Mrs.' CMA CMB 'from' CMC INTO CHA SEPARATED BY SPACE.
Moving with offset " MOVE 'Jane' TO CMA. " MOVE 'Miller' TO CMB. " MOVE 'New York City' TO CMC. I1 = STRLEN( CMA ). I2 = STRLEN( CMB ). MOVE 'Mrs. ' TO CHA. MOVE CMA TO CHA+5. I1 = I1 + 6. MOVE CMB TO CHA+I1. I1 = I1 + I2 + 1. MOVE 'from ' TO CHA+I1. I1 = I1 + 5. MOVE CMC TO CHA+I1. "Mrs. Jane Miller from New York City" is the final value of CHA. 93 microsec
"Mrs. Jane Miller from New York City" is the final value of CHA.
28 microsec
9.2.3
" CLA contains the string "' "Editor line n'. IF CLA CN SPACE. ENDIF. SHIFT CLA BY SY-FDPOS PLACES LEFT. 100 microsec
Page 59 of 83
9.2.4
String concatenation
Use of the CONCATENATE statement CONCATENATE T100-ARBGB T100-MSGNR T100-TEXT INTO CLA.
Use of a CONCATENATE function module CALL FUNCTION 'STRING_CONCATENATE_3' EXPORTING STRING1 = T100-ARBGB STRING2 = T100-MSGNR STRING3 = T100-TEXT IMPORTING STRING = CLA EXCEPTIONS TOO_SMALL = 01. 194 microsec
14 microsec
Some function module for string manipulation have become obsolete and should be replaced by an ABAP statement or functions: STRING_CONCATENATE CONCATENATE STRING_SPLIT SPLIT STRING_LENGTH STRLEN( ) STRING_CENTERED WRITE TO CENTERED STRING_MOVE_RIGHT WRITE TO RIGHT-JUSTIFIED
9.2.5
String split
Use of the SPLIT statement *CMA contains '(410)-45174-66354312' and shall be split into AREA_CODE, TEL_NO1, TEL_NO2 SPLIT CMA AT '-' INTO AREA_CODE TEL_NO1 TEL_NO2.
Use of SEARCH and MOVE with offset *CMA contains '(410)-45174-66354312' and shall be split into AREA_CODE, TEL_NO1, TEL_NO2. SEARCH CMA FOR '-'. MOVE CMA(SY-FDPOS) TO AREA_CODE. I1 = SY-FDPOS + 2. SEARCH CMA FOR '-' STARTING AT I1. I1 = I1 - 1. MOVE CMA+I1(SY-FDPOS) TO TEL_NO1. I1 = I1 + SY-FDPOS + 1. MOVE CMA+I1 TO TEL_NO2. 66 microsec
11 microsec
Page 60 of 83
Core Financials ABAP Programming Standards and Gudelines 9.2.6 String length
Get a CHECK_SUM with strlen( ) *DATA: BEGIN OF STR, LINE TYPE X, END OF STR, CHECK_SUM TYPE I. "MOVE 'KALEBVPQDSCFG' TO CLA. I1 = STRLEN( CLA ). DO I1 TIMES VARYING STR FROM CLA NEXT CLA+1. CHECK STR NE SPACE. ADD STR-LINE TO CHECK_SUM. ENDDO. 171 microsec
Get a CHECK_SUM with field length *DATA: BEGIN OF STR, LINE TYPE X, END OF STR, CHECK_SUM TYPE I. "MOVE 'KALEBVPQDSCFG' TO CLA. DO 64 TIMES VARYING STR FROM CLA NEXT CLA+1. CHECK STR NE SPACE. ADD STR-LINE TO CHECK_SUM. ENDDO.
597 microsec
Use the STRLEN( ) function to restrict the DO loop to the relevant part of the field, e.g. when determining a CHECK_SUM.
9.3
One-step Approach: READ/INSERT * TAB_DEST is filled with 1000 entries REFRESH TAB_DEST. LOOP AT TAB_SRC. READ TABLE TAB_DEST WITH KEY K = TAB_SRC-K BINARY SEARCH. INSERT TAB_SRC INTO TAB_DEST INDEX SY-TABIX. ENDLOOP.
98,545 microsec
20,693 microsec
If the amount of data is small, (< 20 entries),or if you need read access to the internal table while it is being filled, the one-step approach using READ/INSERT is the right choice. If, however, the data amount is larger and you need read-access only to the completely filled table, the two-step process is preferable.
9.3.2
One-step approach * TAB_SRC contains 1000 entries, of which 500 are different
Page 61 of 83
26,259 microsec
If the amount of data is small, (< 20 entries),or if you need read access to the internal table while it is being filled, the one-step approach using READ/INSERT is the right choice. If, however, the data amount is larger and you need read-access only to the completely filled table, the three-step process is preferable.
9.3.3
Access via implicit default keys * Table TAB is filled with 30 entries of 500 bytes each * The READ ends with SY-SUBRC=4 MOVE SPACE TO TAB. TAB-K = 'X'. READ TABLE TAB BINARY SEARCH.
37 microsec
15 microsec
If possible, specify the key fields for read access explicitly. Otherwise, the key fields have to be computed dynamically by the runtime system.
9.3.4
Key access with LOOP/CHECK * Table TAB is filled with 100 entries of 500 bytes each, 5 entries of which match the key condition LOOP AT TAB. CHECK TAB-K = KVAL. " ... ENDLOOP.
1,395 microsec
387 microsec
Page 62 of 83
9.3.5
Pedestrian way to copy internal table * Table TAB_SRC is filled with 100 entries of 100 Bytes each. REFRESH TAB_DEST. LOOP AT TAB_SRC INTO TAB_DEST. APPEND TAB_DEST. ENDLOOP. * Table TAB_SRC is filled with 100 entries of 100 Bytes each. TAB_DEST[] = TAB_SRC[].
949 microsec
314 microsec
Internal table can be copied by move just like any other data object. If the internal table itab has a header line, the table is accessed by itab[ ]
9.3.6
SORT itab with default sort key * Table TAB is filled with 100 entries of 500 bytes each SORT TAB. 2,026 microsec
The more sort key you specify the faster the program will run.
9.3.7
Nested loops
Parallel cursor loop * Table TAB1 is filled with 100 entries of 100 bytes each * Table TAB2 is filled with 10 * 100 = 1000 entries of 100 bytes each I2 = 1. LOOP AT TAB1. LOOP AT TAB2 FROM I2.
Page 63 of 83
Straightforward nested loop * Table TAB1 is filled with 100 entries of 100 bytes each * Table TAB2 is filled with 10 * 100 = 1000 entries of 100 bytes each LOOP AT TAB1. LOOP AT TAB2 WHERE K = TAB1-K. " ...
394,175 microsec
If TAB1 has n1 entries and TAB2 has n2 entries, the time needed for the nested loop with the straight forward algorithm is O(n1 * n2), whereas the parallel cursor approach takes only O(n1 + n2) time. The above parallel cursor algorithm assume that TAB2 contain only entries that are also contained in TAB1. If this assumption is not true, the parallel cursor algorithm gets slightly more complicated, but its performance characteristics remain the same.
9.3.8
Pedestrian way to delete a seq. Of lines * Table TAB_DEST is filled with 1000 entries of 500 bytes each, and lines 450 to 550 are to be deleted DO 101 TIMES. DELETE TAB_DEST INDEX 450. ENDDO. 3,119 microsec
128 microsec
With the new delete variant: DELETE itab FROM TO the task of deleteing a sequence of lines can be transferred to the kernel.
9.3.9
COLLECT semantics using READ BINARY * Table TAB_SRC is filled with 10,000 entries, 5,000 of which have different keys LOOP AT TAB_SRC. READ TABLE TAB_DEST WITH KEY K = TAB_SRC-K BINARY SEARCH. IF SY-SUBRC = 0. ADD: TAB_SRC-VAL1 TO TAB_DEST-VAL1, TAB_SRC-VAL2 TO TAB_DEST-VAL2 MODIFY TAB_DEST INDEX SY-
Page 64 of 83
If you need the COLLECT semantics, DO use COLLECT! READ BINARY runs in O(LOG2(n)) time, and the internal table index must be adjusted with each INSERT. COLLECT, however, uses a hash algorithm and is therefore independent of the number of entries i.e. O(1) and does not need to maintain a table index. If you need the final data sorted, sort it after all data has been collected. If the amount of data is small, the READ/INSERT approach isnt bad, but for large amount of data (>1000), COLLECT is much faster. CAUTION: when you fill an internal table, do not use COLLECT in combination with any other table filling statements e.g. (APPEND, INSERT, and/or MODIFY). If you mix COLLECT with other statements, COLLECT cannot use its hash algorithm. In this case, COLLECTS resorts to a normal linear search, which is dramatically slower: O(n).
1,452 microsec
If internal table is assume to have many (>20) entries, a linear search through all entries is very time consuming. Try to keep the table ordered and use binary search. If TAB has n entries, linear search runs in O(n) time, whereas binary search takes only O(log2(n)) time.
* Table TAB is filled with 1000 entries. The READ locates the 500th entry. READ TABLE TAB WITH KEY DATE = SY-DATUM. IF SY-SUBRC = 0. ...
798 microsec 32 microsec If you need to access a table with diferrent keys repeatedly, keep your own secondary indices. With a secondary index, you can replace a linear search with a binary search plus an index access.
9 microsec
Avoid unnecessary MOVEs by using the explicit workarea operations: APPEND wa TO tab INSERT wa INTO tab COLLECT wa INTO tab MODIFY tab FROM wa READ tab INTO wa LOOP AT tab INTO wa where appropriate.
Page 66 of 83
Internal tables can be compared in logical expressions just like other data objects. 2 internal tables are equal if they have the same number of lines and each pair of corresponding line is equal If an internal table itab has a header line, the table itself is access by itab[].
28,319 microsec
If TAB1 has n1 entries and TAB2 has n2 entries, the time needed to join TAB1 and TAB2 with the straight forward algorithm is O(n1 * log2(n2)), whereas the parallel cursor approach takes only O(n1 + n2) time. The above parallel cursor algorithm assumes that TAB2 is a secondary table containing only entries also contained in primary table TAB1. If this assumption is not true, the parallel cursor algorithm gets slightly more complicated, but its performance characteristics remain the same.
Page 67 of 83
With the new DELETE variant, DELETE ADJACENT DUPLICATES, the task of deleting duplicate entries can be transferred to the kernel.
6,496 microsec
With the new delete variant, DELETE itab [FROM ] [TO ] WHERE , the task of deleting a set of lines can be transferred to the kernel. If possible, WHERE should be used together with FROM and/or TO to enhance performance even more. The performance gained when using DELETE itab FROM, instead of LOOP AT itab WHERE DELETE itab. ENDLOOP.increases with the number of entries the internal table contains and the number of lines to be deleted.
9.4
Untyped parameters PERFORM UP1 USING IX M6-DIMID M6-ZAEHL M6-ISOCODE M6-ANDEC M6-PRIMARY. FORM UP1 USING REPEAT DIMID ZAEHL ISOCODE ANDEC PRIMARY.
Page 68 of 83
If you specify the type for formal parameters in your source code, the ABAP compiler can optimise the code more thoroughly. In addition, the risk of using the wrong sequence of parameters in a PERFORM statement is much less. If you have large untyped programs, use the automatic typing facility of the development workbench.
9.4.2
Field-symbols without type FIELD-SYMBOLS: <F>. ASSIGN I1 TO <F>. I2 = <F>. I3 = <F>. I4 = <F>. 11 microsec
If you specify the type of field-symbols and formal parameters in your source code, the ABAP compiler can better optimise the code.
9.5
If IF C1A = 'A'. WRITE '1'. ELSEIF C1A = 'B'. WRITE '2'. ELSEIF C1A = 'C'. WRITE '3'. ELSEIF C1A = 'D'. WRITE '4'. ELSEIF C1A = 'E'. WRITE '5'. ELSEIF C1A = 'F'. WRITE '6'. ELSEIF C1A = 'G'. WRITE '7'. ELSEIF C1A = 'H'. WRITE '8'. ENDIF.
Page 69 of 83
9.5.2
Case
* (I1 = 5 in this test) CASE I1. WHEN 1. PERFORM PV1. WHEN 2. PERFORM PV2. WHEN 3. PERFORM PV3. WHEN 4. PERFORM PV4. WHEN 5. PERFORM PV5. WHEN 6. PERFORM PV6. WHEN 7. PERFORM PV7. WHEN 8. PERFORM PV8. ENDCASE. 11 microec
6 microsec
A very fast way to call a certain routine using a give index is to PERFORM I OF statement.
9.5.3
Do
While vs. Do
Case I1 = 0. WHILE C1A = SPACE. ADD 1 TO I1. IF I1 GT 10. C1A = 'X'. ENDIF. ENDWHILE.
I1 = 0. DO. IF C1A NE SPACE. EXIT. ENDIF. ADD 1 TO I1. IF I1 GT 10. C1A = 'X'. ENDIF. ENDDO. 8 microsec
6 microsec
If you can use WHILE instead of a DO+EXIT construction, then do so. While is easier to understand and faster to execute.
9.6
Type P DATA: IP TYPE P. DO 5 TIMES. IP = SY-INDEX * 2. READ TABLE X100 INDEX IP. ENDDO.
Page 70 of 83
9.6.2
Literal type C
Constants Type F
Constant type F CONSTANTS: PI TYPE F VALUE '3.1415926535897932'. DATA: FLOAT TYPE F. FLOAT = PI.
9.6.3
Several types
Mixed types
Only 1 type DATA: F1 TYPE F VALUE 2, F2 TYPE F VALUE '3.14', F3 TYPE F. F3 = F1 * F2.
9.6.4
Type C
SY-SUBRC = '0'. CASE SY-SUBRC. WHEN '1'. WHEN '2'. WHEN '3'. WHEN '4'. ENDCASE. 14 microsec
use numeric literals or named constants with a number type instead of character strings if you are dealing with type I or integer type P fields.
Page 71 of 83
Arithmetic
Type P DATA: P1 TYPE P VALUE '123456789012345', P2 TYPE P VALUE '543210987654321', P3 TYPE P. P3 = P1 + P2. 8 microsec
Page 73 of 83
Preliminary Version
11.1 OVERVIEW
The purpose of this document is to provide ABAP programmers with the necessary information to create performance efficient ABAP code.
Page 74 of 83
Core Financials ABAP Programming Standards and Gudelines 11.2 Technical Principle for Program Optimization
Two major areas one needs to address in order to improve an ABAP program performance: 1. Database access 2. ABAP programming analysis The chronological structure of this note reflects the procedure for tuning and increasing performance.
100% buffer Generic buffer Single record buffer Consider creating views in database to join tables vs. join them in ABAP Use ARRAY insert, delete, update whenever possible. See note 3.
11.4.2 Modularization
Dialog modules Function modules Subroutines, e.g. FORM While the above techniques can make your code more readable and modularized, sometimes it will cost more CPU time. See note 3 for more information.
Page 76 of 83
11.7 Note II: Performance & Load Balancing for Batch Input 11.7.1 Background of SAP BDC programs
Usually SAP BDC programs, such as RFBIBL00, are used to load high volume of data into R/3 database. Several major steps are involved: read data from a ASCII file into BDC queue the BDC sessions are processed in either foreground or background 1. the corresponding transaction is invoked 2. each screen field in the transaction is then filled from the BDC queue 3. foreign key checking, data validation ... etc are performed in order to maintain data integrity 4. if input data is valid, the database updates are then perform. otherwise, the entry is marked with error and remain in the BDC queue.
Page 78 of 83
11.8 Note III: ABAP Programming Tips 11.8.1 TIP: When one uses the MOVE statement,
try keep the destination operands as the same data type as the 'from' operands.
REASON: Internally the system will need to covert the 'from' operand to the same data type as the destination operand. This causes additional steps to be executed internally.
11.8.2 TIP:
once the program has completed using the table. If the program ends on completion of the table processing, this is obviously not required.
REASON: Each internal table takes up memory space. This memory is finite and cannot be dynamically extended. By freeing the memory used by an internal table other internal tables within the program can use this space and not abend because of the memory constraints.
Page 79 of 83
Core Financials ABAP Programming Standards and Gudelines 11.8.3 TIP: When defining DATA statements
only define variable required throughout the program as global (i.e. at the top of the program). If variables are only required for processing within a FORM, then define the variable within the FORM itself.
REASON: Here again memory is allocated to each variable defined. If the variable is defined globally, then that memory is retained for the duration of the program run-time. If the variable is only defined within the FORM the memory is allocated and used within the FORM only. Please Note: If a variable is defined within a FORM it is only defined to that FORM and cannot be referenced outside the FORM. Multiple FORMs can use the same variable name without any contention.
11.8.4 TIP:
always specify the sort key. Try keep the key as short as possible.
REASON: When a table is sorted the key is loaded into a separate memory area. If the key is not specified the entire row is used as the key. Here again the memory space is finite and if the number of entries * the key is too large the program will swap to disk memory constraints. If a key is specified, only the fields which form part of this key * the number of entries in the table are loaded into memory. This allows for additional table entries to be sorted and makes the sort quicker as the number of fields forming the key are less than the entire row.
11.8.5 TIP:
instead of an SQL select statement. When using the LOOP statement use the LOOP...AT...WHERE instead of a LOOP...AT...CHECK.
REASON: An SQL select has to first set-up an equivalent to the LOOP statement internally. By using the WHERE clause instead of a CHECK statement within the loop the program does not need to process each table entry, it will just process when the WHERE parameter is met. Always clear the header before looping through an internal table using the WHERE clause.
11.8.6 TIP:
is used ensure the condition variables have been defined with the same data type.
REASON: Each time a row is read, internally the field(s) which form part of the WHERE clause will have to be converted to the same data type as the condition field.
Page 80 of 83
Core Financials ABAP Programming Standards and Gudelines 11.8.7 TIP: Use the BINARY SEARCH,
when performing an direct read on an internal table. This only becomes beneficial for tables with more than 500 rows.
REASON: A BINARY SEARCH will break a table into logical units based in the key defined. This will allow the read to jump through the table to find the required entry instead of reading each table entry until the required entry is found.
11.8.8 TIP:
instead of COLLECT if the internal table is large (more that 1000 entries)
REASON: The COLLECT statement will scan through an entire table looking for a like entry and collate the packed fields values. If there is no match the entry will be added to the end. For large tables adding entries to the end or collating like entries could take a long time. By using BINARY SEARCH read the entry will be found without scanning from the beginning of the table and the entry can be manually updated with the MODIFY command. If the entry is not found (SY-SUBRC NE 0) the APPEND command can be used to add the entry to the table. Remember the COLLECT statement only collates packed fields.
11.8.9 TIP:
on a large internal table, EXPORT the table to memory and IMPORT back from memory before looping through the table.
REASON: When one performs either an INSERT or a DELETE, the physical structure does not change and an index table is created. This table contains the pointer to the address in the internal table created by the ABAP program. If one INSERTs a record, physically the entry is placed at the end of the table, but the pointer to that record is inserted into the index table in the correct position. When a row is DELETED, physically the entry remains in the internal table, but the address is removed from the index table. When one loops through the internal table after DELETEs or INSERTs, ABAP will loop sequentially through the index table and perform direct reads on the internal table. By performing an EXPORT and then an IMPORT the internal table is loaded into memory and reloaded in the correct sequence and the index table is deleted. This way, when one loops through an internal table, there is no intermediary index table and the loop is performed directly on the internal table.
11.8.10TIP:
REASON: It is far quicker to read down through a CASE statement that to check the conditions for each IF statement within a nested IF.
Page 81 of 83
Core Financials ABAP Programming Standards and Gudelines 11.8.11TIP: Always place the mot likely condition first,
when using the IF or CASE statement. When using IF...OR have the most common success condition first. If using IF...AND then specify the most frequent knock-out criterion first.
REASON: If the most likely condition is not placed first then the program always has to test the unlikely condition(s) before reaching the most likely one(s). More complex logical expressions are valuated from left to right. Please note that for tips 11 & 12 one must note the special features of type conversion as mentioned in tip 1. The operands to be compared should always be of the same data type, as it will otherwise be necessary to convert them first.
11.8.12.4 Dynpros
e.g. CALL SCREEN For each CALL SCREEN command the entire dynpro needs to loaded into memory. Cost/Run-time: Factor 148
Page 82 of 83
11.8.12.7 Reports
e.g. SUBMIT <report-name> ... When you start a report with the SUBMIT statement, the system opens a new internal session or replaces the current session with a new session (depends on syntax used). Internal tables can be passed to the submitted program. Cost/Run-time: Factor 10000
Page 83 of 83