您好!请问如何使用表达式计算工龄?我找了帮助,说是要用以下代码,“入职日期”和“工龄”两列都有了,但我不知道放在哪?请问可以告诉我吗?谢谢了!Select Case e.DataCol.name
Case "入职日期"
If e.DataRow.IsNull("入职日期") Then
e.DataRow("工龄") = Nothing
Else
Dim tp As TimeSpan = Date.today - CDate(e.DataRow("入职日期"))
e.DataRow("工龄") = Math.Round(tp.TotalDays / 365.2422,2)
End If
End Select
好的,谢谢!我找到了另一个贴子,综合了一下,按以下代码,不但可以计算“工龄”,而且可以自动显示“可享年休假”了。可否麻烦帮忙指导指导,以下这里面的代码是不是有一段重复了,可否省略掉?另外我现在又碰到了新的问题,那便是,当员工处于“离职”状态,我希望可以从“离职日期”的次日起,自动停止计算“工龄”,请问可以吗?
elect Case e.DataCol.name
Case "入职日期"
If e.DataRow.IsNull("入职日期") Then
e.DataRow("工龄") = Nothing
Else
Dim tp As TimeSpan = Date.today - CDate(e.DataRow("入职日期"))
e.DataRow("工龄") = Math.Round(tp.TotalDays / 365.2422, 2)
End If
End Select
Select Case e.DataCol.Name
Case "入职日期"
If e.DataRow.IsNull("入职日期") = False Then
Dim rzrq As Date = CDate(e.NewValue)
Dim tp As TimeSpan = Date.Today - CDate(e.NewValue)
e.DataRow("工龄") = Math.Round(tp.TotalDays / 365.2422, 2)
Dim nYear As Integer = Date.Today.Year - rzrq.Year
Select Case nYear
Case 0 To 1
e.DataRow("可享年休假") = 0
Case 2 To 9
e.DataRow("可享年休假") = 5
Case 10 To 19
e.DataRow("可享年休假") = 10
Case Else
e.DataRow("可享年休假") = 20
End Select
End If
End Select
Select Case e.DataCol.Name
Case "入职日期"
If e.DataRow.IsNull("入职日期") Then
e.DataRow("工龄") = Nothing
e.DataRow("可享年休假") = Nothing
Else
Dim rzrq As Date = CDate(e.NewValue)
Dim endDate = Date.Today
If e.DataRow.IsNull("离职日期") = False Then
endDate = e.DataRow("离职日期")
End If
Dim tp As TimeSpan = endDate - CDate(e.NewValue)
e.DataRow("工龄") = Math.Round(tp.TotalDays / 365.2422, 2)
Dim nYear As Integer = endDate.Year - rzrq.Year
Select Case nYear
Case 0 To 1
e.DataRow("可享年休假") = 0
Case 2 To 9
e.DataRow("可享年休假") = 5
Case 10 To 19
e.DataRow("可享年休假") = 10
Case Else
e.DataRow("可享年休假") = 20
End Select
End If
End Select
Dim endDate = Date.Today改为
Dim endDate as date = Date.Today
经测试,以下代码正常,但必须要先录入离职日期,这就不符合常理了。正常情况下,先有的入职日期,已经算好工龄的了,待正式办理离职手续确认没任何问题之后才会填入离职日期,让员工处于离职状态了。这样就又要麻烦您了!另外,还有一个新的问题点,即:填了入职日期,确实会自动计算出工龄和可享受年休假,但我保存之后再重新进入系统,工龄和可享受年休假都变成空白了。
Select Case e.DataCol.Name
Case "入职日期"
If e.DataRow.IsNull("入职日期") Then
e.DataRow("工龄") = Nothing
e.DataRow("可享年休假") = Nothing
Else
Dim rzrq As Date = CDate(e.NewValue)
Dim endDate As Date = Date.Today
If e.DataRow.IsNull("离职日期") = False Then
endDate = e.DataRow("离职日期")
End If
Dim tp As TimeSpan = endDate - CDate(e.NewValue)
e.DataRow("工龄") = Math.Round(tp.TotalDays / 365.2422, 2)
Dim nYear As Integer = endDate.Year - rzrq.Year
Select Case nYear
Case 0 To 1
e.DataRow("可享年休假") = 0
Case 2 To 9
e.DataRow("可享年休假") = 5
Case 10 To 19
e.DataRow("可享年休假") = 10
Case Else
e.DataRow("可享年休假") = 20
End Select
End If
End Select
刚才测试了一下:
把“工龄”和“可享年休假”这两列由表达式列转为数据列,可以保存的了。
虽然,表达式列的结果是计算得到的,在没有设置表达式的时候,所录入的内容无法保存。鉴于这个特点,如果有代码作用于表达式列,由此计算得到结果,那是不是相当于代码替代表达式计算得到了相关结果,这个时候,难道还能理解为表达式列没有设置表达式吗?
能否让表达式列既可以通过设置表达式计算得到结果,又可以直接手工录入结果?
不过,这应该建立在一定前提之上,例如:手工录入的结果必须与通过设置表达式计算得到的结果完全一致,才可以成功保存。如果不一致,能否有个提示性质的语句提示用户?
再说说这个案例,这个工龄明明就是通过代码计算得到的结果,那为什么就不能保存呢?
作为初学者,或者仅仅只是foxtable的用户,有这样的疑惑,不知道是否合理?还望大家指正。