Preface
Purpose
Audience
Organization
Using ABL documentation
References to ABL compiler and run-time features
References to ABL data types
Typographical conventions
Examples of syntax descriptions
Long syntax descriptions split across lines
Complex syntax descriptions with both required and optional elements
Example procedures
OpenEdge messages
Obtaining more information about 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
Self-contained references to a buffer
Generating a procedure listing file
Nested, weak-scoped references to the same buffer
Weak-scoped blocks and free references
Scoping buffers
Strong-scoped references and containing blocks
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
Preface
QUIT condition