表达式和代码的混合使用
下图是一个工资表:
在上表中,应付工资、应税收入、实发工资三列是通过其它列计算得出的,在设计表的时候,这三列请用表达式列,而所得税列虽然也是由其它列计算得出,但是所得税的计算较为复杂,无法通过表达式计算得出,所以所得税列不能是表达式列,必须是数据列,所得税列将通过代码来计算得出。
首先将应付工资列的表达式设为:
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 = "应税收入" Then
而是:
If e.DataCol.Name <> "所得税" AndAlso e.DataCol.IsNumeric Then
这是因为应税收入列是一个表达式列,而表达式列的内容是通过其他列计算得出的,并不会触发DataColChanged事件。