以文本方式查看主题

-  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
--  您好!报错了?
出现以下报错,详见附件,谢谢
图片点击可在新窗口打开查看此主题相关图片如下:工龄自动计算代码报错.jpg
图片点击可在新窗口打开查看


--  作者:有点蓝
--  发布时间: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 "入职日期","离职日期"