IF...THEN...ELSE statement

Makes the execution of a statement or block of statements conditional. If the value of the expression following the IF statement is TRUE, the AVM processes the statements following the THEN statement. Otherwise, the AVM processes the statements following the ELSE statement.

Syntax

IF expression THEN { block | statement }
  [ ELSE { block | statement } ]
expression
A constant, field name, variable name, or expression whose value is logical (TRUE or FALSE). The expression can include comparisons, logical operators, and parentheses.
THEN
Describes the block statement to process if the expression is TRUE.
block
The block statement that contains the code you want to process if expression is TRUE. See the DO statement, FOR statement, and REPEAT statement reference entries for more information. If you do not start a block, you can process just one statement after the IF keyword or the ELSE keyword.

Any block or blocks you use in an IF . . . THEN . . . ELSE statement can contain other blocks or other IF . . . THEN . . . ELSE statements.

statement
A single ABL statement. The statement can be another IF . . . THEN . . . ELSE statement. If you want to use more than one statement, enclose those statements in a DO, FOR EACH, or REPEAT block.
ELSE
Describes the block statement to process if the expression is FALSE or the Unknown value (?). The ELSE option is not required.

Example

The r-ifelss.p procedure creates a report in a file that lists Customers whose Orders have been shipped, but who have not paid for those Orders:

r-ifelss.p

DEFINE VARIABLE ans AS LOGICAL NO-UNDO.

DEFINE STREAM due.

OUTPUT STREAM due TO ovrdue.lst.
DISPLAY STREAM due
  "Orders shipped but still unpaid as of" TODAY SKIP(2)
  WITH NO-BOX NO-LABELS CENTERED FRAME hdr PAGE-TOP.

FOR EACH Order WITH FRAME oinfo:
  FIND Customer OF Order NO-LOCK.
  DISPLAY Order.OrderNum Customer.Name Order.OrderDate Order.PromiseDate
    Order.ShipDate.
  IF Order.ShipDate = ? THEN DO:
    IF Order.PromiseDate = ? THEN DO:
      MESSAGE "Please update the promise date.".
      REPEAT WHILE promise-date = ?:
        UPDATE Order.PromiseDate WITH FRAME oinfo.
      END.
    END. 
    ans = FALSE.
    MESSAGE "Has this order been shipped?" UPDATE ans.
    IF ans THEN 
    REPEAT WHILE Order.ShipDate = ?:
      UPDATE Order.ShipDate WITH FRAME oinfo.
    END.
  END.
  ELSE DO:
    ans = TRUE.
    MESSAGE "Has this order been paid?" UPDATE ans.
    IF NOT ans THEN DO:
      DISPLAY STREAM due Order.OrderNum TO 14 Customer.Name AT 18
        Order.OrderDate AT 42 Order.ShipDate AT 54
        WITH NO-BOX DOWN FRAME unpaid.
    END.
  END.
END.
OUTPUT STREAM due CLOSE.

First, the procedure writes report headers to the ovrdue.lst file. Next, the outer FOR EACH block reads each of the Orders using a DISPLAY statement to display information on each Order. If there are no values in the ShipDate and PromiseDate fields, the procedure prompts you to enter a promise date. The procedure then prompts if the order has been shipped. If it has, supply a ship date.

If there is a ship date and a promise date for an order, the procedure prompts if the order has been paid for. If not, the procedure displays the order information to the file.