Preface
Purpose
Audience
Organization
Using this manual
Typographical conventions
Examples of syntax descriptions
Example procedures
OpenEdge messages
Introducing ABL
About the sample database
In the beginning . . . FOR EACH CUSTOMER
Starting your OpenEdge session
Writing your first procedure
Basic characteristics of ABL
ABL is procedural
ABL is block-structured
An ABL procedure consists of statements
ABL combines procedural, database, and user interface statements
Saving your test procedure
Using Basic ABL Constructs
Refining the data selection with a WHERE clause
Comparison operators
Using quotation marks
Creating nested blocks to display related data
Changing labels and formats
Using program variables and data types
Defining formats
Other variable qualifiers
Variable naming conventions
Placement of variable definitions
Defining an IF-THEN-ELSE decision point
Using the ABL Unknown value
Using built-In ABL functions
ABL Functions
Date functions
List functions
ABL string manipulation functions
Putting a calculation into your procedure
Arithmetic expressions and operands
Arithmetic built-in functions
Getting to online help
Saving and compiling your test procedure
Running ABL Procedures
Running a subprocedure
Using the Propath
Using external and internal procedures
Writing internal procedures
Assigning a value to a variable
When to use internal and external procedures
RETURN statement and RETURN-VALUE
Adding comments to your procedure
Procedure Blocks and Data Access
Blocks and block properties
Procedure block scoping
Language statements that define blocks
DO blocks
Looping with a DO block
Using a DO block to scope records and frames
FOR blocks
Sorting records by using the BY phrase
Joining tables using multiple FOR phrases
Alternatives to the EACH keyword
Using indexes to relate and sort data
Using the USE-INDEX phrase to force a retrieval order
Using the LEAVE statement to leave a block
Using block headers to identify blocks
Using NEXT, STOP, and QUIT to change block behavior
Qualifying a FOR statement with a frame reference
REPEAT blocks
Using the PRESELECT keyword to get data in advance
Data access without looping—the FIND statement
Index cursors
Using the FIND statement in a REPEAT block
Switching indexes between FIND statements
Using a USE-INDEX phrase to force index selection
Doing a unique FIND to retrieve a single record
Using the CAN-FIND function
Record Buffers and Record Scope
Record buffers
Record scope
Record Buffer Rule 1: Each strong-scoped or weak-scoped reference to a buffer is self-contained.
Record Buffer Rule 1: Each strong-scoped or weak-scoped reference to a buffer is self-contained.
Generating a procedure listing file
Record Buffer Rule 2: You cannot nest two weak-scoped references to the same buffer.
Record Buffer Rule 3: A weak-scope block cannot contain any free references to the same buffer.
Record Buffer Rule 4: If you have a free reference to a buffer, The AVM tries to scope that buffer to the nearest enclosing block with record scoping properties (that is, a FOR EACH block, a DO FOR block, or a REPEAT block). If no block within the procedure has record scoping properties, then the AVM scopes the record to the entire procedure.
Record Buffer Rule 5: If you have a strong-scoped reference to a buffer, you cannot have a free reference that raises the scope to any containing block.
Using Queries
Why you use queries in your application
Queries versus block-oriented data access
Using queries to share data between procedures
Using queries to populate a browse
Defining and using queries
OPEN and CLOSE QUERY statements
Using an outer join in a query
Sorting the query results
GET statements
Using the QUERY-OFF-END function
Closing a query
Determining the current number of rows in a query
Using a DOWN frame and the DOWN WITH statement
Retrieving query results in advance
Identifying the current row in the query
Using INDEXED-REPOSITION to improve query performance
INDEXED-REPOSITION and field lists
Factors that invalidate CURRENT-RESULT-ROW and NUM-RESULTS
Repositioning a query
Using a RowID to identify a record
Positioning details with the REPOSITION statement
Summary
Defining and Using Temp-tables
Using temp-tables in your application
ABL ProDataSets
ABL work-tables
The temporary database for temp-tables
Defining a temp-table
Defining fields for the temp-table
Defining indexes for the temp-table
Temp-table scope
Temp-table buffers
Using a temp-table to summarize data
Using a temp-table as a parameter
Temp-table parameter syntax
Passing a temp-table by value
Passing a temp-table by reference
Passing a temp-table parameter by binding
Defining a procedure to return Order Lines
Using BUFFER-COPY to assign multiple fields
Using include files to duplicate code
Adding an Order Line browse to the Customer window
Summary
Defining Functions
User-defined functions
Defining a function
Making a forward declaration for a function
Making a local forward declaration
Making a declaration of a function in another procedure
Making a declaration of a function IN SUPER
Making run-time references with DYNAMIC-FUNCTION
Handling Data and Locking Records
Overview of data handling statements
Record locking in ABL
Record locking examples
Using EXCLUSIVE-LOCKs
Using and upgrading SHARE-LOCKS
Using the NO-WAIT Option with the AVAILABLE and LOCKED functions
Reading records with NO-LOCK
Making sure you release record locks
Lock table resources
Optimistic and pessimistic locking strategies
Using FIND CURRENT and CURRENT-CHANGED
Managing Transactions
Controlling the size of a transaction
Making a transaction larger
Making a transaction smaller
Transactions and trigger and procedure blocks
Checking whether a transaction is active
The NO-UNDO keyword on temp-tables and variables
Using the UNDO statement
Using the UNDO statement in the sample procedure
Using UNDO, LEAVE on a block
Subtransactions
Transaction mechanics
Using the ON phrase on a block header
Handling the ERROR condition
ERROR-STATUS system handle
Error handling
RETURN statement and ON . . . RETURN phrase
ENDKEY condition
STOP condition
System and software failures
QUIT condition
OpenEdge® Getting Started:ABL Essentials
Using the UNDO statement