表达式求值
普通用户请忽略本节内容。
Foxtable提供了一个Eval函数,用于自定义表达式求值。
需要注意的是,这个表达式是一个独立的系统,和我们之前用于列计算和筛选的表达式完全不同,这里的表达式采用VBScript语法。
语法
Eval(Expr)
Eval(Expr,Row)
Eval(Expr,DataRow)
Expr: 要求值的表达式
Row: 用于取值的Row
DataRow: 用于取值的DataRow
注意表达式中的列名称必须用方括号括起来,例如:[单价]
表达式中可以引用Var变量,除了变量名称需要用方括号括起来外,还需要在前面加上符号“!”,例如:[!起始日期]
除Eval函数外,Foxtable还提供了两个和表达式求值相关的函数:
Eval2
Eval2同样用于对表达式求值,语法和Eval完全一样,差别在计算表达式的时候遇到错误,Eval弹出一个窗口报错,而Eval2则不会。
TryEval
TryEval的语法和Eval完全一样,但此函数不是对表达式求值,而是用于检测表达式,如果此表达式正确则返回True,否则返回False。
下面的例子,都没有实际的意义,是为了说明Eval的用法。
示例一
Dim
s
As
String =
"1 + 2
+ 3"
Output.Show(Eval(s))
输出结果为:6
示例二
基于订单表的第二行,计算表达式“[数量] * [单价]”:
Dim
s
As
String =
"[数量] *
[单价]"
Dim r
As
Row =
Tables("订单").Rows(1)
Output.Show(Eval(s,r))
示例三
从订单表中选出数量超过500的行,将金额设为“[数量] * [单价] * 0.8”。
注意运行下面的代码之前,必须保证金额列是一个数据列,而不是一个表达式列。
Dim
exp
As
String =
"[数量] *
[单价] * 0.8"
Dim drs
As List(of
DataRow)
= DataTables("订单").Select("数量
> 500")
For Each
dr
As
DataRow
In drs
dr("金额")
= Eval(exp,dr)
Next
示例四
假定希望根据第一列输入的计算公式,在第二列得出计算结果,可以将DataColChanged事件代码设为:
If
e.DataCol.Name
= "第一列" Then
If e.DataRow.IsNull("第一列")
Then
e.DataRow("第二列")
= Nothing
Else
e.DataRow("第二列")
= Eval(e.DataRow("第一列"),e.DataRow)
End
If
End
If
Eval采用VBScript语法,没有方法和属性的概念,所有的计算都是通过函数完成的。
请参考: