以文本方式查看主题 - Foxtable(狐表) (http://foxtable.net/bbs/index.asp) -- 专家坐堂 (http://foxtable.net/bbs/list.asp?boardid=2) ---- 考勤报表 (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=85997) |
||||
-- 作者:sf020cf -- 发布时间:2016/6/7 15:58:00 -- 考勤报表 我做了一个考勤报表.现在有一个问题,怎样让系统自动区分国家法定假日与周末,周末与法定假日用不同颜色字体体现,并且在加班时间体现,比如周一至周五的加班时间是:18:30:00 法定以及周末是:全天 然后再根据加班时间 算出实际加班时长 (周一至周五=当天签退时间-加班时间) 法定及周末(当天签退时间-当天签到时间) 在最终的计算中要把时间格式转换 08:45:23=8.75h*18得出加班费 迟到阶梯扣费 十分钟10 超过10分钟每分钟扣10元, 请帮帮忙指点一下
此主题相关图片如下:`x7q)5$4c)tpgm9tb1yy~8.png |
||||
-- 作者:Hyphen -- 发布时间:2016/6/7 17:41:00 -- 1.周末可以通过时间计算,节假日需要自己用一个表格存储 Select Case e.Col.Name Case "日期" If e.Row.IsNull("日期") = False Then Dim d As Date = e.Row("日期") If d.DayOfWeek = 0 OrElse d.DayOfWeek = 6 Then e.Style="样式1" End If End If End Select 3.时间计算参考 DataColChanged事件 Select Case e.DataCol.Name Case "签到时间" If e.DataRow.IsNull(e.DataCol.Name) = False AndAlso e.DataRow.IsNull("上班时间") Then Dim ts As TimeSpan = e.DataRow(e.DataCol.Name) - e.DataRow("上班时间") If ts.TotalMinutes > 0 Then e.DataRow("迟到时间") = ts.TotalMinutes End If Case "签退时间" If e.DataRow.IsNull(e.DataCol.Name) = False Then Dim ts As TimeSpan If e.DataRow.IsNull("下班时间") Then ts = e.DataRow(e.DataCol.Name) - e.DataRow("下班时间") If ts.TotalMinutes < 0 Then e.DataRow("早退时间") = ts.TotalMinutes End If Dim d As Date = #18:30# ts = Cdate(e.DataRow(e.DataCol.Name)) - d If ts.TotalMinutes > 0 Then e.DataRow("加班时间") = ts.TotalMinutes End If End Select 有了时间费用计算完全是小学数学,就不说了
|
||||
-- 作者:sf020cf -- 发布时间:2016/6/7 18:09:00 -- 不是这个意思,计算时间的话不需要这么复杂,excel就可以了.计算时间的条件是 先得出加班时间是 "18:30:00" l类型的 还是"全天"类型的. 并且要求签到时间与签退时间都有记录. 再去算实际加班时间和加班费,迟到扣费 代码写在BuildGroupHeader里,直接生成报表.我在BuildGroupHeader事件里不知道该怎样写,所以来请教各位 上传的实例里有报表 直接生成excel报表就有了.就是后面的不懂 如何实现. |
||||
-- 作者:sf020cf -- 发布时间:2016/6/7 18:14:00 -- 此主题相关图片如下:ql2_i~3{glsrbm~(0yvs%h.png 就像这样的效果 |
||||
-- 作者:Hyphen -- 发布时间:2016/6/8 8:53:00 -- 模板增加一个标记<加班>,去掉BuildGroupHeader事件 BeforeBuild事件 Select e.Book.TempLate Case "考勤" e.Book.Marks.Add("加班时间",Nothing) e.Book.Marks.Add("加班",Nothing) End Select BuildDetail事件 Select Case e.Book.TempLate Case "考勤" If e.DataRow IsNot Nothing Then Dim t As Boolean Dim d As Date = e.DataRow("日期") If d.DayOfWeek = 0 OrElse d.DayOfWeek = 6 Then t = True e.Book.Marks("加班时间") = "全天" Else e.Book.Marks("加班时间") = "18:30:00" End If If e.DataRow.IsNull("签到时间") = False AndAlso e.DataRow.IsNull("签退时间") = False Then d = #18:30# Dim ts As TimeSpan If t Then ts = e.DataRow("签退时间") - e.DataRow("签到时间") e.Book.Marks("加班") = ts.Hours & ":" & ts.Minutes & ":00" Else ts = Cdate(e.DataRow("签退时间")) - d If ts.TotalMinutes > 0 Then e.Book.Marks("加班") = ts.Hours & ":" & ts.Minutes & ":00" Else e.Book.Marks("加班") = "" End If End If Else e.Book.Marks("加班") = "" End If End If End Select |
||||
-- 作者:sf020cf -- 发布时间:2016/6/8 15:50:00 -- 谢谢,帮忙. 我想对个人的加班时长做一个总计,请问怎样改 Dim Filter As String = "姓名 = \'" & e.DataRow("姓名") & "\'" e.Book.Marks("迟到总计") = DataTables("考勤明细").Compute("Sum(Convert([迟到时间], \'System.DataTime\'))",Filter) 报错需要具有可能的“Child”限定符的单个列参数.要转换成00:00:00格式再相加 然后:if(<迟到总计> 大于 5) e.Book.Marks("加加班费") = <加班总计>*18-(<迟到总计> - 5)*10-10 如果if(<迟到总计> 小于 5大于0) e.Book.Marks("加加班费") = <加班总计>*18-10 |
||||
-- 作者:大红袍 -- 发布时间:2016/6/8 19:32:00 -- 不能直接你那样统计啊,你要用代码先计算出结果
你要循环这个人的每一行,获取到加班时间,然后累加,才行。
|
||||
-- 作者:sf020cf -- 发布时间:2016/6/11 7:31:00 -- 我在表中加班时间已算出具体加班时间,为longtime格式,然后我在 在报表事件生成分组头前写代码 Dim Filter As String = "姓名 = \'" & e.DataRow("姓名") & "\'" 最终生成报表时报错: 无效的聚合函数 Sum()和类型 DateTime 的用法。 另外原表中已经有计算出迟到时间,但格式是""160分钟"这样的字符,想问一下怎样把它在生成分组前自动转换为time或者longtime格式再求和. |
||||
-- 作者:大红袍 -- 发布时间:2016/6/11 14:24:00 -- 都说不能直接统计啊
For Each dr As DataRow In e.DataRow.DataTable.Select("姓名 = \'" & e.DataRow("姓名") & "\'") |
||||
-- 作者:sf020cf -- 发布时间:2016/6/11 18:07:00 -- For Each dr As DataRow In e.DataRow.DataTable.Select("姓名 = \'" & e.DataRow("姓名") & "\'") \'循环每一行,累加值 Dim sum As Timespan If dr("加班时间")IsNot Nothing Then sum + = dr("加班时间") e.Book.Marks("加班总计") = sum.TotalHours End If Next 指定值转换无效. 加班时间这一列是时间格式啊 为什么不行, 还有一个比如字符格式165分钟能否转换为小数点的小时 2.75 |