7.22.2 DEF_COND の使用例

例1:「AがB×Cの結果より小さい」という条件を定義して、この条件を他のコマンドで繰り返し使用できるようにします。

DEF_COND NAME(*ALTBC) COND('#A *LT (#B * #C)')
 
IF       COND(*ALTBC)
ENDIF
 
DOWHILE  COND(*ALTBC)
ENDWHILE
 
DOUNTIL  COND(*ALTBC)
ENDUNTIL
 
BEGINCHECK
CONDCHECK FIELD(#A) COND(*ALTBC) MSGTXT('A must be not be less than B times C')
ENDCHECK
 

例2:DEF_CONDコマンドを使用して、ユーザー名がFRED、MARY、またはBILLの場合のみDISPLAYコマンドで[変更]および[削除]ファンクション・キーを有効にします。

DEF_COND NAME(*AUTHORISE) COND('(#USER = FRED) *OR (#USER = MARY) *OR (#USER = BILL)')
 
DISPLAY   FIELDS(......)   CHANGE_KEY(*YES *NEXT *AUTHORISE)
                           DELETE_KEY(*YES *NEXT *AUTHORISE)
 

例3:CHECK_AUTHORITY組み込み関数を使用し、PRODMSTという製品マスター・ファイルを使用して、上記の例を照会および保守のプログラムとして汎用化します。

DEF_COND  NAME(*ALLOWCHG) COND('#CHANGE = Y')
DEF_COND  NAME(*ALLOWDLT) COND('#DELETE = Y')
 
USE       BUILTIN(CHECK_AUTHORITY) WITH_ARGS(PRODMST '''*LIBL''' 'FD' 'CH') TO_GET(#CHANGE)
 
USE       BUILTIN(CHECK_AUTHORITY) WITH_ARGS(PRODMST '''*LIBL''' 'FD' 'DL') TO_GET(#DELETE)
 
REQUEST   FIELDS(.....)
 
FETCH     FIELDS(......)   FROM_FILE(PRODMST) WITH_KEY(......)
 
DISPLAY   FIELDS(......)   CHANGE_KEY(*YES *NEXT *ALLOWCHG) DELETE_KEY(*YES *NEXT *ALLOWDLT)
 
IF_MODE   IS(*CHANGE)
UPDATE    FIELDS(........) IN_FILE(PRODMST)
ENDIF
 
IF_MODE   IS(*DELETE)
DELETE    FROM_FILE(PRODMST)
ENDIF
 

この方法により、照会プログラムと保守プログラムを1つのプログラムに安全かつ簡単に統合できます。[変更]および[削除]ファンクション・キーは、ユーザーが情報の変更または削除権限を持っている場合のみ有効になるため、これ以上のプログラム検査は必要ありません。

例4:部門番号が464以外の場合、フィールド#SALARYが画面パネルに表示されないようにします。

DEF_COND  NAME(*HEADOFF) COND('#DEPTMENT = ''464''')
 
DISPLAY   FIELDS(#A #B #C (#SALARY *HEADOFF) #E #F #G)
 

例5:複雑な条件を細分化して単純にします。

DEF_COND   NAME(*SELCUST) COND('((#CUSTTYPE = ''A'') *OR (#CUSTTYPE = ''B'') *OR (#CUSTTYPE = ''C'')) *AND ((#BALANCE *GT 10000) *AND (#BALANCE *LT 100000)) *AND (#LASTSALE > *MONTHSTART)')
 

上記の条件は、以下のようにすることで、保守性と分かりやすさを高めることができます。

DEF_COND   NAME(*SELTYPE) COND('(#CUSTTYPE = ''A'') *OR (#CUSTTYPE = ''B'') *OR (#CUSTTYPE = ''C'')')

DEF_COND   NAME(*SELBAL) COND('(#BALANCE *GT 10000) *AND (#BALANCE *LT 100000)')
DEF_COND   NAME(*SELSALE) COND('#LASTSALE > #MONTHSTRT') 

DEF_COND   NAME(*SELCUST) COND('*SELTYPE *AND *SELBAL *AND *SELSALE')
 

条件は、個別に使用することも、より大きな式に組み込むこともできます。

IF       COND(*SELCUST)                                         
DOWHILE  COND('*SELCUST *OR (#ACTIVE *EQ ''Y'')')