You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

VB.NET中基于类模型对象的考勤时间计算与格式处理问题

VB.NET 考勤属性计算解决方案(适配Report Viewer)

考勤模型类定义

先定义包含原始数据和处理后展示属性的模型类,方便后续数据绑定:

Public Class AttendanceModel
    ' 原始数据源字段
    Public Property RawIN As String
    Public Property RawOUT As String
    Public Property RawDUROFWORK As String
    Public Property RawLATEIN As String
    Public Property STATUS As String
    Public Property DEFREST As String ' 休息时长,格式示例:"00:30:00"

    ' 处理后用于Report Viewer展示的属性
    Public Property [IN] As String
    Public Property [OUT] As String
    Public Property DUROFWORK As String
    Public Property LATEIN As String
End Class

核心处理逻辑方法

实现所有需求的计算逻辑,直接处理模型对象:

Public Function ProcessAttendance(rawAttendance As AttendanceModel) As AttendanceModel
    Dim processed = New AttendanceModel() With {
        .STATUS = rawAttendance.STATUS,
        .DEFREST = rawAttendance.DEFREST
    }

    ' 需求3:STATUS为"Not Present"时,指定字段直接设为空
    If rawAttendance.STATUS.Equals("Not Present", StringComparison.OrdinalIgnoreCase) Then
        processed.[IN] = String.Empty
        processed.[OUT] = String.Empty
        processed.DUROFWORK = String.Empty
        processed.LATEIN = String.Empty
        Return processed
    End If

    ' 需求1:将值为"0"的字符串转为空
    processed.[IN] = If(rawAttendance.RawIN = "0", String.Empty, rawAttendance.RawIN)
    processed.[OUT] = If(rawAttendance.RawOUT = "0", String.Empty, rawAttendance.RawOUT)

    ' 需求2:DUROFWORK减去DEFREST时长;兼顾需求1的"0"转空
    Dim workSpan, restSpan As TimeSpan
    If TimeSpan.TryParse(rawAttendance.RawDUROFWORK, workSpan) AndAlso TimeSpan.TryParse(rawAttendance.DEFREST, restSpan) Then
        Dim actualWork = workSpan.Subtract(restSpan)
        processed.DUROFWORK = If(actualWork >= TimeSpan.Zero, actualWork.ToString("hh\:mm\:ss"), String.Empty)
    Else
        processed.DUROFWORK = If(rawAttendance.RawDUROFWORK = "0", String.Empty, rawAttendance.RawDUROFWORK)
    End If
    ' 额外处理计算后为0时长的情况(可选,根据实际需求调整)
    processed.DUROFWORK = If(processed.DUROFWORK = "00:00:00", String.Empty, processed.DUROFWORK)

    ' 需求4:LATEIN为"00:00:00"时转空;兼顾需求1的"0"转空
    processed.LATEIN = If(rawAttendance.RawLATEIN = "0" OrElse rawAttendance.RawLATEIN = "00:00:00", String.Empty, rawAttendance.RawLATEIN)

    Return processed
End Function

绑定到Report Viewer

处理完数据后直接绑定到报表控件:

' 从数据源获取原始考勤数据列表
Dim rawAttendanceList As List(Of AttendanceModel) = GetRawAttendanceData()

' 批量处理所有考勤记录
Dim processedList = rawAttendanceList.Select(Function(item) ProcessAttendance(item)).ToList()

' 绑定到Report Viewer
ReportViewer1.LocalReport.DataSources.Clear()
ReportViewer1.LocalReport.DataSources.Add(New ReportDataSource("AttendanceDataSet", processedList))
ReportViewer1.RefreshReport()

需求对应说明

  • 需求1:所有字段处理时加入If(值 = "0", String.Empty, 值)判断,将指定字符串转为空
  • 需求2:通过TimeSpan解析时长,用Subtract方法减去休息时长,确保计算结果合法
  • 需求3:优先判断状态,符合条件时直接跳过后续计算,设置指定字段为空
  • 需求4:处理LATEIN时同时判断"0"和"00:00:00"两种情况,满足任一则转为空
  • 适配Report Viewer:使用处理后的模型列表作为数据源,报表设计时直接映射类的公共属性即可

内容的提问来源于stack exchange,提问作者dlaksmi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 04:24:59