以文本方式查看主题

-  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 中,又有非工作日,那么又要补充!!

各位大师们,有何办法呢!!!
实在是思考不到方法,请教一下!非常感谢



 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:管理项目1.foxdb


--  作者:sloyy
--  发布时间:2015/5/23 1:12:00
--  
不难呀,1 先算正常开始日期到工作日 结束日期1
2 算从开始日期到 结束日期1 包含多少个非工作日,加上非工作日天数得到结束日期2
3 算结束日期1到结束日期2包含多少个非工作日,加上非工作日天数得到结束日期3
算结束日期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 版主精简!