Find は Aggregate 式の 1 つです。
Find ( <aggregateExpression>, <aggregateCondition>, <defaultValue>) [ if <triggeringCondition> ] ;
入力値の説明:
<aggregateExpression>:
<aggregateCondition> に一致する最初のレコードに基づいて結果の値を返すエクスプレッションです。項目属性 (計算式の項目属性でもかまいません)、定数、変数を含めることができます (ユーザー変数はインライン式だけで使用できます)。
<aggregateCondition>:
検索条件と Data Selector の呼び出しを組み合わせたものです。検索条件および Data Selector はオプションです:
[ <SearchCondition> ] [ USING <DataSelector> '(' <パラメーター>1, <パラメーター>2, <パラメーター>n ')' ]
<SearchCondition>
レコードを総計に含める場合、このレコードが満たす必要のある条件です。項目属性、定数、変数を含めることができます (ユーザー変数はインライン式のみ、GeneXus の標準変数はグローバル式とインライン式のみで使用できます)。
<defaultValue>
<aggregateCondition> に一致するレコードがない場合に返される値です。これはオプションであり、定数値のみが許容されます (式が日付の項目属性とともに使用されている場合は、 この記事も参照)。
<triggeringCondition>
式をトリガーする必要があるかどうかを判別する条件です。これはオプションです。使用できるのは、コンテキストテーブルに属する項目属性 (格納された場合に式項目属性が属するもの) とその拡張項目属性だけです。
Flight
{
FlightId*
FlightDescription
Price
{
FlightDate*
FlightPrice
}
}
FlightInstance
{
FlightInstanceNumber*
FlightId
FlightDescription
FlightInstanceDate
FlightInstancePrice
FlightInstanceCurrencyValue = Find(CurrencyValue, CurrencyId = "Dollar" and CurrencyDate = FlightInstanceDate, 0) if FlightId=1;
}
Currency
{
CurrencyId*
Value
{
CurrencyDate*
CurrencyValue
}
}
上の例では、グローバル式である Find を定義しています。
次の画像は編集中の FlightInstance トランザクション (GeneXus トランザクションエディター使用) および FlightInstanceCurrencyValue グローバル式項目属性 (GeneXus 式エディター使用) を示しています:
FLIGHTINSTANCE は、グローバル式の FlightInstanceCurrencyValue 項目属性のコンテキストテーブルです。
CURRENCYVALUE は、この計算を行うために Find 式がナビゲートするテーブルです。
Find 計算は、FlightId = 1 の場合にのみトリガーされます。
式の定義にあるテーブルには共通の項目属性が格納されないので、別のフィルタが自動的に適用されることはありません (定義済みの <aggregateCondition> だけに基づいてレコードが検索されます)。このように、<aggregateCondition> を満たす CURRENCYVALUE テーブルで見つけられた最初のレコードを選択し、対応する定義済みエクスプレッションを返します (この例では、式は CurrencyValue を返します)。
この例では、定義済みの <aggregateCondition> はナビゲートされたテーブルの主キーによるフィルタを含んでおり、このため、ナビゲートされたテーブルは <aggregateCondition> を満たす一意のレコードを含みます。これは、Find 式の最も一般的な使い方です。つまり、通常は Find 式を定義して、(一意のレコードが <aggregateCondition> を満たすように) ナビゲートするテーブルの主キーでフィルタリングして、特定の値を検索します。従属項目属性 (外部キーの項目属性) でフィルタリングする場合は、多数のレコードが <aggregateCondition> を満たす可能性があるので、<aggregateCondition> を満たす最初のレコードが選択されます。
|