最近のアクセス:
Expression データタイプ

任意の式を文字列として表現し、即座に評価します。

適用範囲

オブジェクト:  ProcedureTransactionWeb Panel
ジェネレーター: .NETJavaAngular

説明

Expression データタイプは、実行時にエクスプレッションを評価するために使用されます。

将来的に変更する可能性のある既知の定義を持つ式があるとします。標準的なアプローチでは、通常、式はナレッジベース内でグローバル式としてカプセル化され、GeneXus は項目属性が使用される場所で、この定義を拡張します。

定義を変更する必要がある場合を考えてみます。この場合、式の定義を変更し、この式を使用するプログラムすべてを再コンパイルし、新しいバージョンのプログラムを生成する必要があります。たった 1 つの式の変更のためにコードすべてを再コンパイルするのは無駄に思われます。

この場合、いくつかの式が変更されるか、またはインストール時に指定される必要があり、Expression データタイプを使用できます。これによりコードをまったく変更することなく、実行時の式の評価および変更が可能です。

つまり、数学式をプログラムの指示ではなくデータ (プログラムのメタデータ) として扱います。評価では式を文字列として扱い、必要なパラメーター値を割り当て、アプリケーションで使用する式を算出します。

サンプル

次のエンティティーがあるとします: a*b+c"。Expression データタイプを使用してこの式を評価するには、次の手順を実行する必要があります:
  1. オブジェクトで Expression データタイプに基づく変数を定義します。たとえば、&expressionDataTypeVariable のように定義します。
  2. a*b+c」の式を、このデータタイプの [ Expression ] プロパティに割り当てます。
  3. エクスプレッションで使用される各変数に有効な値を設定します。この場合、Set メソッドを使用して ab、および c の値を設定する必要があります。すべてのパラメーターを文字列として設定する必要があります (下記のコードを参照)。
  4. Evaluate メソッドを呼び出して、&Result 変数で返されるエクスプレッションを実行します。
  5. [ 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:" + &errorString.Trim() + ":" + &expressionDataTypeVariable.ErrDescription
msg( &msg ) // エクスプレッション実行のエラーメッセージを送信する
EndIf
一般的な数学関数および定数が多く組み込まれており、すぐ使用できます。また、GeneXus のプロシージャーを使用して独自のユーザー定義関数を記述してこのメカニズムを拡張し、実行時にプロシージャーを実行して数値を返すようすることも可能です。

使用できる演算子および関数

定数

  • pi

算術演算子

  • +、-、*、 /

条件演算子

  • >、<、>=、<=、<>、and、or

標準関数

  • 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

評価に関連付けられたエラーコードの数値を返します。
構文
&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).

ErrDescription

エラーが発生した場合、最近の操作に関連付けられたデスクリプションを返します。エラーのデスクリプションはプラットフォームによって異なります。
評価中にゼロ除算が発生した場合は例外です。この場合、ErrCode「4」、ErrDescription「Division by zero」が返されます。
構文
&ExpressionVariable.ErrDescription
戻されるタイプ:
Character

エクスプレッション

評価対象のエクスプレッションです。エクスプレッションを含む Character または Varcharacter のエクスプレッションです。
構文
&ExpressionVariable.Expression
有効なエクスプレッションは次のとおりです:
&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.Variables
注: すべての変数を文字列に設定する必要があります。文字列の場合は、単一引用符「'」で囲む必要があります。次の例を確認してください:
&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", "'*'" )

メソッド

Evaluate

エクスプレッションを評価して関連する結果を返します。
構文
&ExpressionVariable.Evaluate()
戻されるタイプ:
Numeric(10,2)-

考慮事項

文字列を比較する場合に、値を連結するための次の演算子がサポートされています: 「=」、「!=」、および「+」。次の演算子はサポートされていません: 「<」、「>」、「<=」、および「>=」。
エラーコード 5 -「Execute Method not found」。戻り変数は小数点以下 2 桁を含む 10 桁の数値でなければなりません

.NET 固有

  • 式を評価するための内部的処理はすべて C# の decimal データタイプで行われます。
  • 実行する GeneXus プロシージャーは、呼び出し元のプログラムと同じアセンブリーに存在している必要があります。そのため、Expression データタイプを使用して、プロシージャーがコンパイルされ、アセンブリーに含まれていることを確認する必要があります。明示的にコールツリーに追加する方法は、次のとおりです:
If (1=2) MyProcedure1.call() EndIf

Java 固有

  • 式を評価するための内部的処理はすべて Java の double データタイプで行われます。

サンプル

&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)
//Errors--
&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
サブページ
Created: 14/09/18 03:19 by Admin Last update: 25/05/26 23:47 by Admin
カテゴリ
Powered by GXwiki 3.0