7.19.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'')')