11.4.9 *ANDIF論理演算子と*ORIF論理演算子

RDMLXでは、*AND論理演算子と*OR論理演算子をサポートしています。以下は、これらの演算子の構文を示したコード・フラグメントです。

ConditionalExpression1 *OR  ConditionalExpression2
ConditionalExpression1 *AND ConditionalExpression2
 

どちらの演算子も、演算子の両側にある2つの条件式を完全に評価してから、それぞれのブール値の結果を1つの論理結果として組み合わせます。したがって、第1の条件式の結果に基づいて、第2の条件式の計算を停止する方法はありません。

ところが、第1の条件式の結果に基づいて、第2の条件式の計算を停止する場合もあります。旧リリースでは、論理演算子を以下のように使用して、いわゆる短絡評価を記述していました。

If_Ref Com(#ReferenceOne) Is_Not(*null)
   If Cond('#ReferenceOne.Left <= 0')
   Set #ReferenceOne Left(100)
   Endif
Endif
 

つまり、2つの条件コマンドを記述する必要がありました。第1の条件コマンドでは、#ReferenceOne変数がNULLでない(したがって、参照可能である)ことを確認します。第2の条件コマンドでは、SETコマンドの実行前にコンポーネントの状態をチェックします。

フルRDMLXでは、*ANDIF演算子と*ORIF演算子を使用した短絡評価をサポートしています。

*ANDIF演算子は、第1の条件式がTrueを返した場合にのみ第2の条件式を実行します。*ORIF演算子は、第1の条件式がFalseを返した場合にのみ第2の条件式を実行します。

したがって、上の例は、以下のように記述できます。

If Cond( (#ReferenceOne *IsNot *Null) *AndIf (#ReferenceOne.Left <= 0))
Set #ReferenceOne Left(100)
Endif
 

以下は、*ORIF演算子と*ANDIF演算子の使用法を示したコード・フラグメントです。

...
DEFINE_COM CLASS(#DEPTMENT) NAME(#DEPARTMENT)
SET COM(#COM_OWNER) PSCENARIO('(#ReferenceOne *isnot *null) *andif (#ReferenceOne.Left <= 0))')
(#ReferenceOne.Left <= 0))
IF COND((#DEPTMENT *IsNot *null) *AndIf (#DEPTMENT.Value = ADM))
SET COM(#pass) VALUE(TRUE)
ENDIF

SET COM(#COM_OWNER) PSCENARIO('if (#DEPTMENT.value = FIN) *orif (#section.value =  ''05'')')
IF ((#DEPTMENT.value = ADM) *OrIf (#section.value = '05'))
SET COM(#pass) VALUE(TRUE)
ENDIF

SET COM(#COM_OWNER) PSCENARIO('if cond( (#COM_OWNER.ComponentPatternName = QAP308) *andif (#com_self.componentpatternname = QAP308))')
IF ((#COM_OWNER.ComponentPatternName = QAP308) *AndIf (#com_self.componentpatternname = QAP308))
SET COM(#pass) VALUE(TRUE)
ENDIF
...

Ý 11.4 式の機能強化