2013-08-30 4 views
0

У меня есть выражение, которое имеет все вызовы ко всем пользовательским функциям.Ошибка вычисления выражения NCalc для пользовательской функции

IIF(FVAL(DES_CODE)=1039 OR FVAL(DES_CODE)=1040 OR FVAL(DES_CODE)=1034,0,TBLEVA(PTAX, FVAL(HOPO_GRS))) 

При попытке оценить это выражение NCalc двигатель производит ошибку. Я не могу понять, почему. Вся функция, объявленная в выражении, обрабатывается в событии EvalFunction выражения. Тогда почему возникает эта ошибка?

mismatched input 'OR' expecting ')' at line 1:24 missing EOF at 'OR' at line 1:47 

КОД -

Это где я инициализация выражения двигателя.

Dim exp As New Expression(vbCode, EvaluateOptions.IgnoreCase) 
AddHandler exp.EvaluateParameter, AddressOf EvalParameters 
AddHandler exp.EvaluateFunction, AddressOf EvalFunction 
xReturn = Convert.ToDecimal(exp.Evaluate()) 

Это события для выражения.

Public Sub EvalFunction(ByVal name As String, ByVal args As FunctionArgs) 
    Select Case name.ToUpper.Trim 
     Case "FVAL" 
      Dim xobj = args.EvaluateParameters() 
      args.Result = fc.Fval(xobj(0)) 
     Case "ORIGINALVAL" 
      Dim xobj = args.EvaluateParameters() 
      args.Result = fc.ORIGINALVAL(xobj(0)) 
     Case "IIF" 
      Dim xobj = args.EvaluateParameters() 
      args.Result = fc.IIF(xobj(0), xobj(1), xobj(2)) 
     Case "LOANDEDUCT" 
      Dim xobj = args.EvaluateParameters() 
      args.Result = fc.LOANDEDUCT(xobj(0)) 
     Case "TBLEVA" 
      Dim xobj = args.EvaluateParameters() 
      args.Result = fc.TBLEVA(xobj(0), xobj(1)) 
     Case "PERIODMONTH" 
      args.Result = fc.PERIODMONTH() 
     Case "PERIODSTART" 
      args.Result = fc.PERIODSTART() 
     Case "AGE" 
      Dim xobj = args.EvaluateParameters() 
      args.Result = fc.Age(xobj(0)) 
     Case "INT" 
      Dim xobj = args.EvaluateParameters() 
      args.Result = fc.Age(xobj(0)) 
    End Select 
End Sub 
Public Sub EvalParameters(ByVal name As String, ByVal args As ParameterArgs) 
    args.Result = name 
End Sub 
+0

Выражение не достаточно. Вы также должны показать свой код. – I4V

+0

Я добавил код. Но это не помогает, потому что выражение вообще не анализируется. –

ответ

2

Просто замените OR с с || или or (строчными буквами)

IIF(FVAL(DES_CODE)=1039 || FVAL(DES_CODE)=1040 || FVAL(DES_CODE)=1034,0,TBLEVA(PTAX, FVAL(HOPO_GRS))) 
+0

Но почему бы не «ИЛИ». Я имею в виду его официальную поддержку. –

+1

@SohamDasgupta '||' или 'или' (в нижнем регистре) разрешено – I4V

+0

Блестящий. Я не знал, что они чувствительны к регистру. Но тогда 'EvaluateOptions.IgnoreCase' не имеет никакого эффекта? –

Смежные вопросы