以文本方式查看主题

-  Foxtable(狐表)  (http://www.foxtable.com/bbs/index.asp)
--  专家坐堂  (http://www.foxtable.com/bbs/list.asp?boardid=2)
----  [求助]工效计算问题(已解决)  (http://www.foxtable.com/bbs/dispbbs.asp?boardid=2&id=57633)

--  作者:yyzlxc
--  发布时间:2014/9/28 10:55:00
--  [求助]工效计算问题(已解决)
工效 = 工时 / YS1,应该 25 / 27 = 0.9259,但是结果却是1.8333,是哪里出问题,请各位老师指教,谢谢!

Dim rq As String = Format( Functions.Execute("fwqsj","ABC"),"yyyy-MM-dd")
Dim sql,s As String
sql = "SELECT 日期,单位,员工,SUM(工时) AS 工时,SUM(YS1) AS YS1,Count(*) AS 计数,SUM(工时) / SUM(YS1) As 工效 FROM {C} GROUP BY 日期,单位,员工,工时,YS1"
Dim b As New CrossTableBuilder("统计",sql,"ABC")
b.HGroups.AddDef("单位")
b.HGroups.AddDef("员工")
b.VGroups.AddDef("日期",DateGroupEnum.None)
b.Totals.AddDef("计数")
b.Totals.AddDef("工时")
b.Totals.AddDef("YS1")
b.Totals.AddDef("工效")
b.VerticalTotal = True
b.Build()
MainTable = Tables("统计") \'打开生成的统计表
Tables("统计").AutoSizeCols()



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

[此贴子已经被作者于2014-9-28 15:49:31编辑过]

--  作者:yyzlxc
--  发布时间:2014/9/28 11:16:00
--  
问题解决,修改代码如下:

sql = "SELECT 日期,单位,员工,SUM(工时) AS 工时,SUM(YS1) AS YS1,Count(*) AS 计数,
SUM(工时) / SUM(YS1) As 工效 FROM {C} GROUP BY 日期,单位,员工"
--  作者:有点甜
--  发布时间:2014/9/28 11:17:00
--  

sql = "SELECT * FROM {C}"

 

没有必要重复计算。


--  作者:yyzlxc
--  发布时间:2014/9/28 12:52:00
--  
谢谢甜老师的指教,现在又碰到新问题,在原有的基础上,增加按小时分组汇总,工效的计算结果又出现问题,请各位老师指教,谢谢!!


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


汇总代码:
Dim sql As String 
sql = "SELECT 日期,时间,单位,员工,SUM(工时) As 工时,SUM(YS1) As YS1,Count(*) AS 计数,SUM(工时) / SUM(YS1) As 工效 FROM {C} GROUP BY 日期,时间,单位,员工"
Dim b As New CrossTableBuilder("统计",sql)
b.HGroups.AddDef("单位")
b.HGroups.AddDef("员工")
b.VGroups.AddDef("日期",DateGroupEnum.None) \'日期
b.VGroups.AddDef("时间",DateGroupEnum.Hour) \'小时
b.Totals.AddDef("计数")
b.Totals.AddDef("工时")
b.Totals.AddDef("YS1")
b.Totals.AddDef("工效")
b.VerticalTotal = True
b.Build()
MainTable = Tables("统计") \'打开生成的统计表
Tables("统计").AutoSizeCols()



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



[此贴子已经被作者于2014-9-28 13:09:00编辑过]

--  作者:有点甜
--  发布时间:2014/9/28 14:25:00
--  
Dim b As New SQLCrossTableBuilder("统计","C")
b.HGroups.AddDef("单位")
b.HGroups.AddDef("员工")
b.VGroups.AddDef("日期")
b.VGroups.AddExp("时间","hour(时间)") \'小时
b.Totals.AddDef("计数")
b.Totals.AddDef("工时")
b.Totals.AddDef("YS1")
b.Totals.AddExp("工效", "工时/YS1",AggregateEnum.Average)
b.VerticalTotal = True
b.Build
MainTable = Tables("统计") \'打开生成的统计表
Tables("统计").AutoSizeCols()

--  作者:yyzlxc
--  发布时间:2014/9/28 14:37:00
--  
谢谢甜老师的指教,如果工效要求保留3位小数,应该如何设置?还请老师指教,谢谢!!
--  作者:有点甜
--  发布时间:2014/9/28 14:54:00
--  

http://www.foxtable.com/help/topics/1659.htm

 


--  作者:yyzlxc
--  发布时间:2014/9/28 15:40:00
--  
谢谢甜老师的指教,刚才试了一下,加了格式化后,只是在后面加0,精度太低,后来用循环计算来解决问题。
在原代码的基础上增加了水平方向自动汇总后,代码如下:

Dim t As Table = Tables("统计")
Dim i As Integer =(Tables("统计").Cols.Count-6)/4 ‘获取循环次数
For Each dr As Row In t.Rows
    For j As Integer = 1 To i
        If dr.IsNull("计数_" & j) Then
            dr("工效_" & j) = Nothing
        Else
            dr("工效_" & j) = dr("工时_" & j) / dr("YS1_" & j) 
        End If
    Next
Next

这样计算的精度才能符合要求。谢谢甜老师的启发。

还有一个问题请教老师:如果对汇总的日期有要求的话,是否还是要用SELECT语句,请指教,谢谢!!
[此贴子已经被作者于2014-9-28 15:42:33编辑过]

--  作者:有点甜
--  发布时间:2014/9/28 15:42:00
--  
 对日期有要求,就直接洗 b.Filter = "条件"
--  作者:yyzlxc
--  发布时间:2014/9/28 15:49:00
--  
问题全部得到解决,谢谢甜老师的耐心帮助,再次衷心感谢!!