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
相关产品推荐
相关产品推荐

