Office中国论坛/Access中国论坛

标题: 求提取数据的方法! [打印本页]

作者: sxgaobo    时间: 2015-12-12 18:30
标题: 求提取数据的方法!
本帖最后由 sxgaobo 于 2015-12-12 18:33 编辑

人员表 中记录了按签订合同发放工资的情况,每合同所涉及的人数、工资额和发放时间段各不相同,期间还会调整,增减人员、增减工资、调整日期。现在想按‘时间段’提取数据做对比,比较二时间段内各合同工资变化的情况,期初费用额、期末费用额、增加额、减少额,‘时间段’可以任意指定,及可以是1、2月,可以是3、6月,也可以是1、2季度,也可以是14年的1季度和15年的1季度。这样的运算模块怎么做啊?烦请各位百忙中给看看。
作者: roych    时间: 2015-12-13 10:12
个人以为,这表设计得可能不是太合理。建议不妨全部按天;来录入数据,而不是开始日期-结束日期。例如:

合同编号        费用名称        人数        月工资        日工资        开始        结束        备注        合计
01001        劳务费        20        ¥1,800.00        ¥60.00        2015/1/1        2015/7/31                ¥252,000.00

改为:

合同编号        费用名称        人数                日工资        开始                备注       
01001        劳务费        20                ¥60.00        2015/1/1               
01001        劳务费        20                ¥60.00        2015/1/2               
…………………………
01001        劳务费        20                ¥60.00        2015/7/31

我相信这样改了之后,计算起来会容易很多,用一个between and即可处理。       
如果按楼主之前的表,假定计算2015-1-1~2015-7-31期间的各项费用的话,那么需要处理的就复杂很多了。
--以起始日期为例,
1、你首先需要在终止日期里看看有没有包括2015-1-1在内【例如结束日期为7月31日,那么1月1日肯定是在里面的】。
2、然后再以1为数据源,检查这些记录的起始日期,计算1月1日到结束日期的天数。每个进行计算。
--然后再以上述方式来计算结束日期。
个人觉得较为繁琐,不如重新修改表结构。
作者: sxgaobo    时间: 2015-12-14 11:57
roych 发表于 2015-12-13 10:12
个人以为,这表设计得可能不是太合理。建议不妨全部按天;来录入数据,而不是开始日期-结束日期。例如:

...

谢谢版主的关注!
已经录入了大量数据,修改表结果不可能了啊!能有别的办法吗?
作者: roych    时间: 2015-12-16 10:28
sxgaobo 发表于 2015-12-14 11:57
谢谢版主的关注!
已经录入了大量数据,修改表结果不可能了啊!能有别的办法吗?

需要考虑的情况太多了:
实际开始日期 实际结束日期
情况1 预设开始日期 预设结束日期
情况2预设开始日期 预设结束日期
情况3 预设开始日期预设结束日期
情况4 预设开始日期 预设结束日期
如果做联合查询吧,计算时还要继续分情况计算一次;如果不做联合查询,则需要分别追加数据进去。个人觉得很麻烦,还是那一句,重新按天数来生成表。这里写了一个模块,用于重新组织数据结构。
  1. '更改表结构,按天数生成临时表
  2. '统计费用时,请使用时间段作为条件
  3. Function getTemp()
  4.     Dim rst1 As New ADODB.Recordset
  5.     Dim rst2 As New ADODB.Recordset
  6.     Dim eDate As Date
  7.     rst1.Open "人员", CurrentProject.Connection, adOpenKeyset, adLockOptimistic
  8.     rst2.Open "临时表", CurrentProject.Connection, adOpenKeyset, adLockOptimistic
  9.     Do Until rst1.EOF
  10.         eDate = rst1("开始")
  11.         Do Until eDate > rst1("结束")
  12.             rst2.AddNew
  13.             rst2("合同编号") = rst1("合同编号")
  14.             rst2("费用名称") = rst1("费用名称")
  15.             rst2("人数") = rst1("人数")
  16.             rst2("日工资") = rst1("日工资")
  17.             rst2("日期") = eDate
  18.             eDate = eDate + 1
  19.             rst2.Update
  20.         Loop
  21.         rst1.MoveNext
  22.     Loop
  23. rst1.Close
  24. rst2.Close
  25. End Function
复制代码
剩下的查询,我想,你应该会写了吧?如果不太清楚,请留意2楼的回复。[attach]57562[/attach]



作者: sxgaobo    时间: 2015-12-18 19:52
roych 发表于 2015-12-16 10:28
需要考虑的情况太多了:
如果做联合查询吧,计算时还要继续分情况计算一次;如果不做联合查询,则需要分 ...

谢谢版主!我消化消化
作者: WFH6898    时间: 2015-12-19 09:09
需要考虑的情况太多了
作者: todaynew    时间: 2015-12-21 11:27
本帖最后由 todaynew 于 2015-12-21 14:42 编辑

需要增加一个合同执行表,否则比较的所有数据都不存在,还比较个球呀。
作者: sxgaobo    时间: 2015-12-21 22:11
todaynew 发表于 2015-12-21 11:27
需要增加一个合同执行表,否则比较的所有数据都不存在,还比较个球呀。






欢迎光临 Office中国论坛/Access中国论坛 (http://www.office-cn.net/) Powered by Discuz! X3.3