Expression データタイプにより、任意の式を文字列として示し、これを即座に評価することができます。
Expression データタイプは、実行時にエクスプレッションを評価する必要がある場合に使用します。 将来的に変更する可能性のある既知の定義を持つ式があるとします。標準的なアプローチでは、式はナレッジベース内の グローバル式としてカプセル化され、GeneXus はこの定義を項目属性が使用される場所でデプロイします。 定義を変更する必要がある場合を考えてみます。この場合、式の定義を変更し、この式を使用するプログラムすべてを再コンパイルし、新しいバージョンのプログラムを生成する必要があります。たった 1 つの式の変更のためにコードすべてを再コンパイルするのは無駄に思われます。 この場合、いくつかの式が変更されるか、またはインストール時に指定される必要があり、Expression データタイプを使用できます。これによりコードをまったく変更することなく、実行時の式の評価および変更が可能です。 つまり、数学式をプログラムの指示ではなくデータ (プログラムのメタデータ) として扱います。評価では式を文字列として扱い、必要なパラメーター値を割り当て、アプリケーションで使用する式を算出します。
次のエンティティーがあるとします: a*b+c"。Expression データタイプを使用してこの式を評価するには、次の手順を実行する必要があります:
- プログラム内で Expression データタイプ変数を定義します。たとえば、&expressionDataTypeVariable のように定義します。
- 「a*b+c」の式をデータタイプの [ Expression ] プロパティに割り当てます。
- エクスプレッション内で使用する各変数に対して有効な値を設定します。この場合、a、b、および c の値を、 [ Variables ] プロパティの Set メソッドにより設定します。ここですべてのパラメーターを文字列として設定する必要があります (下記のコードを参照)。
- Evaluate メソッドを呼び出して、&Result 変数で返されるエクスプレッションを実行します。
- [ ErrCode ] プロパティを確認します。エラーがない場合は、&Result 変数が関連付けられた式の評価を受け取ります。
次にコードの一部を示します:
// エクスプレッションを定義します。
&expressionString = "a*b+c"
// データタイプにエクスプレッションを割り当てます。
&expressionDataTypeVariable.Expression = &expressionString
// 変数を割り当てますが、この場合は 3 つの変数を割り当てる必要があります。
&expressionDataTypeVariable.Variables.Set( "a", &integer1.ToString() ) // &integer1 値が使用されます。
&expressionDataTypeVariable.Variables.Set( "b", &integer2.ToString() )
&expressionDataTypeVariable.Variables.Set( "c", &integer3.ToString() )
// 設定が完了し、エクスプレッションの評価中です。
&Result = &expressionDataTypeVariable.Evaluate()
If &expressionDataTypeVariable.ErrCode = 0
// エラーが発生せずに評価が実行されました。
// &Result 変数に何らかの処理を行います。
else
&errorString = &expressionDataTypeVariable.ErrCode.ToString()
&msg = "Error:"Error_handler+ &expressionDataTypeVariable.ErrDescription
msg( &msg ) // エクスプレッションを実行するエラーメッセージを送信します。EndIf
一般的な数学関数および定数が多く組み込まれており、すぐ使用できます。また、GeneXus のプロシージャーを使用して独自のユーザー-定義関数を記述してこのメカニズムを拡張し、実行時にプロシージャーを実行して数値を返すようすることも可能です。
計算プログラムの例はこちらからダウンロードできます。
- abs(n)
- int(n)
- frac(n)
- sin(n)
- asin(n)
- cos(n)
- acos(n)
- tan(n)
- atan(n)
- floor(n)
- round(n)
- ln(n) または log(n)
- exp(n)
- sqrt(n)
- pow(m, n)
- max(m,n)
- min(m,n)
- iif( condition, m, n)
論理演算子 (AND、OR) を使用する場合、追加のかっこを必ず使用してください。使用しない場合、誤った結果が評価されます。
例: iif ( ( a >= 0 ) AND ( b > a ), a, b )
- N(10,2) として定義される数値を返す文字および数字のパラメーターを使用するすべての GeneXus プロシージャー
- ErrCode
- ErrDescription
- Expression
- Variables
評価に関連付けられたエラーコードの数値を返します。
&ExpressionVariable.ErrCode
戻されるタイプ
Numeric
次のエラーコードが返される可能性があります:
- 1: Unknown error (UNKNOWN_ERROR).
- 2: There is an error in the evaluate parameters (PARAMETER_ERROR).
- 3: Expression to be evaluated is not well formed (EXPRESSION_ERROR).
- 4: Error occurred during execution (EVALUATION_ERROR).
- 5: Error executing an external function (EXTERNAL_FUNCTION_ERROR).
エラーが発生した場合、最近の操作に関連付けられたデスクリプションを返します。エラーのデスクリプションはプラットフォームによって異なります。 評価中にゼロ除算が発生した場合は例外です。この場合、ErrCode「4」、ErrDescription「Division by zero」が返されます。
構文
&ExpressionVariable.ErrDescription
戻されるタイプ: Character
評価対象のエクスプレッションです。エクスプレッションにおける Character または Varcharacter エクスプレッション。有効なエクスプレッションは次のとおりです:
&expressionDataTypeVariable.Expression = "a*(b+c)/100"
&expressionDataTypeVariable.Expression = "rnd( a + b + c)"
&expressionDataTypeVariable.Expression = "cos(90)"
&expressionDataTypeVariable.Expression = "tan( b + a * b + c)"
&expressionDataTypeVariable.Expression = "floor( a * b + c)"
&expressionDataTypeVariable.Expression = "exp(0)"
&expressionDataTypeVariable.Expression = "abs( a * b + c)"
&expressionDataTypeVariable.Expression = "iif( a < b , a , c)"
&expressionDataTypeVariable.Expression = "myProcedure01( a , b)"
&expressionDataTypeVariable.Expression = "ln(exp(0))"
&expressionDataTypeVariable.Expression = "50*cos(g)*sin(f)"
&expressionDataTypeVariable.Expression = "myProcedure02( "'+'" , b , c)"
&expressionDataTypeVariable.Expression = "sqrt( a * b + c )"
&expressionDataTypeVariable.Expression = "floor( a * b + c)"
&expressionDataTypeVariable.Expression = "10*log( a * b + c)"
&expressionDataTypeVariable.Expression = "abs(-(a * b + c ))"
&expressionDataTypeVariable.Expression = "frac( a * b + c)"
&expressionDataTypeVariable.Expression = "2*pi"
構文
&ExpressionVariable.Expression
割り当てる変数の一覧および関連付けられた値です。
変数はすべて文字列に設定する必要があり、文字列は「'」で囲む必要があります。次の例を確認してください:
&expressionDataTypeVariable.Variables.Set( "a", &int1.ToString() ) // 文字列への数値です。
&expressionDataTypeVariable.Variables.Set( "b", &int2.ToString() )
&expressionDataTypeVariable.Variables.Set( "c", &int3.ToString() )
&expressionDataTypeVariable.Variables.Set( "operator01", "'+'" ) // ' を使用して文字列を囲む必要があることに注意します。
&expressionDataTypeVariable.Variables.Set( "operator02", "'*'" )
構文
&ExpressionVariable.Variables
エクスプレッションを評価して関連する結果を返します。
構文
&ExpressionVariable.Evaluate()
戻されるタイプ:
Numeric(10,2)-
文字列を比較する場合に、値を連結するための次の演算子がサポートされています: 「=」、「!=」、および「+」。次の演算子はサポートされていません: 「<」、「>」、「<=」、および「>=」。
エラーコード 5 -「Execute Method not found」。戻り変数は小数点以下 2 桁を含む 10 桁の数値でなければなりません。
- 式を評価するための内部的処理はすべて C# 10 進データタイプで行います。
- 実行する GeneXus プロシージャーは、呼び出し元のプログラムと同じアセンブリーに存在している必要があります。そのため、Expression データタイプを使用して、プロシージャーがコンパイルされ、アセンブリーに含まれていることを確認する必要があります。明示的にコールツリーに追加する方法は、次のとおりです:
If (1=2)
MyProcedure1.call()
EndIf
- 式を評価するための内部的処理はすべて Java 2 重データタイプで行います。
&int1 = 100 //N(6.0)
&int2 = 200 //N(6.0)
&int3 = 300 //N(6.0)
&operator01 = "'+'" // 文字
&operator02 = "'-'" // 文字
&operand01 = "a1"
&operand02 = "b1"
&operand03 = "c1"
&expressionDataTypeVariable.Variables.Set( "a", &int1.ToString() )
&expressionDataTypeVariable.Variables.Set( "b", &int2.ToString() )
&expressionDataTypeVariable.Variables.Set( "c", &int3.ToString() )
&expressionDataTypeVariable.Variables.Set("var", 'TEST')
&expressionDataTypeVariable.Variables.Set( "operator01", &operator01 ) // 文字列値を持つ変数を使用して &operator0* 変数をチェックします。
&expressionDataTypeVariable.Variables.Set( "operator02", &operator02 )
&expressionDataTypeVariable.Variables.Set( "operator03", "'/'" ) // 文字列を使用します。
&expressionDataTypeVariable.Variables.Set( "operator04", "'*'" )
&expressionDataTypeVariable.Variables.Set( &operand01, &int1.ToString() )
&expressionDataTypeVariable.Variables.Set( &operand02, &int2.ToString() )
&expressionDataTypeVariable.Variables.Set( &operand03, &int3.ToString() )
&expressionDataTypeVariable.Expression = "a*(b+c)/100"
do 'Evaluate'
&expressionDataTypeVariable.Expression = "rnd( a + b + c)"
do 'Evaluate'
&expressionDataTypeVariable.Expression = "cos(a)"
do 'Evaluate'
&expressionDataTypeVariable.Expression = "tan( b + a * b + c)"
do 'Evaluate'
&expressionDataTypeVariable.Expression = "floor( a * b + c)"
do 'Evaluate'
&expressionDataTypeVariable.Expression = "exp(0)"
do 'Evaluate'
&expressionDataTypeVariable.Expression = "abs( a * b + c)"
do 'Evaluate'
&expressionDataTypeVariable.Expression = "iif( a < b , a , c)"
do 'Evaluate'
&expressionDataTypeVariable.Expression = "ln(exp(10))"
do 'Evaluate'
&expressionDataTypeVariable.Expression = "50*cos(a)*sin(b)"
do 'Evaluate'
&expressionDataTypeVariable.Expression = "iif(var='TEST',a+b,a*b)"
do 'Evaluate'
&expressionDataTypeVariable.Expression = "iif(var<>'TEST',a+b,a*b)"
do 'Evaluate'
&expressionDataTypeVariable.Expression = "abs(a) + int(a) + frac(a)"
do 'Evaluate'
&expressionDataTypeVariable.Expression = "sin(1) + asin(1)+cos(1)+acos(1) + tan(1)+atan(1)"
do 'Evaluate'
&expressionDataTypeVariable.Expression = "round(1)+ln(1)+log(1)+exp(1)+sqrt(1)"
do 'Evaluate'
&expressionDataTypeVariable.Expression = "pow(2,3)+max(a,b)+min(a,b)"
do 'Evaluate'
&expressionDataTypeVariable.Expression = "a and b "
do 'Evaluate'
&expressionDataTypeVariable.Expression = "iif(operator01='+',a+b,0)" // 文字列 '+' を使用します。
do 'Evaluate'
&expressionDataTypeVariable.Expression = "iif(operator02='*',a*b,0)"
do 'Evaluate'
&expressionDataTypeVariable.Expression = "myProcedure03( operator02 , b , c)" // 文字列および数値の変数を持つ GeneXus プロシージャーを使用します。
do 'Evaluate'
&expressionDataTypeVariable.Expression = "myProcedure03( '/', b , c)"
do 'Evaluate'
&expressionDataTypeVariable.Expression = "a1+b1+c1"
do 'Evaluate'
Msg('---Errors ---',status)
//エラー--
&expressionDataTypeVariable.Expression = "cos(j)*sin(r)"
do 'Evaluate'
&expressionDataTypeVariable.Expression = "myProcedure01( a , b)"
do 'Evaluate'
&expressionDataTypeVariable.Expression = "a / 0 " // エラーコードのプロパティをチェックします。
do 'Evaluate'
Sub 'Evaluate'
&Result = &expressionDataTypeVariable.Evaluate()
If &expressionDataTypeVariable.ErrCode = 0
// エラーが発生せずに評価が実行されました。
Msg('Result: '+&expressionDataTypeVariable.Expression+ '=' + str(&Result) , status)
else
&errorString = &expressionDataTypeVariable.ErrCode.ToString()
&msg = "Error:"+ &errorString + ":"+ &expressionDataTypeVariable.ErrDescription
msg( &msg,status ) // エクスプレッションを実行するエラーメッセージを送信します。EndIf
endsub
|