以文本方式查看主题 - Foxtable(狐表) (http://foxtable.com/bbs/index.asp) -- 专家坐堂 (http://foxtable.com/bbs/list.asp?boardid=2) ---- 请问如何使用表达式计算工龄? (http://foxtable.com/bbs/dispbbs.asp?boardid=2&id=196175) |
-- 作者:dgcta -- 发布时间:2025/4/5 18:59:00 -- 请问如何使用表达式计算工龄? 您好!请问如何使用表达式计算工龄?我找了帮助,说是要用以下代码,“入职日期”和“工龄”两列都有了,但我不知道放在哪?请问可以告诉我吗?谢谢了! 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 |
-- 作者:有点蓝 -- 发布时间:2025/4/6 19:28:00 -- 表达式无法计算的。把上面代码放到表格的datacolchanged事件:http://www.foxtable.com/webhelp/topics/1445.htm |
-- 作者:dgcta -- 发布时间:2025/4/6 19:57:00 -- 当员工处于“离职”状态,请问如何从“离职日期”的次日起,自动停止计算“工龄”? 好的,谢谢!我找到了另一个贴子,综合了一下,按以下代码,不但可以计算“工龄”,而且可以自动显示“可享年休假”了。可否麻烦帮忙指导指导,以下这里面的代码是不是有一段重复了,可否省略掉?另外我现在又碰到了新的问题,那便是,当员工处于“离职”状态,我希望可以从“离职日期”的次日起,自动停止计算“工龄”,请问可以吗? 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 |
-- 作者:有点蓝 -- 发布时间:2025/4/6 20:44:00 -- 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
|
-- 作者:dgcta -- 发布时间:2025/4/6 22:35:00 -- 您好!报错了? 出现以下报错,详见附件,谢谢 ![]() ![]() ! |
-- 作者:有点蓝 -- 发布时间:2025/4/6 22:41:00 -- Dim endDate = Date.Today 改为 Dim endDate as date = Date.Today
|
-- 作者:dgcta -- 发布时间:2025/4/6 23:25:00 -- 经测试,代码正常,但必须要先录入离职日期,这就不符合常理了。 经测试,以下代码正常,但必须要先录入离职日期,这就不符合常理了。正常情况下,先有的入职日期,已经算好工龄的了,待正式办理离职手续确认没任何问题之后才会填入离职日期,让员工处于离职状态了。这样就又要麻烦您了! 另外,还有一个新的问题点,即:填了入职日期,确实会自动计算出工龄和可享受年休假,但我保存之后再重新进入系统,工龄和可享受年休假都变成空白了。 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 |
-- 作者:dgcta -- 发布时间:2025/4/6 23:29:00 -- “工龄”和“可享年休假”这两列都是表达式列,请问会不会是这个原因导致无法保存? |
-- 作者:dgcta -- 发布时间:2025/4/7 0:27:00 -- 刚才测试了一下: 把“工龄”和“可享年休假”这两列由表达式列转为数据列,可以保存的了。 虽然,表达式列的结果是计算得到的,在没有设置表达式的时候,所录入的内容无法保存。鉴于这个特点,如果有代码作用于表达式列,由此计算得到结果,那是不是相当于代码替代表达式计算得到了相关结果,这个时候,难道还能理解为表达式列没有设置表达式吗? 能否让表达式列既可以通过设置表达式计算得到结果,又可以直接手工录入结果? 不过,这应该建立在一定前提之上,例如:手工录入的结果必须与通过设置表达式计算得到的结果完全一致,才可以成功保存。如果不一致,能否有个提示性质的语句提示用户? 再说说这个案例,这个工龄明明就是通过代码计算得到的结果,那为什么就不能保存呢? 作为初学者,或者仅仅只是foxtable的用户,有这样的疑惑,不知道是否合理?还望大家指正。 |
-- 作者:有点蓝 -- 发布时间:2025/4/7 8:43:00 -- 表达式列就是无法保存的,这是一种固定用法,不要考虑其它的。 如果要离职日期也促发事件 Case "入职日期" 改为 Case "入职日期","离职日期"
|