条件付き処理 - IF ステートメント

IF ステートメントで論理条件を定義します。IF ステートメントに付随するステートメントの実行は、その条件に依存します。

このドキュメントでは、次のトピックについて説明します。


IF ステートメントの構造

IF ステートメントには、以下の 3 つの構成要素があります。

IF IF 節には、満たす必要のある論理条件を指定します。
THEN THEN 節には、この条件を満たしている場合に実行するステートメント(複数可)を指定します。
ELSE (任意の)ELSE 節では、この条件を満たしていない場合に実行するステートメント(複数可)を指定できます。

したがって、IF ステートメントの一般的な形式は以下のようになります。

IF condition  
   THEN execute statement(s)  
   ELSE execute other statement(s)  
END-IF

注意:
IF 条件を満たしていないときにのみ特定の処理を実行する場合、THEN IGNORE 節を指定できます。IGNORE ステートメントにより、条件を満たすと IF 条件は無視されます。

例 1

** Example 'IFX01': IF
************************************************************************
DEFINE DATA LOCAL
1 MYVIEW VIEW OF EMPLOYEES
  2 NAME
  2 BIRTH
  2 CITY
  2 SALARY (1:1)
END-DEFINE
*
LIMIT 7
READ MYVIEW BY CITY STARTING FROM 'C'
 IF SALARY (1) LT 40000 THEN
    WRITE NOTITLE '*****' NAME 30X 'SALARY LT 40000'
  ELSE
    DISPLAY NAME BIRTH (EM=YYYY-MM-DD) SALARY (1)
  END-IF
END-READ
END

上記のプログラムの IF ステートメントブロックでは、以下の条件処理が実行されます。

  • IF )給与が 40000 未満の場合、(THENWRITE ステートメントが実行されます。

  • それ以外の場合(ELSE)、つまり、給与が 40000 以上の場合は DISPLAY ステートメントが実行されます。

プログラム IFX01 の出力:

        NAME            DATE      ANNUAL
                         OF       SALARY
                       BIRTH
-------------------- ---------- ----------
 
***** KEEN                                              SALARY LT 40000
***** FORRESTER                                         SALARY LT 40000
***** JONES                                             SALARY LT 40000
***** MELKANOFF                                         SALARY LT 40000
DAVENPORT            1948-12-25      42000
GEORGES              1949-10-26     182800
***** FULLERTON                                         SALARY LT 40000

例 2:

** Example 'IFX03': IF
************************************************************************
DEFINE DATA LOCAL
1 EMPLOY-VIEW VIEW OF EMPLOYEES
  2 NAME
  2 CITY
  2 BONUS  (1,1)
  2 SALARY (1)
*
1 #INCOME  (N9)
1 #TEXT    (A26)
END-DEFINE
*
WRITE TITLE '-- DISTRIBUTION OF CATALOGS I AND II --' /
*
READ (3) EMPLOY-VIEW BY CITY = 'SAN FRANCISCO'
  COMPUTE #INCOME = BONUS(1,1) + SALARY(1)
  /*
 IF #INCOME > 40000
    MOVE 'CATALOGS I AND II' TO #TEXT
  ELSE
    MOVE 'CATALOG I'         TO #TEXT
  END-IF
  /*
  DISPLAY NAME 5X 'SALARY' SALARY(1) / BONUS(1,1)
  WRITE T*SALARY '-'(10) /
        16X 'INCOME:' T*SALARY #INCOME 3X #TEXT /
        16X '='(19)
  SKIP 1
END-READ
END

プログラム IFX03 の出力:

                    -- DISTRIBUTION OF CATALOGS I AND II --
        NAME               SALARY
                           BONUS
--------------------     ----------
 
COLVILLE JR                   56000
                                  0
                         ----------
                INCOME:       56000   CATALOGS I AND II
                ===================
 
RICHMOND                       9150
                                  0
                         ----------
                INCOME:        9150   CATALOG I
                ===================
 
MONKTON                       13500
                                600
                         ----------
                INCOME:       14100   CATALOG I
                ===================

IF ステートメントのネスト

IF ステートメントは、複数のネスト構造にして使用できます。例えば、THEN 節の実行を、THEN 節に指定した別の IF ステートメントに依存させることができます。

例:

** Example 'IFX02': IF (two IF statements nested)
************************************************************************
DEFINE DATA LOCAL
1 MYVIEW VIEW OF EMPLOYEES
  2 NAME
  2 CITY
  2 SALARY (1:1)
  2 BIRTH
  2 PERSONNEL-ID
1 MYVIEW2 VIEW OF VEHICLES
  2 PERSONNEL-ID
  2 MAKE
*
1 #BIRTH   (D)
END-DEFINE
*
MOVE EDITED '19450101' TO #BIRTH (EM=YYYYMMDD)
*
LIMIT 20
FND1. FIND MYVIEW WITH CITY = 'BOSTON'
                  SORTED BY NAME
 IF SALARY (1) LESS THAN 20000
    WRITE NOTITLE '*****' NAME 30X 'SALARY LT 20000'
  ELSE
    IF BIRTH GT #BIRTH
      FIND MYVIEW2 WITH PERSONNEL-ID = PERSONNEL-ID (FND1.)
        DISPLAY (IS=ON) NAME BIRTH (EM=YYYY-MM-DD)
                        SALARY (1) MAKE (AL=8 IS=OFF)
      END-FIND
    END-IF
  END-IF
  SKIP 1
END-FIND
END

プログラム IFX02 の出力:

        NAME            DATE      ANNUAL     MAKE
                         OF       SALARY
                       BIRTH
-------------------- ---------- ---------- --------
 
***** COHEN                                             SALARY LT 20000
 
CREMER               1972-12-14      20000 FORD
 
***** FLEMING                                           SALARY LT 20000
 
PERREAULT            1950-05-12      30500 CHRYSLER
 
***** SHAW                                              SALARY LT 20000
 
STANWOOD             1946-09-08      31000 CHRYSLER
                                           FORD