以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  再次求教关于时间分段的问题 我已经参考了文件,还是没有解决  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=93598)

--  作者:litiemiao
--  发布时间:2016/12/2 8:52:00
--  再次求教关于时间分段的问题 我已经参考了文件,还是没有解决
 下载信息  [文件大小:   下载次数: ]
点击浏览该文件:管理项目1.rar

表A中有开始时间  和 结束时间  和年份半年的分段列

我想把以 开始时间 和 结束时间为时间长度,以 每年6月30日 为半年的基数 做成时间分段 转换成天数 分别填入对应的时间分段列

 

例如 表A中第一行数据 开始和结束时间分别为2015.10.15 和2016.6.30  那么他对应的分段就应该为 (2015.10.15-2015.12.31=77天,这个天数填写在【2015年下半年】的列中)  2016.1.1-2016.6.30=180天  这个天数填写在2016上半年的列中,以此类推 需要怎么做呢,求大神指点

 

这个时间跨度 

 

 

 

有点蓝大神 ,我参考了之前发的那个帖子,之前那个用的是OUTSHOW函数 当我赋值到列的时候就不行了,希望您能在我的附件中帮忙写下代码可以吗 再次谢谢您


--  作者:litiemiao
--  发布时间:2016/12/2 9:02:00
--  
求大神帮忙修改一下
--  作者:litiemiao2016
--  发布时间:2016/12/2 10:06:00
--  
有点色大神 我说的是这个帖子 求您帮着弄下,真心感谢您不厌其烦的帮助,
--  作者:有点蓝
--  发布时间:2016/12/2 10:19:00
--  
没有基础,给你再多的代码。业务如果有点变化,你也一样用不了。

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



--  作者:litiemiao2016
--  发布时间:2016/12/2 10:27:00
--  
额。。。我知道 实在非常抱歉,占用您很多时间  再次非常感谢  我在努力学习中
--  作者:litiemiao2016
--  发布时间:2016/12/2 10:48:00
--  

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

 

有点蓝工程师,额。。。我真的不是故意的 不关表B的事情,我那个表B 只是用来做测试得,全部代码都是表A的,您做的这个代码是在表B中生成了天数,我需要的是,在表A当中计算开始时间,和 结束时间的是天数 然后填写在表A 的列中

 


 


图片点击可在新窗口打开查看此主题相关图片如下:qq图片20161202104059.png
图片点击可在新窗口打开查看

 

例如 表A中列 开始时间 和 结束时间列 分别为2016.5.1 和  2017.8.1  那么首先应该先分时间段 为2016.5.1-2016.6.30计算出这个时间段是多少天,然后填写在表A中2016年上半年的列中,然后在分2016.7.1-2016.12.31这个时间段的天数 填写在表A 中2016年下半年的列中,然后计算出2017.1.1-2017.6.30 这个时间段的天数 然后填写在表A中2017年上半年的列中,这样的。。。。。真心不是故意的


--  作者:litiemiao2016
--  发布时间:2016/12/2 10:59:00
--  
跟表B 根本就没有关系。。。
--  作者:litiemiao2016
--  发布时间:2016/12/2 11:09:00
--  
跟表B 没有关系 啊  大哥
--  作者:有点蓝
--  发布时间:2016/12/2 11:24:00
--  
从程序的角度来说,日期范围不是固定的,假如跨度有10年,你要动态增加不少列。不好处理,建议使用明细表,就是表B。

坚持你那种方式的话,只能自己做了,我们处理不来。

--  作者:有点色
--  发布时间:2016/12/2 11:37:00
--  

datacolchanged事件

 

Select Case e.DataCol.Name
    Case "日期起止"
        Dim str As String = e.DataRow("日期起止")
        Dim arr() As String = str.Split("-")
        Dim d As Date = CDate(arr(0).Replace(".","-"))
        e.DataRow("开始时间") = d
        d = CDate(arr(1).Replace(".","-"))
        e.DataRow("结束时间")=d
    Case "开始时间","结束时间"
        If e.DataRow.IsNull("开始时间") = False AndAlso e.DataRow.IsNull("结束时间") = False
            Dim dta As DataTable = e.DataTable
            Dim dr = e.DataRow
            For Each dc As DataCol In dta.DataCols
                If dc.Name.StartsWith("A") OrElse dc.Name.StartsWith("B") Then
                    dr(dc.name) = Nothing
                End If
            Next
            Dim tempd1 As Date
            Dim tempd2 As Date
            Dim d_start As Date = dr("开始时间")
            Dim d_end As Date = dr("结束时间")
            Dim d_m1 As Date = new Date(d_start.Year, 6, 30)
            Dim d_e1 As Date = new Date(d_start.Year, 12, 31)
            Dim idx As Integer = 0
            If d_start <= d_m1 Then
                tempd1 = d_start
                If d_end <= d_m1 Then
                    tempd2 = d_end
                Else
                    tempd2 = d_m1
                    idx = 1
                End If
            Else
                tempd1 = d_start
                If d_end <= d_e1
                    tempd2 = d_end
                Else
                    tempd2 = d_e1
                    idx = 2
                End If
            End If
            Dim sp As TimeSpan = tempd2 - tempd1
            If tempd2 > new Date(tempd2.Year, 6, 30) Then
                dr("B" & tempd2.Year) = sp.TotalDays
            Else
                dr("A" & tempd2.Year) = sp.TotalDays
            End If
            If idx > 0 Then
                Dim d As Date = tempd2
                Do While d < d_end
                    tempd1 = d.AddDays(1)
                    Dim d2 As Date = iif(idx Mod 2 = 0, d.AddMonths(6), d.AddMonths(6).AddDays(1))
                    If d2 >= d_end Then
                        tempd2 = d_end
                    Else
                        tempd2 = d2
                    End If
                    sp = tempd2 - tempd1
                    If tempd2 > new Date(tempd2.Year, 6, 30) Then
                        dr("B" & tempd2.Year) = sp.TotalDays
                    Else
                        dr("A" & tempd2.Year) = sp.TotalDays
                    End If
                    idx += 1
                    d = d2
                Loop
            End If
        End If
End Select