Foxtable(狐表)用户栏目专家坐堂 → [求助]关于交叉表的时间格式(已解决)


  共有1579人关注过本帖树形打印复制链接

主题:[求助]关于交叉表的时间格式(已解决)

帅哥哟,离线,有人找我吗?
yyzlxc
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:七尾狐 帖子:1525 积分:10580 威望:0 精华:0 注册:2008/9/24 11:16:00
[求助]关于交叉表的时间格式(已解决)  发帖心情 Post By:2017/12/18 15:55:00 [只看该作者]

根据清点日志,生成交叉月汇总表。如果用sj1替换N1,会出现“从类型Date到Decimal的转换无效”的错误提示。而我想用“00:00:00”的格式来显示平均用时,有什么方法能够达到此效果,请各位老师指教,谢谢!!

    DataTables("人员清点日志").LoadFilter = "清点日期 >= '" & yc & "' and 清点日期 <= '" & yd & "'"
    DataTables("人员清点日志").Load
    Dim sql As String = "S elect 清点日期,清点单位,操作信息_开始时间,操作信息_结束时间,Count(清点单位) As 计数,0.1-0.1 as 平均用时 F ROM {人员清点日志} WHERE 清点日期 >= '" & yc & "' And 清点日期 <= '" & yd & "'Group By 清点日期,清点单位,操作信息_开始时间,操作信息_结束时间"
    Dim b As New CrossTableBuilder("人员清点月汇总",sql,"SCGL")
    b.HGroups.AddDef("清点日期",DateGroupEnum.None)
    b.VGroups.AddDef("清点单位")
    b.Totals.AddDef("清点单位",AggregateEnum.Count,"批次") '添加数量列用于统计
    b.Totals.AddDef("平均用时")
    b.HorizontalTotal = True
    b.VerticalTotal = True
    b.Build '生成统计表
    MainTable = Tables("人员清点月汇总")
    Dim dw1 As String
    Dim qdrq As Date
    Dim pc As Integer
    Dim t As Table = Tables("人员清点月汇总")
    Dim i As Integer =(Tables("人员清点月汇总").Cols.Count - 3) / 2
    For Each r As Row In t.Rows
        For j As Byte = 1 To i
            dw1 = Left(t.Cols("清点单位_" & j).Caption,4) '单位
            If r.IsNull("清点单位_" & j) = False And r("清点日期") <> "合计"Then
                qdrq = r("清点日期") '清点日期
                pc = r("清点单位_" & j) '批次
                Dim N1,h1,m1,s1 As Integer
                N1 = DataTables("人员清点日志").Compute("Sum(操作信息_用时秒)", "清点日期 = '" & qdrq & "' and 清点单位 = '" & dw1 & "'") / pc
                h1 = N1 \ 3600
                m1 = (N1 Mod 3600) \ 60
                s1 = N1 Mod 60
                Dim sj1 As Date = Format(new Date(1,1,1,h1,m1,s1), "HH:mm:ss")
                r("平均用时_" & j) = N1
            ElseIf r.IsNull("清点单位_" & j) = False And r("清点日期") = "合计"Then
                Dim N11,h11,m11,s11 As Integer
                N11 = DataTables("人员清点日志").Compute("Sum(操作信息_用时秒)", " 清点单位 = '" & dw1 & "'") / r("清点单位_" & j)
                h11 = N11 \ 3600
                m11 = (N11 Mod 3600) \ 60
                s11 = N11 Mod 60
                Dim sj11 As Date = Format(new Date(1,1,1,h11,m11,s11), "HH:mm:ss")
                r("平均用时_" & j) = N11
            End If
        Next
        Dim N2,h2,m2,s2 As Integer
        N2 = DataTables("人员清点日志").Compute("Sum(操作信息_用时秒)", "清点日期 = '" & qdrq & "'") / r("合计_批次")
        h2 = N2 \ 3600
        m2 = (N2 Mod 3600) \ 60
        s2 = N2 Mod 60
        Dim sj2 As Date = Format(new Date(1,1,1,h2,m2,s2), "HH:mm:ss")
        r("合计_平均用时") = N2
    Next
    Dim dr2 As DataRow = DataTables("人员清点月汇总").Find("清点日期 = '合计'")
    If dr2 IsNot Nothing Then
        Dim N22,h22,m22,s22 As Integer
        N22 = DataTables("人员清点日志").Compute("Sum(操作信息_用时秒)", "清点日期 >= '" & yc & "' and 清点日期 <= '" & yd & "'") / dr2("合计_批次")
        h22 = N22 \ 3600
        m22 = (N22 Mod 3600) \ 60
        s22 = N22 Mod 60
        Dim sj22 As Date = Format(new Date(1,1,1,h22,m22,s22), "HH:mm:ss")
        dr2("合计_平均用时") = N22
    End If
    For Each cl As Col In Tables("人员清点月汇总").Cols  '居中
        If cl.name <> "清点日期" Then
            cl.TextAlign = TextAlignEnum.Center
        End  If
    Next
    Tables("人员清点月汇总").AutoSizeCols()
    Tables("人员清点月汇总").Cols("合计_批次").Move(1)
    Tables("人员清点月汇总").Cols("合计_平均用时").Move(2)
    DataTables("人员清点月汇总").SysStyles("Frozen").BackColor = Color.LightCyan
    DataTables("人员清点月汇总").SysStyles("CurrentRow").BackColor = Color.Blue
    DataTables("人员清点月汇总").SysStyles("CurrentRow").ForeColor = Color.White
    Tables("人员清点月汇总").ListMode = True
    Tables("人员清点月汇总").Cols.Frozen = 3


源表


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


汇总表


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


如果用sj1替换N1,会出现“从类型Date到Decimal的转换无效”的错误提示。


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



[此贴子已经被作者于2017/12/18 22:12:58编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
有点甜
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:版主 帖子:85326 积分:427815 威望:0 精华:5 注册:2012/10/18 22:13:00
  发帖心情 Post By:2017/12/18 16:02:00 [只看该作者]

建议用如下代码方式生成交叉统计表,这样你可以控制列的类型。

 

默认生成的统计表,统计列是数值类型的,你不能赋值日期的。

 

http://www.foxtable.com/webhelp/scr/2394.htm

 

 


 回到顶部
帅哥哟,离线,有人找我吗?
yyzlxc
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:七尾狐 帖子:1525 积分:10580 威望:0 精华:0 注册:2008/9/24 11:16:00
  发帖心情 Post By:2017/12/18 20:21:00 [只看该作者]

谢谢甜老师的指教,生成交叉表的代码如下:(但平均用时2显示为0001-01-01,不能显示00:00:00的长时间格式)

Dim dtb As New DataTableBuilder("人员清点月汇总")
dtb.AddDef("清点日期", Gettype(Date))
dtb.AddDef("合计_批次", Gettype(Integer))
dtb.AddDef("合计_平均用时", Gettype(Integer))
dtb.AddDef("合计_平均用时2", Gettype(Date))
Dim qddws As List(of String) = DataTables("人员清点日志").GetValues("清点单位")
For Each qddw As String In qddws
    dtb.AddDef(qddw & "_批次", Gettype(Integer))
    dtb.AddDef(qddw & "_平均用时", Gettype(Integer))
    dtb.AddDef(qddw & "_平均用时2", Gettype(Date))
Next
dtb.Build()
For Each qdrq As String In DataTables("人员清点日志").GetValues("清点日期")
    Dim dr As DataRow = DataTables("人员清点月汇总").AddNew()
    dr("清点日期") = qdrq
    For Each qddw As String In qddws
        dr(qddw & "_批次") = DataTables("人员清点日志").Compute("Count(清点单位)","清点日期 = '" & qdrq & "' And 清点单位 = '" & qddw & "'")
        If dr(qddw & "_批次") <> 0
            dr(qddw & "_平均用时") = DataTables("人员清点日志").Compute("Sum(操作信息_用时秒)","清点日期 = '" & qdrq & "' And 清点单位 = '" & qddw & "'") \ dr(qddw & "_批次")
            Dim N1,h1,m1,s1 As Integer
            N1 = DataTables("人员清点日志").Compute("Sum(操作信息_用时秒)","清点日期 = '" & qdrq & "' And 清点单位 = '" & qddw & "'") \ dr(qddw & "_批次")
            h1 = N1 \ 3600
            m1 = (N1 Mod 3600) \ 60
            s1 = N1 Mod 60
            Dim sj1 As Date = Format(new Date(1,1,1,h1,m1,s1), "HH:mm:ss")
            dr(qddw & "_平均用时2") = sj1
        End If
    Next
Next
MainTable= Tables("人员清点月汇总")
Tables("人员清点月汇总").AutoSizeCols()


设置临时表的长时间格式的代码如下,如何将dr(qddw & "_平均用时2")设置为长时间格式,还请各位老师指教,谢谢!!

DataTables("门禁查询").DataCols("时间").SetDateTimeFormat(DateTimeFormatEnum.LongTime)


 回到顶部
帅哥哟,离线,有人找我吗?
有点蓝
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:107304 积分:545781 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2017/12/18 20:46:00 [只看该作者]

Dim dtb As New DataTableBuilder("人员清点月汇总")
dtb.AddDef("清点日期", Gettype(Date))
dtb.AddDef("合计_批次", Gettype(Integer))
dtb.AddDef("合计_平均用时", Gettype(Integer))
dtb.AddDef("合计_平均用时2", Gettype(Date))
Dim qddws As List(of String) = DataTables("人员清点日志").GetValues("清点单位")
For Each qddw As String In qddws
    dtb.AddDef(qddw & "_批次", Gettype(Integer))
    dtb.AddDef(qddw & "_平均用时", Gettype(Integer))
    dtb.AddDef(qddw & "_平均用时2", Gettype(Date))
Next
dtb.Build()
For Each dc As DataCol In DataTables("人员清点月汇总").DataCols
    If dc.Name.Contains("平均用时2") Then
        dc.SetDateTimeFormat(DateTimeFormatEnum.LongTime)
    End If
Next
……

 回到顶部
帅哥哟,离线,有人找我吗?
yyzlxc
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:七尾狐 帖子:1525 积分:10580 威望:0 精华:0 注册:2008/9/24 11:16:00
  发帖心情 Post By:2017/12/18 22:13:00 [只看该作者]

谢谢蓝老师的指教,问题圆满解决,再次衷心感谢!!

 回到顶部