以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.com/bbs/index.asp)
--  专家坐堂  (http://foxtable.com/bbs/list.asp?boardid=2)
----  [求助]关于交叉表的时间格式(已解决)  (http://foxtable.com/bbs/dispbbs.asp?boardid=2&id=111244)

--  作者:yyzlxc
--  发布时间: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编辑过]

--  作者:有点甜
--  发布时间:2017/12/18 16:02:00
--  

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

 

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

 

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

 

 


--  作者:yyzlxc
--  发布时间: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)


--  作者:有点蓝
--  发布时间: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
--  发布时间:2017/12/18 22:13:00
--  
谢谢蓝老师的指教,问题圆满解决,再次衷心感谢!!