设为首页收藏本站Access中国

Office中国论坛/Access中国论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

返回列表 发新帖
查看: 2038|回复: 7
打印 上一主题 下一主题

[模块/函数] 求提取数据的方法!

[复制链接]
跳转到指定楼层
1#
发表于 2015-12-12 18:30:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 sxgaobo 于 2015-12-12 18:33 编辑

人员表 中记录了按签订合同发放工资的情况,每合同所涉及的人数、工资额和发放时间段各不相同,期间还会调整,增减人员、增减工资、调整日期。现在想按‘时间段’提取数据做对比,比较二时间段内各合同工资变化的情况,期初费用额、期末费用额、增加额、减少额,‘时间段’可以任意指定,及可以是1、2月,可以是3、6月,也可以是1、2季度,也可以是14年的1季度和15年的1季度。这样的运算模块怎么做啊?烦请各位百忙中给看看。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 分享淘帖 订阅订阅
2#
发表于 2015-12-13 10:12:59 | 只看该作者
个人以为,这表设计得可能不是太合理。建议不妨全部按天;来录入数据,而不是开始日期-结束日期。例如:

合同编号        费用名称        人数        月工资        日工资        开始        结束        备注        合计
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日到结束日期的天数。每个进行计算。
--然后再以上述方式来计算结束日期。
个人觉得较为繁琐,不如重新修改表结构。
3#
 楼主| 发表于 2015-12-14 11:57:47 | 只看该作者
roych 发表于 2015-12-13 10:12
个人以为,这表设计得可能不是太合理。建议不妨全部按天;来录入数据,而不是开始日期-结束日期。例如:

...

谢谢版主的关注!
已经录入了大量数据,修改表结果不可能了啊!能有别的办法吗?
4#
发表于 2015-12-16 10:28:42 | 只看该作者
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楼的回复。


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

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

谢谢版主!我消化消化

点击这里给我发消息

6#
发表于 2015-12-19 09:09:21 | 只看该作者
需要考虑的情况太多了
7#
发表于 2015-12-21 11:27:12 | 只看该作者
本帖最后由 todaynew 于 2015-12-21 14:42 编辑

需要增加一个合同执行表,否则比较的所有数据都不存在,还比较个球呀。
8#
 楼主| 发表于 2015-12-21 22:11:19 | 只看该作者
todaynew 发表于 2015-12-21 11:27
需要增加一个合同执行表,否则比较的所有数据都不存在,还比较个球呀。

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|站长邮箱|小黑屋|手机版|Office中国/Access中国 ( 粤ICP备10043721号-1 )  

GMT+8, 2024-11-25 08:20 , Processed in 0.106591 second(s), 33 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表