表达式和代码的混合使用

下图是一个工资表:

在上表中,应付工资、应税收入、实发工资三列是通过其它列计算得出的,在设计表的时候,这三列请用表达式列,而所得税列虽然也是由其它列计算得出,但是所得税的计算较为复杂,无法通过表达式计算得出,所以所得税列不能是表达式列,必须是数据列,所得税列将通过代码来计算得出。
 
首先将应付工资列的表达式设为:
 
IsNull([基本工资],0) + IsNull([绩效工资],0) + IsNull([加班费],0) + IsNull([其他],0)
 
还记得IsNull吗? 用这个函数判断表达式的内容是否为空,如果不为空,则返回表达式的值,否则返回0。
 
应税收入列的表达式为:

IsNull([应付工资],0) - IsNull([扣养老],0) - IsNull([扣医疗],0) - IsNull([扣其它],0)

实发工资列的表达式为:

[应税收入] - IsNull([所得税],0)

假定起征点为3500元,为了计算个人所得税,在DataColChanged事件中设置如下代码:

'如果发生变化的是所得税列之外的数值型列,才重新计算所得税。
If
e.DataCol.Name <> "所得税" AndAlso e.DataCol.IsNumeric Then
    e.
DataRow("所得税") = InTax(e.Datarow("应税收入") - 3500)
End
If

既然所得税列的内容是根据应税收入列的内容计算得出的,为什么代码第一行的判断条件不是:

If e.DataCol.Name"应税收入" Then 

而是:

If e.DataCol.Name <> "所得税" AndAlso e.DataCol.IsNumeric Then   

这是因为应税收入列是一个表达式列,而表达式列的内容是通过其他列计算得出的,并不会触发DataColChanged事件。


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