表达式求值

普通用户请忽略本节内容。
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语法,没有方法和属性的概念,所有的计算都是通过函数完成的。

请参考:

VBScript参考


本页地址:http://www.foxtable.com/webhelp/topics/1277.htm