Previous topicNext topic
Help > 使用指南 > 常用表功能 > 表达式 >
表达公式

表达公式是我们平台为了简化简单功能的实现难度,以及增加平台的灵活性而设计的一个非常实用的功能。使用好表达公式可以让我们的很多设计少写很多代码。也可以实现一些动态配置,修改部分功能也不需要频繁地升级、更新客户端软件。

公式的写法

a.首先从语法上讲,条件公式使用的是VB.Net语法。但是为了实现部分特殊需求,我们又稍微作了一点调整。

b.可以用“[列名称]”这样的方式引用当前行指定列的数据。这里“[”与“]”为英文的方括号,“列名称”为列名称。当前行就是指触发执行此表达公式的RowData行。这种表达式

c.表达公式只能写一行代码,并最终返回一个值。这个返回值可以是字符串、逻辑型、数值型、日期型等等。这一句代码无论写多长,但是请保证是一句表达式。

比如:[条件格式]<60

或:[条件格式].ToString().Length>0

或:Proj.CurrentGrid IsNot Nothing AndAlso Proj.CurrentGrid.DataTableHelp IsNot Nothing AndAlso Proj.CurrentGrid.DataTableHelp.DataRows.Count>0

或:[单价]*(1-[折扣])

备注:我们可以合理利用本平台中引用表数据的方式,来实现非常复杂的功能。请合理利用平台集成功能,充分发挥自己的想象,理论上可以实现所有常规需求。引用某表当前行的数据示例:Proj.OpenedForms("窗口名称").Grids("表名称").CurrentRowData("列名称")

d.表达公式可以通过CurrRow变量来访问到公式正在运行的当前行。CurrRow是RowData类型的,可以访问其PreviousRowDataNextRowData属性来访问上一行与下一行,以方便地实现像流水账、累计值这样的功能。

比如:CurrRow.PreviousRowData("列名称")>85

上面的条件公式“[列名称]<60”我们还可以写成“CurrRow("列名称")<60”。

 提问:为什么有了CurrRow可以直接取当前行中的列数据,还需要“[列名称]”这样的引用方式呢?

 答:因为“[列名称]”这样的引用方式一个是相对简单,可以让表达公式看起来相对简洁一点。另外一个非常重要的作用就是,在表属性设置窗口中,我们可以给已经存在于数据库中的基础列设置表达公式,这个带方括号(“[列名称]”)的引用方式是触发表达公式的条件,即表达公式中包含多少个这种列,这些列的数据有变动了(触发ColDataChanged事件)就会触发此表达公式的执行。

例如表达公式为:[单价]*(1-[折扣])

这时候,无论“单价列”还是“折扣”列有数据变动都会触发表达公式的执行,执行的结果将会返回设置了此表达公式的列中。

e.CurrGrid变量。表达公式还可以使用CurrGrid这个变量来访问到当前表。CurrGrid是IDataRuleGrid接口类型的。我们可以很方便地通过此变量获得当前表(CurrGrid.BaseBaseGrid)、当前表的父表(CurrGrid.Relation.ParentGrid)、当前表的子表(CurrGrid.Relation.ChildrenGrids)、当前表的拷贝表(CurrGrid.BaseBaseGrid.CopyGrids)、当前表的窗体(CurrGrid.Form)

f.系统静态变量。我们还可以直接通过类似Proj.CurrentGrid的方法直接访问Proj空间下的所有静态属性、对象。理论上在表达公式里面我们是自由的,想做任何事情都可以。只要你足够有想象力,把代码控制在一行以内。

g.执行SQL语句。我们可以在表达公式里面做任何事情,当然包含执行SQL语句。

例:CurrGrid.DataTableHelp.Database.ExecuteScalar("select Name from tabelName where ID='" & [ID] & "'")

这里的“[ID]”用这种方式来组合连接字符串,主要是让平台检测出,我们希望CurrGrid表中的ID列有变动了,就执行此表达公式,并到当前表中的数据库中执行一段SQL返回一个值。如果我们希望执行其他数据库中的SQL怎么办?可以通过下面的方式执行。

Proj.SysDataFactory("UserDB").ExecuteScalar("select Name from tabelName where ID='" & [ID] & "'")

h.返回常量。如果我们希望返回一个固定的值时要注意一下。返回字符串请使用英文双引号:"男"

使用场景

1、列属性的表达式、默认值。

2、条件格式。

3、通用Excel导入的默认值。

4、高级筛选参数中的最大值、最小值、默认值。

5、用户自定义表达式。

6、自动编码。

触发条件

1、表在加载时,会检查所有设置了表达公式并且还为空值的,就会逐条按照表达公式计算填充数据。

2、当表达公式中包含“[列名称]”这样的引用方式时,就会为这些列添加一个触发点,这些列有数据变动就会触发执行相应的表达公式。

3、如果表达公式里面包含PreviousRowData这种引用上下行的方法的话,有一行数据改动,会触发此行及下面所有行的重新计算。

注意点:

1、用“[列名称]”这样的方式引用返回的值有一个特点,就是针对空值,它是有默认返回值的。逻辑列返回False,字符串列返回空字符串“”,数值列返回0,日期列返回DateTime.MinValue,显示结果是(0001-01-01 0:00:00)。所以在常规计算时我们是需要考虑判断空值的情况的。主要就是考虑数值型字段作为被除数的场景,以及日期计算的场景。如果单单是字符串拼接的话,我们可以忽略空值的影响,这就大大地简化了我们表达公式的复杂度。

2、判断空值可以通过CurrRow.IsNull("列名称")来判断。

3、通过IIF函数来实现三元判断。