Foxtable(狐表)用户栏目专家坐堂 → 请教:部门分月工资表的合计代码


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

主题:请教:部门分月工资表的合计代码

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


加好友 发短信 一级勋章
等级:MVP荣誉狐 帖子:5154 积分:31434 威望:0 精华:8 注册:2008/9/8 12:27:00
  发帖心情 Post By:2009/5/8 20:18:00 [只看该作者]

全部代码:在命令窗口中测试ok!~

Forms("工资统计").open()
DataTables("个人分月工资表").DataRows.Clear()
dim f As New Filler
f.SourceTable = DataTables("工资库") '指定数据来源
f.SourceCols = "工号,部门,姓名" '指定数据来源列
f.DataTable = DataTables("个人分月工资表") '指定数据接收表
f.DataCols = "工号,部门,姓名" '指定数据接收列
f.Fill() '填充数据

For Each dc As DataCol In DataTables("个人分月工资表").DataCols
    If dc.Name.EndsWith("月") Then
        For Each dr As DataRow In DataTables("个人分月工资表").DataRows
            ''             dr(dc.name) = DataTables("工资库").Compute("Sum(实发工资)","月份 ='" & dc.Name & "' And 工号= '" & dr("工号") & "'")
            Dim drk As DataRow
            drk = DataTables("工资库").Find("月份 = '" & dc.Name & "' And 工号= '" & dr("工号") & "'")
            if drk isnot nothing then
               
                Dim T as String
                T = "月份 ='" & dc.Name & "' And 工号= '" & dr("工号") & "'"
                dr(dc.name) = DataTables("工资库").Find(T)("实发工资")
            end if
        Next
    End If
Next

Dim dst As WinForm.DataList = Forms("工资统计").Controls("DataList1")
dst.DataTable = DataTables("个人分月工资表")
dst.Build()


 回到顶部
美女呀,离线,留言给我吧!
yangming
  22楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信 一级勋章
等级:超级版主 帖子:4109 积分:23338 威望:0 精华:21 注册:2008/9/1 20:07:00
  发帖心情 Post By:2009/5/8 20:45:00 [只看该作者]

 我改成这样就可以了,速度还行,你试试?
Dim drk As DataRow
            drk = DataTables("工资库").Find("月份 = '" & dc.Name & "' And 工号= '" & dr("工号") & "'")
            if drk isnot nothing then               
           If dr.IsNull("工号") Then
                dr(dc.Name) = Nothing
            Else
                dr(dc.Name) = drk("实发工资")
            End If
        End If

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


加好友 发短信 一级勋章
等级:MVP荣誉狐 帖子:5154 积分:31434 威望:0 精华:8 注册:2008/9/8 12:27:00
  发帖心情 Post By:2009/5/8 21:09:00 [只看该作者]

以下是引用yangming在2009-5-8 20:45:00的发言:
 我改成这样就可以了,速度还行,你试试?
Dim drk As DataRow
            drk = DataTables("工资库").Find("月份 = '" & dc.Name & "' And 工号= '" & dr("工号") & "'")
            if drk isnot nothing then               
           If dr.IsNull("工号") Then
                dr(dc.Name) = Nothing
            Else
                dr(dc.Name) = drk("实发工资")
            End If
        End If

哈哈,您的更直观~图片点击可在新窗口打开查看
不过If dr.IsNull("工号") Then  是不是多余了,因为可以加上
 f.ExcludeNullValue = True
'排除空值吧,再说‘工资库’一般没有空行,对不?
少个判断,速度就更快了。

另外:你的“在生成的交叉表和DataList时如何只保留二位小数”,我有个解决办法:你在命令窗口中试试
因为你增加了专门的表来统计!

forms("工资统计").open()
'第一: 在datalist中显示交叉统计:::::::::
Dim g1 As New CrossTableBuilder("个人分月", DataTables("工资库"))
g1.HGroups.AddDef("工号")
''g1.HGroups.AddDef("部门")
g1.HGroups.AddDef("姓名")
'g1.VGroups.AddDef("日期",DateGroupEnum.Year,"{0}年") '添加日期列用于垂直分组,按年分组
g1.VGroups.AddDef("日期","{0}月") '添加日期列用于垂直分组,按月分组
g1.Totals.AddDef("实发工资", "实发工资")
g1.OrderByTotal = True
g1.HorizontalTotal = True
g1.VerticalTotal = True
With Forms("工资统计").Controls("DataList1")
    .DataTable = g1.Build(TRue)
    .Build()
End With
'第二: 将datalist的内容复制到【个人分月工资表】::::::::::::::::::
Dim dst As WinForm.DataList = Forms("工资统计").Controls("DataList1")
Dim f As New Filler
f.SourceTable = dst.datatable
f.SourceCols = "工号,姓名,crsz1,crsz2,crsz3,crsz4" 
f.DataTable = DataTables("个人分月工资表")
f.DataCols = "工号,姓名,一月,二月,三月,四月"
f.Filter = "[工号] <> '""' "
DataTables("个人分月工资表").DataRows.Clear() '清除原来的数据
f.Fill() '填充数据

'第三: 将【个人分月工资表】绑定到新增的窗口【工资统计1】(和原来的一样大小)中的datalist:::::::::::::
forms("工资统计1").open() 

datalist中,不会出现N位的小数了



 

[此贴子已经被作者于2009-5-8 21:12:54编辑过]

 回到顶部
美女呀,离线,留言给我吧!
yangming
  24楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信 一级勋章
等级:超级版主 帖子:4109 积分:23338 威望:0 精华:21 注册:2008/9/1 20:07:00
  发帖心情 Post By:2009/5/8 21:22:00 [只看该作者]

先谢谢mr725,不过,个人分月表中如果用
dr(dc.name) = DataTables("工资库").Compute("Sum(实发工资)","月份 ='" & dc.Name & "' And 工号= '" & dr("工号") & "'")
那就直接用贺老师原有的代码就可以的,就是我在八楼的这段代码


DataTables("个人分月工资表").DataRows.Clear()
 dim f As New Filler
 f.SourceTable = DataTables("工资库") '指定数据来源
 f.SourceCols = "工号,部门,姓名" '指定数据来源列
 f.DataTable = DataTables("个人分月工资表") '指定数据接收表
 f.DataCols = "工号,部门,姓名" '指定数据接收列
 f.Fill() '填充数据
 For Each dc As DataCol In DataTables("个人分月工资表").DataCols
     If dc.Name.EndsWith("月") Then
         For Each dr As DataRow In DataTables("个人分月工资表").DataRows
             dr(dc.name) = DataTables("工资库").Compute("Sum(实发工资)","月份 ='" & dc.Name & "' And 工号= '" & dr("工号") & "'")
         Next
     End If
 Next
Dim dst As WinForm.DataList = e.Form.Controls("DataList1")
dst.DataTable = DataTables("个人分月工资表")
dst.Build()

[此贴子已经被作者于2009-5-8 21:23:54编辑过]

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


加好友 发短信 一级勋章
等级:MVP荣誉狐 帖子:5154 积分:31434 威望:0 精华:8 注册:2008/9/8 12:27:00
  发帖心情 Post By:2009/5/8 22:24:00 [只看该作者]

哈哈~, 顺序不一样的,你这个是先完成‘个人月份工资表’,在通过datalist显示;

我的相反: 是先在datalist生成交叉表后,将datalist中的内容复制到‘个人月份工资表’,再返回到第二个datalist来显示,目的就是要回避N位小数(当然第一个datalist上还是显示了N位的小数,只是把他藏在第二个datalist之后,当然可以打开第二个datalist之前,关闭第一个datalist)。主要是对你http://www.foxtable.com/dispbbs.asp?boardid=2&Id=2600 问题的。


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

不影响你本贴这更好在的方式。

[此贴子已经被作者于2009-5-8 22:33:39编辑过]

 回到顶部
美女呀,离线,留言给我吧!
yangming
  26楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信 一级勋章
等级:超级版主 帖子:4109 积分:23338 威望:0 精华:21 注册:2008/9/1 20:07:00
  发帖心情 Post By:2009/5/8 22:31:00 [只看该作者]

小数的问题贺老师已解决了,本来是在今天的更新中的,呵呵,不过还是要谢谢你的帮助!

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


加好友 发短信
等级:四尾狐 帖子:956 积分:8471 威望:0 精华:0 注册:2016/4/10 14:33:00
  发帖心情 Post By:2019/7/29 22:21:00 [只看该作者]

收藏

 回到顶部
总数 27 上一页 1 2 3