以文本方式查看主题 - Foxtable(狐表) (http://foxtable.net/bbs/index.asp) -- 专家坐堂 (http://foxtable.net/bbs/list.asp?boardid=2) ---- 夜深人静 向高手请教个问题 (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=68713) |
||||
-- 作者:卟离卟弃 -- 发布时间:2015/5/23 0:13:00 -- 夜深人静 向高手请教个问题 表A 中 结束日期 根据 开始日期 - 工作日 比如说 开始日期 5-22 工作 10 ;根据上面算法 结束日期 应该是5-31 但是 有个日历表,日历表中 有全年的工作日安排 怎样在日历表中 找出 从 5-22 到未来 10个连续日期中,包含多少个 非工作日??并把这非工作日补充到 结束日期里面 如 开始日期 5-22 周期 10 ,未来10天中有2个非工作日,所以 周期应该是,结束日期应该是 6-2 另外,如果 6-1 或 6-2 中,又有非工作日,那么又要补充!! 各位大师们,有何办法呢!!! 实在是思考不到方法,请教一下!非常感谢!
|
||||
-- 作者:sloyy -- 发布时间:2015/5/23 1:12:00 -- 不难呀,1 先算正常开始日期到工作日 结束日期1 2 算从开始日期到 结束日期1 包含多少个非工作日,加上非工作日天数得到结束日期2 3 算结束日期1到结束日期2包含多少个非工作日,加上非工作日天数得到结束日期3 4 算结束日期2到结束日期3包含多少个非工作日,加上非工作日天数得到结束日期4 5.... 6.... 2-N 采用循环 直到没有非工作日才跳出来 最后的结束日期就是你要的结果 |
||||
-- 作者:Bin -- 发布时间:2015/5/23 8:56:00 -- 看了一下你日历,似乎都是固定星期日为非工作日啊. 如果是这样的话.可以不要日期表. 这样不用查询日期表直接计算,效率会高很多 代码为 Select Case e.DataCol.Name Case "开始日期","工作日" Dim d As Date = e.DataRow("开始日期") For i As Integer=1 To e.DataRow("工作日") d=d.AddDays(1) If d.DayOfWeek=0 Then i=i-1 End If Next e.DataRow("结束日期")=d End Select |
||||
-- 作者:卟离卟弃 -- 发布时间:2015/5/23 12:08:00 -- 不一定是星期日——日历表,是有人去管理的,有可能其它原因(国家放假日或公司重要纪念日放假),某个日期,也是非工作日 |
||||
-- 作者:逛逛 -- 发布时间:2015/5/23 12:49:00 -- 给你一个馊主意:
工作日历维护是少发事件,而工作日历查询是多发事件,所以遍历工作应该放在工作日历维护中去。
1、建立一个基准工作日起点(比如建厂时间后系统开始运行的时间)
2、工作日历中建一列(工作日编号——以基准工作日为起点)
3、维护工作日历时,遍历工作日并编号
实际运用时, 计划开始和计划结束可以运用工作日历,起始工作日编号+计划工期 = 计划结束工作日号(工作日历变化时,计划时间也会跟着变化)
实际开始和实际结束时间,用当时的日期(工作日历变化时,不会有影响) |
||||
-- 作者:卟离卟弃 -- 发布时间:2015/5/23 13:17:00 -- Select Case e.DataCol.Name Case "开始日期","工作日" Dim d1 As Date = e.DataRow("开始日期") Dim dr1,dr2 As DataRow dr1 = DataTables("日历").Find("[日期] = \'" & d1 & "\'") If dr1("是否是工作日") = False Then Dim d2 As Date = e.DataRow("开始日期") For i As Integer=1 To e.DataRow("工作日") d2=d2.AddDays(1) dr2 = DataTables("日历").Find("[日期] = \'" & d2 & "\'") If dr2 IsNot Nothing Then If dr2("是否是工作日") = False Then i=i-1 End If End If Next e.DataRow("结束日期") = d2 Else Dim d As Date = e.DataRow("开始日期") For i As Integer=1 To e.DataRow("工作日") d=d.AddDays(1) If dr1 IsNot Nothing Then If dr1("是否是工作日") = False Then i=i-1 End If End If Next e.DataRow("结束日期") = d End If End Select 谢谢大家,谢谢B版。 这样就可以了
|
||||
-- 作者:don -- 发布时间:2015/5/23 13:54:00 -- Select Case e.DataCol.Name Case "开始日期","工作日" Dim dr1 As DataRow Dim flt As String If e.DataRow.IsNull("开始日期") =False Then flt ="日期 >= #" & e.DataRow("开始日期") & "# and 是否是工作日 = 1" dr1=DataTables("日历").Find(flt,"日期", e.DataRow("工作日")-1) If dr1 IsNot Nothing Then e.DataRow("结束日期") =dr1("日期") End If End If End Select
|
||||
-- 作者:gaoqr -- 发布时间:2015/5/23 17:07:00 -- don 版主精简! |