Foxtable(狐表)用户栏目专家坐堂 → 请问如何使用表达式计算工龄?


  共有142人关注过本帖树形打印复制链接

主题:请问如何使用表达式计算工龄?

帅哥哟,离线,有人找我吗?
dgcta
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:婴狐 帖子:15 积分:259 威望:0 精华:0 注册:2019/4/28 8:00:00
请问如何使用表达式计算工龄?  发帖心情 Post By: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


 回到顶部
帅哥哟,离线,有人找我吗?
dgcta
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:婴狐 帖子:15 积分:259 威望:0 精华:0 注册:2019/4/28 8:00:00
当员工处于“离职”状态,请问如何从“离职日期”的次日起,自动停止计算“工龄”?  发帖心情 Post By: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


 回到顶部
帅哥哟,离线,有人找我吗?
dgcta
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:婴狐 帖子:15 积分:259 威望:0 精华:0 注册:2019/4/28 8:00:00
您好!报错了?  发帖心情 Post By:2025/4/6 22:35:00 [显示全部帖子]

出现以下报错,详见附件,谢谢
图片点击可在新窗口打开查看此主题相关图片如下:工龄自动计算代码报错.jpg
图片点击可在新窗口打开查看


 回到顶部
帅哥哟,离线,有人找我吗?
dgcta
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:婴狐 帖子:15 积分:259 威望:0 精华:0 注册:2019/4/28 8:00:00
经测试,代码正常,但必须要先录入离职日期,这就不符合常理了。  发帖心情 Post By: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
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:婴狐 帖子:15 积分:259 威望:0 精华:0 注册:2019/4/28 8:00:00
  发帖心情 Post By:2025/4/6 23:29:00 [显示全部帖子]

“工龄”和“可享年休假”这两列都是表达式列,请问会不会是这个原因导致无法保存?

 回到顶部
帅哥哟,离线,有人找我吗?
dgcta
  6楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:婴狐 帖子:15 积分:259 威望:0 精华:0 注册:2019/4/28 8:00:00
  发帖心情 Post By:2025/4/7 0:27:00 [显示全部帖子]

刚才测试了一下:
把“工龄”和“可享年休假”这两列由表达式列转为数据列,可以保存的了。

虽然,表达式列的结果是计算得到的,在没有设置表达式的时候,所录入的内容无法保存。鉴于这个特点,如果有代码作用于表达式列,由此计算得到结果,那是不是相当于代码替代表达式计算得到了相关结果,这个时候,难道还能理解为表达式列没有设置表达式吗?

能否让表达式列既可以通过设置表达式计算得到结果,又可以直接手工录入结果?

不过,这应该建立在一定前提之上,例如:手工录入的结果必须与通过设置表达式计算得到的结果完全一致,才可以成功保存。如果不一致,能否有个提示性质的语句提示用户?

再说说这个案例,这个工龄明明就是通过代码计算得到的结果,那为什么就不能保存呢?

作为初学者,或者仅仅只是foxtable的用户,有这样的疑惑,不知道是否合理?还望大家指正。




 回到顶部