Как оценить логическое выражение, представленное в виде строки в X++ [AX 2012]

У меня есть сценарий, в котором я хочу оценить логическое выражение, заданное в виде строки.

Например, "1==4" при передаче какой-либо функции будет оцениваться/возвращаться FALSE.

Точно так же «1 == 1» при передаче той же функции будет оцениваться как TRUE.

Если это можно сделать, то мне определенно нужен способ, которым я могу оценить динамическое логическое выражение. Например, «workHours==4» — это строковое выражение, а workHours — это переменная.

Дайте мне знать о любом решении, если вы знаете. Спасибо.


person SHAKIR SHABBIR    schedule 22.04.2014    source источник


Ответы (4)


Существуют способы вычисления выражений X++ из текста через .NET (например, с помощью XLNT Framework) и с помощью некоторых встроенных функций X++. Но я почти уверен, что вы можете найти то же решение с более чистым подходом. Например, вы можете передать контейнер функции, а затем сравнить их значения или что-то в этом роде.

Если вы все еще хотите пойти по этому пути, взгляните на функцию runbuf в X++.

http://msdn.microsoft.com/en-us/library/aa656300.aspx

person j.a.estevan    schedule 22.04.2014

Сам узнал ответ:

Вот пример кода, как вы можете это сделать.

static void Job22(Args _args)
{

 str expr = 'ab==2';
 str method = @'boolean eval(int ab){return ' + expr + ';}';
 boolean result;
 ;
 result = runBuf(method, 5);
 info (strfmt("Calculation result is %1", result));

}
person SHAKIR SHABBIR    schedule 23.04.2014

Это может быть лучшим примером для вашего использования, где вы можете легко просто изменить expression.

static void RunBufExample()
{
    str                 expression = '2==1';
    str                 func = 'boolean myFunc() {return ' + expression + ';}';
    boolean             retVal;       
    new ExecutePermission().assert();
    retVal = runBuf(func);
    CodeAccessPermission::revertAssert();
    info(strFmt("%1", retVal));
}
person Alex Kwitny    schedule 23.04.2014
comment
@jan - Что касается редактирования, я просто вслепую изменил пример MSDN. Вот почему вторая пара взглядов на код всегда помогает! - person Alex Kwitny; 24.04.2014

Вместо этого используйте функцию evalBuf().

http://dynamicsaxinsight.wordpress.com/2014/08/15/ax-2012-evalbuf-evaluate-string-expression-in-xpp/

person Muhammad Anas Khan    schedule 19.08.2014